48958 lines
2.8 MiB
48958 lines
2.8 MiB
(window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["editor~embed~fullscreen~player"],{
|
||
|
||
/***/ "./node_modules/base64-loader/index.js!./src/lib/backpack/sound-thumbnail.png":
|
||
/*!***************************************************************************!*\
|
||
!*** ./node_modules/base64-loader!./src/lib/backpack/sound-thumbnail.png ***!
|
||
\***************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAACXBIWXMAAAlyAAAJcgErz99GAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAYBQTFRF////AAAAgICAZmZmVVWASW1tYGCAVVVxTWaAVVWAW1ttWlp4VWNxUV55WVlzXFxwWGJ2VV5xW1t2WGFyWlpzWGB4VV10WmJ4V15yVVtzV110VWB3WV50V1x3VWB1V1x1VV9zWF12WF10VV50Vl91WFx1Vl9zVl52V191Vl13WWB1Vl11WF90V151WF92Vl91WF51Vl91WF50V192WF12V191Vl52WF10V151WF92V150V191WF11V152V150WF91WF51V111WF52WF11Vl51V151Vl50Vl11V151V150V111WF52V151V192V191V111V111V151V111V150V151Vl51V191V151V151Vl11Vl51V151WF51WF51V151WF51WF52V151V151V151V152V150V151V151V151V151Vl51V151Vl52V191Vl51V151V151V151V151V151V151V151V151V151V151V151V151V151V151V151V151V151ZcERRAAAAH90Uk5TAAECBQYHCAkKDA4REhMUGRobHB0fICEiJiosLS4vMDIzNDc5Oz0+QUZHSEpLTE5TV1laW11eX2NkZmdpa2xydHp+gIOFh4iOkJWZmpucn6GkpaytsLGys7W3vb7AxsfJzM/R2Nnb3t/g4ePk5ujp6+3u7/Dx9Pb3+Pn6+/z9/q0U6K8AAAHASURBVFjD7ZVXV8JAEEYDomAXEbuiggXBgr2jKNgLWLBiQcSOYEWU+esyG8WD7kYSXnzI95J7hsw9G7KZ5Tg5cuT8/1Q65nuyMugffQGAowKp7QonkCxI7Fet8f1wJa0/d+ezH14k9WtPICOB+QZYAqs/vKQS7laaNuPAEmjxzcwye1unXIveEKQkVdCNpecSenv+LlDCC5SGGgVeDaQ2RxdsA1NgCAIclyIdYC2STeuvA6ZA6Ufy4RrMpNhJE/SzBUU8duEGPUNapQmGBVZwQXAfb3MhnYoUcOME47oEtiG954kU5EQI25KP0yRSwHkIOxHvkSxiBTOElxGDSL1iBQ5I/vkBpAGxghXC5CMIsTaCkEBB1g0jCdS8IzVTBEMCAgvPtQk0EiqmCKwCAh9BP6Id6Zq2kTS3TEEhjxN42yHSFvVr7IiyBKo7pEt1AqvIsBmkf88NG2HGI/TFAJ7akdxYiwocFupym/v192usnrRX4FX3hrX1P2ZqmUd4pMUNf47lsRhDUI8lbxqD3fLIGOvOOAT06RwNjV9Hw8OPH/TGNA/silP4HkOSUkQGcLRFsoDLmT4P75k4OXLkyEkzH2pOgd/43vP4AAAAAElFTkSuQmCC"
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/action-menu/action-menu.css":
|
||
/*!***********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/action-menu/action-menu.css ***!
|
||
\***********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ /*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/ /* Toolbox z-index: 40; set in scratch-blocks */ /* tooltips should go over add buttons if they overlap */ /* monitors go over add buttons */ /* \"ask\" block text input goes above monitors */ /* menu-bar should go over monitors, alerts and tutorials */ /* tw: show below menu bar normally */ /* Block drag z-index: 1000; default 50 is overriden in blocks.css */ /* so it is draggable into other panes */ /* in most interfaces, the context menu is always on top */ .action-menu_menu-container_3a6da {\n display: flex;\n flex-direction: column-reverse;\n transition: 0.2s;\n position: relative;\n pointer-events: auto;\n} .action-menu_button_1qbot {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n background: hsla(0, 100%, 65%, 1);\n outline: none;\n border: none;\n transition: background-color 0.2s;\n} button::-moz-focus-inner {\n border: 0;\n} .action-menu_button_1qbot:hover {\n background: hsla(10, 85%, 65%, 1);\n} .action-menu_button_1qbot:active {\n padding: inherit;\n} .action-menu_button_1qbot.action-menu_coming-soon_2URvV:hover {\n background: hsla(30, 100%, 55%, 1);\n} .action-menu_main-button_3ccfy {\n border-radius: 100%;\n width: 2.75rem;\n height: 2.75rem;\n box-shadow: 0 0 0 4px hsla(0, 100%, 65%, 0.35);\n z-index: 46;\n transition: transform, box-shadow 0.5s;\n} .action-menu_main-button_3ccfy:hover {\n transform: scale(1.1);\n box-shadow: 0 0 0 6px hsla(0, 100%, 65%, 0.35);\n} .action-menu_main-icon_1ktMc {\n width: calc(2.75rem - 1rem);\n height: calc(2.75rem - 1rem);\n} [dir=\"rtl\"] .action-menu_main-icon_1ktMc {\n transform: scaleX(-1);\n} .action-menu_more-buttons-outer_3J9yZ {\n /*\n Need to use two divs to set different overflow x/y\n which is needed to get animation to look right while\n allowing the tooltips to be visible.\n */\n overflow-y: hidden;\n\n background: hsla(0, 60%, 50%, 1);\n border-top-left-radius: 2.25rem;\n border-top-right-radius: 2.25rem;\n width: 2.25rem;\n margin-left: calc((2.75rem - 2.25rem) / 2);\n margin-right: calc((2.75rem - 2.25rem) / 2);\n\n position: absolute;\n bottom: calc(2.75rem);\n\n margin-bottom: calc(2.75rem / -2);\n padding-bottom: calc(2.75rem / 2);\n} .action-menu_more-buttons_3Bjkq {\n max-height: 0;\n transition: max-height 1s;\n overflow-x: visible;\n display: flex;\n flex-direction: column;\n z-index: 10; /* @todo justify */\n} .action-menu_file-input_2nOL7 {\n display: none;\n} .action-menu_expanded_JcMKp .action-menu_more-buttons_3Bjkq {\n max-height: 1000px; /* Arbitrary, needs to be a value in order for animation to run */\n} .action-menu_force-hidden_3SRnx .action-menu_more-buttons_3Bjkq {\n display: none; /* This property does not animate */\n} .action-menu_more-buttons_3Bjkq:first-child { /* Round off top button */\n border-top-right-radius: 2.25rem;\n border-top-left-radius: 2.25rem;\n} .action-menu_more-button_1fMGZ {\n width: 2.25rem;\n height: 2.25rem;\n background: hsla(0, 60%, 50%, 1);\n} .action-menu_more-icon_TJUQ7 {\n width: calc(2.25rem - 1rem);\n height: calc(2.25rem - 1rem);\n} .action-menu_coming-soon_2URvV .action-menu_more-icon_TJUQ7 {\n opacity: 0.5;\n} /*\n @todo needs to be refactored with coming soon tooltip overrides.\n The \"!important\"s are for the same reason as with coming soon, the library\n is not very easy to style.\n*/ .action-menu_tooltip_3Bkh5 {\n background-color: hsla(10, 85%, 65%, 1) !important;\n opacity: 1 !important;\n border: 1px solid hsla(0, 0%, 0%, .1) !important;\n box-shadow: 0 0 .5rem hsla(0, 0%, 0%, .25) !important;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important;\n} .action-menu_tooltip_3Bkh5:after {\n background-color: hsla(10, 85%, 65%, 1);\n} .action-menu_coming-soon-tooltip_3jthM {\n background-color: hsla(30, 100%, 55%, 1) !important;\n} .action-menu_coming-soon-tooltip_3jthM:after {\n background-color: hsla(30, 100%, 55%, 1) !important;\n} .action-menu_tooltip_3Bkh5 {\n border: 1px solid hsla(0, 0%, 0%, .1) !important;\n border-radius: calc(0.5rem / 2) !important;\n box-shadow: 0 0 .5rem hsla(0, 0%, 0%, .25) !important;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important;\n z-index: 47 !important;\n} .action-menu_tooltip_3Bkh5:after {\n content: \"\";\n border-top: 1px solid hsla(0, 0%, 0%, .1) !important;\n border-left: 0 !important;\n border-bottom: 0 !important;\n border-right: 1px solid hsla(0, 0%, 0%, .1) !important;\n border-radius: 0.125rem;\n height: 0.5rem !important;\n width: 0.5rem !important;\n} .action-menu_tooltip_3Bkh5.place-left:after {\n margin-top: -0.25rem !important;\n right: -0.25rem !important;\n transform: rotate(45deg) !important;\n} .action-menu_tooltip_3Bkh5.place-right:after {\n margin-top: -0.25rem !important;\n left: -0.25rem !important;\n transform: rotate(-135deg) !important;\n} .action-menu_tooltip_3Bkh5.place-top:after {\n margin-right: -0.25rem !important;\n bottom: -0.25rem !important;\n transform: rotate(135deg) !important;\n} .action-menu_tooltip_3Bkh5.place-bottom:after {\n margin-left: -0.25rem !important;\n top: -0.25rem !important;\n transform: rotate(-45deg) !important;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"menu-container": "action-menu_menu-container_3a6da",
|
||
"menuContainer": "action-menu_menu-container_3a6da",
|
||
"button": "action-menu_button_1qbot",
|
||
"coming-soon": "action-menu_coming-soon_2URvV",
|
||
"comingSoon": "action-menu_coming-soon_2URvV",
|
||
"main-button": "action-menu_main-button_3ccfy",
|
||
"mainButton": "action-menu_main-button_3ccfy",
|
||
"main-icon": "action-menu_main-icon_1ktMc",
|
||
"mainIcon": "action-menu_main-icon_1ktMc",
|
||
"more-buttons-outer": "action-menu_more-buttons-outer_3J9yZ",
|
||
"moreButtonsOuter": "action-menu_more-buttons-outer_3J9yZ",
|
||
"more-buttons": "action-menu_more-buttons_3Bjkq",
|
||
"moreButtons": "action-menu_more-buttons_3Bjkq",
|
||
"file-input": "action-menu_file-input_2nOL7",
|
||
"fileInput": "action-menu_file-input_2nOL7",
|
||
"expanded": "action-menu_expanded_JcMKp",
|
||
"force-hidden": "action-menu_force-hidden_3SRnx",
|
||
"forceHidden": "action-menu_force-hidden_3SRnx",
|
||
"more-button": "action-menu_more-button_1fMGZ",
|
||
"moreButton": "action-menu_more-button_1fMGZ",
|
||
"more-icon": "action-menu_more-icon_TJUQ7",
|
||
"moreIcon": "action-menu_more-icon_TJUQ7",
|
||
"tooltip": "action-menu_tooltip_3Bkh5",
|
||
"coming-soon-tooltip": "action-menu_coming-soon-tooltip_3jthM",
|
||
"comingSoonTooltip": "action-menu_coming-soon-tooltip_3jthM"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/alerts/alert.css":
|
||
/*!************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/alerts/alert.css ***!
|
||
\************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n/*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/\n\n/* Toolbox z-index: 40; set in scratch-blocks */\n\n/* tooltips should go over add buttons if they overlap */\n\n/* monitors go over add buttons */\n\n/* \"ask\" block text input goes above monitors */\n\n/* menu-bar should go over monitors, alerts and tutorials */\n\n/* tw: show below menu bar normally */\n\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\n\n/* so it is draggable into other panes */\n\n/* in most interfaces, the context menu is always on top */\n\n.alert_alert_2Ou-m {\n width: 100%;\n display: flex;\n flex-direction: row;\n overflow: hidden;\n justify-content: flex-start;\n border-radius: 0.5rem;\n padding-top: .875rem;\n padding-bottom: .875rem;\n padding-left: 1rem;\n padding-right: 1rem;\n margin-bottom: 7px;\n min-height: 1.5rem;\n pointer-events: all;\n}\n\n.alert_alert_2Ou-m.alert_warn_2441l {\n background: #FFF0DF;\n border: 1px solid #FF8C1A;\n box-shadow: 0px 0px 0px 2px rgba(255, 140, 26, 0.25);\n}\n\n.alert_alert_2Ou-m.alert_success_1TbgT {\n /* tw: hardcode these colors because we change extensions-* colors to be something that looks weird here */\n background: hsla(163, 57%, 85%, 1);\n border: 1px solid hsla(163, 85%, 30%, 1);\n box-shadow: 0px 0px 0px 2px hsla(163, 57%, 85%, 1);\n}\n\n.alert_alert-spinner_2JcbE {\n self-align: center;\n}\n\n.alert_icon-section_2DC1x {\n min-width: 1.25rem;\n min-height: 1.25rem;\n display: flex;\n padding-right: 1rem;\n}\n\n.alert_alert-icon_3-jQB {\n vertical-align: middle;\n}\n\n.alert_alert-message_3dEDJ {\n color: #555;\n font-weight: bold;\n font-size: .8125rem;\n line-height: .875rem;\n display: flex;\n align-items: center;\n padding-right: .5rem;\n}\n\n.alert_alert-buttons_CZbh6 {\n display: flex;\n flex-direction: row;\n}\n\n.alert_alert-close-button_2ci8S {\n outline-style:none;\n}\n\n.alert_alert-close-button-container_2m64w {\n outline-style: none;\n width: 30px;\n height: 30px;\n align-self: center;\n}\n\n.alert_alert-connection-button_ETbfk {\n min-height: 2rem;\n width: 6.5rem;\n padding: 0.55rem 0.9rem;\n border-radius: 0.35rem;\n background: #FF8C1A;\n color: white;\n font-weight: 700;\n font-size: 0.77rem;\n border: none;\n cursor: pointer;\n display: flex;\n justify-content: center;\n align-items: center;\n align-self: stretch;\n outline-style:none;\n}\n\n[dir=\"ltr\"] .alert_alert-connection-button_ETbfk {\n margin-right: 13px;\n}\n\n[dir=\"rtl\"] .alert_alert-connection-button_ETbfk {\n margin-left: 13px;\n}\n\n/* prevent last button in list from too much margin to edge of alert */\n\n.alert_alert-buttons_CZbh6 > :last-child {\n margin-left: 0;\n margin-right: 0;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"alert": "alert_alert_2Ou-m",
|
||
"warn": "alert_warn_2441l",
|
||
"success": "alert_success_1TbgT",
|
||
"alert-spinner": "alert_alert-spinner_2JcbE",
|
||
"alertSpinner": "alert_alert-spinner_2JcbE",
|
||
"icon-section": "alert_icon-section_2DC1x",
|
||
"iconSection": "alert_icon-section_2DC1x",
|
||
"alert-icon": "alert_alert-icon_3-jQB",
|
||
"alertIcon": "alert_alert-icon_3-jQB",
|
||
"alert-message": "alert_alert-message_3dEDJ",
|
||
"alertMessage": "alert_alert-message_3dEDJ",
|
||
"alert-buttons": "alert_alert-buttons_CZbh6",
|
||
"alertButtons": "alert_alert-buttons_CZbh6",
|
||
"alert-close-button": "alert_alert-close-button_2ci8S",
|
||
"alertCloseButton": "alert_alert-close-button_2ci8S",
|
||
"alert-close-button-container": "alert_alert-close-button-container_2m64w",
|
||
"alertCloseButtonContainer": "alert_alert-close-button-container_2m64w",
|
||
"alert-connection-button": "alert_alert-connection-button_ETbfk",
|
||
"alertConnectionButton": "alert_alert-connection-button_ETbfk"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/alerts/alerts.css":
|
||
/*!*************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/alerts/alerts.css ***!
|
||
\*************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, ".alerts_alerts-inner-container_1KTuF {\n min-width: 200px;\n max-width: 548px;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"alerts-inner-container": "alerts_alerts-inner-container_1KTuF",
|
||
"alertsInnerContainer": "alerts_alerts-inner-container_1KTuF"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/alerts/inline-message.css":
|
||
/*!*********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/alerts/inline-message.css ***!
|
||
\*********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ .inline-message_inline-message_2feS3 {\n color: hsla(0, 100%, 100%, 1);\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n display: flex;\n justify-content: flex-end;\n align-items: center;\n font-size: .8125rem;\n} .inline-message_success_1jfE0 {\n color: hsla(0, 100%, 100%, 0.75);\n} .inline-message_info_E7dNO {\n color: hsla(0, 100%, 100%, 1);\n} .inline-message_warn_3DS5G {\n color: hsla(30, 100%, 70%, 1);\n} .inline-message_spinner_1vybW {\n margin-right: 0.5rem;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"inline-message": "inline-message_inline-message_2feS3",
|
||
"inlineMessage": "inline-message_inline-message_2feS3",
|
||
"success": "inline-message_success_1jfE0",
|
||
"info": "inline-message_info_E7dNO",
|
||
"warn": "inline-message_warn_3DS5G",
|
||
"spinner": "inline-message_spinner_1vybW"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/asset-panel/asset-panel.css":
|
||
/*!***********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/asset-panel/asset-panel.css ***!
|
||
\***********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n.asset-panel_wrapper_366X0 {\n display: flex;\n flex-grow: 1;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n background: white;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 0.85rem;\n}\n\n[theme=\"dark\"] .asset-panel_wrapper_366X0 {\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n}\n\n[dir=\"ltr\"] .asset-panel_wrapper_366X0 {\n border-top-right-radius: 0.5rem;\n border-bottom-right-radius: 0.5rem;\n}\n\n[dir=\"rtl\"] .asset-panel_wrapper_366X0 {\n border-top-left-radius: 0.5rem;\n border-bottom-left-radius: 0.5rem;\n}\n\n.asset-panel_detail-area_2KQhH {\n display: flex;\n flex-grow: 1;\n flex-shrink: 1;\n overflow: visible;\n}\n\n[dir=\"ltr\"] .asset-panel_detail-area_2KQhH {\n border-left: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n\n[dir=\"rtl\"] .asset-panel_detail-area_2KQhH {\n border-right: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"wrapper": "asset-panel_wrapper_366X0",
|
||
"detail-area": "asset-panel_detail-area_2KQhH",
|
||
"detailArea": "asset-panel_detail-area_2KQhH"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/asset-panel/selector.css":
|
||
/*!********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/asset-panel/selector.css ***!
|
||
\********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ .selector_wrapper_8_BHs {\n width: 150px;\n min-width: 150px; /* fixes width being ignored in the sound editor sometimes */\n position: relative;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n background: var(--ui-tertiary, hsla(215, 50%, 90%, 1));\n} .selector_new-buttons_2qHDd {\n position: absolute;\n bottom: 0;\n width: 100%;\n\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-around;\n padding: 0.75rem 0;\n color: hsla(0, 100%, 65%, 1);\n text-align: center;\n background: none;\n pointer-events: none;\n} .selector_new-buttons_2qHDd:before {\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n right:0;\n background: linear-gradient(rgba(232,237,241, 0),rgba(232,237,241, 1));\n height: 100px;\n width: 100%;\n pointer-events: none;\n} [theme=\"dark\"] .selector_new-buttons_2qHDd:before {\n background: linear-gradient(rgba(94, 96, 97, 0),rgb(59, 59, 59));\n} .selector_new-buttons_2qHDd > button + button {\n margin-top: 0.75rem;\n} .selector_list-area_1Xbj_ {\n /* Must have some height (recalculated by flex-grow) in order to scroll */\n height: 0;\n flex-grow: 1;\n overflow-y: auto;\n overflow-x: hidden;\n display: flex;\n flex-direction: column;\n} .selector_list-area_1Xbj_:after {\n /* Make sure there is room to scroll beyond the last tile */\n content: '';\n display: block;\n height: 70px;\n width: 100%;\n flex-shrink: 0;\n order: 99999999;\n} .selector_list-item_3N_u7 {\n width: 5rem;\n height: 5rem;\n margin: 0.5rem auto;\n} @media only screen and (max-width: 1249px) {\n .selector_wrapper_8_BHs {\n width: 80px;\n min-width: 80px;\n }\n\n .selector_list-item_3N_u7 {\n width: 4rem;\n }\n} .selector_list-item_3N_u7.selector_placeholder_2pqWG {\n background: white;\n filter: opacity(15%) brightness(0%);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"wrapper": "selector_wrapper_8_BHs",
|
||
"new-buttons": "selector_new-buttons_2qHDd",
|
||
"newButtons": "selector_new-buttons_2qHDd",
|
||
"list-area": "selector_list-area_1Xbj_",
|
||
"listArea": "selector_list-area_1Xbj_",
|
||
"list-item": "selector_list-item_3N_u7",
|
||
"listItem": "selector_list-item_3N_u7",
|
||
"placeholder": "selector_placeholder_2pqWG"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/audio-trimmer/audio-trimmer.css":
|
||
/*!***************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/audio-trimmer/audio-trimmer.css ***!
|
||
\***************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .audio-trimmer_absolute_1x_Jq {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n\n /* Force the browser to paint separately to avoid composite cost with waveform */\n transform: translateZ(0);\n} .audio-trimmer_selector_DDQ2- {\n cursor: pointer;\n} .audio-trimmer_trim-background_2VYXk {\n cursor: pointer;\n touch-action: none;\n} .audio-trimmer_trim-background-mask_mmZgf {\n border: 1px solid hsla(20, 100%, 45%, 1);\n opacity: 0.5;\n\n background: repeating-linear-gradient(\n 45deg,\n hsla(20, 100%, 55%, 1),\n hsla(20, 100%, 55%, 1) 10px,\n hsla(20, 100%, 45%, 1) 10px,\n hsla(20, 100%, 45%, 1) calc(2 * 10px)\n );\n} .audio-trimmer_selection-background_3LBuB {\n background: hsla(0, 100%, 65%, 1);\n opacity: 0.5;\n} .audio-trimmer_start-trim-background_26IJ6 .audio-trimmer_trim-background-mask_mmZgf {\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n} .audio-trimmer_end-trim-background_1QrZm .audio-trimmer_trim-background-mask_mmZgf {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n} .audio-trimmer_trim-line_2cpoE {\n position: absolute;\n top: 0;\n width: 0px;\n height: 100%;\n border: 1px solid hsla(20, 100%, 45%, 1);\n} .audio-trimmer_selector_DDQ2- .audio-trimmer_trim-line_2cpoE {\n border: 1px solid hsla(0, 60%, 50%, 1);\n} .audio-trimmer_playhead-container_3l7Ve {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n overflow: hidden;\n} .audio-trimmer_playhead_3A0k9 {\n /*\n Even though playhead is just a line, it is 100% width (the width of the waveform)\n so that we can use transform: translateX() using percentages.\n */\n width: 100%;\n height: 100%;\n border-left: 1px solid hsla(0, 100%, 65%, 1);\n border-top: none;\n border-bottom: none;\n border-right: none;\n} .audio-trimmer_right-handle_jMGnD {\n transform: scaleX(-1);\n} .audio-trimmer_selector_DDQ2- .audio-trimmer_left-handle_1Ure2 {\n left: -1px\n} .audio-trimmer_selector_DDQ2- .audio-trimmer_right-handle_jMGnD {\n right: -1px\n} .audio-trimmer_trimmer_3T33n .audio-trimmer_left-handle_1Ure2 {\n right: -1px\n} .audio-trimmer_trimmer_3T33n .audio-trimmer_right-handle_jMGnD {\n left: -1px\n} .audio-trimmer_trim-handle_1Obhp {\n position: absolute;\n width: 30px;\n height: 30px;\n right: 0;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n} .audio-trimmer_trimmer_3T33n .audio-trimmer_trim-handle_1Obhp {\n filter: hue-rotate(150deg);\n} .audio-trimmer_trim-handle_1Obhp img {\n position: absolute;\n width: 30px;\n height: 30px;\n left: calc(3px * 1.5);\n\n /* Make sure image dragging isn't triggered */\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n user-drag: none;\n -webkit-user-drag: none; /* Autoprefixer doesn't seem to work for this */\n\n transition: 0.2s;\n} .audio-trimmer_top-trim-handle_1oF2r {\n top: calc(-30px + 3px);\n} .audio-trimmer_bottom-trim-handle_2FNda {\n bottom: calc(-30px + 3px);\n} .audio-trimmer_top-trim-handle_1oF2r img {\n transform: scaleY(-1);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"absolute": "audio-trimmer_absolute_1x_Jq",
|
||
"selector": "audio-trimmer_selector_DDQ2-",
|
||
"trim-background": "audio-trimmer_trim-background_2VYXk",
|
||
"trimBackground": "audio-trimmer_trim-background_2VYXk",
|
||
"trim-background-mask": "audio-trimmer_trim-background-mask_mmZgf",
|
||
"trimBackgroundMask": "audio-trimmer_trim-background-mask_mmZgf",
|
||
"selection-background": "audio-trimmer_selection-background_3LBuB",
|
||
"selectionBackground": "audio-trimmer_selection-background_3LBuB",
|
||
"start-trim-background": "audio-trimmer_start-trim-background_26IJ6",
|
||
"startTrimBackground": "audio-trimmer_start-trim-background_26IJ6",
|
||
"end-trim-background": "audio-trimmer_end-trim-background_1QrZm",
|
||
"endTrimBackground": "audio-trimmer_end-trim-background_1QrZm",
|
||
"trim-line": "audio-trimmer_trim-line_2cpoE",
|
||
"trimLine": "audio-trimmer_trim-line_2cpoE",
|
||
"playhead-container": "audio-trimmer_playhead-container_3l7Ve",
|
||
"playheadContainer": "audio-trimmer_playhead-container_3l7Ve",
|
||
"playhead": "audio-trimmer_playhead_3A0k9",
|
||
"right-handle": "audio-trimmer_right-handle_jMGnD",
|
||
"rightHandle": "audio-trimmer_right-handle_jMGnD",
|
||
"left-handle": "audio-trimmer_left-handle_1Ure2",
|
||
"leftHandle": "audio-trimmer_left-handle_1Ure2",
|
||
"trimmer": "audio-trimmer_trimmer_3T33n",
|
||
"trim-handle": "audio-trimmer_trim-handle_1Obhp",
|
||
"trimHandle": "audio-trimmer_trim-handle_1Obhp",
|
||
"top-trim-handle": "audio-trimmer_top-trim-handle_1oF2r",
|
||
"topTrimHandle": "audio-trimmer_top-trim-handle_1oF2r",
|
||
"bottom-trim-handle": "audio-trimmer_bottom-trim-handle_2FNda",
|
||
"bottomTrimHandle": "audio-trimmer_bottom-trim-handle_2FNda"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/backpack/backpack.css":
|
||
/*!*****************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/backpack/backpack.css ***!
|
||
\*****************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n.backpack_backpack-container_2_wGr {\n flex-shrink: 1;\n position: relative;\n}\n\n.backpack_backpack-header_6ltCS {\n margin-top: 0.5rem;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n background: hsla(0, 100%, 100%, 1);\n padding: 0.25rem;\n text-align: center;\n font-size: 0.85rem;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n transition: 0.2s;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n[theme=\"dark\"] .backpack_backpack-header_6ltCS {\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n}\n\n[dir=\"ltr\"] .backpack_backpack-header_6ltCS {\n border-top-right-radius: 0.5rem;\n}\n\n[dir=\"rtl\"] .backpack_backpack-header_6ltCS {\n border-top-left-radius: 0.5rem;\n}\n\n.backpack_backpack-list_MOp5X {\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n border-right: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n min-height: 5.5rem;\n}\n\n/* Absolute position the inner list to allow scrolling inside flex sized container */\n\n.backpack_backpack-list-inner_10a2A {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: row;\n align-items: center;\n overflow-x: auto;\n}\n\n.backpack_drag-over_3bBKD:after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n opacity: 0.75;\n background-color: hsla(0, 100%, 77%, 1);\n transition: all 0.25s ease;\n}\n\n.backpack_status-message_3kt5s {\n width: 100%;\n text-align: center;\n font-size: 0.85rem;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n}\n\n.backpack_error-message_2JoTP {\n font-family: monospace;\n}\n\n.backpack_backpack-item_hwqzQ {\n width: 4rem;\n height: 4.5rem;\n margin: 0 0.25rem;\n flex-shrink: 0;\n\n /* Need to hide overflow because of background setting below */\n overflow: hidden;\n}\n\n.backpack_backpack-item_hwqzQ > div {\n /* Need to set the background to get blend-mode below to work */\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n}\n\n.backpack_backpack-item_hwqzQ img {\n mix-blend-mode: multiply; /* Make white transparent for thumnbnails */\n}\n\n[theme=\"dark\"] .backpack_backpack-item_hwqzQ img {\n mix-blend-mode: normal;\n}\n\n.backpack_more_j3LFZ {\n background: hsla(0, 100%, 65%, 1);\n color: hsla(0, 100%, 100%, 1);\n border: none;\n outline: none;\n font-weight: bold;\n border-radius: 0.5rem;\n font-size: 0.85rem;\n padding: 0.5rem;\n margin: 0.5rem;\n cursor: pointer;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"backpack-container": "backpack_backpack-container_2_wGr",
|
||
"backpackContainer": "backpack_backpack-container_2_wGr",
|
||
"backpack-header": "backpack_backpack-header_6ltCS",
|
||
"backpackHeader": "backpack_backpack-header_6ltCS",
|
||
"backpack-list": "backpack_backpack-list_MOp5X",
|
||
"backpackList": "backpack_backpack-list_MOp5X",
|
||
"backpack-list-inner": "backpack_backpack-list-inner_10a2A",
|
||
"backpackListInner": "backpack_backpack-list-inner_10a2A",
|
||
"drag-over": "backpack_drag-over_3bBKD",
|
||
"dragOver": "backpack_drag-over_3bBKD",
|
||
"status-message": "backpack_status-message_3kt5s",
|
||
"statusMessage": "backpack_status-message_3kt5s",
|
||
"error-message": "backpack_error-message_2JoTP",
|
||
"errorMessage": "backpack_error-message_2JoTP",
|
||
"backpack-item": "backpack_backpack-item_hwqzQ",
|
||
"backpackItem": "backpack_backpack-item_hwqzQ",
|
||
"more": "backpack_more_j3LFZ"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/blocks/blocks.css":
|
||
/*!*************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/blocks/blocks.css ***!
|
||
\*************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n/*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/\n\n/* Toolbox z-index: 40; set in scratch-blocks */\n\n/* tooltips should go over add buttons if they overlap */\n\n/* monitors go over add buttons */\n\n/* \"ask\" block text input goes above monitors */\n\n/* menu-bar should go over monitors, alerts and tutorials */\n\n/* tw: show below menu bar normally */\n\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\n\n/* so it is draggable into other panes */\n\n/* in most interfaces, the context menu is always on top */\n\n.blocks_blocks_C530M {\n height: 100%;\n}\n\n.blocks_drag-over_2btTP:after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n opacity: 0.75;\n background-color: hsla(0, 100%, 77%, 1);\n transition: all 0.25s ease;\n}\n\n.blocks_blocks_C530M .injectionDiv{\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-top-right-radius: 0.5rem;\n border-bottom-right-radius: 0.5rem;\n}\n\n[dir=\"rtl\"] .blocks_blocks_C530M .injectionDiv {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n border-top-left-radius: 0.5rem;\n border-bottom-left-radius: 0.5rem;\n}\n\n.blocks_blocks_C530M .blocklyMainBackground {\n stroke: none;\n}\n\n.blocks_blocks_C530M .blocklyToolboxDiv {\n border-right: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-bottom: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n box-sizing: content-box;\n height: calc(100% - 3.25rem) !important;\n overflow-x: hidden;\n\n /*\n For now, the layout cannot support scrollbars in the category menu.\n The line below works for Edge, the `::-webkit-scrollbar` line\n below that is for webkit browsers. It isn't possible to do the\n same for Firefox, so a different solution may be needed for them.\n */\n -ms-overflow-style: none;\n}\n\n[dir=\"rtl\"] .blocks_blocks_C530M .blocklyToolboxDiv {\n border-right: none;\n border-left: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n\n.blocks_blocks_C530M .blocklyToolboxDiv::-webkit-scrollbar {\n display: none;\n}\n\n.blocks_blocks_C530M .blocklyFlyout {\n border-right: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n box-sizing: content-box;\n}\n\n[dir=\"rtl\"] .blocks_blocks_C530M .blocklyFlyout {\n border-right: none;\n border-left: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n\n.blocks_blocks_C530M .blocklyBlockDragSurface {\n /*\n Fix an issue where the drag surface was preventing hover events for sharing blocks.\n This does not prevent user interaction on the blocks themselves.\n */\n pointer-events: none;\n z-index: 1000; /* make blocks match gui drag layer */\n}\n\n/*\n Shrink category font to fit \"My Blocks\" for now.\n Probably will need different solutions for language support later, so\n make the change here instead of in scratch-blocks.\n*/\n\n.blocks_blocks_C530M .scratchCategoryMenuItemLabel {\n font-size: 0.65rem;\n}\n\n.blocks_blocks_C530M .blocklyMinimalBody {\n min-width: auto;\n min-height: auto;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"blocks": "blocks_blocks_C530M",
|
||
"drag-over": "blocks_drag-over_2btTP",
|
||
"dragOver": "blocks_drag-over_2btTP"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/box/box.css":
|
||
/*!*******************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/box/box.css ***!
|
||
\*******************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, ".box_box_2jjDp {\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"box": "box_box_2jjDp"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/browser-modal/browser-modal.css":
|
||
/*!***************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/browser-modal/browser-modal.css ***!
|
||
\***************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ body {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n} h2 {\n font-size: 1.5rem;\n font-weight: bold;\n} p {\n font-size: 1rem;\n line-height: 1.5em;\n} /*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/ /* Toolbox z-index: 40; set in scratch-blocks */ /* tooltips should go over add buttons if they overlap */ /* monitors go over add buttons */ /* \"ask\" block text input goes above monitors */ /* menu-bar should go over monitors, alerts and tutorials */ /* tw: show below menu bar normally */ /* Block drag z-index: 1000; default 50 is overriden in blocks.css */ /* so it is draggable into other panes */ /* in most interfaces, the context menu is always on top */ .browser-modal_modal-overlay_3TDyF {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 510;\n background-color: var(--ui-modal-overlay, hsla(0, 100%, 65%, 0.9));\n} .browser-modal_modal-content_3iHow {\n margin: 100px auto;\n outline: none;\n border: .25rem solid hsla(0, 100%, 100%, 0.25);\n padding: 0;\n border-radius: 0.5rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n width: 500px;\n\n color: hsla(225, 15%, 40%, 1);\n overflow: hidden;\n} .browser-modal_illustration_1qhRy {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100px;\n background-color: hsla(38, 100%, 55%, 1);\n} [dir=\"rtl\"] .browser-modal_illustration_1qhRy {\n transform: scaleX(-1);\n} .browser-modal_illustration_1qhRy img {\n height: 80%;\n width: auto;\n} .browser-modal_body_1pvBQ {\n background: hsla(0, 100%, 100%, 1);\n padding: 1.5rem 2.25rem;\n text-align: center;\n} /* Confirmation buttons at the bottom of the modal */ .browser-modal_button-row_15bbH {\n margin: 1.5rem 0;\n font-weight: bolder;\n text-align: right;\n display: flex;\n justify-content: center;\n} .browser-modal_button-row_15bbH button {\n border: 1px solid hsla(0, 100%, 65%, 1);\n border-radius: 0.25rem;\n padding: 0.5rem 2rem;\n background: hsla(0, 100%, 65%, 1);\n color: white;\n font-weight: bold;\n font-size: 0.875rem;\n cursor: pointer;\n} .browser-modal_faq-link-text_1e8bS {\n margin: 2rem 0 .5rem 0;\n font-size: .875rem;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n} .browser-modal_faq-link_3leDC {\n color: hsla(0, 100%, 65%, 1);\n text-decoration: none;\n} .browser-modal_body_1pvBQ p {\n margin-bottom: 1em;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-overlay": "browser-modal_modal-overlay_3TDyF",
|
||
"modalOverlay": "browser-modal_modal-overlay_3TDyF",
|
||
"modal-content": "browser-modal_modal-content_3iHow",
|
||
"modalContent": "browser-modal_modal-content_3iHow",
|
||
"illustration": "browser-modal_illustration_1qhRy",
|
||
"body": "browser-modal_body_1pvBQ",
|
||
"button-row": "browser-modal_button-row_15bbH",
|
||
"buttonRow": "browser-modal_button-row_15bbH",
|
||
"faq-link-text": "browser-modal_faq-link-text_1e8bS",
|
||
"faqLinkText": "browser-modal_faq-link-text_1e8bS",
|
||
"faq-link": "browser-modal_faq-link_3leDC",
|
||
"faqLink": "browser-modal_faq-link_3leDC"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/button/button.css":
|
||
/*!*************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/button/button.css ***!
|
||
\*************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n.button_outlined-button_1bS__ {\n cursor: pointer;\n border-radius: calc(0.5rem / 2);\n font-weight: bold;\n display: flex;\n flex-direction: row;\n align-items: center;\n padding-left: .75rem;\n padding-right: .75rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.button_icon_77d8G {\n height: 1.5rem;\n}\n\n[dir=\"ltr\"] .button_icon_77d8G {\n margin-right: .5rem;\n}\n\n[dir=\"rtl\"] .button_icon_77d8G {\n margin-left: .5rem;\n}\n\n.button_content_3jdgj {\n white-space: nowrap;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"outlined-button": "button_outlined-button_1bS__",
|
||
"outlinedButton": "button_outlined-button_1bS__",
|
||
"icon": "button_icon_77d8G",
|
||
"content": "button_content_3jdgj"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/cards/card.css":
|
||
/*!**********************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/cards/card.css ***!
|
||
\**********************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n/*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/\n\n/* Toolbox z-index: 40; set in scratch-blocks */\n\n/* tooltips should go over add buttons if they overlap */\n\n/* monitors go over add buttons */\n\n/* \"ask\" block text input goes above monitors */\n\n/* menu-bar should go over monitors, alerts and tutorials */\n\n/* tw: show below menu bar normally */\n\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\n\n/* so it is draggable into other panes */\n\n/* in most interfaces, the context menu is always on top */\n\n.card_card-container-overlay_gnjBL {\n position: fixed;\n pointer-events: none;\n z-index: 480;\n}\n\n.card_card-container_3_Sbc {\n position:absolute;\n pointer-events: auto;\n z-index: 480;\n margin: 0.5rem 2rem;\n min-width: 468px;\n}\n\n.card_left-card_1KpEh, .card_right-card_3IrbD {\n height: 90%;\n position: absolute;\n top: 5%;\n background: hsla(0, 100%, 100%, 1);\n border: 1px solid var(--ui-tertiary, hsla(215, 50%, 90%, 1));\n width: .75rem;\n z-index: 10;\n opacity: 0.9;\n overflow: hidden;\n}\n\n.card_left-card_1KpEh {\n left: -.75rem;\n border-right: 0;\n border-top-left-radius: 0.75rem;\n border-bottom-left-radius: 0.75rem;\n}\n\n.card_right-card_3IrbD {\n right: -.75rem;\n border-left: 0;\n border-top-right-radius: 0.75rem;\n border-bottom-right-radius: 0.75rem;\n}\n\n.card_left-card_1KpEh::after, .card_right-card_3IrbD::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n height: 2.5rem;\n width: 100%;\n background: hsla(10, 85%, 65%, 1);\n}\n\n.card_left-button_2IXDY, .card_right-button_3Py4m {\n position: absolute;\n top: 50%;\n margin-top: -15px;\n z-index: 20;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: pointer;\n background: hsla(10, 85%, 65%, 1);\n box-shadow: 0 0 0 4px hsla(10, 85%, 65%, 0.35);\n height: 44px;\n width: 44px;\n border-radius: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n transition: all 0.25s ease;\n}\n\n.card_left-button_2IXDY:hover, .card_right-button_3Py4m:hover {\n box-shadow: 0 0 0 6px hsla(10, 85%, 65%, 0.35);\n transform: scale(1.125);\n}\n\n.card_left-button_2IXDY img, .card_right-button_3Py4m img{\n width: 1.75rem;\n}\n\n.card_left-button_2IXDY {\n left: -27px;\n}\n\n.card_right-button_3Py4m {\n right: -27px;\n}\n\n.card_card_3GG7C {\n border: 1px solid var(--ui-tertiary, hsla(215, 50%, 90%, 1));\n border-radius: 0.75rem;\n display: flex;\n flex-direction: column;\n cursor: move;\n z-index: 20;\n overflow: hidden;\n box-shadow: 0px 5px 25px 5px hsla(0, 0%, 0%, 0.15);\n align-items: center;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n.card_header-buttons_3Yq16 {\n width: 100%;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n background: hsla(10, 85%, 65%, 1);\n border-bottom: 1px solid hsla(10, 85%, 40%, 1);\n font-size: 0.625rem;\n font-weight: bold;\n}\n\n.card_header-buttons-hidden_3y5Bd {\n border-bottom: 0px;\n}\n\n.card_header-buttons-right_2bzRm {\n display: flex;\n flex-direction: row;\n}\n\n.card_header-buttons_3Yq16 img {\n margin-bottom: 2px;\n}\n\n.card_shrink-expand-button_vbegz {\n cursor: pointer;\n color: white;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 0.75rem;\n}\n\n.card_shrink-expand-button_vbegz:hover, .card_all-button_15rrQ:hover {\n background-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n\n.card_remove-button_1F8SI, .card_all-button_15rrQ {\n cursor: pointer;\n color: white;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 0.75rem;\n}\n\n.card_remove-button_1F8SI:hover, .card_all-button_15rrQ:hover {\n background-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n\n.card_step-title_13--3 {\n font-size: 0.9rem;\n margin: 0.9rem;\n text-align: center;\n font-weight: bold;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n}\n\n.card_step-body_2bFkf {\n width: 100%;\n background: hsla(0, 100%, 100%, 1);\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n position: relative;\n text-align: center;\n\n /* Min height prevents layout changing when images change */\n min-height: 256px;\n}\n\n.card_step-video_3qH9J {\n height: 256px;\n}\n\n.card_step-image_2_jUv {\n max-width: 450px;\n max-height: 200px;\n object-fit: contain;\n background: #F9F9F9;\n border: 1px solid #ddd;\n border-radius: 0.5rem;\n overflow: hidden;\n margin: 0 0.5rem 0.5rem;\n}\n\n.card_decks_1oD6G {\n display: flex;\n flex-direction: row;\n justify-content: space-around;\n padding: 0 1rem 0.5rem;\n}\n\n.card_deck_2NtVa {\n display: flex;\n flex-direction: column;\n margin: 0 8px 8px;\n cursor: pointer;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 0.25rem;\n overflow: hidden;\n}\n\n.card_deck-image_1V3q9 {\n width: 200px;\n height: 100px;\n object-fit: cover;\n}\n\n.card_deck-name_1SJhM {\n color: hsla(0, 100%, 65%, 1);\n font-weight: bold;\n font-size: 0.85rem;\n margin: .625rem 0px;\n text-align: center;\n font-weight: bold;\n text-align: center;\n max-width: 200px;\n}\n\n.card_help-icon_1iyk7 {\n height: 1.25rem;\n}\n\n.card_close-icon_1FYf5 {\n height: 1.25rem;\n margin: .125rem 0; /* To offset the .25rem difference in icon size */\n}\n\n[dir=\"ltr\"] .card_help-icon_1iyk7 {\n margin-right: 0.25rem;\n}\n\n[dir=\"rtl\"] .card_help-icon_1iyk7 {\n margin-left: 0.25rem;\n}\n\n[dir=\"ltr\"] .card_close-icon_1FYf5 {\n margin-left: 0.25rem;\n}\n\n[dir=\"rtl\"] .card_close-icon_1FYf5 {\n margin-right: 0.25rem;\n}\n\n.card_see-all_1_E8D {\n display: flex;\n flex-direction: row;\n justify-content: center;\n width: 100%;\n padding: 0.5rem;\n}\n\n.card_see-all-button_3o4U8 {\n cursor: pointer;\n padding: 0.5rem 1rem;\n background-color: hsla(0, 100%, 65%, 1);\n color: white;\n font-weight: bold;\n border-radius: 0.25rem;\n display: flex;\n align-items: center;\n color: hsla(0, 100%, 100%, 1);\n font-size: .75rem;\n font-weight: bold;\n line-height: 1rem;\n text-align: center;\n}\n\n[dir=\"ltr\"] .card_see-all-button_3o4U8 img {\n margin-left: 0.5rem;\n}\n\n[dir=\"rtl\"] .card_see-all-button_3o4U8 img {\n margin-right: 0.5rem;\n}\n\n.card_steps-list_22Q1P {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n.card_active-step-pip_I0bxo, .card_inactiveStepPip_2lVp2 {\n width: 0.5rem;\n height: 0.5rem;\n margin: 0 0.25rem;\n border-radius: 100%;\n background: hsla(0, 100%, 100%, 0.25);\n}\n\n.card_active-step-pip_I0bxo {\n background: hsla(0, 100%, 100%, 1);\n box-shadow: 0px 0px 0px 2px hsla(0, 0%, 0%, 0.15);\n}\n\n.card_hidden_Jk77J {\n display: none;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"card-container-overlay": "card_card-container-overlay_gnjBL",
|
||
"cardContainerOverlay": "card_card-container-overlay_gnjBL",
|
||
"card-container": "card_card-container_3_Sbc",
|
||
"cardContainer": "card_card-container_3_Sbc",
|
||
"left-card": "card_left-card_1KpEh",
|
||
"leftCard": "card_left-card_1KpEh",
|
||
"right-card": "card_right-card_3IrbD",
|
||
"rightCard": "card_right-card_3IrbD",
|
||
"left-button": "card_left-button_2IXDY",
|
||
"leftButton": "card_left-button_2IXDY",
|
||
"right-button": "card_right-button_3Py4m",
|
||
"rightButton": "card_right-button_3Py4m",
|
||
"card": "card_card_3GG7C",
|
||
"header-buttons": "card_header-buttons_3Yq16",
|
||
"headerButtons": "card_header-buttons_3Yq16",
|
||
"header-buttons-hidden": "card_header-buttons-hidden_3y5Bd",
|
||
"headerButtonsHidden": "card_header-buttons-hidden_3y5Bd",
|
||
"header-buttons-right": "card_header-buttons-right_2bzRm",
|
||
"headerButtonsRight": "card_header-buttons-right_2bzRm",
|
||
"shrink-expand-button": "card_shrink-expand-button_vbegz",
|
||
"shrinkExpandButton": "card_shrink-expand-button_vbegz",
|
||
"all-button": "card_all-button_15rrQ",
|
||
"allButton": "card_all-button_15rrQ",
|
||
"remove-button": "card_remove-button_1F8SI",
|
||
"removeButton": "card_remove-button_1F8SI",
|
||
"step-title": "card_step-title_13--3",
|
||
"stepTitle": "card_step-title_13--3",
|
||
"step-body": "card_step-body_2bFkf",
|
||
"stepBody": "card_step-body_2bFkf",
|
||
"step-video": "card_step-video_3qH9J",
|
||
"stepVideo": "card_step-video_3qH9J",
|
||
"step-image": "card_step-image_2_jUv",
|
||
"stepImage": "card_step-image_2_jUv",
|
||
"decks": "card_decks_1oD6G",
|
||
"deck": "card_deck_2NtVa",
|
||
"deck-image": "card_deck-image_1V3q9",
|
||
"deckImage": "card_deck-image_1V3q9",
|
||
"deck-name": "card_deck-name_1SJhM",
|
||
"deckName": "card_deck-name_1SJhM",
|
||
"help-icon": "card_help-icon_1iyk7",
|
||
"helpIcon": "card_help-icon_1iyk7",
|
||
"close-icon": "card_close-icon_1FYf5",
|
||
"closeIcon": "card_close-icon_1FYf5",
|
||
"see-all": "card_see-all_1_E8D",
|
||
"seeAll": "card_see-all_1_E8D",
|
||
"see-all-button": "card_see-all-button_3o4U8",
|
||
"seeAllButton": "card_see-all-button_3o4U8",
|
||
"steps-list": "card_steps-list_22Q1P",
|
||
"stepsList": "card_steps-list_22Q1P",
|
||
"active-step-pip": "card_active-step-pip_I0bxo",
|
||
"activeStepPip": "card_active-step-pip_I0bxo",
|
||
"inactiveStepPip": "card_inactiveStepPip_2lVp2",
|
||
"hidden": "card_hidden_Jk77J"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/close-button/close-button.css":
|
||
/*!*************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/close-button/close-button.css ***!
|
||
\*************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ .close-button_close-button_lOp2G {\n display: flex;\n align-items: center;\n justify-content: center;\n\n overflow: hidden; /* Mask the icon animation */\n background-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 50%;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: pointer;\n transition: all 0.15s ease-out;\n} .close-button_close-button_lOp2G.close-button_large_2oadS:hover {\n transform: scale(1.1, 1.1);\n box-shadow: 0 0 0 4px var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n} .close-button_close-button_lOp2G.close-button_large_2oadS.close-button_orange_3I0rs:hover {\n transform: scale(1.1, 1.1);\n box-shadow: 0px 0px 0px 4px hsla(29, 100%, 54%, 0.2);\n} .close-button_small_3BsRW {\n width: 0.825rem;\n height: 0.825rem;\n background-color: hsla(0, 100%, 65%, 1);\n color: hsla(0, 100%, 100%, 1);\n} .close-button_large_2oadS {\n width: 1.75rem;\n height: 1.75rem;\n box-shadow: 0 0 0 2px var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n} .close-button_large_2oadS.close-button_orange_3I0rs {\n background-color: hsla(29, 100%, 54%, 0.2);\n box-shadow: 0px 0px 0px 2px hsla(29, 100%, 54%, 0.2);\n} .close-button_close-icon_HBCuO {\n position: relative;\n margin: 0.25rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n transform-origin: 50%;\n transform: rotate(45deg);\n} .close-button_close-icon_HBCuO.close-button_orange_3I0rs {\n transform: rotate(45deg);\n transform: scale(1.4);\n} .close-button_small_3BsRW .close-button_close-icon_HBCuO {\n width: 50%;\n} .close-button_large_2oadS .close-button_close-icon_HBCuO {\n width: 0.75rem;\n height: 0.75rem;\n} .close-button_back-icon_tlcJm {\n position: relative;\n margin: 0.25rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n} .close-button_small_3BsRW .close-button_back-icon_tlcJm {\n width: 50%;\n} .close-button_large_2oadS .close-button_back-icon_tlcJm {\n width: 2rem;\n height: 2rem;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"close-button": "close-button_close-button_lOp2G",
|
||
"closeButton": "close-button_close-button_lOp2G",
|
||
"large": "close-button_large_2oadS",
|
||
"orange": "close-button_orange_3I0rs",
|
||
"small": "close-button_small_3BsRW",
|
||
"close-icon": "close-button_close-icon_HBCuO",
|
||
"closeIcon": "close-button_close-icon_HBCuO",
|
||
"back-icon": "close-button_back-icon_tlcJm",
|
||
"backIcon": "close-button_back-icon_tlcJm"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/coming-soon/coming-soon.css":
|
||
/*!***********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/coming-soon/coming-soon.css ***!
|
||
\***********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/*\n * NOTE: the copious use of `important` is needed to overwrite\n * the default tooltip styling, and is required by the 3rd party\n * library being used, `react-tooltip`\n */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/\n\n/* Toolbox z-index: 40; set in scratch-blocks */\n\n/* tooltips should go over add buttons if they overlap */\n\n/* monitors go over add buttons */\n\n/* \"ask\" block text input goes above monitors */\n\n/* menu-bar should go over monitors, alerts and tutorials */\n\n/* tw: show below menu bar normally */\n\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\n\n/* so it is draggable into other panes */\n\n/* in most interfaces, the context menu is always on top */\n\n.coming-soon_coming-soon_3x7RD {\n background-color: hsla(30, 100%, 55%, 1) !important;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15)) !important;\n border-radius: calc(0.5rem / 2) !important;\n box-shadow: 0 0 .5rem hsla(0, 0%, 0%, 0.15) !important;\n padding: .75rem 1rem !important;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important;\n font-size: 1rem !important;\n line-height: 1.25rem !important;\n z-index: 47 !important;\n}\n\n.coming-soon_coming-soon_3x7RD:after {\n content: \"\";\n border-top: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15)) !important;\n border-left: 0 !important;\n border-bottom: 0 !important;\n border-right: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15)) !important;\n border-radius: calc(0.5rem / 2);\n background-color: hsla(30, 100%, 55%, 1) !important;\n height: 1rem !important;\n width: 1rem !important;\n}\n\n.coming-soon_show_1Kszm,\n.coming-soon_show_1Kszm:before,\n.coming-soon_show_1Kszm:after {\n opacity: 1 !important;\n}\n\n.coming-soon_left_O4X9A:after {\n margin-top: -.5rem !important;\n right: -.5rem !important;\n transform: rotate(45deg) !important;\n}\n\n.coming-soon_right_1PkI6:after {\n margin-top: -.5rem !important;\n left: -.5rem !important;\n transform: rotate(-135deg) !important;\n}\n\n.coming-soon_top_13j8p:after {\n margin-right: -.5rem !important;\n bottom: -.5rem !important;\n transform: rotate(135deg) !important;\n}\n\n.coming-soon_bottom_2raz4:after {\n margin-left: -.5rem !important;\n top: -.5rem !important;\n transform: rotate(-45deg) !important;\n}\n\n.coming-soon_coming-soon-image_255bz {\n width: 1.25rem;\n height: 1.25rem;\n vertical-align: middle;\n}\n\n[dir=\"ltr\"] .coming-soon_coming-soon-image_255bz {\n margin-left: .125rem;\n}\n\n[dir=\"rtl\"] .coming-soon_coming-soon-image_255bz {\n margin-right: .125rem;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"coming-soon": "coming-soon_coming-soon_3x7RD",
|
||
"comingSoon": "coming-soon_coming-soon_3x7RD",
|
||
"show": "coming-soon_show_1Kszm",
|
||
"left": "coming-soon_left_O4X9A",
|
||
"right": "coming-soon_right_1PkI6",
|
||
"top": "coming-soon_top_13j8p",
|
||
"bottom": "coming-soon_bottom_2raz4",
|
||
"coming-soon-image": "coming-soon_coming-soon-image_255bz",
|
||
"comingSoonImage": "coming-soon_coming-soon-image_255bz"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/connection-modal/connection-modal.css":
|
||
/*!*********************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/connection-modal/connection-modal.css ***!
|
||
\*********************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ .connection-modal_modal-content_2Xr41 {\n width: 480px;\n} .connection-modal_header_3Sf5c {\n background-color: hsla(163, 85%, 40%, 1);\n} .connection-modal_body_3YO9j {\n background: hsla(0, 100%, 100%, 1);\n} .connection-modal_label_2ci_1 {\n font-weight: 500;\n margin: 0 0 0.75rem;\n} .connection-modal_centered-row_LqTYH {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n} .connection-modal_peripheral-tile-pane_2pquH {\n overflow-y: auto;\n width: 100%;\n height: 100%;\n} .connection-modal_peripheral-tile_3IZvY {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n\n background-color: hsla(0, 100%, 100%, 1);\n border-radius: 0.25rem;\n padding: 10px;\n width: 100%;\n height: 55px;\n margin-bottom: 0.5rem;\n} .connection-modal_peripheral-tile-name_3-1ov {\n display: flex;\n align-items: center;\n} [dir=\"ltr\"] .connection-modal_peripheral-tile-image_2HAYt {\n margin-right: 0.5rem;\n} [dir=\"rtl\"] .connection-modal_peripheral-tile-image_2HAYt {\n margin-left: 0.5rem;\n} .connection-modal_peripheral-tile-name-wrapper_LIgB5 {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: flex-start;\n} .connection-modal_peripheral-tile-name-label_Mhn3z {\n font-weight: bold;\n font-size: 0.625rem;\n} .connection-modal_peripheral-tile-name-text_3Gqj9 {\n font-size: 0.875rem;\n} .connection-modal_peripheral-tile_3IZvY button {\n padding: 0.6rem 0.75rem;\n border: none;\n border-radius: 0.25rem;\n font-weight: 600;\n font-size: 0.85rem;\n background: hsla(0, 100%, 65%, 1);\n border: hsla(0, 100%, 65%, 1);\n color: white;\n cursor: pointer;\n} .connection-modal_signal-strength-meter_17QSz {\n display: flex;\n justify-content: space-between;\n align-items: flex-end;\n width: 22px;\n height: 16px;\n} [dir=\"ltr\"] .connection-modal_signal-strength-meter_17QSz {\n margin-right: 1rem;\n} [dir=\"rtl\"] .connection-modal_signal-strength-meter_17QSz {\n margin-left: 1rem;\n} .connection-modal_signal-bar_3KRPL {\n width: 4px;\n border-radius: 4px;\n background-color: #DBDBDB;\n} .connection-modal_signal-bar_3KRPL:nth-of-type(1) { height: 25%; } .connection-modal_signal-bar_3KRPL:nth-of-type(2) { height: 50%; } .connection-modal_signal-bar_3KRPL:nth-of-type(3) { height: 75%; } .connection-modal_signal-bar_3KRPL:nth-of-type(4) { height: 100%; } .connection-modal_green-bar_2DtgQ {\n background-color: hsla(163, 85%, 40%, 1);\n} .connection-modal_radar-small_2Zlc3 {\n width: 40px;\n height: 40px;\n} [dir=\"ltr\"] .connection-modal_radar-small_2Zlc3 {\n margin-right: 0.5rem;\n} [dir=\"rtl\"] .connection-modal_radar-small_2Zlc3 {\n margin-left: 0.5rem;\n} .connection-modal_radar-big_1ZqZR {\n width: 120px;\n height: 120px;\n} .connection-modal_radar-spin_XTY3A {\n animation: connection-modal_spin_2AmoW 4s linear infinite;\n} [dir=\"ltr\"] .connection-modal_radar_1q6t4 {\n margin-right: .5rem;\n} [dir=\"rtl\"] .connection-modal_radar_1q6t4 {\n margin-left: .5rem;\n} @keyframes connection-modal_spin_2AmoW {\n 100% {\n transform: rotate(360deg);\n }\n} .connection-modal_peripheral-activity_1iEPn {\n position: relative;\n} .connection-modal_peripheral-activity-icon_2yzrQ {\n /* width: 80px;\n height: 80px; */\n} .connection-modal_connection-tip-icon_1OYH1 {\n position: absolute;\n} .connection-modal_bluetooth-connecting-icon_2WC-p {\n position: absolute;\n top: -5px;\n right: -15px;\n left: -15px;\n padding: 5px 5px;\n background-color: hsla(0, 100%, 65%, 1);\n border-radius: 100%;\n box-shadow: 0px 0px 0px 4px hsla(0, 100%, 65%, 0.35);\n /* animation: pulse-blue-ring 1s infinite ease-in-out alternate; */\n animation: connection-modal_wiggle_3PIQs 0.5s infinite ease-in-out alternate;\n\n} @keyframes connection-modal_pulse-blue-ring_Bst8a {\n 100% {\n box-shadow: 0px 0px 0px 8px hsla(0, 100%, 65%, 0.15);\n }\n} .connection-modal_bluetooth-connected-icon_2z3Cp {\n position: absolute;\n top: -5px;\n right: -15px;\n left: -15px;\n padding: 5px 5px;\n background-color: hsla(163, 85%, 40%, 1);\n border-radius: 100%;\n box-shadow: 0px 0px 0px 4px hsla(163, 85%, 40%, 0.25);\n} @keyframes connection-modal_wiggle_3PIQs {\n 0% {transform: rotate(3deg) scale(1.05);}\n 25% {transform: rotate(-3deg) scale(1.05);}\n 50% {transform: rotate(5deg) scale(1.05);}\n 75% {transform: rotate(-2deg) scale(1.05);}\n 100% {transform: rotate(0deg) scale(1.05);}\n} .connection-modal_bluetooth-centered-icon_2sUnm {\n position: absolute;\n padding: 5px 5px;\n background-color: hsla(0, 100%, 65%, 1);\n border-radius: 100%;\n box-shadow: 0px 0px 0px 2px hsla(0, 100%, 65%, 0.35);\n} .connection-modal_peripheral-tile-widgets_2czb9 {\n display: flex;\n align-items: center;\n} .connection-modal_activityArea_2nx-Z {\n height: 165px;\n background-color: hsla(0, 100%, 65%, 0.15);\n display: flex;\n justify-content: center;\n align-items: center;\n padding: .5rem;\n} .connection-modal_scratch-link-help_1v8tL {\n display: flex;\n flex-direction: column;\n justify-content: space-around;\n height: 100%;\n padding-top: .5rem;\n padding-bottom: .5rem;\n} .connection-modal_scratch-link-help-step_bWMuI {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n} [dir=\"ltr\"] .connection-modal_scratch-link-help-step_bWMuI {\n margin-left: 2.5rem;\n} [dir=\"rtl\"] .connection-modal_scratch-link-help-step_bWMuI {\n margin-right: 2.5rem;\n} .connection-modal_scratch-link-icon_dnIoA {\n max-width: 50px;\n} [dir=\"ltr\"] .connection-modal_help-step-image_h76rv {\n margin-right: 0.5rem;\n} [dir=\"rtl\"] .connection-modal_help-step-image_h76rv {\n margin-left: 0.5rem;\n} .connection-modal_help-step-number_2tyWJ {\n background: hsla(163, 85%, 40%, 1);\n border-radius: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n color: hsla(0, 100%, 100%, 1);\n font-weight: bold;\n min-width: 2rem;\n height: 2rem;\n} [dir=\"ltr\"] .connection-modal_help-step-number_2tyWJ {\n margin-right: 0.5rem;\n} [dir=\"rtl\"] .connection-modal_help-step-number_2tyWJ {\n margin-left: 0.5rem;\n} .connection-modal_button-row_2RA0A {\n font-weight: bolder;\n text-align: center;\n display: flex;\n} .connection-modal_abort-connecting-icon_1KMRE {\n width: 10px;\n transform: rotate(45deg);\n} .connection-modal_connection-button_1paxF {\n padding: 0.6rem 0.75rem;\n border-radius: 0.5rem;\n background: hsla(0, 100%, 65%, 1);\n color: white;\n font-weight: 600;\n font-size: 0.85rem;\n margin: 0.25rem;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n} .connection-modal_connection-button_1paxF:disabled {\n background: hsla(0, 100%, 65%, 0.35);\n} .connection-modal_segmented-button_XNf80 {\n display: flex;\n} .connection-modal_segmented-button_XNf80 .connection-modal_connection-button_1paxF:first-of-type {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n margin-right: 0;\n} .connection-modal_segmented-button_XNf80 .connection-modal_connection-button_1paxF:last-of-type {\n margin-left: 1px;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n} [dir=\"ltr\"] .connection-modal_button-icon-right_1CANn {\n margin-left: 0.5rem;\n} [dir=\"rtl\"] .connection-modal_button-icon-right_1CANn {\n margin-right: 0.5rem;\n} [dir=\"ltr\"] .connection-modal_button-icon-left_2Ys4V {\n margin-right: 0.5rem;\n} [dir=\"rtl\"] .connection-modal_button-icon-left_2Ys4V {\n margin-left: 0.5rem;\n} /* reverse back arrow icon for RTL, don't reverse other connection icons */ [dir=\"rtl\"] .connection-modal_button-icon-back_3voGy {\n transform: scaleX(-1);\n} .connection-modal_red-button_MpXr- {\n background: hsla(20, 100%, 55%, 1);\n} .connection-modal_corner-buttons_2ciJI {\n display: flex;\n justify-content: space-between;\n width: 100%;\n padding: 0 1rem;\n} .connection-modal_bottom-area_AHeQ3 {\n background-color: hsla(0, 100%, 100%, 1);\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: 1rem;\n padding-bottom: .75rem;\n padding-left: .75rem;\n padding-right: .75rem;\n} .connection-modal_bottom-area_AHeQ3 .connection-modal_bottom-area-item_YR2oh+.connection-modal_bottom-area-item_YR2oh {\n margin-top: 1rem;\n} .connection-modal_instructions_1CxAa {\n text-align: center;\n} .connection-modal_dots-row_39YWr {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n} .connection-modal_dots-holder_2kY6c {\n display: flex;\n padding: 0.25rem 0.1rem;\n border-radius: 1rem;\n background: hsla(0, 100%, 65%, 0.15);\n} .connection-modal_dots-holder-success_20EtT {\n background: hsla(163, 85%, 40%, 0.25);\n} .connection-modal_dots-holder-error_3iK2w {\n background: hsla(30, 100%, 55%, 0.25);\n} .connection-modal_dot_2GsnJ {\n width: 0.5rem;\n height: 0.5rem;\n margin: 0 0.3rem;\n border-radius: 100%;\n} .connection-modal_inactive-step-dot_1x6LP {\n background: hsla(0, 100%, 65%, 0.35);\n} .connection-modal_active-step-dot_yLC0o {\n background: hsla(0, 100%, 65%, 1);\n} .connection-modal_success-dot_30FlH {\n background: hsla(163, 85%, 40%, 1);\n} .connection-modal_error-dot_1NdiS {\n background: hsla(30, 100%, 55%, 1);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-content": "connection-modal_modal-content_2Xr41",
|
||
"modalContent": "connection-modal_modal-content_2Xr41",
|
||
"header": "connection-modal_header_3Sf5c",
|
||
"body": "connection-modal_body_3YO9j",
|
||
"label": "connection-modal_label_2ci_1",
|
||
"centered-row": "connection-modal_centered-row_LqTYH",
|
||
"centeredRow": "connection-modal_centered-row_LqTYH",
|
||
"peripheral-tile-pane": "connection-modal_peripheral-tile-pane_2pquH",
|
||
"peripheralTilePane": "connection-modal_peripheral-tile-pane_2pquH",
|
||
"peripheral-tile": "connection-modal_peripheral-tile_3IZvY",
|
||
"peripheralTile": "connection-modal_peripheral-tile_3IZvY",
|
||
"peripheral-tile-name": "connection-modal_peripheral-tile-name_3-1ov",
|
||
"peripheralTileName": "connection-modal_peripheral-tile-name_3-1ov",
|
||
"peripheral-tile-image": "connection-modal_peripheral-tile-image_2HAYt",
|
||
"peripheralTileImage": "connection-modal_peripheral-tile-image_2HAYt",
|
||
"peripheral-tile-name-wrapper": "connection-modal_peripheral-tile-name-wrapper_LIgB5",
|
||
"peripheralTileNameWrapper": "connection-modal_peripheral-tile-name-wrapper_LIgB5",
|
||
"peripheral-tile-name-label": "connection-modal_peripheral-tile-name-label_Mhn3z",
|
||
"peripheralTileNameLabel": "connection-modal_peripheral-tile-name-label_Mhn3z",
|
||
"peripheral-tile-name-text": "connection-modal_peripheral-tile-name-text_3Gqj9",
|
||
"peripheralTileNameText": "connection-modal_peripheral-tile-name-text_3Gqj9",
|
||
"signal-strength-meter": "connection-modal_signal-strength-meter_17QSz",
|
||
"signalStrengthMeter": "connection-modal_signal-strength-meter_17QSz",
|
||
"signal-bar": "connection-modal_signal-bar_3KRPL",
|
||
"signalBar": "connection-modal_signal-bar_3KRPL",
|
||
"green-bar": "connection-modal_green-bar_2DtgQ",
|
||
"greenBar": "connection-modal_green-bar_2DtgQ",
|
||
"radar-small": "connection-modal_radar-small_2Zlc3",
|
||
"radarSmall": "connection-modal_radar-small_2Zlc3",
|
||
"radar-big": "connection-modal_radar-big_1ZqZR",
|
||
"radarBig": "connection-modal_radar-big_1ZqZR",
|
||
"radar-spin": "connection-modal_radar-spin_XTY3A",
|
||
"radarSpin": "connection-modal_radar-spin_XTY3A",
|
||
"spin": "connection-modal_spin_2AmoW",
|
||
"radar": "connection-modal_radar_1q6t4",
|
||
"peripheral-activity": "connection-modal_peripheral-activity_1iEPn",
|
||
"peripheralActivity": "connection-modal_peripheral-activity_1iEPn",
|
||
"peripheral-activity-icon": "connection-modal_peripheral-activity-icon_2yzrQ",
|
||
"peripheralActivityIcon": "connection-modal_peripheral-activity-icon_2yzrQ",
|
||
"connection-tip-icon": "connection-modal_connection-tip-icon_1OYH1",
|
||
"connectionTipIcon": "connection-modal_connection-tip-icon_1OYH1",
|
||
"bluetooth-connecting-icon": "connection-modal_bluetooth-connecting-icon_2WC-p",
|
||
"bluetoothConnectingIcon": "connection-modal_bluetooth-connecting-icon_2WC-p",
|
||
"wiggle": "connection-modal_wiggle_3PIQs",
|
||
"bluetooth-connected-icon": "connection-modal_bluetooth-connected-icon_2z3Cp",
|
||
"bluetoothConnectedIcon": "connection-modal_bluetooth-connected-icon_2z3Cp",
|
||
"bluetooth-centered-icon": "connection-modal_bluetooth-centered-icon_2sUnm",
|
||
"bluetoothCenteredIcon": "connection-modal_bluetooth-centered-icon_2sUnm",
|
||
"peripheral-tile-widgets": "connection-modal_peripheral-tile-widgets_2czb9",
|
||
"peripheralTileWidgets": "connection-modal_peripheral-tile-widgets_2czb9",
|
||
"activityArea": "connection-modal_activityArea_2nx-Z",
|
||
"scratch-link-help": "connection-modal_scratch-link-help_1v8tL",
|
||
"scratchLinkHelp": "connection-modal_scratch-link-help_1v8tL",
|
||
"scratch-link-help-step": "connection-modal_scratch-link-help-step_bWMuI",
|
||
"scratchLinkHelpStep": "connection-modal_scratch-link-help-step_bWMuI",
|
||
"scratch-link-icon": "connection-modal_scratch-link-icon_dnIoA",
|
||
"scratchLinkIcon": "connection-modal_scratch-link-icon_dnIoA",
|
||
"help-step-image": "connection-modal_help-step-image_h76rv",
|
||
"helpStepImage": "connection-modal_help-step-image_h76rv",
|
||
"help-step-number": "connection-modal_help-step-number_2tyWJ",
|
||
"helpStepNumber": "connection-modal_help-step-number_2tyWJ",
|
||
"button-row": "connection-modal_button-row_2RA0A",
|
||
"buttonRow": "connection-modal_button-row_2RA0A",
|
||
"abort-connecting-icon": "connection-modal_abort-connecting-icon_1KMRE",
|
||
"abortConnectingIcon": "connection-modal_abort-connecting-icon_1KMRE",
|
||
"connection-button": "connection-modal_connection-button_1paxF",
|
||
"connectionButton": "connection-modal_connection-button_1paxF",
|
||
"segmented-button": "connection-modal_segmented-button_XNf80",
|
||
"segmentedButton": "connection-modal_segmented-button_XNf80",
|
||
"button-icon-right": "connection-modal_button-icon-right_1CANn",
|
||
"buttonIconRight": "connection-modal_button-icon-right_1CANn",
|
||
"button-icon-left": "connection-modal_button-icon-left_2Ys4V",
|
||
"buttonIconLeft": "connection-modal_button-icon-left_2Ys4V",
|
||
"button-icon-back": "connection-modal_button-icon-back_3voGy",
|
||
"buttonIconBack": "connection-modal_button-icon-back_3voGy",
|
||
"red-button": "connection-modal_red-button_MpXr-",
|
||
"redButton": "connection-modal_red-button_MpXr-",
|
||
"corner-buttons": "connection-modal_corner-buttons_2ciJI",
|
||
"cornerButtons": "connection-modal_corner-buttons_2ciJI",
|
||
"bottom-area": "connection-modal_bottom-area_AHeQ3",
|
||
"bottomArea": "connection-modal_bottom-area_AHeQ3",
|
||
"bottom-area-item": "connection-modal_bottom-area-item_YR2oh",
|
||
"bottomAreaItem": "connection-modal_bottom-area-item_YR2oh",
|
||
"instructions": "connection-modal_instructions_1CxAa",
|
||
"dots-row": "connection-modal_dots-row_39YWr",
|
||
"dotsRow": "connection-modal_dots-row_39YWr",
|
||
"dots-holder": "connection-modal_dots-holder_2kY6c",
|
||
"dotsHolder": "connection-modal_dots-holder_2kY6c",
|
||
"dots-holder-success": "connection-modal_dots-holder-success_20EtT",
|
||
"dotsHolderSuccess": "connection-modal_dots-holder-success_20EtT",
|
||
"dots-holder-error": "connection-modal_dots-holder-error_3iK2w",
|
||
"dotsHolderError": "connection-modal_dots-holder-error_3iK2w",
|
||
"dot": "connection-modal_dot_2GsnJ",
|
||
"inactive-step-dot": "connection-modal_inactive-step-dot_1x6LP",
|
||
"inactiveStepDot": "connection-modal_inactive-step-dot_1x6LP",
|
||
"active-step-dot": "connection-modal_active-step-dot_yLC0o",
|
||
"activeStepDot": "connection-modal_active-step-dot_yLC0o",
|
||
"success-dot": "connection-modal_success-dot_30FlH",
|
||
"successDot": "connection-modal_success-dot_30FlH",
|
||
"error-dot": "connection-modal_error-dot_1NdiS",
|
||
"errorDot": "connection-modal_error-dot_1NdiS",
|
||
"pulse-blue-ring": "connection-modal_pulse-blue-ring_Bst8a",
|
||
"pulseBlueRing": "connection-modal_pulse-blue-ring_Bst8a"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/context-menu/context-menu.css":
|
||
/*!*************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/context-menu/context-menu.css ***!
|
||
\*************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ /*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/ /* Toolbox z-index: 40; set in scratch-blocks */ /* tooltips should go over add buttons if they overlap */ /* monitors go over add buttons */ /* \"ask\" block text input goes above monitors */ /* menu-bar should go over monitors, alerts and tutorials */ /* tw: show below menu bar normally */ /* Block drag z-index: 1000; default 50 is overriden in blocks.css */ /* so it is draggable into other panes */ /* in most interfaces, the context menu is always on top */ .context-menu_context-menu_2SJM- {\n min-width: 130px;\n padding: 5px 0; /* The white strip at the top and bottom of the menu */\n margin: 2px 0 0; /* To keep the menu below the cursor comfortably */\n font-size: 0.85rem;\n text-align: left;\n background-color: hsla(0, 100%, 100%, 1);\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: calc(0.5rem / 2);\n box-shadow: 0px 0px 5px 1px hsla(0, 0%, 0%, 0.15);\n pointer-events: none;\n transition: opacity 0.2s ease;\n z-index: 10000;\n} [theme=\"dark\"] .context-menu_context-menu_2SJM- {\n background-color: var(--ui-primary, hsla(215, 100%, 95%, 1));\n} .context-menu_menu-item_3cioN {\n padding: 8px 12px;\n white-space: nowrap;\n cursor: pointer;\n transition: 0.1s ease;\n} .context-menu_menu-item_3cioN:hover {\n background: hsla(0, 100%, 65%, 1);\n color: white;\n} .context-menu_menu-item-bordered_29CJG {\n border-top: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n} [theme=\"dark\"] .context-menu_menu-item-bordered_29CJG {\n border-color: var(--ui-tertiary, hsla(215, 50%, 90%, 1));\n} .context-menu_menu-item-danger_1tJg0:hover {\n background: hsla(30, 100%, 55%, 1);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"context-menu": "context-menu_context-menu_2SJM-",
|
||
"contextMenu": "context-menu_context-menu_2SJM-",
|
||
"menu-item": "context-menu_menu-item_3cioN",
|
||
"menuItem": "context-menu_menu-item_3cioN",
|
||
"menu-item-bordered": "context-menu_menu-item-bordered_29CJG",
|
||
"menuItemBordered": "context-menu_menu-item-bordered_29CJG",
|
||
"menu-item-danger": "context-menu_menu-item-danger_1tJg0",
|
||
"menuItemDanger": "context-menu_menu-item-danger_1tJg0"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/controls/controls.css":
|
||
/*!*****************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/controls/controls.css ***!
|
||
\*****************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, ".controls_controls-container_2xinB {\n display: flex;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"controls-container": "controls_controls-container_2xinB",
|
||
"controlsContainer": "controls_controls-container_2xinB"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/crash-message/crash-message.css":
|
||
/*!***************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/crash-message/crash-message.css ***!
|
||
\***************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ body {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n} h2 {\n font-size: 1.5rem;\n font-weight: bold;\n} p {\n font-size: 1rem;\n line-height: 1.5em;\n} .crash-message_crash-wrapper_25B61 {\n background-color: hsla(0, 100%, 65%, 1);\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n} [theme=\"dark\"] .crash-message_crash-wrapper_25B61 {\n background-color: #333;\n} .crash-message_body_1q0lu {\n width: 50%;\n color: white;\n text-align: center;\n} .crash-message_reloadButton_FoS7x {\n border: 1px solid hsla(0, 100%, 65%, 1);\n border-radius: 0.25rem;\n padding: 0.5rem 2rem;\n background: white;\n color: hsla(0, 100%, 65%, 1);\n font-weight: bold;\n font-size: 0.875rem;\n cursor: pointer;\n} .crash-message_header_1tEXc {\n font-size: 1.5em;\n font-weight: bold;\n} .crash-message_error-message_1pX4X {\n font-family: monospace;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"crash-wrapper": "crash-message_crash-wrapper_25B61",
|
||
"crashWrapper": "crash-message_crash-wrapper_25B61",
|
||
"body": "crash-message_body_1q0lu",
|
||
"reloadButton": "crash-message_reloadButton_FoS7x",
|
||
"header": "crash-message_header_1tEXc",
|
||
"error-message": "crash-message_error-message_1pX4X",
|
||
"errorMessage": "crash-message_error-message_1pX4X"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/custom-procedures/custom-procedures.css":
|
||
/*!***********************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/custom-procedures/custom-procedures.css ***!
|
||
\***********************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ .custom-procedures_modal-content_Zjko5 {\n width: 700px;\n margin: 50px auto; /* This modal is taller than most, reduce top margin */\n} .custom-procedures_body_SQBv6 {\n background: hsla(0, 100%, 100%, 1);\n padding: 1.5rem 2.25rem;\n} [theme=\"dark\"] .custom-procedures_body_SQBv6 {\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n background: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n} .custom-procedures_body_SQBv6 input[type=\"checkbox\"],\n.custom-procedures_body_SQBv6 input[type=\"radio\"] {\n margin: 3px;\n} /* Blocks workspace for custom procedure declaration editor */ .custom-procedures_workspace_1d2uW {\n min-height: 200px;\n position: relative;\n} .custom-procedures_workspace_1d2uW .injectionDiv{\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n} .custom-procedures_workspace_1d2uW .blocklySvg {\n background-color: var(--ui-primary, hsla(215, 100%, 95%, 1));\n} /* Row of \"card\" buttons for modifying custom procedures */ .custom-procedures_options-row_1PqLE {\n display: flex;\n justify-content: space-between;\n} .custom-procedures_option-card_BtHt3 {\n background: white;\n border: 2px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 0.5rem;\n padding: calc(0.5rem * 2);\n text-align: center;\n flex-grow: 1;\n cursor: pointer;\n transition: all 0.2s;\n flex-basis: 100px;\n} [theme=\"dark\"] .custom-procedures_option-card_BtHt3 {\n background: var(--ui-tertiary, hsla(215, 50%, 90%, 1));\n} .custom-procedures_option-card_BtHt3:hover {\n border: 2px solid hsla(0, 100%, 65%, 1);\n box-shadow: 0px 0px 0px 4px hsla(0, 100%, 65%, 0.35);\n} .custom-procedures_option-card_BtHt3 + .custom-procedures_option-card_BtHt3 {\n margin-left: 1rem;\n} .custom-procedures_option-icon_2y7hh {\n max-height: 48px;\n margin-bottom: 0.5rem;\n} .custom-procedures_option-title_3v6va {\n font-weight: bold;\n} /* \"Run without screen refresh\" row */ .custom-procedures_checkbox-row_rPP8j {\n margin-top: 1rem;\n} /* Confirmation buttons at the bottom of the modal */ .custom-procedures_button-row_2jBu3 {\n margin-top: 1rem;\n font-weight: bolder;\n text-align: right;\n} .custom-procedures_button-row_2jBu3 button {\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 0.25rem;\n padding: 0.75rem 1rem;\n background: white;\n font-weight: bold;\n font-size: 0.85rem;\n} .custom-procedures_button-row_2jBu3 button.custom-procedures_ok-button_2X0Vj {\n background: hsla(0, 100%, 65%, 1);\n border: hsla(0, 100%, 65%, 1);\n color: white;\n} [dir=\"ltr\"] .custom-procedures_button-row_2jBu3 button + button {\n margin-left: 0.5rem;\n} [dir=\"rtl\"] .custom-procedures_button-row_2jBu3 button + button {\n margin-right: 0.5rem;\n} .custom-procedures_cancel-button_wlEX9 {\n color: black;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-content": "custom-procedures_modal-content_Zjko5",
|
||
"modalContent": "custom-procedures_modal-content_Zjko5",
|
||
"body": "custom-procedures_body_SQBv6",
|
||
"workspace": "custom-procedures_workspace_1d2uW",
|
||
"options-row": "custom-procedures_options-row_1PqLE",
|
||
"optionsRow": "custom-procedures_options-row_1PqLE",
|
||
"option-card": "custom-procedures_option-card_BtHt3",
|
||
"optionCard": "custom-procedures_option-card_BtHt3",
|
||
"option-icon": "custom-procedures_option-icon_2y7hh",
|
||
"optionIcon": "custom-procedures_option-icon_2y7hh",
|
||
"option-title": "custom-procedures_option-title_3v6va",
|
||
"optionTitle": "custom-procedures_option-title_3v6va",
|
||
"checkbox-row": "custom-procedures_checkbox-row_rPP8j",
|
||
"checkboxRow": "custom-procedures_checkbox-row_rPP8j",
|
||
"button-row": "custom-procedures_button-row_2jBu3",
|
||
"buttonRow": "custom-procedures_button-row_2jBu3",
|
||
"ok-button": "custom-procedures_ok-button_2X0Vj",
|
||
"okButton": "custom-procedures_ok-button_2X0Vj",
|
||
"cancel-button": "custom-procedures_cancel-button_wlEX9",
|
||
"cancelButton": "custom-procedures_cancel-button_wlEX9"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/delete-button/delete-button.css":
|
||
/*!***************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/delete-button/delete-button.css ***!
|
||
\***************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ /* wrapper to allow for touch slop if we decide to add it */ .delete-button_delete-button_2Nzko {\n display: flex;\n align-items: center;\n justify-content: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: pointer;\n transition: all 0.15s ease-out;\n} .delete-button_delete-button-visible_kym6v {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden; /* Mask the icon animation */\n width: 1.75rem;\n height: 1.75rem;\n box-shadow: 0px 0px 0px 2px hsla(0, 100%, 65%, 0.35);\n background-color: hsla(0, 100%, 65%, 1);\n color: hsla(0, 100%, 100%, 1);\n border-radius: 50%;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: pointer;\n transition: all 0.15s ease-out;\n} .delete-button_delete-icon_3b8wH {\n position: relative;\n margin: 0.25rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n transform-origin: 50%;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"delete-button": "delete-button_delete-button_2Nzko",
|
||
"deleteButton": "delete-button_delete-button_2Nzko",
|
||
"delete-button-visible": "delete-button_delete-button-visible_kym6v",
|
||
"deleteButtonVisible": "delete-button_delete-button-visible_kym6v",
|
||
"delete-icon": "delete-button_delete-icon_3b8wH",
|
||
"deleteIcon": "delete-button_delete-icon_3b8wH"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/direction-picker/dial.css":
|
||
/*!*********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/direction-picker/dial.css ***!
|
||
\*********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .dial_container_3hox- {\n padding: 1rem;\n display: flex;\n justify-content: center;\n align-items: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n} .dial_dial-container_ktOnA {\n position: relative;\n} .dial_dial-face_3NuSA, .dial_dial-handle_1tfZT, .dial_gauge_3g5NZ {\n position: absolute;\n top: 0;\n left: 0;\n overflow: visible;\n} .dial_dial-face_3NuSA {\n width: 100%;\n} .dial_dial-handle_1tfZT {\n cursor: pointer;\n width: 40px;\n height: 40px;\n /* Use margin to make positioning via top/left easier */\n margin-left: calc(40px / -2);\n margin-top: calc(40px / -2);\n} .dial_gauge-path_1WoJ6 {\n fill: hsla(0, 100%, 65%, 0.35);\n stroke: hsla(0, 100%, 65%, 1);\n stroke-width: 1px;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"container": "dial_container_3hox-",
|
||
"dial-container": "dial_dial-container_ktOnA",
|
||
"dialContainer": "dial_dial-container_ktOnA",
|
||
"dial-face": "dial_dial-face_3NuSA",
|
||
"dialFace": "dial_dial-face_3NuSA",
|
||
"dial-handle": "dial_dial-handle_1tfZT",
|
||
"dialHandle": "dial_dial-handle_1tfZT",
|
||
"gauge": "dial_gauge_3g5NZ",
|
||
"gauge-path": "dial_gauge-path_1WoJ6",
|
||
"gaugePath": "dial_gauge-path_1WoJ6"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/direction-picker/direction-picker.css":
|
||
/*!*********************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/direction-picker/direction-picker.css ***!
|
||
\*********************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* Copied from scratch-paint color-picker.css. */ .Popover-body {\n background: white;\n border: 1px solid #ddd;\n padding: 4px;\n border-radius: 4px;\n padding: 4px;\n box-shadow: 0px 0px 8px 1px rgba(0, 0, 0, .3);\n} .Popover-tipShape {\n fill: white;\n stroke: #ddd;\n} .direction-picker_button-row_1DF8U {\n display: flex;\n flex-direction: row;\n justify-content: center;\n\n} .direction-picker_icon-button_1y9Rd {\n margin: 0.25rem;\n border: none;\n background: none;\n outline: none;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n} .direction-picker_icon-button_1y9Rd:active > img {\n width: 20px;\n height: 20px;\n transform: scale(1.15);\n} .direction-picker_icon-button_1y9Rd > img {\n transition: transform 0.1s;\n filter: grayscale(100%);\n} .direction-picker_icon-button_1y9Rd.direction-picker_active_10_kJ > img {\n filter: none;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"button-row": "direction-picker_button-row_1DF8U",
|
||
"buttonRow": "direction-picker_button-row_1DF8U",
|
||
"icon-button": "direction-picker_icon-button_1y9Rd",
|
||
"iconButton": "direction-picker_icon-button_1y9Rd",
|
||
"active": "direction-picker_active_10_kJ"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/divider/divider.css":
|
||
/*!***************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/divider/divider.css ***!
|
||
\***************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .divider_divider_1_Adi {\n border-right: 1px dashed var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"divider": "divider_divider_1_Adi"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/drag-layer/drag-layer.css":
|
||
/*!*********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/drag-layer/drag-layer.css ***!
|
||
\*********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n/*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/\n\n/* Toolbox z-index: 40; set in scratch-blocks */\n\n/* tooltips should go over add buttons if they overlap */\n\n/* monitors go over add buttons */\n\n/* \"ask\" block text input goes above monitors */\n\n/* menu-bar should go over monitors, alerts and tutorials */\n\n/* tw: show below menu bar normally */\n\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\n\n/* so it is draggable into other panes */\n\n/* in most interfaces, the context menu is always on top */\n\n.drag-layer_drag-layer_3Xec- {\n position: fixed;\n pointer-events: none;\n z-index: 1000;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n direction: ltr;\n}\n\n.drag-layer_image-wrapper_2iRP3 {\n /* Absolute allows wrapper to snuggly fit image */\n position: absolute;\n}\n\n.drag-layer_image_1inbS {\n max-width: 80px;\n max-height: 80px;\n min-width: 50px;\n min-height: 50px;\n\n /* Center the dragging image on the given position */\n margin-left: -50%;\n margin-top: -50%;\n\n padding: 0.25rem;\n border: 2px solid hsla(0, 100%, 65%, 1);\n background: hsla(0, 100%, 100%, 1);\n border-radius: 0.5rem;\n\n /* Use the same drop shadow as stage dragging */\n box-shadow: 5px 5px 5px hsla(0, 0%, 0%, 0.15);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"drag-layer": "drag-layer_drag-layer_3Xec-",
|
||
"dragLayer": "drag-layer_drag-layer_3Xec-",
|
||
"image-wrapper": "drag-layer_image-wrapper_2iRP3",
|
||
"imageWrapper": "drag-layer_image-wrapper_2iRP3",
|
||
"image": "drag-layer_image_1inbS"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/filter/filter.css":
|
||
/*!*************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/filter/filter.css ***!
|
||
\*************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n.filter_filter_1JFal {\n display: flex;\n flex-direction: row;\n align-items: center;\n flex-grow: 1;\n\n background: hsla(0, 100%, 100%, 1);\n border-radius: 10rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n height: 2.5rem;\n\n position: relative;\n}\n\n[theme=\"dark\"] .filter_filter_1JFal {\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n}\n\n.filter_filter-icon_3Pfaw {\n position: absolute;\n top: 0;\n\n height: 1rem;\n width: 1rem;\n}\n\n[dir=\"ltr\"] .filter_filter-icon_3Pfaw {\n left: 0;\n margin: 0.75rem 0.75rem 0.75rem 1rem;\n}\n\n[dir=\"rtl\"] .filter_filter-icon_3Pfaw {\n right: 0;\n margin: 0.75rem 1rem 0.75rem 0.75rem;\n transform: scaleX(-1);\n}\n\n.filter_filter_1JFal:focus-within {\n box-shadow: 0 0 0 .25rem hsla(0, 100%, 65%, 0.35);\n}\n\n/*\n Hidden state\n*/\n\n.filter_x-icon-wrapper_1rP2w {\n opacity: 0;\n position: absolute;\n top: 0;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n overflow: hidden; /* Mask the icon animation */\n height: 1.25rem;\n width: 1.25rem;\n margin: 0.625rem;\n\n border-radius: 50%;\n pointer-events: none;\n cursor: default;\n transition: opacity 0.05s linear;\n}\n\n[dir=\"ltr\"] .filter_x-icon-wrapper_1rP2w {\n right: 0;\n}\n\n[dir=\"rtl\"] .filter_x-icon-wrapper_1rP2w {\n left: 0;\n}\n\n/*\n Shown state\n*/\n\n.filter_filter_1JFal.filter_is-active_3PvfA .filter_x-icon-wrapper_1rP2w {\n pointer-events: auto;\n cursor: pointer;\n opacity: 1;\n transition: opacity 0.05s linear;\n}\n\n.filter_filter_1JFal.filter_is-active_3PvfA .filter_x-icon-wrapper_1rP2w:hover {\n transform: scale(1.2, 1.2);\n}\n\n/*\n Hidden state\n*/\n\n.filter_x-icon_zjpOg {\n position: relative;\n margin: 0.25rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n transform: translateX(0.5rem);\n transition: transform 0.085s cubic-bezier(0.78, 1, 1, 1);\n}\n\n/*\n Shown state\n*/\n\n.filter_filter_1JFal.filter_is-active_3PvfA .filter_x-icon-wrapper_1rP2w .filter_x-icon_zjpOg {\n transform: translateX(0);\n}\n\n.filter_filter-input_1iiEt {\n flex-grow: 1;\n height: 2.5rem;\n background-color: transparent;\n -webkit-appearance: none;\n outline: none;\n border: 0;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n font-size: 0.75rem;\n letter-spacing: 0.15px;\n cursor: text;\n}\n\n[dir=\"ltr\"] .filter_filter-input_1iiEt {\n padding: .625rem 2rem .625rem 3rem;\n}\n\n[dir=\"rtl\"] .filter_filter-input_1iiEt {\n padding: .625rem 3rem .625rem 2rem;\n}\n\n.filter_filter-input_1iiEt::-ms-input-placeholder {\n opacity: .5;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n font-size: 0.875rem;\n letter-spacing: 0.15px;\n}\n\n.filter_filter-input_1iiEt::placeholder {\n opacity: .5;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n font-size: 0.875rem;\n letter-spacing: 0.15px;\n}\n\n[dir=\"ltr\"] .filter_filter-input_1iiEt::-ms-input-placeholder {\n padding: 0 0 0 0.25rem;\n}\n\n[dir=\"ltr\"] .filter_filter-input_1iiEt::placeholder {\n padding: 0 0 0 0.25rem;\n}\n\n[dir=\"rtl\"] .filter_filter-input_1iiEt::-ms-input-placeholder {\n padding: 0 0.25rem 0 0;\n}\n\n[dir=\"rtl\"] .filter_filter-input_1iiEt::placeholder {\n padding: 0 0.25rem 0 0;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"filter": "filter_filter_1JFal",
|
||
"filter-icon": "filter_filter-icon_3Pfaw",
|
||
"filterIcon": "filter_filter-icon_3Pfaw",
|
||
"x-icon-wrapper": "filter_x-icon-wrapper_1rP2w",
|
||
"xIconWrapper": "filter_x-icon-wrapper_1rP2w",
|
||
"is-active": "filter_is-active_3PvfA",
|
||
"isActive": "filter_is-active_3PvfA",
|
||
"x-icon": "filter_x-icon_zjpOg",
|
||
"xIcon": "filter_x-icon_zjpOg",
|
||
"filter-input": "filter_filter-input_1iiEt",
|
||
"filterInput": "filter_filter-input_1iiEt"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/forms/input.css":
|
||
/*!***********************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/forms/input.css ***!
|
||
\***********************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n.input_input-form_l9eYg {\n height: 2rem;\n padding: 0 0.75rem;\n\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 0.625rem;\n font-weight: bold;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n\n border-width: 1px;\n border-style: solid;\n border-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 2rem;\n\n outline: none;\n cursor: text;\n transition: 0.25s ease-out; /* @todo: standardize with var */\n box-shadow: none;\n\n /*\n For truncating overflowing text gracefully\n Min-width is for a bug: https://css-tricks.com/flexbox-truncated-text\n @todo: move this out into a mixin or a helper component\n */\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n\n[theme=\"dark\"] .input_input-form_l9eYg {\n background-color: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n}\n\n.input_input-form_l9eYg:hover {\n border-color: hsla(0, 100%, 65%, 1);\n}\n\n[theme=\"dark\"] .input_input-form_l9eYg:hover {\n border-color: #333;\n}\n\n.input_input-form_l9eYg:focus {\n border-color: hsla(0, 100%, 65%, 1);\n box-shadow: 0 0 0 0.25rem hsla(0, 100%, 65%, 0.35);\n}\n\n[theme=\"dark\"] .input_input-form_l9eYg:focus {\n border-color: #333;\n}\n\n.input_input-small_2qj1C {\n width: 3rem;\n padding: 0 0.5rem;\n text-overflow: clip;\n text-align: center;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"input-form": "input_input-form_l9eYg",
|
||
"inputForm": "input_input-form_l9eYg",
|
||
"input-small": "input_input-small_2qj1C",
|
||
"inputSmall": "input_input-small_2qj1C"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/forms/label.css":
|
||
/*!***********************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/forms/label.css ***!
|
||
\***********************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n.label_input-group_2vTky {\n display: inline-flex;\n flex-direction: row;\n align-items: center;\n}\n\n.label_input-group-column_22FuU {\n display: inline-flex;\n flex-direction: column;\n align-items: flex-start;\n}\n\n.label_input-group-column_22FuU span {\n margin-bottom: .25rem;\n}\n\n.label_input-label_3KjCa, .label_input-label-secondary_3QDNV {\n font-size: 0.625rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: default;\n\n white-space: nowrap;\n}\n\n[dir=\"ltr\"] .label_input-label_3KjCa, [dir=\"ltr\"] .label_input-label-secondary_3QDNV {\n margin-right: .5rem;\n}\n\n[dir=\"rtl\"] .label_input-label_3KjCa, [dir=\"rtl\"] .label_input-label-secondary_3QDNV {\n margin-left: .5rem;\n}\n\n.label_input-label_3KjCa {\n font-weight: bold;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"input-group": "label_input-group_2vTky",
|
||
"inputGroup": "label_input-group_2vTky",
|
||
"input-group-column": "label_input-group-column_22FuU",
|
||
"inputGroupColumn": "label_input-group-column_22FuU",
|
||
"input-label": "label_input-label_3KjCa",
|
||
"inputLabel": "label_input-label_3KjCa",
|
||
"input-label-secondary": "label_input-label-secondary_3QDNV",
|
||
"inputLabelSecondary": "label_input-label-secondary_3QDNV"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/green-flag/green-flag.css":
|
||
/*!*********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/green-flag/green-flag.css ***!
|
||
\*********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .green-flag_green-flag_1kiAo {\n width: 2rem;\n height: 2rem;\n padding: 0.375rem;\n border-radius: 0.25rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n user-drag: none;\n cursor: pointer;\n} .green-flag_green-flag_1kiAo:hover {\n background-color: hsla(0, 100%, 65%, 0.15);\n} .green-flag_green-flag_1kiAo.green-flag_is-active_2oExT {\n background-color: hsla(0, 100%, 65%, 0.35);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"green-flag": "green-flag_green-flag_1kiAo",
|
||
"greenFlag": "green-flag_green-flag_1kiAo",
|
||
"is-active": "green-flag_is-active_2oExT",
|
||
"isActive": "green-flag_is-active_2oExT"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/gui/gui.css":
|
||
/*!*******************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/gui/gui.css ***!
|
||
\*******************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n/*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/\n\n/* Toolbox z-index: 40; set in scratch-blocks */\n\n/* tooltips should go over add buttons if they overlap */\n\n/* monitors go over add buttons */\n\n/* \"ask\" block text input goes above monitors */\n\n/* menu-bar should go over monitors, alerts and tutorials */\n\n/* tw: show below menu bar normally */\n\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\n\n/* so it is draggable into other panes */\n\n/* in most interfaces, the context menu is always on top */\n\n.gui_page-wrapper_1cgy0 {\n height: 100%;\n}\n\n.gui_body-wrapper_-N0sA {\n height: calc(100% - 3rem);\n background-color: var(--ui-primary, hsla(215, 100%, 95%, 1));\n}\n\n.gui_body-wrapper_-N0sA * {\n box-sizing: border-box;\n}\n\n.gui_flex-wrapper_uXHkj {\n display: flex;\n\n /*\n Make 2 columns:\n a) for the blocks + workspace panes, and\n b) for combined stage menu + stage + sprite/stage selectors\n */\n flex-direction: row;\n height: 100%;\n\n /*\n Stop scrollbar popping in and out from scratch-blocks border issue\n https://github.com/LLK/scratch-gui/issues/318\n */\n overflow: hidden;\n}\n\n.gui_editor-wrapper_2DYcj {\n /*\n This is carefully balanced-- the minimum width at which the GUI will be displayed is 1024px.\n At that size, the stage pane is 408px wide, with $space of padding to each side.\n However, we must also add the border width to the stage pane. All-in-all, the stage pane's final width is\n 408px + ($space + $stage-standard-border-width * 2) (one border & padding per left/right side).\n\n @todo This is in place to prevent \"doubling up\" of horizontal scrollbars in narrow windows, but there are likely\n much better ways to solve that (e.g. undo #2124, remove this flex-basis entirely). However, they run their own\n risks of breaking things, so let's just leave this as-is for the time being.\n */\n flex-basis: calc(1024px - 408px - ((0.5rem + 0.0625rem) * 2));\n flex-grow: 1;\n flex-shrink: 0;\n position: relative;\n\n display: flex;\n flex-direction: column;\n}\n\n.gui_tab-list_87TYM {\n height: 2.75rem;\n width: 250px; /* Match width of the toolbox */\n display: flex;\n align-items: flex-end;\n flex-shrink: 0;\n\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-weight: 500;\n font-size: 0.80rem;\n\n /* Overrides for react-tabs styling */\n margin: 0 !important;\n border-bottom: 0 !important;\n}\n\n.gui_tab_27Unf {\n flex-grow: 1;\n height: 80%;\n margin-bottom: 0;\n\n border-radius: 1rem 1rem 0 0;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n\n padding: 0.125rem 1.25rem 0;\n font-size: 0.75rem;\n\n background-color: var(--ui-tertiary, hsla(215, 50%, 90%, 1));\n color: hsla(225, 15%, 40%, 0.75);\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n -webkit-user-select: none;\n\n -moz-user-select: none;\n\n -ms-user-select: none;\n\n user-select: none;\n white-space: nowrap;\n}\n\n[theme=\"dark\"] .gui_tab_27Unf {\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n}\n\n[dir=\"ltr\"] .gui_tab_27Unf {\n margin-left: -0.5rem;\n}\n\n[dir=\"rtl\"] .gui_tab_27Unf {\n margin-right: -0.5rem;\n}\n\n[dir=\"ltr\"] .gui_tab_27Unf:nth-of-type(1) {\n margin-left: 0;\n}\n\n[dir=\"rtl\"] .gui_tab_27Unf:nth-of-type(1) {\n margin-right: 0;\n}\n\n/* Use z-indices to force left-on-top for tabs */\n\n.gui_tab_27Unf:nth-of-type(1) {\n z-index: 3;\n}\n\n.gui_tab_27Unf:nth-of-type(2) {\n z-index: 2;\n}\n\n.gui_tab_27Unf:nth-of-type(3) {\n z-index: 1;\n}\n\n.gui_tab_27Unf:hover {\n background-color: var(--ui-primary, hsla(215, 100%, 95%, 1));\n}\n\n[theme=\"dark\"] .gui_tab_27Unf:hover {\n background-color: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n}\n\n.gui_tab_27Unf.gui_is-selected_sHAiu {\n height: 90%;\n color: hsla(0, 100%, 65%, 1);\n background-color: hsla(0, 100%, 100%, 1);\n z-index: 4; /* Make sure selected is always above */\n}\n\n[theme=\"dark\"] .gui_tab_27Unf.gui_is-selected_sHAiu {\n background-color: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n}\n\n.gui_tab_27Unf img {\n width: 1.375rem;\n filter: grayscale(100%);\n}\n\n[dir=\"ltr\"] .gui_tab_27Unf img {\n margin-right: 0.125rem;\n}\n\n[dir=\"rtl\"] .gui_tab_27Unf img {\n margin-left: 0.125rem;\n}\n\n/* mirror blocks and sound tab icons */\n\n[dir=\"rtl\"] .gui_tab_27Unf:nth-of-type(1) img {\n transform: scaleX(-1);\n}\n\n[dir=\"rtl\"] .gui_tab_27Unf:nth-of-type(3) img {\n transform: scaleX(-1);\n}\n\n.gui_tab_27Unf.gui_is-selected_sHAiu img {\n filter: none;\n}\n\n/* Tab style overrides from react-tabs */\n\n.gui_tab_27Unf.gui_is-selected_sHAiu:after {\n display: none;\n}\n\n.gui_tab_27Unf.gui_is-selected_sHAiu:focus {\n outline: none;\n box-shadow: none;\n border-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n\n.gui_tab_27Unf.gui_is-selected_sHAiu:focus:after {\n display: none;\n}\n\n/* Body of the tabs */\n\n.gui_tabs_AgmuP {\n position: relative;\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n}\n\n.gui_tab-panel_22sLx {\n position: relative;\n flex-grow: 1;\n display: none;\n}\n\n.gui_tab-panel_22sLx.gui_is-selected_sHAiu {\n display: flex;\n}\n\n.gui_blocks-wrapper_1ccgf {\n flex-grow: 1;\n position: relative;\n}\n\n.gui_stage-and-target-wrapper_69KBf {\n /*\n Makes rows for children:\n 1) stage menu\n 2) stage\n 3) sprite/stage selectors\n Only reason we need this, is so .targetWrapper, which holds the selectors,\n goes to full vertical height of the window\n */\n display: flex;\n flex-direction: column;\n /* pad entire wrapper to the left and right; allow children to fill width */\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n\n /* this will only ever be as wide as the stage */\n flex-basis: 0;\n}\n\n.gui_target-wrapper_36Gbz {\n display: flex;\n flex-grow: 1;\n flex-basis: 0;\n\n padding-top: 0.5rem;\n min-height: 0; /* this makes it work in Firefox */\n\n /*\n For making the sprite-selector a scrollable pane\n @todo: Not working in Safari\n */\n /* TODO this also breaks the thermometer menu */\n /* overflow: hidden; */\n}\n\n.gui_extension-button-container_b4rCs {\n width: 3.75rem;\n height: 3.25rem;\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 42;\n background: hsla(0, 100%, 65%, 1);\n\n border: 1px solid hsla(0, 100%, 65%, 1);\n box-sizing: content-box; /* To match scratch-block vertical toolbox borders */\n}\n\n.gui_extension-button-container_b4rCs:before {\n content: \"\";\n position: absolute;\n top: calc(calc(-1 * 15px) - 1px);\n left: -1px;\n background: linear-gradient(rgba(0, 0, 0, 0),rgba(0, 0, 0, 0.15));\n height: 15px;\n width: calc(100% + 0.5px);\n}\n\n.gui_extension-button_2T7PA {\n background: none;\n border: none;\n outline: none;\n width: 100%;\n height: 100%;\n cursor: pointer;\n}\n\n.gui_extension-button-icon_S4gDk {\n width: 1.75rem;\n height: 1.75rem;\n}\n\n[dir=\"rtl\"] .gui_extension-button-icon_S4gDk {\n transform: scaleX(-1);\n}\n\n.gui_extension-button_2T7PA > div {\n margin-top: 0;\n}\n\n/* Sprite Selection Watermark */\n\n.gui_watermark_3vBYb {\n position: absolute;\n top: 1.25rem;\n pointer-events: none;\n}\n\n[dir=\"ltr\"] .gui_watermark_3vBYb {\n right: 1.25rem;\n}\n\n[dir=\"rtl\"] .gui_watermark_3vBYb {\n left: 1.25rem;\n}\n\n/* Menu */\n\n.gui_menu-bar-position_3U1T0 {\n position: relative;\n z-index: 491;\n}\n\n/* Alerts */\n\n.gui_alerts-container_15BWp {\n display: flex;\n justify-content: center;\n width: 100%;\n z-index: 490;\n position: absolute;\n margin-top: 53px;\n pointer-events: none;\n}\n\n/*\n Make the (background) page not scrollable when modals are open\n This CSS class is automatically added to the body when react-modal is open\n*/\n\n.ReactModal__Body--open {\n overflow: hidden;\n}\n\n/* tw: tw: when window is fullscreen, put a solid white background behind the stage */\n\n.gui_fullscreen-background_3g8mV {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n /* if the user-specified background color can't be understood by the browser, default to white */\n background-color: white;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"page-wrapper": "gui_page-wrapper_1cgy0",
|
||
"pageWrapper": "gui_page-wrapper_1cgy0",
|
||
"body-wrapper": "gui_body-wrapper_-N0sA",
|
||
"bodyWrapper": "gui_body-wrapper_-N0sA",
|
||
"flex-wrapper": "gui_flex-wrapper_uXHkj",
|
||
"flexWrapper": "gui_flex-wrapper_uXHkj",
|
||
"editor-wrapper": "gui_editor-wrapper_2DYcj",
|
||
"editorWrapper": "gui_editor-wrapper_2DYcj",
|
||
"tab-list": "gui_tab-list_87TYM",
|
||
"tabList": "gui_tab-list_87TYM",
|
||
"tab": "gui_tab_27Unf",
|
||
"is-selected": "gui_is-selected_sHAiu",
|
||
"isSelected": "gui_is-selected_sHAiu",
|
||
"tabs": "gui_tabs_AgmuP",
|
||
"tab-panel": "gui_tab-panel_22sLx",
|
||
"tabPanel": "gui_tab-panel_22sLx",
|
||
"blocks-wrapper": "gui_blocks-wrapper_1ccgf",
|
||
"blocksWrapper": "gui_blocks-wrapper_1ccgf",
|
||
"stage-and-target-wrapper": "gui_stage-and-target-wrapper_69KBf",
|
||
"stageAndTargetWrapper": "gui_stage-and-target-wrapper_69KBf",
|
||
"target-wrapper": "gui_target-wrapper_36Gbz",
|
||
"targetWrapper": "gui_target-wrapper_36Gbz",
|
||
"extension-button-container": "gui_extension-button-container_b4rCs",
|
||
"extensionButtonContainer": "gui_extension-button-container_b4rCs",
|
||
"extension-button": "gui_extension-button_2T7PA",
|
||
"extensionButton": "gui_extension-button_2T7PA",
|
||
"extension-button-icon": "gui_extension-button-icon_S4gDk",
|
||
"extensionButtonIcon": "gui_extension-button-icon_S4gDk",
|
||
"watermark": "gui_watermark_3vBYb",
|
||
"menu-bar-position": "gui_menu-bar-position_3U1T0",
|
||
"menuBarPosition": "gui_menu-bar-position_3U1T0",
|
||
"alerts-container": "gui_alerts-container_15BWp",
|
||
"alertsContainer": "gui_alerts-container_15BWp",
|
||
"fullscreen-background": "gui_fullscreen-background_3g8mV",
|
||
"fullscreenBackground": "gui_fullscreen-background_3g8mV"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/icon-button/icon-button.css":
|
||
/*!***********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/icon-button/icon-button.css ***!
|
||
\***********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .icon-button_container_278u5 {\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n font-size: 0.75rem;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n color: hsla(0, 100%, 65%, 1);\n border-radius: 0.5rem;\n} .icon-button_container_278u5 + .icon-button_container_278u5 {\n margin-top: 1.25rem;\n} .icon-button_title_36ChS {\n margin-top: 0.5rem;\n text-align: center;\n} .icon-button_disabled_2HD_J {\n opacity: 0.5;\n pointer-events: none;\n} .icon-button_container_278u5:active {\n background-color: hsla(0, 100%, 65%, 0.15);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"container": "icon-button_container_278u5",
|
||
"title": "icon-button_title_36ChS",
|
||
"disabled": "icon-button_disabled_2HD_J"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/language-selector/language-selector.css":
|
||
/*!***********************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/language-selector/language-selector.css ***!
|
||
\***********************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ /* Position the language select over the language icon, and make it transparent */ .language-selector_language-select_8Vfnm {\n position: absolute;\n width: 3rem;\n height: 3rem;\n opacity: 0;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: .875rem;\n color: hsla(225, 15%, 40%, 1);\n background: hsla(0, 100%, 100%, 1);\n} [theme=\"dark\"] .language-selector_language-select_8Vfnm {\n color: hsla(0, 100%, 100%, 1);\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n} [dir=\"ltr\"] .language-selector_language-select_8Vfnm {\n right: 0;\n} [dir=\"rtl\"] .language-selector_language-select_8Vfnm {\n left: 0;\n} .language-selector_language-select_8Vfnm option {\n opacity: 1;\n} .language-selector_language-select_8Vfnm:focus {\n border: 1px solid white;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"language-select": "language-selector_language-select_8Vfnm",
|
||
"languageSelect": "language-selector_language-select_8Vfnm"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/library-item/library-item.css":
|
||
/*!*************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/library-item/library-item.css ***!
|
||
\*************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ .library-item_library-item_1DcMO {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n flex-basis: 160px;\n position: relative;\n height: 160px;\n max-width: 160px;\n margin: 0.5rem;\n padding: 1rem 1rem 0 1rem;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n background: white;\n border-width: 2px;\n border-style: solid;\n border-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 0.5rem;\n text-align: center;\n cursor: pointer;\n} [theme=\"dark\"] .library-item_library-item_1DcMO {\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n} .library-item_library-item-extension_3xus9 {\n align-self: stretch;\n} .library-item_library-item_1DcMO:hover {\n border-width: 2px;\n border-color: hsla(0, 100%, 65%, 1);\n} .library-item_hidden_1ILc7 {\n display: none;\n} .library-item_disabled_1-aDH {\n opacity: .5;\n cursor: auto;\n} .library-item_disabled_1-aDH:hover {\n border-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n} .library-item_library-item-image-container-wrapper_x4EWB {\n height: 100px;\n width: 100%;\n position: relative;\n} .library-item_library-item-image-container_3dqjX {\n position: absolute;\n height: 100px;\n width: 100%;\n} .library-item_library-item-inset-image-container_3PLJ1 {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-top: -2.5rem;\n align-self: flex-start;\n background-color: hsla(163, 85%, 40%, 1);\n width: 3.5rem;\n height: 3.5rem;\n border-radius: 0.5rem;\n border: 0.25rem solid hsla(0, 100%, 100%, 1);\n} [dir=\"ltr\"] .library-item_library-item-inset-image-container_3PLJ1 {\n margin-left: 1rem;\n} [dir=\"rtl\"] .library-item_library-item-inset-image-container_3PLJ1 {\n margin-right: 1rem;\n} .library-item_library-item-image_2bORn {\n max-width: 100%;\n max-height: 100%;\n} .library-item_library-item-inset-image_17Tmt {\n width: 2.5rem;\n} .library-item_library-item-name_2qMXu {\n width: 80%;\n margin: 0.25rem 0;\n text-align: center;\n\n /*\n For truncating overflowing text gracefully\n Min-width is for a bug: https://css-tricks.com/flexbox-truncated-text\n */\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n} .library-item_featured-item_3V2-t {\n flex-basis: 300px;\n max-width: 300px;\n height: auto;\n overflow: hidden;\n padding: 0;\n} .library-item_featured-image-container_1KIHG {\n position: relative;\n width: 100%;\n} .library-item_featured-image_2gwZ6 {\n width: 100%;\n aspect-ratio: 2;\n} .library-item_featured-text_2KFel {\n font-weight: bold;\n padding: 10px;\n /* height: 140px; */\n width: 300px;\n} [dir=\"ltr\"] .library-item_featured-extension-text_22A1k {\n text-align: left;\n padding-left: 1.25rem;\n} [dir=\"rtl\"] .library-item_featured-extension-text_22A1k {\n text-align: right;\n padding-right: 1.25rem;\n} .library-item_featured-description_MjIJw {\n display: block;\n font-weight: normal;\n line-height: 1.375rem;\n padding-top: .3125rem;\n padding-bottom: .25rem;\n} .library-item_featured-extension-metadata_3D8E8 {\n width: 100%;\n padding: 0 1.25rem 1rem 1.25rem;\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n font-size: 12px;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n opacity: 0.75;\n} [dir=\"ltr\"] .library-item_featured-extension-metadata_3D8E8 {\n text-align: left;\n} [dir=\"rtl\"] .library-item_featured-extension-metadata_3D8E8 {\n text-align: right;\n} .library-item_featured-extension-requirement_2u2IO {\n width: 100%;\n display: flex;\n flex-direction: column;\n} .library-item_featured-extension-collaboration_2dGS9 {\n width: 100%;\n display: flex;\n flex-direction: column;\n} .library-item_featured-extension-metadata-detail_1M9BV {\n height: 100%;\n padding-top: 0.4rem;\n font-weight: bold;\n} .library-item_featured-extension-metadata-detail_1M9BV img {\n margin-right: 0.25rem;\n width: 20px;\n height: 20px;\n} .library-item_extension-links_3wgib {\n width: 300px;\n padding: 0 1.25rem 1rem 1.25rem;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n opacity: 0.75;\n text-align: left;\n} .library-item_extension-links_3wgib a {\n color: inherit !important;\n text-decoration: underline;\n} .library-item_coming-soon-text_30OPh {\n position: absolute;\n background-color: hsla(30, 100%, 55%, 1);\n border-radius: 1rem;\n box-shadow: 0 0 .5rem hsla(0, 0%, 0%, .25);\n padding: .5rem 1rem;\n font-size: .875rem;\n font-weight: bold;\n color: hsla(0, 100%, 100%, 1);\n} [dir=\"ltr\"] .library-item_coming-soon-text_30OPh {\n transform: translate(calc(2 * 0.5rem), calc(2 * 0.5rem));\n} [dir=\"rtl\"] .library-item_coming-soon-text_30OPh {\n transform: translate(calc(-2 * 0.5rem), calc(2 * 0.5rem));\n} .library-item_favorite-container_2M2ay {\n display: none;\n background: none;\n border: none;\n padding: 0;\n margin: 0;\n position: absolute;\n top: 0.5rem;\n left: 0.5rem;\n} .library-item_favorite-icon_1ENdX {\n width: 32px;\n height: 32px;\n} .library-item_favorite-container_2M2ay.library-item_active_2mL0e,\n.library-item_library-item_1DcMO:hover .library-item_favorite-container_2M2ay {\n display: block;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"library-item": "library-item_library-item_1DcMO",
|
||
"libraryItem": "library-item_library-item_1DcMO",
|
||
"library-item-extension": "library-item_library-item-extension_3xus9",
|
||
"libraryItemExtension": "library-item_library-item-extension_3xus9",
|
||
"hidden": "library-item_hidden_1ILc7",
|
||
"disabled": "library-item_disabled_1-aDH",
|
||
"library-item-image-container-wrapper": "library-item_library-item-image-container-wrapper_x4EWB",
|
||
"libraryItemImageContainerWrapper": "library-item_library-item-image-container-wrapper_x4EWB",
|
||
"library-item-image-container": "library-item_library-item-image-container_3dqjX",
|
||
"libraryItemImageContainer": "library-item_library-item-image-container_3dqjX",
|
||
"library-item-inset-image-container": "library-item_library-item-inset-image-container_3PLJ1",
|
||
"libraryItemInsetImageContainer": "library-item_library-item-inset-image-container_3PLJ1",
|
||
"library-item-image": "library-item_library-item-image_2bORn",
|
||
"libraryItemImage": "library-item_library-item-image_2bORn",
|
||
"library-item-inset-image": "library-item_library-item-inset-image_17Tmt",
|
||
"libraryItemInsetImage": "library-item_library-item-inset-image_17Tmt",
|
||
"library-item-name": "library-item_library-item-name_2qMXu",
|
||
"libraryItemName": "library-item_library-item-name_2qMXu",
|
||
"featured-item": "library-item_featured-item_3V2-t",
|
||
"featuredItem": "library-item_featured-item_3V2-t",
|
||
"featured-image-container": "library-item_featured-image-container_1KIHG",
|
||
"featuredImageContainer": "library-item_featured-image-container_1KIHG",
|
||
"featured-image": "library-item_featured-image_2gwZ6",
|
||
"featuredImage": "library-item_featured-image_2gwZ6",
|
||
"featured-text": "library-item_featured-text_2KFel",
|
||
"featuredText": "library-item_featured-text_2KFel",
|
||
"featured-extension-text": "library-item_featured-extension-text_22A1k",
|
||
"featuredExtensionText": "library-item_featured-extension-text_22A1k",
|
||
"featured-description": "library-item_featured-description_MjIJw",
|
||
"featuredDescription": "library-item_featured-description_MjIJw",
|
||
"featured-extension-metadata": "library-item_featured-extension-metadata_3D8E8",
|
||
"featuredExtensionMetadata": "library-item_featured-extension-metadata_3D8E8",
|
||
"featured-extension-requirement": "library-item_featured-extension-requirement_2u2IO",
|
||
"featuredExtensionRequirement": "library-item_featured-extension-requirement_2u2IO",
|
||
"featured-extension-collaboration": "library-item_featured-extension-collaboration_2dGS9",
|
||
"featuredExtensionCollaboration": "library-item_featured-extension-collaboration_2dGS9",
|
||
"featured-extension-metadata-detail": "library-item_featured-extension-metadata-detail_1M9BV",
|
||
"featuredExtensionMetadataDetail": "library-item_featured-extension-metadata-detail_1M9BV",
|
||
"extension-links": "library-item_extension-links_3wgib",
|
||
"extensionLinks": "library-item_extension-links_3wgib",
|
||
"coming-soon-text": "library-item_coming-soon-text_30OPh",
|
||
"comingSoonText": "library-item_coming-soon-text_30OPh",
|
||
"favorite-container": "library-item_favorite-container_2M2ay",
|
||
"favoriteContainer": "library-item_favorite-container_2M2ay",
|
||
"favorite-icon": "library-item_favorite-icon_1ENdX",
|
||
"favoriteIcon": "library-item_favorite-icon_1ENdX",
|
||
"active": "library-item_active_2mL0e"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/library/library.css":
|
||
/*!***************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/library/library.css ***!
|
||
\***************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n.library_library-scroll-grid_1jyXm {\n display: flex;\n justify-content: flex-start;\n align-content: flex-start;\n align-items: flex-start;\n background: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n flex-grow: 1;\n flex-wrap: wrap;\n overflow-y: auto;\n height: auto;\n padding: 0.5rem;\n height: calc(100% - 3.125rem);\n}\n\n.library_library-scroll-grid_1jyXm.library_withFilterBar_26Opm {\n height: calc(100% - 3.125rem - 2.5rem - 2rem);\n}\n\n.library_filter-bar_1W0DW {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n height: calc(2.5rem + 2rem); /* padding */\n background-color: hsla(0, 100%, 65%, 0.35);\n padding: 0 1rem;\n font-size: .875rem;\n}\n\n.library_filter-bar-item_99aoX {\n margin-right: .75rem;\n}\n\n.library_filter_2k-oj {\n flex-grow: 0;\n}\n\n.library_filter-input_6w2X2 {\n width: 11.5rem;\n transition: .2s;\n}\n\n.library_filter-input_6w2X2:focus,\n.library_filter-input_6w2X2:not([value=\"\"]) {\n width: 18.75rem;\n}\n\n.library_divider_2xD3D {\n transform: scaleY(1.39);\n height: 2.5rem;\n}\n\n.library_tag-wrapper_2-QEQ {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n height: 2.5rem;\n overflow: hidden;\n}\n\n.library_spinner-wrapper_1C8Ew {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"library-scroll-grid": "library_library-scroll-grid_1jyXm",
|
||
"libraryScrollGrid": "library_library-scroll-grid_1jyXm",
|
||
"withFilterBar": "library_withFilterBar_26Opm",
|
||
"filter-bar": "library_filter-bar_1W0DW",
|
||
"filterBar": "library_filter-bar_1W0DW",
|
||
"filter-bar-item": "library_filter-bar-item_99aoX",
|
||
"filterBarItem": "library_filter-bar-item_99aoX",
|
||
"filter": "library_filter_2k-oj",
|
||
"filter-input": "library_filter-input_6w2X2",
|
||
"filterInput": "library_filter-input_6w2X2",
|
||
"divider": "library_divider_2xD3D",
|
||
"tag-wrapper": "library_tag-wrapper_2-QEQ",
|
||
"tagWrapper": "library_tag-wrapper_2-QEQ",
|
||
"spinner-wrapper": "library_spinner-wrapper_1C8Ew",
|
||
"spinnerWrapper": "library_spinner-wrapper_1C8Ew"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/loader/loader.css":
|
||
/*!*************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/loader/loader.css ***!
|
||
\*************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/ /* Toolbox z-index: 40; set in scratch-blocks */ /* tooltips should go over add buttons if they overlap */ /* monitors go over add buttons */ /* \"ask\" block text input goes above monitors */ /* menu-bar should go over monitors, alerts and tutorials */ /* tw: show below menu bar normally */ /* Block drag z-index: 1000; default 50 is overriden in blocks.css */ /* so it is draggable into other panes */ /* in most interfaces, the context menu is always on top */ .loader_background_2DPrW {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 490;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: hsla(0, 100%, 65%, 1);\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n text-align: center;\n color: white;\n} [theme=\"dark\"] .loader_background_2DPrW {\n background-color: #333;\n} .loader_fullscreen_29EhP {\n /* Break out of the layout using position: fixed to cover the whole screen */\n position: fixed;\n /* Use the fullscreen stage z-index to allow covering full-screen mode */\n z-index: 500;\n} .loader_block-animation_12MqO {\n width: 125px;\n height: 150px;\n margin: 50px auto 0px;\n} .loader_block-animation_12MqO img {\n display: block;\n position: relative;\n height: 30%;\n margin-top: -4px;\n} .loader_top-block_3P7pK {\n animation: loader_top-slide-in_8ngR8 1.5s ease infinite;\n} .loader_middle-block_CKcTg {\n animation: loader_middle-slide-in_In2DU 1.5s ease infinite;\n} .loader_bottom-block_1-3rO {\n animation: loader_bottom-slide-in_2DZ1B 1.5s ease infinite;\n} [dir=\"rtl\"] .loader_top-block_3P7pK {\n animation: loader_top-slide-in-rtl_1vHi4 1.5s ease infinite;\n} [dir=\"rtl\"] .loader_middle-block_CKcTg {\n animation: loader_middle-slide-in-rtl_21ALw 1.5s ease infinite;\n} [dir=\"rtl\"] .loader_bottom-block_1-3rO {\n animation: loader_bottom-slide-in-rtl_3kdB0 1.5s ease infinite;\n} @keyframes loader_top-slide-in_8ngR8 {\n 0% {\n transform: translateY(50px);\n opacity: 0;\n }\n\n 33% {\n transform: translateY(0px);\n opacity: 1;\n }\n} @keyframes loader_middle-slide-in_In2DU {\n 0% {\n transform: translateY(50px);\n opacity: 0;\n }\n\n 33% {\n transform: translateY(50px);\n opacity: 0;\n }\n\n 66% {\n transform: translateY(0px);\n opacity: 1;\n }\n} @keyframes loader_bottom-slide-in_2DZ1B {\n 0% {\n transform: translateY(50px);\n opacity: 0;\n }\n\n 66% {\n transform: translateY(50px);\n opacity: 0;\n }\n\n 100% {\n transform: translateY(0px);\n opacity: 1;\n }\n} @keyframes loader_top-slide-in-rtl_1vHi4 {\n 0% {\n transform: translateY(50px) scaleX(-1);\n opacity: 0;\n }\n\n 33% {\n transform: translateY(0px) scaleX(-1);\n opacity: 1;\n }\n 100% {\n transform: translateY(0px) scaleX(-1);\n opacity: 1;\n }\n} @keyframes loader_middle-slide-in-rtl_21ALw {\n 0% {\n transform: translateY(50px) scaleX(-1);\n opacity: 0;\n }\n\n 33% {\n transform: translateY(50px) scaleX(-1);\n opacity: 0;\n }\n\n 66% {\n transform: translateY(0px) scaleX(-1);\n opacity: 1;\n }\n 100% {\n transform: translateY(0px) scaleX(-1);\n opacity: 1;\n }\n} @keyframes loader_bottom-slide-in-rtl_3kdB0 {\n 0% {\n transform: translateY(50px) scaleX(-1);\n opacity: 0;\n }\n\n 66% {\n transform: translateY(50px) scaleX(-1);\n opacity: 0;\n }\n\n 100% {\n transform: translateY(0px) scaleX(-1);\n opacity: 1;\n }\n} .loader_title_1tlje {\n font-size: 2rem;\n font-weight: bold;\n margin: 0.75rem 0;\n} .loader_message-container-outer_3oT0S {\n height: 30px;\n overflow: hidden;\n} .loader_message-container-inner_1L7LX {\n transition: transform 0.5s;\n} .loader_message_3yQvj {\n height: 20px;\n margin: 5px 0;\n} .loader_tw-progress-outer_2BGnX {\n position: relative;\n width: 250px;\n height: 5px;\n border: 1px solid white;\n margin: auto;\n} .loader_tw-progress-inner_3hE3h {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 0;\n background-color: white;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"background": "loader_background_2DPrW",
|
||
"fullscreen": "loader_fullscreen_29EhP",
|
||
"block-animation": "loader_block-animation_12MqO",
|
||
"blockAnimation": "loader_block-animation_12MqO",
|
||
"top-block": "loader_top-block_3P7pK",
|
||
"topBlock": "loader_top-block_3P7pK",
|
||
"top-slide-in": "loader_top-slide-in_8ngR8",
|
||
"topSlideIn": "loader_top-slide-in_8ngR8",
|
||
"middle-block": "loader_middle-block_CKcTg",
|
||
"middleBlock": "loader_middle-block_CKcTg",
|
||
"middle-slide-in": "loader_middle-slide-in_In2DU",
|
||
"middleSlideIn": "loader_middle-slide-in_In2DU",
|
||
"bottom-block": "loader_bottom-block_1-3rO",
|
||
"bottomBlock": "loader_bottom-block_1-3rO",
|
||
"bottom-slide-in": "loader_bottom-slide-in_2DZ1B",
|
||
"bottomSlideIn": "loader_bottom-slide-in_2DZ1B",
|
||
"top-slide-in-rtl": "loader_top-slide-in-rtl_1vHi4",
|
||
"topSlideInRtl": "loader_top-slide-in-rtl_1vHi4",
|
||
"middle-slide-in-rtl": "loader_middle-slide-in-rtl_21ALw",
|
||
"middleSlideInRtl": "loader_middle-slide-in-rtl_21ALw",
|
||
"bottom-slide-in-rtl": "loader_bottom-slide-in-rtl_3kdB0",
|
||
"bottomSlideInRtl": "loader_bottom-slide-in-rtl_3kdB0",
|
||
"title": "loader_title_1tlje",
|
||
"message-container-outer": "loader_message-container-outer_3oT0S",
|
||
"messageContainerOuter": "loader_message-container-outer_3oT0S",
|
||
"message-container-inner": "loader_message-container-inner_1L7LX",
|
||
"messageContainerInner": "loader_message-container-inner_1L7LX",
|
||
"message": "loader_message_3yQvj",
|
||
"tw-progress-outer": "loader_tw-progress-outer_2BGnX",
|
||
"twProgressOuter": "loader_tw-progress-outer_2BGnX",
|
||
"tw-progress-inner": "loader_tw-progress-inner_3hE3h",
|
||
"twProgressInner": "loader_tw-progress-inner_3hE3h"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/loupe/loupe.css":
|
||
/*!***********************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/loupe/loupe.css ***!
|
||
\***********************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .loupe_color-picker_1OaU- {\n position: absolute;\n top: 0;\n left: 0;\n border-radius: 100%;\n border: 4px solid hsla(0, 0%, 0%, 0.15);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"color-picker": "loupe_color-picker_1OaU-",
|
||
"colorPicker": "loupe_color-picker_1OaU-"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/author-info.css":
|
||
/*!********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/menu-bar/author-info.css ***!
|
||
\********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ .author-info_author-info_2Pliw {\n color: hsla(0, 100%, 100%, 1);\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n cursor: default;\n} .author-info_avatar_31Mo8 {\n margin-right: .5625rem;\n} .author-info_project-title_h7Gcj {\n max-width: 12rem;\n display: block;\n overflow: hidden;\n font-size: 0.875rem;\n font-weight: bold;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: 0;\n padding: 0;\n} .author-info_username-line_18E8B {\n max-width: 12rem;\n font-size: 0.75rem;\n display: block;\n overflow: hidden;\n font-weight: normal;\n text-overflow: ellipsis;\n white-space: nowrap;\n} .author-info_username_2Ov2- {\n font-weight: bold;\n} .author-info_link_3EUX3 {\n text-decoration: none;\n color: hsla(0, 100%, 100%, 1) !important;\n} .author-info_link_3EUX3:hover {\n text-decoration: underline;\n} .author-info_link_3EUX3 .author-info_author-info_2Pliw {\n cursor: pointer;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"author-info": "author-info_author-info_2Pliw",
|
||
"authorInfo": "author-info_author-info_2Pliw",
|
||
"avatar": "author-info_avatar_31Mo8",
|
||
"project-title": "author-info_project-title_h7Gcj",
|
||
"projectTitle": "author-info_project-title_h7Gcj",
|
||
"username-line": "author-info_username-line_18E8B",
|
||
"usernameLine": "author-info_username-line_18E8B",
|
||
"username": "author-info_username_2Ov2-",
|
||
"link": "author-info_link_3EUX3"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/community-button.css":
|
||
/*!*************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/menu-bar/community-button.css ***!
|
||
\*************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .community-button_community-button_2Lo_g {\n box-shadow: 0 0 0 1px var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n} .community-button_community-button-icon_1IFvv {\n height: 1.25rem;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"community-button": "community-button_community-button_2Lo_g",
|
||
"communityButton": "community-button_community-button_2Lo_g",
|
||
"community-button-icon": "community-button_community-button-icon_1IFvv",
|
||
"communityButtonIcon": "community-button_community-button-icon_1IFvv"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/menu-bar.css":
|
||
/*!*****************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/menu-bar/menu-bar.css ***!
|
||
\*****************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ /*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/ /* Toolbox z-index: 40; set in scratch-blocks */ /* tooltips should go over add buttons if they overlap */ /* monitors go over add buttons */ /* \"ask\" block text input goes above monitors */ /* menu-bar should go over monitors, alerts and tutorials */ /* tw: show below menu bar normally */ /* Block drag z-index: 1000; default 50 is overriden in blocks.css */ /* so it is draggable into other panes */ /* in most interfaces, the context menu is always on top */ .menu-bar_menu-bar_JcuHF {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n flex-wrap: nowrap;\n\n /*\n For most things, we shouldn't explicitly set height, and let the\n content push the element to whatever fits. Using a fixed height\n instead, will help us subtract the value we assign from the body,\n adding up to a perfect 100%. This means we don't need to set\n overflow: hidden, which makes it hard to debug. border-box\n simplifies by all of this by removing padding from the equation.\n */\n box-sizing: border-box;\n height: 3rem;\n\n /*\n @todo: This adds ~20px in Chrome, when scrolling to the right,\n but fixes [FFx + Safari] [resize window down + scroll to the right] bug.\n width: 100%;\n */\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 0.75rem;\n font-weight: bold;\n background-color: hsla(0, 100%, 65%, 1);\n color: hsla(0, 100%, 100%, 1);\n} [theme=\"dark\"] .menu-bar_menu-bar_JcuHF {\n background-color: #333;\n} .menu-bar_main-menu_3wjWH {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n flex-wrap: nowrap;\n align-items: center;\n flex-grow: 1;\n} .menu-bar_scratch-logo_2uReV {\n height: 1.6rem;\n vertical-align: middle;\n} .menu-bar_scratch-logo_2uReV.menu-bar_clickable_1g3uo {\n cursor: pointer;\n} .menu-bar_language-icon_2DZV7 {\n height: 1.5rem;\n vertical-align: middle;\n} .menu-bar_language-caret_16tau {\n margin: 0 .125rem;\n} .menu-bar_language-menu_2JEDx {\n box-sizing: border-box;\n display: inline-flex;\n width: 3rem;\n} .menu-bar_menu-bar-item_oLDa- {\n display: flex;\n padding: 0 0.25rem;\n text-decoration: none;\n color: hsla(0, 100%, 100%, 1);\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n align-self: center;\n position: relative;\n align-items: center;\n white-space: nowrap;\n height: 3rem;\n} .menu-bar_menu-bar-item_oLDa-.menu-bar_hoverable_c6WFB {\n cursor: pointer;\n} .menu-bar_menu-bar-item_oLDa-.menu-bar_active_2Lfqh,\n.menu-bar_menu-bar-item_oLDa-.menu-bar_hoverable_c6WFB:hover {\n background-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n} .menu-bar_menu-bar-item_oLDa-.menu-bar_growable_1sHWN {\n max-width: 12rem;\n flex: 1;\n} .menu-bar_title-field-growable_3qr4G {\n flex-grow: 1;\n width: 2rem;\n} .menu-bar_file-group_1_CHX {\n display: flex;\n flex-direction: row;\n align-items: center;\n} .menu-bar_file-group_1_CHX .menu-bar_menu-bar-item_oLDa- {\n padding: 0 0.75rem;\n} .menu-bar_menu-bar-item_oLDa-.menu-bar_language-menu_2JEDx {\n padding: 0 0.5rem;\n} .menu-bar_menu-bar-menu_239MD {\n margin-top: 3rem;\n z-index: 491;\n} .menu-bar_feedback-link_1BnAR {\n color: hsla(0, 100%, 65%, 1) !important;\n text-decoration: none;\n} [theme=\"dark\"] .menu-bar_feedback-link_1BnAR {\n color: #333 !important;\n} .menu-bar_feedback-button_2rEcj {\n background-color: hsla(0, 100%, 100%, 1);\n height: 34px;\n} .menu-bar_divider_2VFCm {\n margin: 0 .5rem;\n height: 34px;\n} .menu-bar_author-info_22Nub {\n margin-left: .25rem;\n margin-right: .6875rem;\n} .menu-bar_menu-bar-button_3IDN0 {\n height: 2rem;\n} .menu-bar_remix-button_2LQQc {\n background-color: hsla(163, 85%, 40%, 1)\n} .menu-bar_remix-button-icon_2E93U {\n height: 1.25rem;\n} .menu-bar_coming-soon_3yU1L >:not(.menu-bar_coming-soon-tooltip_20GhI) {\n opacity: 0.5;\n} .menu-bar_account-info-group_MeJZP {\n display: flex;\n flex-direction: row;\n align-items: center;\n} .menu-bar_account-info-group_MeJZP .menu-bar_menu-bar-item_oLDa- {\n padding: 0 0.75rem;\n} .menu-bar_mystuff-icon_3DtcD {\n margin: 0 .25rem;\n height: 1rem;\n} .menu-bar_help-icon_3Xtrt {\n margin-right: 0.35rem;\n} .menu-bar_account-nav-menu_3uu9p, .menu-bar_mystuff-button_16jPf {\n padding: 0 .25rem;\n display: flex;\n flex-direction: row;\n align-items: center;\n} .menu-bar_profile-icon_2bJkI {\n margin: 0 .25rem;\n width: 2rem;\n border-radius: calc(0.5rem / 2);\n} .menu-bar_dropdown-caret-icon_FkdUe {\n width: 0.5rem;\n height: 0.5rem;\n} [dir=\"ltr\"] .menu-bar_dropdown-caret-icon_FkdUe {\n margin-left: .5rem;\n} [dir=\"rtl\"] .menu-bar_dropdown-caret-icon_FkdUe {\n margin-right: .5rem;\n} .menu-bar_disabled_3x5sy {\n opacity: 0.5;\n} .menu-bar_mystuff_3RiSb > a {\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 45%;\n padding-right: 10px;\n padding-left: 10px;\n width: 30px;\n overflow: hidden;\n text-indent: 50px;\n white-space: nowrap;\n} .menu-bar_mystuff_3RiSb > a:hover {\n background-size: 50%;\n} .menu-bar_mystuff_3RiSb > a {\n /* background-image: url(\"/images/mystuff.png\"); */\n} .menu-bar_about-icon_dZI7K {\n height: 1.25rem;\n margin: 0.5rem;\n vertical-align: middle;\n} /* tw: styles to override <a> styles */ .menu-bar_menu-item-link_20T0- {\n color: hsla(0, 100%, 100%, 1) !important;\n text-decoration: none;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"menu-bar": "menu-bar_menu-bar_JcuHF",
|
||
"menuBar": "menu-bar_menu-bar_JcuHF",
|
||
"main-menu": "menu-bar_main-menu_3wjWH",
|
||
"mainMenu": "menu-bar_main-menu_3wjWH",
|
||
"scratch-logo": "menu-bar_scratch-logo_2uReV",
|
||
"scratchLogo": "menu-bar_scratch-logo_2uReV",
|
||
"clickable": "menu-bar_clickable_1g3uo",
|
||
"language-icon": "menu-bar_language-icon_2DZV7",
|
||
"languageIcon": "menu-bar_language-icon_2DZV7",
|
||
"language-caret": "menu-bar_language-caret_16tau",
|
||
"languageCaret": "menu-bar_language-caret_16tau",
|
||
"language-menu": "menu-bar_language-menu_2JEDx",
|
||
"languageMenu": "menu-bar_language-menu_2JEDx",
|
||
"menu-bar-item": "menu-bar_menu-bar-item_oLDa-",
|
||
"menuBarItem": "menu-bar_menu-bar-item_oLDa-",
|
||
"hoverable": "menu-bar_hoverable_c6WFB",
|
||
"active": "menu-bar_active_2Lfqh",
|
||
"growable": "menu-bar_growable_1sHWN",
|
||
"title-field-growable": "menu-bar_title-field-growable_3qr4G",
|
||
"titleFieldGrowable": "menu-bar_title-field-growable_3qr4G",
|
||
"file-group": "menu-bar_file-group_1_CHX",
|
||
"fileGroup": "menu-bar_file-group_1_CHX",
|
||
"menu-bar-menu": "menu-bar_menu-bar-menu_239MD",
|
||
"menuBarMenu": "menu-bar_menu-bar-menu_239MD",
|
||
"feedback-link": "menu-bar_feedback-link_1BnAR",
|
||
"feedbackLink": "menu-bar_feedback-link_1BnAR",
|
||
"feedback-button": "menu-bar_feedback-button_2rEcj",
|
||
"feedbackButton": "menu-bar_feedback-button_2rEcj",
|
||
"divider": "menu-bar_divider_2VFCm",
|
||
"author-info": "menu-bar_author-info_22Nub",
|
||
"authorInfo": "menu-bar_author-info_22Nub",
|
||
"menu-bar-button": "menu-bar_menu-bar-button_3IDN0",
|
||
"menuBarButton": "menu-bar_menu-bar-button_3IDN0",
|
||
"remix-button": "menu-bar_remix-button_2LQQc",
|
||
"remixButton": "menu-bar_remix-button_2LQQc",
|
||
"remix-button-icon": "menu-bar_remix-button-icon_2E93U",
|
||
"remixButtonIcon": "menu-bar_remix-button-icon_2E93U",
|
||
"coming-soon": "menu-bar_coming-soon_3yU1L",
|
||
"comingSoon": "menu-bar_coming-soon_3yU1L",
|
||
"coming-soon-tooltip": "menu-bar_coming-soon-tooltip_20GhI",
|
||
"comingSoonTooltip": "menu-bar_coming-soon-tooltip_20GhI",
|
||
"account-info-group": "menu-bar_account-info-group_MeJZP",
|
||
"accountInfoGroup": "menu-bar_account-info-group_MeJZP",
|
||
"mystuff-icon": "menu-bar_mystuff-icon_3DtcD",
|
||
"mystuffIcon": "menu-bar_mystuff-icon_3DtcD",
|
||
"help-icon": "menu-bar_help-icon_3Xtrt",
|
||
"helpIcon": "menu-bar_help-icon_3Xtrt",
|
||
"account-nav-menu": "menu-bar_account-nav-menu_3uu9p",
|
||
"accountNavMenu": "menu-bar_account-nav-menu_3uu9p",
|
||
"mystuff-button": "menu-bar_mystuff-button_16jPf",
|
||
"mystuffButton": "menu-bar_mystuff-button_16jPf",
|
||
"profile-icon": "menu-bar_profile-icon_2bJkI",
|
||
"profileIcon": "menu-bar_profile-icon_2bJkI",
|
||
"dropdown-caret-icon": "menu-bar_dropdown-caret-icon_FkdUe",
|
||
"dropdownCaretIcon": "menu-bar_dropdown-caret-icon_FkdUe",
|
||
"disabled": "menu-bar_disabled_3x5sy",
|
||
"mystuff": "menu-bar_mystuff_3RiSb",
|
||
"about-icon": "menu-bar_about-icon_dZI7K",
|
||
"aboutIcon": "menu-bar_about-icon_dZI7K",
|
||
"menu-item-link": "menu-bar_menu-item-link_20T0-",
|
||
"menuItemLink": "menu-bar_menu-item-link_20T0-"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/project-title-input.css":
|
||
/*!****************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/menu-bar/project-title-input.css ***!
|
||
\****************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ /*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/ /* Toolbox z-index: 40; set in scratch-blocks */ /* tooltips should go over add buttons if they overlap */ /* monitors go over add buttons */ /* \"ask\" block text input goes above monitors */ /* menu-bar should go over monitors, alerts and tutorials */ /* tw: show below menu bar normally */ /* Block drag z-index: 1000; default 50 is overriden in blocks.css */ /* so it is draggable into other panes */ /* in most interfaces, the context menu is always on top */ /*\nIf project-title-input.jsx is part of a menu bar say menu-bar.jsx, it can have additional css classes that\ncan set a width for example or what it should do in a flex box (eg. grow).\n*/ .project-title-input_title-field_en5Gd {\n border: 1px dashed var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: calc(0.5rem / 2);\n -webkit-border-radius: calc(0.5rem / 2);\n -moz-border-radius: calc(0.5rem / 2);\n background-color: hsla(0, 100%, 100%, 0.25);\n background-clip: padding-box;\n -webkit-background-clip: padding-box;\n height: auto;\n padding: .5rem;\n} .project-title-input_title-field_en5Gd {\n color: hsla(0, 100%, 100%, 1);\n font-weight: bold;\n font-size: .8rem;\n} .project-title-input_title-field_en5Gd::-ms-input-placeholder {\n color: hsla(0, 100%, 100%, 1);\n font-weight: normal;\n font-size: .8rem;\n font-style: italic;\n} .project-title-input_title-field_en5Gd::placeholder {\n color: hsla(0, 100%, 100%, 1);\n font-weight: normal;\n font-size: .8rem;\n font-style: italic;\n} .project-title-input_title-field_en5Gd:hover {\n background-color: hsla(0, 100%, 100%, 0.5);\n} [theme=\"dark\"] .project-title-input_title-field_en5Gd:hover {\n background-color: rgba(0, 0, 0, 0.5);\n} .project-title-input_title-field_en5Gd:focus {\n outline:none;\n border: 1px solid hsla(0, 100%, 100%, 0);\n box-shadow: 0 0 0 calc(0.5rem * .5) hsla(0, 100%, 100%, 0.25);\n background-color: hsla(0, 100%, 100%, 1);\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n} [theme=\"dark\"] .project-title-input_title-field_en5Gd:focus {\n background-color: rgba(0, 0, 0, 0.3);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"title-field": "project-title-input_title-field_en5Gd",
|
||
"titleField": "project-title-input_title-field_en5Gd"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/save-status.css":
|
||
/*!********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/menu-bar/save-status.css ***!
|
||
\********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, ".save-status_save-now_2shdk {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n cursor: pointer;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"save-now": "save-status_save-now_2shdk",
|
||
"saveNow": "save-status_save-now_2shdk"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/share-button.css":
|
||
/*!*********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/menu-bar/share-button.css ***!
|
||
\*********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .share-button_share-button_Nxxf0 {\n background: hsla(30, 100%, 55%, 1);\n} .share-button_share-button-is-shared_1tjKq {\n background: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n cursor: default;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"share-button": "share-button_share-button_Nxxf0",
|
||
"shareButton": "share-button_share-button_Nxxf0",
|
||
"share-button-is-shared": "share-button_share-button-is-shared_1tjKq",
|
||
"shareButtonIsShared": "share-button_share-button-is-shared_1tjKq"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/tw-see-inside.css":
|
||
/*!**********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/menu-bar/tw-see-inside.css ***!
|
||
\**********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* this class must contain \"see-inside-button\" somewhere for the s3 dev tools to be able to reinject itself */ /* https://github.com/griffpatch/Scratch3-Dev-Tools/blob/0.2.4/inject3.js#L1804-L1807 */ .tw-see-inside_see-inside-button_3ecsR {\n box-shadow: 0 0 0 1px var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n} .tw-see-inside_see-inside-button-icon_1fQvM {\n height: 1.25rem;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"see-inside-button": "tw-see-inside_see-inside-button_3ecsR",
|
||
"seeInsideButton": "tw-see-inside_see-inside-button_3ecsR",
|
||
"see-inside-button-icon": "tw-see-inside_see-inside-button-icon_1fQvM",
|
||
"seeInsideButtonIcon": "tw-see-inside_see-inside-button-icon_1fQvM"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/user-avatar.css":
|
||
/*!********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/menu-bar/user-avatar.css ***!
|
||
\********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ .user-avatar_user-thumbnail_jSYS1 {\n width: 2rem;\n height: 2rem;\n border-radius: calc(0.5rem / 2);\n vertical-align: middle;\n box-shadow: 0 0 0 1px var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"user-thumbnail": "user-avatar_user-thumbnail_jSYS1",
|
||
"userThumbnail": "user-avatar_user-thumbnail_jSYS1"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu/menu.css":
|
||
/*!*********************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/menu/menu.css ***!
|
||
\*********************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .menu_menu_3k7QT {\n position: absolute;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 0 0 8px 8px;\n background-color: hsla(0, 100%, 65%, 1);\n padding: 0;\n margin: 0;\n min-width: 186px;\n /* tw: no max width */\n /* max-width: 260px; */\n overflow: visible;\n color: hsla(0, 100%, 100%, 1);\n box-shadow: 0 8px 8px 0 hsla(0, 0%, 0%, 0.15);\n} [theme=\"dark\"] .menu_menu_3k7QT {\n background-color: #333;\n} .menu_menu_3k7QT.menu_left_dujsV {\n right: 0;\n} .menu_menu_3k7QT.menu_right_3PQ4S {\n left: 0;\n} .menu_menu-item_3EwYA {\n display: block;\n line-height: 34px;\n white-space: nowrap;\n padding: 0 10px;\n font-size: .75rem;\n margin: 0;\n font-weight: bold;\n} .menu_menu-item_3EwYA.menu_active_ebXO6,\n.menu_menu-item_3EwYA:hover {\n background-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n} .menu_menu-item_3EwYA.menu_hoverable_3u9dt {\n cursor: pointer;\n} .menu_menu-section_2U-v6 {\n border-top: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"menu": "menu_menu_3k7QT",
|
||
"left": "menu_left_dujsV",
|
||
"right": "menu_right_3PQ4S",
|
||
"menu-item": "menu_menu-item_3EwYA",
|
||
"menuItem": "menu_menu-item_3EwYA",
|
||
"active": "menu_active_ebXO6",
|
||
"hoverable": "menu_hoverable_3u9dt",
|
||
"menu-section": "menu_menu-section_2U-v6",
|
||
"menuSection": "menu_menu-section_2U-v6"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/meter/meter.css":
|
||
/*!***********************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/meter/meter.css ***!
|
||
\***********************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .meter_green_oUPv2 {\n fill: rgb(171, 220, 170);\n stroke: rgb(174, 211, 168);\n} .meter_yellow_3uz-j {\n fill: rgb(251, 219, 130);\n stroke: rgb(239, 212, 134);\n} .meter_red_1aMUm {\n fill: rgb(251, 194, 142);\n stroke: rgb(235, 189, 142);\n} .meter_mask-container_11m_n {\n position: relative;\n} .meter_mask_B-cd7 {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n transform-origin: top;\n will-change: transform;\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n opacity: 0.75;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"green": "meter_green_oUPv2",
|
||
"yellow": "meter_yellow_3uz-j",
|
||
"red": "meter_red_1aMUm",
|
||
"mask-container": "meter_mask-container_11m_n",
|
||
"maskContainer": "meter_mask-container_11m_n",
|
||
"mask": "meter_mask_B-cd7"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/mic-indicator/mic-indicator.css":
|
||
/*!***************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/mic-indicator/mic-indicator.css ***!
|
||
\***************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "@keyframes mic-indicator_popIn_2A2Un {\n from {transform: scale(0.5)}\n to {transform: scale(1)}\n}\n\n.mic-indicator_mic-img_Su3yZ {\n margin: 10px;\n transform-origin: center;\n animation: mic-indicator_popIn_2A2Un 0.1s ease-in-out;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"mic-img": "mic-indicator_mic-img_Su3yZ",
|
||
"micImg": "mic-indicator_mic-img_Su3yZ",
|
||
"popIn": "mic-indicator_popIn_2A2Un"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/modal/modal.css":
|
||
/*!***********************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/modal/modal.css ***!
|
||
\***********************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ /*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/ /* Toolbox z-index: 40; set in scratch-blocks */ /* tooltips should go over add buttons if they overlap */ /* monitors go over add buttons */ /* \"ask\" block text input goes above monitors */ /* menu-bar should go over monitors, alerts and tutorials */ /* tw: show below menu bar normally */ /* Block drag z-index: 1000; default 50 is overriden in blocks.css */ /* so it is draggable into other panes */ /* in most interfaces, the context menu is always on top */ .modal_modal-overlay_1Lcbx {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 510;\n background-color: var(--ui-modal-overlay, hsla(0, 100%, 65%, 0.9));\n} .modal_modal-content_1h3ll * {\n box-sizing: border-box;\n} .modal_modal-content_1h3ll {\n margin: 100px auto;\n outline: none;\n border: 4px solid hsla(0, 100%, 100%, 0.25);\n padding: 0;\n border-radius: 0.5rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n color: hsla(225, 15%, 40%, 1);\n overflow: hidden;\n} .modal_modal-content_1h3ll.modal_full-screen_FA4cr {\n position: absolute;\n\n display: flex;\n height: 100%;\n width: 100%;\n\n overflow-y: auto;\n -webkit-overflow-scrolling: 'touch';\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n\n background-color: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n\n /* Default modal resets */\n margin: 0;\n border: none;\n border-radius: 0;\n} /*\n Modal header has 3 items:\n |filter title x|\n\n Use the same width for both side item containers,\n so that title remains centered\n*/ .modal_header_1h7ps {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n height: 3.125rem;\n\n box-sizing: border-box;\n width: 100%;\n background-color: hsla(0, 100%, 65%, 1);\n \n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n} [theme=\"dark\"] .modal_header_1h7ps {\n background-color: #333;\n} [theme=\"dark\"] .modal_full-screen_FA4cr .modal_header_1h7ps {\n background-color: hsla(0, 100%, 65%, 1);\n} .modal_header-item_2zQTd {\n display: flex;\n align-items: center;\n padding: 1rem;\n text-decoration: none;\n color: hsla(0, 100%, 100%, 1);\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n} [dir=\"ltr\"] .modal_header-image_2KMDd {\n margin-right: 0.5rem;\n} [dir=\"rtl\"] .modal_header-image_2KMDd {\n margin-left: 0.5rem;\n} .modal_header-item-filter_3W-ah {\n display: flex;\n flex-basis: 20rem;\n justify-content: flex-start;\n} .modal_header-item-title_tLOU5 {\n flex-grow: 1;\n flex-shrink: 0;\n justify-content: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n letter-spacing: 0.4px;\n cursor: default;\n} [dir=\"ltr\"] .modal_header-item-title_tLOU5 {\n margin: 0 -20rem 0 0;\n} [dir=\"rtl\"] .modal_header-item-title_tLOU5 {\n margin: 0 0 0 -20rem;\n} .modal_full-screen_FA4cr [dir=\"ltr\"] .modal_header-item-title_tLOU5 {\n margin: 0 0 0 -20rem;\n} .modal_full-screen_FA4cr [dir=\"rtl\"] .modal_header-item-title_tLOU5 {\n margin: 0 -20rem 0 0;\n} .modal_header-item-close_2XDeL {\n flex-basis: 20rem;\n justify-content: flex-end;\n z-index: 1;\n} .modal_full-screen_FA4cr .modal_header-item-close_2XDeL {\n order: -1;\n justify-content: flex-start;\n} .modal_back-button_2ej6v {\n font-weight: normal;\n padding-right: 0;\n padding-left: 0;\n} [dir=\"rtl\"] .modal_back-button_2ej6v img {\n transform: scaleX(-1);\n} .modal_header-item-help_UZFrJ {\n padding: 0;\n z-index: 1;\n} [dir=\"ltr\"] .modal_header-item-help_UZFrJ {\n margin-right: -4.75rem;\n} [dir=\"rtl\"] .modal_header-item-help_UZFrJ {\n margin-left: -4.75rem;\n} .modal_help-button_dLhZu {\n font-weight: normal;\n font-size: 0.75rem;\n} [dir=\"ltr\"] .modal_help-button_dLhZu {\n padding-right: 0;\n} [dir=\"rtl\"] .modal_help-button_dLhZu {\n padding-left: 0;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-overlay": "modal_modal-overlay_1Lcbx",
|
||
"modalOverlay": "modal_modal-overlay_1Lcbx",
|
||
"modal-content": "modal_modal-content_1h3ll",
|
||
"modalContent": "modal_modal-content_1h3ll",
|
||
"full-screen": "modal_full-screen_FA4cr",
|
||
"fullScreen": "modal_full-screen_FA4cr",
|
||
"header": "modal_header_1h7ps",
|
||
"header-item": "modal_header-item_2zQTd",
|
||
"headerItem": "modal_header-item_2zQTd",
|
||
"header-image": "modal_header-image_2KMDd",
|
||
"headerImage": "modal_header-image_2KMDd",
|
||
"header-item-filter": "modal_header-item-filter_3W-ah",
|
||
"headerItemFilter": "modal_header-item-filter_3W-ah",
|
||
"header-item-title": "modal_header-item-title_tLOU5",
|
||
"headerItemTitle": "modal_header-item-title_tLOU5",
|
||
"header-item-close": "modal_header-item-close_2XDeL",
|
||
"headerItemClose": "modal_header-item-close_2XDeL",
|
||
"back-button": "modal_back-button_2ej6v",
|
||
"backButton": "modal_back-button_2ej6v",
|
||
"header-item-help": "modal_header-item-help_UZFrJ",
|
||
"headerItemHelp": "modal_header-item-help_UZFrJ",
|
||
"help-button": "modal_help-button_dLhZu",
|
||
"helpButton": "modal_help-button_dLhZu"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/monitor-list/monitor-list.css":
|
||
/*!*************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/monitor-list/monitor-list.css ***!
|
||
\*************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, ".monitor-list_monitor-list_20k-y {\n /* Width/height are set by the component, margin: auto centers in fullscreen */\n margin: auto;\n pointer-events: none;\n overflow: hidden;\n}\n\n.monitor-list_monitor-list-scaler_143tA {\n /* Scaling for monitors should happen from the top left */\n transform-origin: left top;\n}\n\n::-ms-clear { display: none; }\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"monitor-list": "monitor-list_monitor-list_20k-y",
|
||
"monitorList": "monitor-list_monitor-list_20k-y",
|
||
"monitor-list-scaler": "monitor-list_monitor-list-scaler_143tA",
|
||
"monitorListScaler": "monitor-list_monitor-list-scaler_143tA"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/monitor/monitor.css":
|
||
/*!***************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/monitor/monitor.css ***!
|
||
\***************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n/*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/\n\n/* Toolbox z-index: 40; set in scratch-blocks */\n\n/* tooltips should go over add buttons if they overlap */\n\n/* monitors go over add buttons */\n\n/* \"ask\" block text input goes above monitors */\n\n/* menu-bar should go over monitors, alerts and tutorials */\n\n/* tw: show below menu bar normally */\n\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\n\n/* so it is draggable into other panes */\n\n/* in most interfaces, the context menu is always on top */\n\n.monitor_monitor-container_2J9gl {\n position: absolute;\n background: hsla(215, 100%, 95%, 1); /* tw: do not look different in dark mode */\n z-index: 48;\n border: 1px solid hsla(0, 0%, 0%, 0.15);\n border-radius: calc(0.5rem / 2);\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 0.75rem;\n transition: box-shadow 0.2s;\n pointer-events: all;\n overflow: hidden;\n color: #575e75; /* tw: explicitly set color to match Scratch */\n}\n\n.monitor_monitor_11Vhm:hover {\n cursor: pointer;\n}\n\n.monitor_dragging_2ZN-P {\n z-index: 1010;\n box-shadow: 3px 3px 5px #888888;\n}\n\n.monitor_default-monitor_2vCcZ {\n display: flex;\n flex-direction: column;\n padding: 3px;\n}\n\n.monitor_label_ci1ok {\n font-weight: bold;\n text-align: center;\n margin: 0 5px;\n}\n\n.monitor_value_3Yexa {\n display: flex;\n justify-content: center;\n align-items: center;\n min-width: 40px;\n text-align: center;\n color: white;\n margin: 0 5px;\n border-radius: calc(0.5rem / 2);\n padding: 0 2px;\n white-space: pre-wrap;\n transform: translateZ(0); /* Fixes flickering in Safari */\n}\n\n.monitor_large-value_P-rAm {\n min-height: 1.4rem;\n min-width: 3rem;\n padding: 0.1rem 0.25rem;\n text-align: center;\n color: white;\n font-size: 1rem;\n white-space: pre-wrap;\n transform: translateZ(0); /* Fixes flickering in Safari */\n}\n\n.monitor_row_2y_kM {\n display: flex;\n flex-direction: row;\n}\n\n.monitor_slider_1CHwk {\n width: 100%;\n transform: translateZ(0); /* Fixes flickering in Safari */\n}\n\n.monitor_list-monitor_1FdIj {\n display: flex;\n flex-direction: column;\n}\n\n.monitor_list-header_-cp0o {\n background: hsla(0, 100%, 100%, 1);\n border-bottom: 1px solid hsla(0, 0%, 0%, 0.15);\n text-align: center;\n padding: 3px;\n font-size: 0.75rem;\n font-weight: bold;\n color: hsla(225, 15%, 40%, 1); /* tw: do not look different in dark mode */\n width: 100%;\n}\n\n.monitor_list-body_2OFZ6 {\n background: hsla(215, 100%, 95%, 1); /* tw: do not look different in dark mode */\n width: 100%;\n display: flex;\n flex-direction: column;\n overflow-x: hidden;\n flex-grow: 1;\n}\n\n.monitor_list-row_okCNn {\n display: flex;\n flex-direction: row;\n justify-content: space-around;\n align-items: center;\n padding: 2px;\n flex-shrink: 0;\n transform: translateZ(0); /* Keep sharp when scaled */\n}\n\n.monitor_list-index_7tKdl {\n font-weight: bold;\n color: hsla(225, 15%, 40%, 1); /* tw: do not look different in dark mode */\n margin: 0 3px;\n}\n\n.monitor_list-value_1zGfI {\n min-width: 40px;\n text-align: left;\n color: white;\n margin: 0 3px;\n border-radius: calc(0.5rem / 2);\n border: 1px solid hsla(0, 0%, 0%, 0.15);\n flex-grow: 1;\n height: 22px;\n}\n\n.monitor_list-footer_2HyG8 {\n background: hsla(0, 100%, 100%, 1);\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n padding: 3px;\n font-size: 0.75rem;\n font-weight: bold;\n border-top: 1px solid hsla(0, 0%, 0%, 0.15);\n color: hsla(225, 15%, 40%, 1); /* tw: do not look different in dark mode */\n}\n\n.monitor_list-empty_1UKsB {\n text-align: center;\n width: 100%;\n padding: 5px;\n}\n\n.monitor_input-wrapper_2yExa {\n position: relative;\n overflow: hidden;\n display: flex;\n align-items: center;\n background: rgba(0, 0, 0, 0.1);\n}\n\n.monitor_value-inner_3E9Ou {\n padding: 3px 5px;\n min-height: 22px;\n overflow: hidden; /* Don't let long values escape container */\n text-overflow: ellipsis;\n -webkit-user-select: text;\n -moz-user-select: text;\n -ms-user-select: text;\n user-select: text; /* Allow selecting list values for 2.0 compatibility, only relevant in player */\n white-space: pre;\n}\n\n.monitor_list-input_3kw5o {\n padding: 3px 5px;\n border: 0;\n background: none;\n color: hsla(0, 100%, 100%, 1);\n outline: none;\n font-size: 0.75rem;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n /* Workaround for Firefox */\n width: 0;\n flex: 1 1 auto;\n}\n\n.monitor_remove-button_AhlwG {\n padding: 0;\n padding-right: 5px;\n cursor: pointer;\n color: hsla(0, 100%, 100%, 1);\n}\n\n.monitor_add-button_2lmvI {\n cursor: pointer;\n margin-right: 3px;\n}\n\n.monitor_resize-handle_3WWBV {\n cursor: nwse-resize;\n margin-left: 3px;\n}\n\n.monitor_footer-length_2_QAb {\n text-align: center;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"monitor-container": "monitor_monitor-container_2J9gl",
|
||
"monitorContainer": "monitor_monitor-container_2J9gl",
|
||
"monitor": "monitor_monitor_11Vhm",
|
||
"dragging": "monitor_dragging_2ZN-P",
|
||
"default-monitor": "monitor_default-monitor_2vCcZ",
|
||
"defaultMonitor": "monitor_default-monitor_2vCcZ",
|
||
"label": "monitor_label_ci1ok",
|
||
"value": "monitor_value_3Yexa",
|
||
"large-value": "monitor_large-value_P-rAm",
|
||
"largeValue": "monitor_large-value_P-rAm",
|
||
"row": "monitor_row_2y_kM",
|
||
"slider": "monitor_slider_1CHwk",
|
||
"list-monitor": "monitor_list-monitor_1FdIj",
|
||
"listMonitor": "monitor_list-monitor_1FdIj",
|
||
"list-header": "monitor_list-header_-cp0o",
|
||
"listHeader": "monitor_list-header_-cp0o",
|
||
"list-body": "monitor_list-body_2OFZ6",
|
||
"listBody": "monitor_list-body_2OFZ6",
|
||
"list-row": "monitor_list-row_okCNn",
|
||
"listRow": "monitor_list-row_okCNn",
|
||
"list-index": "monitor_list-index_7tKdl",
|
||
"listIndex": "monitor_list-index_7tKdl",
|
||
"list-value": "monitor_list-value_1zGfI",
|
||
"listValue": "monitor_list-value_1zGfI",
|
||
"list-footer": "monitor_list-footer_2HyG8",
|
||
"listFooter": "monitor_list-footer_2HyG8",
|
||
"list-empty": "monitor_list-empty_1UKsB",
|
||
"listEmpty": "monitor_list-empty_1UKsB",
|
||
"input-wrapper": "monitor_input-wrapper_2yExa",
|
||
"inputWrapper": "monitor_input-wrapper_2yExa",
|
||
"value-inner": "monitor_value-inner_3E9Ou",
|
||
"valueInner": "monitor_value-inner_3E9Ou",
|
||
"list-input": "monitor_list-input_3kw5o",
|
||
"listInput": "monitor_list-input_3kw5o",
|
||
"remove-button": "monitor_remove-button_AhlwG",
|
||
"removeButton": "monitor_remove-button_AhlwG",
|
||
"add-button": "monitor_add-button_2lmvI",
|
||
"addButton": "monitor_add-button_2lmvI",
|
||
"resize-handle": "monitor_resize-handle_3WWBV",
|
||
"resizeHandle": "monitor_resize-handle_3WWBV",
|
||
"footer-length": "monitor_footer-length_2_QAb",
|
||
"footerLength": "monitor_footer-length_2_QAb"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/play-button/play-button.css":
|
||
/*!***********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/play-button/play-button.css ***!
|
||
\***********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ .play-button_play-button_3MkN- {\n display: flex;\n align-items: center;\n justify-content: center;\n\n overflow: hidden; /* Mask the icon animation */\n width: 2.5rem;\n height: 2.5rem;\n background-color: hsla(300, 53%, 60%, 1);\n color: hsla(0, 100%, 100%, 1);\n border-radius: 50%;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: pointer;\n transition: all 0.15s ease-out;\n} .play-button_play-button_3MkN- {\n position: absolute;\n top: .5rem;\n z-index: auto;\n} .play-button_play-button_3MkN-:focus {\n outline: none;\n} .play-button_play-icon_CX5nH {\n width: 50%;\n} [dir=\"ltr\"] .play-button_play-button_3MkN- {\n right: .5rem;\n} [dir=\"rtl\"] .play-button_play-button_3MkN- {\n left: .5rem;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"play-button": "play-button_play-button_3MkN-",
|
||
"playButton": "play-button_play-button_3MkN-",
|
||
"play-icon": "play-button_play-icon_CX5nH",
|
||
"playIcon": "play-button_play-icon_CX5nH"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/prompt/prompt.css":
|
||
/*!*************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/prompt/prompt.css ***!
|
||
\*************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ .prompt_modal-content_1BfWj {\n width: 360px;\n} .prompt_body_18Z-I {\n background: hsla(0, 100%, 100%, 1);\n padding: 1.5rem 2.25rem;\n} [theme=\"dark\"] .prompt_body_18Z-I {\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n} .prompt_body_18Z-I input[type=\"checkbox\"],\n.prompt_body_18Z-I input[type=\"radio\"] {\n margin: 3px;\n} .prompt_label_tWjYZ {\n font-weight: 500;\n margin: 0 0 0.75rem;\n} .prompt_disabled-label_3Y-7h {\n opacity: 0.5;\n} .prompt_variable-name-text-input_1iu8- {\n margin-bottom: 1.5rem;\n width: 100%;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 5px;\n padding: 0 1rem;\n height: 3rem;\n color: hsla(225, 15%, 40%, 0.75);\n font-size: .875rem;\n} [theme=\"dark\"] .prompt_variable-name-text-input_1iu8- {\n background: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n color: white;\n} .prompt_info-message_-WcQL {\n font-weight: normal;\n font-size: .875rem;\n margin-bottom: 1.5rem;\n text-align: center;\n} .prompt_options-row_36JmB {\n display: flex;\n font-weight: normal;\n justify-content: space-between;\n margin-bottom: 1.5rem;\n} .prompt_button-row_3Wc5Z {\n font-weight: bolder;\n text-align: right;\n} .prompt_button-row_3Wc5Z button {\n padding: 0.75rem 1rem;\n border-radius: 0.25rem;\n background: white;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n font-weight: 600;\n font-size: 0.85rem;\n} .prompt_button-row_3Wc5Z button.prompt_ok-button_3QFdD {\n background: hsla(0, 100%, 65%, 1);\n border: hsla(0, 100%, 65%, 1);\n color: white;\n} [dir=\"ltr\"] .prompt_button-row_3Wc5Z button + button {\n margin-left: 0.5rem;\n} [dir=\"rtl\"] .prompt_button-row_3Wc5Z button + button {\n margin-right: 0.5rem;\n} .prompt_cloud-option_1jjSa {\n display:flex;\n border-top: 1px dashed hsla(0, 0%, 0%, .25);\n overflow: visible;\n padding: 1rem 0;\n text-align: center;\n width: 100%;\n margin: 0 auto;\n} [theme=\"dark\"] .prompt_cloud-option_1jjSa {\n border-color: rgba(255, 255, 255, .25);\n} .prompt_cloud-option-text_P1r8J {\n opacity: .5;\n} .prompt_cancel-button_36cPC {\n color: black;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-content": "prompt_modal-content_1BfWj",
|
||
"modalContent": "prompt_modal-content_1BfWj",
|
||
"body": "prompt_body_18Z-I",
|
||
"label": "prompt_label_tWjYZ",
|
||
"disabled-label": "prompt_disabled-label_3Y-7h",
|
||
"disabledLabel": "prompt_disabled-label_3Y-7h",
|
||
"variable-name-text-input": "prompt_variable-name-text-input_1iu8-",
|
||
"variableNameTextInput": "prompt_variable-name-text-input_1iu8-",
|
||
"info-message": "prompt_info-message_-WcQL",
|
||
"infoMessage": "prompt_info-message_-WcQL",
|
||
"options-row": "prompt_options-row_36JmB",
|
||
"optionsRow": "prompt_options-row_36JmB",
|
||
"button-row": "prompt_button-row_3Wc5Z",
|
||
"buttonRow": "prompt_button-row_3Wc5Z",
|
||
"ok-button": "prompt_ok-button_3QFdD",
|
||
"okButton": "prompt_ok-button_3QFdD",
|
||
"cloud-option": "prompt_cloud-option_1jjSa",
|
||
"cloudOption": "prompt_cloud-option_1jjSa",
|
||
"cloud-option-text": "prompt_cloud-option-text_P1r8J",
|
||
"cloudOptionText": "prompt_cloud-option-text_P1r8J",
|
||
"cancel-button": "prompt_cancel-button_36cPC",
|
||
"cancelButton": "prompt_cancel-button_36cPC"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/question/question.css":
|
||
/*!*****************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/question/question.css ***!
|
||
\*****************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n.question_question-container_OuJwy {\n margin: 0.5rem;\n border: 1px solid hsla(0, 0%, 0%, 0.15);\n border-radius: 0.5rem;\n border-width: 2px;\n padding: 1rem;\n background: white;\n}\n\n.question_question-label_1tRo2 {\n font-size: 0.75rem;\n font-weight: bold;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n color: hsla(225, 15%, 40%, 1);\n padding-bottom: 0.5rem;\n}\n\n.question_question-input_1oAB7 {\n display: flex; /* Keeps the input from going outside this container */\n position: relative;\n}\n\n/* tw: input should not look different in dark mode */\n\n[theme=\"dark\"] .question_question-input_1oAB7 input {\n color: hsla(225, 15%, 40%, 1);\n background: hsla(215, 75%, 95%, 1);\n border-color: hsla(215, 50%, 90%, 1);\n}\n\n[theme=\"dark\"] .question_question-input_1oAB7 input:hover,\n[theme=\"dark\"] .question_question-input_1oAB7 input:focus {\n border-color: hsla(0, 100%, 65%, 1);\n}\n\n.question_question-submit-button_3nYah {\n position: absolute;\n top: calc(0.5rem / 2);\n\n width: calc(2rem - 0.5rem);\n height: calc(2rem - 0.5rem);\n\n border: none;\n border-radius: 100%;\n\n color: white;\n background: hsla(0, 100%, 65%, 1);\n}\n\n[dir=\"ltr\"] .question_question-submit-button_3nYah {\n right: calc(0.5rem / 2);\n}\n\n[dir=\"rtl\"] .question_question-submit-button_3nYah {\n left: calc(0.5rem / 2);\n}\n\n/* Input overrides: width, font-weight, focus outline and padding */\n\n.question_question-input_1oAB7 > input {\n width: 100%;\n font-weight: normal;\n}\n\n[dir=\"ltr\"] .question_question-input_1oAB7 > input {\n padding: 0 2rem 0 .75rem; /* To make room for the submit button */\n}\n\n[dir=\"rtl\"] .question_question-input_1oAB7 > input {\n padding: 0 .75rem 0 2rem; /* To make room for the submit button */\n}\n\n.question_question-input_1oAB7 > input:focus {\n box-shadow: 0px 0px 0px 3px hsla(0, 100%, 65%, 0.35);\n}\n\n.question_question-submit-button-icon_upm57 {\n width: calc(2rem - 0.5rem);\n height: calc(2rem - 0.5rem);\n position: relative;\n right: -7px;\n left: -7px;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"question-container": "question_question-container_OuJwy",
|
||
"questionContainer": "question_question-container_OuJwy",
|
||
"question-label": "question_question-label_1tRo2",
|
||
"questionLabel": "question_question-label_1tRo2",
|
||
"question-input": "question_question-input_1oAB7",
|
||
"questionInput": "question_question-input_1oAB7",
|
||
"question-submit-button": "question_question-submit-button_3nYah",
|
||
"questionSubmitButton": "question_question-submit-button_3nYah",
|
||
"question-submit-button-icon": "question_question-submit-button-icon_upm57",
|
||
"questionSubmitButtonIcon": "question_question-submit-button-icon_upm57"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/record-modal/record-modal.css":
|
||
/*!*************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/record-modal/record-modal.css ***!
|
||
\*************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ .record-modal_modal-content_2N7lD {\n width: 600px;\n} .record-modal_body_2VO4l {\n background: hsla(0, 100%, 100%, 1);\n padding: 1.5rem 2.25rem;\n} [theme=\"dark\"] .record-modal_body_2VO4l {\n background: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n} .record-modal_visualization-container_1joZn {\n display: flex;\n justify-content: space-around;\n} .record-modal_meter-container_3OqCJ, .record-modal_waveform-container__ay3Q {\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 5px;\n padding: 3px;\n /* Force these to be on their own render layer because they update often */\n transform: translateZ(0);\n} .record-modal_meter-container_3OqCJ {\n margin-right: 5px;\n height: 180px;\n} .record-modal_waveform-container__ay3Q {\n display: flex;\n justify-content: space-around;\n align-items: center;\n width: 100%;\n height: 180px;\n position: relative;\n} .record-modal_help-text_Jevsk {\n margin: 10px auto 0;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n color: rgb(167, 170, 181);\n font-size: 0.95rem;\n font-weight: 500;\n} .record-modal_playing-text_1tknI {\n color: hsla(0, 100%, 65%, 1);\n} .record-modal_recording-text_2LS7_ {\n color: hsla(20, 100%, 55%, 1);\n} .record-modal_main-button-row_37Zjz {\n display: flex;\n justify-content: space-around;\n margin-top: 15px;\n} .record-modal_main-button-row_37Zjz button {\n padding: 0.5rem 0.75rem;\n border-radius: 0.25rem;\n background: transparent;\n border: none;\n} .record-modal_main-button-row_37Zjz button:disabled {\n opacity: 0.25;\n} .record-modal_main-button-row_37Zjz button:active, .record-modal_main-button-row_37Zjz button:focus {\n outline: none;\n} .record-modal_button-row_1hdGe {\n font-weight: bolder;\n text-align: right;\n display: flex;\n justify-content: space-between;\n} .record-modal_button-row_1hdGe button {\n padding: 0.75rem 1rem;\n border-radius: 0.25rem;\n background: white;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n font-weight: 600;\n font-size: 0.85rem;\n color: hsla(0, 100%, 65%, 1);\n} .record-modal_button-row_1hdGe button.record-modal_ok-button_3pudV {\n background: hsla(0, 100%, 65%, 1);\n border: hsla(0, 100%, 65%, 1);\n color: white;\n} .record-modal_button-row_1hdGe button + button {\n margin-left: 0.5rem;\n} .record-modal_main-button_36gPw {\n text-align: center;\n} .record-modal_record-button_3mcC8 {\n overflow: visible;\n} .record-modal_record-button-circle_kXioI {\n fill: hsla(20, 100%, 55%, 1);\n stroke: hsla(20, 100%, 45%, 1);\n} .record-modal_record-button-circle-outline_1ycFu {\n fill: hsla(20, 100%, 55%, 1);\n opacity: 0.2;\n transition: 0.1s;\n} [dir=\"rtl\"] .record-modal_rerecord-button_jgsi_ img {\n transform: scaleX(-1);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-content": "record-modal_modal-content_2N7lD",
|
||
"modalContent": "record-modal_modal-content_2N7lD",
|
||
"body": "record-modal_body_2VO4l",
|
||
"visualization-container": "record-modal_visualization-container_1joZn",
|
||
"visualizationContainer": "record-modal_visualization-container_1joZn",
|
||
"meter-container": "record-modal_meter-container_3OqCJ",
|
||
"meterContainer": "record-modal_meter-container_3OqCJ",
|
||
"waveform-container": "record-modal_waveform-container__ay3Q",
|
||
"waveformContainer": "record-modal_waveform-container__ay3Q",
|
||
"help-text": "record-modal_help-text_Jevsk",
|
||
"helpText": "record-modal_help-text_Jevsk",
|
||
"playing-text": "record-modal_playing-text_1tknI",
|
||
"playingText": "record-modal_playing-text_1tknI",
|
||
"recording-text": "record-modal_recording-text_2LS7_",
|
||
"recordingText": "record-modal_recording-text_2LS7_",
|
||
"main-button-row": "record-modal_main-button-row_37Zjz",
|
||
"mainButtonRow": "record-modal_main-button-row_37Zjz",
|
||
"button-row": "record-modal_button-row_1hdGe",
|
||
"buttonRow": "record-modal_button-row_1hdGe",
|
||
"ok-button": "record-modal_ok-button_3pudV",
|
||
"okButton": "record-modal_ok-button_3pudV",
|
||
"main-button": "record-modal_main-button_36gPw",
|
||
"mainButton": "record-modal_main-button_36gPw",
|
||
"record-button": "record-modal_record-button_3mcC8",
|
||
"recordButton": "record-modal_record-button_3mcC8",
|
||
"record-button-circle": "record-modal_record-button-circle_kXioI",
|
||
"recordButtonCircle": "record-modal_record-button-circle_kXioI",
|
||
"record-button-circle-outline": "record-modal_record-button-circle-outline_1ycFu",
|
||
"recordButtonCircleOutline": "record-modal_record-button-circle-outline_1ycFu",
|
||
"rerecord-button": "record-modal_rerecord-button_jgsi_",
|
||
"rerecordButton": "record-modal_rerecord-button_jgsi_"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/slider-prompt/slider-prompt.css":
|
||
/*!***************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/slider-prompt/slider-prompt.css ***!
|
||
\***************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ .slider-prompt_modal-content_2vVm4 {\n width: 360px;\n} .slider-prompt_body_2ZkXL {\n background: hsla(0, 100%, 100%, 1);\n padding: 1.5rem 2.25rem;\n} [theme=\"dark\"] .slider-prompt_body_2ZkXL {\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n} .slider-prompt_label_cYsiu {\n font-weight: 500;\n margin: 0 0 0.75rem;\n} .slider-prompt_min-input_1IxXX, .slider-prompt_max-input_1Nwbv {\n margin-bottom: 1.5rem;\n width: 100%;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 5px;\n padding: 0 1rem;\n height: 3rem;\n color: hsla(225, 15%, 40%, 0.75);\n font-size: .875rem;\n} [theme=\"dark\"] .slider-prompt_min-input_1IxXX, [theme=\"dark\"] .slider-prompt_max-input_1Nwbv {\n background: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n color: white;\n} .slider-prompt_button-row_32aCX {\n font-weight: bolder;\n text-align: right;\n} .slider-prompt_button-row_32aCX button {\n padding: 0.75rem 1rem;\n border-radius: 0.25rem;\n background: white;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n font-weight: 600;\n font-size: 0.85rem;\n} .slider-prompt_button-row_32aCX button.slider-prompt_ok-button_vLj7c {\n background: hsla(0, 100%, 65%, 1);\n border: hsla(0, 100%, 65%, 1);\n color: white;\n} [dir=\"ltr\"] .slider-prompt_button-row_32aCX button + button {\n margin-left: 0.5rem;\n} [dir=\"rtl\"] .slider-prompt_button-row_32aCX button + button {\n margin-right: 0.5rem;\n} .slider-prompt_cancel-button_RuYHK {\n color: black;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-content": "slider-prompt_modal-content_2vVm4",
|
||
"modalContent": "slider-prompt_modal-content_2vVm4",
|
||
"body": "slider-prompt_body_2ZkXL",
|
||
"label": "slider-prompt_label_cYsiu",
|
||
"min-input": "slider-prompt_min-input_1IxXX",
|
||
"minInput": "slider-prompt_min-input_1IxXX",
|
||
"max-input": "slider-prompt_max-input_1Nwbv",
|
||
"maxInput": "slider-prompt_max-input_1Nwbv",
|
||
"button-row": "slider-prompt_button-row_32aCX",
|
||
"buttonRow": "slider-prompt_button-row_32aCX",
|
||
"ok-button": "slider-prompt_ok-button_vLj7c",
|
||
"okButton": "slider-prompt_ok-button_vLj7c",
|
||
"cancel-button": "slider-prompt_cancel-button_RuYHK",
|
||
"cancelButton": "slider-prompt_cancel-button_RuYHK"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/sound-editor/sound-editor.css":
|
||
/*!*************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/sound-editor/sound-editor.css ***!
|
||
\*************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ .sound-editor_editor-container_iUSW- {\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n padding: calc(2 * 0.5rem);\n} .sound-editor_row_3iFzH {\n display: flex;\n flex-direction: row;\n align-items: center;\n} [dir=\"rtl\"] .sound-editor_row-reverse_1qAAx {\n flex-direction: row-reverse;\n} .sound-editor_row_3iFzH + .sound-editor_row_3iFzH {\n margin-top: calc(2 * 0.5rem);\n} .sound-editor_input-group_2hWiH {\n display: flex;\n flex-direction: row;\n} [dir=\"ltr\"] .sound-editor_input-group_2hWiH + .sound-editor_input-group_2hWiH {\n margin-left: calc(2 * 0.5rem);\n} [dir=\"rtl\"] .sound-editor_input-group_2hWiH + .sound-editor_input-group_2hWiH {\n margin-right: calc(2 * 0.5rem);\n} [dir=\"ltr\"] .sound-editor_input-group_2hWiH {\n padding-right: calc(2 * 0.5rem);\n border-right: 1px dashed var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n} [dir=\"rtl\"] .sound-editor_input-group_2hWiH {\n padding-left: calc(2 * 0.5rem);\n border-left: 1px dashed var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n} [dir=\"rtl\"] .sound-editor_row-reverse_1qAAx > .sound-editor_input-group_2hWiH {\n padding-left: 0;\n padding-right: calc(2 * 0.5rem);\n border-left: none;\n border-right: 1px dashed var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n} .sound-editor_name-input_2Msmq {\n width: 100%;\n} .sound-editor_waveform-container_1x_b1 {\n display: flex;\n justify-content: space-around;\n align-items: center;\n width: 100%;\n\n position: relative;\n\n background: hsla(300, 53%, 60%, 0.15);\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 5px;\n\n margin-top: 20px;\n margin-bottom: 20px;\n} .sound-editor_button_1_6Li {\n height: 2rem;\n padding: 0.35rem;\n outline: none;\n background: white;\n border-radius: 0.25rem;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n cursor: pointer;\n font-size: 0.85rem;\n transition: 0.2s;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n margin: 0px;\n} [theme=\"dark\"] .sound-editor_button_1_6Li {\n background-color: var(--ui-primary, hsla(215, 100%, 95%, 1));\n} .sound-editor_button_1_6Li > img {\n flex-grow: 1;\n max-width: 100%;\n max-height: 100%;\n min-width: 1.25rem;\n} .sound-editor_round-button-outer_2hM-8 {\n display: flex;\n align-items: center;\n height: 100%;\n} .sound-editor_round-button_3NLcW {\n height: 3rem;\n width: 3rem;\n outline: none;\n background: hsla(0, 100%, 65%, 1);\n border-radius: 100%;\n border: 4px solid hsla(0, 100%, 100%, 0.75);\n cursor: pointer;\n padding: 0.75rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n} [theme=\"dark\"] .sound-editor_round-button_3NLcW {\n border-color: transparent;\n} .sound-editor_round-button_3NLcW > img {\n flex-grow: 1;\n max-width: 100%;\n max-height: 100%;\n /*min-width: 1.5rem;*/\n} [dir=\"rtl\"] .sound-editor_undo-icon_So0sO, [dir=\"rtl\"] .sound-editor_redo-icon_XGcr5 {\n transform: scaleX(-1);\n} .sound-editor_trim-button_lSENI {\n display: flex;\n align-items: center;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n font-size: 0.625rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n\n} [dir=\"ltr\"] .sound-editor_trim-button_lSENI {\n margin-left: 1rem;\n} [dir=\"rtl\"] .sound-editor_trim-button_lSENI {\n margin-right: 1rem;\n} .sound-editor_trim-button_lSENI > img {\n width: 1.25rem;\n} .sound-editor_effects_ywFdO {\n display: flex;\n flex-wrap: wrap;\n width: 100%;\n} .sound-editor_effect-button_2zuzT {\n flex-basis: 60px;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n font-size: 0.625rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n padding: 0.25rem 0;\n} .sound-editor_effect-button_2zuzT + .sound-editor_effect-button_2zuzT {\n margin: 0;\n} .sound-editor_effect-button_2zuzT img {\n width: 1.25rem;\n height: 1.25rem;\n margin-bottom: -0.375rem;\n} .sound-editor_tool-button_2iNn9 {\n flex-basis: 60px;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n font-size: 0.625rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n padding: 0.25rem 0;\n} .sound-editor_tool-button_2iNn9 + .sound-editor_tool-button_2iNn9 {\n margin: 0;\n} .sound-editor_tool-button_2iNn9 img {\n width: 4rem;\n height: 1.5rem;\n margin-bottom: -0.375rem;\n} [dir=\"rtl\"] .sound-editor_flip-in-rtl_3eOfH img {\n transform: scaleX(-1);\n} [dir=\"ltr\"] .sound-editor_button-group_SFPoV {\n margin-left: 1rem;\n} [dir=\"rtl\"] .sound-editor_button-group_SFPoV {\n margin-right: 1rem;\n} .sound-editor_button-group_SFPoV {\n display: flex;\n} .sound-editor_button-group_SFPoV .sound-editor_button_1_6Li {\n border-radius: 0;\n} [dir=\"ltr\"] .sound-editor_button-group_SFPoV .sound-editor_button_1_6Li {\n border-left: none;\n} [dir=\"rtl\"] .sound-editor_button-group_SFPoV .sound-editor_button_1_6Li {\n border-right: none;\n} [dir=\"ltr\"] .sound-editor_button-group_SFPoV .sound-editor_button_1_6Li:last-of-type {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n} [dir=\"ltr\"] .sound-editor_button-group_SFPoV .sound-editor_button_1_6Li:first-of-type {\n border-left: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n} [dir=\"rtl\"] .sound-editor_button-group_SFPoV .sound-editor_button_1_6Li:last-of-type {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n} [dir=\"rtl\"] .sound-editor_button-group_SFPoV .sound-editor_button_1_6Li:first-of-type {\n border-right: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n} .sound-editor_button_1_6Li:disabled > img {\n opacity: 0.25;\n} .sound-editor_info-row_33dW3 {\n display: flex;\n justify-content: space-between;\n margin-top: calc(2 * 0.5rem);\n} .sound-editor_duration_Iq75P {\n font-weight: bold;\n} .sound-editor_advanced-info_IEJgw {\n\n} .sound-editor_alert_DhPBO {\n margin-top: calc(2 * 0.5rem);\n border-radius: 5px;\n padding: 0.5rem;\n display: flex;\n align-items: center;\n border-width: 1px;\n border-style: solid;\n} .sound-editor_stereo_1cklI {\n background-color: rgba(145, 145, 255, 0.3);\n border-color: rgb(145, 145, 255)\n} .sound-editor_too-large_2e10L {\n background-color: rgba(255, 119, 0, 0.3);\n border-color: rgb(255, 119, 0);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"editor-container": "sound-editor_editor-container_iUSW-",
|
||
"editorContainer": "sound-editor_editor-container_iUSW-",
|
||
"row": "sound-editor_row_3iFzH",
|
||
"row-reverse": "sound-editor_row-reverse_1qAAx",
|
||
"rowReverse": "sound-editor_row-reverse_1qAAx",
|
||
"input-group": "sound-editor_input-group_2hWiH",
|
||
"inputGroup": "sound-editor_input-group_2hWiH",
|
||
"name-input": "sound-editor_name-input_2Msmq",
|
||
"nameInput": "sound-editor_name-input_2Msmq",
|
||
"waveform-container": "sound-editor_waveform-container_1x_b1",
|
||
"waveformContainer": "sound-editor_waveform-container_1x_b1",
|
||
"button": "sound-editor_button_1_6Li",
|
||
"round-button-outer": "sound-editor_round-button-outer_2hM-8",
|
||
"roundButtonOuter": "sound-editor_round-button-outer_2hM-8",
|
||
"round-button": "sound-editor_round-button_3NLcW",
|
||
"roundButton": "sound-editor_round-button_3NLcW",
|
||
"undo-icon": "sound-editor_undo-icon_So0sO",
|
||
"undoIcon": "sound-editor_undo-icon_So0sO",
|
||
"redo-icon": "sound-editor_redo-icon_XGcr5",
|
||
"redoIcon": "sound-editor_redo-icon_XGcr5",
|
||
"trim-button": "sound-editor_trim-button_lSENI",
|
||
"trimButton": "sound-editor_trim-button_lSENI",
|
||
"effects": "sound-editor_effects_ywFdO",
|
||
"effect-button": "sound-editor_effect-button_2zuzT",
|
||
"effectButton": "sound-editor_effect-button_2zuzT",
|
||
"tool-button": "sound-editor_tool-button_2iNn9",
|
||
"toolButton": "sound-editor_tool-button_2iNn9",
|
||
"flip-in-rtl": "sound-editor_flip-in-rtl_3eOfH",
|
||
"flipInRtl": "sound-editor_flip-in-rtl_3eOfH",
|
||
"button-group": "sound-editor_button-group_SFPoV",
|
||
"buttonGroup": "sound-editor_button-group_SFPoV",
|
||
"info-row": "sound-editor_info-row_33dW3",
|
||
"infoRow": "sound-editor_info-row_33dW3",
|
||
"duration": "sound-editor_duration_Iq75P",
|
||
"advanced-info": "sound-editor_advanced-info_IEJgw",
|
||
"advancedInfo": "sound-editor_advanced-info_IEJgw",
|
||
"alert": "sound-editor_alert_DhPBO",
|
||
"stereo": "sound-editor_stereo_1cklI",
|
||
"too-large": "sound-editor_too-large_2e10L",
|
||
"tooLarge": "sound-editor_too-large_2e10L"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/spinner/spinner.css":
|
||
/*!***************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/spinner/spinner.css ***!
|
||
\***************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .spinner_spinner_2Op8D {\n width: 1.25rem;\n height: 1.25rem;\n display: inline-block;\n position: relative;\n border-radius: 50%;\n border-width: .1875rem;\n border-style: solid;\n border-color: hsla(0, 100%, 100%, 0.25);\n box-sizing: content-box;\n} .spinner_spinner_2Op8D::before, .spinner_spinner_2Op8D::after {\n width: 1.25rem;\n height: 1.25rem;\n content: '';\n border-radius: 50%;\n display: block;\n} .spinner_spinner_2Op8D::after {\n position: absolute;\n top: -.1875rem;\n left: -.1875rem;\n border: .1875rem solid transparent;\n border-top-color: hsla(0, 100%, 100%, 1);\n animation: spinner_spin_1ge20 1.5s cubic-bezier(0.4, 0.1, 0.4, 1) infinite;\n} .spinner_small_1RsxO {\n width: .5rem;\n height: .5rem;\n} .spinner_small_1RsxO::before, .spinner_small_1RsxO::after {\n width: .5rem;\n height: .5rem;\n} .spinner_large_M0-Ov {\n width: 2.5rem;\n height: 2.5rem;\n} .spinner_large_M0-Ov::before, .spinner_large_M0-Ov::after {\n width: 2.5rem;\n height: 2.5rem;\n} @keyframes spinner_spin_1ge20 {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n} .spinner_spinner_2Op8D.spinner_success_2bEvy {\n border-color: hsla(10, 85%, 65%, 0.35);\n} .spinner_spinner_2Op8D.spinner_success_2bEvy::after {\n border-top-color: hsla(10, 85%, 65%, 1);\n} .spinner_spinner_2Op8D.spinner_warn_3KZAv {\n border-color: hsla(30, 100%, 55%, 0.25);\n} .spinner_spinner_2Op8D.spinner_warn_3KZAv::after {\n border-top-color: hsla(30, 100%, 55%, 1);\n} .spinner_spinner_2Op8D.spinner_info_2g2-l {\n border-color: hsla(0, 100%, 100%, 0.25);\n} .spinner_spinner_2Op8D.spinner_info_2g2-l::after {\n border-top-color: hsla(0, 100%, 100%, 1);\n} .spinner_spinner_2Op8D.spinner_primary_32PLs {\n border-color: hsla(0, 100%, 65%, 0.35);\n} .spinner_spinner_2Op8D.spinner_primary_32PLs::after {\n border-top-color: hsla(0, 100%, 65%, 1);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"spinner": "spinner_spinner_2Op8D",
|
||
"spin": "spinner_spin_1ge20",
|
||
"small": "spinner_small_1RsxO",
|
||
"large": "spinner_large_M0-Ov",
|
||
"success": "spinner_success_2bEvy",
|
||
"warn": "spinner_warn_3KZAv",
|
||
"info": "spinner_info_2g2-l",
|
||
"primary": "spinner_primary_32PLs"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/sprite-info/sprite-info.css":
|
||
/*!***********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/sprite-info/sprite-info.css ***!
|
||
\***********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n.sprite-info_sprite-info_3EyZh {\n padding: 0.75rem;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n background-color: white;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n border-top-left-radius: 0.5rem;\n border-top-right-radius: 0.5rem;\n border-bottom: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n\n[theme=\"dark\"] .sprite-info_sprite-info_3EyZh {\n background-color: var(--ui-primary, hsla(215, 100%, 95%, 1));\n}\n\n.sprite-info_row_1om5V {\n display: flex;\n justify-content: space-between;\n}\n\n.sprite-info_row-primary_10JrS {\n margin-bottom: 0.5rem;\n}\n\n.sprite-info_label_258mm { opacity: 0.8; }\n\n.sprite-info_group_14-B_ {\n display: inline-flex;\n flex-direction: row; /* makes columns, for each label/form group */\n align-items: center;\n}\n\n.sprite-info_column_EFIdF {\n display: inline-flex;\n flex-direction: column; /* put label above input */\n align-items: flex-start;\n}\n\n.sprite-info_column_EFIdF span {\n margin-bottom: .25rem;\n}\n\n.sprite-info_icon-wrapper_3Wbqq {\n display: inline-block;\n width: calc(2rem + 2px);\n height: calc(2rem + 2px);\n padding: 0.5rem;\n outline: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.sprite-info_icon_1iZ_9 {\n width: 100%;\n height: 100%;\n}\n\n/* @todo: refactor radio divs to input */\n\n.sprite-info_radio-wrapper_1OHDS {\n white-space: nowrap; /* make sure visibilty buttons don't wrap */\n}\n\n.sprite-info_radio_v-fgn {\n filter: saturate(0);\n cursor: pointer;\n}\n\n.sprite-info_radio_v-fgn.sprite-info_is-active_ewF6e {\n filter: none;\n}\n\n.sprite-info_radio_v-fgn.sprite-info_is-disabled_1_MCi {\n cursor: default;\n}\n\n.sprite-info_radio-first_3xgJB {\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n\n[dir=\"ltr\"] .sprite-info_radio-first_3xgJB {\n border-top-left-radius: calc(0.5rem / 2);\n border-bottom-left-radius: calc(0.5rem / 2);\n}\n\n[dir=\"rtl\"] .sprite-info_radio-first_3xgJB {\n border-top-right-radius: calc(0.5rem / 2);\n border-bottom-right-radius: calc(0.5rem / 2);\n}\n\n.sprite-info_radio-first_3xgJB:focus {\n border-color: hsla(0, 100%, 65%, 1);\n box-shadow: inset 0 0 0 -2px var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n\n.sprite-info_radio-last_3Ps65 {\n border-bottom: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-top: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n\n[dir=\"ltr\"] .sprite-info_radio-last_3Ps65 {\n border-right: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-left: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-top-right-radius: calc(0.5rem / 2);\n border-bottom-right-radius: calc(0.5rem / 2);\n}\n\n[dir=\"rtl\"] .sprite-info_radio-last_3Ps65 {\n border-left: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-right: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-top-left-radius: calc(0.5rem / 2);\n border-bottom-left-radius: calc(0.5rem / 2);\n}\n\n.sprite-info_radio-last_3Ps65:focus {\n border-color: hsla(0, 100%, 65%, 1);\n box-shadow: inset 0 0 0 -2px var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n}\n\n.sprite-info_icon_1iZ_9 {\n width: 100%;\n height: 100%;\n pointer-events: none;\n}\n\n.sprite-info_rotation-select_17OlD {\n width: 100%;\n height: 1.85rem;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n outline: none;\n}\n\n.sprite-info_rotation-select_17OlD:focus {\n border-color: hsla(0, 100%, 65%, 1);\n box-shadow: inset 0 0 0 1px var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15)));\n}\n\n.sprite-info_larger-input_1UEs0 input {\n width: 4rem;\n}\n\n.sprite-info_sprite-input_17wjb {\n width: 8rem;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"sprite-info": "sprite-info_sprite-info_3EyZh",
|
||
"spriteInfo": "sprite-info_sprite-info_3EyZh",
|
||
"row": "sprite-info_row_1om5V",
|
||
"row-primary": "sprite-info_row-primary_10JrS",
|
||
"rowPrimary": "sprite-info_row-primary_10JrS",
|
||
"label": "sprite-info_label_258mm",
|
||
"group": "sprite-info_group_14-B_",
|
||
"column": "sprite-info_column_EFIdF",
|
||
"icon-wrapper": "sprite-info_icon-wrapper_3Wbqq",
|
||
"iconWrapper": "sprite-info_icon-wrapper_3Wbqq",
|
||
"icon": "sprite-info_icon_1iZ_9",
|
||
"radio-wrapper": "sprite-info_radio-wrapper_1OHDS",
|
||
"radioWrapper": "sprite-info_radio-wrapper_1OHDS",
|
||
"radio": "sprite-info_radio_v-fgn",
|
||
"is-active": "sprite-info_is-active_ewF6e",
|
||
"isActive": "sprite-info_is-active_ewF6e",
|
||
"is-disabled": "sprite-info_is-disabled_1_MCi",
|
||
"isDisabled": "sprite-info_is-disabled_1_MCi",
|
||
"radio-first": "sprite-info_radio-first_3xgJB",
|
||
"radioFirst": "sprite-info_radio-first_3xgJB",
|
||
"radio-last": "sprite-info_radio-last_3Ps65",
|
||
"radioLast": "sprite-info_radio-last_3Ps65",
|
||
"rotation-select": "sprite-info_rotation-select_17OlD",
|
||
"rotationSelect": "sprite-info_rotation-select_17OlD",
|
||
"larger-input": "sprite-info_larger-input_1UEs0",
|
||
"largerInput": "sprite-info_larger-input_1UEs0",
|
||
"sprite-input": "sprite-info_sprite-input_17wjb",
|
||
"spriteInput": "sprite-info_sprite-input_17wjb"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/sprite-selector-item/sprite-selector-item.css":
|
||
/*!*****************************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/sprite-selector-item/sprite-selector-item.css ***!
|
||
\*****************************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n/* @todo: refactor this class name, and component: `sprite-selector` to `sprite` */\n\n.sprite-selector-item_sprite-selector-item_kQm-i {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n position: relative;\n\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 0.8rem;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n border-width: 2px;\n border-style: solid;\n border-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 0.5rem;\n\n text-align: center;\n cursor: pointer;\n\n -webkit-user-select: none;\n\n -moz-user-select: none;\n\n -ms-user-select: none;\n\n user-select: none;\n}\n\n.sprite-selector-item_sprite-selector-item_kQm-i.sprite-selector-item_is-selected_24tQj {\n box-shadow: 0px 0px 0px 4px hsla(0, 100%, 65%, 0.35);\n border: 2px solid hsla(0, 100%, 65%, 1);\n background: hsla(0, 100%, 100%, 1);\n}\n\n[theme=\"dark\"] .sprite-selector-item_sprite-selector-item_kQm-i.sprite-selector-item_is-selected_24tQj {\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n}\n\n.sprite-selector-item_sprite-selector-item_kQm-i:hover {\n border: 2px solid hsla(0, 100%, 65%, 1);\n background: hsla(0, 100%, 100%, 1);\n}\n\n[theme=\"dark\"] .sprite-selector-item_sprite-selector-item_kQm-i:hover {\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n}\n\n.sprite-selector-item_sprite-selector-item_kQm-i:hover .sprite-selector-item_sprite-image_2QWuK, .sprite-selector-item_is-selected_24tQj .sprite-selector-item_sprite-image_2QWuK {\n filter: drop-shadow(0px 0px 2px var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15)));\n}\n\n/* Outer/Inner chicanery is to prevent layouts when sprite image changes */\n\n.sprite-selector-item_sprite-image-outer_Xs0wN {\n position: relative;\n width: 100%;\n height: 100%;\n transform: translateZ(0);\n}\n\n.sprite-selector-item_sprite-image-inner_3oSwi {\n position: absolute;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.sprite-selector-item_sprite-image_2QWuK {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n pointer-events: none;\n max-width: 32px;\n max-height: 32px;\n}\n\n.sprite-selector-item_sprite-info_-I0i_ {\n padding: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n\n font-size: 0.625rem;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.sprite-selector-item_sprite-name_1PXjh, .sprite-selector-item_sprite-details_2UVpA {\n /*\n For truncating overflowing text gracefully\n Min-width is for a bug: https://css-tricks.com/flexbox-truncated-text\n */\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n\n.sprite-selector-item_sprite-details_2UVpA {\n margin-top: 0.125rem;\n font-size: 0.5rem;\n}\n\n.sprite-selector-item_is-selected_24tQj .sprite-selector-item_sprite-info_-I0i_ {\n background: hsla(0, 100%, 65%, 1);\n color: hsla(0, 100%, 100%, 1);\n}\n\n.sprite-selector-item_delete-button_1rkFW {\n position: absolute;\n top: -.625rem;\n z-index: auto;\n}\n\n[dir=\"ltr\"] .sprite-selector-item_delete-button_1rkFW {\n right: -.625rem;\n}\n\n[dir=\"rtl\"] .sprite-selector-item_delete-button_1rkFW {\n left: -.625rem;\n}\n\n.sprite-selector-item_number_AnXUk {\n position: absolute;\n top: 0.15rem;\n font-size: 0.625rem;\n font-weight: bold;\n z-index: 2;\n}\n\n[dir=\"ltr\"] .sprite-selector-item_number_AnXUk {\n left: 0.15rem;\n}\n\n[dir=\"rtl\"] .sprite-selector-item_number_AnXUk {\n right: 0.15rem;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"sprite-selector-item": "sprite-selector-item_sprite-selector-item_kQm-i",
|
||
"spriteSelectorItem": "sprite-selector-item_sprite-selector-item_kQm-i",
|
||
"is-selected": "sprite-selector-item_is-selected_24tQj",
|
||
"isSelected": "sprite-selector-item_is-selected_24tQj",
|
||
"sprite-image": "sprite-selector-item_sprite-image_2QWuK",
|
||
"spriteImage": "sprite-selector-item_sprite-image_2QWuK",
|
||
"sprite-image-outer": "sprite-selector-item_sprite-image-outer_Xs0wN",
|
||
"spriteImageOuter": "sprite-selector-item_sprite-image-outer_Xs0wN",
|
||
"sprite-image-inner": "sprite-selector-item_sprite-image-inner_3oSwi",
|
||
"spriteImageInner": "sprite-selector-item_sprite-image-inner_3oSwi",
|
||
"sprite-info": "sprite-selector-item_sprite-info_-I0i_",
|
||
"spriteInfo": "sprite-selector-item_sprite-info_-I0i_",
|
||
"sprite-name": "sprite-selector-item_sprite-name_1PXjh",
|
||
"spriteName": "sprite-selector-item_sprite-name_1PXjh",
|
||
"sprite-details": "sprite-selector-item_sprite-details_2UVpA",
|
||
"spriteDetails": "sprite-selector-item_sprite-details_2UVpA",
|
||
"delete-button": "sprite-selector-item_delete-button_1rkFW",
|
||
"deleteButton": "sprite-selector-item_delete-button_1rkFW",
|
||
"number": "sprite-selector-item_number_AnXUk"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/sprite-selector/sprite-selector.css":
|
||
/*!*******************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/sprite-selector/sprite-selector.css ***!
|
||
\*******************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ /*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/ /* Toolbox z-index: 40; set in scratch-blocks */ /* tooltips should go over add buttons if they overlap */ /* monitors go over add buttons */ /* \"ask\" block text input goes above monitors */ /* menu-bar should go over monitors, alerts and tutorials */ /* tw: show below menu bar normally */ /* Block drag z-index: 1000; default 50 is overriden in blocks.css */ /* so it is draggable into other panes */ /* in most interfaces, the context menu is always on top */ .sprite-selector_sprite-selector_2KgCX {\n flex-grow: 1;\n position: relative;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n margin-right: calc(0.5rem / 2);\n background-color: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n border-top-right-radius: 0.5rem;\n border-top-left-radius: 0.5rem;\n border-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-width: 1px;\n border-style: solid;\n border-bottom: 0;\n} .sprite-selector_sprite-wrapper_1C5Mq {\n /*\n Our goal is to fit sprites evenly in a row without leftover space.\n Flexbox's `space between` property gets us close, but doesn't flow\n well when the # of items per row > 1 and less than the max per row.\n\n Solving by explicitly calc'ing the width of each sprite. Setting\n `border-box` simplifies things, because content, padding and\n border-width all are included in the width, leaving us only to subtract\n the left + right margins.\n\n @todo: make room for the scrollbar\n */\n box-sizing: border-box;\n width: calc((100% / 5 ) - 0.5rem);\n max-width: 6rem;\n min-width: 4rem;\n min-height: 4rem; /* @todo: calc height same as width */\n margin: calc(0.5rem / 2);\n} .sprite-selector_sprite_21WnR {\n height: 100%;\n} .sprite-selector_scroll-wrapper_3NNnc {\n /*\n Sets the sprite-selector items as a scrollable pane\n\n @todo: Safari: pane doesn't stretch to fill height;\n @todo: Adding `position: relative` still doesn't fix Safari scrolling pane, and\n also introduces a new bug in Chrome when vertically resizing window down,\n then back up, introduces white space in the outside the page container.\n */\n height: calc(100% - 6rem);\n overflow-y: auto;\n} .sprite-selector_scroll-wrapper-dragging_2QZJG {\n background-color: hsla(0, 100%, 77%, 1);\n} .sprite-selector_items-wrapper_4bcOj {\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n\n padding-top: calc(0.5rem / 2);\n padding-left: calc(0.5rem / 2);\n padding-right: calc(0.5rem / 2);\n padding-bottom: 0.5rem;\n\n overflow: hidden;\n} .sprite-selector_add-button_1XCwG {\n position: absolute;\n bottom: 0.75rem;\n} [dir=\"ltr\"] .sprite-selector_add-button_1XCwG {\n right: 1rem;\n} [dir=\"rtl\"] .sprite-selector_add-button_1XCwG {\n left: 1rem;\n} .sprite-selector_raised_1fkrL {\n background-color: hsla(0, 100%, 77%, 1);\n transition: all 0.25s ease;\n} .sprite-selector_raised_1fkrL:hover {\n background-color: hsla(0, 100%, 77%, 1);\n transform: scale(1.05);\n} .sprite-selector_raised_1fkrL:hover {\n animation-name: sprite-selector_wiggle__tLSA;\n animation-duration: 500ms;\n animation-iteration-count: 1;\n animation-timing-function: ease-in-out;\n background-color: hsla(0, 100%, 77%, 1);\n} @keyframes sprite-selector_wiggle__tLSA {\n 0% {transform: rotate(3deg) scale(1.05);}\n 25% {transform: rotate(-3deg) scale(1.05);}\n 50% {transform: rotate(5deg) scale(1.05);}\n 75% {transform: rotate(-2deg) scale(1.05);}\n 100% {transform: rotate(0deg) scale(1.05);}\n} .sprite-selector_receivedBlocks_24JkN {\n animation: sprite-selector_glowing_3IS0u 250ms;\n} @keyframes sprite-selector_glowing_3IS0u {\n 10% { box-shadow: 0 0 10px #7fff1e; }\n 90% { box-shadow: 0 0 10px #7fff1e; }\n 100% { box-shadow: none; }\n} .sprite-selector_placeholder_2v7G4 > .sprite-selector_sprite_21WnR {\n background: black;\n filter: opacity(15%) brightness(0%);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"sprite-selector": "sprite-selector_sprite-selector_2KgCX",
|
||
"spriteSelector": "sprite-selector_sprite-selector_2KgCX",
|
||
"sprite-wrapper": "sprite-selector_sprite-wrapper_1C5Mq",
|
||
"spriteWrapper": "sprite-selector_sprite-wrapper_1C5Mq",
|
||
"sprite": "sprite-selector_sprite_21WnR",
|
||
"scroll-wrapper": "sprite-selector_scroll-wrapper_3NNnc",
|
||
"scrollWrapper": "sprite-selector_scroll-wrapper_3NNnc",
|
||
"scroll-wrapper-dragging": "sprite-selector_scroll-wrapper-dragging_2QZJG",
|
||
"scrollWrapperDragging": "sprite-selector_scroll-wrapper-dragging_2QZJG",
|
||
"items-wrapper": "sprite-selector_items-wrapper_4bcOj",
|
||
"itemsWrapper": "sprite-selector_items-wrapper_4bcOj",
|
||
"add-button": "sprite-selector_add-button_1XCwG",
|
||
"addButton": "sprite-selector_add-button_1XCwG",
|
||
"raised": "sprite-selector_raised_1fkrL",
|
||
"wiggle": "sprite-selector_wiggle__tLSA",
|
||
"receivedBlocks": "sprite-selector_receivedBlocks_24JkN",
|
||
"glowing": "sprite-selector_glowing_3IS0u",
|
||
"placeholder": "sprite-selector_placeholder_2v7G4"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/stage-header/stage-header.css":
|
||
/*!*************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/stage-header/stage-header.css ***!
|
||
\*************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n/*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/\n\n/* Toolbox z-index: 40; set in scratch-blocks */\n\n/* tooltips should go over add buttons if they overlap */\n\n/* monitors go over add buttons */\n\n/* \"ask\" block text input goes above monitors */\n\n/* menu-bar should go over monitors, alerts and tutorials */\n\n/* tw: show below menu bar normally */\n\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\n\n/* so it is draggable into other panes */\n\n/* in most interfaces, the context menu is always on top */\n\n.stage-header_stage-header-wrapper_1F4gT {\n position: relative;\n}\n\n.stage-header_stage-header-wrapper-overlay_5vfJa {\n position: fixed;\n background-color: rgb(232, 237, 241);\n top: 0;\n left: 0;\n right: 0;\n z-index: 500;\n}\n\n/* tw: support dark mode */\n\n[theme=\"dark\"] .stage-header_stage-header-wrapper-overlay_5vfJa {\n background-color: #111;\n}\n\n/* tw: do not show color in header when embedded */\n\n.stage-header_embedded_nhDjw {\n background-color: transparent;\n}\n\n.stage-header_stage-menu-wrapper_15JJt {\n display: flex;\n margin: auto;\n justify-content: space-between;\n flex-shrink: 0;\n align-items: center;\n height: 2.75rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.stage-header_embed-scratch-logo_2K5GA img {\n height: 1.6rem;\n vertical-align: middle;\n opacity: .6;\n}\n\n.stage-header_stage-size-row_14N65 {\n display: flex;\n}\n\n.stage-header_stage-size-toggle-group_17LtK {\n display: flex;\n}\n\n[dir=\"ltr\"] .stage-header_stage-size-toggle-group_17LtK {\n margin-right: .2rem;\n}\n\n[dir=\"rtl\"] .stage-header_stage-size-toggle-group_17LtK {\n margin-left: .2rem;\n}\n\n.stage-header_stage-button_hkl9B {\n display: block;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: calc(0.5rem / 2);\n width: calc(2rem + 2px);\n height: calc(2rem + 2px);\n background: hsla(0, 100%, 100%, 1);\n padding: 0.375rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: pointer;\n}\n\n[theme=\"dark\"] .stage-header_stage-button_hkl9B {\n background: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n}\n\n.stage-header_stage-button-icon_3zzFK {\n width: 100%;\n height: 100%;\n}\n\n[dir=\"rtl\"] .stage-header_stage-button-icon_3zzFK {\n transform: scaleX(-1);\n}\n\n[dir=\"ltr\"] .stage-header_stage-button-first_y_CLF {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n[dir=\"ltr\"] .stage-header_stage-button-last_eeKZ4 {\n border-left: none;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n[dir=\"rtl\"] .stage-header_stage-button-first_y_CLF {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n[dir=\"rtl\"] .stage-header_stage-button-last_eeKZ4 {\n border-right: none;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.stage-header_stage-button-toggled-off_AJ8yG {\n filter: saturate(0);\n}\n\n[theme=\"dark\"] .stage-header_stage-button-toggled-off_AJ8yG img,\n\n[theme=\"dark\"] .stage-header_stage-button_hkl9B:not(.stage-header_stage-button-first_y_CLF):not(.stage-header_stage-button-last_eeKZ4) img {\n filter: brightness(0) invert(1);\n opacity: 0.8;\n}\n\n.stage-header_embed-buttons_2Q7nj {\n display: flex;\n}\n\n[dir=\"ltr\"] .stage-header_embed-buttons_2Q7nj > *:not(:last-child) {\n margin-right: .2rem;\n}\n\n[dir=\"rtl\"] .stage-header_embed-buttons_2Q7nj > *:not(:last-child) {\n margin-left: .2rem;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"stage-header-wrapper": "stage-header_stage-header-wrapper_1F4gT",
|
||
"stageHeaderWrapper": "stage-header_stage-header-wrapper_1F4gT",
|
||
"stage-header-wrapper-overlay": "stage-header_stage-header-wrapper-overlay_5vfJa",
|
||
"stageHeaderWrapperOverlay": "stage-header_stage-header-wrapper-overlay_5vfJa",
|
||
"embedded": "stage-header_embedded_nhDjw",
|
||
"stage-menu-wrapper": "stage-header_stage-menu-wrapper_15JJt",
|
||
"stageMenuWrapper": "stage-header_stage-menu-wrapper_15JJt",
|
||
"embed-scratch-logo": "stage-header_embed-scratch-logo_2K5GA",
|
||
"embedScratchLogo": "stage-header_embed-scratch-logo_2K5GA",
|
||
"stage-size-row": "stage-header_stage-size-row_14N65",
|
||
"stageSizeRow": "stage-header_stage-size-row_14N65",
|
||
"stage-size-toggle-group": "stage-header_stage-size-toggle-group_17LtK",
|
||
"stageSizeToggleGroup": "stage-header_stage-size-toggle-group_17LtK",
|
||
"stage-button": "stage-header_stage-button_hkl9B",
|
||
"stageButton": "stage-header_stage-button_hkl9B",
|
||
"stage-button-icon": "stage-header_stage-button-icon_3zzFK",
|
||
"stageButtonIcon": "stage-header_stage-button-icon_3zzFK",
|
||
"stage-button-first": "stage-header_stage-button-first_y_CLF",
|
||
"stageButtonFirst": "stage-header_stage-button-first_y_CLF",
|
||
"stage-button-last": "stage-header_stage-button-last_eeKZ4",
|
||
"stageButtonLast": "stage-header_stage-button-last_eeKZ4",
|
||
"stage-button-toggled-off": "stage-header_stage-button-toggled-off_AJ8yG",
|
||
"stageButtonToggledOff": "stage-header_stage-button-toggled-off_AJ8yG",
|
||
"embed-buttons": "stage-header_embed-buttons_2Q7nj",
|
||
"embedButtons": "stage-header_embed-buttons_2Q7nj"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/stage-selector/stage-selector.css":
|
||
/*!*****************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/stage-selector/stage-selector.css ***!
|
||
\*****************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n.stage-selector_stage-selector_3oWOr {\n background-clip: padding-box;\n display: flex;\n flex-direction: column;\n align-items: center;\n position: relative; /* For the add backdrop button */\n flex-grow: 1;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n background-color: hsla(0, 100%, 100%, 1);\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n border-top-left-radius: 0.5rem;\n border-top-right-radius: 0.5rem;\n border-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-width: 1px;\n border-style: solid;\n border-bottom: 0;\n cursor: pointer;\n transition: all 0.25s ease;\n}\n\n[theme=\"dark\"] .stage-selector_stage-selector_3oWOr {\n background-color: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n}\n\n.stage-selector_stage-selector_3oWOr.stage-selector_is-selected_2x2r_ {\n border-top-left-radius: .625rem;\n border-top-right-radius: .625rem;\n border-color: hsla(0, 100%, 65%, 1);\n box-shadow: 0px 0px 0px 4px hsla(0, 100%, 65%, 0.35);\n}\n\n.stage-selector_stage-selector_3oWOr:hover {\n border-color: hsla(0, 100%, 65%, 1);\n}\n\n.stage-selector_header_2GVr1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: calc(2.75rem - 2px);\n background-color: white;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n border-top-left-radius: 0.5rem;\n border-top-right-radius: 0.5rem;\n border-bottom: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n width: 100%;\n transition: background-color 0.25s ease;\n}\n\n[theme=\"dark\"] .stage-selector_header_2GVr1 {\n background-color: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n}\n\n.stage-selector_header-title_33xCt {\n font-size: 0.625rem;\n font-weight: bold;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n\n /* @todo: make this a mixin for all UI text labels */\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n transition: color 0.25s ease;\n}\n\n.stage-selector_stage-selector_3oWOr.stage-selector_is-selected_2x2r_ .stage-selector_header_2GVr1 {\n background-color: hsla(0, 100%, 65%, 1);\n}\n\n.stage-selector_stage-selector_3oWOr.stage-selector_is-selected_2x2r_ .stage-selector_header-title_33xCt {\n color: hsla(0, 100%, 100%, 1);\n}\n\n.stage-selector_count_2QK7D {\n padding: 0.3rem 0.75rem;\n font-size: 0.625rem;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.stage-selector_label_1MCfr {\n margin: 0.75rem 0 0.25rem;\n font-size: 0.6rem;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n text-align: center;\n}\n\n.stage-selector_costume-canvas_2L_6h {\n display: block;\n margin-top: .25rem;\n width: 100%;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: .25rem;\n box-shadow: inset 0 0 4px hsla(0, 0%, 0%, 0.15);\n max-width: 64px;\n max-height: 48px;\n}\n\n.stage-selector_add-button_1sKuU {\n position: absolute;\n bottom: 0.75rem;\n}\n\n.stage-selector_stage-selector_3oWOr.stage-selector_raised_9i1gL, .stage-selector_stage-selector_3oWOr.stage-selector_raised_9i1gL .stage-selector_header_2GVr1 {\n background-color: hsla(0, 100%, 77%, 1);\n transition: all 0.25s ease;\n}\n\n.stage-selector_raised_9i1gL:hover {\n transform: scale(1.05);\n}\n\n.stage-selector_receivedBlocks_2zr7v {\n animation: stage-selector_glowing_2YPqi 250ms;\n}\n\n@keyframes stage-selector_glowing_2YPqi {\n 10% { box-shadow: 0 0 10px #7fff1e; }\n 90% { box-shadow: 0 0 10px #7fff1e; }\n 100% { box-shadow: none; }\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"stage-selector": "stage-selector_stage-selector_3oWOr",
|
||
"stageSelector": "stage-selector_stage-selector_3oWOr",
|
||
"is-selected": "stage-selector_is-selected_2x2r_",
|
||
"isSelected": "stage-selector_is-selected_2x2r_",
|
||
"header": "stage-selector_header_2GVr1",
|
||
"header-title": "stage-selector_header-title_33xCt",
|
||
"headerTitle": "stage-selector_header-title_33xCt",
|
||
"count": "stage-selector_count_2QK7D",
|
||
"label": "stage-selector_label_1MCfr",
|
||
"costume-canvas": "stage-selector_costume-canvas_2L_6h",
|
||
"costumeCanvas": "stage-selector_costume-canvas_2L_6h",
|
||
"add-button": "stage-selector_add-button_1sKuU",
|
||
"addButton": "stage-selector_add-button_1sKuU",
|
||
"raised": "stage-selector_raised_9i1gL",
|
||
"receivedBlocks": "stage-selector_receivedBlocks_2zr7v",
|
||
"glowing": "stage-selector_glowing_2YPqi"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/stage-wrapper/stage-wrapper.css":
|
||
/*!***************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/stage-wrapper/stage-wrapper.css ***!
|
||
\***************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n/*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/\n\n/* Toolbox z-index: 40; set in scratch-blocks */\n\n/* tooltips should go over add buttons if they overlap */\n\n/* monitors go over add buttons */\n\n/* \"ask\" block text input goes above monitors */\n\n/* menu-bar should go over monitors, alerts and tutorials */\n\n/* tw: show below menu bar normally */\n\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\n\n/* so it is draggable into other panes */\n\n/* in most interfaces, the context menu is always on top */\n\n/* tw: this changes the loading screen to be contained to the stage */\n\n.stage-wrapper_stage-wrapper_2bejr {\n position: relative;\n}\n\n.stage-wrapper_stage-wrapper_2bejr * {\n box-sizing: border-box;\n}\n\n.stage-wrapper_stage-canvas-wrapper_3ewmd {\n /* Hides negative space between edge of rounded corners + container, when selected */\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.stage-wrapper_stage-wrapper_2bejr.stage-wrapper_full-screen_2hjMb {\n position: fixed;\n top: 2.75rem;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 500;\n background-color: hsla(0, 100%, 100%, 1);\n /* spacing between stage and control bar (on the top), or between\n stage and window edges (on left/right/bottom) */\n padding: 0.1875rem;\n\n /* this centers the stage */\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n/* tw: support dark mode */\n\n[theme=\"dark\"] .stage-wrapper_stage-wrapper_2bejr.stage-wrapper_full-screen_2hjMb {\n background-color: #111;\n}\n\n/* tw: do not show color in embeds */\n\n.stage-wrapper_stage-wrapper_2bejr.stage-wrapper_embedded_10ZS6 {\n background-color: transparent;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"stage-wrapper": "stage-wrapper_stage-wrapper_2bejr",
|
||
"stageWrapper": "stage-wrapper_stage-wrapper_2bejr",
|
||
"stage-canvas-wrapper": "stage-wrapper_stage-canvas-wrapper_3ewmd",
|
||
"stageCanvasWrapper": "stage-wrapper_stage-canvas-wrapper_3ewmd",
|
||
"full-screen": "stage-wrapper_full-screen_2hjMb",
|
||
"fullScreen": "stage-wrapper_full-screen_2hjMb",
|
||
"embedded": "stage-wrapper_embedded_10ZS6"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/stage/stage.css":
|
||
/*!***********************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/stage/stage.css ***!
|
||
\***********************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n/* #E5F0FF */\n\n/* #E9F1FC */\n\n/* #D9E3F2 */\n\n/* 90% transparent version of motion-primary */\n\n/* #FFFFFF */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 25% transparent version of ui-white */\n\n/* 15% transparent version of black */\n\n/* #575E75 */\n\n/* 35% transparent version of motion-primary */\n\n/* 15% transparent version of motion-primary */\n\n/* opt-in theme overrides */\n\n/* #FF661A */\n\n/* #E64D00 */\n\n/* #CF63CF */\n\n/* #BD42BD */\n\n/* #FFAB19 */\n\n/* #FF8C1A */\n\n/* #0FBD8C */\n\n/* #0FBD8C */\n\n/* #FF8C1A */\n\n/* #FFB366 */\n\n/* #FF8C1A */\n\n/* 35% transparent version of extensions-primary */\n\n/* opaque version of extensions-transparent, on white bg */\n\n/* lighter than motion-primary */\n\n/*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/\n\n/* Toolbox z-index: 40; set in scratch-blocks */\n\n/* tooltips should go over add buttons if they overlap */\n\n/* monitors go over add buttons */\n\n/* \"ask\" block text input goes above monitors */\n\n/* menu-bar should go over monitors, alerts and tutorials */\n\n/* tw: show below menu bar normally */\n\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\n\n/* so it is draggable into other panes */\n\n/* in most interfaces, the context menu is always on top */\n\n.stage_stage_1fD7k {\n /*\n Fixes a few extra pixels of margin/padding, that adds on to the bottom\n of the element, which messes up the chrome padding consistency\n */\n display: block;\n\n border-radius: 0.5rem;\n border: 0.0625rem solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n overflow: hidden;\n\n /* @todo: This is for overriding the value being set somewhere. Where is it being set? */\n background-color: transparent;\n\n /* Allow custom touch handling to prevent scrolling on Edge */\n touch-action: none;\n\n /* Make sure border is not included in size calculation */\n box-sizing: content-box !important;\n\n /* enforce overflow + reset position of absolutely-positioned children */\n position: relative;\n\n /* anything in the stage such as monitor scrollbars should always use light theme */\n color-scheme: light;\n}\n\n.stage_stage_1fD7k.stage_full-screen_ZO7xi {\n /* tw: remove fullscreen border */\n}\n\n.stage_with-color-picker_1lNd5 {\n cursor: none;\n z-index: 2010;\n}\n\n.stage_color-picker-background_2wCVq {\n position: fixed;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.55);\n display: block;\n z-index: 2000;\n top: 0;\n left: 0;\n}\n\n.stage_stage-wrapper_eRRuk {\n position: relative;\n}\n\n/* we want stage overlays to all be positioned in the same spot as the stage, but can't put them inside the border\nbecause we want their overflow to be visible, and the bordered element must have overflow: hidden set so that the\nstage doesn't \"spill\" out from under its rounded corners. instead, shift these over by the border width. */\n\n.stage_stage-overlays_eE14L {\n position: absolute;\n top: 0.0625rem;\n left: 0.0625rem;\n\n /* the overlay itself should not capture pointer events; only its child elements can do that */\n pointer-events: none;\n}\n\n.stage_stage-overlays_eE14L.stage_full-screen_ZO7xi {\n top: 0.1875rem;\n left: 0.1875rem;\n}\n\n.stage_monitor-wrapper_2w6m8,\n.stage_frame-wrapper_1JaS_,\n.stage_green-flag-overlay-wrapper_2hUi_ {\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n}\n\n.stage_custom-overlays_ONYEZ {\n position: absolute;\n top: 0;\n left: 0;\n}\n\n.stage_dragging-sprite_pxcJj {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1020;\n filter: drop-shadow(5px 5px 5px hsla(0, 0%, 0%, 0.15));\n}\n\n.stage_stage-bottom-wrapper_KIBfo {\n position: absolute;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n top: 0;\n left: 0;\n overflow: hidden;\n pointer-events: none;\n}\n\n.stage_mic-indicator_3AvN8 {\n transform-origin: bottom right;\n z-index: 45;\n pointer-events: none;\n align-self: flex-end;\n}\n\n.stage_question-wrapper_3ukB4 {\n z-index: 49;\n pointer-events: auto;\n}\n\n.stage_frame_OVq5G {\n background: hsla(0, 100%, 65%, 0.35);\n border: 2px solid hsla(0, 100%, 65%, 1);\n border-radius: 0.5rem;\n animation-name: stage_flash_iuAnU;\n animation-duration: 0.75s;\n animation-fill-mode: forwards; /* Leave at 0 opacity after animation */\n}\n\n.stage_green-flag-overlay-wrapper_2hUi_ {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba(0,0,0,0.25);\n border-radius: 0.5rem;\n pointer-events: all;\n cursor: pointer;\n}\n\n.stage_green-flag-overlay_gNXnv {\n padding: 1rem;\n border-radius: 100%;\n background: rgba(255,255,255,0.75);\n border: 3px solid hsla(0, 100%, 100%, 1);\n display: flex;\n justify-content: center;\n align-items: center;\n box-sizing: border-box;\n width: 5rem;\n height: 5rem;\n}\n\n.stage_green-flag-overlay_gNXnv > img {\n width: 100%;\n object-fit: contain;\n}\n\n@keyframes stage_flash_iuAnU {\n 0% { opacity: 1; }\n 100% { opacity: 0; }\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"stage": "stage_stage_1fD7k",
|
||
"full-screen": "stage_full-screen_ZO7xi",
|
||
"fullScreen": "stage_full-screen_ZO7xi",
|
||
"with-color-picker": "stage_with-color-picker_1lNd5",
|
||
"withColorPicker": "stage_with-color-picker_1lNd5",
|
||
"color-picker-background": "stage_color-picker-background_2wCVq",
|
||
"colorPickerBackground": "stage_color-picker-background_2wCVq",
|
||
"stage-wrapper": "stage_stage-wrapper_eRRuk",
|
||
"stageWrapper": "stage_stage-wrapper_eRRuk",
|
||
"stage-overlays": "stage_stage-overlays_eE14L",
|
||
"stageOverlays": "stage_stage-overlays_eE14L",
|
||
"monitor-wrapper": "stage_monitor-wrapper_2w6m8",
|
||
"monitorWrapper": "stage_monitor-wrapper_2w6m8",
|
||
"frame-wrapper": "stage_frame-wrapper_1JaS_",
|
||
"frameWrapper": "stage_frame-wrapper_1JaS_",
|
||
"green-flag-overlay-wrapper": "stage_green-flag-overlay-wrapper_2hUi_",
|
||
"greenFlagOverlayWrapper": "stage_green-flag-overlay-wrapper_2hUi_",
|
||
"custom-overlays": "stage_custom-overlays_ONYEZ",
|
||
"customOverlays": "stage_custom-overlays_ONYEZ",
|
||
"dragging-sprite": "stage_dragging-sprite_pxcJj",
|
||
"draggingSprite": "stage_dragging-sprite_pxcJj",
|
||
"stage-bottom-wrapper": "stage_stage-bottom-wrapper_KIBfo",
|
||
"stageBottomWrapper": "stage_stage-bottom-wrapper_KIBfo",
|
||
"mic-indicator": "stage_mic-indicator_3AvN8",
|
||
"micIndicator": "stage_mic-indicator_3AvN8",
|
||
"question-wrapper": "stage_question-wrapper_3ukB4",
|
||
"questionWrapper": "stage_question-wrapper_3ukB4",
|
||
"frame": "stage_frame_OVq5G",
|
||
"flash": "stage_flash_iuAnU",
|
||
"green-flag-overlay": "stage_green-flag-overlay_gNXnv",
|
||
"greenFlagOverlay": "stage_green-flag-overlay_gNXnv"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/stop-all/stop-all.css":
|
||
/*!*****************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/stop-all/stop-all.css ***!
|
||
\*****************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .stop-all_stop-all_1Y8P9 {\n width: 2rem;\n height: 2rem;\n padding: 0.375rem;\n border-radius: 0.25rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: pointer;\n} .stop-all_stop-all_1Y8P9:hover {\n background-color: hsla(0, 100%, 65%, 0.15);\n} .stop-all_stop-all_1Y8P9 {\n opacity: 0.5;\n} .stop-all_stop-all_1Y8P9.stop-all_is-active_3nog0 {\n opacity: 1;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"stop-all": "stop-all_stop-all_1Y8P9",
|
||
"stopAll": "stop-all_stop-all_1Y8P9",
|
||
"is-active": "stop-all_is-active_3nog0",
|
||
"isActive": "stop-all_is-active_3nog0"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tag-button/tag-button.css":
|
||
/*!*********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tag-button/tag-button.css ***!
|
||
\*********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ .tag-button_tag-button_nBLRM {\n padding: .625rem 1rem;\n background: hsla(0, 100%, 65%, 1);\n border-radius: 1.375rem;\n color: hsla(0, 100%, 100%, 1);\n height: 2.5rem;\n} .tag-button_tag-button-icon_26hvC {\n max-width: 1rem;\n max-height: 1rem;\n} .tag-button_active_2stEz {\n background: hsla(30, 100%, 55%, 1);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"tag-button": "tag-button_tag-button_nBLRM",
|
||
"tagButton": "tag-button_tag-button_nBLRM",
|
||
"tag-button-icon": "tag-button_tag-button-icon_26hvC",
|
||
"tagButtonIcon": "tag-button_tag-button-icon_26hvC",
|
||
"active": "tag-button_active_2stEz"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/target-pane/target-pane.css":
|
||
/*!***********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/target-pane/target-pane.css ***!
|
||
\***********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\n\n/* layout contants from `layout-constants.js` */\n\n.target-pane_target-pane_3S5E6 {\n /* Makes columns for the sprite library selector + and the stage selector */\n display: flex;\n flex-direction: row;\n flex-grow: 1;\n}\n\n.target-pane_stage-selector-wrapper_qekSW {\n display: flex;\n flex-basis: 72px;\n flex-shrink: 0;\n}\n\n[dir=\"ltr\"] .target-pane_stage-selector-wrapper_qekSW {\n margin-left: calc(0.5rem / 2);\n}\n\n[dir=\"rtl\"] .target-pane_stage-selector-wrapper_qekSW {\n margin-right: calc(0.5rem / 2);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"target-pane": "target-pane_target-pane_3S5E6",
|
||
"targetPane": "target-pane_target-pane_3S5E6",
|
||
"stage-selector-wrapper": "target-pane_stage-selector-wrapper_qekSW",
|
||
"stageSelectorWrapper": "target-pane_stage-selector-wrapper_qekSW"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/telemetry-modal/telemetry-modal.css":
|
||
/*!*******************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/telemetry-modal/telemetry-modal.css ***!
|
||
\*******************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var escape = __webpack_require__(/*! ../../../node_modules/css-loader/lib/url/escape.js */ "./node_modules/css-loader/lib/url/escape.js");
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ body {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n} h2 {\n font-size: 1.5rem;\n font-weight: bold;\n} p {\n font-size: 1rem;\n line-height: 1.5em;\n} /*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/ /* Toolbox z-index: 40; set in scratch-blocks */ /* tooltips should go over add buttons if they overlap */ /* monitors go over add buttons */ /* \"ask\" block text input goes above monitors */ /* menu-bar should go over monitors, alerts and tutorials */ /* tw: show below menu bar normally */ /* Block drag z-index: 1000; default 50 is overriden in blocks.css */ /* so it is draggable into other panes */ /* in most interfaces, the context menu is always on top */ /* from scratch-www */ .telemetry-modal_modal-overlay_3R9Qg {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 510;\n background-color: var(--ui-modal-overlay, hsla(0, 100%, 65%, 0.9));\n} .telemetry-modal_modal-content_nALrs {\n margin: 100px auto;\n outline: none;\n border: .25rem solid hsla(0, 100%, 100%, 0.25);\n padding: 0;\n border-radius: 0.5rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n width: 640px;\n\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n overflow: hidden;\n} .telemetry-modal_illustration_2xM6I {\n width: 100%;\n height: 123px;\n background-color: hsla(0, 100%, 65%, 1);\n background-image: url(" + escape(__webpack_require__(/*! ./telemetry-modal-header.png */ "./src/components/telemetry-modal/telemetry-modal-header.png")) + ");\n background-size: cover;\n} .telemetry-modal_body_1ZKWV {\n background: hsla(0, 100%, 100%, 1);\n padding: 1.5rem 2.25rem;\n} .telemetry-modal_privacy-policy-link_3wFww {\n color: hsla(0, 100%, 65%, 1);\n text-decoration: none;\n} /* stack the radio buttons vertically, not horizontally */ .telemetry-modal_radio-buttons_8ArWg label {\n display: block;\n margin: 0.5rem;\n transition: all .125s ease;\n background-color: hsla(0, 0%, 95%, 1);\n border-radius: .5rem;\n margin: 0 auto 0.375rem;\n align-items: center;\n padding: 1rem 0;\n vertical-align: middle;\n} .telemetry-modal_radio-buttons_8ArWg label:hover {\n background-color: hsla(215, 100%, 65%, .1);\n} .telemetry-modal_radio-buttons_8ArWg label.telemetry-modal_label-selected_2jFaa,\n.telemetry-modal_radio-buttons_8ArWg label.telemetry-modal_label-selected_2jFaa:hover {\n background-color: hsla(215, 100%, 65%, .25);\n} .telemetry-modal_radio-buttons_8ArWg input[type=\"radio\"] {\n margin: -1px 0.75rem 1px;\n border: 1px solid hsla(0, 0%, 0%, .1);\n border-radius: 50%;\n width: 1rem;\n height: 1rem;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n background-color: hsla(0, 100%, 100%, 1);\n vertical-align: middle;\n} .telemetry-modal_radio-buttons_8ArWg input[type=\"radio\"]:checked,\n.telemetry-modal_radio-buttons_8ArWg input[type=\"radio\"]:focus {\n box-shadow: 0 0 0 2px hsla(215, 100%, 65%, .25);\n outline: none;\n} .telemetry-modal_radio-buttons_8ArWg input[type=\"radio\"]:checked {\n transition: all .25s ease;\n background-color: hsla(0, 100%, 100%, 1);\n border: 1px solid hsla(0, 100%, 65%, 1);\n} .telemetry-modal_radio-buttons_8ArWg input[type=\"radio\"]:checked::after {\n display: block;\n margin: 0.125rem;\n border-radius: 50%;\n background-color: hsla(0, 100%, 65%, 1);\n width: .625rem;\n height: .625rem;\n content: \"\";\n} /* Confirmation buttons at the bottom of the modal */ .telemetry-modal_button-row_2rE_o {\n display: flex;\n flex-flow: row nowrap;\n justify-content: space-between;\n align-items: baseline;\n\n margin: 1.5rem 0;\n font-weight: bolder;\n} @keyframes telemetry-modal_fade-out_36Osg {\n 0% {opacity: 1}\n 100% {opacity: 0}\n} .telemetry-modal_setting-was-updated_1l6nc {\n animation: telemetry-modal_fade-out_36Osg 3s ease-out;\n color: hsla(10, 85%, 65%, 1);\n} .telemetry-modal_button-row_2rE_o button {\n border: 1px solid hsla(0, 100%, 65%, 1);\n border-radius: 0.25rem;\n padding: 0.5rem 1.5rem;\n color: white;\n background: hsla(0, 100%, 65%, 1);\n font-weight: bold;\n font-size: .875rem;\n cursor: pointer;\n} .telemetry-modal_button-row_2rE_o button:hover {\n background: hsla(10, 85%, 65%, 1);\n box-shadow: 0 0 0 6px hsla(0, 100%, 65%, 0.35);\n} .telemetry-modal_button-row_2rE_o button:disabled {\n background: var(--text-primary, hsla(225, 15%, 40%, 1));\n border-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n box-shadow: none;\n opacity: 0.25;\n} @media screen and (max-height: 660px) {\n .telemetry-modal_modal-content_nALrs {\n margin: 5vh auto;\n width: 90%;\n }\n} @media screen and (max-height: 540px) {\n .telemetry-modal_illustration_2xM6I {\n display: none;\n }\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-overlay": "telemetry-modal_modal-overlay_3R9Qg",
|
||
"modalOverlay": "telemetry-modal_modal-overlay_3R9Qg",
|
||
"modal-content": "telemetry-modal_modal-content_nALrs",
|
||
"modalContent": "telemetry-modal_modal-content_nALrs",
|
||
"illustration": "telemetry-modal_illustration_2xM6I",
|
||
"body": "telemetry-modal_body_1ZKWV",
|
||
"privacy-policy-link": "telemetry-modal_privacy-policy-link_3wFww",
|
||
"privacyPolicyLink": "telemetry-modal_privacy-policy-link_3wFww",
|
||
"radio-buttons": "telemetry-modal_radio-buttons_8ArWg",
|
||
"radioButtons": "telemetry-modal_radio-buttons_8ArWg",
|
||
"label-selected": "telemetry-modal_label-selected_2jFaa",
|
||
"labelSelected": "telemetry-modal_label-selected_2jFaa",
|
||
"button-row": "telemetry-modal_button-row_2rE_o",
|
||
"buttonRow": "telemetry-modal_button-row_2rE_o",
|
||
"setting-was-updated": "telemetry-modal_setting-was-updated_1l6nc",
|
||
"settingWasUpdated": "telemetry-modal_setting-was-updated_1l6nc",
|
||
"fade-out": "telemetry-modal_fade-out_36Osg",
|
||
"fadeOut": "telemetry-modal_fade-out_36Osg"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/turbo-mode/turbo-mode.css":
|
||
/*!*********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/turbo-mode/turbo-mode.css ***!
|
||
\*********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .turbo-mode_turbo-container_2ZNcq {\n display: flex;\n align-items: center;\n padding: 0.25rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n} .turbo-mode_turbo-icon_fjr8U {\n margin: 0.25rem;\n} .turbo-mode_turbo-label_-1oMs {\n font-size: 0.625rem;\n font-weight: bold;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n color: hsla(38, 100%, 55%, 1);\n white-space: nowrap;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"turbo-container": "turbo-mode_turbo-container_2ZNcq",
|
||
"turboContainer": "turbo-mode_turbo-container_2ZNcq",
|
||
"turbo-icon": "turbo-mode_turbo-icon_fjr8U",
|
||
"turboIcon": "turbo-mode_turbo-icon_fjr8U",
|
||
"turbo-label": "turbo-mode_turbo-label_-1oMs",
|
||
"turboLabel": "turbo-mode_turbo-label_-1oMs"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-custom-extension-modal/custom-extension-modal.css":
|
||
/*!************************************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tw-custom-extension-modal/custom-extension-modal.css ***!
|
||
\************************************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .custom-extension-modal_modal-content_3DjW0 {\n max-width: 550px;\n margin-top: 50px;\n} .custom-extension-modal_body_2iQF3 {\n background: hsla(0, 100%, 100%, 1);\n padding: 1.5rem 2.25rem;\n} [theme=\"dark\"] .custom-extension-modal_body_2iQF3 {\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n} .custom-extension-modal_body_2iQF3 p,\n.custom-extension-modal_unsandboxed-container_8juVd,\n.custom-extension-modal_url-input_3NAsR,\n.custom-extension-modal_text-code-input_2xKjS {\n margin: 1rem 0;\n display: block;\n} .custom-extension-modal_type-selector-container_2Fag3 {\n display: flex;\n justify-content: space-around;\n} .custom-extension-modal_type-selector-button_1r2YN {\n width: 100%;\n cursor: pointer;\n border-bottom: 0.25rem solid var(--ui-tertiary, hsla(215, 50%, 90%, 1));\n margin: 0 1rem;\n padding: 0.5rem 0;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n} .custom-extension-modal_type-selector-button_1r2YN[data-active=\"true\"] {\n border-color: hsla(0, 100%, 65%, 1);\n} .custom-extension-modal_type-selector-button_1r2YN:active {\n border-color: hsla(0, 100%, 65%, 0.35);\n} .custom-extension-modal_url-input_3NAsR,\n.custom-extension-modal_text-code-input_2xKjS {\n width: 100%;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 0.25rem;\n padding: 0.5rem;\n font-size: inherit;\n} [theme=\"dark\"] .custom-extension-modal_url-input_3NAsR,\n[theme=\"dark\"] .custom-extension-modal_text-code-input_2xKjS {\n background: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n color: white;\n} .custom-extension-modal_url-input_3NAsR {\n height: 3rem;\n} .custom-extension-modal_text-code-input_2xKjS {\n min-height: 3rem;\n height: 8rem;\n min-width: 100%;\n max-width: 100%;\n font-family: monospace;\n} .custom-extension-modal_unsandboxed-container_8juVd {\n display: flex;\n align-items: center;\n} .custom-extension-modal_unsandboxed-checkbox_HkBFl {\n margin-right: 0.5rem;\n} .custom-extension-modal_trusted-extension_1WNO9,\n.custom-extension-modal_unsandboxed-warning_1BmMu {\n padding: 0.5rem;\n border-radius: 0.25rem;\n} .custom-extension-modal_trusted-extension_1WNO9 {\n background-color: rgba(94, 255, 94, 0.25);\n border: 1px solid green;\n} .custom-extension-modal_unsandboxed-warning_1BmMu {\n background-color: rgba(255, 81, 81, 0.25);\n border: 1px solid red;\n} .custom-extension-modal_unsandboxed-warning_1BmMu > *:not(:last-child) {\n display: block;\n margin-bottom: 4px;\n} .custom-extension-modal_button-row_3dv8g {\n display: flex;\n justify-content: flex-end;\n} .custom-extension-modal_load-button_WGJAt {\n font: inherit;\n color: inherit;\n padding: 0.75rem 1rem;\n border-radius: 0.25rem;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n font-weight: 600;\n font-size: 0.85rem;\n color: hsla(0, 100%, 100%, 1);\n background: hsla(0, 100%, 65%, 1);\n} .custom-extension-modal_load-button_WGJAt:disabled {\n opacity: 0.8;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-content": "custom-extension-modal_modal-content_3DjW0",
|
||
"modalContent": "custom-extension-modal_modal-content_3DjW0",
|
||
"body": "custom-extension-modal_body_2iQF3",
|
||
"unsandboxed-container": "custom-extension-modal_unsandboxed-container_8juVd",
|
||
"unsandboxedContainer": "custom-extension-modal_unsandboxed-container_8juVd",
|
||
"url-input": "custom-extension-modal_url-input_3NAsR",
|
||
"urlInput": "custom-extension-modal_url-input_3NAsR",
|
||
"text-code-input": "custom-extension-modal_text-code-input_2xKjS",
|
||
"textCodeInput": "custom-extension-modal_text-code-input_2xKjS",
|
||
"type-selector-container": "custom-extension-modal_type-selector-container_2Fag3",
|
||
"typeSelectorContainer": "custom-extension-modal_type-selector-container_2Fag3",
|
||
"type-selector-button": "custom-extension-modal_type-selector-button_1r2YN",
|
||
"typeSelectorButton": "custom-extension-modal_type-selector-button_1r2YN",
|
||
"unsandboxed-checkbox": "custom-extension-modal_unsandboxed-checkbox_HkBFl",
|
||
"unsandboxedCheckbox": "custom-extension-modal_unsandboxed-checkbox_HkBFl",
|
||
"trusted-extension": "custom-extension-modal_trusted-extension_1WNO9",
|
||
"trustedExtension": "custom-extension-modal_trusted-extension_1WNO9",
|
||
"unsandboxed-warning": "custom-extension-modal_unsandboxed-warning_1BmMu",
|
||
"unsandboxedWarning": "custom-extension-modal_unsandboxed-warning_1BmMu",
|
||
"button-row": "custom-extension-modal_button-row_3dv8g",
|
||
"buttonRow": "custom-extension-modal_button-row_3dv8g",
|
||
"load-button": "custom-extension-modal_load-button_WGJAt",
|
||
"loadButton": "custom-extension-modal_load-button_WGJAt"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-custom-extension-modal/file-input.css":
|
||
/*!************************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tw-custom-extension-modal/file-input.css ***!
|
||
\************************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .file-input_container_1c4jE {\n display: block;\n position: relative;\n padding: 1rem;\n margin: 1rem 0;\n text-align: center;\n border: 4px dashed var(--ui-tertiary, hsla(215, 50%, 90%, 1));\n border-radius: 5px;\n cursor: pointer;\n background: none;\n width: 100%;\n} .file-input_container_1c4jE:focus-within {\n border-color: hsla(0, 100%, 65%, 1);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"container": "file-input_container_1c4jE"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-extension-separator/separator.css":
|
||
/*!********************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tw-extension-separator/separator.css ***!
|
||
\********************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .separator_separator_2qoYo {\n width: 100%;\n border: none;\n border-top: 2px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n margin: 0.5rem 0;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"separator": "separator_separator_2qoYo"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-fancy-checkbox/checkbox.css":
|
||
/*!**************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tw-fancy-checkbox/checkbox.css ***!
|
||
\**************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var escape = __webpack_require__(/*! ../../../node_modules/css-loader/lib/url/escape.js */ "./node_modules/css-loader/lib/url/escape.js");
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .checkbox_checkbox_2QbUl {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n width: 18px;\n height: 18px;\n border-radius: 4px;\n transition: .2s;\n background-color: white;\n transition-property: background-color;\n background-size: 100%;\n border: 1px solid rgb(92, 92, 92);\n outline: none;\n} .checkbox_checkbox_2QbUl:hover, .checkbox_checkbox_2QbUl:focus, .checkbox_checkbox_2QbUl:active, .checkbox_checkbox_2QbUl:checked {\n border-color: hsla(0, 100%, 65%, 1);\n} .checkbox_checkbox_2QbUl:focus, .checkbox_checkbox_2QbUl:active {\n box-shadow: 0 0 0 3px hsla(0, 100%, 65%, 0.35);\n} .checkbox_checkbox_2QbUl:checked {\n background-color: hsla(0, 100%, 65%, 1);\n background-image: url(" + escape(__webpack_require__(/*! ./checkbox.svg */ "./src/components/tw-fancy-checkbox/checkbox.svg")) + ");\n} [theme=\"dark\"] .checkbox_checkbox_2QbUl {\n border-color: transparent;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"checkbox": "checkbox_checkbox_2QbUl"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-fonts-modal/fonts-modal.css":
|
||
/*!**************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tw-fonts-modal/fonts-modal.css ***!
|
||
\**************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var escape = __webpack_require__(/*! ../../../node_modules/css-loader/lib/url/escape.js */ "./node_modules/css-loader/lib/url/escape.js");
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/ /* Toolbox z-index: 40; set in scratch-blocks */ /* tooltips should go over add buttons if they overlap */ /* monitors go over add buttons */ /* \"ask\" block text input goes above monitors */ /* menu-bar should go over monitors, alerts and tutorials */ /* tw: show below menu bar normally */ /* Block drag z-index: 1000; default 50 is overriden in blocks.css */ /* so it is draggable into other panes */ /* in most interfaces, the context menu is always on top */ .fonts-modal_modal-content_36LbI {\n max-width: 550px;\n margin-top: 50px;\n} .fonts-modal_body_yf5mP {\n background: hsla(0, 100%, 100%, 1);\n padding: 1.5rem 2.25rem;\n max-height: calc(100vh - 150px);\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n} [theme=\"dark\"] .fonts-modal_body_yf5mP {\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n} .fonts-modal_open-buttons_OdA4k {\n display: flex;\n gap: 1rem;\n} .fonts-modal_open-button_3skjP {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n width: 100%;\n align-items: center;\n background: none;\n padding: 0.5rem;\n margin: 0;\n border: 2px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 0.5rem;\n} .fonts-modal_open-button_3skjP:hover {\n color: hsla(0, 100%, 65%, 1);\n border-color: hsla(0, 100%, 65%, 1);\n} .fonts-modal_open-button-image_19kgq {\n width: 64px;\n height: 64px;\n background-color: currentColor;\n -webkit-mask-size: cover;\n mask-size: cover;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n} .fonts-modal_system-image_p0UST {\n -webkit-mask-image: url(" + escape(__webpack_require__(/*! ./system.svg */ "./src/components/tw-fonts-modal/system.svg")) + ");\n mask-image: url(" + escape(__webpack_require__(/*! ./system.svg */ "./src/components/tw-fonts-modal/system.svg")) + ");\n} .fonts-modal_custom-image_3B90x {\n -webkit-mask-image: url(" + escape(__webpack_require__(/*! ./custom.svg */ "./src/components/tw-fonts-modal/custom.svg")) + ");\n mask-image: url(" + escape(__webpack_require__(/*! ./custom.svg */ "./src/components/tw-fonts-modal/custom.svg")) + ");\n} .fonts-modal_open-button-text_1JUnw {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n} .fonts-modal_open-button-text-main_1QWic {\n font-weight: bold;\n} .fonts-modal_open-button-text-sub_2yVxF {\n\n} .fonts-modal_font-input-outer_OtzL0 {\n\n} .fonts-modal_font-input_jygEL {\n width: 100%;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 0.25rem;\n padding: 0 1rem;\n height: 3rem;\n font: inherit;\n} .fonts-modal_font-dropdown-outer_2kOi5 {\n position: absolute;\n z-index: 510;\n background-color: white;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n border-radius: 0.25rem;\n overflow: auto;\n max-height: 300px;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n box-sizing: border-box;\n box-shadow: 0px 0px 8px 1px rgba(0, 0, 0, .3);\n} [theme=\"dark\"] .fonts-modal_font-dropdown-outer_2kOi5 {\n background-color: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n} .fonts-modal_font-dropdown-item_1NsNq {\n display: flex;\n align-items: center;\n padding: 0.5rem 0.75rem;\n height: 1.5rem;\n cursor: pointer;\n transition: .1s ease;\n} .fonts-modal_font-dropdown-item_1NsNq:hover {\n background-color: hsla(0, 100%, 65%, 1);\n color: #ffffff;\n} .fonts-modal_font-playground_3vAYw {\n background: none;\n border: none;\n padding: 0.5rem;\n margin: 0;\n resize: none;\n width: 100%;\n height: 100px;\n font-size: 1.5rem;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 0.25rem;\n} .fonts-modal_button_1htQ- {\n font: inherit;\n font-weight: bold;\n padding: 0.75rem 1rem;\n border-radius: 0.25rem;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n background-color: hsla(0, 100%, 65%, 1);\n color: hsla(0, 100%, 100%, 1);\n} .fonts-modal_button_1htQ-:disabled {\n opacity: 0.8;\n} .fonts-modal_fallback-container_3JsVp {\n display: flex;\n flex-direction: column;\n} .fonts-modal_fallback-label_3lhWz {\n margin-bottom: 0.5rem;\n} .fonts-modal_fallback-list_dMIkJ {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 0.25rem\n} .fonts-modal_fallback-button_11k4q {\n background: none;\n padding: 0;\n border: 0;\n border-radius: 0.25rem;\n height: 30px;\n display: flex;\n align-items: center;\n justify-content: center;\n} .fonts-modal_fallback-button_11k4q:hover {\n color: hsla(0, 100%, 65%, 1);\n} .fonts-modal_fallback-container_3JsVp .fonts-modal_fallback-button-selected_8XTtQ {\n background-color: hsla(0, 100%, 65%, 1);\n color: white;\n} .fonts-modal_fonts-outer_2gPPS {\n border-top: 2px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n padding-top: 1rem;\n} .fonts-modal_fonts-outer_2gPPS p {\n margin-bottom: 0.5rem;\n} .fonts-modal_fonts_2IVM- {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n} .fonts-modal_manage-font_leTBp {\n width: 100%;\n display: flex;\n align-items: center;\n border: 2px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 0.5rem;\n padding: 0.5rem;\n gap: 0.5rem;\n} .fonts-modal_manage-font-name_2FEQm {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n overflow-wrap: anywhere;\n} .fonts-modal_manage-font-buttons_1irfe {\n margin-left: auto;\n flex-shrink: 0;\n display: flex;\n flex-direction: row;\n gap: 0.5rem;\n} .fonts-modal_manage-font-button_1Ezz0 {\n background: none;\n border: none;\n border-radius: 100%;\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n} .fonts-modal_manage-font-button_1Ezz0:hover {\n background-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n} .fonts-modal_manage-font-button_1Ezz0 img {\n display: block;\n width: 100%;\n height: 100%;\n} [theme=\"dark\"] .fonts-modal_manage-font-button_1Ezz0 img {\n filter: invert(100%);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-content": "fonts-modal_modal-content_36LbI",
|
||
"modalContent": "fonts-modal_modal-content_36LbI",
|
||
"body": "fonts-modal_body_yf5mP",
|
||
"open-buttons": "fonts-modal_open-buttons_OdA4k",
|
||
"openButtons": "fonts-modal_open-buttons_OdA4k",
|
||
"open-button": "fonts-modal_open-button_3skjP",
|
||
"openButton": "fonts-modal_open-button_3skjP",
|
||
"open-button-image": "fonts-modal_open-button-image_19kgq",
|
||
"openButtonImage": "fonts-modal_open-button-image_19kgq",
|
||
"system-image": "fonts-modal_system-image_p0UST",
|
||
"systemImage": "fonts-modal_system-image_p0UST",
|
||
"custom-image": "fonts-modal_custom-image_3B90x",
|
||
"customImage": "fonts-modal_custom-image_3B90x",
|
||
"open-button-text": "fonts-modal_open-button-text_1JUnw",
|
||
"openButtonText": "fonts-modal_open-button-text_1JUnw",
|
||
"open-button-text-main": "fonts-modal_open-button-text-main_1QWic",
|
||
"openButtonTextMain": "fonts-modal_open-button-text-main_1QWic",
|
||
"open-button-text-sub": "fonts-modal_open-button-text-sub_2yVxF",
|
||
"openButtonTextSub": "fonts-modal_open-button-text-sub_2yVxF",
|
||
"font-input-outer": "fonts-modal_font-input-outer_OtzL0",
|
||
"fontInputOuter": "fonts-modal_font-input-outer_OtzL0",
|
||
"font-input": "fonts-modal_font-input_jygEL",
|
||
"fontInput": "fonts-modal_font-input_jygEL",
|
||
"font-dropdown-outer": "fonts-modal_font-dropdown-outer_2kOi5",
|
||
"fontDropdownOuter": "fonts-modal_font-dropdown-outer_2kOi5",
|
||
"font-dropdown-item": "fonts-modal_font-dropdown-item_1NsNq",
|
||
"fontDropdownItem": "fonts-modal_font-dropdown-item_1NsNq",
|
||
"font-playground": "fonts-modal_font-playground_3vAYw",
|
||
"fontPlayground": "fonts-modal_font-playground_3vAYw",
|
||
"button": "fonts-modal_button_1htQ-",
|
||
"fallback-container": "fonts-modal_fallback-container_3JsVp",
|
||
"fallbackContainer": "fonts-modal_fallback-container_3JsVp",
|
||
"fallback-label": "fonts-modal_fallback-label_3lhWz",
|
||
"fallbackLabel": "fonts-modal_fallback-label_3lhWz",
|
||
"fallback-list": "fonts-modal_fallback-list_dMIkJ",
|
||
"fallbackList": "fonts-modal_fallback-list_dMIkJ",
|
||
"fallback-button": "fonts-modal_fallback-button_11k4q",
|
||
"fallbackButton": "fonts-modal_fallback-button_11k4q",
|
||
"fallback-button-selected": "fonts-modal_fallback-button-selected_8XTtQ",
|
||
"fallbackButtonSelected": "fonts-modal_fallback-button-selected_8XTtQ",
|
||
"fonts-outer": "fonts-modal_fonts-outer_2gPPS",
|
||
"fontsOuter": "fonts-modal_fonts-outer_2gPPS",
|
||
"fonts": "fonts-modal_fonts_2IVM-",
|
||
"manage-font": "fonts-modal_manage-font_leTBp",
|
||
"manageFont": "fonts-modal_manage-font_leTBp",
|
||
"manage-font-name": "fonts-modal_manage-font-name_2FEQm",
|
||
"manageFontName": "fonts-modal_manage-font-name_2FEQm",
|
||
"manage-font-buttons": "fonts-modal_manage-font-buttons_1irfe",
|
||
"manageFontButtons": "fonts-modal_manage-font-buttons_1irfe",
|
||
"manage-font-button": "fonts-modal_manage-font-button_1Ezz0",
|
||
"manageFontButton": "fonts-modal_manage-font-button_1Ezz0"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-framerate-indicator/framerate-indicator.css":
|
||
/*!******************************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tw-framerate-indicator/framerate-indicator.css ***!
|
||
\******************************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .framerate-indicator_framerate-container_NtFdv {\n display: flex;\n align-items: center;\n padding: 0.25rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n} .framerate-indicator_framerate-label_2VeIK {\n font-size: 0.625rem;\n font-weight: bold;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n color: hsla(38, 100%, 55%, 1);\n white-space: nowrap;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"framerate-container": "framerate-indicator_framerate-container_NtFdv",
|
||
"framerateContainer": "framerate-indicator_framerate-container_NtFdv",
|
||
"framerate-label": "framerate-indicator_framerate-label_2VeIK",
|
||
"framerateLabel": "framerate-indicator_framerate-label_2VeIK"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-loading-spinner/spinner.css":
|
||
/*!**************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tw-loading-spinner/spinner.css ***!
|
||
\**************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .spinner_container_2gp3A {\n display: flex;\n width: 100%;\n height: 100%;\n align-items: center;\n justify-content: center;\n} .spinner_spinner_3_DJ6 {\n width: 64px;\n height: 64px;\n border-radius: 50%;\n border: 6px solid;\n border-color: hsla(0, 100%, 65%, 1) transparent hsla(0, 100%, 65%, 1) transparent;\n animation: spinner_spinner_3_DJ6 1.2s linear infinite;\n} [theme=\"dark\"] .spinner_spinner_3_DJ6 {\n border-color: #fff transparent #fff transparent;\n} @keyframes spinner_spinner_3_DJ6 {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"container": "spinner_container_2gp3A",
|
||
"spinner": "spinner_spinner_3_DJ6"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-restore-point-modal/restore-point-modal.css":
|
||
/*!******************************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tw-restore-point-modal/restore-point-modal.css ***!
|
||
\******************************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .restore-point-modal_modal-content_MhWVL {\n max-width: 550px;\n margin-top: 50px;\n} .restore-point-modal_body_2MCxE {\n background: hsla(0, 100%, 100%, 1);\n padding: 1.5rem 2.25rem;\n max-height: calc(100vh - 150px);\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n} [theme=\"dark\"] .restore-point-modal_body_2MCxE {\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n} .restore-point-modal_extra-container_1h-QF {\n display: flex;\n justify-content: space-between;\n align-items: center;\n} .restore-point-modal_total-size_2aFad {\n\n} .restore-point-modal_total-size-description_2spx- {\n font-size: small;\n} .restore-point-modal_button_3fhkL {\n font: inherit;\n color: inherit;\n padding: 0.75rem 1rem;\n border-radius: 0.25rem;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n font-weight: 600;\n font-size: 0.85rem;\n color: hsla(0, 100%, 100%, 1);\n} .restore-point-modal_button_3fhkL:disabled {\n opacity: 0.8;\n} .restore-point-modal_delete-all-button_3uoFz {\n margin-left: 1rem;\n background-color: hsla(30, 100%, 55%, 1);\n white-space: nowrap;\n} .restore-point-modal_error-message_2jcrY {\n font-family: monospace;\n -webkit-user-select: text;\n -moz-user-select: text;\n -ms-user-select: text;\n user-select: text;\n} .restore-point-modal_restore-point-container_FtGHo {\n display: grid;\n grid-template-columns: 1fr;\n gap: 0.5rem;\n} .restore-point-modal_restore-point_2yeHY {\n width: 100%;\n cursor: pointer;\n display: flex;\n align-items: center;\n border: 2px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n padding: 0.5rem;\n border-radius: 0.5rem;\n gap: 0.5rem;\n} .restore-point-modal_restore-point_2yeHY:hover {\n border-color: hsla(0, 100%, 65%, 1);\n} .restore-point-modal_restore-point-title_311jA {\n font-weight: bold;\n} .restore-point-modal_thumbnail-container_2BRX1 {\n flex-shrink: 0;\n /* 4:3 */\n width: 100px;\n height: 75px;\n} .restore-point-modal_thumbnail-image_2HLfd {\n display: block;\n border-radius: 0.25rem;\n width: 100%;\n height: 100%;\n} .restore-point-modal_thumbnail-placeholder_3BxpD {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 2em;\n} .restore-point-modal_delete-button_FU0Oj {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n background: none;\n border: none;\n border-radius: 100%;\n width: 2rem;\n height: 2rem;\n margin-left: auto;\n display: flex;\n align-items: center;\n justify-content: center;\n} .restore-point-modal_delete-button_FU0Oj img {\n display: block;\n width: 75%;\n height: 75%;\n} [theme=\"dark\"] .restore-point-modal_delete-button_FU0Oj img {\n filter: invert(100%);\n} .restore-point-modal_delete-button_FU0Oj:hover {\n background-color: var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n} .restore-point-modal_disabled_2fYZv {\n padding: 0.5rem;\n border-radius: 0.5rem;\n background-color: rgba(255, 0, 0, 0.18);\n border: 2px solid rgba(255, 0, 0, 0.568);\n font-weight: bold;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-content": "restore-point-modal_modal-content_MhWVL",
|
||
"modalContent": "restore-point-modal_modal-content_MhWVL",
|
||
"body": "restore-point-modal_body_2MCxE",
|
||
"extra-container": "restore-point-modal_extra-container_1h-QF",
|
||
"extraContainer": "restore-point-modal_extra-container_1h-QF",
|
||
"total-size": "restore-point-modal_total-size_2aFad",
|
||
"totalSize": "restore-point-modal_total-size_2aFad",
|
||
"total-size-description": "restore-point-modal_total-size-description_2spx-",
|
||
"totalSizeDescription": "restore-point-modal_total-size-description_2spx-",
|
||
"button": "restore-point-modal_button_3fhkL",
|
||
"delete-all-button": "restore-point-modal_delete-all-button_3uoFz",
|
||
"deleteAllButton": "restore-point-modal_delete-all-button_3uoFz",
|
||
"error-message": "restore-point-modal_error-message_2jcrY",
|
||
"errorMessage": "restore-point-modal_error-message_2jcrY",
|
||
"restore-point-container": "restore-point-modal_restore-point-container_FtGHo",
|
||
"restorePointContainer": "restore-point-modal_restore-point-container_FtGHo",
|
||
"restore-point": "restore-point-modal_restore-point_2yeHY",
|
||
"restorePoint": "restore-point-modal_restore-point_2yeHY",
|
||
"restore-point-title": "restore-point-modal_restore-point-title_311jA",
|
||
"restorePointTitle": "restore-point-modal_restore-point-title_311jA",
|
||
"thumbnail-container": "restore-point-modal_thumbnail-container_2BRX1",
|
||
"thumbnailContainer": "restore-point-modal_thumbnail-container_2BRX1",
|
||
"thumbnail-image": "restore-point-modal_thumbnail-image_2HLfd",
|
||
"thumbnailImage": "restore-point-modal_thumbnail-image_2HLfd",
|
||
"thumbnail-placeholder": "restore-point-modal_thumbnail-placeholder_3BxpD",
|
||
"thumbnailPlaceholder": "restore-point-modal_thumbnail-placeholder_3BxpD",
|
||
"delete-button": "restore-point-modal_delete-button_FU0Oj",
|
||
"deleteButton": "restore-point-modal_delete-button_FU0Oj",
|
||
"disabled": "restore-point-modal_disabled_2fYZv"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-security-manager-modal/data-url.css":
|
||
/*!**********************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tw-security-manager-modal/data-url.css ***!
|
||
\**********************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .data-url_code_1o8oS {\n display: block;\n width: 100%;\n max-width: 100%;\n min-width: 100%;\n height: 5rem;\n min-height: 3rem;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 0.25rem;\n padding: 0.25rem;\n font-size: 0.875rem;\n font-family: monospace;\n margin: 0.5rem 0;\n} [theme=\"dark\"] .data-url_code_1o8oS {\n background: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n color: white;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"code": "data-url_code_1o8oS"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-security-manager-modal/load-extension.css":
|
||
/*!****************************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tw-security-manager-modal/load-extension.css ***!
|
||
\****************************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .load-extension_code_2UsqN,\n.load-extension_unsandboxed-container_3_M9P,\n.load-extension_unsandboxed-warning_2iFhK,\n.load-extension_sandboxed_3ynzH {\n margin: 8px 0;\n} .load-extension_unsandboxed-container_3_M9P {\n display: flex;\n align-items: center;\n} .load-extension_unsandboxed-checkbox_1tSmf {\n margin-right: 8px;\n} .load-extension_unsandboxed-warning_2iFhK {\n padding: 0.5rem;\n border-radius: 0.25rem;\n background-color: rgba(255, 81, 81, 0.25);\n border: 1px solid red;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"code": "load-extension_code_2UsqN",
|
||
"unsandboxed-container": "load-extension_unsandboxed-container_3_M9P",
|
||
"unsandboxedContainer": "load-extension_unsandboxed-container_3_M9P",
|
||
"unsandboxed-warning": "load-extension_unsandboxed-warning_2iFhK",
|
||
"unsandboxedWarning": "load-extension_unsandboxed-warning_2iFhK",
|
||
"sandboxed": "load-extension_sandboxed_3ynzH",
|
||
"unsandboxed-checkbox": "load-extension_unsandboxed-checkbox_1tSmf",
|
||
"unsandboxedCheckbox": "load-extension_unsandboxed-checkbox_1tSmf"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-security-manager-modal/security-manager-modal.css":
|
||
/*!************************************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tw-security-manager-modal/security-manager-modal.css ***!
|
||
\************************************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .security-manager-modal_modal-content_3qWwH {\n width: 440px;\n margin-top: 25px;\n} .security-manager-modal_body_Pn7qy {\n background: hsla(0, 100%, 100%, 1);\n padding: 1rem 1.5rem;\n} [theme=\"dark\"] .security-manager-modal_body_Pn7qy {\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n} .security-manager-modal_body_Pn7qy p {\n margin: 8px 0;\n} .security-manager-modal_buttons_1LSKA {\n display: flex;\n} .security-manager-modal_buttons_1LSKA :disabled {\n opacity: 0.8;\n} .security-manager-modal_deny-button_3Vd-R, .security-manager-modal_allow-button_3tcXk {\n flex-grow: 1;\n font: inherit;\n color: inherit;\n padding: 0.75rem 1rem;\n border-radius: 0.25rem;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n font-weight: 600;\n font-size: 0.85rem;\n} .security-manager-modal_deny-button_3Vd-R {\n background-color: rgb(255, 92, 92);\n color: white;\n margin-right: 8px;\n} .security-manager-modal_allow-button_3tcXk {\n background-color: #24cd11;\n color: black;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-content": "security-manager-modal_modal-content_3qWwH",
|
||
"modalContent": "security-manager-modal_modal-content_3qWwH",
|
||
"body": "security-manager-modal_body_Pn7qy",
|
||
"buttons": "security-manager-modal_buttons_1LSKA",
|
||
"deny-button": "security-manager-modal_deny-button_3Vd-R",
|
||
"denyButton": "security-manager-modal_deny-button_3Vd-R",
|
||
"allow-button": "security-manager-modal_allow-button_3tcXk",
|
||
"allowButton": "security-manager-modal_allow-button_3tcXk"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-security-manager-modal/url.css":
|
||
/*!*****************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tw-security-manager-modal/url.css ***!
|
||
\*****************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, ".url_url_3Y61f {\n font-family: monospace;\n -webkit-user-select: text;\n -moz-user-select: text;\n -ms-user-select: text;\n user-select: text;\n word-wrap: break-word;\n}\n.url_url_3Y61f::before {\n content: '\"';\n}\n.url_url_3Y61f::after {\n content: '\"';\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"url": "url_url_3Y61f"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-settings-modal/settings-modal.css":
|
||
/*!********************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tw-settings-modal/settings-modal.css ***!
|
||
\********************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var escape = __webpack_require__(/*! ../../../node_modules/css-loader/lib/url/escape.js */ "./node_modules/css-loader/lib/url/escape.js");
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .settings-modal_modal-content_2bE7f {\n max-width: 750px;\n} .settings-modal_body_cAUJ0 {\n background: hsla(0, 100%, 100%, 1);\n padding: 1.5rem 2.25rem;\n min-height: 150px;\n max-height: calc(100vh - 250px);\n overflow-y: auto;\n} [theme=\"dark\"] .settings-modal_body_cAUJ0 {\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n} /* For small screens, such as in the embed */ @media (max-height: 600px) {\n .settings-modal_modal-content_2bE7f {\n margin: 50px auto;\n }\n .settings-modal_body_cAUJ0 {\n max-height: calc(100vh - 150px);\n }\n} .settings-modal_setting_PxhNM {\n display: flex;\n flex-direction: column;\n padding: 0.5rem 1rem;\n margin: 0.25rem 0;\n border-radius: 4px;\n} .settings-modal_setting_PxhNM.settings-modal_active_1McfX {\n background: #dbebff;\n} .settings-modal_setting_PxhNM:hover,\n.settings-modal_setting_PxhNM:focus-within {\n background: #cadef5;\n} [theme=\"dark\"] .settings-modal_setting_PxhNM.settings-modal_active_1McfX {\n background: #16202c;\n} [theme=\"dark\"] .settings-modal_setting_PxhNM:hover,\n[theme=\"dark\"] .settings-modal_setting_PxhNM:focus-within {\n background: #202f41;\n} .settings-modal_label_2Phuq {\n height: 32px;\n display: flex;\n flex-direction: row;\n align-items: center;\n} .settings-modal_setting_PxhNM table {\n border-collapse: collapse;\n} .settings-modal_setting_PxhNM tr,\n.settings-modal_setting_PxhNM td,\n.settings-modal_setting_PxhNM th {\n padding: 0;\n margin: 0;\n border: 1px solid var(--ui-tertiary, hsla(215, 50%, 90%, 1));\n} .settings-modal_checkbox_1dXwG {\n margin-right: 0.5rem;\n} .settings-modal_help-icon_2FTix {\n border: 0;\n background-color: transparent;\n background-image: url(" + escape(__webpack_require__(/*! ./help-black.svg */ "./src/components/tw-settings-modal/help-black.svg")) + ");\n width: 20px;\n height: 20px;\n background-size: 100%;\n margin-left: 0.5rem;\n cursor: pointer;\n} [theme=\"dark\"] .settings-modal_help-icon_2FTix {\n background-image: url(" + escape(__webpack_require__(/*! ./help-white.svg */ "./src/components/tw-settings-modal/help-white.svg")) + ");\n} .settings-modal_custom-stage-size_3I0AA > * {\n margin-right: 0.5rem;\n} .settings-modal_custom-stage-size-input_2ivQT {\n width: 80px;\n} .settings-modal_info_1a5yx {\n margin-bottom: 0.25rem;\n} .settings-modal_header_3lDNd {\n display: flex;\n flex-direction: row;\n align-items: center;\n margin: 0.5rem 0 0 0;\n font-weight: bold;\n} .settings-modal_divider_7euKA {\n flex-grow: 1;\n margin-left: 1rem;\n border-top: 1px dashed var(--ui-tertiary, hsla(215, 50%, 90%, 1));\n} .settings-modal_button_15QCA {\n font-family: inherit;\n font-size: 14px;\n background-color: hsla(0, 100%, 65%, 1);\n color: white;\n border: none;\n padding: 0.5rem 1rem;\n margin: 0;\n border-radius: 4px;\n cursor: pointer;\n font-family: inherit;\n font-weight: bold;\n} .settings-modal_button_15QCA:active, .settings-modal_button_15QCA:focus-within {\n box-shadow: 0 0 0 3px hsla(0, 100%, 65%, 0.35);\n} .settings-modal_warning_2xSC8 {\n padding: 0.5rem 1rem;\n margin: 0.25rem 0;\n border-radius: 4px;\n background: rgb(233, 233, 53);\n} [theme=\"dark\"] .settings-modal_warning_2xSC8 {\n background: rgb(114, 102, 0);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-content": "settings-modal_modal-content_2bE7f",
|
||
"modalContent": "settings-modal_modal-content_2bE7f",
|
||
"body": "settings-modal_body_cAUJ0",
|
||
"setting": "settings-modal_setting_PxhNM",
|
||
"active": "settings-modal_active_1McfX",
|
||
"label": "settings-modal_label_2Phuq",
|
||
"checkbox": "settings-modal_checkbox_1dXwG",
|
||
"help-icon": "settings-modal_help-icon_2FTix",
|
||
"helpIcon": "settings-modal_help-icon_2FTix",
|
||
"custom-stage-size": "settings-modal_custom-stage-size_3I0AA",
|
||
"customStageSize": "settings-modal_custom-stage-size_3I0AA",
|
||
"custom-stage-size-input": "settings-modal_custom-stage-size-input_2ivQT",
|
||
"customStageSizeInput": "settings-modal_custom-stage-size-input_2ivQT",
|
||
"info": "settings-modal_info_1a5yx",
|
||
"header": "settings-modal_header_3lDNd",
|
||
"divider": "settings-modal_divider_7euKA",
|
||
"button": "settings-modal_button_15QCA",
|
||
"warning": "settings-modal_warning_2xSC8"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-username-modal/username-modal.css":
|
||
/*!********************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/tw-username-modal/username-modal.css ***!
|
||
\********************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .username-modal_modal-content_2pKC4 {\n width: 400px;\n} .username-modal_body_UaL6e {\n background: hsla(0, 100%, 100%, 1);\n padding: 1.5rem 2.25rem;\n} [theme=\"dark\"] .username-modal_body_UaL6e {\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n} .username-modal_body_UaL6e input[type=\"checkbox\"],\n.username-modal_body_UaL6e input[type=\"radio\"] {\n margin: 3px;\n} .username-modal_text-input_3z1ni {\n margin-bottom: 1rem;\n width: 100%;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n border-radius: 5px;\n padding: 0 1rem;\n height: 3rem;\n color: hsla(225, 15%, 40%, 0.75);\n font-size: .875rem;\n} [theme=\"dark\"] .username-modal_text-input_3z1ni {\n background: var(--ui-secondary, hsla(215, 75%, 95%, 1));\n color: white;\n} .username-modal_button-row_2amuh {\n font-weight: bolder;\n text-align: right;\n} .username-modal_button-row_2amuh button {\n padding: 0.75rem 1rem;\n border-radius: 0.25rem;\n background: white;\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n font-weight: 600;\n font-size: 0.85rem;\n} .username-modal_button-row_2amuh button[disabled] {\n opacity: 0.5;\n} [dir=\"ltr\"] .username-modal_button-row_2amuh button + button {\n margin-left: 0.5rem;\n} [dir=\"rtl\"] .username-modal_button-row_2amuh button + button {\n margin-right: 0.5rem;\n} .username-modal_button-row_2amuh button.username-modal_ok-button_UEZfz {\n background: hsla(0, 100%, 65%, 1);\n border: hsla(0, 100%, 65%, 1);\n color: white;\n} .username-modal_button-row_2amuh button.username-modal_cancel-button_3bs7j {\n color: black;\n} .username-modal_help-text_3dN2- {\n margin-bottom: 1rem;\n} .username-modal_must-change_1uhS8 {\n font-weight: bold;\n} .username-modal_reset-link_2djuz {\n cursor: pointer;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-content": "username-modal_modal-content_2pKC4",
|
||
"modalContent": "username-modal_modal-content_2pKC4",
|
||
"body": "username-modal_body_UaL6e",
|
||
"text-input": "username-modal_text-input_3z1ni",
|
||
"textInput": "username-modal_text-input_3z1ni",
|
||
"button-row": "username-modal_button-row_2amuh",
|
||
"buttonRow": "username-modal_button-row_2amuh",
|
||
"ok-button": "username-modal_ok-button_UEZfz",
|
||
"okButton": "username-modal_ok-button_UEZfz",
|
||
"cancel-button": "username-modal_cancel-button_3bs7j",
|
||
"cancelButton": "username-modal_cancel-button_3bs7j",
|
||
"help-text": "username-modal_help-text_3dN2-",
|
||
"helpText": "username-modal_help-text_3dN2-",
|
||
"must-change": "username-modal_must-change_1uhS8",
|
||
"mustChange": "username-modal_must-change_1uhS8",
|
||
"reset-link": "username-modal_reset-link_2djuz",
|
||
"resetLink": "username-modal_reset-link_2djuz"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/watermark/watermark.css":
|
||
/*!*******************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/watermark/watermark.css ***!
|
||
\*******************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "\n.watermark_sprite-image_3ywoR {\n margin: auto;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n max-width: 48px;\n max-height: 48px;\n opacity: 0.35;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"sprite-image": "watermark_sprite-image_3ywoR",
|
||
"spriteImage": "watermark_sprite-image_3ywoR"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/waveform/waveform.css":
|
||
/*!*****************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/waveform/waveform.css ***!
|
||
\*****************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .waveform_container_2K9Om {\n width: 100%;\n} .waveform_waveform-path_TskyB {\n /*\n This color is lighter than sound-primary, but\n cannot use alpha because of overlapping elements.\n */\n fill: hsl(300, 54%, 72%);\n stroke: hsla(300, 48%, 50%, 1);\n} .waveform_baseline_2J5dw {\n stroke: hsla(300, 48%, 50%, 1);\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"container": "waveform_container_2K9Om",
|
||
"waveform-path": "waveform_waveform-path_TskyB",
|
||
"waveformPath": "waveform_waveform-path_TskyB",
|
||
"baseline": "waveform_baseline_2J5dw"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/webgl-modal/webgl-modal.css":
|
||
/*!***********************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/components/webgl-modal/webgl-modal.css ***!
|
||
\***********************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var escape = __webpack_require__(/*! ../../../node_modules/css-loader/lib/url/escape.js */ "./node_modules/css-loader/lib/url/escape.js");
|
||
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /* make sure to keep these in sync with other constants,\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */ /* layout contants from `layout-constants.js` */ body {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n} h2 {\n font-size: 1.5rem;\n font-weight: bold;\n} p {\n font-size: 1rem;\n line-height: 1.5em;\n} /*\n Contains constants for the z-index values of elements that are part of the global stack context.\n In other words, z-index values that are \"inside\" a component are not added here.\n This prevents conflicts between identical z-index values in different components.\n*/ /* Toolbox z-index: 40; set in scratch-blocks */ /* tooltips should go over add buttons if they overlap */ /* monitors go over add buttons */ /* \"ask\" block text input goes above monitors */ /* menu-bar should go over monitors, alerts and tutorials */ /* tw: show below menu bar normally */ /* Block drag z-index: 1000; default 50 is overriden in blocks.css */ /* so it is draggable into other panes */ /* in most interfaces, the context menu is always on top */ .webgl-modal_modal-overlay_2yidY {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 510;\n background-color: var(--ui-modal-overlay, hsla(0, 100%, 65%, 0.9));\n} .webgl-modal_modal-content_rn15F {\n margin: 100px auto;\n outline: none;\n border: .25rem solid hsla(0, 100%, 100%, 0.25);\n padding: 0;\n border-radius: 0.5rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n width: 500px;\n\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n overflow: hidden;\n} .webgl-modal_illustration_2ReF1 {\n width: 100%;\n height: 208px;\n background-color: hsla(0, 100%, 65%, 1);\n background-image: url(" + escape(__webpack_require__(/*! ./unsupported.png */ "./src/components/webgl-modal/unsupported.png")) + ");\n background-size: cover;\n} [dir=\"rtl\"] .webgl-modal_illustration_2ReF1 {\n transform: scaleX(-1);\n} .webgl-modal_body_4eA8i {\n background: hsla(0, 100%, 100%, 1);\n padding: 1.5rem 2.25rem;\n text-align: center;\n} [theme=\"dark\"] .webgl-modal_body_4eA8i {\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n background: var(--ui-primary, hsla(215, 100%, 95%, 1));\n} /* Confirmation buttons at the bottom of the modal */ .webgl-modal_button-row_btS-j {\n margin: 1.5rem 0;\n font-weight: bolder;\n text-align: right;\n display: flex;\n justify-content: center;\n} .webgl-modal_button-row_btS-j button {\n border: 1px solid hsla(0, 100%, 65%, 1);\n border-radius: 0.25rem;\n padding: 0.5rem 2rem;\n background: hsla(0, 100%, 65%, 1);\n color: white;\n font-weight: bold;\n font-size: 0.875rem;\n} .webgl-modal_faq-link-text_YThHx {\n margin: 2rem 0 .5rem 0;\n font-size: .875rem;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n} .webgl-modal_faq-link_Fj6Lw {\n color: hsla(0, 100%, 65%, 1);\n text-decoration: none;\n}\n", ""]);
|
||
|
||
// exports
|
||
exports.locals = {
|
||
"modal-overlay": "webgl-modal_modal-overlay_2yidY",
|
||
"modalOverlay": "webgl-modal_modal-overlay_2yidY",
|
||
"modal-content": "webgl-modal_modal-content_rn15F",
|
||
"modalContent": "webgl-modal_modal-content_rn15F",
|
||
"illustration": "webgl-modal_illustration_2ReF1",
|
||
"body": "webgl-modal_body_4eA8i",
|
||
"button-row": "webgl-modal_button-row_btS-j",
|
||
"buttonRow": "webgl-modal_button-row_btS-j",
|
||
"faq-link-text": "webgl-modal_faq-link-text_YThHx",
|
||
"faqLinkText": "webgl-modal_faq-link-text_YThHx",
|
||
"faq-link": "webgl-modal_faq-link_Fj6Lw",
|
||
"faqLink": "webgl-modal_faq-link_Fj6Lw"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/lib/normalize.css":
|
||
/*!**************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/lib/normalize.css ***!
|
||
\**************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(/*! ../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.i, "/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}\nbody{margin:0}\narticle,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}\naudio,canvas,progress,video{display:inline-block;vertical-align:baseline}\naudio:not([controls]){display:none;height:0}\n[hidden],template{display:none}\na{background-color:transparent}\na:active,a:hover{outline:0}\nabbr[title]{border-bottom:1px dotted}\nb,strong{font-weight:bold}\ndfn{font-style:italic}\nh1{font-size:2em;margin:.67em 0}\nmark{background:#ff0;color:#000}\nsmall{font-size:80%}\nsub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}\nsup{top:-0.5em}\nsub{bottom:-0.25em}\nimg{border:0}\nsvg:not(:root){overflow:hidden}\nfigure{margin:1em 40px}\nhr{box-sizing:content-box;height:0}\npre{overflow:auto}\ncode,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}\nbutton,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}\nbutton{overflow:visible}\nbutton,select{text-transform:none}\nbutton,html input[type=\"button\"],input[type=\"reset\"],input[type=\"submit\"]{-webkit-appearance:button;cursor:pointer}\nbutton[disabled],html input[disabled]{cursor:default}\nbutton::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}\ninput{line-height:normal}\ninput[type=\"checkbox\"],input[type=\"radio\"]{box-sizing:border-box;padding:0}\ninput[type=\"number\"]::-webkit-inner-spin-button,input[type=\"number\"]::-webkit-outer-spin-button{height:auto}\ninput[type=\"search\"]{-webkit-appearance:textfield;box-sizing:content-box}\ninput[type=\"search\"]::-webkit-search-cancel-button,input[type=\"search\"]::-webkit-search-decoration{-webkit-appearance:none}\nfieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}\nlegend{border:0;padding:0}\ntextarea{overflow:auto}\noptgroup{font-weight:bold}\ntable{border-collapse:collapse;border-spacing:0}\ntd,th{padding:0}\n", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/raw-loader/index.js!./src/lib/default-project/cd21514d0531fdffb22204e0ec5ed84a.svg":
|
||
/*!************************************************************************************************!*\
|
||
!*** ./node_modules/raw-loader!./src/lib/default-project/cd21514d0531fdffb22204e0ec5ed84a.svg ***!
|
||
\************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = "<svg version=\"1.1\" width=\"2\" height=\"2\" viewBox=\"-1 -1 2 2\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <!-- Exported by Scratch - http://scratch.mit.edu/ -->\n</svg>"
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/raw-loader/index.js!./src/lib/default-project/dango.svg":
|
||
/*!*********************************************************************!*\
|
||
!*** ./node_modules/raw-loader!./src/lib/default-project/dango.svg ***!
|
||
\*********************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"87.99945\" height=\"88.00142\" viewBox=\"0,0,87.99945,88.00142\">\n <!-- This icon is based on Twemoji https://twemoji.twitter.com/ -->\n <!-- License: CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ -->\n <g transform=\"translate(-196.00028,-135.99929)\">\n <g data-paper-data=\"{"isPaintingLayer":true}\" fill-rule=\"nonzero\" stroke=\"none\" stroke-width=\"1\" stroke-linecap=\"butt\" stroke-linejoin=\"miter\" stroke-miterlimit=\"10\" stroke-dasharray=\"\" stroke-dashoffset=\"0\" style=\"mix-blend-mode: normal\">\n <path d=\"M280.76164,224.00071c-0.82849,0 -1.65698,-0.31661 -2.29021,-0.94721l-80.84584,-80.84848c-1.26384,-1.26384 -1.26384,-3.31657 0,-4.58041c1.26384,-1.26384 3.31657,-1.26384 4.58041,0l80.84584,80.84584c1.26384,1.26384 1.26384,3.31657 0,4.58041c-0.63324,0.6306 -1.46173,0.94985 -2.29021,0.94985z\" fill=\"#d99e82\"/>\n <path d=\"M231.6304,153.81435c0,9.83892 -7.97614,17.81506 -17.81506,17.81506c-9.83892,0 -17.81506,-7.97614 -17.81506,-17.81506c0,-9.83892 7.97614,-17.81506 17.81506,-17.81506c9.83892,0 17.81506,7.97614 17.81506,17.81506z\" fill=\"#fcb1e3\"/>\n <path d=\"M229.16098,190.59288c-9.57565,-2.26111 -15.50524,-11.85671 -13.24412,-21.43235c2.26111,-9.57565 11.85671,-15.50524 21.43235,-13.24412c9.57565,2.26111 15.50524,11.85671 13.24412,21.43235c-2.26111,9.57565 -11.85671,15.50524 -21.43235,13.24412z\" fill=\"#ffd983\"/>\n <path d=\"M270.50321,192.68453c0,9.83892 -7.97878,17.81769 -17.81769,17.81769c-9.83892,0 -17.81506,-7.97878 -17.81506,-17.81769c0,-9.83892 7.97614,-17.81506 17.81506,-17.81506c9.83892,0 17.81769,7.97878 17.81769,17.81506z\" fill=\"#a6d388\"/>\n <path d=\"M280.76164,224.00071c-0.82849,0 -1.65698,-0.31661 -2.29021,-0.94721l-19.84141,-19.84141c-1.26648,-1.26384 -1.26648,-3.31657 0,-4.58041c1.26648,-1.26384 3.31393,-1.26384 4.58041,0l19.84141,19.84141c1.26384,1.26384 1.26384,3.31657 0,4.58041c-0.63324,0.62796 -1.46173,0.94721 -2.29021,0.94721z\" fill=\"#d99e82\"/>\n </g>\n </g>\n</svg>"
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/raw-loader/index.js!./src/lib/tw-missing-project/c17163c6954e9422ac2405de4c9d68c8.svg":
|
||
/*!***************************************************************************************************!*\
|
||
!*** ./node_modules/raw-loader!./src/lib/tw-missing-project/c17163c6954e9422ac2405de4c9d68c8.svg ***!
|
||
\***************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"415.33334\" height=\"28\" viewBox=\"0,0,415.33334,28\"><g transform=\"translate(-32.58333,-164.25)\"><g data-paper-data=\"{"isPaintingLayer":true}\" fill=\"#9966ff\" fill-rule=\"nonzero\" stroke=\"none\" stroke-width=\"1\" stroke-linecap=\"butt\" stroke-linejoin=\"miter\" stroke-miterlimit=\"10\" stroke-dasharray=\"\" stroke-dashoffset=\"0\" font-family=\"Sans Serif\" font-weight=\"normal\" font-size=\"40\" text-anchor=\"start\" style=\"mix-blend-mode: normal\"><text transform=\"translate(32.83333,186) scale(0.5,0.5)\" font-size=\"40\" xml:space=\"preserve\" fill=\"#9966ff\" fill-rule=\"nonzero\" stroke=\"none\" stroke-width=\"1\" stroke-linecap=\"butt\" stroke-linejoin=\"miter\" stroke-miterlimit=\"10\" stroke-dasharray=\"\" stroke-dashoffset=\"0\" font-family=\"Sans Serif\" font-weight=\"normal\" text-anchor=\"start\" style=\"mix-blend-mode: normal\"><tspan x=\"0\" dy=\"0\">The project you tried to load does not exist.</tspan></text></g></g></svg>"
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/addons/entry.js":
|
||
/*!*****************************!*\
|
||
!*** ./src/addons/entry.js ***!
|
||
\*****************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
const runAddons = () => {
|
||
Promise.all(/*! import() | addons */[__webpack_require__.e("addon-settings~addons~editor~fullscreen~player"), __webpack_require__.e("addons")]).then(__webpack_require__.bind(null, /*! ./api */ "./src/addons/api.js"));
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (runAddons);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/addons/hooks.js":
|
||
/*!*****************************!*\
|
||
!*** ./src/addons/hooks.js ***!
|
||
\*****************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
const AddonHooks = {
|
||
appStateReducer: () => {},
|
||
appStateStore: null,
|
||
blockly: null,
|
||
blocklyCallbacks: []
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (AddonHooks);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/action-menu/action-menu.css":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/action-menu/action-menu.css ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./action-menu.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/action-menu/action-menu.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/action-menu/action-menu.jsx":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/action-menu/action-menu.jsx ***!
|
||
\****************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_tooltip__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-tooltip */ "./node_modules/react-tooltip/dist/index.js");
|
||
/* harmony import */ var react_tooltip__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_tooltip__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _action_menu_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./action-menu.css */ "./src/components/action-menu/action-menu.css");
|
||
/* harmony import */ var _action_menu_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_action_menu_css__WEBPACK_IMPORTED_MODULE_5__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const CLOSE_DELAY = 300; // ms
|
||
|
||
class ActionMenu extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default()(this, ['clickDelayer', 'handleClosePopover', 'handleToggleOpenState', 'handleTouchStart', 'handleTouchOutside', 'setButtonRef', 'setContainerRef']);
|
||
this.state = {
|
||
isOpen: false,
|
||
forceHide: false
|
||
};
|
||
this.mainTooltipId = "tooltip-".concat(Math.random());
|
||
}
|
||
|
||
componentDidMount() {
|
||
// Touch start on the main button is caught to trigger open and not click
|
||
this.buttonRef.addEventListener('touchstart', this.handleTouchStart); // Touch start on document is used to trigger close if it is outside
|
||
|
||
document.addEventListener('touchstart', this.handleTouchOutside);
|
||
}
|
||
|
||
shouldComponentUpdate(newProps, newState) {
|
||
// This check prevents re-rendering while the project is updating.
|
||
// @todo check only the state and the title because it is enough to know
|
||
// if anything substantial has changed
|
||
// This is needed because of the sloppy way the props are passed as a new object,
|
||
// which should be refactored.
|
||
return newState.isOpen !== this.state.isOpen || newState.forceHide !== this.state.forceHide || newProps.title !== this.props.title;
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.buttonRef.removeEventListener('touchstart', this.handleTouchStart);
|
||
document.removeEventListener('touchstart', this.handleTouchOutside);
|
||
}
|
||
|
||
handleClosePopover() {
|
||
this.closeTimeoutId = setTimeout(() => {
|
||
this.setState({
|
||
isOpen: false
|
||
});
|
||
this.closeTimeoutId = null;
|
||
}, CLOSE_DELAY);
|
||
}
|
||
|
||
handleToggleOpenState() {
|
||
// Mouse enter back in after timeout was started prevents it from closing.
|
||
if (this.closeTimeoutId) {
|
||
clearTimeout(this.closeTimeoutId);
|
||
this.closeTimeoutId = null;
|
||
} else if (!this.state.isOpen) {
|
||
this.setState({
|
||
isOpen: true,
|
||
forceHide: false
|
||
});
|
||
}
|
||
}
|
||
|
||
handleTouchOutside(e) {
|
||
if (this.state.isOpen && !this.containerRef.contains(e.target)) {
|
||
this.setState({
|
||
isOpen: false
|
||
});
|
||
react_tooltip__WEBPACK_IMPORTED_MODULE_4___default.a.hide();
|
||
}
|
||
}
|
||
|
||
clickDelayer(fn) {
|
||
// Return a wrapped action that manages the menu closing.
|
||
// @todo we may be able to use react-transition for this in the future
|
||
// for now all this work is to ensure the menu closes BEFORE the
|
||
// (possibly slow) action is started.
|
||
return event => {
|
||
react_tooltip__WEBPACK_IMPORTED_MODULE_4___default.a.hide();
|
||
if (fn) fn(event); // Blur the button so it does not keep focus after being clicked
|
||
// This prevents keyboard events from triggering the button
|
||
|
||
this.buttonRef.blur();
|
||
this.setState({
|
||
forceHide: true,
|
||
isOpen: false
|
||
}, () => {
|
||
setTimeout(() => this.setState({
|
||
forceHide: false
|
||
}));
|
||
});
|
||
};
|
||
}
|
||
|
||
handleTouchStart(e) {
|
||
// Prevent this touch from becoming a click if menu is closed
|
||
if (!this.state.isOpen) {
|
||
e.preventDefault();
|
||
this.handleToggleOpenState();
|
||
}
|
||
}
|
||
|
||
setButtonRef(ref) {
|
||
this.buttonRef = ref;
|
||
}
|
||
|
||
setContainerRef(ref) {
|
||
this.containerRef = ref;
|
||
}
|
||
|
||
render() {
|
||
const {
|
||
className,
|
||
img: mainImg,
|
||
title: mainTitle,
|
||
moreButtons,
|
||
tooltipPlace,
|
||
onClick
|
||
} = this.props;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.menuContainer, className, {
|
||
[_action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.expanded]: this.state.isOpen,
|
||
[_action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.forceHidden]: this.state.forceHide
|
||
}),
|
||
ref: this.setContainerRef,
|
||
onMouseEnter: this.handleToggleOpenState,
|
||
onMouseLeave: this.handleClosePopover
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
|
||
"aria-label": mainTitle,
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.button, _action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.mainButton),
|
||
"data-for": this.mainTooltipId,
|
||
"data-tip": mainTitle,
|
||
ref: this.setButtonRef,
|
||
onClick: this.clickDelayer(onClick)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.mainIcon,
|
||
draggable: false,
|
||
src: mainImg
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_tooltip__WEBPACK_IMPORTED_MODULE_4___default.a, {
|
||
className: _action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.tooltip,
|
||
effect: "solid",
|
||
id: this.mainTooltipId,
|
||
place: tooltipPlace || 'left'
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.moreButtonsOuter
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.moreButtons
|
||
}, (moreButtons || []).map(({
|
||
img,
|
||
title,
|
||
onClick: handleClick,
|
||
fileAccept,
|
||
fileChange,
|
||
fileInput,
|
||
fileMultiple
|
||
}, keyId) => {
|
||
const isComingSoon = !handleClick;
|
||
const hasFileInput = fileInput;
|
||
const tooltipId = "".concat(this.mainTooltipId, "-").concat(title);
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
key: "".concat(tooltipId, "-").concat(keyId)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
|
||
"aria-label": title,
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.button, _action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.moreButton, {
|
||
[_action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.comingSoon]: isComingSoon
|
||
}),
|
||
"data-for": tooltipId,
|
||
"data-tip": title,
|
||
onClick: hasFileInput ? handleClick : this.clickDelayer(handleClick)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.moreIcon,
|
||
draggable: false,
|
||
src: img
|
||
}), hasFileInput ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
|
||
accept: fileAccept,
|
||
className: _action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.fileInput,
|
||
multiple: fileMultiple,
|
||
ref: fileInput,
|
||
type: "file",
|
||
onChange: fileChange
|
||
}) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_tooltip__WEBPACK_IMPORTED_MODULE_4___default.a, {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.tooltip, {
|
||
[_action_menu_css__WEBPACK_IMPORTED_MODULE_5___default.a.comingSoonTooltip]: isComingSoon
|
||
}),
|
||
effect: "solid",
|
||
id: tooltipId,
|
||
place: tooltipPlace || 'left'
|
||
}));
|
||
}))));
|
||
}
|
||
|
||
}
|
||
|
||
ActionMenu.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
img: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
moreButtons: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
img: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.node.isRequired,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
// Optional, "coming soon" if no callback provided
|
||
fileAccept: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
// Optional, only for file upload
|
||
fileChange: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
// Optional, only for file upload
|
||
fileInput: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
// Optional, only for file upload
|
||
fileMultiple: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool // Optional, only for file upload
|
||
|
||
})),
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.node.isRequired,
|
||
tooltipPlace: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (ActionMenu);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/action-menu/icon--backdrop.svg":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/action-menu/icon--backdrop.svg ***!
|
||
\*******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/385aa4b73a425883b4f9e91501a52299.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/action-menu/icon--file-upload.svg":
|
||
/*!**********************************************************!*\
|
||
!*** ./src/components/action-menu/icon--file-upload.svg ***!
|
||
\**********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/e587d9d7e9a2f1f28041ba5c15db7a40.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/action-menu/icon--paint.svg":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/action-menu/icon--paint.svg ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/94b06fb716871f81bec601724e29a457.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/action-menu/icon--search.svg":
|
||
/*!*****************************************************!*\
|
||
!*** ./src/components/action-menu/icon--search.svg ***!
|
||
\*****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/551aae506dfa65ce3b45713b5300a678.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/action-menu/icon--sprite.svg":
|
||
/*!*****************************************************!*\
|
||
!*** ./src/components/action-menu/icon--sprite.svg ***!
|
||
\*****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/497f797eeffe5fa7e6a626abc0db08a1.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/action-menu/icon--surprise.svg":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/action-menu/icon--surprise.svg ***!
|
||
\*******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/301439e2e5ab88b658368ee525e6752b.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/alerts/alert.css":
|
||
/*!*****************************************!*\
|
||
!*** ./src/components/alerts/alert.css ***!
|
||
\*****************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./alert.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/alerts/alert.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/alerts/alert.jsx":
|
||
/*!*****************************************!*\
|
||
!*** ./src/components/alerts/alert.jsx ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _close_button_close_button_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../close-button/close-button.jsx */ "./src/components/close-button/close-button.jsx");
|
||
/* harmony import */ var _spinner_spinner_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../spinner/spinner.jsx */ "./src/components/spinner/spinner.jsx");
|
||
/* harmony import */ var _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib/alerts/index.jsx */ "./src/lib/alerts/index.jsx");
|
||
/* harmony import */ var _alert_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./alert.css */ "./src/components/alerts/alert.css");
|
||
/* harmony import */ var _alert_css__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_alert_css__WEBPACK_IMPORTED_MODULE_8__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const closeButtonColors = {
|
||
[_lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_7__["AlertLevels"].SUCCESS]: _close_button_close_button_jsx__WEBPACK_IMPORTED_MODULE_5__["default"].COLOR_GREEN,
|
||
[_lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_7__["AlertLevels"].WARN]: _close_button_close_button_jsx__WEBPACK_IMPORTED_MODULE_5__["default"].COLOR_ORANGE
|
||
};
|
||
|
||
const AlertComponent = ({
|
||
content,
|
||
closeButton,
|
||
extensionName,
|
||
iconSpinner,
|
||
iconURL,
|
||
level,
|
||
showDownload,
|
||
showSaveNow,
|
||
onCloseAlert,
|
||
onDownload,
|
||
onSaveNow,
|
||
onReconnect,
|
||
showReconnect
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_alert_css__WEBPACK_IMPORTED_MODULE_8___default.a.alert, _alert_css__WEBPACK_IMPORTED_MODULE_8___default.a[level])
|
||
}, (iconSpinner || iconURL) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _alert_css__WEBPACK_IMPORTED_MODULE_8___default.a.iconSection
|
||
}, iconSpinner && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_spinner_spinner_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
className: _alert_css__WEBPACK_IMPORTED_MODULE_8___default.a.alertSpinner,
|
||
level: level
|
||
}), iconURL && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {
|
||
className: _alert_css__WEBPACK_IMPORTED_MODULE_8___default.a.alertIcon,
|
||
src: iconURL
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _alert_css__WEBPACK_IMPORTED_MODULE_8___default.a.alertMessage
|
||
}, extensionName ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Lost connection to {extensionName}.",
|
||
id: "tw.alerts.lostPeripheralConnection",
|
||
values: {
|
||
extensionName: "".concat(extensionName)
|
||
}
|
||
}) : content), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _alert_css__WEBPACK_IMPORTED_MODULE_8___default.a.alertButtons
|
||
}, showSaveNow && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
|
||
className: _alert_css__WEBPACK_IMPORTED_MODULE_8___default.a.alertConnectionButton,
|
||
onClick: onSaveNow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Try Again",
|
||
id: "gui.alerts.tryAgain"
|
||
})), showDownload && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
|
||
className: _alert_css__WEBPACK_IMPORTED_MODULE_8___default.a.alertConnectionButton,
|
||
onClick: onDownload
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Download",
|
||
id: "gui.alerts.download"
|
||
})), showReconnect && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
|
||
className: _alert_css__WEBPACK_IMPORTED_MODULE_8___default.a.alertConnectionButton,
|
||
onClick: onReconnect
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Reconnect",
|
||
id: "gui.connection.reconnect"
|
||
})), closeButton && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _alert_css__WEBPACK_IMPORTED_MODULE_8___default.a.alertCloseButtonContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_close_button_close_button_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_alert_css__WEBPACK_IMPORTED_MODULE_8___default.a.alertCloseButton),
|
||
color: closeButtonColors[level],
|
||
size: _close_button_close_button_jsx__WEBPACK_IMPORTED_MODULE_5__["default"].SIZE_LARGE,
|
||
onClick: onCloseAlert
|
||
}))));
|
||
|
||
AlertComponent.propTypes = {
|
||
closeButton: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
content: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.element, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string]),
|
||
extensionName: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
iconSpinner: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
iconURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
level: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onCloseAlert: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onDownload: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onReconnect: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onSaveNow: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
showDownload: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
showReconnect: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
showSaveNow: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
AlertComponent.defaultProps = {
|
||
level: _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_7__["AlertLevels"].WARN
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (AlertComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/alerts/alerts.css":
|
||
/*!******************************************!*\
|
||
!*** ./src/components/alerts/alerts.css ***!
|
||
\******************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./alerts.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/alerts/alerts.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/alerts/alerts.jsx":
|
||
/*!******************************************!*\
|
||
!*** ./src/components/alerts/alerts.jsx ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _containers_alert_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../containers/alert.jsx */ "./src/containers/alert.jsx");
|
||
/* harmony import */ var _alerts_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./alerts.css */ "./src/components/alerts/alerts.css");
|
||
/* harmony import */ var _alerts_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_alerts_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const AlertsComponent = ({
|
||
alertsList,
|
||
className,
|
||
onCloseAlert
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
||
bounds: "parent",
|
||
className: className
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
||
className: _alerts_css__WEBPACK_IMPORTED_MODULE_4___default.a.alertsInnerContainer
|
||
}, alertsList.map((a, index) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_containers_alert_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
closeButton: a.closeButton,
|
||
content: a.content,
|
||
extensionId: a.extensionId,
|
||
extensionName: a.extensionName,
|
||
iconSpinner: a.iconSpinner,
|
||
iconURL: a.iconURL,
|
||
index: index,
|
||
key: index,
|
||
level: a.level,
|
||
message: a.message,
|
||
showDownload: a.showDownload,
|
||
showReconnect: a.showReconnect,
|
||
showSaveNow: a.showSaveNow,
|
||
onCloseAlert: onCloseAlert
|
||
}))));
|
||
|
||
AlertsComponent.propTypes = {
|
||
alertsList: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object),
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onCloseAlert: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (AlertsComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/alerts/inline-message.css":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/alerts/inline-message.css ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./inline-message.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/alerts/inline-message.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/alerts/inline-message.jsx":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/alerts/inline-message.jsx ***!
|
||
\**************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _spinner_spinner_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../spinner/spinner.jsx */ "./src/components/spinner/spinner.jsx");
|
||
/* harmony import */ var _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib/alerts/index.jsx */ "./src/lib/alerts/index.jsx");
|
||
/* harmony import */ var _inline_message_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./inline-message.css */ "./src/components/alerts/inline-message.css");
|
||
/* harmony import */ var _inline_message_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_inline_message_css__WEBPACK_IMPORTED_MODULE_5__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const InlineMessageComponent = ({
|
||
content,
|
||
iconSpinner,
|
||
level
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_inline_message_css__WEBPACK_IMPORTED_MODULE_5___default.a.inlineMessage, _inline_message_css__WEBPACK_IMPORTED_MODULE_5___default.a[level])
|
||
}, iconSpinner && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_spinner_spinner_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
small: true,
|
||
className: _inline_message_css__WEBPACK_IMPORTED_MODULE_5___default.a.spinner,
|
||
level: 'info'
|
||
}), content);
|
||
|
||
InlineMessageComponent.propTypes = {
|
||
content: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.element,
|
||
iconSpinner: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
level: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
};
|
||
InlineMessageComponent.defaultProps = {
|
||
level: _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_4__["AlertLevels"].INFO
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (InlineMessageComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/asset-panel/asset-panel.css":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/asset-panel/asset-panel.css ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./asset-panel.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/asset-panel/asset-panel.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/asset-panel/asset-panel.jsx":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/asset-panel/asset-panel.jsx ***!
|
||
\****************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _selector_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./selector.jsx */ "./src/components/asset-panel/selector.jsx");
|
||
/* harmony import */ var _asset_panel_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./asset-panel.css */ "./src/components/asset-panel/asset-panel.css");
|
||
/* harmony import */ var _asset_panel_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_asset_panel_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const AssetPanel = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
||
className: _asset_panel_css__WEBPACK_IMPORTED_MODULE_3___default.a.wrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_selector_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], _extends({
|
||
className: _asset_panel_css__WEBPACK_IMPORTED_MODULE_3___default.a.selector
|
||
}, props)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
||
className: _asset_panel_css__WEBPACK_IMPORTED_MODULE_3___default.a.detailArea
|
||
}, props.children));
|
||
|
||
AssetPanel.propTypes = _objectSpread({}, _selector_jsx__WEBPACK_IMPORTED_MODULE_2__["default"].propTypes);
|
||
/* harmony default export */ __webpack_exports__["default"] = (AssetPanel);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/asset-panel/icon--add-backdrop-lib.svg":
|
||
/*!***************************************************************!*\
|
||
!*** ./src/components/asset-panel/icon--add-backdrop-lib.svg ***!
|
||
\***************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/44e4859e354c81d66c73f741df2e5ec7.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/asset-panel/icon--add-costume-lib.svg":
|
||
/*!**************************************************************!*\
|
||
!*** ./src/components/asset-panel/icon--add-costume-lib.svg ***!
|
||
\**************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/c9528ee4be1a12380a6c9caf73bd99e9.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/asset-panel/icon--add-sound-lib.svg":
|
||
/*!************************************************************!*\
|
||
!*** ./src/components/asset-panel/icon--add-sound-lib.svg ***!
|
||
\************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/9cfdd378e4cc977fe663ca932e530ec6.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/asset-panel/icon--add-sound-record.svg":
|
||
/*!***************************************************************!*\
|
||
!*** ./src/components/asset-panel/icon--add-sound-record.svg ***!
|
||
\***************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/35c6867250ec4f430624bc9e2e7072d7.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/asset-panel/icon--sound-rtl.svg":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/asset-panel/icon--sound-rtl.svg ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/53ef96392ac2a92361884783808a02c9.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/asset-panel/icon--sound.svg":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/asset-panel/icon--sound.svg ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/63e5827c1506216bd7c9927a4e5eb558.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/asset-panel/selector.css":
|
||
/*!*************************************************!*\
|
||
!*** ./src/components/asset-panel/selector.css ***!
|
||
\*************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./selector.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/asset-panel/selector.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/asset-panel/selector.jsx":
|
||
/*!*************************************************!*\
|
||
!*** ./src/components/asset-panel/selector.jsx ***!
|
||
\*************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _containers_sprite_selector_item_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../containers/sprite-selector-item.jsx */ "./src/containers/sprite-selector-item.jsx");
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _action_menu_action_menu_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../action-menu/action-menu.jsx */ "./src/components/action-menu/action-menu.jsx");
|
||
/* harmony import */ var _sortable_asset_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sortable-asset.jsx */ "./src/components/asset-panel/sortable-asset.jsx");
|
||
/* harmony import */ var _lib_sortable_hoc_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib/sortable-hoc.jsx */ "./src/lib/sortable-hoc.jsx");
|
||
/* harmony import */ var _lib_drag_constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../lib/drag-constants */ "./src/lib/drag-constants.js");
|
||
/* harmony import */ var _selector_css__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./selector.css */ "./src/components/asset-panel/selector.css");
|
||
/* harmony import */ var _selector_css__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_selector_css__WEBPACK_IMPORTED_MODULE_9__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const Selector = props => {
|
||
const {
|
||
buttons,
|
||
containerRef,
|
||
dragType,
|
||
isRtl,
|
||
items,
|
||
selectedItemIndex,
|
||
draggingIndex,
|
||
draggingType,
|
||
ordering,
|
||
onAddSortable,
|
||
onRemoveSortable,
|
||
onDeleteClick,
|
||
onDuplicateClick,
|
||
onExportClick,
|
||
onItemClick
|
||
} = props;
|
||
const isRelevantDrag = draggingType === dragType;
|
||
let newButtonSection = null;
|
||
|
||
if (buttons.length > 0) {
|
||
const {
|
||
img,
|
||
title,
|
||
onClick
|
||
} = buttons[0];
|
||
const moreButtons = buttons.slice(1);
|
||
newButtonSection = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.newButtons
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_action_menu_action_menu_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
img: img,
|
||
moreButtons: moreButtons,
|
||
title: title,
|
||
tooltipPlace: isRtl ? 'left' : 'right',
|
||
onClick: onClick
|
||
}));
|
||
}
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.wrapper,
|
||
componentRef: containerRef
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.listArea
|
||
}, items.map((item, index) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_sortable_asset_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
id: item.name,
|
||
index: isRelevantDrag ? ordering.indexOf(index) : index,
|
||
key: item.name,
|
||
onAddSortable: onAddSortable,
|
||
onRemoveSortable: onRemoveSortable
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_sprite_selector_item_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
asset: item.asset,
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.listItem, {
|
||
[_selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.placeholder]: isRelevantDrag && index === draggingIndex
|
||
}),
|
||
costumeURL: item.url,
|
||
details: item.details,
|
||
dragPayload: item.dragPayload,
|
||
dragType: dragType,
|
||
id: index,
|
||
index: index,
|
||
name: item.name,
|
||
number: index + 1
|
||
/* 1-indexed */
|
||
,
|
||
selected: index === selectedItemIndex,
|
||
onClick: onItemClick,
|
||
onDeleteButtonClick: onDeleteClick,
|
||
onDuplicateButtonClick: onDuplicateClick,
|
||
onExportButtonClick: onExportClick
|
||
})))), newButtonSection);
|
||
};
|
||
|
||
Selector.propTypes = {
|
||
buttons: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
img: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func
|
||
})),
|
||
containerRef: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
dragType: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf(Object.keys(_lib_drag_constants__WEBPACK_IMPORTED_MODULE_8__["default"])),
|
||
draggingIndex: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
draggingType: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf(Object.keys(_lib_drag_constants__WEBPACK_IMPORTED_MODULE_8__["default"])),
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
items: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
// eslint-disable-next-line react/forbid-prop-types
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.any
|
||
})),
|
||
onAddSortable: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onDeleteClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onDuplicateClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onExportClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onItemClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onRemoveSortable: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
ordering: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number),
|
||
selectedItemIndex: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(_lib_sortable_hoc_jsx__WEBPACK_IMPORTED_MODULE_7__["default"])(Selector));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/asset-panel/sortable-asset.jsx":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/asset-panel/sortable-asset.jsx ***!
|
||
\*******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
|
||
|
||
|
||
|
||
class SortableAsset extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['setRef']);
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.props.onAddSortable(this.ref);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.props.onRemoveSortable(this.ref);
|
||
}
|
||
|
||
setRef(ref) {
|
||
this.ref = ref;
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: this.props.className,
|
||
ref: this.setRef,
|
||
style: {
|
||
order: this.props.index
|
||
}
|
||
}, this.props.children);
|
||
}
|
||
|
||
}
|
||
|
||
SortableAsset.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node.isRequired,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
index: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,
|
||
onAddSortable: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onRemoveSortable: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (SortableAsset);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/audio-trimmer/audio-selector.jsx":
|
||
/*!*********************************************************!*\
|
||
!*** ./src/components/audio-trimmer/audio-selector.jsx ***!
|
||
\*********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./audio-trimmer.css */ "./src/components/audio-trimmer/audio-trimmer.css");
|
||
/* harmony import */ var _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _selection_handle_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./selection-handle.jsx */ "./src/components/audio-trimmer/selection-handle.jsx");
|
||
/* harmony import */ var _playhead_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./playhead.jsx */ "./src/components/audio-trimmer/playhead.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const AudioSelector = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.absolute, _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.selector),
|
||
ref: props.containerRef,
|
||
onMouseDown: props.onNewSelectionMouseDown,
|
||
onTouchStart: props.onNewSelectionMouseDown
|
||
}, props.trimStart === null ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.absolute),
|
||
style: {
|
||
left: "".concat(props.trimStart * 100, "%"),
|
||
width: "".concat(100 * (props.trimEnd - props.trimStart), "%")
|
||
}
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.absolute, _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.selectionBackground)
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_selection_handle_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
handleStyle: _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.leftHandle,
|
||
onMouseDown: props.onTrimStartMouseDown
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_selection_handle_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
handleStyle: _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.rightHandle,
|
||
onMouseDown: props.onTrimEndMouseDown
|
||
})), props.playhead ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_playhead_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
playbackPosition: props.playhead
|
||
}) : null);
|
||
|
||
AudioSelector.propTypes = {
|
||
containerRef: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onNewSelectionMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onTrimEndMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onTrimStartMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
playhead: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
trimEnd: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
trimStart: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (AudioSelector);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/audio-trimmer/audio-trimmer.css":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/audio-trimmer/audio-trimmer.css ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./audio-trimmer.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/audio-trimmer/audio-trimmer.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/audio-trimmer/audio-trimmer.jsx":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/audio-trimmer/audio-trimmer.jsx ***!
|
||
\********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./audio-trimmer.css */ "./src/components/audio-trimmer/audio-trimmer.css");
|
||
/* harmony import */ var _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _selection_handle_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./selection-handle.jsx */ "./src/components/audio-trimmer/selection-handle.jsx");
|
||
/* harmony import */ var _playhead_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./playhead.jsx */ "./src/components/audio-trimmer/playhead.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const AudioTrimmer = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.absolute, _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.trimmer),
|
||
ref: props.containerRef
|
||
}, props.trimStart === null ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.absolute, _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.trimBackground, _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.startTrimBackground),
|
||
style: {
|
||
width: "".concat(100 * props.trimStart, "%")
|
||
},
|
||
onMouseDown: props.onTrimStartMouseDown,
|
||
onTouchStart: props.onTrimStartMouseDown
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.absolute, _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.trimBackgroundMask)
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_selection_handle_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
handleStyle: _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.leftHandle
|
||
})), props.playhead ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_playhead_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
playbackPosition: props.playhead
|
||
}) : null, props.trimEnd === null ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.absolute, _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.trimBackground, _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.endTrimBackground),
|
||
style: {
|
||
left: "".concat(100 * props.trimEnd, "%"),
|
||
width: "".concat(100 - 100 * props.trimEnd, "%")
|
||
},
|
||
onMouseDown: props.onTrimEndMouseDown,
|
||
onTouchStart: props.onTrimEndMouseDown
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.absolute, _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.trimBackgroundMask)
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_selection_handle_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
handleStyle: _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.rightHandle
|
||
})));
|
||
|
||
AudioTrimmer.propTypes = {
|
||
containerRef: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onTrimEndMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onTrimStartMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
playhead: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
trimEnd: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
trimStart: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (AudioTrimmer);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/audio-trimmer/icon--handle.svg":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/audio-trimmer/icon--handle.svg ***!
|
||
\*******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/b8f0b40efdf6eafc02c3f894a5941818.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/audio-trimmer/playhead.jsx":
|
||
/*!***************************************************!*\
|
||
!*** ./src/components/audio-trimmer/playhead.jsx ***!
|
||
\***************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./audio-trimmer.css */ "./src/components/audio-trimmer/audio-trimmer.css");
|
||
/* harmony import */ var _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
|
||
|
||
|
||
|
||
|
||
const Playhead = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_3___default.a.playheadContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_3___default.a.playhead),
|
||
style: {
|
||
transform: "translateX(".concat(100 * props.playbackPosition, "%)")
|
||
}
|
||
}));
|
||
|
||
Playhead.propTypes = {
|
||
playbackPosition: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Playhead);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/audio-trimmer/selection-handle.jsx":
|
||
/*!***********************************************************!*\
|
||
!*** ./src/components/audio-trimmer/selection-handle.jsx ***!
|
||
\***********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./audio-trimmer.css */ "./src/components/audio-trimmer/audio-trimmer.css");
|
||
/* harmony import */ var _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _icon_handle_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./icon--handle.svg */ "./src/components/audio-trimmer/icon--handle.svg");
|
||
/* harmony import */ var _icon_handle_svg__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_icon_handle_svg__WEBPACK_IMPORTED_MODULE_5__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const SelectionHandle = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.trimLine, props.handleStyle),
|
||
onMouseDown: props.onMouseDown,
|
||
onTouchStart: props.onMouseDown
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.trimHandle, _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.topTrimHandle)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
src: _icon_handle_svg__WEBPACK_IMPORTED_MODULE_5___default.a,
|
||
draggable: false
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.trimHandle, _audio_trimmer_css__WEBPACK_IMPORTED_MODULE_4___default.a.bottomTrimHandle)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
src: _icon_handle_svg__WEBPACK_IMPORTED_MODULE_5___default.a,
|
||
draggable: false
|
||
})));
|
||
|
||
SelectionHandle.propTypes = {
|
||
handleStyle: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
onMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (SelectionHandle);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/backpack/backpack.css":
|
||
/*!**********************************************!*\
|
||
!*** ./src/components/backpack/backpack.css ***!
|
||
\**********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./backpack.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/backpack/backpack.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/backpack/backpack.jsx":
|
||
/*!**********************************************!*\
|
||
!*** ./src/components/backpack/backpack.jsx ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _lib_drag_constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib/drag-constants */ "./src/lib/drag-constants.js");
|
||
/* harmony import */ var _coming_soon_coming_soon_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../coming-soon/coming-soon.jsx */ "./src/components/coming-soon/coming-soon.jsx");
|
||
/* harmony import */ var _containers_sprite_selector_item_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../containers/sprite-selector-item.jsx */ "./src/containers/sprite-selector-item.jsx");
|
||
/* harmony import */ var _backpack_css__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./backpack.css */ "./src/components/backpack/backpack.css");
|
||
/* harmony import */ var _backpack_css__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_backpack_css__WEBPACK_IMPORTED_MODULE_7__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// TODO make sprite selector item not require onClick
|
||
|
||
const noop = () => {};
|
||
|
||
const dragTypeMap = {
|
||
// Keys correspond with the backpack-server item types
|
||
costume: _lib_drag_constants__WEBPACK_IMPORTED_MODULE_4__["default"].BACKPACK_COSTUME,
|
||
sound: _lib_drag_constants__WEBPACK_IMPORTED_MODULE_4__["default"].BACKPACK_SOUND,
|
||
script: _lib_drag_constants__WEBPACK_IMPORTED_MODULE_4__["default"].BACKPACK_CODE,
|
||
sprite: _lib_drag_constants__WEBPACK_IMPORTED_MODULE_4__["default"].BACKPACK_SPRITE
|
||
};
|
||
const labelMap = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
costume: {
|
||
"id": "gui.backpack.costumeLabel",
|
||
"defaultMessage": "costume"
|
||
},
|
||
sound: {
|
||
"id": "gui.backpack.soundLabel",
|
||
"defaultMessage": "sound"
|
||
},
|
||
script: {
|
||
"id": "gui.backpack.scriptLabel",
|
||
"defaultMessage": "script"
|
||
},
|
||
sprite: {
|
||
"id": "gui.backpack.spriteLabel",
|
||
"defaultMessage": "sprite"
|
||
}
|
||
});
|
||
|
||
const Backpack = ({
|
||
blockDragOver,
|
||
containerRef,
|
||
contents,
|
||
dragOver,
|
||
error,
|
||
expanded,
|
||
intl,
|
||
loading,
|
||
showMore,
|
||
onToggle,
|
||
onDelete,
|
||
onRename,
|
||
onMouseEnter,
|
||
onMouseLeave,
|
||
onMore
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _backpack_css__WEBPACK_IMPORTED_MODULE_7___default.a.backpackContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _backpack_css__WEBPACK_IMPORTED_MODULE_7___default.a.backpackHeader,
|
||
onClick: onToggle
|
||
}, onToggle ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Backpack",
|
||
id: "gui.backpack.header"
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_coming_soon_coming_soon_jsx__WEBPACK_IMPORTED_MODULE_5__["ComingSoonTooltip"], {
|
||
place: "top",
|
||
tooltipId: "backpack-tooltip"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Backpack",
|
||
id: "gui.backpack.header"
|
||
}))), expanded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_backpack_css__WEBPACK_IMPORTED_MODULE_7___default.a.backpackList, {
|
||
[_backpack_css__WEBPACK_IMPORTED_MODULE_7___default.a.dragOver]: dragOver || blockDragOver
|
||
}),
|
||
ref: containerRef,
|
||
onMouseEnter: onMouseEnter,
|
||
onMouseLeave: onMouseLeave
|
||
}, error !== false ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _backpack_css__WEBPACK_IMPORTED_MODULE_7___default.a.statusMessage
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Error loading backpack",
|
||
id: "gui.backpack.errorBackpack"
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _backpack_css__WEBPACK_IMPORTED_MODULE_7___default.a.errorMessage
|
||
}, error)) : loading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _backpack_css__WEBPACK_IMPORTED_MODULE_7___default.a.statusMessage
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Loading...",
|
||
id: "gui.backpack.loadingBackpack"
|
||
})) : contents.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _backpack_css__WEBPACK_IMPORTED_MODULE_7___default.a.backpackListInner
|
||
}, contents.map(item => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_containers_sprite_selector_item_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
className: _backpack_css__WEBPACK_IMPORTED_MODULE_7___default.a.backpackItem,
|
||
costumeURL: item.thumbnailUrl,
|
||
details: item.name,
|
||
dragPayload: item,
|
||
dragType: dragTypeMap[item.type],
|
||
id: item.id,
|
||
key: item.id,
|
||
name: intl.formatMessage(labelMap[item.type]),
|
||
selected: false,
|
||
onClick: noop,
|
||
onDeleteButtonClick: onDelete // Currently, renaming sprites is not supported.
|
||
,
|
||
onRenameButtonClick: item.type === 'sprite' ? null : onRename
|
||
})), showMore && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
|
||
className: _backpack_css__WEBPACK_IMPORTED_MODULE_7___default.a.more,
|
||
onClick: onMore
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "More",
|
||
id: "gui.backpack.more"
|
||
}))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _backpack_css__WEBPACK_IMPORTED_MODULE_7___default.a.statusMessage
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Backpack is empty",
|
||
id: "gui.backpack.emptyBackpack"
|
||
}))) : null);
|
||
|
||
Backpack.propTypes = {
|
||
blockDragOver: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
containerRef: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
contents: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
thumbnailUrl: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
type: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
})),
|
||
dragOver: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
error: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string]),
|
||
expanded: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"],
|
||
loading: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onDelete: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onRename: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onMore: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onMouseEnter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onMouseLeave: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onToggle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
showMore: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
Backpack.defaultProps = {
|
||
blockDragOver: false,
|
||
contents: [],
|
||
dragOver: false,
|
||
expanded: false,
|
||
loading: false,
|
||
showMore: false,
|
||
onMore: null,
|
||
onToggle: null
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(Backpack));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/blocks/blocks.css":
|
||
/*!******************************************!*\
|
||
!*** ./src/components/blocks/blocks.css ***!
|
||
\******************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./blocks.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/blocks/blocks.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/blocks/blocks.jsx":
|
||
/*!******************************************!*\
|
||
!*** ./src/components/blocks/blocks.jsx ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _blocks_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./blocks.css */ "./src/components/blocks/blocks.css");
|
||
/* harmony import */ var _blocks_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_blocks_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
const _excluded = ["containerRef", "dragOver"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const BlocksComponent = props => {
|
||
const {
|
||
containerRef,
|
||
dragOver
|
||
} = props,
|
||
componentProps = _objectWithoutProperties(props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_1___default()(_blocks_css__WEBPACK_IMPORTED_MODULE_4___default.a.blocks, {
|
||
[_blocks_css__WEBPACK_IMPORTED_MODULE_4___default.a.dragOver]: dragOver
|
||
})
|
||
}, componentProps, {
|
||
componentRef: containerRef
|
||
}));
|
||
};
|
||
|
||
BlocksComponent.propTypes = {
|
||
containerRef: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
dragOver: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (BlocksComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/box/box.css":
|
||
/*!************************************!*\
|
||
!*** ./src/components/box/box.css ***!
|
||
\************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./box.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/box/box.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/box/box.jsx":
|
||
/*!************************************!*\
|
||
!*** ./src/components/box/box.jsx ***!
|
||
\************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_style_proptype__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-style-proptype */ "./node_modules/react-style-proptype/src/index.js");
|
||
/* harmony import */ var react_style_proptype__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_style_proptype__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _box_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./box.css */ "./src/components/box/box.css");
|
||
/* harmony import */ var _box_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_box_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
const _excluded = ["alignContent", "alignItems", "alignSelf", "basis", "children", "className", "componentRef", "direction", "element", "grow", "height", "justifyContent", "width", "wrap", "shrink", "style"];
|
||
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const getRandomColor = function () {
|
||
// In "DEBUG" mode this is used to output a random background color for each
|
||
// box. The function gives the same "random" set for each seed, allowing re-
|
||
// renders of the same content to give the same random display.
|
||
const random = function (seed) {
|
||
let mW = seed;
|
||
let mZ = 987654321;
|
||
const mask = 0xffffffff;
|
||
return function () {
|
||
mZ = 36969 * (mZ & 65535) + (mZ >> 16) & mask;
|
||
mW = 18000 * (mW & 65535) + (mW >> 16) & mask;
|
||
let result = (mZ << 16) + mW & mask;
|
||
result /= 4294967296;
|
||
return result + 1;
|
||
};
|
||
}(601);
|
||
|
||
return function () {
|
||
const r = Math.max(parseInt(random() * 100, 10) % 256, 1);
|
||
const g = Math.max(parseInt(random() * 100, 10) % 256, 1);
|
||
const b = Math.max(parseInt(random() * 100, 10) % 256, 1);
|
||
return "rgb(".concat(r, ",").concat(g, ",").concat(b, ")");
|
||
};
|
||
}();
|
||
|
||
const Box = props => {
|
||
const {
|
||
alignContent,
|
||
alignItems,
|
||
alignSelf,
|
||
basis,
|
||
children,
|
||
className,
|
||
componentRef,
|
||
direction,
|
||
element,
|
||
grow,
|
||
height,
|
||
justifyContent,
|
||
width,
|
||
wrap,
|
||
shrink,
|
||
style
|
||
} = props,
|
||
componentProps = _objectWithoutProperties(props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(element, _objectSpread({
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(className, _box_css__WEBPACK_IMPORTED_MODULE_4___default.a.box),
|
||
ref: componentRef,
|
||
style: Object.assign({
|
||
alignContent: alignContent,
|
||
alignItems: alignItems,
|
||
alignSelf: alignSelf,
|
||
flexBasis: basis,
|
||
flexDirection: direction,
|
||
flexGrow: grow,
|
||
flexShrink: shrink,
|
||
flexWrap: wrap,
|
||
justifyContent: justifyContent,
|
||
width: width,
|
||
height: height
|
||
}, false ? undefined : {}, style)
|
||
}, componentProps), children);
|
||
};
|
||
|
||
Box.propTypes = {
|
||
/** Defines how the browser distributes space between and around content items vertically within this box. */
|
||
alignContent: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'stretch']),
|
||
|
||
/** Defines how the browser distributes space between and around flex items horizontally within this box. */
|
||
alignItems: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['flex-start', 'flex-end', 'center', 'baseline', 'stretch']),
|
||
|
||
/** Specifies how this box should be aligned inside of its container (requires the container to be flexable). */
|
||
alignSelf: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['auto', 'flex-start', 'flex-end', 'center', 'baseline', 'stretch']),
|
||
|
||
/** Specifies the initial length of this box */
|
||
basis: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['auto'])]),
|
||
|
||
/** Specifies the the HTML nodes which will be child elements of this box. */
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node,
|
||
|
||
/** Specifies the class name that will be set on this box */
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
|
||
/**
|
||
* A callback function whose first parameter is the underlying dom elements.
|
||
* This call back will be executed immediately after the component is mounted or unmounted
|
||
*/
|
||
componentRef: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
|
||
/** https://developer.mozilla.org/en-US/docs/Web/CSS/flex-direction */
|
||
direction: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['row', 'row-reverse', 'column', 'column-reverse']),
|
||
|
||
/** Specifies the type of HTML element of this box. Defaults to div. */
|
||
element: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
|
||
/** Specifies the flex grow factor of a flex item. */
|
||
grow: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
|
||
/** The height in pixels (if specified as a number) or a string if different units are required. */
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string]),
|
||
|
||
/** https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content */
|
||
justifyContent: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['flex-start', 'flex-end', 'center', 'space-between', 'space-around']),
|
||
|
||
/** Specifies the flex shrink factor of a flex item. */
|
||
shrink: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
|
||
/** An object whose keys are css property names and whose values correspond the the css property. */
|
||
style: react_style_proptype__WEBPACK_IMPORTED_MODULE_3___default.a,
|
||
|
||
/** The width in pixels (if specified as a number) or a string if different units are required. */
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string]),
|
||
|
||
/** How whitespace should wrap within this block. */
|
||
wrap: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['nowrap', 'wrap', 'wrap-reverse'])
|
||
};
|
||
Box.defaultProps = {
|
||
element: 'div',
|
||
style: {}
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Box);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/browser-modal/browser-modal.css":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/browser-modal/browser-modal.css ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./browser-modal.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/browser-modal/browser-modal.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/browser-modal/browser-modal.jsx":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/browser-modal/browser-modal.jsx ***!
|
||
\********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_modal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-modal */ "./node_modules/react-modal/lib/index.js");
|
||
/* harmony import */ var react_modal__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_modal__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _lib_tw_environment_support_prober_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib/tw-environment-support-prober.js */ "./src/lib/tw-environment-support-prober.js");
|
||
/* harmony import */ var _browser_modal_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./browser-modal.css */ "./src/components/browser-modal/browser-modal.css");
|
||
/* harmony import */ var _browser_modal_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_browser_modal_css__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _unsupported_browser_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./unsupported-browser.svg */ "./src/components/browser-modal/unsupported-browser.svg");
|
||
/* harmony import */ var _unsupported_browser_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_unsupported_browser_svg__WEBPACK_IMPORTED_MODULE_7__);
|
||
const _excluded = ["intl"];
|
||
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["defineMessages"])({
|
||
label: {
|
||
"id": "gui.unsupportedBrowser.label",
|
||
"defaultMessage": "Browser is not supported"
|
||
}
|
||
});
|
||
|
||
const BrowserModal = _ref => {
|
||
let {
|
||
intl
|
||
} = _ref,
|
||
props = _objectWithoutProperties(_ref, _excluded);
|
||
|
||
const label = messages.label;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_modal__WEBPACK_IMPORTED_MODULE_2___default.a, {
|
||
isOpen: true,
|
||
className: _browser_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.modalContent,
|
||
contentLabel: intl.formatMessage(_objectSpread({}, messages.label)),
|
||
overlayClassName: _browser_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.modalOverlay,
|
||
onRequestClose: props.onBack
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
dir: props.isRtl ? 'rtl' : 'ltr'
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _browser_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.illustration
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
src: _unsupported_browser_svg__WEBPACK_IMPORTED_MODULE_7___default.a
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _browser_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("h2", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], label)), Object(_lib_tw_environment_support_prober_js__WEBPACK_IMPORTED_MODULE_5__["canConstructNewFunctions"])() ? null :
|
||
/*#__PURE__*/
|
||
// This message is only intended to be read by website operators
|
||
// We don't need to make it translatable
|
||
react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("p", null, 'This site is unable to compile arbitrary JavaScript. This is most likely caused by an overly-strict Content-Security-Policy set by the server.'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "Make sure you're using a recent version of Google Chrome, Mozilla Firefox, Microsoft Edge, or Apple Safari.",
|
||
id: "tw.browserModal.desc"
|
||
})))));
|
||
};
|
||
|
||
BrowserModal.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_4__["intlShape"].isRequired,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
onBack: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired
|
||
};
|
||
const WrappedBrowserModal = Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["injectIntl"])(BrowserModal);
|
||
WrappedBrowserModal.setAppElement = react_modal__WEBPACK_IMPORTED_MODULE_2___default.a.setAppElement;
|
||
/* harmony default export */ __webpack_exports__["default"] = (WrappedBrowserModal);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/browser-modal/unsupported-browser.svg":
|
||
/*!**************************************************************!*\
|
||
!*** ./src/components/browser-modal/unsupported-browser.svg ***!
|
||
\**************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/89a5687599f173f2b910aa5fcd862b42.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/button/button.css":
|
||
/*!******************************************!*\
|
||
!*** ./src/components/button/button.css ***!
|
||
\******************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./button.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/button/button.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/button/button.jsx":
|
||
/*!******************************************!*\
|
||
!*** ./src/components/button/button.jsx ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _button_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./button.css */ "./src/components/button/button.css");
|
||
/* harmony import */ var _button_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_button_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
const _excluded = ["className", "disabled", "iconClassName", "iconSrc", "iconWidth", "iconHeight", "onClick", "children"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const ButtonComponent = _ref => {
|
||
let {
|
||
className,
|
||
disabled,
|
||
iconClassName,
|
||
iconSrc,
|
||
iconWidth,
|
||
iconHeight,
|
||
onClick,
|
||
children
|
||
} = _ref,
|
||
props = _objectWithoutProperties(_ref, _excluded);
|
||
|
||
if (disabled) {
|
||
onClick = function onClick() {};
|
||
}
|
||
|
||
const icon = iconSrc && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(iconClassName, _button_css__WEBPACK_IMPORTED_MODULE_3___default.a.icon),
|
||
draggable: false,
|
||
src: iconSrc,
|
||
height: iconHeight,
|
||
width: iconWidth
|
||
});
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("span", _extends({
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.outlinedButton, className),
|
||
role: "button",
|
||
onClick: onClick
|
||
}, props), icon, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _button_css__WEBPACK_IMPORTED_MODULE_3___default.a.content
|
||
}, children));
|
||
};
|
||
|
||
ButtonComponent.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
disabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
iconClassName: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
iconSrc: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
iconHeight: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
iconWidth: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (ButtonComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/cards/card.css":
|
||
/*!***************************************!*\
|
||
!*** ./src/components/cards/card.css ***!
|
||
\***************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./card.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/cards/card.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/cards/cards.jsx":
|
||
/*!****************************************!*\
|
||
!*** ./src/components/cards/cards.jsx ***!
|
||
\****************************************/
|
||
/*! exports provided: default, ImageStep, VideoStep */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Cards; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ImageStep", function() { return ImageStep; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VideoStep", function() { return VideoStep; });
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var react_draggable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-draggable */ "./node_modules/react-draggable/dist/react-draggable.js");
|
||
/* harmony import */ var react_draggable__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_draggable__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _card_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./card.css */ "./src/components/cards/card.css");
|
||
/* harmony import */ var _card_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_card_css__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _icon_shrink_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icon--shrink.svg */ "./src/components/cards/icon--shrink.svg");
|
||
/* harmony import */ var _icon_shrink_svg__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_icon_shrink_svg__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _icon_expand_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./icon--expand.svg */ "./src/components/cards/icon--expand.svg");
|
||
/* harmony import */ var _icon_expand_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_icon_expand_svg__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _icon_next_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./icon--next.svg */ "./src/components/cards/icon--next.svg");
|
||
/* harmony import */ var _icon_next_svg__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_icon_next_svg__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var _icon_prev_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./icon--prev.svg */ "./src/components/cards/icon--prev.svg");
|
||
/* harmony import */ var _icon_prev_svg__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_icon_prev_svg__WEBPACK_IMPORTED_MODULE_9__);
|
||
/* harmony import */ var _lib_assets_icon_tutorials_svg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../lib/assets/icon--tutorials.svg */ "./src/lib/assets/icon--tutorials.svg");
|
||
/* harmony import */ var _lib_assets_icon_tutorials_svg__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_lib_assets_icon_tutorials_svg__WEBPACK_IMPORTED_MODULE_10__);
|
||
/* harmony import */ var _icon_close_svg__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./icon--close.svg */ "./src/components/cards/icon--close.svg");
|
||
/* harmony import */ var _icon_close_svg__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_icon_close_svg__WEBPACK_IMPORTED_MODULE_11__);
|
||
/* harmony import */ var _lib_libraries_decks_translate_video_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../lib/libraries/decks/translate-video.js */ "./src/lib/libraries/decks/translate-video.js");
|
||
/* harmony import */ var _lib_libraries_decks_translate_image_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../lib/libraries/decks/translate-image.js */ "./src/lib/libraries/decks/translate-image.js");
|
||
const _excluded = ["activeDeckId", "content", "dragging", "isRtl", "locale", "onActivateDeckFactory", "onCloseCards", "onShrinkExpandCards", "onDrag", "onStartDrag", "onEndDrag", "onShowAll", "onNextStep", "onPrevStep", "showVideos", "step", "expanded"];
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const CardHeader = ({
|
||
onCloseCards,
|
||
onShrinkExpandCards,
|
||
onShowAll,
|
||
totalSteps,
|
||
step,
|
||
expanded
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: expanded ? _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.headerButtons : classnames__WEBPACK_IMPORTED_MODULE_2___default()(_card_css__WEBPACK_IMPORTED_MODULE_5___default.a.headerButtons, _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.headerButtonsHidden)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.allButton,
|
||
onClick: onShowAll
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.helpIcon,
|
||
src: _lib_assets_icon_tutorials_svg__WEBPACK_IMPORTED_MODULE_10___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Tutorials",
|
||
id: "gui.cards.all-tutorials"
|
||
})), totalSteps > 1 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.stepsList
|
||
}, Array(totalSteps).fill(0).map((_, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: i === step ? _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.activeStepPip : _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.inactiveStepPip,
|
||
key: "pip-step-".concat(i)
|
||
}))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.headerButtonsRight
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.shrinkExpandButton,
|
||
onClick: onShrinkExpandCards
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: expanded ? _icon_shrink_svg__WEBPACK_IMPORTED_MODULE_6___default.a : _icon_expand_svg__WEBPACK_IMPORTED_MODULE_7___default.a
|
||
}), expanded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Shrink",
|
||
id: "gui.cards.shrink"
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Expand",
|
||
id: "gui.cards.expand"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.removeButton,
|
||
onClick: onCloseCards
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.closeIcon,
|
||
src: _icon_close_svg__WEBPACK_IMPORTED_MODULE_11___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Close",
|
||
id: "gui.cards.close"
|
||
}))));
|
||
|
||
class VideoStep extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
componentDidMount() {
|
||
const script = document.createElement('script');
|
||
script.src = "https://fast.wistia.com/embed/medias/".concat(this.props.video, ".jsonp");
|
||
script.async = true;
|
||
script.setAttribute('id', 'wistia-video-content');
|
||
document.body.appendChild(script);
|
||
const script2 = document.createElement('script');
|
||
script2.src = 'https://fast.wistia.com/assets/external/E-v1.js';
|
||
script2.async = true;
|
||
script2.setAttribute('id', 'wistia-video-api');
|
||
document.body.appendChild(script2);
|
||
} // We use the Wistia API here to update or pause the video dynamically:
|
||
// https://wistia.com/support/developers/player-api
|
||
|
||
|
||
componentDidUpdate(prevProps) {
|
||
// Ensure the wistia API is loaded and available
|
||
if (!(window.Wistia && window.Wistia.api)) return; // Get a handle on the currently loaded video
|
||
|
||
const video = window.Wistia.api(prevProps.video); // Reset the video source if a new video has been chosen from the library
|
||
|
||
if (prevProps.video !== this.props.video) {
|
||
video.replaceWith(this.props.video);
|
||
} // Pause the video if the modal is being shrunken
|
||
|
||
|
||
if (!this.props.expanded) {
|
||
video.pause();
|
||
}
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
const script = document.getElementById('wistia-video-content');
|
||
script.parentNode.removeChild(script);
|
||
const script2 = document.getElementById('wistia-video-api');
|
||
script2.parentNode.removeChild(script2);
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.stepVideo
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: "wistia_embed wistia_async_".concat(this.props.video),
|
||
id: "video-div",
|
||
style: {
|
||
height: "257px",
|
||
width: "466px"
|
||
}
|
||
}, "\xA0"));
|
||
}
|
||
|
||
}
|
||
|
||
VideoStep.propTypes = {
|
||
expanded: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
video: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired
|
||
};
|
||
|
||
const ImageStep = ({
|
||
title,
|
||
image
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1__["Fragment"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.stepTitle
|
||
}, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.stepImageContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.stepImage,
|
||
draggable: false,
|
||
key: image
|
||
/* Use src as key to prevent hanging around on slow connections */
|
||
,
|
||
src: image
|
||
})));
|
||
|
||
ImageStep.propTypes = {
|
||
image: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.node.isRequired
|
||
};
|
||
|
||
const NextPrevButtons = ({
|
||
isRtl,
|
||
onNextStep,
|
||
onPrevStep,
|
||
expanded
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1__["Fragment"], null, onNextStep ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: expanded ? isRtl ? _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.leftCard : _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.rightCard : _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.hidden
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: expanded ? isRtl ? _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.leftButton : _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.rightButton : _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.hidden,
|
||
onClick: onNextStep
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: isRtl ? _icon_prev_svg__WEBPACK_IMPORTED_MODULE_9___default.a : _icon_next_svg__WEBPACK_IMPORTED_MODULE_8___default.a
|
||
}))) : null, onPrevStep ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: expanded ? isRtl ? _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.rightCard : _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.leftCard : _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.hidden
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: expanded ? isRtl ? _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.rightButton : _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.leftButton : _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.hidden,
|
||
onClick: onPrevStep
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: isRtl ? _icon_next_svg__WEBPACK_IMPORTED_MODULE_8___default.a : _icon_prev_svg__WEBPACK_IMPORTED_MODULE_9___default.a
|
||
}))) : null);
|
||
|
||
NextPrevButtons.propTypes = {
|
||
expanded: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
onNextStep: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onPrevStep: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func
|
||
};
|
||
CardHeader.propTypes = {
|
||
expanded: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
onCloseCards: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onShowAll: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onShrinkExpandCards: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
step: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
totalSteps: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
};
|
||
|
||
const PreviewsStep = ({
|
||
deckIds,
|
||
content,
|
||
onActivateDeckFactory,
|
||
onShowAll
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1__["Fragment"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.stepTitle
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "More things to try!",
|
||
id: "gui.cards.more-things-to-try"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.decks
|
||
}, deckIds.slice(0, 2).map(id => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.deck,
|
||
key: "deck-preview-".concat(id),
|
||
onClick: onActivateDeckFactory(id)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.deckImage,
|
||
draggable: false,
|
||
src: content[id].img
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.deckName
|
||
}, content[id].name)))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.seeAll
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.seeAllButton,
|
||
onClick: onShowAll
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "See more",
|
||
id: "gui.cards.see-more"
|
||
}))));
|
||
|
||
PreviewsStep.propTypes = {
|
||
content: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.node.isRequired,
|
||
img: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
steps: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.node,
|
||
image: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
video: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
deckIds: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string)
|
||
}))
|
||
})
|
||
}).isRequired,
|
||
deckIds: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string).isRequired,
|
||
onActivateDeckFactory: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onShowAll: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired
|
||
};
|
||
|
||
const Cards = props => {
|
||
const {
|
||
activeDeckId,
|
||
content,
|
||
dragging,
|
||
isRtl,
|
||
locale,
|
||
onActivateDeckFactory,
|
||
onCloseCards,
|
||
onShrinkExpandCards,
|
||
onDrag,
|
||
onStartDrag,
|
||
onEndDrag,
|
||
onShowAll,
|
||
onNextStep,
|
||
onPrevStep,
|
||
showVideos,
|
||
step,
|
||
expanded
|
||
} = props,
|
||
posProps = _objectWithoutProperties(props, _excluded);
|
||
|
||
let {
|
||
x,
|
||
y
|
||
} = posProps;
|
||
if (activeDeckId === null) return; // Tutorial cards need to calculate their own dragging bounds
|
||
// to allow for dragging the cards off the left, right and bottom
|
||
// edges of the workspace.
|
||
|
||
const cardHorizontalDragOffset = 400; // ~80% of card width
|
||
|
||
const cardVerticalDragOffset = expanded ? 257 : 0; // ~80% of card height, if expanded
|
||
|
||
const menuBarHeight = 48; // TODO: get pre-calculated from elsewhere?
|
||
|
||
const wideCardWidth = 500;
|
||
|
||
if (x === 0 && y === 0) {
|
||
// initialize positions
|
||
x = isRtl ? -190 - wideCardWidth - cardHorizontalDragOffset : 292;
|
||
x += cardHorizontalDragOffset; // The tallest cards are about 320px high, and the default position is pinned
|
||
// to near the bottom of the blocks palette to allow room to work above.
|
||
|
||
const tallCardHeight = 320;
|
||
const bottomMargin = 60; // To avoid overlapping the backpack region
|
||
|
||
y = window.innerHeight - tallCardHeight - bottomMargin - menuBarHeight;
|
||
}
|
||
|
||
const steps = content[activeDeckId].steps;
|
||
return (
|
||
/*#__PURE__*/
|
||
// Custom overlay to act as the bounding parent for the draggable, using values from above
|
||
react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.cardContainerOverlay,
|
||
style: {
|
||
width: "".concat(window.innerWidth + 2 * cardHorizontalDragOffset, "px"),
|
||
height: "".concat(window.innerHeight - menuBarHeight + cardVerticalDragOffset, "px"),
|
||
top: "".concat(menuBarHeight, "px"),
|
||
left: "".concat(-cardHorizontalDragOffset, "px")
|
||
}
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_draggable__WEBPACK_IMPORTED_MODULE_4___default.a, {
|
||
bounds: "parent",
|
||
cancel: "#video-div" // disable dragging on video div
|
||
,
|
||
position: {
|
||
x: x,
|
||
y: y
|
||
},
|
||
onDrag: onDrag,
|
||
onStart: onStartDrag,
|
||
onStop: onEndDrag
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.cardContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.card
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(CardHeader, {
|
||
expanded: expanded,
|
||
step: step,
|
||
totalSteps: steps.length,
|
||
onCloseCards: onCloseCards,
|
||
onShowAll: onShowAll,
|
||
onShrinkExpandCards: onShrinkExpandCards
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: expanded ? _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.stepBody : _card_css__WEBPACK_IMPORTED_MODULE_5___default.a.hidden
|
||
}, steps[step].deckIds ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(PreviewsStep, {
|
||
content: content,
|
||
deckIds: steps[step].deckIds,
|
||
onActivateDeckFactory: onActivateDeckFactory,
|
||
onShowAll: onShowAll
|
||
}) : steps[step].video ? showVideos ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(VideoStep, {
|
||
dragging: dragging,
|
||
expanded: expanded,
|
||
video: Object(_lib_libraries_decks_translate_video_js__WEBPACK_IMPORTED_MODULE_12__["translateVideo"])(steps[step].video, locale)
|
||
}) :
|
||
/*#__PURE__*/
|
||
// Else show the deck image and title
|
||
react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(ImageStep, {
|
||
image: content[activeDeckId].img,
|
||
title: content[activeDeckId].name
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(ImageStep, {
|
||
image: Object(_lib_libraries_decks_translate_image_js__WEBPACK_IMPORTED_MODULE_13__["translateImage"])(steps[step].image, locale),
|
||
title: steps[step].title
|
||
}), steps[step].trackingPixel && steps[step].trackingPixel), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(NextPrevButtons, {
|
||
expanded: expanded,
|
||
isRtl: isRtl,
|
||
onNextStep: step < steps.length - 1 ? onNextStep : null,
|
||
onPrevStep: step > 0 ? onPrevStep : null
|
||
})))))
|
||
);
|
||
};
|
||
|
||
Cards.propTypes = {
|
||
activeDeckId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
content: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.node.isRequired,
|
||
img: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
steps: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.node,
|
||
image: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
video: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
deckIds: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string)
|
||
}))
|
||
})
|
||
}),
|
||
dragging: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
expanded: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
locale: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
onActivateDeckFactory: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onCloseCards: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onDrag: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onEndDrag: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onNextStep: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onPrevStep: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onShowAll: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onShrinkExpandCards: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onStartDrag: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
showVideos: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
step: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number.isRequired,
|
||
x: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
y: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
};
|
||
Cards.defaultProps = {
|
||
showVideos: true
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/cards/icon--close.svg":
|
||
/*!**********************************************!*\
|
||
!*** ./src/components/cards/icon--close.svg ***!
|
||
\**********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/a3e689235188ba10c5cfd75730cb88a7.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/cards/icon--expand.svg":
|
||
/*!***********************************************!*\
|
||
!*** ./src/components/cards/icon--expand.svg ***!
|
||
\***********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/04e28ba12fe914cf4f131dcb85ae82d6.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/cards/icon--next.svg":
|
||
/*!*********************************************!*\
|
||
!*** ./src/components/cards/icon--next.svg ***!
|
||
\*********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/a80790c977586cc0595b5fe2f0bcb39a.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/cards/icon--prev.svg":
|
||
/*!*********************************************!*\
|
||
!*** ./src/components/cards/icon--prev.svg ***!
|
||
\*********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/33592a76d0d0fdaa4a32b2ea41db5e16.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/cards/icon--shrink.svg":
|
||
/*!***********************************************!*\
|
||
!*** ./src/components/cards/icon--shrink.svg ***!
|
||
\***********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/76121b7f4eff7d7ca0d49a45479d3f3f.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/close-button/close-button.css":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/close-button/close-button.css ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./close-button.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/close-button/close-button.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/close-button/close-button.jsx":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/close-button/close-button.jsx ***!
|
||
\******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _close_button_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./close-button.css */ "./src/components/close-button/close-button.css");
|
||
/* harmony import */ var _close_button_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_close_button_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _icon_close_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./icon--close.svg */ "./src/components/close-button/icon--close.svg");
|
||
/* harmony import */ var _icon_close_svg__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_icon_close_svg__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _icon_close_orange_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./icon--close-orange.svg */ "./src/components/close-button/icon--close-orange.svg");
|
||
/* harmony import */ var _icon_close_orange_svg__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_icon_close_orange_svg__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _lib_assets_icon_back_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib/assets/icon--back.svg */ "./src/lib/assets/icon--back.svg");
|
||
/* harmony import */ var _lib_assets_icon_back_svg__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_lib_assets_icon_back_svg__WEBPACK_IMPORTED_MODULE_6__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
let closeIcons = {};
|
||
|
||
const CloseButton = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
"aria-label": "Close",
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_close_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.closeButton, props.className, {
|
||
[_close_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.small]: props.size === CloseButton.SIZE_SMALL,
|
||
[_close_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.large]: props.size === CloseButton.SIZE_LARGE,
|
||
[_close_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.orange]: props.color === CloseButton.COLOR_ORANGE
|
||
}),
|
||
role: "button",
|
||
tabIndex: "0",
|
||
onClick: props.onClick
|
||
}, props.buttonType === 'back' ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _close_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.backIcon,
|
||
src: _lib_assets_icon_back_svg__WEBPACK_IMPORTED_MODULE_6___default.a
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_close_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.closeIcon, {
|
||
[_close_button_css__WEBPACK_IMPORTED_MODULE_3___default.a[props.color]]: props.color !== CloseButton.COLOR_NEUTRAL
|
||
}),
|
||
src: props.color && closeIcons[props.color] ? closeIcons[props.color] : _icon_close_svg__WEBPACK_IMPORTED_MODULE_4___default.a
|
||
}));
|
||
|
||
CloseButton.SIZE_SMALL = 'small';
|
||
CloseButton.SIZE_LARGE = 'large';
|
||
CloseButton.COLOR_NEUTRAL = 'neutral';
|
||
CloseButton.COLOR_GREEN = 'green';
|
||
CloseButton.COLOR_ORANGE = 'orange';
|
||
closeIcons = {
|
||
[CloseButton.COLOR_NEUTRAL]: _icon_close_svg__WEBPACK_IMPORTED_MODULE_4___default.a,
|
||
[CloseButton.COLOR_GREEN]: _icon_close_svg__WEBPACK_IMPORTED_MODULE_4___default.a,
|
||
// TODO: temporary, need green icon
|
||
[CloseButton.COLOR_ORANGE]: _icon_close_orange_svg__WEBPACK_IMPORTED_MODULE_5___default.a
|
||
};
|
||
CloseButton.propTypes = {
|
||
buttonType: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf(['back', 'close']),
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
color: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
size: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf([CloseButton.SIZE_SMALL, CloseButton.SIZE_LARGE])
|
||
};
|
||
CloseButton.defaultProps = {
|
||
color: CloseButton.COLOR_NEUTRAL,
|
||
size: CloseButton.SIZE_LARGE,
|
||
buttonType: 'close'
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (CloseButton);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/close-button/icon--close-orange.svg":
|
||
/*!************************************************************!*\
|
||
!*** ./src/components/close-button/icon--close-orange.svg ***!
|
||
\************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/ee54d776d2cda9a3c537ac7e8f144037.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/close-button/icon--close.svg":
|
||
/*!*****************************************************!*\
|
||
!*** ./src/components/close-button/icon--close.svg ***!
|
||
\*****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/cb666b99d3528f91b52f985dfb102afa.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/coming-soon/aww-cat.png":
|
||
/*!************************************************!*\
|
||
!*** ./src/components/coming-soon/aww-cat.png ***!
|
||
\************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/97926439955086f8ee4aabbd81580f17.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/coming-soon/coming-soon.css":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/coming-soon/coming-soon.css ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./coming-soon.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/coming-soon/coming-soon.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/coming-soon/coming-soon.jsx":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/coming-soon/coming-soon.jsx ***!
|
||
\****************************************************/
|
||
/*! exports provided: ComingSoonComponent, ComingSoonTooltip */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ComingSoonComponent", function() { return ComingSoon; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ComingSoonTooltip", function() { return ComingSoonTooltip; });
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var react_tooltip__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-tooltip */ "./node_modules/react-tooltip/dist/index.js");
|
||
/* harmony import */ var react_tooltip__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_tooltip__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _coming_soon_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./coming-soon.css */ "./src/components/coming-soon/coming-soon.css");
|
||
/* harmony import */ var _coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_coming_soon_css__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _aww_cat_png__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./aww-cat.png */ "./src/components/coming-soon/aww-cat.png");
|
||
/* harmony import */ var _aww_cat_png__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_aww_cat_png__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _cool_cat_png__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./cool-cat.png */ "./src/components/coming-soon/cool-cat.png");
|
||
/* harmony import */ var _cool_cat_png__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_cool_cat_png__WEBPACK_IMPORTED_MODULE_8__);
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["defineMessages"])({
|
||
message1: {
|
||
"id": "gui.comingSoon.message1",
|
||
"defaultMessage": "Don't worry, we're on it {emoji}"
|
||
},
|
||
message2: {
|
||
"id": "gui.comingSoon.message2",
|
||
"defaultMessage": "Coming Soon..."
|
||
},
|
||
message3: {
|
||
"id": "gui.comingSoon.message3",
|
||
"defaultMessage": "We're working on it {emoji}"
|
||
}
|
||
});
|
||
|
||
class ComingSoonContent extends react__WEBPACK_IMPORTED_MODULE_4___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['setHide', 'setShow', 'getRandomMessage']);
|
||
this.state = {
|
||
isShowing: false
|
||
};
|
||
}
|
||
|
||
setShow() {
|
||
// needed to set the opacity to 1, since the default is .9 on show
|
||
this.setState({
|
||
isShowing: true
|
||
});
|
||
}
|
||
|
||
setHide() {
|
||
this.setState({
|
||
isShowing: false
|
||
});
|
||
}
|
||
|
||
getRandomMessage() {
|
||
// randomly chooses a messages from `messages` to display in the tooltip.
|
||
const images = [_aww_cat_png__WEBPACK_IMPORTED_MODULE_7___default.a, _cool_cat_png__WEBPACK_IMPORTED_MODULE_8___default.a];
|
||
const messageNumber = Math.floor(Math.random() * Object.keys(messages).length) + 1;
|
||
const imageNumber = Math.floor(Math.random() * Object.keys(images).length);
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], _extends({}, messages["message".concat(messageNumber)], {
|
||
values: {
|
||
emoji: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("img", {
|
||
className: _coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default.a.comingSoonImage,
|
||
src: images[imageNumber]
|
||
})
|
||
}
|
||
}));
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(react_tooltip__WEBPACK_IMPORTED_MODULE_5___default.a, {
|
||
afterHide: this.setHide,
|
||
afterShow: this.setShow,
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_1___default()(_coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default.a.comingSoon, this.props.className, {
|
||
[_coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default.a.show]: this.state.isShowing,
|
||
[_coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default.a.left]: this.props.place === 'left',
|
||
[_coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default.a.right]: this.props.place === 'right',
|
||
[_coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default.a.top]: this.props.place === 'top',
|
||
[_coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default.a.bottom]: this.props.place === 'bottom'
|
||
}),
|
||
getContent: this.getRandomMessage,
|
||
id: this.props.tooltipId
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
ComingSoonContent.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_2__["intlShape"],
|
||
place: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['top', 'right', 'bottom', 'left']),
|
||
tooltipId: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string.isRequired
|
||
};
|
||
ComingSoonContent.defaultProps = {
|
||
place: 'bottom'
|
||
};
|
||
const ComingSoon = Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["injectIntl"])(ComingSoonContent);
|
||
|
||
const ComingSoonTooltip = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
|
||
className: props.className
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
|
||
"data-delay-hide": props.delayHide,
|
||
"data-delay-show": props.delayShow,
|
||
"data-effect": "solid",
|
||
"data-for": props.tooltipId,
|
||
"data-place": props.place,
|
||
"data-tip": "tooltip"
|
||
}, props.children), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ComingSoon, {
|
||
className: props.tooltipClassName,
|
||
place: props.place,
|
||
tooltipId: props.tooltipId
|
||
}));
|
||
|
||
ComingSoonTooltip.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node.isRequired,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,
|
||
delayHide: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,
|
||
delayShow: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,
|
||
place: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['top', 'right', 'bottom', 'left']),
|
||
tooltipClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,
|
||
tooltipId: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string.isRequired
|
||
};
|
||
ComingSoonTooltip.defaultProps = {
|
||
delayHide: 0,
|
||
delayShow: 0
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/coming-soon/cool-cat.png":
|
||
/*!*************************************************!*\
|
||
!*** ./src/components/coming-soon/cool-cat.png ***!
|
||
\*************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/3e83d9d800459175308f0b45b117af16.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/auto-scanning-step.jsx":
|
||
/*!****************************************************************!*\
|
||
!*** ./src/components/connection-modal/auto-scanning-step.jsx ***!
|
||
\****************************************************************/
|
||
/*! exports provided: default, PHASES */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AutoScanningStep; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PHASES", function() { return PHASES; });
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! keymirror */ "./node_modules/keymirror/index.js");
|
||
/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(keymirror__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _dots_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dots.jsx */ "./src/components/connection-modal/dots.jsx");
|
||
/* harmony import */ var _close_button_icon_close_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../close-button/icon--close.svg */ "./src/components/close-button/icon--close.svg");
|
||
/* harmony import */ var _close_button_icon_close_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_close_button_icon_close_svg__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _icons_searching_png__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./icons/searching.png */ "./src/components/connection-modal/icons/searching.png");
|
||
/* harmony import */ var _icons_searching_png__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_icons_searching_png__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var _icons_bluetooth_white_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./icons/bluetooth-white.svg */ "./src/components/connection-modal/icons/bluetooth-white.svg");
|
||
/* harmony import */ var _icons_bluetooth_white_svg__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_icons_bluetooth_white_svg__WEBPACK_IMPORTED_MODULE_9__);
|
||
/* harmony import */ var _icons_back_svg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./icons/back.svg */ "./src/components/connection-modal/icons/back.svg");
|
||
/* harmony import */ var _icons_back_svg__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_icons_back_svg__WEBPACK_IMPORTED_MODULE_10__);
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./connection-modal.css */ "./src/components/connection-modal/connection-modal.css");
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_connection_modal_css__WEBPACK_IMPORTED_MODULE_11__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const PHASES = keymirror__WEBPACK_IMPORTED_MODULE_3___default()({
|
||
prescan: null,
|
||
pressbutton: null,
|
||
notfound: null
|
||
});
|
||
|
||
const AutoScanningStep = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.activityArea
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.activityAreaInfo
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.centeredRow
|
||
}, props.phase === PHASES.prescan && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_2___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.radarBig,
|
||
src: _icons_searching_png__WEBPACK_IMPORTED_MODULE_8___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.bluetoothCenteredIcon,
|
||
src: _icons_bluetooth_white_svg__WEBPACK_IMPORTED_MODULE_9___default.a
|
||
})), props.phase === PHASES.pressbutton && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_2___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_4___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.radarBig, _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.radarSpin),
|
||
src: _icons_searching_png__WEBPACK_IMPORTED_MODULE_8___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.connectionTipIcon,
|
||
src: props.connectionTipIconURL
|
||
})), props.phase === PHASES.notfound && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.instructions
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "No devices found",
|
||
id: "gui.connection.auto-scanning.noPeripheralsFound"
|
||
}))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.bottomArea
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_4___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.bottomAreaItem, _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.instructions)
|
||
}, props.phase === PHASES.prescan && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Have your device nearby, then begin searching.",
|
||
id: "gui.connection.auto-scanning.prescan"
|
||
}), props.phase === PHASES.pressbutton && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Press the button on your device.",
|
||
id: "gui.connection.auto-scanning.pressbutton"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_dots_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.bottomAreaItem,
|
||
counter: 0,
|
||
total: 3
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_4___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.bottomAreaItem, _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.buttonRow)
|
||
}, props.phase === PHASES.prescan && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.connectionButton,
|
||
onClick: props.onStartScan
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Start Searching",
|
||
id: "gui.connection.auto-scanning.start-search"
|
||
})), props.phase === PHASES.pressbutton && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.segmentedButton
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
disabled: true,
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.connectionButton
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Searching...",
|
||
id: "gui.connection.connecting-searchbutton"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.connectionButton,
|
||
onClick: props.onRefresh
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.abortConnectingIcon,
|
||
src: _close_button_icon_close_svg__WEBPACK_IMPORTED_MODULE_7___default.a
|
||
}))), props.phase === PHASES.notfound && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.connectionButton,
|
||
onClick: props.onRefresh
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.buttonIconLeft,
|
||
src: _icons_back_svg__WEBPACK_IMPORTED_MODULE_10___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Try again",
|
||
id: "gui.connection.auto-scanning.try-again"
|
||
})))));
|
||
|
||
AutoScanningStep.propTypes = {
|
||
connectionTipIconURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onRefresh: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onStartScan: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
phase: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(Object.keys(PHASES))
|
||
};
|
||
AutoScanningStep.defaultProps = {
|
||
phase: PHASES.prescan
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/connected-step.jsx":
|
||
/*!************************************************************!*\
|
||
!*** ./src/components/connection-modal/connected-step.jsx ***!
|
||
\************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _dots_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dots.jsx */ "./src/components/connection-modal/dots.jsx");
|
||
/* harmony import */ var _icons_bluetooth_white_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./icons/bluetooth-white.svg */ "./src/components/connection-modal/icons/bluetooth-white.svg");
|
||
/* harmony import */ var _icons_bluetooth_white_svg__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_icons_bluetooth_white_svg__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./connection-modal.css */ "./src/components/connection-modal/connection-modal.css");
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_connection_modal_css__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_7__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const ConnectedStep = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.activityArea
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.centeredRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.peripheralActivity
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.peripheralActivityIcon,
|
||
src: props.connectionIconURL
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.bluetoothConnectedIcon,
|
||
src: _icons_bluetooth_white_svg__WEBPACK_IMPORTED_MODULE_5___default.a
|
||
})))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.bottomArea
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_7___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.bottomAreaItem, _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.instructions)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Connected",
|
||
id: "gui.connection.connected"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_dots_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
success: true,
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.bottomAreaItem,
|
||
total: 3
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_7___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.bottomAreaItem, _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.cornerButtons)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_7___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.redButton, _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.connectionButton),
|
||
onClick: props.onDisconnect
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Disconnect",
|
||
id: "gui.connection.disconnect"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.connectionButton,
|
||
onClick: props.onCancel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Go to Editor",
|
||
id: "gui.connection.go-to-editor"
|
||
})))));
|
||
|
||
ConnectedStep.propTypes = {
|
||
connectionIconURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
onCancel: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onDisconnect: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (ConnectedStep);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/connecting-step.jsx":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/components/connection-modal/connecting-step.jsx ***!
|
||
\*************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _dots_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dots.jsx */ "./src/components/connection-modal/dots.jsx");
|
||
/* harmony import */ var _icons_bluetooth_white_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icons/bluetooth-white.svg */ "./src/components/connection-modal/icons/bluetooth-white.svg");
|
||
/* harmony import */ var _icons_bluetooth_white_svg__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_icons_bluetooth_white_svg__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _close_button_icon_close_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../close-button/icon--close.svg */ "./src/components/close-button/icon--close.svg");
|
||
/* harmony import */ var _close_button_icon_close_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_close_button_icon_close_svg__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./connection-modal.css */ "./src/components/connection-modal/connection-modal.css");
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_connection_modal_css__WEBPACK_IMPORTED_MODULE_8__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const ConnectingStep = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.activityArea
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.centeredRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.peripheralActivity
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.peripheralActivityIcon,
|
||
src: props.connectionIconURL
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.bluetoothConnectingIcon,
|
||
src: _icons_bluetooth_white_svg__WEBPACK_IMPORTED_MODULE_6___default.a
|
||
})))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.bottomArea
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_3___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.bottomAreaItem, _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.instructions)
|
||
}, props.connectingMessage), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_dots_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.bottomAreaItem,
|
||
counter: 1,
|
||
total: 3
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_3___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.bottomAreaItem, _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.segmentedButton)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
disabled: true,
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.connectionButton
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Connecting...",
|
||
id: "gui.connection.connecting-cancelbutton"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.connectionButton,
|
||
onClick: props.onDisconnect
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.abortConnectingIcon,
|
||
src: _close_button_icon_close_svg__WEBPACK_IMPORTED_MODULE_7___default.a
|
||
})))));
|
||
|
||
ConnectingStep.propTypes = {
|
||
connectingMessage: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node.isRequired,
|
||
connectionIconURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
onDisconnect: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (ConnectingStep);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/connection-modal.css":
|
||
/*!**************************************************************!*\
|
||
!*** ./src/components/connection-modal/connection-modal.css ***!
|
||
\**************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./connection-modal.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/connection-modal/connection-modal.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/connection-modal.jsx":
|
||
/*!**************************************************************!*\
|
||
!*** ./src/components/connection-modal/connection-modal.jsx ***!
|
||
\**************************************************************/
|
||
/*! exports provided: default, PHASES */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ConnectionModalComponent; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PHASES", function() { return PHASES; });
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! keymirror */ "./node_modules/keymirror/index.js");
|
||
/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(keymirror__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _containers_modal_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../containers/modal.jsx */ "./src/containers/modal.jsx");
|
||
/* harmony import */ var _containers_scanning_step_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../containers/scanning-step.jsx */ "./src/containers/scanning-step.jsx");
|
||
/* harmony import */ var _containers_auto_scanning_step_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../containers/auto-scanning-step.jsx */ "./src/containers/auto-scanning-step.jsx");
|
||
/* harmony import */ var _connecting_step_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./connecting-step.jsx */ "./src/components/connection-modal/connecting-step.jsx");
|
||
/* harmony import */ var _connected_step_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./connected-step.jsx */ "./src/components/connection-modal/connected-step.jsx");
|
||
/* harmony import */ var _error_step_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./error-step.jsx */ "./src/components/connection-modal/error-step.jsx");
|
||
/* harmony import */ var _unavailable_step_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./unavailable-step.jsx */ "./src/components/connection-modal/unavailable-step.jsx");
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./connection-modal.css */ "./src/components/connection-modal/connection-modal.css");
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_connection_modal_css__WEBPACK_IMPORTED_MODULE_11__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const PHASES = keymirror__WEBPACK_IMPORTED_MODULE_2___default()({
|
||
scanning: null,
|
||
connecting: null,
|
||
connected: null,
|
||
error: null,
|
||
unavailable: null
|
||
});
|
||
|
||
const ConnectionModalComponent = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_modal_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.modalContent,
|
||
contentLabel: props.name,
|
||
headerClassName: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.header,
|
||
headerImage: props.connectionSmallIconURL,
|
||
id: "connectionModal",
|
||
onHelp: props.onHelp,
|
||
onRequestClose: props.onCancel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.body
|
||
}, props.phase === PHASES.scanning && !props.useAutoScan && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_scanning_step_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], props), props.phase === PHASES.scanning && props.useAutoScan && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_auto_scanning_step_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], props), props.phase === PHASES.connecting && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_connecting_step_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], props), props.phase === PHASES.connected && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_connected_step_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], props), props.phase === PHASES.error && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_error_step_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], props), props.phase === PHASES.unavailable && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_unavailable_step_jsx__WEBPACK_IMPORTED_MODULE_10__["default"], props)));
|
||
|
||
ConnectionModalComponent.propTypes = {
|
||
connectingMessage: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.node.isRequired,
|
||
connectionSmallIconURL: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
connectionTipIconURL: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.node,
|
||
onCancel: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onHelp: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
phase: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf(Object.keys(PHASES)).isRequired,
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
useAutoScan: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired
|
||
};
|
||
ConnectionModalComponent.defaultProps = {
|
||
connectingMessage: 'Connecting'
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/dots.jsx":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/connection-modal/dots.jsx ***!
|
||
\**************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./connection-modal.css */ "./src/components/connection-modal/connection-modal.css");
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_connection_modal_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const Dots = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(props.className, _connection_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.dotsRow)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.dotsHolder, {
|
||
[_connection_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.dotsHolderError]: props.error,
|
||
[_connection_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.dotsHolderSuccess]: props.success
|
||
})
|
||
}, Array(props.total).fill(0).map((_, i) => {
|
||
let type = 'inactive';
|
||
if (props.counter === i) type = 'active';
|
||
if (props.success) type = 'success';
|
||
if (props.error) type = 'error';
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Dot, {
|
||
key: "dot-".concat(i),
|
||
type: type
|
||
});
|
||
})));
|
||
|
||
Dots.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
counter: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
error: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
success: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
total: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
};
|
||
|
||
const Dot = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.dot, {
|
||
[_connection_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.inactiveStepDot]: props.type === 'inactive',
|
||
[_connection_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.activeStepDot]: props.type === 'active',
|
||
[_connection_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.successDot]: props.type === 'success',
|
||
[_connection_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.errorDot]: props.type === 'error'
|
||
})
|
||
});
|
||
|
||
Dot.propTypes = {
|
||
type: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Dots);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/error-step.jsx":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/connection-modal/error-step.jsx ***!
|
||
\********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _dots_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dots.jsx */ "./src/components/connection-modal/dots.jsx");
|
||
/* harmony import */ var _icons_help_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icons/help.svg */ "./src/components/connection-modal/icons/help.svg");
|
||
/* harmony import */ var _icons_help_svg__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_icons_help_svg__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _icons_back_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./icons/back.svg */ "./src/components/connection-modal/icons/back.svg");
|
||
/* harmony import */ var _icons_back_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_icons_back_svg__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./connection-modal.css */ "./src/components/connection-modal/connection-modal.css");
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_connection_modal_css__WEBPACK_IMPORTED_MODULE_8__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const ErrorStep = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.activityArea
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.centeredRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.peripheralActivity
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.peripheralActivityIcon,
|
||
src: props.connectionIconURL
|
||
})))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.bottomArea
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.bottomAreaItem, _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.instructions)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Oops, looks like something went wrong.",
|
||
id: "gui.connection.error.errorMessage"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_dots_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
error: true,
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.bottomAreaItem,
|
||
total: 3
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.bottomAreaItem, _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.buttonRow)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.connectionButton,
|
||
onClick: props.onScanning
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.buttonIconLeft, _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.buttonIconBack),
|
||
src: _icons_back_svg__WEBPACK_IMPORTED_MODULE_7___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Try again",
|
||
id: "gui.connection.error.tryagainbutton"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.connectionButton,
|
||
onClick: props.onHelp
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.buttonIconLeft,
|
||
src: _icons_help_svg__WEBPACK_IMPORTED_MODULE_6___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Help",
|
||
id: "gui.connection.error.helpbutton"
|
||
})))));
|
||
|
||
ErrorStep.propTypes = {
|
||
connectionIconURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
onHelp: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onScanning: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (ErrorStep);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/icons/back.svg":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/connection-modal/icons/back.svg ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/42157e6edddc19588c3c2ff188703799.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/icons/bluetooth-white.svg":
|
||
/*!*******************************************************************!*\
|
||
!*** ./src/components/connection-modal/icons/bluetooth-white.svg ***!
|
||
\*******************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/0fd9fd69a38ab79358df5a77b29702c8.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/icons/bluetooth.svg":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/components/connection-modal/icons/bluetooth.svg ***!
|
||
\*************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/8b8f2d052b4092ec47ad66c30c8b1642.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/icons/help.svg":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/connection-modal/icons/help.svg ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/4b6100c9f591be6470cdfd4697de0b54.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/icons/refresh.svg":
|
||
/*!***********************************************************!*\
|
||
!*** ./src/components/connection-modal/icons/refresh.svg ***!
|
||
\***********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/71655cde34ae75f48cb8820abf4b31e7.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/icons/scratchlink.svg":
|
||
/*!***************************************************************!*\
|
||
!*** ./src/components/connection-modal/icons/scratchlink.svg ***!
|
||
\***************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/05e05756b592740a3670417b4df19ca9.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/icons/searching.png":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/components/connection-modal/icons/searching.png ***!
|
||
\*************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/572a212c2e777e3a9061c97453497009.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/peripheral-tile.jsx":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/components/connection-modal/peripheral-tile.jsx ***!
|
||
\*************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./connection-modal.css */ "./src/components/connection-modal/connection-modal.css");
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_connection_modal_css__WEBPACK_IMPORTED_MODULE_6__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class PeripheralTile extends react__WEBPACK_IMPORTED_MODULE_3___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_4___default()(this, ['handleConnecting']);
|
||
}
|
||
|
||
handleConnecting() {
|
||
this.props.onConnecting(this.props.peripheralId);
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.peripheralTile
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.peripheralTileName
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.peripheralTileImage,
|
||
src: this.props.connectionSmallIconURL
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.peripheralTileNameWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.peripheralTileNameLabel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Device name",
|
||
id: "gui.connection.peripheral-name-label"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.peripheralTileNameText
|
||
}, this.props.name))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.peripheralTileWidgets
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.signalStrengthMeter
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.signalBar, {
|
||
[_connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.greenBar]: this.props.rssi > -80
|
||
})
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.signalBar, {
|
||
[_connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.greenBar]: this.props.rssi > -60
|
||
})
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.signalBar, {
|
||
[_connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.greenBar]: this.props.rssi > -40
|
||
})
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.signalBar, {
|
||
[_connection_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.greenBar]: this.props.rssi > -20
|
||
})
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
|
||
onClick: this.handleConnecting
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Connect",
|
||
id: "gui.connection.connect"
|
||
}))));
|
||
}
|
||
|
||
}
|
||
|
||
PeripheralTile.propTypes = {
|
||
connectionSmallIconURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onConnecting: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
peripheralId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
rssi: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (PeripheralTile);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/scanning-step.jsx":
|
||
/*!***********************************************************!*\
|
||
!*** ./src/components/connection-modal/scanning-step.jsx ***!
|
||
\***********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _peripheral_tile_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./peripheral-tile.jsx */ "./src/components/connection-modal/peripheral-tile.jsx");
|
||
/* harmony import */ var _dots_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dots.jsx */ "./src/components/connection-modal/dots.jsx");
|
||
/* harmony import */ var _icons_searching_png__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./icons/searching.png */ "./src/components/connection-modal/icons/searching.png");
|
||
/* harmony import */ var _icons_searching_png__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_icons_searching_png__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _icons_refresh_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./icons/refresh.svg */ "./src/components/connection-modal/icons/refresh.svg");
|
||
/* harmony import */ var _icons_refresh_svg__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_icons_refresh_svg__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./connection-modal.css */ "./src/components/connection-modal/connection-modal.css");
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_connection_modal_css__WEBPACK_IMPORTED_MODULE_9__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const ScanningStep = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.activityArea
|
||
}, props.scanning ? props.peripheralList.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.activityAreaInfo
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.centeredRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_3___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.radarSmall, _connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.radarSpin),
|
||
src: _icons_searching_png__WEBPACK_IMPORTED_MODULE_7___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Looking for devices",
|
||
id: "gui.connection.scanning.lookingforperipherals"
|
||
}))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.peripheralTilePane
|
||
}, props.peripheralList.map(peripheral => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_peripheral_tile_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
connectionSmallIconURL: props.connectionSmallIconURL,
|
||
key: peripheral.peripheralId,
|
||
name: peripheral.name,
|
||
peripheralId: peripheral.peripheralId,
|
||
rssi: peripheral.rssi,
|
||
onConnecting: props.onConnecting
|
||
}))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.instructions
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "No devices found",
|
||
id: "gui.connection.scanning.noPeripheralsFound"
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.bottomArea
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_3___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.bottomAreaItem, _connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.instructions)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Select your device in the list above.",
|
||
id: "gui.connection.scanning.instructions"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_dots_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.bottomAreaItem,
|
||
counter: 0,
|
||
total: 3
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_3___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.bottomAreaItem, _connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.connectionButton),
|
||
onClick: props.onRefresh
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Refresh",
|
||
id: "gui.connection.search"
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_9___default.a.buttonIconRight,
|
||
src: _icons_refresh_svg__WEBPACK_IMPORTED_MODULE_8___default.a
|
||
}))));
|
||
|
||
ScanningStep.propTypes = {
|
||
connectionSmallIconURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onConnecting: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onRefresh: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
peripheralList: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
rssi: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
peripheralId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
})),
|
||
scanning: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired
|
||
};
|
||
ScanningStep.defaultProps = {
|
||
peripheralList: [],
|
||
scanning: true
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (ScanningStep);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/connection-modal/unavailable-step.jsx":
|
||
/*!**************************************************************!*\
|
||
!*** ./src/components/connection-modal/unavailable-step.jsx ***!
|
||
\**************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _dots_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dots.jsx */ "./src/components/connection-modal/dots.jsx");
|
||
/* harmony import */ var _icons_help_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icons/help.svg */ "./src/components/connection-modal/icons/help.svg");
|
||
/* harmony import */ var _icons_help_svg__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_icons_help_svg__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _icons_back_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./icons/back.svg */ "./src/components/connection-modal/icons/back.svg");
|
||
/* harmony import */ var _icons_back_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_icons_back_svg__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _icons_bluetooth_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./icons/bluetooth.svg */ "./src/components/connection-modal/icons/bluetooth.svg");
|
||
/* harmony import */ var _icons_bluetooth_svg__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_icons_bluetooth_svg__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var _icons_scratchlink_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./icons/scratchlink.svg */ "./src/components/connection-modal/icons/scratchlink.svg");
|
||
/* harmony import */ var _icons_scratchlink_svg__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_icons_scratchlink_svg__WEBPACK_IMPORTED_MODULE_9__);
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./connection-modal.css */ "./src/components/connection-modal/connection-modal.css");
|
||
/* harmony import */ var _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_connection_modal_css__WEBPACK_IMPORTED_MODULE_10__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const UnavailableStep = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.activityArea
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.scratchLinkHelp
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.scratchLinkHelpStep
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.helpStepNumber
|
||
}, '1'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.helpStepImage
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.scratchLinkIcon,
|
||
src: _icons_scratchlink_svg__WEBPACK_IMPORTED_MODULE_9___default.a
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.helpStepText
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Make sure you have Scratch Link installed and running",
|
||
id: "gui.connection.unavailable.installscratchlink"
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.scratchLinkHelpStep
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.helpStepNumber
|
||
}, '2'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.helpStepImage
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.scratchLinkIcon,
|
||
src: _icons_bluetooth_svg__WEBPACK_IMPORTED_MODULE_8___default.a
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.helpStepText
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Check that Bluetooth is enabled",
|
||
id: "gui.connection.unavailable.enablebluetooth"
|
||
}))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.bottomArea
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_dots_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
error: true,
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.bottomAreaItem,
|
||
total: 3
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.bottomAreaItem, _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.buttonRow)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.connectionButton,
|
||
onClick: props.onScanning
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.buttonIconLeft, _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.buttonIconBack),
|
||
src: _icons_back_svg__WEBPACK_IMPORTED_MODULE_7___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Try again",
|
||
id: "gui.connection.unavailable.tryagainbutton"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.connectionButton,
|
||
onClick: props.onHelp
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
className: _connection_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.buttonIconLeft,
|
||
src: _icons_help_svg__WEBPACK_IMPORTED_MODULE_6___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Help",
|
||
id: "gui.connection.unavailable.helpbutton"
|
||
})))));
|
||
|
||
UnavailableStep.propTypes = {
|
||
onHelp: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onScanning: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (UnavailableStep);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/context-menu/context-menu.css":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/context-menu/context-menu.css ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./context-menu.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/context-menu/context-menu.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/context-menu/context-menu.jsx":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/context-menu/context-menu.jsx ***!
|
||
\******************************************************/
|
||
/*! exports provided: BorderedMenuItem, DangerousMenuItem, ContextMenu, MenuItem */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BorderedMenuItem", function() { return BorderedMenuItem; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DangerousMenuItem", function() { return DangerousMenuItem; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ContextMenu", function() { return StyledContextMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MenuItem", function() { return StyledMenuItem; });
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_contextmenu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-contextmenu */ "./node_modules/react-contextmenu/es6/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _context_menu_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./context-menu.css */ "./src/components/context-menu/context-menu.css");
|
||
/* harmony import */ var _context_menu_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_context_menu_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const StyledContextMenu = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_contextmenu__WEBPACK_IMPORTED_MODULE_1__["ContextMenu"], _extends({}, props, {
|
||
className: _context_menu_css__WEBPACK_IMPORTED_MODULE_3___default.a.contextMenu
|
||
}));
|
||
|
||
const StyledMenuItem = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_contextmenu__WEBPACK_IMPORTED_MODULE_1__["MenuItem"], _extends({}, props, {
|
||
attributes: {
|
||
className: _context_menu_css__WEBPACK_IMPORTED_MODULE_3___default.a.menuItem
|
||
}
|
||
}));
|
||
|
||
const BorderedMenuItem = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_contextmenu__WEBPACK_IMPORTED_MODULE_1__["MenuItem"], _extends({}, props, {
|
||
attributes: {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_context_menu_css__WEBPACK_IMPORTED_MODULE_3___default.a.menuItem, _context_menu_css__WEBPACK_IMPORTED_MODULE_3___default.a.menuItemBordered)
|
||
}
|
||
}));
|
||
|
||
const DangerousMenuItem = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_contextmenu__WEBPACK_IMPORTED_MODULE_1__["MenuItem"], _extends({}, props, {
|
||
attributes: {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_context_menu_css__WEBPACK_IMPORTED_MODULE_3___default.a.menuItem, _context_menu_css__WEBPACK_IMPORTED_MODULE_3___default.a.menuItemBordered, _context_menu_css__WEBPACK_IMPORTED_MODULE_3___default.a.menuItemDanger)
|
||
}
|
||
}));
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/controls/controls.css":
|
||
/*!**********************************************!*\
|
||
!*** ./src/components/controls/controls.css ***!
|
||
\**********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./controls.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/controls/controls.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/controls/controls.jsx":
|
||
/*!**********************************************!*\
|
||
!*** ./src/components/controls/controls.jsx ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _green_flag_green_flag_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../green-flag/green-flag.jsx */ "./src/components/green-flag/green-flag.jsx");
|
||
/* harmony import */ var _stop_all_stop_all_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../stop-all/stop-all.jsx */ "./src/components/stop-all/stop-all.jsx");
|
||
/* harmony import */ var _turbo_mode_turbo_mode_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../turbo-mode/turbo-mode.jsx */ "./src/components/turbo-mode/turbo-mode.jsx");
|
||
/* harmony import */ var _tw_framerate_indicator_framerate_indicator_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../tw-framerate-indicator/framerate-indicator.jsx */ "./src/components/tw-framerate-indicator/framerate-indicator.jsx");
|
||
/* harmony import */ var _lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../lib/layout-constants.js */ "./src/lib/layout-constants.js");
|
||
/* harmony import */ var _controls_css__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./controls.css */ "./src/components/controls/controls.css");
|
||
/* harmony import */ var _controls_css__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_controls_css__WEBPACK_IMPORTED_MODULE_9__);
|
||
const _excluded = ["active", "className", "intl", "onGreenFlagClick", "onStopAllClick", "turbo", "framerate", "interpolation", "isSmall"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
goTitle: {
|
||
"id": "gui.controls.go",
|
||
"defaultMessage": "Go"
|
||
},
|
||
stopTitle: {
|
||
"id": "gui.controls.stop",
|
||
"defaultMessage": "Stop"
|
||
}
|
||
});
|
||
|
||
const Controls = function Controls(props) {
|
||
const {
|
||
active,
|
||
className,
|
||
intl,
|
||
onGreenFlagClick,
|
||
onStopAllClick,
|
||
turbo,
|
||
framerate,
|
||
interpolation,
|
||
isSmall
|
||
} = props,
|
||
componentProps = _objectWithoutProperties(props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", _extends({
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_controls_css__WEBPACK_IMPORTED_MODULE_9___default.a.controlsContainer, className)
|
||
}, componentProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_green_flag_green_flag_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
active: active,
|
||
title: intl.formatMessage(messages.goTitle),
|
||
onClick: onGreenFlagClick
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_stop_all_stop_all_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
active: active,
|
||
title: intl.formatMessage(messages.stopTitle),
|
||
onClick: onStopAllClick
|
||
}), turbo ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_turbo_mode_turbo_mode_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
isSmall: isSmall
|
||
}) : null, !isSmall && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_tw_framerate_indicator_framerate_indicator_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
framerate: framerate,
|
||
interpolation: interpolation
|
||
}));
|
||
};
|
||
|
||
Controls.propTypes = {
|
||
active: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"].isRequired,
|
||
onGreenFlagClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onStopAllClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
framerate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
interpolation: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isSmall: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
turbo: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
Controls.defaultProps = {
|
||
active: false,
|
||
turbo: false,
|
||
isSmall: false
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(Controls));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/crash-message/crash-message.css":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/crash-message/crash-message.css ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./crash-message.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/crash-message/crash-message.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/crash-message/crash-message.jsx":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/crash-message/crash-message.jsx ***!
|
||
\********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _crash_message_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./crash-message.css */ "./src/components/crash-message/crash-message.css");
|
||
/* harmony import */ var _crash_message_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_crash_message_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _reload_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./reload.svg */ "./src/components/crash-message/reload.svg");
|
||
/* harmony import */ var _reload_svg__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_reload_svg__WEBPACK_IMPORTED_MODULE_5__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const CrashMessage = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _crash_message_css__WEBPACK_IMPORTED_MODULE_4___default.a.crashWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
||
className: _crash_message_css__WEBPACK_IMPORTED_MODULE_4___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _crash_message_css__WEBPACK_IMPORTED_MODULE_4___default.a.reloadIcon,
|
||
src: _reload_svg__WEBPACK_IMPORTED_MODULE_5___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("p", {
|
||
className: _crash_message_css__WEBPACK_IMPORTED_MODULE_4___default.a.header
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Oops! Something went wrong.",
|
||
id: "gui.crashMessage.label"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: 'We are so sorry, but it looks like the page has crashed.' + ' Please refresh your page to try' + ' again.',
|
||
id: "tw.gui.crashMessage.description"
|
||
})), props.errorMessage && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("p", {
|
||
className: _crash_message_css__WEBPACK_IMPORTED_MODULE_4___default.a.errorMessage
|
||
}, props.errorMessage), props.eventId && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Your error was logged with id {errorId}",
|
||
id: "gui.crashMessage.errorNumber",
|
||
values: {
|
||
errorId: props.eventId
|
||
}
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
|
||
className: _crash_message_css__WEBPACK_IMPORTED_MODULE_4___default.a.reloadButton,
|
||
onClick: props.onReload
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Reload",
|
||
id: "gui.crashMessage.reload"
|
||
}))));
|
||
|
||
CrashMessage.propTypes = {
|
||
eventId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
errorMessage: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
onReload: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (CrashMessage);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/crash-message/reload.svg":
|
||
/*!*************************************************!*\
|
||
!*** ./src/components/crash-message/reload.svg ***!
|
||
\*************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/dd98971c2c185caf86144b6b5234d0fa.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/custom-procedures/custom-procedures.css":
|
||
/*!****************************************************************!*\
|
||
!*** ./src/components/custom-procedures/custom-procedures.css ***!
|
||
\****************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./custom-procedures.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/custom-procedures/custom-procedures.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/custom-procedures/custom-procedures.jsx":
|
||
/*!****************************************************************!*\
|
||
!*** ./src/components/custom-procedures/custom-procedures.jsx ***!
|
||
\****************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _containers_modal_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../containers/modal.jsx */ "./src/containers/modal.jsx");
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _icon_boolean_input_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./icon--boolean-input.svg */ "./src/components/custom-procedures/icon--boolean-input.svg");
|
||
/* harmony import */ var _icon_boolean_input_svg__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_icon_boolean_input_svg__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _icon_text_input_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icon--text-input.svg */ "./src/components/custom-procedures/icon--text-input.svg");
|
||
/* harmony import */ var _icon_text_input_svg__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_icon_text_input_svg__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _icon_label_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./icon--label.svg */ "./src/components/custom-procedures/icon--label.svg");
|
||
/* harmony import */ var _icon_label_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_icon_label_svg__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./custom-procedures.css */ "./src/components/custom-procedures/custom-procedures.css");
|
||
/* harmony import */ var _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_custom_procedures_css__WEBPACK_IMPORTED_MODULE_8__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["defineMessages"])({
|
||
myblockModalTitle: {
|
||
"id": "gui.customProcedures.myblockModalTitle",
|
||
"defaultMessage": "Make a Block"
|
||
}
|
||
});
|
||
|
||
const CustomProcedures = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_modal_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.modalContent,
|
||
contentLabel: props.intl.formatMessage(messages.myblockModalTitle),
|
||
onRequestClose: props.onCancel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.workspace,
|
||
componentRef: props.componentRef
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.optionsRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.optionCard,
|
||
role: "button",
|
||
tabIndex: "0",
|
||
onClick: props.onAddTextNumber
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.optionIcon,
|
||
src: _icon_text_input_svg__WEBPACK_IMPORTED_MODULE_6___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.optionTitle
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "Add an input",
|
||
id: "gui.customProcedures.addAnInputNumberText"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.optionDescription
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "number or text",
|
||
id: "gui.customProcedures.numberTextType"
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.optionCard,
|
||
role: "button",
|
||
tabIndex: "0",
|
||
onClick: props.onAddBoolean
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.optionIcon,
|
||
src: _icon_boolean_input_svg__WEBPACK_IMPORTED_MODULE_5___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.optionTitle
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "Add an input",
|
||
id: "gui.customProcedures.addAnInputBoolean"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.optionDescription
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "boolean",
|
||
id: "gui.customProcedures.booleanType"
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.optionCard,
|
||
role: "button",
|
||
tabIndex: "0",
|
||
onClick: props.onAddLabel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.optionIcon,
|
||
src: _icon_label_svg__WEBPACK_IMPORTED_MODULE_7___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.optionTitle
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "Add a label",
|
||
id: "gui.customProcedures.addALabel"
|
||
})))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.checkboxRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("label", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
|
||
checked: props.warp,
|
||
type: "checkbox",
|
||
onChange: props.onToggleWarp
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "Run without screen refresh",
|
||
id: "gui.customProcedures.runWithoutScreenRefresh"
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.buttonRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.cancelButton,
|
||
onClick: props.onCancel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "Cancel",
|
||
id: "gui.customProcedures.cancel"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
|
||
className: _custom_procedures_css__WEBPACK_IMPORTED_MODULE_8___default.a.okButton,
|
||
onClick: props.onOk
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "OK",
|
||
id: "gui.customProcedures.ok"
|
||
})))));
|
||
|
||
CustomProcedures.propTypes = {
|
||
componentRef: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_4__["intlShape"],
|
||
onAddBoolean: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onAddLabel: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onAddTextNumber: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onCancel: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onOk: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onToggleWarp: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
warp: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["injectIntl"])(CustomProcedures));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/custom-procedures/icon--boolean-input.svg":
|
||
/*!******************************************************************!*\
|
||
!*** ./src/components/custom-procedures/icon--boolean-input.svg ***!
|
||
\******************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/10811a978de201353d564df7ba1ddb58.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/custom-procedures/icon--label.svg":
|
||
/*!**********************************************************!*\
|
||
!*** ./src/components/custom-procedures/icon--label.svg ***!
|
||
\**********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/8beb9da10f72d02b48baf0b24ac72449.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/custom-procedures/icon--text-input.svg":
|
||
/*!***************************************************************!*\
|
||
!*** ./src/components/custom-procedures/icon--text-input.svg ***!
|
||
\***************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/2a70b21aaaed0619bdfcdec91db1ebe8.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/delete-button/delete-button.css":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/delete-button/delete-button.css ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./delete-button.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/delete-button/delete-button.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/delete-button/delete-button.jsx":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/delete-button/delete-button.jsx ***!
|
||
\********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _delete_button_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./delete-button.css */ "./src/components/delete-button/delete-button.css");
|
||
/* harmony import */ var _delete_button_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_delete_button_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _icon_delete_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./icon--delete.svg */ "./src/components/delete-button/icon--delete.svg");
|
||
/* harmony import */ var _icon_delete_svg__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_icon_delete_svg__WEBPACK_IMPORTED_MODULE_4__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const DeleteButton = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
"aria-label": "Delete",
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_delete_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.deleteButton, props.className),
|
||
role: "button",
|
||
tabIndex: props.tabIndex,
|
||
onClick: props.onClick
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _delete_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.deleteButtonVisible
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _delete_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.deleteIcon,
|
||
src: _icon_delete_svg__WEBPACK_IMPORTED_MODULE_4___default.a
|
||
})));
|
||
|
||
DeleteButton.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
};
|
||
DeleteButton.defaultProps = {
|
||
tabIndex: 0
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (DeleteButton);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/delete-button/icon--delete.svg":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/delete-button/icon--delete.svg ***!
|
||
\*******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/a5787bb7364d8131ed49a8f53037d7f4.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/direction-picker/dial.css":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/direction-picker/dial.css ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./dial.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/direction-picker/dial.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/direction-picker/dial.jsx":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/direction-picker/dial.jsx ***!
|
||
\**************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _lib_touch_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../lib/touch-utils */ "./src/lib/touch-utils.js");
|
||
/* harmony import */ var _dial_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dial.css */ "./src/components/direction-picker/dial.css");
|
||
/* harmony import */ var _dial_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_dial_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _icon_dial_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./icon--dial.svg */ "./src/components/direction-picker/icon--dial.svg");
|
||
/* harmony import */ var _icon_dial_svg__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_icon_dial_svg__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _icon_handle_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icon--handle.svg */ "./src/components/direction-picker/icon--handle.svg");
|
||
/* harmony import */ var _icon_handle_svg__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_icon_handle_svg__WEBPACK_IMPORTED_MODULE_6__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class Dial extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_1___default()(this, ['handleMouseDown', 'handleMouseMove', 'containerRef', 'handleRef', 'unbindMouseEvents']);
|
||
}
|
||
|
||
componentDidMount() {
|
||
// Manually add touch/mouse handlers so that preventDefault can be used
|
||
// to prevent scrolling on touch.
|
||
// Tracked as a react issue https://github.com/facebook/react/issues/6436
|
||
this.handleElement.addEventListener('mousedown', this.handleMouseDown);
|
||
this.handleElement.addEventListener('touchstart', this.handleMouseDown);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.unbindMouseEvents();
|
||
this.handleElement.removeEventListener('mousedown', this.handleMouseDown);
|
||
this.handleElement.removeEventListener('touchstart', this.handleMouseDown);
|
||
}
|
||
/**
|
||
* Get direction from dial center to mouse move event.
|
||
* @param {Event} e - Mouse move event.
|
||
* @returns {number} Direction in degrees, clockwise, 90=horizontal.
|
||
*/
|
||
|
||
|
||
directionToMouseEvent(e) {
|
||
const {
|
||
x: mx,
|
||
y: my
|
||
} = Object(_lib_touch_utils__WEBPACK_IMPORTED_MODULE_3__["getEventXY"])(e);
|
||
const bbox = this.containerElement.getBoundingClientRect();
|
||
const cy = bbox.top + bbox.height / 2;
|
||
const cx = bbox.left + bbox.width / 2;
|
||
const angle = Math.atan2(my - cy, mx - cx);
|
||
const degrees = angle * (180 / Math.PI);
|
||
return degrees + 90; // To correspond with scratch coordinate system
|
||
}
|
||
/**
|
||
* Create SVG path data string for the dial "gauge", the overlaid arc slice.
|
||
* @param {number} radius - The radius of the dial.
|
||
* @param {number} direction - Direction in degrees, clockwise, 90=horizontal.
|
||
* @returns {string} Path data string for the gauge.
|
||
*/
|
||
|
||
|
||
gaugePath(radius, direction) {
|
||
const rads = direction * (Math.PI / 180);
|
||
const path = [];
|
||
path.push("M ".concat(radius, " 0"));
|
||
path.push("L ".concat(radius, " ").concat(radius));
|
||
path.push("L ".concat(radius + radius * Math.sin(rads), " ").concat(radius - radius * Math.cos(rads)));
|
||
path.push("A ".concat(radius, " ").concat(radius, " 0 0 ").concat(direction < 0 ? 1 : 0, " ").concat(radius, " 0"));
|
||
path.push("Z");
|
||
return path.join(' ');
|
||
}
|
||
|
||
handleMouseMove(e) {
|
||
this.props.onChange(this.directionToMouseEvent(e) + this.directionOffset);
|
||
e.preventDefault();
|
||
}
|
||
|
||
unbindMouseEvents() {
|
||
window.removeEventListener('mousemove', this.handleMouseMove);
|
||
window.removeEventListener('mouseup', this.unbindMouseEvents);
|
||
window.removeEventListener('touchmove', this.handleMouseMove);
|
||
window.removeEventListener('touchend', this.unbindMouseEvents);
|
||
}
|
||
|
||
handleMouseDown(e) {
|
||
// Because the drag handle is not a single point, there is some initial
|
||
// difference between the current sprite direction and the direction to the mouse
|
||
// Store this offset to prevent jumping when the mouse is moved.
|
||
this.directionOffset = this.props.direction - this.directionToMouseEvent(e);
|
||
window.addEventListener('mousemove', this.handleMouseMove);
|
||
window.addEventListener('mouseup', this.unbindMouseEvents);
|
||
window.addEventListener('touchmove', this.handleMouseMove);
|
||
window.addEventListener('touchend', this.unbindMouseEvents);
|
||
e.preventDefault();
|
||
}
|
||
|
||
containerRef(el) {
|
||
this.containerElement = el;
|
||
}
|
||
|
||
handleRef(el) {
|
||
this.handleElement = el;
|
||
}
|
||
|
||
render() {
|
||
const {
|
||
direction,
|
||
radius
|
||
} = this.props;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _dial_css__WEBPACK_IMPORTED_MODULE_4___default.a.container
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _dial_css__WEBPACK_IMPORTED_MODULE_4___default.a.dialContainer,
|
||
ref: this.containerRef,
|
||
style: {
|
||
width: "".concat(radius * 2, "px"),
|
||
height: "".concat(radius * 2, "px")
|
||
}
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _dial_css__WEBPACK_IMPORTED_MODULE_4___default.a.dialFace,
|
||
draggable: false,
|
||
src: _icon_dial_svg__WEBPACK_IMPORTED_MODULE_5___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("svg", {
|
||
className: _dial_css__WEBPACK_IMPORTED_MODULE_4___default.a.gauge,
|
||
height: radius * 2,
|
||
width: radius * 2
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("path", {
|
||
className: _dial_css__WEBPACK_IMPORTED_MODULE_4___default.a.gaugePath,
|
||
d: this.gaugePath(radius, direction)
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _dial_css__WEBPACK_IMPORTED_MODULE_4___default.a.dialHandle,
|
||
draggable: false,
|
||
ref: this.handleRef,
|
||
src: _icon_handle_svg__WEBPACK_IMPORTED_MODULE_6___default.a,
|
||
style: {
|
||
top: "".concat(radius - radius * Math.cos(direction * (Math.PI / 180)), "px"),
|
||
left: "".concat(radius + radius * Math.sin(direction * (Math.PI / 180)), "px"),
|
||
transform: "rotate(".concat(direction, "deg)")
|
||
}
|
||
})));
|
||
}
|
||
|
||
}
|
||
|
||
Dial.propTypes = {
|
||
direction: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
onChange: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
radius: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
};
|
||
Dial.defaultProps = {
|
||
direction: 90,
|
||
// degrees
|
||
radius: 56 // px
|
||
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Dial);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/direction-picker/direction-picker.css":
|
||
/*!**************************************************************!*\
|
||
!*** ./src/components/direction-picker/direction-picker.css ***!
|
||
\**************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./direction-picker.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/direction-picker/direction-picker.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/direction-picker/direction-picker.jsx":
|
||
/*!**************************************************************!*\
|
||
!*** ./src/components/direction-picker/direction-picker.jsx ***!
|
||
\**************************************************************/
|
||
/*! exports provided: default, RotationStyles */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return WrappedDirectionPicker; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RotationStyles", function() { return RotationStyles; });
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_popover__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-popover */ "./node_modules/react-popover/index.js");
|
||
/* harmony import */ var react_popover__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_popover__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _forms_label_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../forms/label.jsx */ "./src/components/forms/label.jsx");
|
||
/* harmony import */ var _forms_input_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../forms/input.jsx */ "./src/components/forms/input.jsx");
|
||
/* harmony import */ var _forms_buffered_input_hoc_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../forms/buffered-input-hoc.jsx */ "./src/components/forms/buffered-input-hoc.jsx");
|
||
/* harmony import */ var _dial_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./dial.jsx */ "./src/components/direction-picker/dial.jsx");
|
||
/* harmony import */ var _direction_picker_css__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./direction-picker.css */ "./src/components/direction-picker/direction-picker.css");
|
||
/* harmony import */ var _direction_picker_css__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_direction_picker_css__WEBPACK_IMPORTED_MODULE_9__);
|
||
/* harmony import */ var _icon_all_around_svg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./icon--all-around.svg */ "./src/components/direction-picker/icon--all-around.svg");
|
||
/* harmony import */ var _icon_all_around_svg__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_icon_all_around_svg__WEBPACK_IMPORTED_MODULE_10__);
|
||
/* harmony import */ var _icon_left_right_svg__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./icon--left-right.svg */ "./src/components/direction-picker/icon--left-right.svg");
|
||
/* harmony import */ var _icon_left_right_svg__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_icon_left_right_svg__WEBPACK_IMPORTED_MODULE_11__);
|
||
/* harmony import */ var _icon_dont_rotate_svg__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./icon--dont-rotate.svg */ "./src/components/direction-picker/icon--dont-rotate.svg");
|
||
/* harmony import */ var _icon_dont_rotate_svg__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_icon_dont_rotate_svg__WEBPACK_IMPORTED_MODULE_12__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const BufferedInput = Object(_forms_buffered_input_hoc_jsx__WEBPACK_IMPORTED_MODULE_7__["default"])(_forms_input_jsx__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
||
const directionLabel = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "Direction",
|
||
id: "gui.SpriteInfo.direction"
|
||
});
|
||
const RotationStyles = {
|
||
ALL_AROUND: 'all around',
|
||
LEFT_RIGHT: 'left-right',
|
||
DONT_ROTATE: "don't rotate"
|
||
};
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["defineMessages"])({
|
||
allAround: {
|
||
"id": "gui.directionPicker.rotationStyles.allAround",
|
||
"defaultMessage": "All Around"
|
||
},
|
||
leftRight: {
|
||
"id": "gui.directionPicker.rotationStyles.leftRight",
|
||
"defaultMessage": "Left/Right"
|
||
},
|
||
dontRotate: {
|
||
"id": "gui.directionPicker.rotationStyles.dontRotate",
|
||
"defaultMessage": "Do not rotate"
|
||
}
|
||
});
|
||
|
||
const DirectionPicker = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_forms_label_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
secondary: true,
|
||
above: props.labelAbove,
|
||
text: directionLabel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_popover__WEBPACK_IMPORTED_MODULE_3___default.a, {
|
||
body: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_dial_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], {
|
||
direction: props.direction,
|
||
onChange: props.onChangeDirection
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _direction_picker_css__WEBPACK_IMPORTED_MODULE_9___default.a.buttonRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_direction_picker_css__WEBPACK_IMPORTED_MODULE_9___default.a.iconButton, {
|
||
[_direction_picker_css__WEBPACK_IMPORTED_MODULE_9___default.a.active]: props.rotationStyle === RotationStyles.ALL_AROUND
|
||
}),
|
||
title: props.intl.formatMessage(messages.allAround),
|
||
onClick: props.onClickAllAround
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: _icon_all_around_svg__WEBPACK_IMPORTED_MODULE_10___default.a
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_direction_picker_css__WEBPACK_IMPORTED_MODULE_9___default.a.iconButton, {
|
||
[_direction_picker_css__WEBPACK_IMPORTED_MODULE_9___default.a.active]: props.rotationStyle === RotationStyles.LEFT_RIGHT
|
||
}),
|
||
title: props.intl.formatMessage(messages.leftRight),
|
||
onClick: props.onClickLeftRight
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: _icon_left_right_svg__WEBPACK_IMPORTED_MODULE_11___default.a
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_direction_picker_css__WEBPACK_IMPORTED_MODULE_9___default.a.iconButton, {
|
||
[_direction_picker_css__WEBPACK_IMPORTED_MODULE_9___default.a.active]: props.rotationStyle === RotationStyles.DONT_ROTATE
|
||
}),
|
||
title: props.intl.formatMessage(messages.dontRotate),
|
||
onClick: props.onClickDontRotate
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: _icon_dont_rotate_svg__WEBPACK_IMPORTED_MODULE_12___default.a
|
||
})))),
|
||
isOpen: props.popoverOpen,
|
||
preferPlace: "above",
|
||
onOuterAction: props.onClosePopover
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(BufferedInput, {
|
||
small: true,
|
||
disabled: props.disabled,
|
||
label: directionLabel,
|
||
tabIndex: "0",
|
||
type: "text",
|
||
value: props.disabled ? '' : props.direction,
|
||
onFocus: props.onOpenPopover,
|
||
onSubmit: props.onChangeDirection
|
||
})));
|
||
|
||
DirectionPicker.propTypes = {
|
||
direction: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
disabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_4__["intlShape"],
|
||
labelAbove: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onChangeDirection: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onClickAllAround: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onClickDontRotate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onClickLeftRight: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onClosePopover: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onOpenPopover: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
popoverOpen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
rotationStyle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
};
|
||
DirectionPicker.defaultProps = {
|
||
labelAbove: false
|
||
};
|
||
const WrappedDirectionPicker = Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["injectIntl"])(DirectionPicker);
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/direction-picker/icon--all-around.svg":
|
||
/*!**************************************************************!*\
|
||
!*** ./src/components/direction-picker/icon--all-around.svg ***!
|
||
\**************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/143a9041098d0e0724ed22c89e6558cc.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/direction-picker/icon--dial.svg":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/direction-picker/icon--dial.svg ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/9cc1e7a12b63848899055ddc982ab2ce.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/direction-picker/icon--dont-rotate.svg":
|
||
/*!***************************************************************!*\
|
||
!*** ./src/components/direction-picker/icon--dont-rotate.svg ***!
|
||
\***************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/8ea23814ef4f6dc9f86859a028377a3a.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/direction-picker/icon--handle.svg":
|
||
/*!**********************************************************!*\
|
||
!*** ./src/components/direction-picker/icon--handle.svg ***!
|
||
\**********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/57593d3aac258d2c0abf75a0b8ecbdaa.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/direction-picker/icon--left-right.svg":
|
||
/*!**************************************************************!*\
|
||
!*** ./src/components/direction-picker/icon--left-right.svg ***!
|
||
\**************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/0dd03e5061d2865c0e8ac50cc75e9982.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/divider/divider.css":
|
||
/*!********************************************!*\
|
||
!*** ./src/components/divider/divider.css ***!
|
||
\********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./divider.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/divider/divider.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/divider/divider.jsx":
|
||
/*!********************************************!*\
|
||
!*** ./src/components/divider/divider.jsx ***!
|
||
\********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _divider_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./divider.css */ "./src/components/divider/divider.css");
|
||
/* harmony import */ var _divider_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_divider_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
|
||
|
||
|
||
|
||
|
||
const Divider = ({
|
||
className
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_divider_css__WEBPACK_IMPORTED_MODULE_3___default.a.divider, className)
|
||
});
|
||
|
||
Divider.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Divider);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/drag-layer/drag-layer.css":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/drag-layer/drag-layer.css ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./drag-layer.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/drag-layer/drag-layer.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/drag-layer/drag-layer.jsx":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/drag-layer/drag-layer.jsx ***!
|
||
\**************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _drag_layer_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./drag-layer.css */ "./src/components/drag-layer/drag-layer.css");
|
||
/* harmony import */ var _drag_layer_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_drag_layer_css__WEBPACK_IMPORTED_MODULE_2__);
|
||
|
||
|
||
|
||
/* eslint no-confusing-arrow: ["error", {"allowParens": true}] */
|
||
|
||
const DragLayer = ({
|
||
dragging,
|
||
img,
|
||
currentOffset
|
||
}) => dragging ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _drag_layer_css__WEBPACK_IMPORTED_MODULE_2___default.a.dragLayer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _drag_layer_css__WEBPACK_IMPORTED_MODULE_2___default.a.imageWrapper,
|
||
style: {
|
||
transform: "translate(".concat(currentOffset.x, "px, ").concat(currentOffset.y, "px)")
|
||
}
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {
|
||
className: _drag_layer_css__WEBPACK_IMPORTED_MODULE_2___default.a.image,
|
||
src: img
|
||
}))) : null;
|
||
|
||
DragLayer.propTypes = {
|
||
currentOffset: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
x: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,
|
||
y: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired
|
||
}),
|
||
dragging: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
img: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (DragLayer);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/filter/filter.css":
|
||
/*!******************************************!*\
|
||
!*** ./src/components/filter/filter.css ***!
|
||
\******************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./filter.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/filter/filter.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/filter/filter.jsx":
|
||
/*!******************************************!*\
|
||
!*** ./src/components/filter/filter.jsx ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _icon_filter_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./icon--filter.svg */ "./src/components/filter/icon--filter.svg");
|
||
/* harmony import */ var _icon_filter_svg__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_icon_filter_svg__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _icon_x_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./icon--x.svg */ "./src/components/filter/icon--x.svg");
|
||
/* harmony import */ var _icon_x_svg__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_icon_x_svg__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _filter_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./filter.css */ "./src/components/filter/filter.css");
|
||
/* harmony import */ var _filter_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_filter_css__WEBPACK_IMPORTED_MODULE_5__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const FilterComponent = props => {
|
||
const {
|
||
className,
|
||
onChange,
|
||
onClear,
|
||
placeholderText,
|
||
filterQuery,
|
||
inputClassName
|
||
} = props;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(className, _filter_css__WEBPACK_IMPORTED_MODULE_5___default.a.filter, {
|
||
[_filter_css__WEBPACK_IMPORTED_MODULE_5___default.a.isActive]: filterQuery.length > 0
|
||
})
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _filter_css__WEBPACK_IMPORTED_MODULE_5___default.a.filterIcon,
|
||
src: _icon_filter_svg__WEBPACK_IMPORTED_MODULE_3___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("input", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_filter_css__WEBPACK_IMPORTED_MODULE_5___default.a.filterInput, inputClassName),
|
||
placeholder: placeholderText,
|
||
type: "text",
|
||
value: filterQuery,
|
||
onChange: onChange
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _filter_css__WEBPACK_IMPORTED_MODULE_5___default.a.xIconWrapper,
|
||
onClick: onClear
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _filter_css__WEBPACK_IMPORTED_MODULE_5___default.a.xIcon,
|
||
src: _icon_x_svg__WEBPACK_IMPORTED_MODULE_4___default.a
|
||
})));
|
||
};
|
||
|
||
FilterComponent.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
filterQuery: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
inputClassName: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onClear: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
placeholderText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
};
|
||
FilterComponent.defaultProps = {
|
||
placeholderText: 'Search'
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (FilterComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/filter/icon--filter.svg":
|
||
/*!************************************************!*\
|
||
!*** ./src/components/filter/icon--filter.svg ***!
|
||
\************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/5e460dab4dfda0fe34f93d3faf95b778.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/filter/icon--x.svg":
|
||
/*!*******************************************!*\
|
||
!*** ./src/components/filter/icon--x.svg ***!
|
||
\*******************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/c8481ea8e104d4d2bb6b340e0c90da26.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/forms/buffered-input-hoc.jsx":
|
||
/*!*****************************************************!*\
|
||
!*** ./src/components/forms/buffered-input-hoc.jsx ***!
|
||
\*****************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
/**
|
||
* Higher Order Component to manage inputs that submit on blur and <enter>
|
||
* @param {React.Component} Input text input that consumes onChange, onBlur, onKeyPress
|
||
* @returns {React.Component} Buffered input that calls onSubmit on blur and <enter>
|
||
*/
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (function (Input) {
|
||
class BufferedInput extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleChange', 'handleKeyPress', 'handleFlush']);
|
||
this.state = {
|
||
value: null
|
||
};
|
||
}
|
||
|
||
handleKeyPress(e) {
|
||
if (e.key === 'Enter') {
|
||
this.handleFlush();
|
||
e.target.blur();
|
||
}
|
||
}
|
||
|
||
handleFlush() {
|
||
const isNumeric = typeof this.props.value === 'number';
|
||
const validatesNumeric = isNumeric ? !isNaN(this.state.value) : true;
|
||
|
||
if (this.state.value !== null && validatesNumeric) {
|
||
this.props.onSubmit(isNumeric ? Number(this.state.value) : this.state.value);
|
||
}
|
||
|
||
this.setState({
|
||
value: null
|
||
});
|
||
}
|
||
|
||
handleChange(e) {
|
||
this.setState({
|
||
value: e.target.value
|
||
});
|
||
}
|
||
|
||
render() {
|
||
const bufferedValue = this.state.value === null ? this.props.value : this.state.value;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Input, _extends({}, this.props, {
|
||
value: bufferedValue,
|
||
onBlur: this.handleFlush,
|
||
onChange: this.handleChange,
|
||
onKeyPress: this.handleKeyPress
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
BufferedInput.propTypes = {
|
||
onSubmit: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
value: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number])
|
||
};
|
||
return BufferedInput;
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/forms/input.css":
|
||
/*!****************************************!*\
|
||
!*** ./src/components/forms/input.css ***!
|
||
\****************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./input.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/forms/input.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/forms/input.jsx":
|
||
/*!****************************************!*\
|
||
!*** ./src/components/forms/input.jsx ***!
|
||
\****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _input_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./input.css */ "./src/components/forms/input.css");
|
||
/* harmony import */ var _input_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_input_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
const _excluded = ["small"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const Input = props => {
|
||
const {
|
||
small
|
||
} = props,
|
||
componentProps = _objectWithoutProperties(props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", _extends({}, componentProps, {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_input_css__WEBPACK_IMPORTED_MODULE_3___default.a.inputForm, props.className, {
|
||
[_input_css__WEBPACK_IMPORTED_MODULE_3___default.a.inputSmall]: small
|
||
})
|
||
}));
|
||
};
|
||
|
||
Input.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
small: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool
|
||
};
|
||
Input.defaultProps = {
|
||
small: false
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Input);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/forms/label.css":
|
||
/*!****************************************!*\
|
||
!*** ./src/components/forms/label.css ***!
|
||
\****************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./label.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/forms/label.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/forms/label.jsx":
|
||
/*!****************************************!*\
|
||
!*** ./src/components/forms/label.jsx ***!
|
||
\****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _label_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./label.css */ "./src/components/forms/label.css");
|
||
/* harmony import */ var _label_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_label_css__WEBPACK_IMPORTED_MODULE_2__);
|
||
|
||
|
||
|
||
|
||
const Label = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("label", {
|
||
className: props.above ? _label_css__WEBPACK_IMPORTED_MODULE_2___default.a.inputGroupColumn : _label_css__WEBPACK_IMPORTED_MODULE_2___default.a.inputGroup
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
|
||
className: props.secondary ? _label_css__WEBPACK_IMPORTED_MODULE_2___default.a.inputLabelSecondary : _label_css__WEBPACK_IMPORTED_MODULE_2___default.a.inputLabel
|
||
}, props.text), props.children);
|
||
|
||
Label.propTypes = {
|
||
above: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.node,
|
||
secondary: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
text: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.node]).isRequired
|
||
};
|
||
Label.defaultProps = {
|
||
above: false,
|
||
secondary: false
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Label);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/green-flag/green-flag.css":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/green-flag/green-flag.css ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./green-flag.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/green-flag/green-flag.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/green-flag/green-flag.jsx":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/green-flag/green-flag.jsx ***!
|
||
\**************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _icon_green_flag_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./icon--green-flag.svg */ "./src/components/green-flag/icon--green-flag.svg");
|
||
/* harmony import */ var _icon_green_flag_svg__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_icon_green_flag_svg__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _green_flag_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./green-flag.css */ "./src/components/green-flag/green-flag.css");
|
||
/* harmony import */ var _green_flag_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_green_flag_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
const _excluded = ["active", "className", "onClick", "title"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const GreenFlagComponent = function GreenFlagComponent(props) {
|
||
const {
|
||
active,
|
||
className,
|
||
onClick,
|
||
title
|
||
} = props,
|
||
componentProps = _objectWithoutProperties(props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", _extends({
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(className, _green_flag_css__WEBPACK_IMPORTED_MODULE_4___default.a.greenFlag, {
|
||
[_green_flag_css__WEBPACK_IMPORTED_MODULE_4___default.a.isActive]: active
|
||
}),
|
||
draggable: false,
|
||
src: _icon_green_flag_svg__WEBPACK_IMPORTED_MODULE_3___default.a,
|
||
title: title,
|
||
onClick: onClick // tw: also fire click when opening context menu (right click on all systems and alt+click on chromebooks)
|
||
,
|
||
onContextMenu: onClick
|
||
}, componentProps));
|
||
};
|
||
|
||
GreenFlagComponent.propTypes = {
|
||
active: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
};
|
||
GreenFlagComponent.defaultProps = {
|
||
active: false,
|
||
title: 'Go'
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (GreenFlagComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/green-flag/icon--green-flag.svg":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/green-flag/icon--green-flag.svg ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/2e0c4790f8f9cf28e3c346b9cef0fcb6.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/gui/gui.css":
|
||
/*!************************************!*\
|
||
!*** ./src/components/gui/gui.css ***!
|
||
\************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./gui.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/gui/gui.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/gui/gui.jsx":
|
||
/*!************************************!*\
|
||
!*** ./src/components/gui/gui.jsx ***!
|
||
\************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash.omit */ "./node_modules/lodash.omit/index.js");
|
||
/* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_omit__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var react_responsive__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-responsive */ "./node_modules/react-responsive/dist/react-responsive.js");
|
||
/* harmony import */ var react_responsive__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react_responsive__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var react_tabs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-tabs */ "./node_modules/react-tabs/esm/index.js");
|
||
/* harmony import */ var react_tabs_style_react_tabs_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-tabs/style/react-tabs.css */ "./node_modules/react-tabs/style/react-tabs.css");
|
||
/* harmony import */ var react_tabs_style_react_tabs_css__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react_tabs_style_react_tabs_css__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_9__);
|
||
/* harmony import */ var scratch_render__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! scratch-render */ "./node_modules/scratch-render/src/index.js");
|
||
/* harmony import */ var scratch_render__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(scratch_render__WEBPACK_IMPORTED_MODULE_10__);
|
||
/* harmony import */ var _containers_blocks_jsx__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../containers/blocks.jsx */ "./src/containers/blocks.jsx");
|
||
/* harmony import */ var _containers_costume_tab_jsx__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../containers/costume-tab.jsx */ "./src/containers/costume-tab.jsx");
|
||
/* harmony import */ var _containers_target_pane_jsx__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../containers/target-pane.jsx */ "./src/containers/target-pane.jsx");
|
||
/* harmony import */ var _containers_sound_tab_jsx__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../containers/sound-tab.jsx */ "./src/containers/sound-tab.jsx");
|
||
/* harmony import */ var _containers_stage_wrapper_jsx__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../containers/stage-wrapper.jsx */ "./src/containers/stage-wrapper.jsx");
|
||
/* harmony import */ var _loader_loader_jsx__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../loader/loader.jsx */ "./src/components/loader/loader.jsx");
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _menu_bar_menu_bar_jsx__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../menu-bar/menu-bar.jsx */ "./src/components/menu-bar/menu-bar.jsx");
|
||
/* harmony import */ var _containers_costume_library_jsx__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../containers/costume-library.jsx */ "./src/containers/costume-library.jsx");
|
||
/* harmony import */ var _containers_backdrop_library_jsx__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../containers/backdrop-library.jsx */ "./src/containers/backdrop-library.jsx");
|
||
/* harmony import */ var _containers_watermark_jsx__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../containers/watermark.jsx */ "./src/containers/watermark.jsx");
|
||
/* harmony import */ var _containers_backpack_jsx__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../containers/backpack.jsx */ "./src/containers/backpack.jsx");
|
||
/* harmony import */ var _containers_webgl_modal_jsx__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../containers/webgl-modal.jsx */ "./src/containers/webgl-modal.jsx");
|
||
/* harmony import */ var _browser_modal_browser_modal_jsx__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../browser-modal/browser-modal.jsx */ "./src/components/browser-modal/browser-modal.jsx");
|
||
/* harmony import */ var _containers_tips_library_jsx__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../../containers/tips-library.jsx */ "./src/containers/tips-library.jsx");
|
||
/* harmony import */ var _containers_cards_jsx__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../containers/cards.jsx */ "./src/containers/cards.jsx");
|
||
/* harmony import */ var _containers_alerts_jsx__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../containers/alerts.jsx */ "./src/containers/alerts.jsx");
|
||
/* harmony import */ var _containers_drag_layer_jsx__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../../containers/drag-layer.jsx */ "./src/containers/drag-layer.jsx");
|
||
/* harmony import */ var _containers_connection_modal_jsx__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../../containers/connection-modal.jsx */ "./src/containers/connection-modal.jsx");
|
||
/* harmony import */ var _telemetry_modal_telemetry_modal_jsx__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../telemetry-modal/telemetry-modal.jsx */ "./src/components/telemetry-modal/telemetry-modal.jsx");
|
||
/* harmony import */ var _containers_tw_username_modal_jsx__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../../containers/tw-username-modal.jsx */ "./src/containers/tw-username-modal.jsx");
|
||
/* harmony import */ var _containers_tw_settings_modal_jsx__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../../containers/tw-settings-modal.jsx */ "./src/containers/tw-settings-modal.jsx");
|
||
/* harmony import */ var _containers_tw_security_manager_jsx__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../../containers/tw-security-manager.jsx */ "./src/containers/tw-security-manager.jsx");
|
||
/* harmony import */ var _containers_tw_custom_extension_modal_jsx__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../../containers/tw-custom-extension-modal.jsx */ "./src/containers/tw-custom-extension-modal.jsx");
|
||
/* harmony import */ var _containers_tw_restore_point_manager_jsx__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../../containers/tw-restore-point-manager.jsx */ "./src/containers/tw-restore-point-manager.jsx");
|
||
/* harmony import */ var _containers_tw_fonts_modal_jsx__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../../containers/tw-fonts-modal.jsx */ "./src/containers/tw-fonts-modal.jsx");
|
||
/* harmony import */ var _lib_layout_constants__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../../lib/layout-constants */ "./src/lib/layout-constants.js");
|
||
/* harmony import */ var _lib_screen_utils__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ../../lib/screen-utils */ "./src/lib/screen-utils.js");
|
||
/* harmony import */ var _lib_tw_environment_support_prober__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../../lib/tw-environment-support-prober */ "./src/lib/tw-environment-support-prober.js");
|
||
/* harmony import */ var _gui_css__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./gui.css */ "./src/components/gui/gui.css");
|
||
/* harmony import */ var _gui_css__WEBPACK_IMPORTED_MODULE_40___default = /*#__PURE__*/__webpack_require__.n(_gui_css__WEBPACK_IMPORTED_MODULE_40__);
|
||
/* harmony import */ var _icon_extensions_svg__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./icon--extensions.svg */ "./src/components/gui/icon--extensions.svg");
|
||
/* harmony import */ var _icon_extensions_svg__WEBPACK_IMPORTED_MODULE_41___default = /*#__PURE__*/__webpack_require__.n(_icon_extensions_svg__WEBPACK_IMPORTED_MODULE_41__);
|
||
/* harmony import */ var _icon_code_svg__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./icon--code.svg */ "./src/components/gui/icon--code.svg");
|
||
/* harmony import */ var _icon_code_svg__WEBPACK_IMPORTED_MODULE_42___default = /*#__PURE__*/__webpack_require__.n(_icon_code_svg__WEBPACK_IMPORTED_MODULE_42__);
|
||
/* harmony import */ var _icon_costumes_svg__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./icon--costumes.svg */ "./src/components/gui/icon--costumes.svg");
|
||
/* harmony import */ var _icon_costumes_svg__WEBPACK_IMPORTED_MODULE_43___default = /*#__PURE__*/__webpack_require__.n(_icon_costumes_svg__WEBPACK_IMPORTED_MODULE_43__);
|
||
/* harmony import */ var _icon_sounds_svg__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./icon--sounds.svg */ "./src/components/gui/icon--sounds.svg");
|
||
/* harmony import */ var _icon_sounds_svg__WEBPACK_IMPORTED_MODULE_44___default = /*#__PURE__*/__webpack_require__.n(_icon_sounds_svg__WEBPACK_IMPORTED_MODULE_44__);
|
||
const _excluded = ["accountNavOpen", "activeTabIndex", "alertsVisible", "authorId", "authorThumbnailUrl", "authorUsername", "basePath", "backdropLibraryVisible", "backpackHost", "backpackVisible", "blocksTabVisible", "cardsVisible", "canChangeLanguage", "canCreateNew", "canEditTitle", "canManageFiles", "canRemix", "canSave", "canCreateCopy", "canShare", "canUseCloud", "children", "connectionModalVisible", "costumeLibraryVisible", "costumesTabVisible", "customStageSize", "enableCommunity", "intl", "isCreating", "isDark", "isEmbedded", "isFullScreen", "isPlayerOnly", "isRtl", "isShared", "isWindowFullScreen", "isTelemetryEnabled", "loading", "logo", "renderLogin", "onClickAbout", "onClickAccountNav", "onCloseAccountNav", "onClickAddonSettings", "onClickNewWindow", "onClickTheme", "onClickPackager", "onLogOut", "onOpenRegistration", "onToggleLoginOpen", "onActivateCostumesTab", "onActivateSoundsTab", "onActivateTab", "onClickLogo", "onExtensionButtonClick", "onProjectTelemetryEvent", "onRequestCloseBackdropLibrary", "onRequestCloseCostumeLibrary", "onRequestCloseTelemetryModal", "onSeeCommunity", "onShare", "onShowPrivacyPolicy", "onStartSelectingFileUpload", "onTelemetryModalCancel", "onTelemetryModalOptIn", "onTelemetryModalOptOut", "showComingSoon", "soundsTabVisible", "stageSizeMode", "targetIsStage", "telemetryModalVisible", "tipsLibraryVisible", "usernameModalVisible", "settingsModalVisible", "customExtensionModalVisible", "fontsModalVisible", "vm"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["defineMessages"])({
|
||
addExtension: {
|
||
"id": "gui.gui.addExtension",
|
||
"defaultMessage": "Add Extension"
|
||
}
|
||
});
|
||
|
||
const getFullscreenBackgroundColor = () => {
|
||
const params = new URLSearchParams(location.search);
|
||
|
||
if (params.has('fullscreen-background')) {
|
||
return params.get('fullscreen-background');
|
||
}
|
||
|
||
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||
return '#111';
|
||
}
|
||
|
||
return 'white';
|
||
};
|
||
|
||
const fullscreenBackgroundColor = getFullscreenBackgroundColor();
|
||
|
||
const GUIComponent = props => {
|
||
const _omit = lodash_omit__WEBPACK_IMPORTED_MODULE_1___default()(props, 'dispatch'),
|
||
{
|
||
accountNavOpen,
|
||
activeTabIndex,
|
||
alertsVisible,
|
||
authorId,
|
||
authorThumbnailUrl,
|
||
authorUsername,
|
||
basePath,
|
||
backdropLibraryVisible,
|
||
backpackHost,
|
||
backpackVisible,
|
||
blocksTabVisible,
|
||
cardsVisible,
|
||
canChangeLanguage,
|
||
canCreateNew,
|
||
canEditTitle,
|
||
canManageFiles,
|
||
canRemix,
|
||
canSave,
|
||
canCreateCopy,
|
||
canShare,
|
||
canUseCloud,
|
||
children,
|
||
connectionModalVisible,
|
||
costumeLibraryVisible,
|
||
costumesTabVisible,
|
||
customStageSize,
|
||
enableCommunity,
|
||
intl,
|
||
isCreating,
|
||
isDark,
|
||
isEmbedded,
|
||
isFullScreen,
|
||
isPlayerOnly,
|
||
isRtl,
|
||
isShared,
|
||
isWindowFullScreen,
|
||
isTelemetryEnabled,
|
||
loading,
|
||
logo,
|
||
renderLogin,
|
||
onClickAbout,
|
||
onClickAccountNav,
|
||
onCloseAccountNav,
|
||
onClickAddonSettings,
|
||
onClickNewWindow,
|
||
onClickTheme,
|
||
onClickPackager,
|
||
onLogOut,
|
||
onOpenRegistration,
|
||
onToggleLoginOpen,
|
||
onActivateCostumesTab,
|
||
onActivateSoundsTab,
|
||
onActivateTab,
|
||
onClickLogo,
|
||
onExtensionButtonClick,
|
||
onProjectTelemetryEvent,
|
||
onRequestCloseBackdropLibrary,
|
||
onRequestCloseCostumeLibrary,
|
||
onRequestCloseTelemetryModal,
|
||
onSeeCommunity,
|
||
onShare,
|
||
onShowPrivacyPolicy,
|
||
onStartSelectingFileUpload,
|
||
onTelemetryModalCancel,
|
||
onTelemetryModalOptIn,
|
||
onTelemetryModalOptOut,
|
||
showComingSoon,
|
||
soundsTabVisible,
|
||
stageSizeMode,
|
||
targetIsStage,
|
||
telemetryModalVisible,
|
||
tipsLibraryVisible,
|
||
usernameModalVisible,
|
||
settingsModalVisible,
|
||
customExtensionModalVisible,
|
||
fontsModalVisible,
|
||
vm
|
||
} = _omit,
|
||
componentProps = _objectWithoutProperties(_omit, _excluded);
|
||
|
||
if (children) {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_17__["default"], componentProps, children);
|
||
}
|
||
|
||
const tabClassNames = {
|
||
tabs: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.tabs,
|
||
tab: classnames__WEBPACK_IMPORTED_MODULE_0___default()(react_tabs_style_react_tabs_css__WEBPACK_IMPORTED_MODULE_8___default.a.reactTabsTab, _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.tab),
|
||
tabList: classnames__WEBPACK_IMPORTED_MODULE_0___default()(react_tabs_style_react_tabs_css__WEBPACK_IMPORTED_MODULE_8___default.a.reactTabsTabList, _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.tabList),
|
||
tabPanel: classnames__WEBPACK_IMPORTED_MODULE_0___default()(react_tabs_style_react_tabs_css__WEBPACK_IMPORTED_MODULE_8___default.a.reactTabsTabPanel, _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.tabPanel),
|
||
tabPanelSelected: classnames__WEBPACK_IMPORTED_MODULE_0___default()(react_tabs_style_react_tabs_css__WEBPACK_IMPORTED_MODULE_8___default.a.reactTabsTabPanelSelected, _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.isSelected),
|
||
tabSelected: classnames__WEBPACK_IMPORTED_MODULE_0___default()(react_tabs_style_react_tabs_css__WEBPACK_IMPORTED_MODULE_8___default.a.reactTabsTabSelected, _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.isSelected)
|
||
};
|
||
const minWidth = _lib_layout_constants__WEBPACK_IMPORTED_MODULE_37__["default"].fullSizeMinWidth + Math.max(0, customStageSize.width - _lib_layout_constants__WEBPACK_IMPORTED_MODULE_37__["default"].referenceWidth);
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_responsive__WEBPACK_IMPORTED_MODULE_6___default.a, {
|
||
minWidth: minWidth
|
||
}, isFullSize => {
|
||
const stageSize = Object(_lib_screen_utils__WEBPACK_IMPORTED_MODULE_38__["resolveStageSize"])(stageSizeMode, isFullSize);
|
||
const alwaysEnabledModals = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_3___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_tw_security_manager_jsx__WEBPACK_IMPORTED_MODULE_33__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_tw_restore_point_manager_jsx__WEBPACK_IMPORTED_MODULE_35__["default"], null), usernameModalVisible && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_tw_username_modal_jsx__WEBPACK_IMPORTED_MODULE_31__["default"], null), settingsModalVisible && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_tw_settings_modal_jsx__WEBPACK_IMPORTED_MODULE_32__["default"], null), customExtensionModalVisible && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_tw_custom_extension_modal_jsx__WEBPACK_IMPORTED_MODULE_34__["default"], null), fontsModalVisible && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_tw_fonts_modal_jsx__WEBPACK_IMPORTED_MODULE_36__["default"], null));
|
||
return isPlayerOnly ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_3___default.a.Fragment, null, isWindowFullScreen ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.fullscreenBackground,
|
||
style: {
|
||
backgroundColor: fullscreenBackgroundColor
|
||
}
|
||
}) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_stage_wrapper_jsx__WEBPACK_IMPORTED_MODULE_15__["default"], {
|
||
isFullScreen: isFullScreen,
|
||
isEmbedded: isEmbedded,
|
||
isRendererSupported: Object(_lib_tw_environment_support_prober__WEBPACK_IMPORTED_MODULE_39__["isRendererSupported"])(),
|
||
isRtl: isRtl,
|
||
loading: loading,
|
||
stageSize: _lib_layout_constants__WEBPACK_IMPORTED_MODULE_37__["STAGE_SIZE_MODES"].large,
|
||
vm: vm
|
||
}, alertsVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_alerts_jsx__WEBPACK_IMPORTED_MODULE_27__["default"], {
|
||
className: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.alertsContainer
|
||
}) : null), alwaysEnabledModals) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_17__["default"], _extends({
|
||
className: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.pageWrapper,
|
||
dir: isRtl ? 'rtl' : 'ltr'
|
||
}, componentProps), alwaysEnabledModals, telemetryModalVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_telemetry_modal_telemetry_modal_jsx__WEBPACK_IMPORTED_MODULE_30__["default"], {
|
||
isRtl: isRtl,
|
||
isTelemetryEnabled: isTelemetryEnabled,
|
||
onCancel: onTelemetryModalCancel,
|
||
onOptIn: onTelemetryModalOptIn,
|
||
onOptOut: onTelemetryModalOptOut,
|
||
onRequestClose: onRequestCloseTelemetryModal,
|
||
onShowPrivacyPolicy: onShowPrivacyPolicy
|
||
}) : null, loading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_loader_loader_jsx__WEBPACK_IMPORTED_MODULE_16__["default"], {
|
||
isFullScreen: true
|
||
}) : null, isCreating ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_loader_loader_jsx__WEBPACK_IMPORTED_MODULE_16__["default"], {
|
||
isFullScreen: true,
|
||
messageId: "gui.loader.creating"
|
||
}) : null, Object(_lib_tw_environment_support_prober__WEBPACK_IMPORTED_MODULE_39__["isRendererSupported"])() ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_webgl_modal_jsx__WEBPACK_IMPORTED_MODULE_23__["default"], {
|
||
isRtl: isRtl
|
||
}), Object(_lib_tw_environment_support_prober__WEBPACK_IMPORTED_MODULE_39__["isBrowserSupported"])() ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_browser_modal_browser_modal_jsx__WEBPACK_IMPORTED_MODULE_24__["default"], {
|
||
isRtl: isRtl
|
||
}), tipsLibraryVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_tips_library_jsx__WEBPACK_IMPORTED_MODULE_25__["default"], null) : null, cardsVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_cards_jsx__WEBPACK_IMPORTED_MODULE_26__["default"], null) : null, alertsVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_alerts_jsx__WEBPACK_IMPORTED_MODULE_27__["default"], {
|
||
className: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.alertsContainer
|
||
}) : null, connectionModalVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_connection_modal_jsx__WEBPACK_IMPORTED_MODULE_29__["default"], {
|
||
vm: vm
|
||
}) : null, costumeLibraryVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_costume_library_jsx__WEBPACK_IMPORTED_MODULE_19__["default"], {
|
||
vm: vm,
|
||
onRequestClose: onRequestCloseCostumeLibrary
|
||
}) : null, backdropLibraryVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_backdrop_library_jsx__WEBPACK_IMPORTED_MODULE_20__["default"], {
|
||
vm: vm,
|
||
onRequestClose: onRequestCloseBackdropLibrary
|
||
}) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_menu_bar_menu_bar_jsx__WEBPACK_IMPORTED_MODULE_18__["default"], {
|
||
accountNavOpen: accountNavOpen,
|
||
authorId: authorId,
|
||
authorThumbnailUrl: authorThumbnailUrl,
|
||
authorUsername: authorUsername,
|
||
canChangeLanguage: canChangeLanguage,
|
||
canCreateCopy: canCreateCopy,
|
||
canCreateNew: canCreateNew,
|
||
canEditTitle: canEditTitle,
|
||
canManageFiles: canManageFiles,
|
||
canRemix: canRemix,
|
||
canSave: canSave,
|
||
canShare: canShare,
|
||
className: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.menuBarPosition,
|
||
enableCommunity: enableCommunity,
|
||
isShared: isShared,
|
||
logo: logo,
|
||
renderLogin: renderLogin,
|
||
showComingSoon: showComingSoon,
|
||
onClickAbout: onClickAbout,
|
||
onClickAccountNav: onClickAccountNav,
|
||
onClickAddonSettings: onClickAddonSettings,
|
||
onClickNewWindow: onClickNewWindow,
|
||
onClickTheme: onClickTheme,
|
||
onClickPackager: onClickPackager,
|
||
onClickLogo: onClickLogo,
|
||
onCloseAccountNav: onCloseAccountNav,
|
||
onLogOut: onLogOut,
|
||
onOpenRegistration: onOpenRegistration,
|
||
onProjectTelemetryEvent: onProjectTelemetryEvent,
|
||
onSeeCommunity: onSeeCommunity,
|
||
onShare: onShare,
|
||
onStartSelectingFileUpload: onStartSelectingFileUpload,
|
||
onToggleLoginOpen: onToggleLoginOpen
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_17__["default"], {
|
||
className: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.bodyWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_17__["default"], {
|
||
className: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.flexWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_17__["default"], {
|
||
className: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.editorWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_tabs__WEBPACK_IMPORTED_MODULE_7__["Tabs"], {
|
||
forceRenderTabPanel: true,
|
||
className: tabClassNames.tabs,
|
||
selectedIndex: activeTabIndex,
|
||
selectedTabClassName: tabClassNames.tabSelected,
|
||
selectedTabPanelClassName: tabClassNames.tabPanelSelected,
|
||
onSelect: onActivateTab
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_tabs__WEBPACK_IMPORTED_MODULE_7__["TabList"], {
|
||
className: tabClassNames.tabList
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_tabs__WEBPACK_IMPORTED_MODULE_7__["Tab"], {
|
||
className: tabClassNames.tab
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: _icon_code_svg__WEBPACK_IMPORTED_MODULE_42___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "Code",
|
||
id: "gui.gui.codeTab"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_tabs__WEBPACK_IMPORTED_MODULE_7__["Tab"], {
|
||
className: tabClassNames.tab,
|
||
onClick: onActivateCostumesTab
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: _icon_costumes_svg__WEBPACK_IMPORTED_MODULE_43___default.a
|
||
}), targetIsStage ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "Backdrops",
|
||
id: "gui.gui.backdropsTab"
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "Costumes",
|
||
id: "gui.gui.costumesTab"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_tabs__WEBPACK_IMPORTED_MODULE_7__["Tab"], {
|
||
className: tabClassNames.tab,
|
||
onClick: onActivateSoundsTab
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: _icon_sounds_svg__WEBPACK_IMPORTED_MODULE_44___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "Sounds",
|
||
id: "gui.gui.soundsTab"
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_tabs__WEBPACK_IMPORTED_MODULE_7__["TabPanel"], {
|
||
className: tabClassNames.tabPanel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_17__["default"], {
|
||
className: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.blocksWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_blocks_jsx__WEBPACK_IMPORTED_MODULE_11__["default"], {
|
||
canUseCloud: canUseCloud,
|
||
grow: 1,
|
||
isVisible: blocksTabVisible,
|
||
options: {
|
||
media: "".concat(basePath, "static/blocks-media/")
|
||
},
|
||
stageSize: stageSize,
|
||
vm: vm
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_17__["default"], {
|
||
className: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.extensionButtonContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
|
||
className: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.extensionButton,
|
||
title: intl.formatMessage(messages.addExtension),
|
||
onClick: onExtensionButtonClick
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
className: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.extensionButtonIcon,
|
||
draggable: false,
|
||
src: _icon_extensions_svg__WEBPACK_IMPORTED_MODULE_41___default.a
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_17__["default"], {
|
||
className: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.watermark
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_watermark_jsx__WEBPACK_IMPORTED_MODULE_21__["default"], null))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_tabs__WEBPACK_IMPORTED_MODULE_7__["TabPanel"], {
|
||
className: tabClassNames.tabPanel
|
||
}, costumesTabVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_costume_tab_jsx__WEBPACK_IMPORTED_MODULE_12__["default"], {
|
||
vm: vm,
|
||
isDark: isDark
|
||
}) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_tabs__WEBPACK_IMPORTED_MODULE_7__["TabPanel"], {
|
||
className: tabClassNames.tabPanel
|
||
}, soundsTabVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_sound_tab_jsx__WEBPACK_IMPORTED_MODULE_14__["default"], {
|
||
vm: vm
|
||
}) : null)), backpackVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_backpack_jsx__WEBPACK_IMPORTED_MODULE_22__["default"], {
|
||
host: backpackHost
|
||
}) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_17__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.stageAndTargetWrapper, _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a[stageSize])
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_stage_wrapper_jsx__WEBPACK_IMPORTED_MODULE_15__["default"], {
|
||
isFullScreen: isFullScreen,
|
||
isRendererSupported: Object(_lib_tw_environment_support_prober__WEBPACK_IMPORTED_MODULE_39__["isRendererSupported"])(),
|
||
isRtl: isRtl,
|
||
stageSize: stageSize,
|
||
vm: vm
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_17__["default"], {
|
||
className: _gui_css__WEBPACK_IMPORTED_MODULE_40___default.a.targetWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_target_pane_jsx__WEBPACK_IMPORTED_MODULE_13__["default"], {
|
||
stageSize: stageSize,
|
||
vm: vm
|
||
}))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_drag_layer_jsx__WEBPACK_IMPORTED_MODULE_28__["default"], null));
|
||
});
|
||
};
|
||
|
||
GUIComponent.propTypes = {
|
||
accountNavOpen: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
activeTabIndex: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,
|
||
authorId: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool]),
|
||
// can be false
|
||
authorThumbnailUrl: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
authorUsername: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool]),
|
||
// can be false
|
||
backdropLibraryVisible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
backpackHost: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
backpackVisible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
basePath: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
blocksTabVisible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
canChangeLanguage: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
canCreateCopy: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
canCreateNew: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
canEditTitle: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
canManageFiles: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
canRemix: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
canSave: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
canShare: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
canUseCloud: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
cardsVisible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,
|
||
costumeLibraryVisible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
costumesTabVisible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
customStageSize: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number
|
||
}),
|
||
enableCommunity: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_4__["intlShape"].isRequired,
|
||
isCreating: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isDark: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isEmbedded: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isPlayerOnly: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isShared: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isWindowFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
loading: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
logo: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
onActivateCostumesTab: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onActivateSoundsTab: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onActivateTab: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onClickAccountNav: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onClickAddonSettings: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onClickNewWindow: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onClickTheme: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onClickPackager: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onClickLogo: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onCloseAccountNav: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onExtensionButtonClick: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onLogOut: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onOpenRegistration: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onRequestCloseBackdropLibrary: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onRequestCloseCostumeLibrary: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onRequestCloseTelemetryModal: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onSeeCommunity: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onShare: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onShowPrivacyPolicy: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onStartSelectingFileUpload: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onTabSelect: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onTelemetryModalCancel: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onTelemetryModalOptIn: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onTelemetryModalOptOut: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onToggleLoginOpen: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
renderLogin: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
showComingSoon: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
soundsTabVisible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
stageSizeMode: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(Object.keys(_lib_layout_constants__WEBPACK_IMPORTED_MODULE_37__["STAGE_SIZE_MODES"])),
|
||
targetIsStage: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
telemetryModalVisible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
tipsLibraryVisible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
usernameModalVisible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
settingsModalVisible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
customExtensionModalVisible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
fontsModalVisible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_9___default.a).isRequired
|
||
};
|
||
GUIComponent.defaultProps = {
|
||
backpackHost: null,
|
||
backpackVisible: false,
|
||
basePath: './',
|
||
canChangeLanguage: true,
|
||
canCreateNew: false,
|
||
canEditTitle: false,
|
||
canManageFiles: true,
|
||
canRemix: false,
|
||
canSave: false,
|
||
canCreateCopy: false,
|
||
canShare: false,
|
||
canUseCloud: false,
|
||
enableCommunity: false,
|
||
isCreating: false,
|
||
isShared: false,
|
||
loading: false,
|
||
showComingSoon: false,
|
||
stageSizeMode: _lib_layout_constants__WEBPACK_IMPORTED_MODULE_37__["STAGE_SIZE_MODES"].large
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
customStageSize: state.scratchGui.customStageSize,
|
||
isWindowFullScreen: state.scratchGui.tw.isWindowFullScreen,
|
||
// This is the button's mode, as opposed to the actual current state
|
||
stageSizeMode: state.scratchGui.stageSize.stageSize
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_5__["connect"])(mapStateToProps)(GUIComponent)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/gui/icon--code.svg":
|
||
/*!*******************************************!*\
|
||
!*** ./src/components/gui/icon--code.svg ***!
|
||
\*******************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/5f85a3e5a04dd3de4271589dac82d45b.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/gui/icon--costumes.svg":
|
||
/*!***********************************************!*\
|
||
!*** ./src/components/gui/icon--costumes.svg ***!
|
||
\***********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/afc646fe671f2f43cf0deb3f2247b8bf.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/gui/icon--extensions.svg":
|
||
/*!*************************************************!*\
|
||
!*** ./src/components/gui/icon--extensions.svg ***!
|
||
\*************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/5f4208a6b7257c456c018d57efc8a7e9.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/gui/icon--sounds.svg":
|
||
/*!*********************************************!*\
|
||
!*** ./src/components/gui/icon--sounds.svg ***!
|
||
\*********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/2ede3b1977411d39f0cc8ba0a973e25c.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/icon-button/icon-button.css":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/icon-button/icon-button.css ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./icon-button.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/icon-button/icon-button.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/icon-button/icon-button.jsx":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/icon-button/icon-button.jsx ***!
|
||
\****************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _icon_button_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./icon-button.css */ "./src/components/icon-button/icon-button.css");
|
||
/* harmony import */ var _icon_button_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_icon_button_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
|
||
|
||
|
||
|
||
|
||
const IconButton = ({
|
||
img,
|
||
disabled,
|
||
className,
|
||
title,
|
||
onClick
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_icon_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.container, className, disabled ? _icon_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.disabled : null),
|
||
role: "button",
|
||
onClick: disabled ? null : onClick
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _icon_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.icon,
|
||
draggable: false,
|
||
src: img
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _icon_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.title
|
||
}, title));
|
||
|
||
IconButton.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
disabled: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
img: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.node.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (IconButton);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/language-selector/language-icon.svg":
|
||
/*!************************************************************!*\
|
||
!*** ./src/components/language-selector/language-icon.svg ***!
|
||
\************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/1319094a51748798730f01d1dc0972ac.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/language-selector/language-selector.css":
|
||
/*!****************************************************************!*\
|
||
!*** ./src/components/language-selector/language-selector.css ***!
|
||
\****************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./language-selector.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/language-selector/language-selector.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/language-selector/language-selector.jsx":
|
||
/*!****************************************************************!*\
|
||
!*** ./src/components/language-selector/language-selector.jsx ***!
|
||
\****************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @turbowarp/scratch-l10n */ "./node_modules/@turbowarp/scratch-l10n/src/index.js");
|
||
/* harmony import */ var _language_selector_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./language-selector.css */ "./src/components/language-selector/language-selector.css");
|
||
/* harmony import */ var _language_selector_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_language_selector_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
|
||
|
||
|
||
// supported languages to exclude from the menu, but allow as a URL option
|
||
|
||
const ignore = [];
|
||
|
||
const LanguageSelector = ({
|
||
currentLocale,
|
||
label,
|
||
onChange
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("select", {
|
||
"aria-label": label,
|
||
className: _language_selector_css__WEBPACK_IMPORTED_MODULE_3___default.a.languageSelect,
|
||
value: currentLocale,
|
||
onChange: onChange
|
||
}, Object.keys(_turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_2__["default"]).filter(l => !ignore.includes(l)).map(locale => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("option", {
|
||
key: locale,
|
||
value: locale
|
||
}, _turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_2__["default"][locale].name)));
|
||
|
||
LanguageSelector.propTypes = {
|
||
currentLocale: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
label: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
onChange: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (LanguageSelector);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/library-item/bluetooth.svg":
|
||
/*!***************************************************!*\
|
||
!*** ./src/components/library-item/bluetooth.svg ***!
|
||
\***************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/dfe35552790fb5ff38c78a43f5e62f30.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/library-item/favorite-active.svg":
|
||
/*!*********************************************************!*\
|
||
!*** ./src/components/library-item/favorite-active.svg ***!
|
||
\*********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/754c9f67512f29d9f799744146cc38ee.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/library-item/favorite-inactive.svg":
|
||
/*!***********************************************************!*\
|
||
!*** ./src/components/library-item/favorite-inactive.svg ***!
|
||
\***********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/f626ffd60cbd3c60f33ea09f1ad32092.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/library-item/internet-connection.svg":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/components/library-item/internet-connection.svg ***!
|
||
\*************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/1bb0adb555e07593962e9fc28ec7566d.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/library-item/lib-icon--sound-rtl.svg":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/components/library-item/lib-icon--sound-rtl.svg ***!
|
||
\*************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/582b9f12ce60392a8ef736c5dfabb4ce.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/library-item/lib-icon--sound.svg":
|
||
/*!*********************************************************!*\
|
||
!*** ./src/components/library-item/lib-icon--sound.svg ***!
|
||
\*********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/7bd7487b704797cb5ab3cb441486ea70.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/library-item/library-item.css":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/library-item/library-item.css ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./library-item.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/library-item/library-item.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/library-item/library-item.jsx":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/library-item/library-item.jsx ***!
|
||
\******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _containers_play_button_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../containers/play-button.jsx */ "./src/containers/play-button.jsx");
|
||
/* harmony import */ var _library_item_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./library-item.css */ "./src/components/library-item/library-item.css");
|
||
/* harmony import */ var _library_item_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_library_item_css__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _bluetooth_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./bluetooth.svg */ "./src/components/library-item/bluetooth.svg");
|
||
/* harmony import */ var _bluetooth_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_bluetooth_svg__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _internet_connection_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./internet-connection.svg */ "./src/components/library-item/internet-connection.svg");
|
||
/* harmony import */ var _internet_connection_svg__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_internet_connection_svg__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var _favorite_inactive_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./favorite-inactive.svg */ "./src/components/library-item/favorite-inactive.svg");
|
||
/* harmony import */ var _favorite_inactive_svg__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_favorite_inactive_svg__WEBPACK_IMPORTED_MODULE_9__);
|
||
/* harmony import */ var _favorite_active_svg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./favorite-active.svg */ "./src/components/library-item/favorite-active.svg");
|
||
/* harmony import */ var _favorite_active_svg__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_favorite_active_svg__WEBPACK_IMPORTED_MODULE_10__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["defineMessages"])({
|
||
favorite: {
|
||
"id": "tw.favorite",
|
||
"defaultMessage": "Favorite"
|
||
},
|
||
unfavorite: {
|
||
"id": "tw.unfavorite",
|
||
"defaultMessage": "Unfavorite"
|
||
}
|
||
});
|
||
/* eslint-disable react/prefer-stateless-function */
|
||
|
||
class LibraryItemComponent extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
|
||
render() {
|
||
const favoriteMessage = this.props.intl.formatMessage(this.props.favorite ? messages.unfavorite : messages.favorite);
|
||
const favorite = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(_library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.favoriteContainer, {
|
||
[_library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.active]: this.props.favorite
|
||
}),
|
||
onClick: this.props.onFavorite
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
src: this.props.favorite ? _favorite_active_svg__WEBPACK_IMPORTED_MODULE_10___default.a : _favorite_inactive_svg__WEBPACK_IMPORTED_MODULE_9___default.a,
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.favoriteIcon,
|
||
draggable: false,
|
||
alt: favoriteMessage,
|
||
title: favoriteMessage
|
||
}));
|
||
return this.props.featured ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(_library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.libraryItem, _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.featuredItem, {
|
||
[_library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.disabled]: this.props.disabled
|
||
}, typeof this.props.extensionId === 'string' ? _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.libraryItemExtension : null, this.props.hidden ? _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.hidden : null),
|
||
onClick: this.props.onClick
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.featuredImageContainer
|
||
}, this.props.disabled ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.comingSoonText
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Coming Soon",
|
||
id: "gui.extensionLibrary.comingSoon"
|
||
})) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.featuredImage,
|
||
loading: "lazy",
|
||
draggable: false,
|
||
src: this.props.iconURL
|
||
})), this.props.insetIconURL ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.libraryItemInsetImageContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.libraryItemInsetImage,
|
||
src: this.props.insetIconURL,
|
||
draggable: false
|
||
})) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: typeof this.props.extensionId === 'string' ? classnames__WEBPACK_IMPORTED_MODULE_6___default()(_library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.featuredExtensionText, _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.featuredText) : _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.featuredText
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("span", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.libraryItemName
|
||
}, this.props.name), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("br", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("span", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.featuredDescription
|
||
}, this.props.description)), (this.props.docsURI || this.props.samples) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.extensionLinks
|
||
}, this.props.docsURI && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("a", {
|
||
href: this.props.docsURI,
|
||
target: "_blank",
|
||
rel: "noreferrer"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Documentation" // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.documentation"
|
||
})), this.props.samples && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("a", {
|
||
href: this.props.samples[0].href,
|
||
target: "_blank",
|
||
rel: "noreferrer"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Sample project" // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.sample"
|
||
}))), this.props.credits && this.props.credits.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.extensionLinks
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Created by:",
|
||
id: "tw.createdBy"
|
||
}), ' ', this.props.credits.map((credit, index) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_2___default.a.Fragment, {
|
||
key: index
|
||
}, credit, index !== this.props.credits.length - 1 && ', ')))), this.props.bluetoothRequired || this.props.internetConnectionRequired || this.props.collaborator ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.featuredExtensionMetadata
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.featuredExtensionRequirement
|
||
}, this.props.bluetoothRequired || this.props.internetConnectionRequired ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Requires",
|
||
id: "gui.extensionLibrary.requires"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.featuredExtensionMetadataDetail
|
||
}, this.props.bluetoothRequired ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
src: _bluetooth_svg__WEBPACK_IMPORTED_MODULE_7___default.a,
|
||
draggable: false
|
||
}) : null, this.props.internetConnectionRequired ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
src: _internet_connection_svg__WEBPACK_IMPORTED_MODULE_8___default.a,
|
||
draggable: false
|
||
}) : null)) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.featuredExtensionCollaboration
|
||
}, this.props.collaborator ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Collaboration with",
|
||
id: "gui.extensionLibrary.collaboration"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.featuredExtensionMetadataDetail
|
||
}, this.props.collaborator)) : null)) : null, favorite) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(_library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.libraryItem, {
|
||
[_library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.hidden]: this.props.hidden
|
||
}),
|
||
role: "button",
|
||
tabIndex: "0",
|
||
onBlur: this.props.onBlur,
|
||
onClick: this.props.onClick,
|
||
onFocus: this.props.onFocus,
|
||
onKeyPress: this.props.onKeyPress,
|
||
onMouseEnter: this.props.showPlayButton ? null : this.props.onMouseEnter,
|
||
onMouseLeave: this.props.showPlayButton ? null : this.props.onMouseLeave
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.libraryItemImageContainerWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.libraryItemImageContainer,
|
||
onMouseEnter: this.props.showPlayButton ? this.props.onMouseEnter : null,
|
||
onMouseLeave: this.props.showPlayButton ? this.props.onMouseLeave : null
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.libraryItemImage,
|
||
loading: "lazy",
|
||
src: this.props.iconURL,
|
||
draggable: false
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("span", {
|
||
className: _library_item_css__WEBPACK_IMPORTED_MODULE_5___default.a.libraryItemName
|
||
}, this.props.name), this.props.showPlayButton ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_containers_play_button_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
isPlaying: this.props.isPlaying,
|
||
onPlay: this.props.onPlay,
|
||
onStop: this.props.onStop
|
||
}) : null, favorite);
|
||
}
|
||
|
||
}
|
||
/* eslint-enable react/prefer-stateless-function */
|
||
|
||
|
||
LibraryItemComponent.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_0__["intlShape"],
|
||
bluetoothRequired: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
collaborator: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
description: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node]),
|
||
disabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
extensionId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
featured: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
hidden: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
iconURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
insetIconURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
internetConnectionRequired: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isPlaying: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node]),
|
||
credits: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node])),
|
||
docsURI: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
samples: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
href: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
text: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
})),
|
||
favorite: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onFavorite: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onBlur: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onFocus: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onKeyPress: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onMouseEnter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onMouseLeave: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onPlay: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onStop: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
showPlayButton: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
LibraryItemComponent.defaultProps = {
|
||
disabled: false,
|
||
showPlayButton: false
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (LibraryItemComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/library/library.css":
|
||
/*!********************************************!*\
|
||
!*** ./src/components/library/library.css ***!
|
||
\********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./library.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/library/library.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/library/library.jsx":
|
||
/*!********************************************!*\
|
||
!*** ./src/components/library/library.jsx ***!
|
||
\********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _containers_library_item_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../containers/library-item.jsx */ "./src/containers/library-item.jsx");
|
||
/* harmony import */ var _containers_modal_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../containers/modal.jsx */ "./src/containers/modal.jsx");
|
||
/* harmony import */ var _divider_divider_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../divider/divider.jsx */ "./src/components/divider/divider.jsx");
|
||
/* harmony import */ var _filter_filter_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../filter/filter.jsx */ "./src/components/filter/filter.jsx");
|
||
/* harmony import */ var _containers_tag_button_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../containers/tag-button.jsx */ "./src/containers/tag-button.jsx");
|
||
/* harmony import */ var _spinner_spinner_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../spinner/spinner.jsx */ "./src/components/spinner/spinner.jsx");
|
||
/* harmony import */ var _tw_extension_separator_separator_jsx__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../tw-extension-separator/separator.jsx */ "./src/components/tw-extension-separator/separator.jsx");
|
||
/* harmony import */ var _library_css__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./library.css */ "./src/components/library/library.css");
|
||
/* harmony import */ var _library_css__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_library_css__WEBPACK_IMPORTED_MODULE_12__);
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["defineMessages"])({
|
||
filterPlaceholder: {
|
||
"id": "gui.library.filterPlaceholder",
|
||
"defaultMessage": "Search"
|
||
},
|
||
allTag: {
|
||
"id": "gui.library.allTag",
|
||
"defaultMessage": "All"
|
||
}
|
||
});
|
||
const ALL_TAG = {
|
||
tag: 'all',
|
||
intlLabel: messages.allTag
|
||
};
|
||
const tagListPrefix = [ALL_TAG];
|
||
|
||
class LibraryComponent extends react__WEBPACK_IMPORTED_MODULE_3___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_1___default()(this, ['handleClose', 'handleFilterChange', 'handleFilterClear', 'handleMouseEnter', 'handleMouseLeave', 'handlePlayingEnd', 'handleSelect', 'handleFavorite', 'handleTagClick', 'setFilteredDataRef']);
|
||
const favorites = this.readFavoritesFromStorage();
|
||
this.state = {
|
||
playingItem: null,
|
||
filterQuery: '',
|
||
selectedTag: ALL_TAG.tag,
|
||
loaded: false,
|
||
data: props.data,
|
||
favorites,
|
||
initialFavorites: favorites
|
||
};
|
||
}
|
||
|
||
componentDidMount() {
|
||
if (this.state.data.then) {
|
||
// If data is a promise, wait for the promise to resolve
|
||
this.state.data.then(data => {
|
||
this.setState({
|
||
loaded: true,
|
||
data
|
||
});
|
||
});
|
||
} else {
|
||
// Allow the spinner to display before loading the content
|
||
setTimeout(() => {
|
||
this.setState({
|
||
loaded: true
|
||
});
|
||
});
|
||
}
|
||
|
||
if (this.props.setStopHandler) this.props.setStopHandler(this.handlePlayingEnd);
|
||
}
|
||
|
||
componentWillReceiveProps(nextProps) {
|
||
if (nextProps.data !== this.props.data && Array.isArray(nextProps.data)) {
|
||
this.setState({
|
||
data: nextProps.data
|
||
});
|
||
}
|
||
}
|
||
|
||
componentDidUpdate(prevProps, prevState) {
|
||
if (prevState.filterQuery !== this.state.filterQuery || prevState.selectedTag !== this.state.selectedTag) {
|
||
this.scrollToTop();
|
||
}
|
||
|
||
if (this.state.favorites !== prevState.favorites) {
|
||
try {
|
||
localStorage.setItem(this.getFavoriteStorageKey(), JSON.stringify(this.state.favorites));
|
||
} catch (error) {// ignore
|
||
}
|
||
}
|
||
}
|
||
|
||
handleSelect(id) {
|
||
this.handleClose();
|
||
this.props.onItemSelected(this.getFilteredData()[id]);
|
||
}
|
||
|
||
readFavoritesFromStorage() {
|
||
let data;
|
||
|
||
try {
|
||
data = JSON.parse(localStorage.getItem(this.getFavoriteStorageKey()));
|
||
} catch (error) {// ignore
|
||
}
|
||
|
||
if (!Array.isArray(data)) {
|
||
data = [];
|
||
}
|
||
|
||
return data;
|
||
}
|
||
|
||
getFavoriteStorageKey() {
|
||
return "tw:library-favorites:".concat(this.props.id);
|
||
}
|
||
|
||
handleFavorite(id) {
|
||
const data = this.getFilteredData()[id];
|
||
const key = data[this.props.persistableKey];
|
||
this.setState(oldState => ({
|
||
favorites: oldState.favorites.includes(key) ? oldState.favorites.filter(i => i !== key) : [...oldState.favorites, key]
|
||
}));
|
||
}
|
||
|
||
handleClose() {
|
||
this.props.onRequestClose();
|
||
}
|
||
|
||
handleTagClick(tag) {
|
||
if (this.state.playingItem === null) {
|
||
this.setState({
|
||
filterQuery: '',
|
||
selectedTag: tag.toLowerCase()
|
||
});
|
||
} else {
|
||
this.props.onItemMouseLeave(this.getFilteredData()[[this.state.playingItem]]);
|
||
this.setState({
|
||
filterQuery: '',
|
||
playingItem: null,
|
||
selectedTag: tag.toLowerCase()
|
||
});
|
||
}
|
||
}
|
||
|
||
handleMouseEnter(id) {
|
||
// don't restart if mouse over already playing item
|
||
if (this.props.onItemMouseEnter && this.state.playingItem !== id) {
|
||
this.props.onItemMouseEnter(this.getFilteredData()[id]);
|
||
this.setState({
|
||
playingItem: id
|
||
});
|
||
}
|
||
}
|
||
|
||
handleMouseLeave(id) {
|
||
if (this.props.onItemMouseLeave) {
|
||
this.props.onItemMouseLeave(this.getFilteredData()[id]);
|
||
this.setState({
|
||
playingItem: null
|
||
});
|
||
}
|
||
}
|
||
|
||
handlePlayingEnd() {
|
||
if (this.state.playingItem !== null) {
|
||
this.setState({
|
||
playingItem: null
|
||
});
|
||
}
|
||
}
|
||
|
||
handleFilterChange(event) {
|
||
if (this.state.playingItem === null) {
|
||
this.setState({
|
||
filterQuery: event.target.value,
|
||
selectedTag: ALL_TAG.tag
|
||
});
|
||
} else {
|
||
this.props.onItemMouseLeave(this.getFilteredData()[[this.state.playingItem]]);
|
||
this.setState({
|
||
filterQuery: event.target.value,
|
||
playingItem: null,
|
||
selectedTag: ALL_TAG.tag
|
||
});
|
||
}
|
||
}
|
||
|
||
handleFilterClear() {
|
||
this.setState({
|
||
filterQuery: ''
|
||
});
|
||
}
|
||
|
||
getFilteredData() {
|
||
// When no filtering, favorites get their own section
|
||
if (this.state.selectedTag === 'all' && !this.state.filterQuery) {
|
||
const favoriteItems = this.state.data.filter(dataItem => this.state.initialFavorites.includes(dataItem[this.props.persistableKey])).map(dataItem => _objectSpread(_objectSpread({}, dataItem), {}, {
|
||
key: "favorite-".concat(dataItem[this.props.persistableKey])
|
||
}));
|
||
|
||
if (favoriteItems.length) {
|
||
favoriteItems.push('---');
|
||
}
|
||
|
||
return [...favoriteItems, ...this.state.data];
|
||
} // When filtering, favorites are just listed first, not in a separte section.
|
||
|
||
|
||
const favoriteItems = [];
|
||
const nonFavoriteItems = [];
|
||
|
||
for (const dataItem of this.state.data) {
|
||
if (dataItem === '---') {// ignore
|
||
} else if (this.state.initialFavorites.includes(dataItem[this.props.persistableKey])) {
|
||
favoriteItems.push(dataItem);
|
||
} else {
|
||
nonFavoriteItems.push(dataItem);
|
||
}
|
||
}
|
||
|
||
let filteredItems = favoriteItems.concat(nonFavoriteItems);
|
||
|
||
if (this.state.selectedTag !== 'all') {
|
||
filteredItems = filteredItems.filter(dataItem => dataItem.tags && dataItem.tags.map(i => i.toLowerCase()).includes(this.state.selectedTag));
|
||
}
|
||
|
||
if (this.state.filterQuery) {
|
||
filteredItems = filteredItems.filter(dataItem => {
|
||
const search = [...dataItem.tags];
|
||
|
||
if (dataItem.name) {
|
||
// Use the name if it is a string, else use formatMessage to get the translated name
|
||
if (typeof dataItem.name === 'string') {
|
||
search.push(dataItem.name);
|
||
} else {
|
||
search.push(this.props.intl.formatMessage(dataItem.name.props));
|
||
}
|
||
}
|
||
|
||
if (dataItem.description) {
|
||
search.push(dataItem.description);
|
||
}
|
||
|
||
return search.join('\n').toLowerCase().includes(this.state.filterQuery.toLowerCase());
|
||
});
|
||
}
|
||
|
||
return filteredItems;
|
||
}
|
||
|
||
scrollToTop() {
|
||
this.filteredDataRef.scrollTop = 0;
|
||
}
|
||
|
||
setFilteredDataRef(ref) {
|
||
this.filteredDataRef = ref;
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_modal_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
fullScreen: true,
|
||
contentLabel: this.props.title,
|
||
id: this.props.id,
|
||
onRequestClose: this.handleClose
|
||
}, (this.props.filterable || this.props.tags) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _library_css__WEBPACK_IMPORTED_MODULE_12___default.a.filterBar
|
||
}, this.props.filterable && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_filter_filter_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_library_css__WEBPACK_IMPORTED_MODULE_12___default.a.filterBarItem, _library_css__WEBPACK_IMPORTED_MODULE_12___default.a.filter),
|
||
filterQuery: this.state.filterQuery,
|
||
inputClassName: _library_css__WEBPACK_IMPORTED_MODULE_12___default.a.filterInput,
|
||
placeholderText: this.props.intl.formatMessage(messages.filterPlaceholder),
|
||
onChange: this.handleFilterChange,
|
||
onClear: this.handleFilterClear
|
||
}), this.props.filterable && this.props.tags && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_divider_divider_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_library_css__WEBPACK_IMPORTED_MODULE_12___default.a.filterBarItem, _library_css__WEBPACK_IMPORTED_MODULE_12___default.a.divider)
|
||
}), this.props.tags && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _library_css__WEBPACK_IMPORTED_MODULE_12___default.a.tagWrapper
|
||
}, tagListPrefix.concat(this.props.tags).map((tagProps, id) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_tag_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], _extends({
|
||
active: this.state.selectedTag === tagProps.tag.toLowerCase(),
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_library_css__WEBPACK_IMPORTED_MODULE_12___default.a.filterBarItem, _library_css__WEBPACK_IMPORTED_MODULE_12___default.a.tagButton, tagProps.className),
|
||
key: "tag-button-".concat(id),
|
||
onClick: this.handleTagClick
|
||
}, tagProps))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_library_css__WEBPACK_IMPORTED_MODULE_12___default.a.libraryScrollGrid, {
|
||
[_library_css__WEBPACK_IMPORTED_MODULE_12___default.a.withFilterBar]: this.props.filterable || this.props.tags
|
||
}),
|
||
ref: this.setFilteredDataRef
|
||
}, this.state.loaded ? this.getFilteredData().map((dataItem, index) => dataItem === '---' ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_tw_extension_separator_separator_jsx__WEBPACK_IMPORTED_MODULE_11__["default"], {
|
||
key: index
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_library_item_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
bluetoothRequired: dataItem.bluetoothRequired,
|
||
collaborator: dataItem.collaborator,
|
||
description: dataItem.description,
|
||
disabled: dataItem.disabled,
|
||
extensionId: dataItem.extensionId,
|
||
href: dataItem.href,
|
||
featured: dataItem.featured,
|
||
hidden: dataItem.hidden,
|
||
iconMd5: dataItem.costumes ? dataItem.costumes[0].md5ext : dataItem.md5ext,
|
||
iconRawURL: dataItem.rawURL,
|
||
icons: dataItem.costumes,
|
||
id: index,
|
||
incompatibleWithScratch: dataItem.incompatibleWithScratch,
|
||
favorite: this.state.favorites.includes(dataItem[this.props.persistableKey]),
|
||
onFavorite: this.handleFavorite,
|
||
insetIconURL: dataItem.insetIconURL,
|
||
internetConnectionRequired: dataItem.internetConnectionRequired,
|
||
isPlaying: this.state.playingItem === index,
|
||
key: dataItem.key || (typeof dataItem.name === 'string' ? dataItem.name : dataItem.rawURL),
|
||
name: dataItem.name,
|
||
credits: dataItem.credits,
|
||
samples: dataItem.samples,
|
||
docsURI: dataItem.docsURI,
|
||
showPlayButton: this.props.showPlayButton,
|
||
onMouseEnter: this.handleMouseEnter,
|
||
onMouseLeave: this.handleMouseLeave,
|
||
onSelect: this.handleSelect
|
||
})) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _library_css__WEBPACK_IMPORTED_MODULE_12___default.a.spinnerWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_spinner_spinner_jsx__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
||
large: true,
|
||
level: "primary"
|
||
}))));
|
||
}
|
||
|
||
}
|
||
|
||
LibraryComponent.propTypes = {
|
||
data: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([
|
||
/* eslint-disable react/no-unused-prop-types, lines-around-comment */
|
||
// An item in the library
|
||
prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({
|
||
// @todo remove md5/rawURL prop from library, refactor to use storage
|
||
md5: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node]),
|
||
rawURL: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string
|
||
}), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string
|
||
/* eslint-enable react/no-unused-prop-types, lines-around-comment */
|
||
])), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(Promise)]),
|
||
filterable: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string.isRequired,
|
||
persistableKey: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_4__["intlShape"].isRequired,
|
||
onItemMouseEnter: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onItemMouseLeave: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onItemSelected: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onRequestClose: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
setStopHandler: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
showPlayButton: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
tags: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape(_containers_tag_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"].propTypes)),
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string.isRequired
|
||
};
|
||
LibraryComponent.defaultProps = {
|
||
filterable: true,
|
||
persistableKey: 'name',
|
||
showPlayButton: false
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["injectIntl"])(LibraryComponent));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/loader/bottom-block.svg":
|
||
/*!************************************************!*\
|
||
!*** ./src/components/loader/bottom-block.svg ***!
|
||
\************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/ce5820b006d753e4133f46ae776f4d96.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/loader/loader.css":
|
||
/*!******************************************!*\
|
||
!*** ./src/components/loader/loader.css ***!
|
||
\******************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./loader.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/loader/loader.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/loader/loader.jsx":
|
||
/*!******************************************!*\
|
||
!*** ./src/components/loader/loader.jsx ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _loader_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./loader.css */ "./src/components/loader/loader.css");
|
||
/* harmony import */ var _loader_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_loader_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _top_block_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./top-block.svg */ "./src/components/loader/top-block.svg");
|
||
/* harmony import */ var _top_block_svg__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_top_block_svg__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _middle_block_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./middle-block.svg */ "./src/components/loader/middle-block.svg");
|
||
/* harmony import */ var _middle_block_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_middle_block_svg__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _bottom_block_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./bottom-block.svg */ "./src/components/loader/bottom-block.svg");
|
||
/* harmony import */ var _bottom_block_svg__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_bottom_block_svg__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var _tw_progress_monitor__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./tw-progress-monitor */ "./src/components/loader/tw-progress-monitor.js");
|
||
/* harmony import */ var _lib_isScratchDesktop__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../lib/isScratchDesktop */ "./src/lib/isScratchDesktop.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// tw:
|
||
// we make some rather large changes here:
|
||
// - remove random message, replaced with message dependent on what is actually being loaded
|
||
// - add a progress bar
|
||
// - bring in intl so that we can translate everything
|
||
// The way of doing this is extremely unusual and weird compared to how things are typically done for performance.
|
||
// This is because react updates are too performance crippling to handle the progress bar rapidly updating.
|
||
|
||
const mainMessages = {
|
||
'gui.loader.headline': /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Loading Project",
|
||
id: "gui.loader.headline"
|
||
}),
|
||
'gui.loader.creating': /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Creating Project",
|
||
id: "gui.loader.creating"
|
||
})
|
||
};
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_1__["defineMessages"])({
|
||
generic: {
|
||
"id": "tw.loader.generic",
|
||
"defaultMessage": "Loading project \u2026"
|
||
},
|
||
projectData: {
|
||
"id": "tw.loader.data",
|
||
"defaultMessage": "Downloading project data \u2026"
|
||
},
|
||
assetsKnown: {
|
||
"id": "tw.loader.assets.known",
|
||
"defaultMessage": "Downloading assets ({complete}/{total}) \u2026"
|
||
},
|
||
assetsUnknown: {
|
||
"id": "tw.loader.assets.unknown",
|
||
"defaultMessage": "Downloading assets \u2026"
|
||
}
|
||
});
|
||
|
||
class LoaderComponent extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
this._state = 0;
|
||
this.progress = 0;
|
||
this.complete = 0;
|
||
this.total = 0;
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_5___default()(this, ['barInnerRef', 'handleProgressChange', 'messageRef']);
|
||
}
|
||
|
||
componentDidMount() {
|
||
if (!Object(_lib_isScratchDesktop__WEBPACK_IMPORTED_MODULE_10__["default"])()) {
|
||
_tw_progress_monitor__WEBPACK_IMPORTED_MODULE_9__["setProgressHandler"](this.handleProgressChange);
|
||
}
|
||
|
||
this.updateMessage();
|
||
}
|
||
|
||
componentDidUpdate() {
|
||
this.update();
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
_tw_progress_monitor__WEBPACK_IMPORTED_MODULE_9__["setProgressHandler"](() => {});
|
||
}
|
||
|
||
handleProgressChange(state, progress, complete, total) {
|
||
if (state !== this._state) {
|
||
this._state = state;
|
||
this.updateMessage();
|
||
}
|
||
|
||
this.progress = progress;
|
||
this.complete = complete;
|
||
this.total = total;
|
||
this.update();
|
||
}
|
||
|
||
update() {
|
||
if (this.barInner) {
|
||
this.barInner.style.width = "".concat(this.progress * 100, "%");
|
||
}
|
||
|
||
if (this._state === 2) {
|
||
this.updateMessage();
|
||
}
|
||
}
|
||
|
||
updateMessage() {
|
||
if (this._state === 0) {
|
||
this.message.textContent = this.props.intl.formatMessage(messages.generic);
|
||
} else if (this._state === 1) {
|
||
this.message.textContent = this.props.intl.formatMessage(messages.projectData);
|
||
} else if (this.total > 0) {
|
||
this.message.textContent = this.props.intl.formatMessage(messages.assetsKnown, {
|
||
complete: this.complete,
|
||
total: this.total
|
||
});
|
||
} else {
|
||
this.message.textContent = this.props.intl.formatMessage(messages.assetsUnknown);
|
||
}
|
||
}
|
||
|
||
barInnerRef(element) {
|
||
this.barInner = element;
|
||
}
|
||
|
||
messageRef(element) {
|
||
this.message = element;
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_loader_css__WEBPACK_IMPORTED_MODULE_3___default.a.background, {
|
||
[_loader_css__WEBPACK_IMPORTED_MODULE_3___default.a.fullscreen]: this.props.isFullScreen
|
||
})
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _loader_css__WEBPACK_IMPORTED_MODULE_3___default.a.container
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _loader_css__WEBPACK_IMPORTED_MODULE_3___default.a.blockAnimation
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {
|
||
className: _loader_css__WEBPACK_IMPORTED_MODULE_3___default.a.topBlock,
|
||
src: _top_block_svg__WEBPACK_IMPORTED_MODULE_6___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {
|
||
className: _loader_css__WEBPACK_IMPORTED_MODULE_3___default.a.middleBlock,
|
||
src: _middle_block_svg__WEBPACK_IMPORTED_MODULE_7___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {
|
||
className: _loader_css__WEBPACK_IMPORTED_MODULE_3___default.a.bottomBlock,
|
||
src: _bottom_block_svg__WEBPACK_IMPORTED_MODULE_8___default.a
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _loader_css__WEBPACK_IMPORTED_MODULE_3___default.a.title
|
||
}, mainMessages[this.props.messageId]), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _loader_css__WEBPACK_IMPORTED_MODULE_3___default.a.messageContainerOuter
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _loader_css__WEBPACK_IMPORTED_MODULE_3___default.a.messageContainerInner,
|
||
ref: this.messageRef
|
||
})), !Object(_lib_isScratchDesktop__WEBPACK_IMPORTED_MODULE_10__["default"])() && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _loader_css__WEBPACK_IMPORTED_MODULE_3___default.a.twProgressOuter
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _loader_css__WEBPACK_IMPORTED_MODULE_3___default.a.twProgressInner,
|
||
ref: this.barInnerRef
|
||
}))));
|
||
}
|
||
|
||
}
|
||
|
||
LoaderComponent.propTypes = {
|
||
isFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_1__["intlShape"].isRequired,
|
||
messageId: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string
|
||
};
|
||
LoaderComponent.defaultProps = {
|
||
isFullScreen: false,
|
||
messageId: 'gui.loader.headline'
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_1__["injectIntl"])(LoaderComponent));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/loader/middle-block.svg":
|
||
/*!************************************************!*\
|
||
!*** ./src/components/loader/middle-block.svg ***!
|
||
\************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/f9dce53613d5f85b311ce9f84423c08b.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/loader/top-block.svg":
|
||
/*!*********************************************!*\
|
||
!*** ./src/components/loader/top-block.svg ***!
|
||
\*********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/bbbd98ae6a34eac772e34a57aaa5f977.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/loader/tw-progress-monitor.js":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/loader/tw-progress-monitor.js ***!
|
||
\******************************************************/
|
||
/*! exports provided: setProgressHandler, fetchWithProgress */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setProgressHandler", function() { return setProgressHandler; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchWithProgress", function() { return fetchWithProgress; });
|
||
// This file implements some extremely terrible tricks to monitor project loading progress.
|
||
// Please don't use this as a reference for "good JS code"
|
||
let total = 0;
|
||
let complete = 0; // 0 - none
|
||
// 1 - load json
|
||
// 2 - load assets
|
||
|
||
let state = 0;
|
||
let currentProgress = 0;
|
||
|
||
let progressHandler = (state, progress, complete, total) => {};
|
||
|
||
const setProgressHandler = newHandler => {
|
||
progressHandler = newHandler;
|
||
progressHandler(state, currentProgress, complete, total);
|
||
};
|
||
let progressHandlerTimeout = null;
|
||
|
||
const fireProgressHandler = () => {
|
||
progressHandler(state, currentProgress, complete, total);
|
||
progressHandlerTimeout = null;
|
||
};
|
||
|
||
const queueProgressHandlerUpdate = () => {
|
||
if (progressHandlerTimeout === null) {
|
||
progressHandlerTimeout = requestAnimationFrame(fireProgressHandler);
|
||
}
|
||
};
|
||
|
||
const setProgress = progress => {
|
||
if (progress < 0) {
|
||
progress = 0;
|
||
}
|
||
|
||
if (progress > 1) {
|
||
progress = 1;
|
||
}
|
||
|
||
currentProgress = progress;
|
||
queueProgressHandlerUpdate();
|
||
};
|
||
|
||
const setState = newState => {
|
||
if (state === newState) {
|
||
return;
|
||
}
|
||
|
||
state = newState;
|
||
complete = 0;
|
||
total = 0;
|
||
setProgress(0);
|
||
};
|
||
|
||
const fetchWithProgress = url => {
|
||
setState(1);
|
||
return new Promise((resolve, reject) => {
|
||
// fetch() does not support progress, so we use XMLHttpRequest
|
||
const xhr = new XMLHttpRequest();
|
||
xhr.responseType = 'blob';
|
||
|
||
xhr.onload = () => {
|
||
resolve(new Response(xhr.response, {
|
||
status: xhr.status,
|
||
statusText: xhr.statusText
|
||
}));
|
||
};
|
||
|
||
xhr.onloadend = () => setProgress(1);
|
||
|
||
xhr.onerror = () => reject(new Error('[tw-progress-monitor] xhr failed'));
|
||
|
||
xhr.onprogress = e => {
|
||
if (e.lengthComputable) {
|
||
setProgress(e.loaded / e.total);
|
||
}
|
||
};
|
||
|
||
xhr.open('GET', url);
|
||
xhr.send();
|
||
});
|
||
}; // Scratch uses fetch() to download the project JSON, so we override it to monitor when the project is being downloaded.
|
||
|
||
const originalFetch = window.fetch;
|
||
|
||
window.fetch = (url, opts) => {
|
||
const isGET = typeof opts === 'object' && opts && opts.method === 'GET';
|
||
const isProjectURL = typeof url === 'string' && /^https:\/\/projects\.scratch\.mit\.edu\/\d+$/.test(url);
|
||
|
||
if (isGET && isProjectURL) {
|
||
return fetchWithProgress(url);
|
||
}
|
||
|
||
return originalFetch(url, opts);
|
||
};
|
||
|
||
const handleWorkerMessage = e => {
|
||
const data = e.data;
|
||
|
||
if (Array.isArray(data)) {
|
||
complete += data.length;
|
||
setProgress(complete / total);
|
||
}
|
||
};
|
||
|
||
if (window.Worker) {
|
||
let downloadWorker = null;
|
||
const originalPostMessage = window.Worker.prototype.postMessage;
|
||
|
||
window.Worker.prototype.postMessage = function (message) {
|
||
if (downloadWorker === null) {
|
||
if (message && message.url && message.id && message.options) {
|
||
downloadWorker = this;
|
||
downloadWorker.addEventListener('message', handleWorkerMessage);
|
||
}
|
||
}
|
||
|
||
if (downloadWorker === this) {
|
||
setState(2);
|
||
total++;
|
||
}
|
||
|
||
originalPostMessage.call(this, message);
|
||
};
|
||
}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/loupe/loupe.css":
|
||
/*!****************************************!*\
|
||
!*** ./src/components/loupe/loupe.css ***!
|
||
\****************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./loupe.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/loupe/loupe.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/loupe/loupe.jsx":
|
||
/*!****************************************!*\
|
||
!*** ./src/components/loupe/loupe.jsx ***!
|
||
\****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _loupe_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./loupe.css */ "./src/components/loupe/loupe.css");
|
||
/* harmony import */ var _loupe_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_loupe_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
const _excluded = ["colorInfo"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const zoomScale = 3;
|
||
|
||
class LoupeComponent extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['setCanvas']);
|
||
}
|
||
|
||
componentDidUpdate() {
|
||
this.draw();
|
||
}
|
||
|
||
draw() {
|
||
const boxSize = 6 / zoomScale;
|
||
const boxLineWidth = 1 / zoomScale;
|
||
const colorRingWidth = 15 / zoomScale;
|
||
const ctx = this.canvas.getContext('2d');
|
||
const {
|
||
color,
|
||
data,
|
||
width,
|
||
height
|
||
} = this.props.colorInfo;
|
||
this.canvas.width = zoomScale * width;
|
||
this.canvas.height = zoomScale * height; // In order to scale the image data, must draw to a tmp canvas first
|
||
|
||
const tmpCanvas = document.createElement('canvas');
|
||
tmpCanvas.width = width;
|
||
tmpCanvas.height = height;
|
||
const tmpCtx = tmpCanvas.getContext('2d');
|
||
const imageData = tmpCtx.createImageData(width, height);
|
||
imageData.data.set(data);
|
||
tmpCtx.putImageData(imageData, 0, 0); // Scale the loupe canvas and draw the zoomed image
|
||
|
||
ctx.save();
|
||
ctx.scale(zoomScale, zoomScale);
|
||
ctx.drawImage(tmpCanvas, 0, 0, width, height); // Draw an outlined square at the cursor position (cursor is hidden)
|
||
|
||
ctx.lineWidth = boxLineWidth;
|
||
ctx.strokeStyle = 'black';
|
||
ctx.fillStyle = "rgba(".concat(color.r, ", ").concat(color.g, ", ").concat(color.b, ", ").concat(color.a, ")");
|
||
ctx.beginPath();
|
||
ctx.rect(width / 2 - boxSize / 2, height / 2 - boxSize / 2, boxSize, boxSize);
|
||
ctx.fill();
|
||
ctx.stroke(); // Draw a thick ring around the loupe showing the current color
|
||
|
||
ctx.strokeStyle = "rgba(".concat(color.r, ", ").concat(color.g, ", ").concat(color.b, ", ").concat(color.a, ")");
|
||
ctx.lineWidth = colorRingWidth;
|
||
ctx.beginPath();
|
||
ctx.moveTo(width, height / 2);
|
||
ctx.arc(width / 2, height / 2, width / 2, 0, 2 * Math.PI);
|
||
ctx.stroke();
|
||
ctx.restore();
|
||
}
|
||
|
||
setCanvas(element) {
|
||
this.canvas = element;
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
colorInfo
|
||
} = _this$props,
|
||
boxProps = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
const x = colorInfo.x - zoomScale * colorInfo.width / 2;
|
||
const y = colorInfo.y - zoomScale * colorInfo.height / 2;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({}, boxProps, {
|
||
className: _loupe_css__WEBPACK_IMPORTED_MODULE_4___default.a.colorPicker,
|
||
componentRef: this.setCanvas,
|
||
element: "canvas",
|
||
height: colorInfo.height,
|
||
style: {
|
||
transform: "translate(".concat(x, "px, ").concat(y, "px)"),
|
||
width: colorInfo.width * zoomScale,
|
||
height: colorInfo.height * zoomScale
|
||
},
|
||
width: colorInfo.width
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
LoupeComponent.propTypes = {
|
||
colorInfo: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
color: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
r: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
g: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
b: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
a: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
}),
|
||
data: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(Uint8Array),
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
x: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
y: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
})
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (LoupeComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/author-info.css":
|
||
/*!*************************************************!*\
|
||
!*** ./src/components/menu-bar/author-info.css ***!
|
||
\*************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./author-info.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/author-info.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/author-info.jsx":
|
||
/*!*************************************************!*\
|
||
!*** ./src/components/menu-bar/author-info.jsx ***!
|
||
\*************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _user_avatar_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./user-avatar.jsx */ "./src/components/menu-bar/user-avatar.jsx");
|
||
/* harmony import */ var _author_info_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./author-info.css */ "./src/components/menu-bar/author-info.css");
|
||
/* harmony import */ var _author_info_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_author_info_css__WEBPACK_IMPORTED_MODULE_5__);
|
||
const _excluded = ["projectId"];
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const ActualAuthorInfo = ({
|
||
className,
|
||
imageUrl,
|
||
projectTitle,
|
||
// TODO: use userId to link to user's profile
|
||
userId,
|
||
// eslint-disable-line no-unused-vars
|
||
username
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(className, _author_info_css__WEBPACK_IMPORTED_MODULE_5___default.a.authorInfo)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_user_avatar_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _author_info_css__WEBPACK_IMPORTED_MODULE_5___default.a.avatar,
|
||
imageUrl: imageUrl
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _author_info_css__WEBPACK_IMPORTED_MODULE_5___default.a.titleAuthor
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("h1", {
|
||
className: _author_info_css__WEBPACK_IMPORTED_MODULE_5___default.a.projectTitle
|
||
}, projectTitle), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
|
||
className: _author_info_css__WEBPACK_IMPORTED_MODULE_5___default.a.usernameLine
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "by {username}",
|
||
id: "gui.authorInfo.byUser",
|
||
values: {
|
||
username: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
|
||
className: _author_info_css__WEBPACK_IMPORTED_MODULE_5___default.a.username
|
||
}, username)
|
||
}
|
||
})))));
|
||
|
||
ActualAuthorInfo.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
imageUrl: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
projectTitle: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
userId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool]),
|
||
username: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool])
|
||
};
|
||
|
||
const AuthorInfo = _ref => {
|
||
let {
|
||
projectId
|
||
} = _ref,
|
||
props = _objectWithoutProperties(_ref, _excluded);
|
||
|
||
return projectId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("a", {
|
||
className: _author_info_css__WEBPACK_IMPORTED_MODULE_5___default.a.link,
|
||
href: "https://scratch.mit.edu/projects/".concat(projectId),
|
||
target: "_blank",
|
||
rel: "noreferrer"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(ActualAuthorInfo, props)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(ActualAuthorInfo, props);
|
||
};
|
||
|
||
AuthorInfo.propTypes = {
|
||
projectId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (AuthorInfo);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/community-button.css":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/menu-bar/community-button.css ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./community-button.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/community-button.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/community-button.jsx":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/menu-bar/community-button.jsx ***!
|
||
\******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _button_button_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../button/button.jsx */ "./src/components/button/button.jsx");
|
||
/* harmony import */ var _icon_see_community_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./icon--see-community.svg */ "./src/components/menu-bar/icon--see-community.svg");
|
||
/* harmony import */ var _icon_see_community_svg__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_icon_see_community_svg__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _community_button_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./community-button.css */ "./src/components/menu-bar/community-button.css");
|
||
/* harmony import */ var _community_button_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_community_button_css__WEBPACK_IMPORTED_MODULE_6__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const CommunityButton = ({
|
||
className,
|
||
onClick
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(className, _community_button_css__WEBPACK_IMPORTED_MODULE_6___default.a.communityButton),
|
||
iconClassName: _community_button_css__WEBPACK_IMPORTED_MODULE_6___default.a.communityButtonIcon,
|
||
iconSrc: _icon_see_community_svg__WEBPACK_IMPORTED_MODULE_5___default.a,
|
||
onClick: onClick
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "See Project Page",
|
||
id: "gui.menuBar.seeProjectPage"
|
||
}));
|
||
|
||
CommunityButton.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func
|
||
};
|
||
CommunityButton.defaultProps = {
|
||
onClick: () => {}
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (CommunityButton);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/dropdown-caret.svg":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/menu-bar/dropdown-caret.svg ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/664d94e5cb8676c780c74c695f2e972c.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/icon--about.svg":
|
||
/*!*************************************************!*\
|
||
!*** ./src/components/menu-bar/icon--about.svg ***!
|
||
\*************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/5dbf111a76a93a93613ec81c16dfc6d3.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/icon--mystuff.png":
|
||
/*!***************************************************!*\
|
||
!*** ./src/components/menu-bar/icon--mystuff.png ***!
|
||
\***************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/e764d9d9a7a12892e0845b11cd4202df.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/icon--profile.png":
|
||
/*!***************************************************!*\
|
||
!*** ./src/components/menu-bar/icon--profile.png ***!
|
||
\***************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/52797b48d511ecdd8e938684cee7638e.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/icon--remix.svg":
|
||
/*!*************************************************!*\
|
||
!*** ./src/components/menu-bar/icon--remix.svg ***!
|
||
\*************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/f8ff5dbef05bc3337cd3660fb956cffa.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/icon--see-community.svg":
|
||
/*!*********************************************************!*\
|
||
!*** ./src/components/menu-bar/icon--see-community.svg ***!
|
||
\*********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/2f9cda00a530ac237fc24063067377c3.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/menu-bar-menu.jsx":
|
||
/*!***************************************************!*\
|
||
!*** ./src/components/menu-bar/menu-bar-menu.jsx ***!
|
||
\***************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _containers_menu_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../containers/menu.jsx */ "./src/containers/menu.jsx");
|
||
|
||
|
||
|
||
|
||
const MenuBarMenu = ({
|
||
children,
|
||
className,
|
||
onRequestClose,
|
||
open,
|
||
place = 'right'
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: className
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_menu_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
||
open: open,
|
||
place: place,
|
||
onRequestClose: onRequestClose
|
||
}, children));
|
||
|
||
MenuBarMenu.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.node,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
onRequestClose: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
open: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
place: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf(['left', 'right'])
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (MenuBarMenu);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/menu-bar.css":
|
||
/*!**********************************************!*\
|
||
!*** ./src/components/menu-bar/menu-bar.css ***!
|
||
\**********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./menu-bar.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/menu-bar.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/menu-bar.jsx":
|
||
/*!**********************************************!*\
|
||
!*** ./src/components/menu-bar/menu-bar.jsx ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! redux */ "./node_modules/redux/es/index.js");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var bowser__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! bowser */ "./node_modules/bowser/src/bowser.js");
|
||
/* harmony import */ var bowser__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(bowser__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _button_button_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../button/button.jsx */ "./src/components/button/button.jsx");
|
||
/* harmony import */ var _community_button_jsx__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./community-button.jsx */ "./src/components/menu-bar/community-button.jsx");
|
||
/* harmony import */ var _share_button_jsx__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./share-button.jsx */ "./src/components/menu-bar/share-button.jsx");
|
||
/* harmony import */ var _coming_soon_coming_soon_jsx__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../coming-soon/coming-soon.jsx */ "./src/components/coming-soon/coming-soon.jsx");
|
||
/* harmony import */ var _divider_divider_jsx__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../divider/divider.jsx */ "./src/components/divider/divider.jsx");
|
||
/* harmony import */ var _containers_language_selector_jsx__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../containers/language-selector.jsx */ "./src/containers/language-selector.jsx");
|
||
/* harmony import */ var _containers_project_watcher_jsx__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../containers/project-watcher.jsx */ "./src/containers/project-watcher.jsx");
|
||
/* harmony import */ var _menu_bar_menu_jsx__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./menu-bar-menu.jsx */ "./src/components/menu-bar/menu-bar-menu.jsx");
|
||
/* harmony import */ var _menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../menu/menu.jsx */ "./src/components/menu/menu.jsx");
|
||
/* harmony import */ var _project_title_input_jsx__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./project-title-input.jsx */ "./src/components/menu-bar/project-title-input.jsx");
|
||
/* harmony import */ var _author_info_jsx__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./author-info.jsx */ "./src/components/menu-bar/author-info.jsx");
|
||
/* harmony import */ var _containers_sb3_downloader_jsx__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../containers/sb3-downloader.jsx */ "./src/containers/sb3-downloader.jsx");
|
||
/* harmony import */ var _containers_deletion_restorer_jsx__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../containers/deletion-restorer.jsx */ "./src/containers/deletion-restorer.jsx");
|
||
/* harmony import */ var _containers_turbo_mode_jsx__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../containers/turbo-mode.jsx */ "./src/containers/turbo-mode.jsx");
|
||
/* harmony import */ var _containers_menu_bar_hoc_jsx__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../../containers/menu-bar-hoc.jsx */ "./src/containers/menu-bar-hoc.jsx");
|
||
/* harmony import */ var _containers_tw_framerate_changer_jsx__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../../containers/tw-framerate-changer.jsx */ "./src/containers/tw-framerate-changer.jsx");
|
||
/* harmony import */ var _containers_tw_change_username_jsx__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../containers/tw-change-username.jsx */ "./src/containers/tw-change-username.jsx");
|
||
/* harmony import */ var _containers_tw_cloud_toggler_jsx__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../containers/tw-cloud-toggler.jsx */ "./src/containers/tw-cloud-toggler.jsx");
|
||
/* harmony import */ var _tw_save_status_jsx__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./tw-save-status.jsx */ "./src/components/menu-bar/tw-save-status.jsx");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _reducers_mode__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../../reducers/mode */ "./src/reducers/mode.js");
|
||
/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../../reducers/project-state */ "./src/reducers/project-state.js");
|
||
/* harmony import */ var _reducers_menus__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../../reducers/menus */ "./src/reducers/menus.js");
|
||
/* harmony import */ var _reducers_tw_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../../reducers/tw.js */ "./src/reducers/tw.js");
|
||
/* harmony import */ var _lib_collect_metadata__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../../lib/collect-metadata */ "./src/lib/collect-metadata.js");
|
||
/* harmony import */ var _menu_bar_css__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./menu-bar.css */ "./src/components/menu-bar/menu-bar.css");
|
||
/* harmony import */ var _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default = /*#__PURE__*/__webpack_require__.n(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35__);
|
||
/* harmony import */ var _lib_assets_icon_tutorials_svg__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../../lib/assets/icon--tutorials.svg */ "./src/lib/assets/icon--tutorials.svg");
|
||
/* harmony import */ var _lib_assets_icon_tutorials_svg__WEBPACK_IMPORTED_MODULE_36___default = /*#__PURE__*/__webpack_require__.n(_lib_assets_icon_tutorials_svg__WEBPACK_IMPORTED_MODULE_36__);
|
||
/* harmony import */ var _icon_mystuff_png__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./icon--mystuff.png */ "./src/components/menu-bar/icon--mystuff.png");
|
||
/* harmony import */ var _icon_mystuff_png__WEBPACK_IMPORTED_MODULE_37___default = /*#__PURE__*/__webpack_require__.n(_icon_mystuff_png__WEBPACK_IMPORTED_MODULE_37__);
|
||
/* harmony import */ var _icon_profile_png__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./icon--profile.png */ "./src/components/menu-bar/icon--profile.png");
|
||
/* harmony import */ var _icon_profile_png__WEBPACK_IMPORTED_MODULE_38___default = /*#__PURE__*/__webpack_require__.n(_icon_profile_png__WEBPACK_IMPORTED_MODULE_38__);
|
||
/* harmony import */ var _icon_remix_svg__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./icon--remix.svg */ "./src/components/menu-bar/icon--remix.svg");
|
||
/* harmony import */ var _icon_remix_svg__WEBPACK_IMPORTED_MODULE_39___default = /*#__PURE__*/__webpack_require__.n(_icon_remix_svg__WEBPACK_IMPORTED_MODULE_39__);
|
||
/* harmony import */ var _dropdown_caret_svg__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./dropdown-caret.svg */ "./src/components/menu-bar/dropdown-caret.svg");
|
||
/* harmony import */ var _dropdown_caret_svg__WEBPACK_IMPORTED_MODULE_40___default = /*#__PURE__*/__webpack_require__.n(_dropdown_caret_svg__WEBPACK_IMPORTED_MODULE_40__);
|
||
/* harmony import */ var _language_selector_language_icon_svg__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../language-selector/language-icon.svg */ "./src/components/language-selector/language-icon.svg");
|
||
/* harmony import */ var _language_selector_language_icon_svg__WEBPACK_IMPORTED_MODULE_41___default = /*#__PURE__*/__webpack_require__.n(_language_selector_language_icon_svg__WEBPACK_IMPORTED_MODULE_41__);
|
||
/* harmony import */ var _icon_about_svg__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./icon--about.svg */ "./src/components/menu-bar/icon--about.svg");
|
||
/* harmony import */ var _icon_about_svg__WEBPACK_IMPORTED_MODULE_42___default = /*#__PURE__*/__webpack_require__.n(_icon_about_svg__WEBPACK_IMPORTED_MODULE_42__);
|
||
/* harmony import */ var _tw_error_svg__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./tw-error.svg */ "./src/components/menu-bar/tw-error.svg");
|
||
/* harmony import */ var _tw_error_svg__WEBPACK_IMPORTED_MODULE_43___default = /*#__PURE__*/__webpack_require__.n(_tw_error_svg__WEBPACK_IMPORTED_MODULE_43__);
|
||
/* harmony import */ var _tw_moon_svg__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./tw-moon.svg */ "./src/components/menu-bar/tw-moon.svg");
|
||
/* harmony import */ var _tw_moon_svg__WEBPACK_IMPORTED_MODULE_44___default = /*#__PURE__*/__webpack_require__.n(_tw_moon_svg__WEBPACK_IMPORTED_MODULE_44__);
|
||
/* harmony import */ var _scratch_logo_svg__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./scratch-logo.svg */ "./src/components/menu-bar/scratch-logo.svg");
|
||
/* harmony import */ var _scratch_logo_svg__WEBPACK_IMPORTED_MODULE_45___default = /*#__PURE__*/__webpack_require__.n(_scratch_logo_svg__WEBPACK_IMPORTED_MODULE_45__);
|
||
/* harmony import */ var _lib_shared_messages__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../../lib/shared-messages */ "./src/lib/shared-messages.js");
|
||
/* harmony import */ var _tw_see_inside_jsx__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./tw-see-inside.jsx */ "./src/components/menu-bar/tw-see-inside.jsx");
|
||
/* harmony import */ var _lib_isScratchDesktop_js__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ../../lib/isScratchDesktop.js */ "./src/lib/isScratchDesktop.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const ariaMessages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
language: {
|
||
"id": "gui.menuBar.LanguageSelector",
|
||
"defaultMessage": "language selector"
|
||
},
|
||
tutorials: {
|
||
"id": "gui.menuBar.tutorialsLibrary",
|
||
"defaultMessage": "Tutorials"
|
||
}
|
||
});
|
||
const twMessages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
compileError: {
|
||
"id": "tw.menuBar.compileError",
|
||
"defaultMessage": "{sprite}: {error}"
|
||
}
|
||
});
|
||
|
||
const MenuBarItemTooltip = ({
|
||
children,
|
||
className,
|
||
enable,
|
||
id,
|
||
place = 'bottom'
|
||
}) => {
|
||
if (enable) {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_7___default.a.Fragment, null, children);
|
||
}
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_coming_soon_coming_soon_jsx__WEBPACK_IMPORTED_MODULE_13__["ComingSoonTooltip"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.comingSoon, className),
|
||
place: place,
|
||
tooltipClassName: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.comingSoonTooltip,
|
||
tooltipId: id
|
||
}, children);
|
||
};
|
||
|
||
MenuBarItemTooltip.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
enable: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
place: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['top', 'bottom', 'left', 'right'])
|
||
};
|
||
|
||
const MenuItemTooltip = ({
|
||
id,
|
||
isRtl,
|
||
children,
|
||
className
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_coming_soon_coming_soon_jsx__WEBPACK_IMPORTED_MODULE_13__["ComingSoonTooltip"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.comingSoon, className),
|
||
isRtl: isRtl,
|
||
place: isRtl ? 'left' : 'right',
|
||
tooltipClassName: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.comingSoonTooltip,
|
||
tooltipId: id
|
||
}, children);
|
||
|
||
MenuItemTooltip.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool
|
||
};
|
||
|
||
const AboutButton = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem, _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.hoverable),
|
||
iconClassName: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.aboutIcon,
|
||
iconSrc: _icon_about_svg__WEBPACK_IMPORTED_MODULE_42___default.a,
|
||
onClick: props.onClick
|
||
});
|
||
|
||
AboutButton.propTypes = {
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func.isRequired
|
||
}; // Unlike <MenuItem href="">, this uses an actual <a>
|
||
|
||
const MenuItemLink = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("a", {
|
||
href: props.href // _blank is safe because of noopener
|
||
// eslint-disable-next-line react/jsx-no-target-blank
|
||
,
|
||
target: "_blank",
|
||
rel: "noopener",
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuItemLink
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], null, props.children));
|
||
|
||
MenuItemLink.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node.isRequired,
|
||
href: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string.isRequired
|
||
};
|
||
|
||
class MenuBar extends react__WEBPACK_IMPORTED_MODULE_7___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_5___default()(this, ['handleClickSeeInside', 'handleClickNew', 'handleClickNewWindow', 'handleClickRemix', 'handleClickSave', 'handleClickSaveAsCopy', 'handleClickPackager', 'handleClickRestorePoints', 'handleClickSeeCommunity', 'handleClickShare', 'handleKeyPress', 'handleLanguageMouseUp', 'handleRestoreOption', 'getSaveToComputerHandler', 'restoreOptionMessage']);
|
||
}
|
||
|
||
componentDidMount() {
|
||
document.addEventListener('keydown', this.handleKeyPress);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
document.removeEventListener('keydown', this.handleKeyPress);
|
||
}
|
||
|
||
handleClickNew() {
|
||
// if the project is dirty, and user owns the project, we will autosave.
|
||
// but if they are not logged in and can't save, user should consider
|
||
// downloading or logging in first.
|
||
// Note that if user is logged in and editing someone else's project,
|
||
// they'll lose their work.
|
||
const readyToReplaceProject = this.props.confirmReadyToReplaceProject(this.props.intl.formatMessage(_lib_shared_messages__WEBPACK_IMPORTED_MODULE_46__["default"].replaceProjectWarning));
|
||
this.props.onRequestCloseFile();
|
||
|
||
if (readyToReplaceProject) {
|
||
this.props.onClickNew(this.props.canSave && this.props.canCreateNew);
|
||
}
|
||
|
||
this.props.onRequestCloseFile();
|
||
}
|
||
|
||
handleClickNewWindow() {
|
||
this.props.onClickNewWindow();
|
||
this.props.onRequestCloseFile();
|
||
}
|
||
|
||
handleClickRemix() {
|
||
this.props.onClickRemix();
|
||
this.props.onRequestCloseFile();
|
||
}
|
||
|
||
handleClickSave() {
|
||
this.props.onClickSave();
|
||
this.props.onRequestCloseFile();
|
||
}
|
||
|
||
handleClickSaveAsCopy() {
|
||
this.props.onClickSaveAsCopy();
|
||
this.props.onRequestCloseFile();
|
||
}
|
||
|
||
handleClickPackager() {
|
||
this.props.onClickPackager();
|
||
this.props.onRequestCloseFile();
|
||
}
|
||
|
||
handleClickRestorePoints() {
|
||
this.props.onClickRestorePoints();
|
||
this.props.onRequestCloseFile();
|
||
}
|
||
|
||
handleClickSeeCommunity(waitForUpdate) {
|
||
if (this.props.shouldSaveBeforeTransition()) {
|
||
this.props.autoUpdateProject(); // save before transitioning to project page
|
||
|
||
waitForUpdate(true); // queue the transition to project page
|
||
} else {
|
||
waitForUpdate(false); // immediately transition to project page
|
||
}
|
||
}
|
||
|
||
handleClickShare(waitForUpdate) {
|
||
if (!this.props.isShared) {
|
||
if (this.props.canShare) {
|
||
// save before transitioning to project page
|
||
this.props.onShare();
|
||
}
|
||
|
||
if (this.props.canSave) {
|
||
// save before transitioning to project page
|
||
this.props.autoUpdateProject();
|
||
waitForUpdate(true); // queue the transition to project page
|
||
} else {
|
||
waitForUpdate(false); // immediately transition to project page
|
||
}
|
||
}
|
||
}
|
||
|
||
handleRestoreOption(restoreFun) {
|
||
return () => {
|
||
restoreFun();
|
||
this.props.onRequestCloseEdit();
|
||
};
|
||
}
|
||
|
||
handleKeyPress(event) {
|
||
const modifier = bowser__WEBPACK_IMPORTED_MODULE_6___default.a.mac ? event.metaKey : event.ctrlKey;
|
||
|
||
if (modifier && event.key.toLowerCase() === 's') {
|
||
this.props.handleSaveProject();
|
||
event.preventDefault();
|
||
}
|
||
}
|
||
|
||
getSaveToComputerHandler(downloadProjectCallback) {
|
||
return () => {
|
||
this.props.onRequestCloseFile();
|
||
downloadProjectCallback();
|
||
|
||
if (this.props.onProjectTelemetryEvent) {
|
||
const metadata = Object(_lib_collect_metadata__WEBPACK_IMPORTED_MODULE_34__["default"])(this.props.vm, this.props.projectTitle, this.props.locale);
|
||
this.props.onProjectTelemetryEvent('projectDidSave', metadata);
|
||
}
|
||
};
|
||
}
|
||
|
||
handleLanguageMouseUp(e) {
|
||
if (!this.props.languageMenuOpen) {
|
||
this.props.onClickLanguage(e);
|
||
}
|
||
}
|
||
|
||
restoreOptionMessage(deletedItem) {
|
||
switch (deletedItem) {
|
||
case 'Sprite':
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Restore Sprite",
|
||
id: "gui.menuBar.restoreSprite"
|
||
});
|
||
|
||
case 'Sound':
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Restore Sound",
|
||
id: "gui.menuBar.restoreSound"
|
||
});
|
||
|
||
case 'Costume':
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Restore Costume",
|
||
id: "gui.menuBar.restoreCostume"
|
||
});
|
||
|
||
default:
|
||
{
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Restore",
|
||
|
||
/* eslint-disable-line max-len */
|
||
id: "gui.menuBar.restore"
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
handleClickSeeInside() {
|
||
this.props.onClickSeeInside();
|
||
}
|
||
|
||
buildAboutMenu(onClickAbout) {
|
||
if (!onClickAbout) {
|
||
// hide the button
|
||
return null;
|
||
}
|
||
|
||
if (typeof onClickAbout === 'function') {
|
||
// make a button which calls a function
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(AboutButton, {
|
||
onClick: onClickAbout
|
||
});
|
||
} // assume it's an array of objects
|
||
// each item must have a 'title' FormattedMessage and a 'handleClick' function
|
||
// generate a menu with items for each object in the array
|
||
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem, _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.hoverable, {
|
||
[_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.active]: this.props.aboutMenuOpen
|
||
}),
|
||
onMouseUp: this.props.onRequestOpenAbout
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("img", {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.aboutIcon,
|
||
src: _icon_about_svg__WEBPACK_IMPORTED_MODULE_42___default.a,
|
||
draggable: false
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_bar_menu_jsx__WEBPACK_IMPORTED_MODULE_17__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarMenu),
|
||
open: this.props.aboutMenuOpen,
|
||
place: this.props.isRtl ? 'right' : 'left',
|
||
onRequestClose: this.props.onRequestCloseAbout
|
||
}, onClickAbout.map(itemProps => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
key: itemProps.title,
|
||
isRtl: this.props.isRtl,
|
||
onClick: this.wrapAboutMenuCallback(itemProps.onClick)
|
||
}, itemProps.title))));
|
||
}
|
||
|
||
wrapAboutMenuCallback(callback) {
|
||
return () => {
|
||
callback();
|
||
this.props.onRequestCloseAbout();
|
||
};
|
||
}
|
||
|
||
render() {
|
||
const saveNowMessage = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Save now",
|
||
id: "gui.menuBar.saveNow"
|
||
});
|
||
const createCopyMessage = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Save as a copy",
|
||
id: "gui.menuBar.saveAsCopy"
|
||
});
|
||
const remixMessage = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Remix",
|
||
id: "gui.menuBar.remix"
|
||
});
|
||
const newProjectMessage = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "New",
|
||
id: "gui.menuBar.new"
|
||
});
|
||
const remixButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarButton, _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.remixButton),
|
||
iconClassName: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.remixButtonIcon,
|
||
iconSrc: _icon_remix_svg__WEBPACK_IMPORTED_MODULE_39___default.a,
|
||
onClick: this.handleClickRemix
|
||
}, remixMessage); // Show the About button only if we have a handler for it (like in the desktop app)
|
||
|
||
const aboutButton = this.buildAboutMenu(this.props.onClickAbout);
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(this.props.className, _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBar)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.mainMenu
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.fileGroup
|
||
}, this.props.onClickLogo ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("img", {
|
||
alt: "Scratch",
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.scratchLogo, {
|
||
[_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.clickable]: typeof this.props.onClickLogo !== 'undefined'
|
||
}),
|
||
draggable: false,
|
||
src: this.props.logo,
|
||
onClick: this.props.onClickLogo
|
||
})) : null, this.props.canChangeLanguage && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem, _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.hoverable, _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.languageMenu)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("img", {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.languageIcon,
|
||
src: _language_selector_language_icon_svg__WEBPACK_IMPORTED_MODULE_41___default.a,
|
||
width: "24",
|
||
height: "24"
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("img", {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.languageCaret,
|
||
src: _dropdown_caret_svg__WEBPACK_IMPORTED_MODULE_40___default.a,
|
||
width: "8",
|
||
height: "5"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_containers_language_selector_jsx__WEBPACK_IMPORTED_MODULE_15__["default"], {
|
||
label: this.props.intl.formatMessage(ariaMessages.language)
|
||
})), this.props.onClickTheme && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem, _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.hoverable),
|
||
onMouseUp: this.props.onClickTheme
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("img", {
|
||
src: _tw_moon_svg__WEBPACK_IMPORTED_MODULE_44___default.a,
|
||
width: "24",
|
||
height: "24",
|
||
draggable: false
|
||
})), this.props.compileErrors.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem, _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.hoverable, {
|
||
[_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.active]: this.props.errorsMenuOpen
|
||
}),
|
||
onMouseUp: this.props.onClickErrors
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.errorsMenu)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("img", {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.languageIcon,
|
||
src: _tw_error_svg__WEBPACK_IMPORTED_MODULE_43___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("img", {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.languageCaret,
|
||
src: _dropdown_caret_svg__WEBPACK_IMPORTED_MODULE_40___default.a
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_bar_menu_jsx__WEBPACK_IMPORTED_MODULE_17__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarMenu),
|
||
open: this.props.errorsMenuOpen,
|
||
place: this.props.isRtl ? 'left' : 'right',
|
||
onRequestClose: this.props.onRequestCloseErrors
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuSection"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(MenuItemLink, {
|
||
href: "https://scratch.mit.edu/users/GarboMuffin/#comments"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Some scripts could not be compiled.",
|
||
id: "tw.menuBar.reportError1"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(MenuItemLink, {
|
||
href: "https://scratch.mit.edu/users/GarboMuffin/#comments"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "This is a bug. Please report it.",
|
||
id: "tw.menuBar.reportError2"
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuSection"], null, this.props.compileErrors.map(({
|
||
id,
|
||
sprite,
|
||
error
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
key: id
|
||
}, this.props.intl.formatMessage(twMessages.compileError, {
|
||
sprite,
|
||
error
|
||
}))))))), this.props.canManageFiles && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem, _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.hoverable, {
|
||
[_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.active]: this.props.fileMenuOpen
|
||
}),
|
||
onMouseUp: this.props.onClickFile
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "File",
|
||
id: "gui.menuBar.file"
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_bar_menu_jsx__WEBPACK_IMPORTED_MODULE_17__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarMenu),
|
||
open: this.props.fileMenuOpen,
|
||
place: this.props.isRtl ? 'left' : 'right',
|
||
onRequestClose: this.props.onRequestCloseFile
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuSection"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
isRtl: this.props.isRtl,
|
||
onClick: this.handleClickNew
|
||
}, newProjectMessage)), this.props.onClickNewWindow && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
isRtl: this.props.isRtl,
|
||
onClick: this.handleClickNewWindow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "New window" // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.menuBar.newWindow"
|
||
})), (this.props.canSave || this.props.canCreateCopy || this.props.canRemix) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuSection"], null, this.props.canSave && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
onClick: this.handleClickSave
|
||
}, saveNowMessage), this.props.canCreateCopy && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
onClick: this.handleClickSaveAsCopy
|
||
}, createCopyMessage), this.props.canRemix && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
onClick: this.handleClickRemix
|
||
}, remixMessage)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuSection"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
onClick: this.props.onStartSelectingFileUpload
|
||
}, this.props.intl.formatMessage(_lib_shared_messages__WEBPACK_IMPORTED_MODULE_46__["default"].loadFromComputerTitle)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_containers_sb3_downloader_jsx__WEBPACK_IMPORTED_MODULE_21__["default"], null, (_className, downloadProject, extended) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_7___default.a.Fragment, null, extended.available && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_7___default.a.Fragment, null, extended.name !== null &&
|
||
/*#__PURE__*/
|
||
// eslint-disable-next-line max-len
|
||
react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
onClick: this.getSaveToComputerHandler(extended.saveToLastFile)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Save to {file}" // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.saveTo",
|
||
values: {
|
||
file: extended.name
|
||
}
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
onClick: this.getSaveToComputerHandler(extended.saveAsNew)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Save as..." // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.saveAs"
|
||
}))), Object(_lib_isScratchDesktop_js__WEBPACK_IMPORTED_MODULE_48__["notScratchDesktop"])() && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
onClick: this.getSaveToComputerHandler(downloadProject)
|
||
}, extended.available ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Save to separate file..." // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.oldDownload"
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Save to your computer",
|
||
// eslint-disable-line max-len
|
||
id: "gui.menuBar.downloadToComputer"
|
||
}))))), this.props.onClickPackager && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuSection"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
onClick: this.handleClickPackager
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Package project" // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.menuBar.package"
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuSection"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
onClick: this.handleClickRestorePoints
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Restore points",
|
||
id: "tw.menuBar.restorePoints"
|
||
}))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem, _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.hoverable, {
|
||
[_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.active]: this.props.editMenuOpen
|
||
}),
|
||
onMouseUp: this.props.onClickEdit
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.editMenu)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Edit",
|
||
id: "gui.menuBar.edit"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_bar_menu_jsx__WEBPACK_IMPORTED_MODULE_17__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarMenu),
|
||
open: this.props.editMenuOpen,
|
||
place: this.props.isRtl ? 'left' : 'right',
|
||
onRequestClose: this.props.onRequestCloseEdit
|
||
}, this.props.isPlayerOnly ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_containers_deletion_restorer_jsx__WEBPACK_IMPORTED_MODULE_22__["default"], null, (handleRestore, {
|
||
restorable,
|
||
deletedItem
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()({
|
||
[_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.disabled]: !restorable
|
||
}),
|
||
onClick: this.handleRestoreOption(handleRestore)
|
||
}, this.restoreOptionMessage(deletedItem))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuSection"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_containers_turbo_mode_jsx__WEBPACK_IMPORTED_MODULE_23__["default"], null, (toggleTurboMode, {
|
||
turboMode
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
onClick: toggleTurboMode
|
||
}, turboMode ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Turn off Turbo Mode",
|
||
id: "gui.menuBar.turboModeOff"
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Turn on Turbo Mode",
|
||
id: "gui.menuBar.turboModeOn"
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_containers_tw_framerate_changer_jsx__WEBPACK_IMPORTED_MODULE_25__["default"], null, (changeFramerate, {
|
||
framerate
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
onClick: changeFramerate
|
||
}, framerate === 60 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Turn off 60 FPS Mode",
|
||
id: "tw.menuBar.60off"
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Turn on 60 FPS Mode",
|
||
id: "tw.menuBar.60on"
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_containers_tw_change_username_jsx__WEBPACK_IMPORTED_MODULE_26__["default"], null, changeUsername => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
onClick: changeUsername
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Change Username",
|
||
id: "tw.menuBar.changeUsername"
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_containers_tw_cloud_toggler_jsx__WEBPACK_IMPORTED_MODULE_27__["default"], null, (toggleCloudVariables, {
|
||
enabled,
|
||
canUseCloudVariables
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()({
|
||
[_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.disabled]: !canUseCloudVariables
|
||
}),
|
||
onClick: toggleCloudVariables
|
||
}, canUseCloudVariables ? enabled ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Disable Cloud Variables",
|
||
id: "tw.menuBar.cloudOff"
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Enable Cloud Variables",
|
||
id: "tw.menuBar.cloudOn"
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Cloud Variables are not Available",
|
||
id: "tw.menuBar.cloudUnavailable"
|
||
})))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuSection"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_18__["MenuItem"], {
|
||
onClick: this.props.onClickSettings
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Advanced Settings",
|
||
id: "tw.menuBar.moreSettings"
|
||
}))))), this.props.onClickAddonSettings && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem, _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.hoverable),
|
||
onMouseUp: this.props.onClickAddonSettings
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"] // Note: this string is used by scratch-vm for the addons blocks category
|
||
, {
|
||
defaultMessage: "Addons",
|
||
id: "tw.menuBar.addons"
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem, _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.hoverable),
|
||
onMouseUp: this.props.onClickSettings
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Advanced",
|
||
id: "tw.menuBar.advanced"
|
||
})))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_divider_divider_jsx__WEBPACK_IMPORTED_MODULE_14__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.divider)
|
||
}), this.props.canEditTitle ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem, _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.growable)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(MenuBarItemTooltip, {
|
||
enable: true,
|
||
id: "title-field"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_project_title_input_jsx__WEBPACK_IMPORTED_MODULE_19__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.titleFieldGrowable)
|
||
}))) : this.props.authorUsername && this.props.authorUsername !== this.props.username ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_author_info_jsx__WEBPACK_IMPORTED_MODULE_20__["default"], {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.authorInfo,
|
||
imageUrl: this.props.authorThumbnailUrl,
|
||
projectId: this.props.projectId,
|
||
projectTitle: this.props.projectTitle,
|
||
userId: this.props.authorId,
|
||
username: this.props.authorUsername
|
||
}) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem)
|
||
}, this.props.canShare ? (this.props.isShowingProject || this.props.isUpdating) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_containers_project_watcher_jsx__WEBPACK_IMPORTED_MODULE_16__["default"], {
|
||
onDoneUpdating: this.props.onSeeCommunity
|
||
}, waitForUpdate => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_share_button_jsx__WEBPACK_IMPORTED_MODULE_12__["default"], {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarButton,
|
||
isShared: this.props.isShared
|
||
/* eslint-disable react/jsx-no-bind */
|
||
,
|
||
onClick: () => {
|
||
this.handleClickShare(waitForUpdate);
|
||
}
|
||
/* eslint-enable react/jsx-no-bind */
|
||
|
||
})) : this.props.showComingSoon ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(MenuBarItemTooltip, {
|
||
id: "share-button"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_share_button_jsx__WEBPACK_IMPORTED_MODULE_12__["default"], {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarButton
|
||
})) : [], this.props.canRemix ? remixButton : []), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem, _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.communityButtonWrapper)
|
||
}, this.props.enableCommunity ? (this.props.isShowingProject || this.props.isUpdating) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_containers_project_watcher_jsx__WEBPACK_IMPORTED_MODULE_16__["default"], {
|
||
onDoneUpdating: this.props.onSeeCommunity
|
||
}, waitForUpdate => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_community_button_jsx__WEBPACK_IMPORTED_MODULE_11__["default"], {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarButton
|
||
/* eslint-disable react/jsx-no-bind */
|
||
,
|
||
onClick: () => {
|
||
this.handleClickSeeCommunity(waitForUpdate);
|
||
}
|
||
/* eslint-enable react/jsx-no-bind */
|
||
|
||
})) : this.props.showComingSoon ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(MenuBarItemTooltip, {
|
||
id: "community-button"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_community_button_jsx__WEBPACK_IMPORTED_MODULE_11__["default"], {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarButton
|
||
})) : this.props.enableSeeInside ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_tw_see_inside_jsx__WEBPACK_IMPORTED_MODULE_47__["default"], {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarButton,
|
||
onClick: this.handleClickSeeInside
|
||
}) : []), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("a", {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.feedbackLink,
|
||
href: "https://scratch.mit.edu/users/GarboMuffin/#comments",
|
||
rel: "noopener noreferrer",
|
||
target: "_blank"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.feedbackButton
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "TurboWarp Feedback",
|
||
id: "tw.feedbackButton"
|
||
}))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.accountInfoGroup
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
|
||
className: _menu_bar_css__WEBPACK_IMPORTED_MODULE_35___default.a.menuBarItem
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_tw_save_status_jsx__WEBPACK_IMPORTED_MODULE_28__["default"], null))), aboutButton);
|
||
}
|
||
|
||
}
|
||
|
||
MenuBar.propTypes = {
|
||
enableSeeInside: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
onClickSeeInside: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
aboutMenuOpen: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
accountMenuOpen: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
authorId: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool]),
|
||
authorThumbnailUrl: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
authorUsername: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool]),
|
||
autoUpdateProject: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
canChangeLanguage: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
canCreateCopy: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
canCreateNew: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
canEditTitle: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
canManageFiles: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
canRemix: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
canSave: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
canShare: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
compileErrors: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({
|
||
sprite: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
error: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number
|
||
})),
|
||
confirmReadyToReplaceProject: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
editMenuOpen: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
enableCommunity: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
fileMenuOpen: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
handleSaveProject: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"],
|
||
isPlayerOnly: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
isShared: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
isShowingProject: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
isUpdating: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
languageMenuOpen: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
locale: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string.isRequired,
|
||
loginMenuOpen: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
logo: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
onClickAbout: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func, // button mode: call this callback when the About button is clicked
|
||
prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.arrayOf( // menu mode: list of items in the About menu
|
||
prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
// text for the menu item
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func // call this callback when the menu item is clicked
|
||
|
||
}))]),
|
||
onClickAccount: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickAddonSettings: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickTheme: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickPackager: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickRestorePoints: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickEdit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickFile: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickLanguage: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickLogin: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickLogo: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickNew: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickNewWindow: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickRemix: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickSave: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickSaveAsCopy: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickSettings: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onClickErrors: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onRequestCloseErrors: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onLogOut: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onOpenRegistration: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onOpenTipLibrary: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onProjectTelemetryEvent: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onRequestOpenAbout: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onRequestCloseAbout: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onRequestCloseAccount: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onRequestCloseEdit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onRequestCloseFile: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onRequestCloseLanguage: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onRequestCloseLogin: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onSeeCommunity: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onShare: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onStartSelectingFileUpload: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onToggleLoginOpen: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
projectId: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
projectTitle: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
renderLogin: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
sessionExists: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
errorsMenuOpen: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
shouldSaveBeforeTransition: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
showComingSoon: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
userOwnsProject: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
username: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_8___default.a).isRequired
|
||
};
|
||
MenuBar.defaultProps = {
|
||
logo: _scratch_logo_svg__WEBPACK_IMPORTED_MODULE_45___default.a,
|
||
onShare: () => {}
|
||
};
|
||
|
||
const mapStateToProps = (state, ownProps) => {
|
||
const loadingState = state.scratchGui.projectState.loadingState;
|
||
const user = state.session && state.session.session && state.session.session.user;
|
||
return {
|
||
aboutMenuOpen: Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["aboutMenuOpen"])(state),
|
||
accountMenuOpen: Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["accountMenuOpen"])(state),
|
||
authorThumbnailUrl: state.scratchGui.tw.author.thumbnail,
|
||
authorUsername: state.scratchGui.tw.author.username,
|
||
compileErrors: state.scratchGui.tw.compileErrors,
|
||
fileMenuOpen: Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["fileMenuOpen"])(state),
|
||
editMenuOpen: Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["editMenuOpen"])(state),
|
||
isPlayerOnly: state.scratchGui.mode.isPlayerOnly,
|
||
isRtl: state.locales.isRtl,
|
||
isUpdating: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_31__["getIsUpdating"])(loadingState),
|
||
isShowingProject: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_31__["getIsShowingProject"])(loadingState),
|
||
languageMenuOpen: Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["languageMenuOpen"])(state),
|
||
locale: state.locales.locale,
|
||
loginMenuOpen: Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["loginMenuOpen"])(state),
|
||
projectId: state.scratchGui.projectState.projectId,
|
||
projectTitle: state.scratchGui.projectTitle,
|
||
sessionExists: state.session && typeof state.session.session !== 'undefined',
|
||
errorsMenuOpen: Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["errorsMenuOpen"])(state),
|
||
username: user ? user.username : null,
|
||
userOwnsProject: ownProps.authorUsername && user && ownProps.authorUsername === user.username,
|
||
vm: state.scratchGui.vm
|
||
};
|
||
};
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onClickSeeInside: () => dispatch(Object(_reducers_mode__WEBPACK_IMPORTED_MODULE_30__["setPlayer"])(false)),
|
||
autoUpdateProject: () => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_31__["autoUpdateProject"])()),
|
||
onOpenTipLibrary: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_29__["openTipsLibrary"])()),
|
||
onClickAccount: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["openAccountMenu"])()),
|
||
onRequestCloseAccount: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["closeAccountMenu"])()),
|
||
onClickFile: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["openFileMenu"])()),
|
||
onRequestCloseFile: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["closeFileMenu"])()),
|
||
onClickEdit: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["openEditMenu"])()),
|
||
onRequestCloseEdit: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["closeEditMenu"])()),
|
||
onClickLanguage: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["openLanguageMenu"])()),
|
||
onRequestCloseLanguage: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["closeLanguageMenu"])()),
|
||
onClickLogin: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["openLoginMenu"])()),
|
||
onRequestCloseLogin: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["closeLoginMenu"])()),
|
||
onClickErrors: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["openErrorsMenu"])()),
|
||
onRequestCloseErrors: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["closeErrorsMenu"])()),
|
||
onRequestOpenAbout: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["openAboutMenu"])()),
|
||
onRequestCloseAbout: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["closeAboutMenu"])()),
|
||
onClickNew: needSave => {
|
||
dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_31__["requestNewProject"])(needSave));
|
||
dispatch(Object(_reducers_tw_js__WEBPACK_IMPORTED_MODULE_33__["setFileHandle"])(null));
|
||
},
|
||
onClickRemix: () => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_31__["remixProject"])()),
|
||
onClickSave: () => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_31__["manualUpdateProject"])()),
|
||
onClickSaveAsCopy: () => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_31__["saveProjectAsCopy"])()),
|
||
onClickRestorePoints: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_29__["openRestorePointModal"])()),
|
||
onClickSettings: () => {
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_29__["openSettingsModal"])());
|
||
dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_32__["closeEditMenu"])());
|
||
},
|
||
onSeeCommunity: () => dispatch(Object(_reducers_mode__WEBPACK_IMPORTED_MODULE_30__["setPlayer"])(true))
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(redux__WEBPACK_IMPORTED_MODULE_2__["compose"])(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"], _containers_menu_bar_hoc_jsx__WEBPACK_IMPORTED_MODULE_24__["default"], Object(react_redux__WEBPACK_IMPORTED_MODULE_1__["connect"])(mapStateToProps, mapDispatchToProps))(MenuBar));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/project-title-input.css":
|
||
/*!*********************************************************!*\
|
||
!*** ./src/components/menu-bar/project-title-input.css ***!
|
||
\*********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./project-title-input.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/project-title-input.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/project-title-input.jsx":
|
||
/*!*********************************************************!*\
|
||
!*** ./src/components/menu-bar/project-title-input.jsx ***!
|
||
\*********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _reducers_project_title__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../reducers/project-title */ "./src/reducers/project-title.js");
|
||
/* harmony import */ var _forms_buffered_input_hoc_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../forms/buffered-input-hoc.jsx */ "./src/components/forms/buffered-input-hoc.jsx");
|
||
/* harmony import */ var _forms_input_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../forms/input.jsx */ "./src/components/forms/input.jsx");
|
||
/* harmony import */ var _project_title_input_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./project-title-input.css */ "./src/components/menu-bar/project-title-input.css");
|
||
/* harmony import */ var _project_title_input_css__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_project_title_input_css__WEBPACK_IMPORTED_MODULE_8__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const BufferedInput = Object(_forms_buffered_input_hoc_jsx__WEBPACK_IMPORTED_MODULE_6__["default"])(_forms_input_jsx__WEBPACK_IMPORTED_MODULE_7__["default"]);
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["defineMessages"])({
|
||
projectTitlePlaceholder: {
|
||
"id": "gui.gui.projectTitlePlaceholder",
|
||
"defaultMessage": "Project title here"
|
||
}
|
||
});
|
||
|
||
const ProjectTitleInput = ({
|
||
className,
|
||
intl,
|
||
onSubmit,
|
||
projectTitle
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(BufferedInput, {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_project_title_input_css__WEBPACK_IMPORTED_MODULE_8___default.a.titleField, className),
|
||
maxLength: "100",
|
||
placeholder: intl.formatMessage(messages.projectTitlePlaceholder),
|
||
tabIndex: "0",
|
||
type: "text",
|
||
value: projectTitle,
|
||
onSubmit: onSubmit
|
||
});
|
||
|
||
ProjectTitleInput.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_4__["intlShape"].isRequired,
|
||
onSubmit: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
projectTitle: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
projectTitle: state.scratchGui.projectTitle
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onSubmit: title => dispatch(Object(_reducers_project_title__WEBPACK_IMPORTED_MODULE_5__["setProjectTitle"])(title))
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_1__["connect"])(mapStateToProps, mapDispatchToProps)(ProjectTitleInput)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/save-status.css":
|
||
/*!*************************************************!*\
|
||
!*** ./src/components/menu-bar/save-status.css ***!
|
||
\*************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./save-status.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/save-status.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/scratch-logo.svg":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/menu-bar/scratch-logo.svg ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/8bcd9c00e30a0af9d832735651fd9643.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/share-button.css":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/menu-bar/share-button.css ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./share-button.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/share-button.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/share-button.jsx":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/menu-bar/share-button.jsx ***!
|
||
\**************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _button_button_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../button/button.jsx */ "./src/components/button/button.jsx");
|
||
/* harmony import */ var _share_button_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./share-button.css */ "./src/components/menu-bar/share-button.css");
|
||
/* harmony import */ var _share_button_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_share_button_css__WEBPACK_IMPORTED_MODULE_5__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const ShareButton = ({
|
||
className,
|
||
isShared,
|
||
onClick
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(className, _share_button_css__WEBPACK_IMPORTED_MODULE_5___default.a.shareButton, {
|
||
[_share_button_css__WEBPACK_IMPORTED_MODULE_5___default.a.shareButtonIsShared]: isShared
|
||
}),
|
||
onClick: onClick
|
||
}, isShared ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Shared",
|
||
id: "gui.menuBar.isShared"
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Share",
|
||
id: "gui.menuBar.share"
|
||
}));
|
||
|
||
ShareButton.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
isShared: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func
|
||
};
|
||
ShareButton.defaultProps = {
|
||
onClick: () => {}
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (ShareButton);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/tw-error.svg":
|
||
/*!**********************************************!*\
|
||
!*** ./src/components/menu-bar/tw-error.svg ***!
|
||
\**********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/74546102be38f592d24b4330a16a8639.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/tw-moon.svg":
|
||
/*!*********************************************!*\
|
||
!*** ./src/components/menu-bar/tw-moon.svg ***!
|
||
\*********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/90e939d170002c61a50116ed55763b19.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/tw-save-status.jsx":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/menu-bar/tw-save-status.jsx ***!
|
||
\****************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _containers_inline_messages_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../containers/inline-messages.jsx */ "./src/containers/inline-messages.jsx");
|
||
/* harmony import */ var _containers_sb3_downloader_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../containers/sb3-downloader.jsx */ "./src/containers/sb3-downloader.jsx");
|
||
/* harmony import */ var _reducers_alerts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../reducers/alerts */ "./src/reducers/alerts.js");
|
||
/* harmony import */ var _save_status_css__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./save-status.css */ "./src/components/menu-bar/save-status.css");
|
||
/* harmony import */ var _save_status_css__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_save_status_css__WEBPACK_IMPORTED_MODULE_7__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const TWSaveStatus = ({
|
||
alertsList,
|
||
fileHandle,
|
||
projectChanged
|
||
}) => Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_6__["filterInlineAlerts"])(alertsList).length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_inline_messages_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], null) : projectChanged && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_sb3_downloader_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], null, (_className, _downloadProjectCallback, {
|
||
smartSave
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
onClick: smartSave,
|
||
className: _save_status_css__WEBPACK_IMPORTED_MODULE_7___default.a.saveNow
|
||
}, fileHandle ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Save as {file}",
|
||
id: "tw.menuBar.saveAs",
|
||
values: {
|
||
file: fileHandle.name
|
||
}
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Save to your computer",
|
||
id: "gui.menuBar.downloadToComputer"
|
||
})));
|
||
|
||
TWSaveStatus.propTypes = {
|
||
alertsList: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object),
|
||
fileHandle: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string
|
||
}),
|
||
projectChanged: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
alertsList: state.scratchGui.alerts.alertsList,
|
||
fileHandle: state.scratchGui.tw.fileHandle,
|
||
projectChanged: state.scratchGui.projectChanged
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_0__["connect"])(mapStateToProps, () => ({}))(TWSaveStatus));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/tw-see-inside.css":
|
||
/*!***************************************************!*\
|
||
!*** ./src/components/menu-bar/tw-see-inside.css ***!
|
||
\***************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./tw-see-inside.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/tw-see-inside.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/tw-see-inside.jsx":
|
||
/*!***************************************************!*\
|
||
!*** ./src/components/menu-bar/tw-see-inside.jsx ***!
|
||
\***************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _button_button_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../button/button.jsx */ "./src/components/button/button.jsx");
|
||
/* harmony import */ var _icon_see_community_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./icon--see-community.svg */ "./src/components/menu-bar/icon--see-community.svg");
|
||
/* harmony import */ var _icon_see_community_svg__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_icon_see_community_svg__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _tw_see_inside_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tw-see-inside.css */ "./src/components/menu-bar/tw-see-inside.css");
|
||
/* harmony import */ var _tw_see_inside_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_tw_see_inside_css__WEBPACK_IMPORTED_MODULE_6__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const SeeInsideButton = ({
|
||
className,
|
||
onClick
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(className, _tw_see_inside_css__WEBPACK_IMPORTED_MODULE_6___default.a.seeInsideButton),
|
||
iconClassName: _tw_see_inside_css__WEBPACK_IMPORTED_MODULE_6___default.a.seeInsideButtonIcon,
|
||
iconSrc: _icon_see_community_svg__WEBPACK_IMPORTED_MODULE_5___default.a,
|
||
iconWidth: "20",
|
||
iconHeight: "20",
|
||
onClick: onClick
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "See inside",
|
||
id: "tw.menuBar.seeInside"
|
||
}));
|
||
|
||
SeeInsideButton.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func
|
||
};
|
||
SeeInsideButton.defaultProps = {
|
||
onClick: () => {}
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (SeeInsideButton);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/user-avatar.css":
|
||
/*!*************************************************!*\
|
||
!*** ./src/components/menu-bar/user-avatar.css ***!
|
||
\*************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./user-avatar.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu-bar/user-avatar.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu-bar/user-avatar.jsx":
|
||
/*!*************************************************!*\
|
||
!*** ./src/components/menu-bar/user-avatar.jsx ***!
|
||
\*************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _user_avatar_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./user-avatar.css */ "./src/components/menu-bar/user-avatar.css");
|
||
/* harmony import */ var _user_avatar_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_user_avatar_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
|
||
|
||
|
||
|
||
|
||
const UserAvatar = ({
|
||
className,
|
||
imageUrl
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(className, _user_avatar_css__WEBPACK_IMPORTED_MODULE_3___default.a.userThumbnail),
|
||
src: imageUrl
|
||
});
|
||
|
||
UserAvatar.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
imageUrl: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (UserAvatar);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu/menu.css":
|
||
/*!**************************************!*\
|
||
!*** ./src/components/menu/menu.css ***!
|
||
\**************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./menu.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/menu/menu.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/menu/menu.jsx":
|
||
/*!**************************************!*\
|
||
!*** ./src/components/menu/menu.jsx ***!
|
||
\**************************************/
|
||
/*! exports provided: default, MenuItem, MenuSection */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MenuComponent; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MenuItem", function() { return MenuItem; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MenuSection", function() { return MenuSection; });
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _menu_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./menu.css */ "./src/components/menu/menu.css");
|
||
/* harmony import */ var _menu_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_menu_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
|
||
|
||
|
||
|
||
|
||
const MenuComponent = ({
|
||
className = '',
|
||
children,
|
||
componentRef,
|
||
place = 'right'
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("ul", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_css__WEBPACK_IMPORTED_MODULE_3___default.a.menu, className, {
|
||
[_menu_css__WEBPACK_IMPORTED_MODULE_3___default.a.left]: place === 'left',
|
||
[_menu_css__WEBPACK_IMPORTED_MODULE_3___default.a.right]: place === 'right'
|
||
}),
|
||
ref: componentRef
|
||
}, children);
|
||
|
||
MenuComponent.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
componentRef: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
place: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['left', 'right'])
|
||
};
|
||
|
||
const MenuItem = ({
|
||
children,
|
||
className,
|
||
onClick
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("li", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_menu_css__WEBPACK_IMPORTED_MODULE_3___default.a.menuItem, _menu_css__WEBPACK_IMPORTED_MODULE_3___default.a.hoverable, className),
|
||
onClick: onClick
|
||
}, children);
|
||
|
||
MenuItem.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
|
||
const addDividerClassToFirstChild = (child, id) => child && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.cloneElement(child, {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(child.className, {
|
||
[_menu_css__WEBPACK_IMPORTED_MODULE_3___default.a.menuSection]: id === 0
|
||
}),
|
||
key: id
|
||
});
|
||
|
||
const MenuSection = ({
|
||
children
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_2___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_2___default.a.Children.map(children, addDividerClassToFirstChild));
|
||
|
||
MenuSection.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/meter/meter.css":
|
||
/*!****************************************!*\
|
||
!*** ./src/components/meter/meter.css ***!
|
||
\****************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./meter.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/meter/meter.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/meter/meter.jsx":
|
||
/*!****************************************!*\
|
||
!*** ./src/components/meter/meter.jsx ***!
|
||
\****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _meter_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./meter.css */ "./src/components/meter/meter.css");
|
||
/* harmony import */ var _meter_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_meter_css__WEBPACK_IMPORTED_MODULE_2__);
|
||
|
||
|
||
|
||
|
||
const Meter = props => {
|
||
const {
|
||
level,
|
||
width,
|
||
height
|
||
} = props;
|
||
const nGreen = 11;
|
||
const nYellow = 5;
|
||
const nRed = 3;
|
||
const nBars = nGreen + nYellow + nRed;
|
||
const barSpacing = 2.5;
|
||
const barRounding = 3;
|
||
const barHeight = (height - barSpacing * (nBars + 1)) / nBars;
|
||
const nBarsToMask = nBars - Math.floor(level * nBars);
|
||
const scale = (nBarsToMask * (barHeight + barSpacing) + barSpacing / 2) / height;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _meter_css__WEBPACK_IMPORTED_MODULE_2___default.a.maskContainer,
|
||
style: {
|
||
height: "".concat(height, "px")
|
||
}
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("svg", {
|
||
className: _meter_css__WEBPACK_IMPORTED_MODULE_2___default.a.container,
|
||
height: height,
|
||
width: width
|
||
}, Array(nBars).fill(0).map((value, index) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("rect", {
|
||
className: index < nGreen ? _meter_css__WEBPACK_IMPORTED_MODULE_2___default.a.green : index < nGreen + nYellow ? _meter_css__WEBPACK_IMPORTED_MODULE_2___default.a.yellow : _meter_css__WEBPACK_IMPORTED_MODULE_2___default.a.red,
|
||
height: barHeight,
|
||
key: index,
|
||
rx: barRounding,
|
||
ry: barRounding,
|
||
width: width - 2,
|
||
x: 1,
|
||
y: height - (barSpacing + barHeight) * (index + 1)
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _meter_css__WEBPACK_IMPORTED_MODULE_2___default.a.mask,
|
||
style: {
|
||
transform: "scaleY(".concat(scale, ")")
|
||
}
|
||
}));
|
||
};
|
||
|
||
Meter.propTypes = {
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
level: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Meter);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/mic-indicator/mic-indicator.css":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/mic-indicator/mic-indicator.css ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./mic-indicator.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/mic-indicator/mic-indicator.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/mic-indicator/mic-indicator.jsx":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/mic-indicator/mic-indicator.jsx ***!
|
||
\********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _mic_indicator_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mic-indicator.css */ "./src/components/mic-indicator/mic-indicator.css");
|
||
/* harmony import */ var _mic_indicator_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_mic_indicator_css__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _mic_indicator_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mic-indicator.svg */ "./src/components/mic-indicator/mic-indicator.svg");
|
||
/* harmony import */ var _mic_indicator_svg__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_mic_indicator_svg__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _lib_screen_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib/screen-utils */ "./src/lib/screen-utils.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const MicIndicatorComponent = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: props.className,
|
||
style: Object(_lib_screen_utils__WEBPACK_IMPORTED_MODULE_4__["stageSizeToTransform"])(props.stageSize)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {
|
||
className: _mic_indicator_css__WEBPACK_IMPORTED_MODULE_2___default.a.micImg,
|
||
src: _mic_indicator_svg__WEBPACK_IMPORTED_MODULE_3___default.a
|
||
}));
|
||
|
||
MicIndicatorComponent.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
stageSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
widthDefault: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
heightDefault: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
}).isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (MicIndicatorComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/mic-indicator/mic-indicator.svg":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/mic-indicator/mic-indicator.svg ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/4da38973d5ffd15c54e80894d430288c.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/modal/modal.css":
|
||
/*!****************************************!*\
|
||
!*** ./src/components/modal/modal.css ***!
|
||
\****************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./modal.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/modal/modal.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/modal/modal.jsx":
|
||
/*!****************************************!*\
|
||
!*** ./src/components/modal/modal.jsx ***!
|
||
\****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_modal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-modal */ "./node_modules/react-modal/lib/index.js");
|
||
/* harmony import */ var react_modal__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_modal__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _button_button_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../button/button.jsx */ "./src/components/button/button.jsx");
|
||
/* harmony import */ var _close_button_close_button_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../close-button/close-button.jsx */ "./src/components/close-button/close-button.jsx");
|
||
/* harmony import */ var _lib_assets_icon_back_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../lib/assets/icon--back.svg */ "./src/lib/assets/icon--back.svg");
|
||
/* harmony import */ var _lib_assets_icon_back_svg__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_lib_assets_icon_back_svg__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var _lib_assets_icon_help_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../lib/assets/icon--help.svg */ "./src/lib/assets/icon--help.svg");
|
||
/* harmony import */ var _lib_assets_icon_help_svg__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_lib_assets_icon_help_svg__WEBPACK_IMPORTED_MODULE_9__);
|
||
/* harmony import */ var _modal_css__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./modal.css */ "./src/components/modal/modal.css");
|
||
/* harmony import */ var _modal_css__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_modal_css__WEBPACK_IMPORTED_MODULE_10__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const ModalComponent = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_modal__WEBPACK_IMPORTED_MODULE_3___default.a, {
|
||
isOpen: true,
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.modalContent, props.className, {
|
||
[_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.fullScreen]: props.fullScreen
|
||
}),
|
||
contentLabel: props.contentLabel,
|
||
overlayClassName: _modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.modalOverlay,
|
||
onRequestClose: props.onRequestClose
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
dir: props.isRtl ? 'rtl' : 'ltr',
|
||
direction: "column",
|
||
grow: 1
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.header, props.headerClassName)
|
||
}, props.onHelp ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.headerItem, _modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.headerItemHelp)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
className: _modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.helpButton,
|
||
iconSrc: _lib_assets_icon_help_svg__WEBPACK_IMPORTED_MODULE_9___default.a,
|
||
onClick: props.onHelp
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "Help",
|
||
id: "gui.modal.help"
|
||
}))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.headerItem, _modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.headerItemTitle)
|
||
}, props.headerImage ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.headerImage,
|
||
src: props.headerImage
|
||
}) : null, props.contentLabel), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.headerItem, _modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.headerItemClose)
|
||
}, props.fullScreen ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
className: _modal_css__WEBPACK_IMPORTED_MODULE_10___default.a.backButton,
|
||
iconSrc: _lib_assets_icon_back_svg__WEBPACK_IMPORTED_MODULE_8___default.a,
|
||
onClick: props.onRequestClose
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "Back",
|
||
id: "gui.modal.back"
|
||
})) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_close_button_close_button_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
size: _close_button_close_button_jsx__WEBPACK_IMPORTED_MODULE_7__["default"].SIZE_LARGE,
|
||
onClick: props.onRequestClose
|
||
}))), props.children));
|
||
|
||
ModalComponent.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
contentLabel: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object]).isRequired,
|
||
fullScreen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
headerClassName: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
headerImage: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onHelp: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onRequestClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (ModalComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/monitor-list/monitor-list.css":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/monitor-list/monitor-list.css ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./monitor-list.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/monitor-list/monitor-list.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/monitor-list/monitor-list.jsx":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/monitor-list/monitor-list.jsx ***!
|
||
\******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _containers_monitor_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../containers/monitor.jsx */ "./src/containers/monitor.jsx");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var immutable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! immutable */ "./node_modules/immutable/dist/immutable.js");
|
||
/* harmony import */ var immutable__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(immutable__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _lib_screen_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib/screen-utils */ "./src/lib/screen-utils.js");
|
||
/* harmony import */ var _monitor_list_css__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./monitor-list.css */ "./src/components/monitor-list/monitor-list.css");
|
||
/* harmony import */ var _monitor_list_css__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_monitor_list_css__WEBPACK_IMPORTED_MODULE_7__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const MonitorList = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_2__["default"] // Use static `monitor-overlay` class for bounds of draggables
|
||
, {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_1___default()(_monitor_list_css__WEBPACK_IMPORTED_MODULE_7___default.a.monitorList, 'monitor-overlay'),
|
||
style: {
|
||
width: props.stageSize.width,
|
||
height: props.stageSize.height
|
||
}
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
||
className: _monitor_list_css__WEBPACK_IMPORTED_MODULE_7___default.a.monitorListScaler,
|
||
style: Object(_lib_screen_utils__WEBPACK_IMPORTED_MODULE_6__["stageSizeToTransform"])(props.stageSize)
|
||
}, props.monitors.valueSeq().filter(m => m.visible).map(monitorData => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_containers_monitor_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
draggable: props.draggable,
|
||
height: monitorData.height,
|
||
id: monitorData.id,
|
||
isDiscrete: monitorData.isDiscrete,
|
||
key: monitorData.id,
|
||
max: monitorData.sliderMax,
|
||
min: monitorData.sliderMin,
|
||
mode: monitorData.mode,
|
||
opcode: monitorData.opcode,
|
||
params: monitorData.params,
|
||
spriteName: monitorData.spriteName,
|
||
targetId: monitorData.targetId,
|
||
value: monitorData.value,
|
||
width: monitorData.width,
|
||
x: monitorData.x,
|
||
y: monitorData.y,
|
||
onDragEnd: props.onMonitorChange
|
||
}))));
|
||
|
||
MonitorList.propTypes = {
|
||
draggable: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool.isRequired,
|
||
monitors: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.instanceOf(immutable__WEBPACK_IMPORTED_MODULE_5__["OrderedMap"]),
|
||
onMonitorChange: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func.isRequired,
|
||
stageSize: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,
|
||
widthDefault: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,
|
||
heightDefault: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number
|
||
}).isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (MonitorList);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/monitor/default-monitor.jsx":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/monitor/default-monitor.jsx ***!
|
||
\****************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _monitor_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./monitor.css */ "./src/components/monitor/monitor.css");
|
||
/* harmony import */ var _monitor_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_monitor_css__WEBPACK_IMPORTED_MODULE_2__);
|
||
|
||
|
||
|
||
|
||
const DefaultMonitor = ({
|
||
categoryColor,
|
||
label,
|
||
value
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_2___default.a.defaultMonitor
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_2___default.a.row
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_2___default.a.label
|
||
}, label), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_2___default.a.value,
|
||
style: {
|
||
background: categoryColor
|
||
}
|
||
}, value)));
|
||
|
||
DefaultMonitor.propTypes = {
|
||
categoryColor: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
label: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
value: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number])
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (DefaultMonitor);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/monitor/large-monitor.jsx":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/monitor/large-monitor.jsx ***!
|
||
\**************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _monitor_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./monitor.css */ "./src/components/monitor/monitor.css");
|
||
/* harmony import */ var _monitor_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_monitor_css__WEBPACK_IMPORTED_MODULE_2__);
|
||
|
||
|
||
|
||
|
||
const LargeMonitor = ({
|
||
categoryColor,
|
||
value
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_2___default.a.largeMonitor
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_2___default.a.largeValue,
|
||
style: {
|
||
background: categoryColor
|
||
}
|
||
}, value));
|
||
|
||
LargeMonitor.propTypes = {
|
||
categoryColor: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
value: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number])
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (LargeMonitor);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/monitor/list-monitor-scroller.jsx":
|
||
/*!**********************************************************!*\
|
||
!*** ./src/components/monitor/list-monitor-scroller.jsx ***!
|
||
\**********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _monitor_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./monitor.css */ "./src/components/monitor/monitor.css");
|
||
/* harmony import */ var _monitor_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_monitor_css__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var react_virtualized__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-virtualized */ "./node_modules/react-virtualized/dist/es/index.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class ListMonitorScroller extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default()(this, ['rowRenderer', 'noRowsRenderer', 'handleEventFactory']);
|
||
}
|
||
|
||
handleEventFactory(index) {
|
||
return () => this.props.onActivate(index);
|
||
}
|
||
|
||
noRowsRenderer() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_monitor_css__WEBPACK_IMPORTED_MODULE_5___default.a.listRow, _monitor_css__WEBPACK_IMPORTED_MODULE_5___default.a.listEmpty)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "(empty)",
|
||
id: "gui.monitor.listMonitor.empty"
|
||
}));
|
||
}
|
||
|
||
rowRenderer({
|
||
index,
|
||
key,
|
||
style
|
||
}) {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_5___default.a.listRow,
|
||
key: key,
|
||
style: style
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_5___default.a.listIndex
|
||
}, index + 1
|
||
/* one indexed */
|
||
), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_5___default.a.listValue,
|
||
dataIndex: index,
|
||
style: {
|
||
background: this.props.categoryColor
|
||
},
|
||
onClick: this.props.draggable ? this.handleEventFactory(index) : null
|
||
}, this.props.draggable && this.props.activeIndex === index ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_5___default.a.inputWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("input", {
|
||
autoFocus: true,
|
||
autoComplete: false,
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_monitor_css__WEBPACK_IMPORTED_MODULE_5___default.a.listInput, 'no-drag'),
|
||
spellCheck: false,
|
||
type: "text",
|
||
value: this.props.activeValue,
|
||
onBlur: this.props.onDeactivate,
|
||
onChange: this.props.onInput,
|
||
onFocus: this.props.onFocus,
|
||
onKeyDown: this.props.onKeyPress // key down to get ahead of blur
|
||
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_5___default.a.removeButton,
|
||
onMouseDown: this.props.onRemove // mousedown to get ahead of blur
|
||
|
||
}, '✖︎')) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_5___default.a.valueInner
|
||
}, this.props.values[index])));
|
||
}
|
||
|
||
render() {
|
||
const {
|
||
height,
|
||
values,
|
||
width,
|
||
activeIndex,
|
||
activeValue
|
||
} = this.props; // Keep the active index in view if defined, else must be undefined for List component
|
||
|
||
const scrollToIndex = activeIndex === null ? undefined : activeIndex;
|
||
/* eslint-disable-line no-undefined */
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_virtualized__WEBPACK_IMPORTED_MODULE_6__["List"], {
|
||
activeIndex: activeIndex,
|
||
activeValue: activeValue,
|
||
height: height - 42
|
||
/* Header/footer size, approx */
|
||
,
|
||
noRowsRenderer: this.noRowsRenderer,
|
||
rowCount: values.length,
|
||
rowHeight: 24
|
||
/* Row size is same for all rows */
|
||
,
|
||
rowRenderer: this.rowRenderer,
|
||
scrollToIndex: scrollToIndex
|
||
/* eslint-disable-line no-undefined */
|
||
,
|
||
values: values,
|
||
width: width
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
ListMonitorScroller.propTypes = {
|
||
activeIndex: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
activeValue: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
categoryColor: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
draggable: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
onActivate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onDeactivate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onFocus: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onInput: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onKeyPress: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onRemove: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
values: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number])),
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (ListMonitorScroller);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/monitor/list-monitor.jsx":
|
||
/*!*************************************************!*\
|
||
!*** ./src/components/monitor/list-monitor.jsx ***!
|
||
\*************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _monitor_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./monitor.css */ "./src/components/monitor/monitor.css");
|
||
/* harmony import */ var _monitor_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_monitor_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _list_monitor_scroller_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./list-monitor-scroller.jsx */ "./src/components/monitor/list-monitor-scroller.jsx");
|
||
const _excluded = ["draggable", "label", "width", "height", "value", "onResizeMouseDown", "onAdd"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const ListMonitor = _ref => {
|
||
let {
|
||
draggable,
|
||
label,
|
||
width,
|
||
height,
|
||
value,
|
||
onResizeMouseDown,
|
||
onAdd
|
||
} = _ref,
|
||
rowProps = _objectWithoutProperties(_ref, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_4___default.a.listMonitor,
|
||
style: {
|
||
width: "".concat(width, "px"),
|
||
height: "".concat(height, "px")
|
||
}
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_4___default.a.listHeader
|
||
}, label), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_4___default.a.listBody
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_list_monitor_scroller_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], _extends({
|
||
draggable: draggable,
|
||
height: height,
|
||
values: value,
|
||
width: width
|
||
}, rowProps))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_4___default.a.listFooter
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(draggable ? _monitor_css__WEBPACK_IMPORTED_MODULE_4___default.a.addButton : null, 'no-drag'),
|
||
onClick: draggable ? onAdd : null
|
||
}, '+'
|
||
/* TODO waiting on asset */
|
||
), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_4___default.a.footerLength
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "length {length}",
|
||
id: "gui.monitor.listMonitor.listLength",
|
||
values: {
|
||
length: value.length
|
||
}
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(draggable ? _monitor_css__WEBPACK_IMPORTED_MODULE_4___default.a.resizeHandle : null, 'no-drag'),
|
||
onMouseDown: draggable ? onResizeMouseDown : null
|
||
}, '='
|
||
/* TODO waiting on asset */
|
||
)));
|
||
};
|
||
|
||
ListMonitor.propTypes = {
|
||
activeIndex: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
categoryColor: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
draggable: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
label: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
onActivate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onAdd: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onResizeMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
value: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number]))]),
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
};
|
||
ListMonitor.defaultProps = {
|
||
width: 110,
|
||
height: 200
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (ListMonitor);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/monitor/monitor.css":
|
||
/*!********************************************!*\
|
||
!*** ./src/components/monitor/monitor.css ***!
|
||
\********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./monitor.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/monitor/monitor.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/monitor/monitor.jsx":
|
||
/*!********************************************!*\
|
||
!*** ./src/components/monitor/monitor.jsx ***!
|
||
\********************************************/
|
||
/*! exports provided: default, monitorModes */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MonitorComponent; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "monitorModes", function() { return monitorModes; });
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ "./node_modules/react-dom/index.js");
|
||
/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_draggable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-draggable */ "./node_modules/react-draggable/dist/react-draggable.js");
|
||
/* harmony import */ var react_draggable__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_draggable__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var react_contextmenu__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-contextmenu */ "./node_modules/react-contextmenu/es6/index.js");
|
||
/* harmony import */ var _context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../context-menu/context-menu.jsx */ "./src/components/context-menu/context-menu.jsx");
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _default_monitor_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./default-monitor.jsx */ "./src/components/monitor/default-monitor.jsx");
|
||
/* harmony import */ var _large_monitor_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./large-monitor.jsx */ "./src/components/monitor/large-monitor.jsx");
|
||
/* harmony import */ var _containers_slider_monitor_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../containers/slider-monitor.jsx */ "./src/containers/slider-monitor.jsx");
|
||
/* harmony import */ var _containers_list_monitor_jsx__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../containers/list-monitor.jsx */ "./src/containers/list-monitor.jsx");
|
||
/* harmony import */ var _monitor_css__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./monitor.css */ "./src/components/monitor/monitor.css");
|
||
/* harmony import */ var _monitor_css__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_monitor_css__WEBPACK_IMPORTED_MODULE_12__);
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const categories = {
|
||
data: '#FF8C1A',
|
||
sensing: '#5CB1D6',
|
||
sound: '#CF63CF',
|
||
looks: '#9966FF',
|
||
motion: '#4C97FF',
|
||
list: '#FC662C',
|
||
extension: '#0FBD8C'
|
||
};
|
||
const modes = {
|
||
default: _default_monitor_jsx__WEBPACK_IMPORTED_MODULE_8__["default"],
|
||
large: _large_monitor_jsx__WEBPACK_IMPORTED_MODULE_9__["default"],
|
||
slider: _containers_slider_monitor_jsx__WEBPACK_IMPORTED_MODULE_10__["default"],
|
||
list: _containers_list_monitor_jsx__WEBPACK_IMPORTED_MODULE_11__["default"]
|
||
};
|
||
|
||
const MonitorComponent = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_contextmenu__WEBPACK_IMPORTED_MODULE_5__["ContextMenuTrigger"] // TW: if export is defined, we always show it, even outside of the editor
|
||
, {
|
||
disable: !props.draggable && !props.onExport,
|
||
holdToDisplay: props.mode === 'slider' ? -1 : 1000,
|
||
id: "monitor-".concat(props.label)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_draggable__WEBPACK_IMPORTED_MODULE_3___default.a, {
|
||
bounds: ".monitor-overlay" // Class for monitor container
|
||
,
|
||
cancel: ".no-drag" // Class used for slider input to prevent drag
|
||
,
|
||
defaultClassNameDragging: _monitor_css__WEBPACK_IMPORTED_MODULE_12___default.a.dragging,
|
||
disabled: !props.draggable,
|
||
onStop: props.onDragEnd
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_12___default.a.monitorContainer,
|
||
componentRef: props.componentRef,
|
||
onDoubleClick: props.mode === 'list' || !props.draggable ? null : props.onNextMode,
|
||
"data-id": props.id,
|
||
"data-opcode": props.opcode
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(modes[props.mode], _objectSpread({
|
||
categoryColor: categories[props.category]
|
||
}, props)))), /*#__PURE__*/react_dom__WEBPACK_IMPORTED_MODULE_1___default.a.createPortal(
|
||
/*#__PURE__*/
|
||
// Use a portal to render the context menu outside the flow to avoid
|
||
// positioning conflicts between the monitors `transform: scale` and
|
||
// the context menus `position: fixed`. For more details, see
|
||
// http://meyerweb.com/eric/thoughts/2011/09/12/un-fixing-fixed-elements-with-css-transforms/
|
||
react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__["ContextMenu"], {
|
||
id: "monitor-".concat(props.label)
|
||
}, props.draggable && props.onSetModeToDefault && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__["MenuItem"], {
|
||
onClick: props.onSetModeToDefault
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "normal readout",
|
||
id: "gui.monitor.contextMenu.default"
|
||
})), props.draggable && props.onSetModeToLarge && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__["MenuItem"], {
|
||
onClick: props.onSetModeToLarge
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "large readout",
|
||
id: "gui.monitor.contextMenu.large"
|
||
})), props.draggable && props.onSetModeToSlider && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__["MenuItem"], {
|
||
onClick: props.onSetModeToSlider
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "slider",
|
||
id: "gui.monitor.contextMenu.slider"
|
||
})), props.draggable && props.onSliderPromptOpen && props.mode === 'slider' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__["BorderedMenuItem"], {
|
||
onClick: props.onSliderPromptOpen
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "change slider range",
|
||
id: "gui.monitor.contextMenu.sliderRange"
|
||
})), props.onImport && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__["MenuItem"], {
|
||
onClick: props.onImport
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "import",
|
||
id: "gui.monitor.contextMenu.import"
|
||
})), props.onExport && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__["MenuItem"], {
|
||
onClick: props.onExport
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "export",
|
||
id: "gui.monitor.contextMenu.export"
|
||
})), props.draggable && props.onHide && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__["BorderedMenuItem"], {
|
||
onClick: props.onHide
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "hide",
|
||
id: "gui.monitor.contextMenu.hide"
|
||
}))), document.body));
|
||
|
||
MonitorComponent.categories = categories;
|
||
const monitorModes = Object.keys(modes);
|
||
MonitorComponent.propTypes = {
|
||
category: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(Object.keys(categories)),
|
||
componentRef: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
draggable: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string.isRequired,
|
||
label: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string.isRequired,
|
||
mode: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(monitorModes),
|
||
opcode: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string.isRequired,
|
||
onDragEnd: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onExport: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onImport: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onHide: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onNextMode: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onSetModeToDefault: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onSetModeToLarge: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onSetModeToSlider: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onSliderPromptOpen: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func
|
||
};
|
||
MonitorComponent.defaultProps = {
|
||
category: 'extension',
|
||
mode: 'default'
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/monitor/slider-monitor.jsx":
|
||
/*!***************************************************!*\
|
||
!*** ./src/components/monitor/slider-monitor.jsx ***!
|
||
\***************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _monitor_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./monitor.css */ "./src/components/monitor/monitor.css");
|
||
/* harmony import */ var _monitor_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_monitor_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
|
||
|
||
|
||
|
||
|
||
const SliderMonitor = ({
|
||
categoryColor,
|
||
isDiscrete,
|
||
label,
|
||
min,
|
||
max,
|
||
value,
|
||
onSliderUpdate
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_3___default.a.defaultMonitor
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_3___default.a.row
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_3___default.a.label
|
||
}, label), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_3___default.a.value,
|
||
style: {
|
||
background: categoryColor
|
||
}
|
||
}, value)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _monitor_css__WEBPACK_IMPORTED_MODULE_3___default.a.row
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("input", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_monitor_css__WEBPACK_IMPORTED_MODULE_3___default.a.slider, 'no-drag') // Class used on parent Draggable to prevent drags
|
||
,
|
||
max: max,
|
||
min: min,
|
||
step: isDiscrete ? 1 : 0.01,
|
||
type: "range",
|
||
value: value,
|
||
onChange: onSliderUpdate
|
||
})));
|
||
|
||
SliderMonitor.propTypes = {
|
||
categoryColor: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
isDiscrete: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
label: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
max: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
min: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
onSliderUpdate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
value: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number])
|
||
};
|
||
SliderMonitor.defaultProps = {
|
||
isDiscrete: true,
|
||
min: 0,
|
||
max: 100
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (SliderMonitor);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/play-button/icon--play.svg":
|
||
/*!***************************************************!*\
|
||
!*** ./src/components/play-button/icon--play.svg ***!
|
||
\***************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/df6a71244d4727d19c5a78d71677d2a6.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/play-button/icon--stop.svg":
|
||
/*!***************************************************!*\
|
||
!*** ./src/components/play-button/icon--stop.svg ***!
|
||
\***************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/a4d91e3b83e7cbccaf4a4e2322b873f5.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/play-button/play-button.css":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/play-button/play-button.css ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./play-button.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/play-button/play-button.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/play-button/play-button.jsx":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/play-button/play-button.jsx ***!
|
||
\****************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _play_button_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./play-button.css */ "./src/components/play-button/play-button.css");
|
||
/* harmony import */ var _play_button_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_play_button_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _icon_play_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./icon--play.svg */ "./src/components/play-button/icon--play.svg");
|
||
/* harmony import */ var _icon_play_svg__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_icon_play_svg__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _icon_stop_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icon--stop.svg */ "./src/components/play-button/icon--stop.svg");
|
||
/* harmony import */ var _icon_stop_svg__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_icon_stop_svg__WEBPACK_IMPORTED_MODULE_6__);
|
||
const _excluded = ["className", "intl", "isPlaying", "onClick", "onMouseDown", "onMouseEnter", "onMouseLeave", "setButtonRef"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
play: {
|
||
"id": "gui.playButton.play",
|
||
"defaultMessage": "Play"
|
||
},
|
||
stop: {
|
||
"id": "gui.playButton.stop",
|
||
"defaultMessage": "Stop"
|
||
}
|
||
});
|
||
|
||
const PlayButtonComponent = _ref => {
|
||
let {
|
||
className,
|
||
intl,
|
||
isPlaying,
|
||
onClick,
|
||
onMouseDown,
|
||
onMouseEnter,
|
||
onMouseLeave,
|
||
setButtonRef
|
||
} = _ref,
|
||
props = _objectWithoutProperties(_ref, _excluded);
|
||
|
||
const label = isPlaying ? intl.formatMessage(messages.stop) : intl.formatMessage(messages.play);
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", _extends({
|
||
"aria-label": label,
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_play_button_css__WEBPACK_IMPORTED_MODULE_4___default.a.playButton, className, {
|
||
[_play_button_css__WEBPACK_IMPORTED_MODULE_4___default.a.playing]: isPlaying
|
||
}),
|
||
onClick: onClick,
|
||
onMouseDown: onMouseDown,
|
||
onMouseEnter: onMouseEnter,
|
||
onMouseLeave: onMouseLeave,
|
||
ref: setButtonRef
|
||
}, props), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _play_button_css__WEBPACK_IMPORTED_MODULE_4___default.a.playIcon,
|
||
draggable: false,
|
||
src: isPlaying ? _icon_stop_svg__WEBPACK_IMPORTED_MODULE_6___default.a : _icon_play_svg__WEBPACK_IMPORTED_MODULE_5___default.a
|
||
}));
|
||
};
|
||
|
||
PlayButtonComponent.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"],
|
||
isPlaying: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onMouseEnter: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onMouseLeave: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
setButtonRef: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(PlayButtonComponent));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/prompt/prompt.css":
|
||
/*!******************************************!*\
|
||
!*** ./src/components/prompt/prompt.css ***!
|
||
\******************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./prompt.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/prompt/prompt.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/prompt/prompt.jsx":
|
||
/*!******************************************!*\
|
||
!*** ./src/components/prompt/prompt.jsx ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _containers_modal_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../containers/modal.jsx */ "./src/containers/modal.jsx");
|
||
/* harmony import */ var _prompt_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./prompt.css */ "./src/components/prompt/prompt.css");
|
||
/* harmony import */ var _prompt_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_prompt_css__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _lib_tw_cloud_limits_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib/tw-cloud-limits.js */ "./src/lib/tw-cloud-limits.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_1__["defineMessages"])({
|
||
forAllSpritesMessage: {
|
||
"id": "gui.gui.variableScopeOptionAllSprites",
|
||
"defaultMessage": "For all sprites"
|
||
},
|
||
forThisSpriteMessage: {
|
||
"id": "gui.gui.variableScopeOptionSpriteOnly",
|
||
"defaultMessage": "For this sprite only"
|
||
},
|
||
cloudVarOptionMessage: {
|
||
"id": "gui.gui.cloudVariableOption",
|
||
"defaultMessage": "Cloud variable (stored on server)"
|
||
},
|
||
availableToAllSpritesMessage: {
|
||
"id": "gui.gui.variablePromptAllSpritesMessage",
|
||
"defaultMessage": "This variable will be available to all sprites."
|
||
},
|
||
listAvailableToAllSpritesMessage: {
|
||
"id": "gui.gui.listPromptAllSpritesMessage",
|
||
"defaultMessage": "This list will be available to all sprites."
|
||
}
|
||
});
|
||
|
||
const PromptComponent = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_modal_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _prompt_css__WEBPACK_IMPORTED_MODULE_6___default.a.modalContent,
|
||
contentLabel: props.title,
|
||
onRequestClose: props.onCancel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _prompt_css__WEBPACK_IMPORTED_MODULE_6___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _prompt_css__WEBPACK_IMPORTED_MODULE_6___default.a.label
|
||
}, props.label), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", {
|
||
autoFocus: true,
|
||
className: _prompt_css__WEBPACK_IMPORTED_MODULE_6___default.a.variableNameTextInput,
|
||
defaultValue: props.defaultValue,
|
||
name: props.label,
|
||
onChange: props.onChange,
|
||
onFocus: props.onFocus,
|
||
onKeyPress: props.onKeyPress
|
||
})), props.showVariableOptions ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", null, props.isStage ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _prompt_css__WEBPACK_IMPORTED_MODULE_6___default.a.infoMessage
|
||
}, props.showListMessage ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], messages.listAvailableToAllSpritesMessage) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], messages.availableToAllSpritesMessage)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _prompt_css__WEBPACK_IMPORTED_MODULE_6___default.a.optionsRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("label", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", {
|
||
checked: props.globalSelected,
|
||
name: "variableScopeOption",
|
||
type: "radio",
|
||
value: "global",
|
||
onChange: props.onScopeOptionSelection
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], messages.forAllSpritesMessage)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("label", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()({
|
||
[_prompt_css__WEBPACK_IMPORTED_MODULE_6___default.a.disabledLabel]: props.cloudSelected
|
||
})
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", {
|
||
checked: !props.globalSelected,
|
||
disabled: props.cloudSelected,
|
||
name: "variableScopeOption",
|
||
type: "radio",
|
||
value: "local",
|
||
onChange: props.onScopeOptionSelection
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], messages.forThisSpriteMessage))), props.showCloudOption ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_prompt_css__WEBPACK_IMPORTED_MODULE_6___default.a.cloudOption)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("label", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()({
|
||
[_prompt_css__WEBPACK_IMPORTED_MODULE_6___default.a.disabledLabel]: !props.canAddCloudVariable
|
||
})
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", {
|
||
checked: props.cloudSelected && props.canAddCloudVariable,
|
||
disabled: !props.canAddCloudVariable,
|
||
type: "checkbox",
|
||
onChange: props.onCloudVarOptionChange
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], messages.cloudVarOptionMessage))) : null) : null, props.cloudSelected && !props.isAddingCloudVariableScratchSafe && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _prompt_css__WEBPACK_IMPORTED_MODULE_6___default.a.infoMessage
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "If you make this cloud variable, the project will exceed Scratch's limit of {number} variables, and some variables will not function if you upload the project to Scratch." // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.scratchUnsafeCloud",
|
||
values: {
|
||
number: _lib_tw_cloud_limits_js__WEBPACK_IMPORTED_MODULE_7__["SCRATCH_MAX_CLOUD_VARIABLES"]
|
||
}
|
||
})), props.cloudSelected && props.canAddCloudVariable && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _prompt_css__WEBPACK_IMPORTED_MODULE_6___default.a.infoMessage
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"]
|
||
/* eslint-disable-next-line max-len */
|
||
, {
|
||
defaultMessage: "Although you can create cloud variables, they won't work unless this project is uploaded to Scratch or converted using a tool like the {packager}.",
|
||
values: {
|
||
packager: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("a", {
|
||
href: "https://packager.turbowarp.org",
|
||
target: "_blank",
|
||
rel: "noopener noreferrer"
|
||
}, 'TurboWarp Packager')
|
||
},
|
||
id: "tw.cantUseCloud"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _prompt_css__WEBPACK_IMPORTED_MODULE_6___default.a.buttonRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
|
||
className: _prompt_css__WEBPACK_IMPORTED_MODULE_6___default.a.cancelButton,
|
||
onClick: props.onCancel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Cancel",
|
||
id: "gui.prompt.cancel"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
|
||
className: _prompt_css__WEBPACK_IMPORTED_MODULE_6___default.a.okButton,
|
||
onClick: props.onOk
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "OK",
|
||
id: "gui.prompt.ok"
|
||
})))));
|
||
|
||
PromptComponent.propTypes = {
|
||
isAddingCloudVariableScratchSafe: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,
|
||
canAddCloudVariable: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,
|
||
cloudSelected: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,
|
||
defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
globalSelected: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,
|
||
isStage: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,
|
||
showListMessage: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,
|
||
label: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string.isRequired,
|
||
onCancel: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onChange: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onCloudVarOptionChange: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onFocus: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onKeyPress: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onOk: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onScopeOptionSelection: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
showCloudOption: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,
|
||
showVariableOptions: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (PromptComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/question/icon--enter.svg":
|
||
/*!*************************************************!*\
|
||
!*** ./src/components/question/icon--enter.svg ***!
|
||
\*************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/27f90bfa982840e56c3ad207561193fa.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/question/question.css":
|
||
/*!**********************************************!*\
|
||
!*** ./src/components/question/question.css ***!
|
||
\**********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./question.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/question/question.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/question/question.jsx":
|
||
/*!**********************************************!*\
|
||
!*** ./src/components/question/question.jsx ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _question_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question.css */ "./src/components/question/question.css");
|
||
/* harmony import */ var _question_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_question_css__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _forms_input_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../forms/input.jsx */ "./src/components/forms/input.jsx");
|
||
/* harmony import */ var _icon_enter_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./icon--enter.svg */ "./src/components/question/icon--enter.svg");
|
||
/* harmony import */ var _icon_enter_svg__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_icon_enter_svg__WEBPACK_IMPORTED_MODULE_4__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const QuestionComponent = props => {
|
||
const {
|
||
answer,
|
||
className,
|
||
question,
|
||
onChange,
|
||
onClick,
|
||
onKeyPress
|
||
} = props;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: className
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _question_css__WEBPACK_IMPORTED_MODULE_2___default.a.questionContainer
|
||
}, question ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _question_css__WEBPACK_IMPORTED_MODULE_2___default.a.questionLabel
|
||
}, question) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _question_css__WEBPACK_IMPORTED_MODULE_2___default.a.questionInput
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_forms_input_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
autoFocus: true,
|
||
value: answer,
|
||
onChange: onChange,
|
||
onKeyPress: onKeyPress
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
|
||
className: _question_css__WEBPACK_IMPORTED_MODULE_2___default.a.questionSubmitButton,
|
||
onClick: onClick
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _question_css__WEBPACK_IMPORTED_MODULE_2___default.a.questionSubmitButtonIcon,
|
||
draggable: false,
|
||
src: _icon_enter_svg__WEBPACK_IMPORTED_MODULE_4___default.a
|
||
})))));
|
||
};
|
||
|
||
QuestionComponent.propTypes = {
|
||
answer: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
onChange: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onKeyPress: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
question: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (QuestionComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/record-modal/icon--back.svg":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/record-modal/icon--back.svg ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/21988681fa28c8ce37982ca26463a6f5.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/record-modal/icon--play.svg":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/record-modal/icon--play.svg ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/d889a872f3b0985b28fa872764172ef1.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/record-modal/icon--stop-playback.svg":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/components/record-modal/icon--stop-playback.svg ***!
|
||
\*************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/26255153f92ea41df149a58d3c3fe2cf.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/record-modal/icon--stop-recording.svg":
|
||
/*!**************************************************************!*\
|
||
!*** ./src/components/record-modal/icon--stop-recording.svg ***!
|
||
\**************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/993a0700d8a0972d309307b0a4688ed7.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/record-modal/playback-step.jsx":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/record-modal/playback-step.jsx ***!
|
||
\*******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _waveform_waveform_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../waveform/waveform.jsx */ "./src/components/waveform/waveform.jsx");
|
||
/* harmony import */ var _meter_meter_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../meter/meter.jsx */ "./src/components/meter/meter.jsx");
|
||
/* harmony import */ var _containers_audio_trimmer_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../containers/audio-trimmer.jsx */ "./src/containers/audio-trimmer.jsx");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _record_modal_css__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./record-modal.css */ "./src/components/record-modal/record-modal.css");
|
||
/* harmony import */ var _record_modal_css__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_record_modal_css__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _icon_back_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./icon--back.svg */ "./src/components/record-modal/icon--back.svg");
|
||
/* harmony import */ var _icon_back_svg__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_icon_back_svg__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var _icon_stop_playback_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./icon--stop-playback.svg */ "./src/components/record-modal/icon--stop-playback.svg");
|
||
/* harmony import */ var _icon_stop_playback_svg__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_icon_stop_playback_svg__WEBPACK_IMPORTED_MODULE_9__);
|
||
/* harmony import */ var _icon_play_svg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./icon--play.svg */ "./src/components/record-modal/icon--play.svg");
|
||
/* harmony import */ var _icon_play_svg__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_icon_play_svg__WEBPACK_IMPORTED_MODULE_10__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_6__["defineMessages"])({
|
||
stopMsg: {
|
||
"id": "gui.playbackStep.stopMsg",
|
||
"defaultMessage": "Stop"
|
||
},
|
||
playMsg: {
|
||
"id": "gui.playbackStep.playMsg",
|
||
"defaultMessage": "Play"
|
||
},
|
||
loadingMsg: {
|
||
"id": "gui.playbackStep.loadingMsg",
|
||
"defaultMessage": "Loading..."
|
||
},
|
||
saveMsg: {
|
||
"id": "gui.playbackStep.saveMsg",
|
||
"defaultMessage": "Save"
|
||
},
|
||
reRecordMsg: {
|
||
"id": "gui.playbackStep.reRecordMsg",
|
||
"defaultMessage": "Re-record"
|
||
}
|
||
});
|
||
|
||
const PlaybackStep = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.visualizationContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.meterContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_meter_meter_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
height: 172,
|
||
level: 0,
|
||
width: 20
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.waveformContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_waveform_waveform_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
data: props.levels,
|
||
height: 150,
|
||
level: 0,
|
||
width: 480
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_audio_trimmer_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
playhead: props.playhead,
|
||
trimEnd: props.trimEnd,
|
||
trimStart: props.trimStart,
|
||
onSetTrimEnd: props.onSetTrimEnd,
|
||
onSetTrimStart: props.onSetTrimStart
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.mainButtonRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.mainButton,
|
||
onClick: props.playing ? props.onStopPlaying : props.onPlay
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: props.playing ? _icon_stop_playback_svg__WEBPACK_IMPORTED_MODULE_9___default.a : _icon_play_svg__WEBPACK_IMPORTED_MODULE_10___default.a
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.helpText
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.playingText
|
||
}, props.playing ? props.intl.formatMessage(messages.stopMsg) : props.intl.formatMessage(messages.playMsg))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.buttonRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.rerecordButton,
|
||
onClick: props.onBack
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: _icon_back_svg__WEBPACK_IMPORTED_MODULE_8___default.a
|
||
}), props.intl.formatMessage(messages.reRecordMsg)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.okButton,
|
||
disabled: props.encoding,
|
||
onClick: props.onSubmit
|
||
}, props.encoding ? props.intl.formatMessage(messages.loadingMsg) : props.intl.formatMessage(messages.saveMsg))));
|
||
|
||
PlaybackStep.propTypes = {
|
||
encoding: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_6__["intlShape"].isRequired,
|
||
levels: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number).isRequired,
|
||
onBack: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onPlay: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onSetTrimEnd: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onSetTrimStart: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onStopPlaying: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onSubmit: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
playhead: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
playing: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
trimEnd: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number.isRequired,
|
||
trimStart: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_6__["injectIntl"])(PlaybackStep));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/record-modal/record-modal.css":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/record-modal/record-modal.css ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./record-modal.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/record-modal/record-modal.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/record-modal/record-modal.jsx":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/record-modal/record-modal.jsx ***!
|
||
\******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _containers_recording_step_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../containers/recording-step.jsx */ "./src/containers/recording-step.jsx");
|
||
/* harmony import */ var _containers_playback_step_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../containers/playback-step.jsx */ "./src/containers/playback-step.jsx");
|
||
/* harmony import */ var _containers_modal_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../containers/modal.jsx */ "./src/containers/modal.jsx");
|
||
/* harmony import */ var _record_modal_css__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./record-modal.css */ "./src/components/record-modal/record-modal.css");
|
||
/* harmony import */ var _record_modal_css__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_record_modal_css__WEBPACK_IMPORTED_MODULE_7__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
title: {
|
||
"id": "gui.recordModal.title",
|
||
"defaultMessage": "Record Sound"
|
||
}
|
||
});
|
||
|
||
const RecordModal = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_modal_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.modalContent,
|
||
contentLabel: props.intl.formatMessage(messages.title),
|
||
onRequestClose: props.onCancel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.body
|
||
}, props.samples ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_playback_step_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
encoding: props.encoding,
|
||
levels: props.levels,
|
||
playhead: props.playhead,
|
||
playing: props.playing,
|
||
sampleRate: props.sampleRate,
|
||
samples: props.samples,
|
||
trimEnd: props.trimEnd,
|
||
trimStart: props.trimStart,
|
||
onBack: props.onBack,
|
||
onPlay: props.onPlay,
|
||
onSetPlayhead: props.onSetPlayhead,
|
||
onSetTrimEnd: props.onSetTrimEnd,
|
||
onSetTrimStart: props.onSetTrimStart,
|
||
onStopPlaying: props.onStopPlaying,
|
||
onSubmit: props.onSubmit
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_recording_step_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
recording: props.recording,
|
||
onRecord: props.onRecord,
|
||
onStopRecording: props.onStopRecording
|
||
})));
|
||
|
||
RecordModal.propTypes = {
|
||
encoding: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"].isRequired,
|
||
levels: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number),
|
||
onBack: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onCancel: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onPlay: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onRecord: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onSetPlayhead: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onSetTrimEnd: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onSetTrimStart: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onStopPlaying: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onStopRecording: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onSubmit: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
playhead: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
playing: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
recording: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
sampleRate: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
samples: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(Float32Array),
|
||
trimEnd: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number.isRequired,
|
||
trimStart: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(RecordModal));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/record-modal/recording-step.jsx":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/record-modal/recording-step.jsx ***!
|
||
\********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _meter_meter_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../meter/meter.jsx */ "./src/components/meter/meter.jsx");
|
||
/* harmony import */ var _waveform_waveform_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../waveform/waveform.jsx */ "./src/components/waveform/waveform.jsx");
|
||
/* harmony import */ var _record_modal_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./record-modal.css */ "./src/components/record-modal/record-modal.css");
|
||
/* harmony import */ var _record_modal_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_record_modal_css__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _icon_stop_recording_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./icon--stop-recording.svg */ "./src/components/record-modal/icon--stop-recording.svg");
|
||
/* harmony import */ var _icon_stop_recording_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_icon_stop_recording_svg__WEBPACK_IMPORTED_MODULE_7__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["defineMessages"])({
|
||
beginRecord: {
|
||
"id": "gui.recordingStep.beginRecord",
|
||
"defaultMessage": "Begin recording by clicking the button below"
|
||
},
|
||
permission: {
|
||
"id": "gui.recordingStep.permission",
|
||
"defaultMessage": "{arrow}We need your permission to use your microphone"
|
||
},
|
||
stop: {
|
||
"id": "gui.recordingStep.stop",
|
||
"defaultMessage": "Stop recording"
|
||
},
|
||
record: {
|
||
"id": "gui.recordingStep.record",
|
||
"defaultMessage": "Record"
|
||
}
|
||
});
|
||
|
||
const RecordingStep = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.visualizationContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.meterContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_meter_meter_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
height: 172,
|
||
level: props.level,
|
||
width: 20
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.waveformContainer
|
||
}, props.levels ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_waveform_waveform_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
data: props.levels,
|
||
height: 150,
|
||
level: 0,
|
||
width: 440
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.helpText
|
||
}, props.listening ? props.intl.formatMessage(messages.beginRecord) : props.intl.formatMessage(messages.permission, {
|
||
arrow: props.isRtl ? '↗️ \u00A0' : '↖️ \u00A0'
|
||
})))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.mainButtonRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.mainButton,
|
||
disabled: !props.listening,
|
||
onClick: props.recording ? props.onStopRecording : props.onRecord
|
||
}, props.recording ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: _icon_stop_recording_svg__WEBPACK_IMPORTED_MODULE_7___default.a
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("svg", {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.recordButton,
|
||
height: "52",
|
||
width: "52"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("circle", {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.recordButtonCircle,
|
||
cx: "26",
|
||
cy: "26",
|
||
r: "25"
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("circle", {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.recordButtonCircleOutline,
|
||
cx: "26",
|
||
cy: "26",
|
||
r: 27 + props.level * 5
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.helpText
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
|
||
className: _record_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.recordingText
|
||
}, props.recording ? props.intl.formatMessage(messages.stop) : props.intl.formatMessage(messages.record))))));
|
||
|
||
RecordingStep.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_2__["intlShape"].isRequired,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
level: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
levels: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number),
|
||
listening: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
onRecord: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onStopRecording: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
recording: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["injectIntl"])(RecordingStep));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/slider-prompt/slider-prompt.css":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/slider-prompt/slider-prompt.css ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./slider-prompt.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/slider-prompt/slider-prompt.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/slider-prompt/slider-prompt.jsx":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/slider-prompt/slider-prompt.jsx ***!
|
||
\********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _containers_modal_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../containers/modal.jsx */ "./src/containers/modal.jsx");
|
||
/* harmony import */ var _slider_prompt_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./slider-prompt.css */ "./src/components/slider-prompt/slider-prompt.css");
|
||
/* harmony import */ var _slider_prompt_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_slider_prompt_css__WEBPACK_IMPORTED_MODULE_5__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["defineMessages"])({
|
||
minValue: {
|
||
"id": "gui.sliderModal.min",
|
||
"defaultMessage": "Minimum value"
|
||
},
|
||
maxValue: {
|
||
"id": "gui.sliderModal.max",
|
||
"defaultMessage": "Maximum value"
|
||
},
|
||
title: {
|
||
"id": "gui.sliderModal.title",
|
||
"defaultMessage": "Change slider range"
|
||
}
|
||
});
|
||
|
||
const SliderPromptComponent = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_containers_modal_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _slider_prompt_css__WEBPACK_IMPORTED_MODULE_5___default.a.modalContent,
|
||
contentLabel: props.intl.formatMessage(messages.title),
|
||
id: "sliderPrompt",
|
||
onRequestClose: props.onCancel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _slider_prompt_css__WEBPACK_IMPORTED_MODULE_5___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _slider_prompt_css__WEBPACK_IMPORTED_MODULE_5___default.a.label
|
||
}, props.intl.formatMessage(messages.minValue)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("input", {
|
||
className: _slider_prompt_css__WEBPACK_IMPORTED_MODULE_5___default.a.minInput,
|
||
name: props.intl.formatMessage(messages.minValue),
|
||
pattern: "-?[0-9]*(\\.[0-9]+)?",
|
||
type: "text",
|
||
value: props.minValue,
|
||
onChange: props.onChangeMin,
|
||
onKeyPress: props.onKeyPress
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _slider_prompt_css__WEBPACK_IMPORTED_MODULE_5___default.a.label
|
||
}, props.intl.formatMessage(messages.maxValue)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("input", {
|
||
className: _slider_prompt_css__WEBPACK_IMPORTED_MODULE_5___default.a.maxInput,
|
||
name: props.intl.formatMessage(messages.maxValue),
|
||
pattern: "-?[0-9]*(\\.[0-9]+)?",
|
||
type: "text",
|
||
value: props.maxValue,
|
||
onChange: props.onChangeMax,
|
||
onKeyPress: props.onKeyPress
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _slider_prompt_css__WEBPACK_IMPORTED_MODULE_5___default.a.buttonRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _slider_prompt_css__WEBPACK_IMPORTED_MODULE_5___default.a.cancelButton,
|
||
onClick: props.onCancel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Cancel",
|
||
id: "gui.sliderPrompt.cancel"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _slider_prompt_css__WEBPACK_IMPORTED_MODULE_5___default.a.okButton,
|
||
onClick: props.onOk
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "OK",
|
||
id: "gui.sliderPrompt.ok"
|
||
})))));
|
||
|
||
SliderPromptComponent.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_0__["intlShape"],
|
||
maxValue: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
minValue: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onCancel: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onChangeMax: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onChangeMin: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onKeyPress: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onOk: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["injectIntl"])(SliderPromptComponent));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--copy-to-new.svg":
|
||
/*!***********************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--copy-to-new.svg ***!
|
||
\***********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/f0f9f818bc9fff5dc6f30f34cb1cc156.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--copy.svg":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--copy.svg ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/516274ebe91f61197ef4c62d1dc2024a.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--delete.svg":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--delete.svg ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/193be3815628fb3d90d4d636a0e97f3a.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--echo.svg":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--echo.svg ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/fb3f9fa9be421f5153cd0223c3b0cb87.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--fade-in.svg":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--fade-in.svg ***!
|
||
\*******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/42428924171999cebe3efd5e70b7bc53.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--fade-out.svg":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--fade-out.svg ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/f22d5ea0ef6a46b2a4a174fed722c396.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--faster.svg":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--faster.svg ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/8279ce395d0333b880b8be6d243fd111.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--louder.svg":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--louder.svg ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/b2c44c738c9cbc1a99cd6edfd0c2b85b.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--mute.svg":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--mute.svg ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/e21225ab4b675bc61eed30cfb510c288.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--paste.svg":
|
||
/*!*****************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--paste.svg ***!
|
||
\*****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/5306d1506a03db52b6f918de4c809ca7.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--play.svg":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--play.svg ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/b5257afbe4bcf7953029ddb8f18b24fe.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--redo.svg":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--redo.svg ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/f231056019ffe328e58432393f6102c5.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--reverse.svg":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--reverse.svg ***!
|
||
\*******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/fe5afd6776eac0f7724b132a9ff5057d.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--robot.svg":
|
||
/*!*****************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--robot.svg ***!
|
||
\*****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/199f58b4a80fa56c5d8e032d6da5e9c2.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--slower.svg":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--slower.svg ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/424371873bc8df88d6a305d8727157ab.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--softer.svg":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--softer.svg ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/3547fa1f2678a483a19f46852f36b426.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--stop.svg":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--stop.svg ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/481fbac64b59203d7ddffa564a7537d8.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/icon--undo.svg":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/sound-editor/icon--undo.svg ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/82605c2ddff77109d8fafc0e4cf997ed.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/sound-editor.css":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/sound-editor/sound-editor.css ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./sound-editor.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/sound-editor/sound-editor.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sound-editor/sound-editor.jsx":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/sound-editor/sound-editor.jsx ***!
|
||
\******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _waveform_waveform_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../waveform/waveform.jsx */ "./src/components/waveform/waveform.jsx");
|
||
/* harmony import */ var _forms_label_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../forms/label.jsx */ "./src/components/forms/label.jsx");
|
||
/* harmony import */ var _forms_input_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../forms/input.jsx */ "./src/components/forms/input.jsx");
|
||
/* harmony import */ var _forms_buffered_input_hoc_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../forms/buffered-input-hoc.jsx */ "./src/components/forms/buffered-input-hoc.jsx");
|
||
/* harmony import */ var _containers_audio_selector_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../containers/audio-selector.jsx */ "./src/containers/audio-selector.jsx");
|
||
/* harmony import */ var _icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../icon-button/icon-button.jsx */ "./src/components/icon-button/icon-button.jsx");
|
||
/* harmony import */ var _lib_audio_audio_util_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../lib/audio/audio-util.js */ "./src/lib/audio/audio-util.js");
|
||
/* harmony import */ var _sound_editor_css__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./sound-editor.css */ "./src/components/sound-editor/sound-editor.css");
|
||
/* harmony import */ var _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_sound_editor_css__WEBPACK_IMPORTED_MODULE_11__);
|
||
/* harmony import */ var _icon_play_svg__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./icon--play.svg */ "./src/components/sound-editor/icon--play.svg");
|
||
/* harmony import */ var _icon_play_svg__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_icon_play_svg__WEBPACK_IMPORTED_MODULE_12__);
|
||
/* harmony import */ var _icon_stop_svg__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./icon--stop.svg */ "./src/components/sound-editor/icon--stop.svg");
|
||
/* harmony import */ var _icon_stop_svg__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_icon_stop_svg__WEBPACK_IMPORTED_MODULE_13__);
|
||
/* harmony import */ var _icon_redo_svg__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./icon--redo.svg */ "./src/components/sound-editor/icon--redo.svg");
|
||
/* harmony import */ var _icon_redo_svg__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_icon_redo_svg__WEBPACK_IMPORTED_MODULE_14__);
|
||
/* harmony import */ var _icon_undo_svg__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./icon--undo.svg */ "./src/components/sound-editor/icon--undo.svg");
|
||
/* harmony import */ var _icon_undo_svg__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(_icon_undo_svg__WEBPACK_IMPORTED_MODULE_15__);
|
||
/* harmony import */ var _icon_faster_svg__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./icon--faster.svg */ "./src/components/sound-editor/icon--faster.svg");
|
||
/* harmony import */ var _icon_faster_svg__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(_icon_faster_svg__WEBPACK_IMPORTED_MODULE_16__);
|
||
/* harmony import */ var _icon_slower_svg__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./icon--slower.svg */ "./src/components/sound-editor/icon--slower.svg");
|
||
/* harmony import */ var _icon_slower_svg__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(_icon_slower_svg__WEBPACK_IMPORTED_MODULE_17__);
|
||
/* harmony import */ var _icon_louder_svg__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./icon--louder.svg */ "./src/components/sound-editor/icon--louder.svg");
|
||
/* harmony import */ var _icon_louder_svg__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(_icon_louder_svg__WEBPACK_IMPORTED_MODULE_18__);
|
||
/* harmony import */ var _icon_softer_svg__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./icon--softer.svg */ "./src/components/sound-editor/icon--softer.svg");
|
||
/* harmony import */ var _icon_softer_svg__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(_icon_softer_svg__WEBPACK_IMPORTED_MODULE_19__);
|
||
/* harmony import */ var _icon_robot_svg__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./icon--robot.svg */ "./src/components/sound-editor/icon--robot.svg");
|
||
/* harmony import */ var _icon_robot_svg__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(_icon_robot_svg__WEBPACK_IMPORTED_MODULE_20__);
|
||
/* harmony import */ var _icon_echo_svg__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./icon--echo.svg */ "./src/components/sound-editor/icon--echo.svg");
|
||
/* harmony import */ var _icon_echo_svg__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(_icon_echo_svg__WEBPACK_IMPORTED_MODULE_21__);
|
||
/* harmony import */ var _icon_reverse_svg__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./icon--reverse.svg */ "./src/components/sound-editor/icon--reverse.svg");
|
||
/* harmony import */ var _icon_reverse_svg__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(_icon_reverse_svg__WEBPACK_IMPORTED_MODULE_22__);
|
||
/* harmony import */ var _icon_fade_out_svg__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./icon--fade-out.svg */ "./src/components/sound-editor/icon--fade-out.svg");
|
||
/* harmony import */ var _icon_fade_out_svg__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(_icon_fade_out_svg__WEBPACK_IMPORTED_MODULE_23__);
|
||
/* harmony import */ var _icon_fade_in_svg__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./icon--fade-in.svg */ "./src/components/sound-editor/icon--fade-in.svg");
|
||
/* harmony import */ var _icon_fade_in_svg__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(_icon_fade_in_svg__WEBPACK_IMPORTED_MODULE_24__);
|
||
/* harmony import */ var _icon_mute_svg__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./icon--mute.svg */ "./src/components/sound-editor/icon--mute.svg");
|
||
/* harmony import */ var _icon_mute_svg__WEBPACK_IMPORTED_MODULE_25___default = /*#__PURE__*/__webpack_require__.n(_icon_mute_svg__WEBPACK_IMPORTED_MODULE_25__);
|
||
/* harmony import */ var _icon_delete_svg__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./icon--delete.svg */ "./src/components/sound-editor/icon--delete.svg");
|
||
/* harmony import */ var _icon_delete_svg__WEBPACK_IMPORTED_MODULE_26___default = /*#__PURE__*/__webpack_require__.n(_icon_delete_svg__WEBPACK_IMPORTED_MODULE_26__);
|
||
/* harmony import */ var _icon_copy_svg__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./icon--copy.svg */ "./src/components/sound-editor/icon--copy.svg");
|
||
/* harmony import */ var _icon_copy_svg__WEBPACK_IMPORTED_MODULE_27___default = /*#__PURE__*/__webpack_require__.n(_icon_copy_svg__WEBPACK_IMPORTED_MODULE_27__);
|
||
/* harmony import */ var _icon_paste_svg__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./icon--paste.svg */ "./src/components/sound-editor/icon--paste.svg");
|
||
/* harmony import */ var _icon_paste_svg__WEBPACK_IMPORTED_MODULE_28___default = /*#__PURE__*/__webpack_require__.n(_icon_paste_svg__WEBPACK_IMPORTED_MODULE_28__);
|
||
/* harmony import */ var _icon_copy_to_new_svg__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./icon--copy-to-new.svg */ "./src/components/sound-editor/icon--copy-to-new.svg");
|
||
/* harmony import */ var _icon_copy_to_new_svg__WEBPACK_IMPORTED_MODULE_29___default = /*#__PURE__*/__webpack_require__.n(_icon_copy_to_new_svg__WEBPACK_IMPORTED_MODULE_29__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const BufferedInput = Object(_forms_buffered_input_hoc_jsx__WEBPACK_IMPORTED_MODULE_7__["default"])(_forms_input_jsx__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
sound: {
|
||
"id": "gui.soundEditor.sound",
|
||
"defaultMessage": "Sound"
|
||
},
|
||
play: {
|
||
"id": "gui.soundEditor.play",
|
||
"defaultMessage": "Play"
|
||
},
|
||
stop: {
|
||
"id": "gui.soundEditor.stop",
|
||
"defaultMessage": "Stop"
|
||
},
|
||
copy: {
|
||
"id": "gui.soundEditor.copy",
|
||
"defaultMessage": "Copy"
|
||
},
|
||
paste: {
|
||
"id": "gui.soundEditor.paste",
|
||
"defaultMessage": "Paste"
|
||
},
|
||
copyToNew: {
|
||
"id": "gui.soundEditor.copyToNew",
|
||
"defaultMessage": "Copy to New"
|
||
},
|
||
delete: {
|
||
"id": "gui.soundEditor.delete",
|
||
"defaultMessage": "Delete"
|
||
},
|
||
save: {
|
||
"id": "gui.soundEditor.save",
|
||
"defaultMessage": "Save"
|
||
},
|
||
undo: {
|
||
"id": "gui.soundEditor.undo",
|
||
"defaultMessage": "Undo"
|
||
},
|
||
redo: {
|
||
"id": "gui.soundEditor.redo",
|
||
"defaultMessage": "Redo"
|
||
},
|
||
faster: {
|
||
"id": "gui.soundEditor.faster",
|
||
"defaultMessage": "Faster"
|
||
},
|
||
slower: {
|
||
"id": "gui.soundEditor.slower",
|
||
"defaultMessage": "Slower"
|
||
},
|
||
echo: {
|
||
"id": "gui.soundEditor.echo",
|
||
"defaultMessage": "Echo"
|
||
},
|
||
robot: {
|
||
"id": "gui.soundEditor.robot",
|
||
"defaultMessage": "Robot"
|
||
},
|
||
louder: {
|
||
"id": "gui.soundEditor.louder",
|
||
"defaultMessage": "Louder"
|
||
},
|
||
softer: {
|
||
"id": "gui.soundEditor.softer",
|
||
"defaultMessage": "Softer"
|
||
},
|
||
reverse: {
|
||
"id": "gui.soundEditor.reverse",
|
||
"defaultMessage": "Reverse"
|
||
},
|
||
fadeOut: {
|
||
"id": "gui.soundEditor.fadeOut",
|
||
"defaultMessage": "Fade out"
|
||
},
|
||
fadeIn: {
|
||
"id": "gui.soundEditor.fadeIn",
|
||
"defaultMessage": "Fade in"
|
||
},
|
||
mute: {
|
||
"id": "gui.soundEditor.mute",
|
||
"defaultMessage": "Mute"
|
||
}
|
||
});
|
||
|
||
const formatTime = timeSeconds => {
|
||
const minutes = Math.floor(timeSeconds / 60).toString().padStart(2, '0');
|
||
const seconds = (timeSeconds % 60).toFixed(2).padStart(5, '0');
|
||
return "".concat(minutes, ":").concat(seconds);
|
||
};
|
||
|
||
const formatDuration = (playheadPercent, trimStartPercent, trimEndPercent, durationSeconds) => {
|
||
// If no selection, the trim is the entire sound.
|
||
trimStartPercent = trimStartPercent === null ? 0 : trimStartPercent;
|
||
trimEndPercent = trimEndPercent === null ? 1 : trimEndPercent; // If the playhead doesn't exist, assume it's at the start of the selection.
|
||
|
||
playheadPercent = playheadPercent === null ? trimStartPercent : playheadPercent; // If selection has zero length, treat it as the entire sound being selected.
|
||
// This happens when the user first clicks to start making a selection.
|
||
|
||
const trimSize = trimEndPercent - trimStartPercent || 1;
|
||
const trimDuration = trimSize * durationSeconds;
|
||
const progressInTrim = (playheadPercent - trimStartPercent) / trimSize;
|
||
const currentTime = progressInTrim * trimDuration;
|
||
return "".concat(formatTime(currentTime), " / ").concat(formatTime(trimDuration));
|
||
};
|
||
|
||
const formatSoundSize = bytes => {
|
||
if (bytes > 1000 * 1000) {
|
||
return "".concat((bytes / 1000 / 1000).toFixed(2), "MB");
|
||
}
|
||
|
||
return "".concat((bytes / 1000).toFixed(2), "KB");
|
||
};
|
||
|
||
const SoundEditor = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.editorContainer,
|
||
ref: props.setRef,
|
||
onMouseDown: props.onContainerClick
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.row
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.inputGroup
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_forms_label_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
text: props.intl.formatMessage(messages.sound)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(BufferedInput, {
|
||
tabIndex: "1",
|
||
type: "text",
|
||
value: props.name,
|
||
onSubmit: props.onChangeName,
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.nameInput
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.buttonGroup
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.button,
|
||
disabled: !props.canUndo,
|
||
title: props.intl.formatMessage(messages.undo),
|
||
onClick: props.onUndo
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.undoIcon,
|
||
draggable: false,
|
||
src: _icon_undo_svg__WEBPACK_IMPORTED_MODULE_15___default.a
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.button,
|
||
disabled: !props.canRedo,
|
||
title: props.intl.formatMessage(messages.redo),
|
||
onClick: props.onRedo
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.redoIcon,
|
||
draggable: false,
|
||
src: _icon_redo_svg__WEBPACK_IMPORTED_MODULE_14___default.a
|
||
})))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.inputGroup
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.toolButton,
|
||
img: _icon_copy_svg__WEBPACK_IMPORTED_MODULE_27___default.a,
|
||
title: props.intl.formatMessage(messages.copy),
|
||
onClick: props.onCopy
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.toolButton,
|
||
disabled: props.canPaste === false,
|
||
img: _icon_paste_svg__WEBPACK_IMPORTED_MODULE_28___default.a,
|
||
title: props.intl.formatMessage(messages.paste),
|
||
onClick: props.onPaste
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.toolButton, _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.flipInRtl),
|
||
img: _icon_copy_to_new_svg__WEBPACK_IMPORTED_MODULE_29___default.a,
|
||
title: props.intl.formatMessage(messages.copyToNew),
|
||
onClick: props.onCopyToNew
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.toolButton,
|
||
disabled: props.trimStart === null,
|
||
img: _icon_delete_svg__WEBPACK_IMPORTED_MODULE_26___default.a,
|
||
title: props.intl.formatMessage(messages.delete),
|
||
onClick: props.onDelete
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.row
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.waveformContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_waveform_waveform_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
data: props.chunkLevels,
|
||
height: 160,
|
||
width: 600
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_audio_selector_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], {
|
||
playhead: props.playhead,
|
||
trimEnd: props.trimEnd,
|
||
trimStart: props.trimStart,
|
||
onPlay: props.onPlay,
|
||
onSetTrim: props.onSetTrim,
|
||
onStop: props.onStop
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.row, _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.rowReverse)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.roundButtonOuter, _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.inputGroup)
|
||
}, props.playhead ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.roundButton, _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.stopButtonn),
|
||
title: props.intl.formatMessage(messages.stop),
|
||
onClick: props.onStop
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: _icon_stop_svg__WEBPACK_IMPORTED_MODULE_13___default.a
|
||
})) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.roundButton, _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.playButton),
|
||
title: props.intl.formatMessage(messages.play),
|
||
onClick: props.onPlay
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: _icon_play_svg__WEBPACK_IMPORTED_MODULE_12___default.a
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.effects
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.effectButton,
|
||
img: _icon_faster_svg__WEBPACK_IMPORTED_MODULE_16___default.a,
|
||
title: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.faster),
|
||
onClick: props.onFaster
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.effectButton,
|
||
img: _icon_slower_svg__WEBPACK_IMPORTED_MODULE_17___default.a,
|
||
title: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.slower),
|
||
onClick: props.onSlower
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
disabled: props.tooLoud,
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.effectButton, _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.flipInRtl),
|
||
img: _icon_louder_svg__WEBPACK_IMPORTED_MODULE_18___default.a,
|
||
title: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.louder),
|
||
onClick: props.onLouder
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.effectButton, _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.flipInRtl),
|
||
img: _icon_softer_svg__WEBPACK_IMPORTED_MODULE_19___default.a,
|
||
title: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.softer),
|
||
onClick: props.onSofter
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.effectButton, _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.flipInRtl),
|
||
img: _icon_mute_svg__WEBPACK_IMPORTED_MODULE_25___default.a,
|
||
title: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.mute),
|
||
onClick: props.onMute
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.effectButton,
|
||
img: _icon_fade_in_svg__WEBPACK_IMPORTED_MODULE_24___default.a,
|
||
title: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.fadeIn),
|
||
onClick: props.onFadeIn
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.effectButton,
|
||
img: _icon_fade_out_svg__WEBPACK_IMPORTED_MODULE_23___default.a,
|
||
title: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.fadeOut),
|
||
onClick: props.onFadeOut
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.effectButton,
|
||
img: _icon_reverse_svg__WEBPACK_IMPORTED_MODULE_22___default.a,
|
||
title: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.reverse),
|
||
onClick: props.onReverse
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.effectButton,
|
||
img: _icon_robot_svg__WEBPACK_IMPORTED_MODULE_20___default.a,
|
||
title: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.robot),
|
||
onClick: props.onRobot
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_icon_button_icon_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.effectButton,
|
||
img: _icon_echo_svg__WEBPACK_IMPORTED_MODULE_21___default.a,
|
||
title: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.echo),
|
||
onClick: props.onEcho
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.infoRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.duration
|
||
}, formatDuration(props.playhead, props.trimStart, props.trimEnd, props.duration)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.advancedInfo
|
||
}, props.sampleRate, 'Hz ', props.isStereo ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Stereo",
|
||
id: "tw.stereo"
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Mono",
|
||
id: "tw.mono"
|
||
}), " (".concat(formatSoundSize(props.size), ")"))), props.size >= _lib_audio_audio_util_js__WEBPACK_IMPORTED_MODULE_10__["SOUND_BYTE_LIMIT"] && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.alert, _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.tooLarge)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "This sound may be too large to upload to Scratch.",
|
||
id: "tw.tooLarge"
|
||
})), props.isStereo && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.alert, _sound_editor_css__WEBPACK_IMPORTED_MODULE_11___default.a.stereo)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Editing this stereo sound will irreversibly convert it to mono.",
|
||
id: "tw.stereoAlert"
|
||
})));
|
||
|
||
SoundEditor.propTypes = {
|
||
isStereo: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
duration: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number.isRequired,
|
||
size: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
sampleRate: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number.isRequired,
|
||
canPaste: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
canRedo: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
canUndo: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
chunkLevels: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number).isRequired,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"],
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
onChangeName: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onContainerClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onCopy: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onCopyToNew: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onDelete: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onEcho: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onFadeIn: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onFadeOut: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onFaster: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onLouder: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onMute: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onPaste: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onPlay: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onRedo: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onReverse: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onRobot: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onSetTrim: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onSlower: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onSofter: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onStop: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onUndo: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
playhead: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
setRef: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
tooLoud: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
trimEnd: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
trimStart: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(SoundEditor));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/spinner/spinner.css":
|
||
/*!********************************************!*\
|
||
!*** ./src/components/spinner/spinner.css ***!
|
||
\********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./spinner.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/spinner/spinner.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/spinner/spinner.jsx":
|
||
/*!********************************************!*\
|
||
!*** ./src/components/spinner/spinner.jsx ***!
|
||
\********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _spinner_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./spinner.css */ "./src/components/spinner/spinner.css");
|
||
/* harmony import */ var _spinner_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_spinner_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
|
||
|
||
|
||
|
||
|
||
const SpinnerComponent = function SpinnerComponent(props) {
|
||
const {
|
||
className,
|
||
level,
|
||
small,
|
||
large
|
||
} = props;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(className, _spinner_css__WEBPACK_IMPORTED_MODULE_3___default.a.spinner, _spinner_css__WEBPACK_IMPORTED_MODULE_3___default.a[level], {
|
||
[_spinner_css__WEBPACK_IMPORTED_MODULE_3___default.a.small]: small,
|
||
[_spinner_css__WEBPACK_IMPORTED_MODULE_3___default.a.large]: large
|
||
})
|
||
});
|
||
};
|
||
|
||
SpinnerComponent.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
large: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
level: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
small: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
SpinnerComponent.defaultProps = {
|
||
className: '',
|
||
large: false,
|
||
level: 'info',
|
||
small: false
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (SpinnerComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sprite-info/icon--hide.svg":
|
||
/*!***************************************************!*\
|
||
!*** ./src/components/sprite-info/icon--hide.svg ***!
|
||
\***************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/e214dc66bba3d014deaa931a2be33f53.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sprite-info/icon--show.svg":
|
||
/*!***************************************************!*\
|
||
!*** ./src/components/sprite-info/icon--show.svg ***!
|
||
\***************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/c80022cd3424a0dc9635de89433cf08e.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sprite-info/icon--x.svg":
|
||
/*!************************************************!*\
|
||
!*** ./src/components/sprite-info/icon--x.svg ***!
|
||
\************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/38a70367a21e2f1fb15aa59b7d367450.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sprite-info/icon--y.svg":
|
||
/*!************************************************!*\
|
||
!*** ./src/components/sprite-info/icon--y.svg ***!
|
||
\************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/9ddae4f6c1aeaf0784007203d9d4ac9c.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sprite-info/sprite-info.css":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/sprite-info/sprite-info.css ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./sprite-info.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/sprite-info/sprite-info.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sprite-info/sprite-info.jsx":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/sprite-info/sprite-info.jsx ***!
|
||
\****************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _forms_label_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../forms/label.jsx */ "./src/components/forms/label.jsx");
|
||
/* harmony import */ var _forms_input_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../forms/input.jsx */ "./src/components/forms/input.jsx");
|
||
/* harmony import */ var _forms_buffered_input_hoc_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../forms/buffered-input-hoc.jsx */ "./src/components/forms/buffered-input-hoc.jsx");
|
||
/* harmony import */ var _containers_direction_picker_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../containers/direction-picker.jsx */ "./src/containers/direction-picker.jsx");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../lib/layout-constants.js */ "./src/lib/layout-constants.js");
|
||
/* harmony import */ var _lib_locale_utils_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../lib/locale-utils.js */ "./src/lib/locale-utils.js");
|
||
/* harmony import */ var _sprite_info_css__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./sprite-info.css */ "./src/components/sprite-info/sprite-info.css");
|
||
/* harmony import */ var _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_sprite_info_css__WEBPACK_IMPORTED_MODULE_11__);
|
||
/* harmony import */ var _icon_x_svg__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./icon--x.svg */ "./src/components/sprite-info/icon--x.svg");
|
||
/* harmony import */ var _icon_x_svg__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_icon_x_svg__WEBPACK_IMPORTED_MODULE_12__);
|
||
/* harmony import */ var _icon_y_svg__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./icon--y.svg */ "./src/components/sprite-info/icon--y.svg");
|
||
/* harmony import */ var _icon_y_svg__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_icon_y_svg__WEBPACK_IMPORTED_MODULE_13__);
|
||
/* harmony import */ var _icon_show_svg__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./icon--show.svg */ "./src/components/sprite-info/icon--show.svg");
|
||
/* harmony import */ var _icon_show_svg__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_icon_show_svg__WEBPACK_IMPORTED_MODULE_14__);
|
||
/* harmony import */ var _icon_hide_svg__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./icon--hide.svg */ "./src/components/sprite-info/icon--hide.svg");
|
||
/* harmony import */ var _icon_hide_svg__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(_icon_hide_svg__WEBPACK_IMPORTED_MODULE_15__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const BufferedInput = Object(_forms_buffered_input_hoc_jsx__WEBPACK_IMPORTED_MODULE_6__["default"])(_forms_input_jsx__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_8__["defineMessages"])({
|
||
spritePlaceholder: {
|
||
"id": "gui.SpriteInfo.spritePlaceholder",
|
||
"defaultMessage": "Name"
|
||
}
|
||
});
|
||
|
||
class SpriteInfo extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
shouldComponentUpdate(nextProps) {
|
||
return this.props.rotationStyle !== nextProps.rotationStyle || this.props.disabled !== nextProps.disabled || this.props.name !== nextProps.name || this.props.stageSize !== nextProps.stageSize || this.props.visible !== nextProps.visible || // Only update these if rounded value has changed
|
||
Math.round(this.props.direction) !== Math.round(nextProps.direction) || Math.round(this.props.size) !== Math.round(nextProps.size) || Math.round(this.props.x) !== Math.round(nextProps.x) || Math.round(this.props.y) !== Math.round(nextProps.y);
|
||
}
|
||
|
||
render() {
|
||
const {
|
||
stageSize
|
||
} = this.props;
|
||
const sprite = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_8__["FormattedMessage"], {
|
||
defaultMessage: "Sprite",
|
||
id: "gui.SpriteInfo.sprite"
|
||
});
|
||
const showLabel = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_8__["FormattedMessage"], {
|
||
defaultMessage: "Show",
|
||
id: "gui.SpriteInfo.show"
|
||
});
|
||
const sizeLabel = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_8__["FormattedMessage"], {
|
||
defaultMessage: "Size",
|
||
id: "gui.SpriteInfo.size"
|
||
});
|
||
const labelAbove = Object(_lib_locale_utils_js__WEBPACK_IMPORTED_MODULE_10__["isWideLocale"])(this.props.intl.locale);
|
||
const spriteNameInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(BufferedInput, {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.spriteInput, {
|
||
[_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.columnInput]: labelAbove
|
||
}),
|
||
disabled: this.props.disabled,
|
||
placeholder: this.props.intl.formatMessage(messages.spritePlaceholder),
|
||
tabIndex: "0",
|
||
type: "text",
|
||
value: this.props.disabled ? '' : this.props.name,
|
||
onSubmit: this.props.onChangeName
|
||
});
|
||
const xPosition = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.group
|
||
}, stageSize === _lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_9__["STAGE_DISPLAY_SIZES"].large ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.iconWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
"aria-hidden": "true",
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.xIcon, _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.icon),
|
||
src: _icon_x_svg__WEBPACK_IMPORTED_MODULE_12___default.a
|
||
})) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_forms_label_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
text: "x"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(BufferedInput, {
|
||
small: true,
|
||
disabled: this.props.disabled,
|
||
placeholder: "x",
|
||
tabIndex: "0",
|
||
type: "text",
|
||
value: this.props.disabled ? '' : Math.round(this.props.x),
|
||
onSubmit: this.props.onChangeX
|
||
})));
|
||
const yPosition = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.group
|
||
}, stageSize === _lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_9__["STAGE_DISPLAY_SIZES"].large ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.iconWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
"aria-hidden": "true",
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.yIcon, _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.icon),
|
||
src: _icon_y_svg__WEBPACK_IMPORTED_MODULE_13___default.a
|
||
})) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_forms_label_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
text: "y"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(BufferedInput, {
|
||
small: true,
|
||
disabled: this.props.disabled,
|
||
placeholder: "y",
|
||
tabIndex: "0",
|
||
type: "text",
|
||
value: this.props.disabled ? '' : Math.round(this.props.y),
|
||
onSubmit: this.props.onChangeY
|
||
})));
|
||
|
||
if (stageSize === _lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_9__["STAGE_DISPLAY_SIZES"].small) {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.spriteInfo
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.row, _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.rowPrimary)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.group
|
||
}, spriteNameInput)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.row, _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.rowSecondary)
|
||
}, xPosition, yPosition));
|
||
}
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.spriteInfo
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.row, _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.rowPrimary)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.group
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_forms_label_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
above: labelAbove,
|
||
text: sprite
|
||
}, spriteNameInput)), xPosition, yPosition), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.row, _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.rowSecondary)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: labelAbove ? _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.column : _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.group
|
||
}, stageSize === _lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_9__["STAGE_DISPLAY_SIZES"].large ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_forms_label_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
secondary: true,
|
||
text: showLabel
|
||
}) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.radioWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.radio, _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.radioFirst, _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.iconWrapper, {
|
||
[_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.isActive]: this.props.visible && !this.props.disabled,
|
||
[_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.isDisabled]: this.props.disabled
|
||
}),
|
||
tabIndex: "0",
|
||
onClick: this.props.onClickVisible,
|
||
onKeyPress: this.props.onPressVisible
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.icon,
|
||
src: _icon_show_svg__WEBPACK_IMPORTED_MODULE_14___default.a
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.radio, _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.radioLast, _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.iconWrapper, {
|
||
[_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.isActive]: !this.props.visible && !this.props.disabled,
|
||
[_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.isDisabled]: this.props.disabled
|
||
}),
|
||
tabIndex: "0",
|
||
onClick: this.props.onClickNotVisible,
|
||
onKeyPress: this.props.onPressNotVisible
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.icon,
|
||
src: _icon_hide_svg__WEBPACK_IMPORTED_MODULE_15___default.a
|
||
})))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.group, _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.largerInput)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_forms_label_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
secondary: true,
|
||
above: labelAbove,
|
||
text: sizeLabel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(BufferedInput, {
|
||
small: true,
|
||
disabled: this.props.disabled,
|
||
label: sizeLabel,
|
||
tabIndex: "0",
|
||
type: "text",
|
||
value: this.props.disabled ? '' : Math.round(this.props.size),
|
||
onSubmit: this.props.onChangeSize
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.group, _sprite_info_css__WEBPACK_IMPORTED_MODULE_11___default.a.largerInput)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_containers_direction_picker_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
direction: Math.round(this.props.direction),
|
||
disabled: this.props.disabled,
|
||
labelAbove: labelAbove,
|
||
rotationStyle: this.props.rotationStyle,
|
||
onChangeDirection: this.props.onChangeDirection,
|
||
onChangeRotationStyle: this.props.onChangeRotationStyle
|
||
}))));
|
||
}
|
||
|
||
}
|
||
|
||
SpriteInfo.propTypes = {
|
||
direction: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number]),
|
||
disabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_8__["intlShape"],
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onChangeDirection: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onChangeName: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onChangeRotationStyle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onChangeSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onChangeX: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onChangeY: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onClickNotVisible: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onClickVisible: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onPressNotVisible: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onPressVisible: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
rotationStyle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
size: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number]),
|
||
stageSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(Object.keys(_lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_9__["STAGE_DISPLAY_SIZES"])).isRequired,
|
||
visible: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
x: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number]),
|
||
y: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number])
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_8__["injectIntl"])(SpriteInfo));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sprite-selector-item/sprite-selector-item.css":
|
||
/*!**********************************************************************!*\
|
||
!*** ./src/components/sprite-selector-item/sprite-selector-item.css ***!
|
||
\**********************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./sprite-selector-item.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/sprite-selector-item/sprite-selector-item.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sprite-selector-item/sprite-selector-item.jsx":
|
||
/*!**********************************************************************!*\
|
||
!*** ./src/components/sprite-selector-item/sprite-selector-item.jsx ***!
|
||
\**********************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _delete_button_delete_button_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../delete-button/delete-button.jsx */ "./src/components/delete-button/delete-button.jsx");
|
||
/* harmony import */ var _sprite_selector_item_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sprite-selector-item.css */ "./src/components/sprite-selector-item/sprite-selector-item.css");
|
||
/* harmony import */ var _sprite_selector_item_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_sprite_selector_item_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var react_contextmenu__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-contextmenu */ "./node_modules/react-contextmenu/es6/index.js");
|
||
/* harmony import */ var _context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../context-menu/context-menu.jsx */ "./src/components/context-menu/context-menu.jsx");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// react-contextmenu requires unique id to match trigger and context menu
|
||
|
||
let contextMenuId = 0;
|
||
|
||
const SpriteSelectorItem = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_contextmenu__WEBPACK_IMPORTED_MODULE_5__["ContextMenuTrigger"], {
|
||
attributes: {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(props.className, _sprite_selector_item_css__WEBPACK_IMPORTED_MODULE_4___default.a.spriteSelectorItem, {
|
||
[_sprite_selector_item_css__WEBPACK_IMPORTED_MODULE_4___default.a.isSelected]: props.selected
|
||
}),
|
||
onClick: props.onClick,
|
||
onMouseEnter: props.onMouseEnter,
|
||
onMouseLeave: props.onMouseLeave,
|
||
onMouseDown: props.onMouseDown,
|
||
onTouchStart: props.onMouseDown
|
||
},
|
||
disable: props.preventContextMenu,
|
||
id: "".concat(props.name, "-").concat(contextMenuId),
|
||
ref: props.componentRef
|
||
}, typeof props.number === 'undefined' ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _sprite_selector_item_css__WEBPACK_IMPORTED_MODULE_4___default.a.number
|
||
}, props.number), props.costumeURL ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _sprite_selector_item_css__WEBPACK_IMPORTED_MODULE_4___default.a.spriteImageOuter
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _sprite_selector_item_css__WEBPACK_IMPORTED_MODULE_4___default.a.spriteImageInner
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _sprite_selector_item_css__WEBPACK_IMPORTED_MODULE_4___default.a.spriteImage,
|
||
draggable: false,
|
||
src: props.costumeURL
|
||
}))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _sprite_selector_item_css__WEBPACK_IMPORTED_MODULE_4___default.a.spriteInfo
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _sprite_selector_item_css__WEBPACK_IMPORTED_MODULE_4___default.a.spriteName
|
||
}, props.name), props.details ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _sprite_selector_item_css__WEBPACK_IMPORTED_MODULE_4___default.a.spriteDetails
|
||
}, props.details) : null), props.selected && props.onDeleteButtonClick ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_delete_button_delete_button_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _sprite_selector_item_css__WEBPACK_IMPORTED_MODULE_4___default.a.deleteButton,
|
||
onClick: props.onDeleteButtonClick
|
||
}) : null, props.onDuplicateButtonClick || props.onDeleteButtonClick || props.onExportButtonClick ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__["ContextMenu"], {
|
||
id: "".concat(props.name, "-").concat(contextMenuId++)
|
||
}, props.onDuplicateButtonClick ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__["MenuItem"], {
|
||
onClick: props.onDuplicateButtonClick
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_7__["FormattedMessage"], {
|
||
defaultMessage: "duplicate",
|
||
id: "gui.spriteSelectorItem.contextMenuDuplicate"
|
||
})) : null, props.onExportButtonClick ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__["MenuItem"], {
|
||
onClick: props.onExportButtonClick
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_7__["FormattedMessage"], {
|
||
defaultMessage: "export",
|
||
id: "gui.spriteSelectorItem.contextMenuExport"
|
||
})) : null, props.onRenameButtonClick ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__["MenuItem"], {
|
||
onClick: props.onRenameButtonClick
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_7__["FormattedMessage"], {
|
||
defaultMessage: "rename",
|
||
id: "tw.spriteSelectorItem.rename"
|
||
})) : null, props.onDeleteButtonClick ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_context_menu_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__["DangerousMenuItem"], {
|
||
onClick: props.onDeleteButtonClick
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_7__["FormattedMessage"], {
|
||
defaultMessage: "delete",
|
||
id: "gui.spriteSelectorItem.contextMenuDelete"
|
||
})) : null) : null);
|
||
|
||
SpriteSelectorItem.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
componentRef: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
costumeURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
details: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
// eslint-disable-next-line react/forbid-prop-types
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.any,
|
||
number: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onDeleteButtonClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onDuplicateButtonClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onExportButtonClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onRenameButtonClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onMouseEnter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onMouseLeave: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
preventContextMenu: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
selected: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (SpriteSelectorItem);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sprite-selector/sprite-list.jsx":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/sprite-selector/sprite-list.jsx ***!
|
||
\********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _lib_drag_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../lib/drag-constants */ "./src/lib/drag-constants.js");
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _containers_sprite_selector_item_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../containers/sprite-selector-item.jsx */ "./src/containers/sprite-selector-item.jsx");
|
||
/* harmony import */ var _lib_sortable_hoc_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib/sortable-hoc.jsx */ "./src/lib/sortable-hoc.jsx");
|
||
/* harmony import */ var _asset_panel_sortable_asset_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../asset-panel/sortable-asset.jsx */ "./src/components/asset-panel/sortable-asset.jsx");
|
||
/* harmony import */ var _lib_throttled_property_hoc_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../lib/throttled-property-hoc.jsx */ "./src/lib/throttled-property-hoc.jsx");
|
||
/* harmony import */ var _sprite_selector_css__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./sprite-selector.css */ "./src/components/sprite-selector/sprite-selector.css");
|
||
/* harmony import */ var _sprite_selector_css__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_sprite_selector_css__WEBPACK_IMPORTED_MODULE_9__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const ThrottledSpriteSelectorItem = Object(_lib_throttled_property_hoc_jsx__WEBPACK_IMPORTED_MODULE_8__["default"])('asset', 500)(_containers_sprite_selector_item_jsx__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
||
|
||
const SpriteList = function SpriteList(props) {
|
||
const {
|
||
containerRef,
|
||
editingTarget,
|
||
draggingIndex,
|
||
draggingType,
|
||
hoveredTarget,
|
||
onDeleteSprite,
|
||
onDuplicateSprite,
|
||
onExportSprite,
|
||
onSelectSprite,
|
||
onAddSortable,
|
||
onRemoveSortable,
|
||
ordering,
|
||
raised,
|
||
selectedId,
|
||
items
|
||
} = props;
|
||
const isSpriteDrag = draggingType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_3__["default"].SPRITE;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_sprite_selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.scrollWrapper, {
|
||
[_sprite_selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.scrollWrapperDragging]: draggingType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_3__["default"].BACKPACK_SPRITE
|
||
}),
|
||
componentRef: containerRef
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _sprite_selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.itemsWrapper
|
||
}, items.map((sprite, index) => {
|
||
// If the sprite has just received a block drop, used for green highlight
|
||
const receivedBlocks = hoveredTarget.sprite === sprite.id && sprite.id !== editingTarget && hoveredTarget.receivedBlocks; // If the sprite is indicating it can receive block dropping, used for blue highlight
|
||
|
||
let isRaised = !receivedBlocks && raised && sprite.id !== editingTarget; // A sprite is also raised if a costume or sound is being dragged.
|
||
// Note the absence of the self-sharing check: a sprite can share assets with itself.
|
||
// This is a quirk of 2.0, but seems worth leaving possible, it
|
||
// allows quick (albeit unusual) duplication of assets.
|
||
|
||
isRaised = isRaised || [_lib_drag_constants__WEBPACK_IMPORTED_MODULE_3__["default"].COSTUME, _lib_drag_constants__WEBPACK_IMPORTED_MODULE_3__["default"].SOUND, _lib_drag_constants__WEBPACK_IMPORTED_MODULE_3__["default"].BACKPACK_COSTUME, _lib_drag_constants__WEBPACK_IMPORTED_MODULE_3__["default"].BACKPACK_SOUND, _lib_drag_constants__WEBPACK_IMPORTED_MODULE_3__["default"].BACKPACK_CODE].includes(draggingType);
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_asset_panel_sortable_asset_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_sprite_selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.spriteWrapper, {
|
||
[_sprite_selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.placeholder]: isSpriteDrag && index === draggingIndex
|
||
}),
|
||
index: isSpriteDrag ? ordering.indexOf(index) : index,
|
||
key: sprite.name,
|
||
onAddSortable: onAddSortable,
|
||
onRemoveSortable: onRemoveSortable
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(ThrottledSpriteSelectorItem, {
|
||
asset: sprite.costume && sprite.costume.asset,
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_sprite_selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.sprite, {
|
||
[_sprite_selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.raised]: isRaised,
|
||
[_sprite_selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.receivedBlocks]: receivedBlocks
|
||
}),
|
||
dragPayload: sprite.id,
|
||
dragType: _lib_drag_constants__WEBPACK_IMPORTED_MODULE_3__["default"].SPRITE,
|
||
id: sprite.id,
|
||
index: index,
|
||
key: sprite.id,
|
||
name: sprite.name,
|
||
selected: sprite.id === selectedId,
|
||
onClick: onSelectSprite,
|
||
onDeleteButtonClick: onDeleteSprite,
|
||
onDuplicateButtonClick: onDuplicateSprite,
|
||
onExportButtonClick: onExportSprite
|
||
}));
|
||
})));
|
||
};
|
||
|
||
SpriteList.propTypes = {
|
||
containerRef: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
draggingIndex: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
draggingType: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf(Object.keys(_lib_drag_constants__WEBPACK_IMPORTED_MODULE_3__["default"])),
|
||
editingTarget: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
hoveredTarget: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
hoveredSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
receivedBlocks: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
sprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string
|
||
}),
|
||
items: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
costume: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
// eslint-disable-next-line react/forbid-prop-types
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
bitmapResolution: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
rotationCenterX: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
rotationCenterY: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
}),
|
||
// eslint-disable-next-line react/forbid-prop-types
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.any,
|
||
order: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
})),
|
||
onAddSortable: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onDeleteSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onDuplicateSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onExportSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onRemoveSortable: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onSelectSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
ordering: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number),
|
||
raised: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
selectedId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(_lib_sortable_hoc_jsx__WEBPACK_IMPORTED_MODULE_6__["default"])(SpriteList));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sprite-selector/sprite-selector.css":
|
||
/*!************************************************************!*\
|
||
!*** ./src/components/sprite-selector/sprite-selector.css ***!
|
||
\************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./sprite-selector.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/sprite-selector/sprite-selector.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/sprite-selector/sprite-selector.jsx":
|
||
/*!************************************************************!*\
|
||
!*** ./src/components/sprite-selector/sprite-selector.jsx ***!
|
||
\************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _containers_sprite_info_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../containers/sprite-info.jsx */ "./src/containers/sprite-info.jsx");
|
||
/* harmony import */ var _sprite_list_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sprite-list.jsx */ "./src/components/sprite-selector/sprite-list.jsx");
|
||
/* harmony import */ var _action_menu_action_menu_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../action-menu/action-menu.jsx */ "./src/components/action-menu/action-menu.jsx");
|
||
/* harmony import */ var _lib_layout_constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib/layout-constants */ "./src/lib/layout-constants.js");
|
||
/* harmony import */ var _turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @turbowarp/scratch-l10n */ "./node_modules/@turbowarp/scratch-l10n/src/index.js");
|
||
/* harmony import */ var _sprite_selector_css__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./sprite-selector.css */ "./src/components/sprite-selector/sprite-selector.css");
|
||
/* harmony import */ var _sprite_selector_css__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_sprite_selector_css__WEBPACK_IMPORTED_MODULE_9__);
|
||
/* harmony import */ var _action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../action-menu/icon--file-upload.svg */ "./src/components/action-menu/icon--file-upload.svg");
|
||
/* harmony import */ var _action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_10__);
|
||
/* harmony import */ var _action_menu_icon_paint_svg__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../action-menu/icon--paint.svg */ "./src/components/action-menu/icon--paint.svg");
|
||
/* harmony import */ var _action_menu_icon_paint_svg__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_action_menu_icon_paint_svg__WEBPACK_IMPORTED_MODULE_11__);
|
||
/* harmony import */ var _action_menu_icon_sprite_svg__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../action-menu/icon--sprite.svg */ "./src/components/action-menu/icon--sprite.svg");
|
||
/* harmony import */ var _action_menu_icon_sprite_svg__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_action_menu_icon_sprite_svg__WEBPACK_IMPORTED_MODULE_12__);
|
||
/* harmony import */ var _action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../action-menu/icon--surprise.svg */ "./src/components/action-menu/icon--surprise.svg");
|
||
/* harmony import */ var _action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_13__);
|
||
/* harmony import */ var _action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../action-menu/icon--search.svg */ "./src/components/action-menu/icon--search.svg");
|
||
/* harmony import */ var _action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_14__);
|
||
const _excluded = ["editingTarget", "hoveredTarget", "intl", "onChangeSpriteDirection", "onChangeSpriteName", "onChangeSpriteRotationStyle", "onChangeSpriteSize", "onChangeSpriteVisibility", "onChangeSpriteX", "onChangeSpriteY", "onDrop", "onDeleteSprite", "onDuplicateSprite", "onExportSprite", "onFileUploadClick", "onNewSpriteClick", "onPaintSpriteClick", "onSelectSprite", "onSpriteUpload", "onSurpriseSpriteClick", "raised", "selectedId", "spriteFileInput", "sprites", "stageSize"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["defineMessages"])({
|
||
addSpriteFromLibrary: {
|
||
"id": "gui.spriteSelector.addSpriteFromLibrary",
|
||
"defaultMessage": "Choose a Sprite"
|
||
},
|
||
addSpriteFromPaint: {
|
||
"id": "gui.spriteSelector.addSpriteFromPaint",
|
||
"defaultMessage": "Paint"
|
||
},
|
||
addSpriteFromSurprise: {
|
||
"id": "gui.spriteSelector.addSpriteFromSurprise",
|
||
"defaultMessage": "Surprise"
|
||
},
|
||
addSpriteFromFile: {
|
||
"id": "gui.spriteSelector.addSpriteFromFile",
|
||
"defaultMessage": "Upload Sprite"
|
||
}
|
||
});
|
||
|
||
const SpriteSelectorComponent = function SpriteSelectorComponent(props) {
|
||
const {
|
||
editingTarget,
|
||
hoveredTarget,
|
||
intl,
|
||
onChangeSpriteDirection,
|
||
onChangeSpriteName,
|
||
onChangeSpriteRotationStyle,
|
||
onChangeSpriteSize,
|
||
onChangeSpriteVisibility,
|
||
onChangeSpriteX,
|
||
onChangeSpriteY,
|
||
onDrop,
|
||
onDeleteSprite,
|
||
onDuplicateSprite,
|
||
onExportSprite,
|
||
onFileUploadClick,
|
||
onNewSpriteClick,
|
||
onPaintSpriteClick,
|
||
onSelectSprite,
|
||
onSpriteUpload,
|
||
onSurpriseSpriteClick,
|
||
raised,
|
||
selectedId,
|
||
spriteFileInput,
|
||
sprites,
|
||
stageSize
|
||
} = props,
|
||
componentProps = _objectWithoutProperties(props, _excluded);
|
||
|
||
let selectedSprite = sprites[selectedId];
|
||
let spriteInfoDisabled = false;
|
||
|
||
if (typeof selectedSprite === 'undefined') {
|
||
selectedSprite = {};
|
||
spriteInfoDisabled = true;
|
||
}
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({
|
||
className: _sprite_selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.spriteSelector
|
||
}, componentProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_sprite_info_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
direction: selectedSprite.direction,
|
||
disabled: spriteInfoDisabled,
|
||
name: selectedSprite.name,
|
||
rotationStyle: selectedSprite.rotationStyle,
|
||
size: selectedSprite.size,
|
||
stageSize: stageSize,
|
||
visible: selectedSprite.visible,
|
||
x: selectedSprite.x,
|
||
y: selectedSprite.y,
|
||
onChangeDirection: onChangeSpriteDirection,
|
||
onChangeName: onChangeSpriteName,
|
||
onChangeRotationStyle: onChangeSpriteRotationStyle,
|
||
onChangeSize: onChangeSpriteSize,
|
||
onChangeVisibility: onChangeSpriteVisibility,
|
||
onChangeX: onChangeSpriteX,
|
||
onChangeY: onChangeSpriteY
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_sprite_list_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
editingTarget: editingTarget,
|
||
hoveredTarget: hoveredTarget,
|
||
items: Object.keys(sprites).map(id => sprites[id]),
|
||
raised: raised,
|
||
selectedId: selectedId,
|
||
onDeleteSprite: onDeleteSprite,
|
||
onDrop: onDrop,
|
||
onDuplicateSprite: onDuplicateSprite,
|
||
onExportSprite: onExportSprite,
|
||
onSelectSprite: onSelectSprite
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_action_menu_action_menu_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
className: _sprite_selector_css__WEBPACK_IMPORTED_MODULE_9___default.a.addButton,
|
||
img: _action_menu_icon_sprite_svg__WEBPACK_IMPORTED_MODULE_12___default.a,
|
||
moreButtons: [{
|
||
title: intl.formatMessage(messages.addSpriteFromFile),
|
||
img: _action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_10___default.a,
|
||
onClick: onFileUploadClick,
|
||
fileAccept: '.svg, .png, .bmp, .jpg, .jpeg, .jfif, .webp, .sprite2, .sprite3, .gif',
|
||
fileChange: onSpriteUpload,
|
||
fileInput: spriteFileInput,
|
||
fileMultiple: true
|
||
}, {
|
||
title: intl.formatMessage(messages.addSpriteFromSurprise),
|
||
img: _action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_13___default.a,
|
||
onClick: onSurpriseSpriteClick // TODO need real function for this
|
||
|
||
}, {
|
||
title: intl.formatMessage(messages.addSpriteFromPaint),
|
||
img: _action_menu_icon_paint_svg__WEBPACK_IMPORTED_MODULE_11___default.a,
|
||
onClick: onPaintSpriteClick // TODO need real function for this
|
||
|
||
}, {
|
||
title: intl.formatMessage(messages.addSpriteFromLibrary),
|
||
img: _action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_14___default.a,
|
||
onClick: onNewSpriteClick
|
||
}],
|
||
title: intl.formatMessage(messages.addSpriteFromLibrary),
|
||
tooltipPlace: Object(_turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_8__["isRtl"])(intl.locale) ? 'right' : 'left',
|
||
onClick: onNewSpriteClick
|
||
}));
|
||
};
|
||
|
||
SpriteSelectorComponent.propTypes = {
|
||
editingTarget: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
hoveredTarget: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
hoveredSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
receivedBlocks: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool
|
||
}),
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_2__["intlShape"].isRequired,
|
||
onChangeSpriteDirection: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onChangeSpriteName: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onChangeSpriteRotationStyle: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onChangeSpriteSize: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onChangeSpriteVisibility: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onChangeSpriteX: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onChangeSpriteY: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onDeleteSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onDrop: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onDuplicateSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onExportSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onFileUploadClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onNewSpriteClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onPaintSpriteClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onSelectSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onSpriteUpload: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onSurpriseSpriteClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
raised: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
selectedId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
spriteFileInput: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
sprites: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
costume: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
bitmapResolution: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number.isRequired,
|
||
rotationCenterX: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number.isRequired,
|
||
rotationCenterY: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number.isRequired
|
||
}),
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
order: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number.isRequired
|
||
})
|
||
}),
|
||
stageSize: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf(Object.keys(_lib_layout_constants__WEBPACK_IMPORTED_MODULE_7__["STAGE_DISPLAY_SIZES"])).isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["injectIntl"])(SpriteSelectorComponent));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stage-header/icon--fullscreen.svg":
|
||
/*!**********************************************************!*\
|
||
!*** ./src/components/stage-header/icon--fullscreen.svg ***!
|
||
\**********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/422b48c2206d5240a6717c92496ba21a.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stage-header/icon--large-stage.svg":
|
||
/*!***********************************************************!*\
|
||
!*** ./src/components/stage-header/icon--large-stage.svg ***!
|
||
\***********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/2d96b207399b06aa8fd389bb44cfbdb4.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stage-header/icon--settings.svg":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/stage-header/icon--settings.svg ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/05e9c069d478b9e056e35f04e7dedf64.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stage-header/icon--small-stage.svg":
|
||
/*!***********************************************************!*\
|
||
!*** ./src/components/stage-header/icon--small-stage.svg ***!
|
||
\***********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/2e2faaf5753ac5ae1df6153ea2daf683.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stage-header/icon--unfullscreen.svg":
|
||
/*!************************************************************!*\
|
||
!*** ./src/components/stage-header/icon--unfullscreen.svg ***!
|
||
\************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/dd55f4c6c20f5d25e520b6f5bfb090c5.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stage-header/stage-header.css":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/stage-header/stage-header.css ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./stage-header.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/stage-header/stage-header.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stage-header/stage-header.jsx":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/stage-header/stage-header.jsx ***!
|
||
\******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _button_button_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../button/button.jsx */ "./src/components/button/button.jsx");
|
||
/* harmony import */ var _containers_controls_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../containers/controls.jsx */ "./src/containers/controls.jsx");
|
||
/* harmony import */ var _lib_screen_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../lib/screen-utils */ "./src/lib/screen-utils.js");
|
||
/* harmony import */ var _lib_layout_constants__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../lib/layout-constants */ "./src/lib/layout-constants.js");
|
||
/* harmony import */ var _icon_fullscreen_svg__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./icon--fullscreen.svg */ "./src/components/stage-header/icon--fullscreen.svg");
|
||
/* harmony import */ var _icon_fullscreen_svg__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_icon_fullscreen_svg__WEBPACK_IMPORTED_MODULE_11__);
|
||
/* harmony import */ var _icon_large_stage_svg__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./icon--large-stage.svg */ "./src/components/stage-header/icon--large-stage.svg");
|
||
/* harmony import */ var _icon_large_stage_svg__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_icon_large_stage_svg__WEBPACK_IMPORTED_MODULE_12__);
|
||
/* harmony import */ var _icon_small_stage_svg__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./icon--small-stage.svg */ "./src/components/stage-header/icon--small-stage.svg");
|
||
/* harmony import */ var _icon_small_stage_svg__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_icon_small_stage_svg__WEBPACK_IMPORTED_MODULE_13__);
|
||
/* harmony import */ var _icon_unfullscreen_svg__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./icon--unfullscreen.svg */ "./src/components/stage-header/icon--unfullscreen.svg");
|
||
/* harmony import */ var _icon_unfullscreen_svg__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_icon_unfullscreen_svg__WEBPACK_IMPORTED_MODULE_14__);
|
||
/* harmony import */ var _icon_settings_svg__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./icon--settings.svg */ "./src/components/stage-header/icon--settings.svg");
|
||
/* harmony import */ var _icon_settings_svg__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(_icon_settings_svg__WEBPACK_IMPORTED_MODULE_15__);
|
||
/* harmony import */ var _stage_header_css__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./stage-header.css */ "./src/components/stage-header/stage-header.css");
|
||
/* harmony import */ var _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(_stage_header_css__WEBPACK_IMPORTED_MODULE_16__);
|
||
/* harmony import */ var _lib_tw_fullscreen_api__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../lib/tw-fullscreen-api */ "./src/lib/tw-fullscreen-api.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_1__["defineMessages"])({
|
||
largeStageSizeMessage: {
|
||
"id": "gui.stageHeader.stageSizeLarge",
|
||
"defaultMessage": "Switch to large stage"
|
||
},
|
||
smallStageSizeMessage: {
|
||
"id": "gui.stageHeader.stageSizeSmall",
|
||
"defaultMessage": "Switch to small stage"
|
||
},
|
||
fullStageSizeMessage: {
|
||
"id": "gui.stageHeader.stageSizeFull",
|
||
"defaultMessage": "Enter full screen mode"
|
||
},
|
||
unFullStageSizeMessage: {
|
||
"id": "gui.stageHeader.stageSizeUnFull",
|
||
"defaultMessage": "Exit full screen mode"
|
||
},
|
||
fullscreenControl: {
|
||
"id": "gui.stageHeader.fullscreenControl",
|
||
"defaultMessage": "Full Screen Control"
|
||
},
|
||
openSettingsMessage: {
|
||
"id": "tw.openAdvanced",
|
||
"defaultMessage": "Open advanced settings"
|
||
}
|
||
});
|
||
const enableSettingsButton = new URLSearchParams(location.search).has('settings-button');
|
||
|
||
const StageHeaderComponent = function StageHeaderComponent(props) {
|
||
const {
|
||
customStageSize,
|
||
isFullScreen,
|
||
isPlayerOnly,
|
||
onKeyPress,
|
||
onSetStageLarge,
|
||
onSetStageSmall,
|
||
onSetStageFull,
|
||
onSetStageUnFull,
|
||
onOpenSettings,
|
||
isEmbedded,
|
||
stageSizeMode,
|
||
vm
|
||
} = props;
|
||
let header = null;
|
||
|
||
if (isFullScreen || isEmbedded) {
|
||
const stageDimensions = Object(_lib_screen_utils__WEBPACK_IMPORTED_MODULE_9__["getStageDimensions"])(null, customStageSize, true);
|
||
const settingsButton = isEmbedded && enableSettingsButton ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButton,
|
||
onClick: onOpenSettings
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
alt: props.intl.formatMessage(messages.openSettingsMessage),
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButtonIcon,
|
||
draggable: false,
|
||
src: _icon_settings_svg__WEBPACK_IMPORTED_MODULE_15___default.a,
|
||
title: props.intl.formatMessage(messages.openSettingsMessage)
|
||
})) : null;
|
||
const fullscreenButton = isFullScreen ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButton,
|
||
onClick: onSetStageUnFull,
|
||
onKeyPress: onKeyPress
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
alt: props.intl.formatMessage(messages.unFullStageSizeMessage),
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButtonIcon,
|
||
draggable: false,
|
||
src: _icon_unfullscreen_svg__WEBPACK_IMPORTED_MODULE_14___default.a,
|
||
title: props.intl.formatMessage(messages.fullscreenControl)
|
||
})) : _lib_tw_fullscreen_api__WEBPACK_IMPORTED_MODULE_17__["default"].available() ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButton,
|
||
onClick: onSetStageFull
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
alt: props.intl.formatMessage(messages.fullStageSizeMessage),
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButtonIcon,
|
||
draggable: false,
|
||
src: _icon_fullscreen_svg__WEBPACK_IMPORTED_MODULE_11___default.a,
|
||
title: props.intl.formatMessage(messages.fullscreenControl)
|
||
})) : null;
|
||
header = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageHeaderWrapperOverlay, {
|
||
[_stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.embedded]: isEmbedded
|
||
})
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageMenuWrapper,
|
||
style: {
|
||
width: stageDimensions.width
|
||
}
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_controls_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], {
|
||
vm: vm
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.embedButtons
|
||
}, settingsButton, fullscreenButton)));
|
||
} else {
|
||
const stageControls = isPlayerOnly ? [] : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageSizeToggleGroup
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButton, _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButtonFirst, stageSizeMode === _lib_layout_constants__WEBPACK_IMPORTED_MODULE_10__["STAGE_SIZE_MODES"].small ? null : _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButtonToggledOff),
|
||
onClick: onSetStageSmall
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
alt: props.intl.formatMessage(messages.smallStageSizeMessage),
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButtonIcon,
|
||
draggable: false,
|
||
src: _icon_small_stage_svg__WEBPACK_IMPORTED_MODULE_13___default.a
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButton, _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButtonLast, stageSizeMode === _lib_layout_constants__WEBPACK_IMPORTED_MODULE_10__["STAGE_SIZE_MODES"].large ? null : _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButtonToggledOff),
|
||
onClick: onSetStageLarge
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
alt: props.intl.formatMessage(messages.largeStageSizeMessage),
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButtonIcon,
|
||
draggable: false,
|
||
src: _icon_large_stage_svg__WEBPACK_IMPORTED_MODULE_12___default.a
|
||
}))));
|
||
header = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageHeaderWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageMenuWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_containers_controls_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], {
|
||
vm: vm,
|
||
isSmall: stageSizeMode === _lib_layout_constants__WEBPACK_IMPORTED_MODULE_10__["STAGE_SIZE_MODES"].small
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageSizeRow
|
||
}, stageControls, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButton,
|
||
onClick: onSetStageFull
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("img", {
|
||
alt: props.intl.formatMessage(messages.fullStageSizeMessage),
|
||
className: _stage_header_css__WEBPACK_IMPORTED_MODULE_16___default.a.stageButtonIcon,
|
||
draggable: false,
|
||
src: _icon_fullscreen_svg__WEBPACK_IMPORTED_MODULE_11___default.a,
|
||
title: props.intl.formatMessage(messages.fullscreenControl)
|
||
}))))));
|
||
}
|
||
|
||
return header;
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
customStageSize: state.scratchGui.customStageSize,
|
||
// This is the button's mode, as opposed to the actual current state
|
||
stageSizeMode: state.scratchGui.stageSize.stageSize
|
||
});
|
||
|
||
StageHeaderComponent.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_1__["intlShape"],
|
||
customStageSize: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number
|
||
}),
|
||
isFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,
|
||
isPlayerOnly: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,
|
||
onKeyPress: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onSetStageFull: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onSetStageLarge: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onSetStageSmall: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onSetStageUnFull: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onOpenSettings: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
isEmbedded: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,
|
||
stageSizeMode: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(Object.keys(_lib_layout_constants__WEBPACK_IMPORTED_MODULE_10__["STAGE_SIZE_MODES"])),
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_5___default.a).isRequired
|
||
};
|
||
StageHeaderComponent.defaultProps = {
|
||
stageSizeMode: _lib_layout_constants__WEBPACK_IMPORTED_MODULE_10__["STAGE_SIZE_MODES"].large
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_1__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_4__["connect"])(mapStateToProps)(StageHeaderComponent)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stage-selector/stage-selector.css":
|
||
/*!**********************************************************!*\
|
||
!*** ./src/components/stage-selector/stage-selector.css ***!
|
||
\**********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./stage-selector.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/stage-selector/stage-selector.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stage-selector/stage-selector.jsx":
|
||
/*!**********************************************************!*\
|
||
!*** ./src/components/stage-selector/stage-selector.jsx ***!
|
||
\**********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _action_menu_action_menu_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../action-menu/action-menu.jsx */ "./src/components/action-menu/action-menu.jsx");
|
||
/* harmony import */ var _stage_selector_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./stage-selector.css */ "./src/components/stage-selector/stage-selector.css");
|
||
/* harmony import */ var _stage_selector_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_stage_selector_css__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @turbowarp/scratch-l10n */ "./node_modules/@turbowarp/scratch-l10n/src/index.js");
|
||
/* harmony import */ var _action_menu_icon_backdrop_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../action-menu/icon--backdrop.svg */ "./src/components/action-menu/icon--backdrop.svg");
|
||
/* harmony import */ var _action_menu_icon_backdrop_svg__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_action_menu_icon_backdrop_svg__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var _action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../action-menu/icon--file-upload.svg */ "./src/components/action-menu/icon--file-upload.svg");
|
||
/* harmony import */ var _action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_9__);
|
||
/* harmony import */ var _action_menu_icon_paint_svg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../action-menu/icon--paint.svg */ "./src/components/action-menu/icon--paint.svg");
|
||
/* harmony import */ var _action_menu_icon_paint_svg__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_action_menu_icon_paint_svg__WEBPACK_IMPORTED_MODULE_10__);
|
||
/* harmony import */ var _action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../action-menu/icon--surprise.svg */ "./src/components/action-menu/icon--surprise.svg");
|
||
/* harmony import */ var _action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_11__);
|
||
/* harmony import */ var _action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../action-menu/icon--search.svg */ "./src/components/action-menu/icon--search.svg");
|
||
/* harmony import */ var _action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_12__);
|
||
const _excluded = ["backdropCount", "containerRef", "dragOver", "fileInputRef", "intl", "selected", "raised", "receivedBlocks", "url", "onBackdropFileUploadClick", "onBackdropFileUpload", "onClick", "onMouseEnter", "onMouseLeave", "onNewBackdropClick", "onSurpriseBackdropClick", "onEmptyBackdropClick"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
addBackdropFromLibrary: {
|
||
"id": "gui.spriteSelector.addBackdropFromLibrary",
|
||
"defaultMessage": "Choose a Backdrop"
|
||
},
|
||
addBackdropFromPaint: {
|
||
"id": "gui.stageSelector.addBackdropFromPaint",
|
||
"defaultMessage": "Paint"
|
||
},
|
||
addBackdropFromSurprise: {
|
||
"id": "gui.stageSelector.addBackdropFromSurprise",
|
||
"defaultMessage": "Surprise"
|
||
},
|
||
addBackdropFromFile: {
|
||
"id": "gui.stageSelector.addBackdropFromFile",
|
||
"defaultMessage": "Upload Backdrop"
|
||
}
|
||
});
|
||
|
||
const StageSelector = props => {
|
||
const {
|
||
backdropCount,
|
||
containerRef,
|
||
dragOver,
|
||
fileInputRef,
|
||
intl,
|
||
selected,
|
||
raised,
|
||
receivedBlocks,
|
||
url,
|
||
onBackdropFileUploadClick,
|
||
onBackdropFileUpload,
|
||
onClick,
|
||
onMouseEnter,
|
||
onMouseLeave,
|
||
onNewBackdropClick,
|
||
onSurpriseBackdropClick,
|
||
onEmptyBackdropClick
|
||
} = props,
|
||
componentProps = _objectWithoutProperties(props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], _extends({
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_stage_selector_css__WEBPACK_IMPORTED_MODULE_6___default.a.stageSelector, {
|
||
[_stage_selector_css__WEBPACK_IMPORTED_MODULE_6___default.a.isSelected]: selected,
|
||
[_stage_selector_css__WEBPACK_IMPORTED_MODULE_6___default.a.raised]: raised || dragOver,
|
||
[_stage_selector_css__WEBPACK_IMPORTED_MODULE_6___default.a.receivedBlocks]: receivedBlocks
|
||
}),
|
||
componentRef: containerRef,
|
||
onClick: onClick,
|
||
onMouseEnter: onMouseEnter,
|
||
onMouseLeave: onMouseLeave
|
||
}, componentProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _stage_selector_css__WEBPACK_IMPORTED_MODULE_6___default.a.header
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _stage_selector_css__WEBPACK_IMPORTED_MODULE_6___default.a.headerTitle
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Stage",
|
||
id: "gui.stageSelector.stage"
|
||
}))), url ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: _stage_selector_css__WEBPACK_IMPORTED_MODULE_6___default.a.costumeCanvas,
|
||
src: url
|
||
}) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _stage_selector_css__WEBPACK_IMPORTED_MODULE_6___default.a.label
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Backdrops",
|
||
id: "gui.stageSelector.backdrops"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _stage_selector_css__WEBPACK_IMPORTED_MODULE_6___default.a.count
|
||
}, backdropCount), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_action_menu_action_menu_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _stage_selector_css__WEBPACK_IMPORTED_MODULE_6___default.a.addButton,
|
||
img: _action_menu_icon_backdrop_svg__WEBPACK_IMPORTED_MODULE_8___default.a,
|
||
moreButtons: [{
|
||
title: intl.formatMessage(messages.addBackdropFromFile),
|
||
img: _action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_9___default.a,
|
||
onClick: onBackdropFileUploadClick,
|
||
fileAccept: '.svg, .png, .bmp, .jpg, .jpeg, .jfif, .webp, .gif',
|
||
fileChange: onBackdropFileUpload,
|
||
fileInput: fileInputRef,
|
||
fileMultiple: true
|
||
}, {
|
||
title: intl.formatMessage(messages.addBackdropFromSurprise),
|
||
img: _action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_11___default.a,
|
||
onClick: onSurpriseBackdropClick
|
||
}, {
|
||
title: intl.formatMessage(messages.addBackdropFromPaint),
|
||
img: _action_menu_icon_paint_svg__WEBPACK_IMPORTED_MODULE_10___default.a,
|
||
onClick: onEmptyBackdropClick
|
||
}, {
|
||
title: intl.formatMessage(messages.addBackdropFromLibrary),
|
||
img: _action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_12___default.a,
|
||
onClick: onNewBackdropClick
|
||
}],
|
||
title: intl.formatMessage(messages.addBackdropFromLibrary),
|
||
tooltipPlace: Object(_turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_7__["isRtl"])(intl.locale) ? 'right' : 'left',
|
||
onClick: onNewBackdropClick
|
||
}));
|
||
};
|
||
|
||
StageSelector.propTypes = {
|
||
backdropCount: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,
|
||
containerRef: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
dragOver: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
fileInputRef: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"].isRequired,
|
||
onBackdropFileUpload: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onBackdropFileUploadClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onEmptyBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onMouseEnter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onMouseLeave: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onNewBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onSurpriseBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
raised: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
receivedBlocks: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
selected: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(StageSelector));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stage-wrapper/stage-wrapper.css":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/stage-wrapper/stage-wrapper.css ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./stage-wrapper.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/stage-wrapper/stage-wrapper.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stage-wrapper/stage-wrapper.jsx":
|
||
/*!********************************************************!*\
|
||
!*** ./src/components/stage-wrapper/stage-wrapper.jsx ***!
|
||
\********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib/layout-constants.js */ "./src/lib/layout-constants.js");
|
||
/* harmony import */ var _containers_stage_header_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../containers/stage-header.jsx */ "./src/containers/stage-header.jsx");
|
||
/* harmony import */ var _containers_stage_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../containers/stage.jsx */ "./src/containers/stage.jsx");
|
||
/* harmony import */ var _loader_loader_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../loader/loader.jsx */ "./src/components/loader/loader.jsx");
|
||
/* harmony import */ var _stage_wrapper_css__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./stage-wrapper.css */ "./src/components/stage-wrapper/stage-wrapper.css");
|
||
/* harmony import */ var _stage_wrapper_css__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_stage_wrapper_css__WEBPACK_IMPORTED_MODULE_9__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const StageWrapperComponent = function StageWrapperComponent(props) {
|
||
const {
|
||
isEmbedded,
|
||
isFullScreen,
|
||
isRtl,
|
||
isRendererSupported,
|
||
loading,
|
||
stageSize,
|
||
vm
|
||
} = props;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_stage_wrapper_css__WEBPACK_IMPORTED_MODULE_9___default.a.stageWrapper, {
|
||
[_stage_wrapper_css__WEBPACK_IMPORTED_MODULE_9___default.a.embedded]: isEmbedded
|
||
}, {
|
||
[_stage_wrapper_css__WEBPACK_IMPORTED_MODULE_9___default.a.fullScreen]: isFullScreen
|
||
}),
|
||
dir: isRtl ? 'rtl' : 'ltr'
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _stage_wrapper_css__WEBPACK_IMPORTED_MODULE_9___default.a.stageMenuWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_stage_header_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
stageSize: stageSize,
|
||
vm: vm
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _stage_wrapper_css__WEBPACK_IMPORTED_MODULE_9___default.a.stageCanvasWrapper
|
||
}, isRendererSupported ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_stage_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
stageSize: stageSize,
|
||
vm: vm
|
||
}) : null), loading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_loader_loader_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], {
|
||
isFullScreen: isFullScreen
|
||
}) : null);
|
||
};
|
||
|
||
StageWrapperComponent.propTypes = {
|
||
isEmbedded: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
isFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
isRendererSupported: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
loading: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
stageSize: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf(Object.keys(_lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_5__["STAGE_DISPLAY_SIZES"])).isRequired,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_3___default.a).isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (StageWrapperComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stage/stage.css":
|
||
/*!****************************************!*\
|
||
!*** ./src/components/stage/stage.css ***!
|
||
\****************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./stage.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/stage/stage.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stage/stage.jsx":
|
||
/*!****************************************!*\
|
||
!*** ./src/components/stage/stage.jsx ***!
|
||
\****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _containers_dom_element_renderer_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../containers/dom-element-renderer.jsx */ "./src/containers/dom-element-renderer.jsx");
|
||
/* harmony import */ var _loupe_loupe_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../loupe/loupe.jsx */ "./src/components/loupe/loupe.jsx");
|
||
/* harmony import */ var _containers_monitor_list_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../containers/monitor-list.jsx */ "./src/containers/monitor-list.jsx");
|
||
/* harmony import */ var _containers_target_highlight_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../containers/target-highlight.jsx */ "./src/containers/target-highlight.jsx");
|
||
/* harmony import */ var _containers_green_flag_overlay_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../containers/green-flag-overlay.jsx */ "./src/containers/green-flag-overlay.jsx");
|
||
/* harmony import */ var _containers_question_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../containers/question.jsx */ "./src/containers/question.jsx");
|
||
/* harmony import */ var _mic_indicator_mic_indicator_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../mic-indicator/mic-indicator.jsx */ "./src/components/mic-indicator/mic-indicator.jsx");
|
||
/* harmony import */ var _lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../lib/layout-constants.js */ "./src/lib/layout-constants.js");
|
||
/* harmony import */ var _lib_screen_utils_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../lib/screen-utils.js */ "./src/lib/screen-utils.js");
|
||
/* harmony import */ var _stage_css__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./stage.css */ "./src/components/stage/stage.css");
|
||
/* harmony import */ var _stage_css__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_stage_css__WEBPACK_IMPORTED_MODULE_13__);
|
||
const _excluded = ["canvas", "customStageSize", "dragRef", "isColorPicking", "isFullScreen", "isPlayerOnly", "isStarted", "colorInfo", "micIndicator", "question", "stageSize", "useEditorDragStyle", "onDeactivateColorPicker", "onDoubleClick", "onQuestionAnswered"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const StageComponent = props => {
|
||
const {
|
||
canvas,
|
||
customStageSize,
|
||
dragRef,
|
||
isColorPicking,
|
||
isFullScreen,
|
||
isPlayerOnly,
|
||
isStarted,
|
||
colorInfo,
|
||
micIndicator,
|
||
question,
|
||
stageSize,
|
||
useEditorDragStyle,
|
||
onDeactivateColorPicker,
|
||
onDoubleClick,
|
||
onQuestionAnswered
|
||
} = props,
|
||
boxProps = _objectWithoutProperties(props, _excluded);
|
||
|
||
const stageDimensions = Object(_lib_screen_utils_js__WEBPACK_IMPORTED_MODULE_12__["getStageDimensions"])(stageSize, customStageSize, isFullScreen);
|
||
const minWidth = Object(_lib_screen_utils_js__WEBPACK_IMPORTED_MODULE_12__["getMinWidth"])(stageSize);
|
||
const transformStyle = stageDimensions.width < minWidth && !isFullScreen ? {
|
||
transform: "translateX(".concat((minWidth - stageDimensions.width) / 2, "px)")
|
||
} : {};
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.stageWrapper, {
|
||
[_stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.withColorPicker]: !isFullScreen && isColorPicking
|
||
}),
|
||
onDoubleClick: onDoubleClick,
|
||
style: isPlayerOnly ? null : {
|
||
minWidth: "".concat(minWidth, "px")
|
||
}
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.stage, {
|
||
[_stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.fullScreen]: isFullScreen
|
||
}),
|
||
style: _objectSpread({
|
||
height: stageDimensions.height,
|
||
width: stageDimensions.width
|
||
}, transformStyle)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_dom_element_renderer_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], _extends({
|
||
domElement: canvas,
|
||
style: {
|
||
height: stageDimensions.height,
|
||
width: stageDimensions.width
|
||
}
|
||
}, boxProps)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.customOverlays
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_dom_element_renderer_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
domElement: props.overlay
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.monitorWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_monitor_list_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
draggable: useEditorDragStyle,
|
||
stageSize: stageDimensions
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.frameWrapper
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_target_highlight_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
className: _stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.frame,
|
||
stageHeight: stageDimensions.height,
|
||
stageWidth: stageDimensions.width
|
||
})), isColorPicking && colorInfo ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_loupe_loupe_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
colorInfo: colorInfo
|
||
}) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.stageOverlays, {
|
||
[_stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.fullScreen]: isFullScreen
|
||
}),
|
||
style: transformStyle
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.stageBottomWrapper,
|
||
style: {
|
||
width: stageDimensions.width,
|
||
height: stageDimensions.height
|
||
}
|
||
}, micIndicator ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_mic_indicator_mic_indicator_jsx__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
||
className: _stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.micIndicator,
|
||
stageSize: stageDimensions
|
||
}) : null, question === null ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.questionWrapper,
|
||
style: {
|
||
width: stageDimensions.width
|
||
}
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_question_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
question: question,
|
||
onQuestionAnswered: onQuestionAnswered
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("canvas", {
|
||
className: _stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.draggingSprite,
|
||
height: 0,
|
||
ref: dragRef,
|
||
width: 0
|
||
})), isStarted ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_green_flag_overlay_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], {
|
||
className: _stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.greenFlagOverlay,
|
||
wrapperClass: _stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.greenFlagOverlayWrapper
|
||
})), isColorPicking ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _stage_css__WEBPACK_IMPORTED_MODULE_13___default.a.colorPickerBackground,
|
||
onClick: onDeactivateColorPicker
|
||
}) : null);
|
||
};
|
||
|
||
StageComponent.propTypes = {
|
||
canvas: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(Element).isRequired,
|
||
customStageSize: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.height
|
||
}),
|
||
overlay: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(Element).isRequired,
|
||
colorInfo: _loupe_loupe_jsx__WEBPACK_IMPORTED_MODULE_5__["default"].propTypes.colorInfo,
|
||
dragRef: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
isColorPicking: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
isFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
isPlayerOnly: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
isStarted: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
micIndicator: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
onDeactivateColorPicker: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onDoubleClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onQuestionAnswered: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
question: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
stageSize: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf(Object.keys(_lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_11__["STAGE_DISPLAY_SIZES"])).isRequired,
|
||
useEditorDragStyle: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool
|
||
};
|
||
StageComponent.defaultProps = {
|
||
dragRef: () => {}
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (StageComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stop-all/icon--stop-all.svg":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/stop-all/icon--stop-all.svg ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/36fcc7dbca20720abcab01e49d4955f9.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stop-all/stop-all.css":
|
||
/*!**********************************************!*\
|
||
!*** ./src/components/stop-all/stop-all.css ***!
|
||
\**********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./stop-all.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/stop-all/stop-all.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/stop-all/stop-all.jsx":
|
||
/*!**********************************************!*\
|
||
!*** ./src/components/stop-all/stop-all.jsx ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _icon_stop_all_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./icon--stop-all.svg */ "./src/components/stop-all/icon--stop-all.svg");
|
||
/* harmony import */ var _icon_stop_all_svg__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_icon_stop_all_svg__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _stop_all_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stop-all.css */ "./src/components/stop-all/stop-all.css");
|
||
/* harmony import */ var _stop_all_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_stop_all_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
const _excluded = ["active", "className", "onClick", "title"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const StopAllComponent = function StopAllComponent(props) {
|
||
const {
|
||
active,
|
||
className,
|
||
onClick,
|
||
title
|
||
} = props,
|
||
componentProps = _objectWithoutProperties(props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", _extends({
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(className, _stop_all_css__WEBPACK_IMPORTED_MODULE_4___default.a.stopAll, {
|
||
[_stop_all_css__WEBPACK_IMPORTED_MODULE_4___default.a.isActive]: active
|
||
}),
|
||
draggable: false,
|
||
src: _icon_stop_all_svg__WEBPACK_IMPORTED_MODULE_3___default.a,
|
||
title: title,
|
||
onClick: onClick
|
||
}, componentProps));
|
||
};
|
||
|
||
StopAllComponent.propTypes = {
|
||
active: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
};
|
||
StopAllComponent.defaultProps = {
|
||
active: false,
|
||
title: 'Stop'
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (StopAllComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tag-button/tag-button.css":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/tag-button/tag-button.css ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./tag-button.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tag-button/tag-button.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tag-button/tag-button.jsx":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/tag-button/tag-button.jsx ***!
|
||
\**************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _button_button_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../button/button.jsx */ "./src/components/button/button.jsx");
|
||
/* harmony import */ var _tag_button_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tag-button.css */ "./src/components/tag-button/tag-button.css");
|
||
/* harmony import */ var _tag_button_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tag_button_css__WEBPACK_IMPORTED_MODULE_5__);
|
||
const _excluded = ["active", "iconClassName", "className", "tag", "intlLabel"];
|
||
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const TagButtonComponent = _ref => {
|
||
let {
|
||
active,
|
||
iconClassName,
|
||
className,
|
||
tag,
|
||
// eslint-disable-line no-unused-vars
|
||
intlLabel
|
||
} = _ref,
|
||
props = _objectWithoutProperties(_ref, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_button_button_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], _extends({
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_tag_button_css__WEBPACK_IMPORTED_MODULE_5___default.a.tagButton, className, {
|
||
[_tag_button_css__WEBPACK_IMPORTED_MODULE_5___default.a.active]: active
|
||
}),
|
||
iconClassName: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_tag_button_css__WEBPACK_IMPORTED_MODULE_5___default.a.tagButtonIcon, iconClassName)
|
||
}, props), typeof intlLabel === 'string' ? intlLabel : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], intlLabel));
|
||
};
|
||
|
||
TagButtonComponent.propTypes = _objectSpread(_objectSpread({}, _button_button_jsx__WEBPACK_IMPORTED_MODULE_4__["default"].propTypes), {}, {
|
||
active: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
intlLabel: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
defaultMessage: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
description: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
}), prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string]).isRequired,
|
||
tag: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired
|
||
});
|
||
TagButtonComponent.defaultProps = {
|
||
active: false
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (TagButtonComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/target-pane/target-pane.css":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/target-pane/target-pane.css ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./target-pane.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/target-pane/target-pane.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/target-pane/target-pane.jsx":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/target-pane/target-pane.jsx ***!
|
||
\****************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _containers_sprite_library_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../containers/sprite-library.jsx */ "./src/containers/sprite-library.jsx");
|
||
/* harmony import */ var _sprite_selector_sprite_selector_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../sprite-selector/sprite-selector.jsx */ "./src/components/sprite-selector/sprite-selector.jsx");
|
||
/* harmony import */ var _containers_stage_selector_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../containers/stage-selector.jsx */ "./src/containers/stage-selector.jsx");
|
||
/* harmony import */ var _lib_layout_constants__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib/layout-constants */ "./src/lib/layout-constants.js");
|
||
/* harmony import */ var _target_pane_css__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./target-pane.css */ "./src/components/target-pane/target-pane.css");
|
||
/* harmony import */ var _target_pane_css__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_target_pane_css__WEBPACK_IMPORTED_MODULE_7__);
|
||
const _excluded = ["editingTarget", "fileInputRef", "hoveredTarget", "spriteLibraryVisible", "onActivateBlocksTab", "onChangeSpriteDirection", "onChangeSpriteName", "onChangeSpriteRotationStyle", "onChangeSpriteSize", "onChangeSpriteVisibility", "onChangeSpriteX", "onChangeSpriteY", "onDeleteSprite", "onDrop", "onDuplicateSprite", "onExportSprite", "onFileUploadClick", "onNewSpriteClick", "onPaintSpriteClick", "onRequestCloseSpriteLibrary", "onSelectSprite", "onSpriteUpload", "onSurpriseSpriteClick", "raiseSprites", "stage", "stageSize", "sprites", "vm"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/*
|
||
* Pane that contains the sprite selector, sprite info, stage selector,
|
||
* and the new sprite, costume and backdrop buttons
|
||
* @param {object} props Props for the component
|
||
* @returns {React.Component} rendered component
|
||
*/
|
||
|
||
const TargetPane = _ref => {
|
||
let {
|
||
editingTarget,
|
||
fileInputRef,
|
||
hoveredTarget,
|
||
spriteLibraryVisible,
|
||
onActivateBlocksTab,
|
||
onChangeSpriteDirection,
|
||
onChangeSpriteName,
|
||
onChangeSpriteRotationStyle,
|
||
onChangeSpriteSize,
|
||
onChangeSpriteVisibility,
|
||
onChangeSpriteX,
|
||
onChangeSpriteY,
|
||
onDeleteSprite,
|
||
onDrop,
|
||
onDuplicateSprite,
|
||
onExportSprite,
|
||
onFileUploadClick,
|
||
onNewSpriteClick,
|
||
onPaintSpriteClick,
|
||
onRequestCloseSpriteLibrary,
|
||
onSelectSprite,
|
||
onSpriteUpload,
|
||
onSurpriseSpriteClick,
|
||
raiseSprites,
|
||
stage,
|
||
stageSize,
|
||
sprites,
|
||
vm
|
||
} = _ref,
|
||
componentProps = _objectWithoutProperties(_ref, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", _extends({
|
||
className: _target_pane_css__WEBPACK_IMPORTED_MODULE_7___default.a.targetPane
|
||
}, componentProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_sprite_selector_sprite_selector_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
editingTarget: editingTarget,
|
||
hoveredTarget: hoveredTarget,
|
||
raised: raiseSprites,
|
||
selectedId: editingTarget,
|
||
spriteFileInput: fileInputRef,
|
||
sprites: sprites,
|
||
stageSize: stageSize,
|
||
onChangeSpriteDirection: onChangeSpriteDirection,
|
||
onChangeSpriteName: onChangeSpriteName,
|
||
onChangeSpriteRotationStyle: onChangeSpriteRotationStyle,
|
||
onChangeSpriteSize: onChangeSpriteSize,
|
||
onChangeSpriteVisibility: onChangeSpriteVisibility,
|
||
onChangeSpriteX: onChangeSpriteX,
|
||
onChangeSpriteY: onChangeSpriteY,
|
||
onDeleteSprite: onDeleteSprite,
|
||
onDrop: onDrop,
|
||
onDuplicateSprite: onDuplicateSprite,
|
||
onExportSprite: onExportSprite,
|
||
onFileUploadClick: onFileUploadClick,
|
||
onNewSpriteClick: onNewSpriteClick,
|
||
onPaintSpriteClick: onPaintSpriteClick,
|
||
onSelectSprite: onSelectSprite,
|
||
onSpriteUpload: onSpriteUpload,
|
||
onSurpriseSpriteClick: onSurpriseSpriteClick
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: _target_pane_css__WEBPACK_IMPORTED_MODULE_7___default.a.stageSelectorWrapper
|
||
}, stage.id && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_stage_selector_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
asset: stage.costume && stage.costume.asset,
|
||
backdropCount: stage.costumeCount,
|
||
id: stage.id,
|
||
selected: stage.id === editingTarget,
|
||
onSelect: onSelectSprite
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", null, spriteLibraryVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_containers_sprite_library_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
vm: vm,
|
||
onActivateBlocksTab: onActivateBlocksTab,
|
||
onRequestClose: onRequestCloseSpriteLibrary
|
||
}) : null)));
|
||
};
|
||
|
||
const spriteShape = prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
costume: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
// asset is defined in scratch-storage's Asset.js
|
||
asset: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.object,
|
||
// eslint-disable-line react/forbid-prop-types
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
// The following are optional because costumes uploaded from disk
|
||
// will not have these properties available
|
||
bitmapResolution: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
rotationCenterX: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
rotationCenterY: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
}),
|
||
costumeCount: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
direction: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
order: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
size: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
visibility: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
x: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
y: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
});
|
||
TargetPane.propTypes = {
|
||
editingTarget: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
extensionLibraryVisible: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
fileInputRef: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
hoveredTarget: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
hoveredSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
receivedBlocks: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool
|
||
}),
|
||
onActivateBlocksTab: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onChangeSpriteDirection: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onChangeSpriteName: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onChangeSpriteRotationStyle: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onChangeSpriteSize: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onChangeSpriteVisibility: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onChangeSpriteX: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onChangeSpriteY: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onDeleteSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onDrop: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onDuplicateSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onExportSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onFileUploadClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onNewSpriteClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onPaintSpriteClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onRequestCloseExtensionLibrary: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onRequestCloseSpriteLibrary: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onSelectSprite: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onSpriteUpload: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onSurpriseSpriteClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
raiseSprites: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
spriteLibraryVisible: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
sprites: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.objectOf(spriteShape),
|
||
stage: spriteShape,
|
||
stageSize: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf(Object.keys(_lib_layout_constants__WEBPACK_IMPORTED_MODULE_6__["STAGE_DISPLAY_SIZES"])).isRequired,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_2___default.a)
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (TargetPane);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/telemetry-modal/telemetry-modal-header.png":
|
||
/*!*******************************************************************!*\
|
||
!*** ./src/components/telemetry-modal/telemetry-modal-header.png ***!
|
||
\*******************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/fb356e819d8ab210a241ce81b9bac33c.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/telemetry-modal/telemetry-modal.css":
|
||
/*!************************************************************!*\
|
||
!*** ./src/components/telemetry-modal/telemetry-modal.css ***!
|
||
\************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./telemetry-modal.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/telemetry-modal/telemetry-modal.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/telemetry-modal/telemetry-modal.jsx":
|
||
/*!************************************************************!*\
|
||
!*** ./src/components/telemetry-modal/telemetry-modal.jsx ***!
|
||
\************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var react_modal__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-modal */ "./node_modules/react-modal/lib/index.js");
|
||
/* harmony import */ var react_modal__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_modal__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _telemetry_modal_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./telemetry-modal.css */ "./src/components/telemetry-modal/telemetry-modal.css");
|
||
/* harmony import */ var _telemetry_modal_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_telemetry_modal_css__WEBPACK_IMPORTED_MODULE_6__);
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
label: {
|
||
"id": "gui.telemetryOptIn.label",
|
||
"defaultMessage": "Report statistics to improve Scratch"
|
||
},
|
||
bodyText1: {
|
||
"id": "gui.telemetryOptIn.body1",
|
||
"defaultMessage": "The Scratch Team is always looking to better understand how Scratch is used around the world. To help support this effort, you can allow Scratch to automatically send usage information to the Scratch Team."
|
||
},
|
||
bodyText2: {
|
||
"id": "gui.telemetryOptIn.body2",
|
||
"defaultMessage": "The information we collect includes language selection, blocks usage, and some events like saving, loading, and uploading a project. We DO NOT collect any personal information. Please see our {privacyPolicyLink} for more information."
|
||
},
|
||
privacyPolicyLink: {
|
||
"id": "gui.telemetryOptIn.privacyPolicyLink",
|
||
"defaultMessage": "Privacy Policy"
|
||
},
|
||
optInText: {
|
||
"id": "gui.telemetryOptIn.optInText",
|
||
"defaultMessage": "Share my usage data with the Scratch Team"
|
||
},
|
||
optInTooltip: {
|
||
"id": "gui.telemetryOptIn.optInTooltip",
|
||
"defaultMessage": "Enable telemetry"
|
||
},
|
||
optOutText: {
|
||
"id": "gui.telemetryOptIn.optOutText",
|
||
"defaultMessage": "Do not share my usage data with the Scratch Team"
|
||
},
|
||
optOutTooltip: {
|
||
"id": "gui.telemetryOptIn.optOutTooltip",
|
||
"defaultMessage": "Disable telemetry"
|
||
},
|
||
settingWasUpdated: {
|
||
"id": "gui.telemetryOptIn.settingWasUpdated",
|
||
"defaultMessage": "Your setting was updated."
|
||
},
|
||
closeButton: {
|
||
"id": "gui.telemetryOptIn.buttonClose",
|
||
"defaultMessage": "Close"
|
||
}
|
||
}); // This should be at least as long as the CSS transition
|
||
|
||
const SETTING_WAS_UPDATED_DURATION_MS = 3000;
|
||
|
||
class TelemetryModal extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleCancel', 'handleOptInOutChanged']);
|
||
this.state = {
|
||
// if the settingWasUpdated message is displayed, this will be the ID of its removal timer
|
||
settingWasUpdatedTimer: null
|
||
};
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
if (this.state.settingWasUpdatedTimer) {
|
||
clearTimeout(this.state.settingWasUpdatedTimer);
|
||
}
|
||
}
|
||
|
||
handleCancel() {
|
||
this.props.onRequestClose();
|
||
|
||
if (this.props.onCancel) {
|
||
this.props.onCancel();
|
||
}
|
||
}
|
||
|
||
handleOptInOutChanged(e) {
|
||
if (e.target.value === 'true') {
|
||
if (this.props.onOptIn) {
|
||
this.props.onOptIn();
|
||
this.handleSettingWasUpdated();
|
||
}
|
||
} else if (e.target.value === 'false') {
|
||
if (this.props.onOptOut) {
|
||
this.props.onOptOut();
|
||
this.handleSettingWasUpdated();
|
||
}
|
||
}
|
||
}
|
||
|
||
handleSettingWasUpdated() {
|
||
if (this.state.settingWasUpdatedTimer) {
|
||
clearTimeout(this.state.settingWasUpdatedTimer);
|
||
}
|
||
|
||
const newTimer = setTimeout(() => this.handleSettingWasUpdatedTimeout(newTimer), SETTING_WAS_UPDATED_DURATION_MS);
|
||
this.setState({
|
||
settingWasUpdatedTimer: newTimer
|
||
});
|
||
}
|
||
|
||
handleSettingWasUpdatedTimeout(thisTimer) {
|
||
if (thisTimer !== this.state.settingWasUpdatedTimer) {
|
||
// some other timer has taken over
|
||
return;
|
||
}
|
||
|
||
this.setState({
|
||
settingWasUpdatedTimer: null
|
||
});
|
||
}
|
||
|
||
render() {
|
||
const isUndecided = typeof this.props.isTelemetryEnabled !== 'boolean';
|
||
const isOff = this.props.isTelemetryEnabled === false;
|
||
const isOn = this.props.isTelemetryEnabled === true;
|
||
const settingWasUpdated = this.state.settingWasUpdatedTimer && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.settingWasUpdated);
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_modal__WEBPACK_IMPORTED_MODULE_4___default.a, {
|
||
isOpen: true,
|
||
className: _telemetry_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.modalContent,
|
||
contentLabel: this.props.intl.formatMessage(messages.label),
|
||
overlayClassName: _telemetry_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.modalOverlay,
|
||
onRequestClose: this.handleCancel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
dir: this.props.isRtl ? 'rtl' : 'ltr'
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _telemetry_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.illustration
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _telemetry_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.bodyText1)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], _extends({}, messages.bodyText2, {
|
||
values: {
|
||
privacyPolicyLink: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("a", {
|
||
className: _telemetry_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.privacyPolicyLink,
|
||
href: "https://scratch.mit.edu/privacy_policy/",
|
||
onClick: this.props.onShowPrivacyPolicy,
|
||
target: "_blank",
|
||
rel: "noopener noreferrer"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.privacyPolicyLink))
|
||
}
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _telemetry_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.radioButtons
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("label", {
|
||
className: isOn ? _telemetry_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.labelSelected : null
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("input", {
|
||
name: "optInOut",
|
||
type: "radio",
|
||
value: "true",
|
||
title: this.props.intl.formatMessage(messages.optInTooltip),
|
||
checked: this.props.isTelemetryEnabled === true,
|
||
onChange: this.handleOptInOutChanged
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.optInText)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("label", {
|
||
className: isOff ? _telemetry_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.labelSelected : null
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("input", {
|
||
name: "optInOut",
|
||
type: "radio",
|
||
value: "false",
|
||
title: this.props.intl.formatMessage(messages.optOutTooltip),
|
||
checked: this.props.isTelemetryEnabled === false,
|
||
onChange: this.handleOptInOutChanged
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.optOutText))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _telemetry_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.buttonRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("span", {
|
||
className: _telemetry_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.settingWasUpdated,
|
||
key: this.state.settingWasUpdatedTimer // restart CSS fade when timer changes
|
||
|
||
}, settingWasUpdated), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _telemetry_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.optIn,
|
||
onClick: this.props.onRequestClose,
|
||
disabled: isUndecided
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], messages.closeButton))))));
|
||
}
|
||
|
||
}
|
||
|
||
TelemetryModal.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"].isRequired,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isTelemetryEnabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
// false=disabled, true=enabled, undefined=undecided
|
||
onCancel: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onOptIn: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onOptOut: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onRequestClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onShowPrivacyPolicy: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(TelemetryModal));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/turbo-mode/icon--turbo.svg":
|
||
/*!***************************************************!*\
|
||
!*** ./src/components/turbo-mode/icon--turbo.svg ***!
|
||
\***************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/f2457825850317e66ef2128504613c30.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/turbo-mode/turbo-mode.css":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/turbo-mode/turbo-mode.css ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./turbo-mode.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/turbo-mode/turbo-mode.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/turbo-mode/turbo-mode.jsx":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/turbo-mode/turbo-mode.jsx ***!
|
||
\**************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _icon_turbo_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./icon--turbo.svg */ "./src/components/turbo-mode/icon--turbo.svg");
|
||
/* harmony import */ var _icon_turbo_svg__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_icon_turbo_svg__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _turbo_mode_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./turbo-mode.css */ "./src/components/turbo-mode/turbo-mode.css");
|
||
/* harmony import */ var _turbo_mode_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_turbo_mode_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const TurboMode = ({
|
||
isSmall
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _turbo_mode_css__WEBPACK_IMPORTED_MODULE_4___default.a.turboContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {
|
||
className: _turbo_mode_css__WEBPACK_IMPORTED_MODULE_4___default.a.turboIcon,
|
||
src: _icon_turbo_svg__WEBPACK_IMPORTED_MODULE_3___default.a
|
||
}), !isSmall && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _turbo_mode_css__WEBPACK_IMPORTED_MODULE_4___default.a.turboLabel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Turbo Mode",
|
||
id: "gui.turboMode.active"
|
||
})));
|
||
|
||
TurboMode.propTypes = {
|
||
isSmall: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool
|
||
};
|
||
TurboMode.defaultProps = {
|
||
isSmall: false
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (TurboMode);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-custom-extension-modal/custom-extension-modal.css":
|
||
/*!*****************************************************************************!*\
|
||
!*** ./src/components/tw-custom-extension-modal/custom-extension-modal.css ***!
|
||
\*****************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./custom-extension-modal.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-custom-extension-modal/custom-extension-modal.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-custom-extension-modal/custom-extension-modal.jsx":
|
||
/*!*****************************************************************************!*\
|
||
!*** ./src/components/tw-custom-extension-modal/custom-extension-modal.jsx ***!
|
||
\*****************************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _containers_modal_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../containers/modal.jsx */ "./src/containers/modal.jsx");
|
||
/* harmony import */ var _file_input_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./file-input.jsx */ "./src/components/tw-custom-extension-modal/file-input.jsx");
|
||
/* harmony import */ var _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./custom-extension-modal.css */ "./src/components/tw-custom-extension-modal/custom-extension-modal.css");
|
||
/* harmony import */ var _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _tw_fancy_checkbox_checkbox_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../tw-fancy-checkbox/checkbox.jsx */ "./src/components/tw-fancy-checkbox/checkbox.jsx");
|
||
/* harmony import */ var _lib_brand__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../lib/brand */ "./src/lib/brand.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["defineMessages"])({
|
||
title: {
|
||
"id": "tw.customExtensionModal.title",
|
||
"defaultMessage": "Load Custom Extension"
|
||
}
|
||
});
|
||
|
||
const CustomExtensionModal = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_containers_modal_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.modalContent,
|
||
onRequestClose: props.onClose,
|
||
contentLabel: props.intl.formatMessage(messages.title),
|
||
id: "customExtensionModal"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.body,
|
||
onDragOver: props.onDragOver,
|
||
onDragLeave: props.onDragLeave,
|
||
onDrop: props.onDrop
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.typeSelectorContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.typeSelectorButton,
|
||
"data-active": props.type === 'url',
|
||
onClick: props.onSwitchToURL,
|
||
tabIndex: 0
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "URL" // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.customExtensionModal.url"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.typeSelectorButton,
|
||
"data-active": props.type === 'file',
|
||
onClick: props.onSwitchToFile,
|
||
tabIndex: 0
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "File" // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.customExtensionModal.file"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.typeSelectorButton,
|
||
"data-active": props.type === 'text',
|
||
onClick: props.onSwitchToText,
|
||
tabIndex: 0
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Text" // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.customExtensionModal.text"
|
||
}))), props.type === 'url' ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_2___default.a.Fragment, {
|
||
key: props.type
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Enter the extension's URL:",
|
||
id: "tw.customExtensionModal.promptURL"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("input", {
|
||
type: "text",
|
||
className: _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.urlInput,
|
||
value: props.url,
|
||
onChange: props.onChangeURL,
|
||
onKeyDown: props.onKeyDown,
|
||
placeholder: "https://extensions.turbowarp.org/...",
|
||
autoFocus: true
|
||
})) : props.type === 'file' ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_2___default.a.Fragment, {
|
||
key: props.type
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Select the extension's JavaScript file:",
|
||
id: "tw.customExtensionModal.promptFile"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_file_input_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
accept: ".js",
|
||
onChange: props.onChangeFile,
|
||
file: props.file
|
||
})) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_2___default.a.Fragment, {
|
||
key: props.type
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Paste the extension's JavaScript source code:",
|
||
id: "tw.customExtensionModal.promptText"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("textarea", {
|
||
className: _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.textCodeInput,
|
||
placeholder: 'class Extension {\n // ...\n}\nScratch.extensions.register(new Extension());',
|
||
value: props.text,
|
||
onChange: props.onChangeText,
|
||
autoFocus: true,
|
||
spellCheck: false
|
||
})), props.onChangeUnsandboxed ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_2___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("label", {
|
||
className: _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.unsandboxedContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_tw_fancy_checkbox_checkbox_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
className: _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.unsandboxedCheckbox,
|
||
checked: props.unsandboxed,
|
||
onChange: props.onChangeUnsandboxed
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Run extension without sandbox",
|
||
id: "tw.customExtensionModal.unsandboxed"
|
||
})), props.unsandboxed && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", {
|
||
className: _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.unsandboxedWarning
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Loading extensions without the sandbox is dangerous and should not be enabled if you don't know what you're doing.",
|
||
id: "tw.customExtensionModal.unsandboxedWarning1"
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Unsandboxed extensions can corrupt your project, delete your settings, phish for passwords, and other bad things. The {APP_NAME} developers are not responsible for any resulting issues.",
|
||
id: "tw.customExtensionModal.unsandboxedWarning2",
|
||
values: {
|
||
APP_NAME: _lib_brand__WEBPACK_IMPORTED_MODULE_8__["APP_NAME"]
|
||
}
|
||
}))) : props.unsandboxed ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", {
|
||
className: _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.trustedExtension
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "This extension will be loaded without the sandbox because it is from a trusted source.",
|
||
id: "tw.customExtensionModal.trusted"
|
||
})) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Extensions from untrusted URLs will always be loaded with the sandbox for security.",
|
||
id: "tw.customExtensionModal.untrusted"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.buttonRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _custom_extension_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.loadButton,
|
||
onClick: props.onLoadExtension,
|
||
disabled: !props.canLoadExtension
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Load",
|
||
id: "tw.customExtensionModal.load"
|
||
})))));
|
||
|
||
CustomExtensionModal.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_0__["intlShape"],
|
||
canLoadExtension: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
type: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['url', 'file', 'text']).isRequired,
|
||
onSwitchToFile: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onSwitchToURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onSwitchToText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
file: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(File),
|
||
onChangeFile: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onDragOver: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onDragLeave: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onDrop: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
onChangeURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
text: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
onChangeText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
unsandboxed: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
onChangeUnsandboxed: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onLoadExtension: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["injectIntl"])(CustomExtensionModal));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-custom-extension-modal/file-input.css":
|
||
/*!*****************************************************************!*\
|
||
!*** ./src/components/tw-custom-extension-modal/file-input.css ***!
|
||
\*****************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./file-input.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-custom-extension-modal/file-input.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-custom-extension-modal/file-input.jsx":
|
||
/*!*****************************************************************!*\
|
||
!*** ./src/components/tw-custom-extension-modal/file-input.jsx ***!
|
||
\*****************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _file_input_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./file-input.css */ "./src/components/tw-custom-extension-modal/file-input.css");
|
||
/* harmony import */ var _file_input_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_file_input_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class FileInput extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleChange', 'handleClick']);
|
||
this.state = {
|
||
file: props.file
|
||
};
|
||
}
|
||
|
||
handleChange(e) {
|
||
const file = e.target.files[0];
|
||
this.props.onChange(file);
|
||
}
|
||
|
||
handleClick() {
|
||
const input = document.createElement('input');
|
||
input.type = 'file';
|
||
input.accept = this.props.accept;
|
||
input.addEventListener('change', this.handleChange);
|
||
document.body.appendChild(input);
|
||
input.click();
|
||
input.remove();
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
|
||
className: _file_input_css__WEBPACK_IMPORTED_MODULE_4___default.a.container,
|
||
onClick: this.handleClick
|
||
}, this.props.file ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "Selected: {name}" // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.fileInput.selected",
|
||
values: {
|
||
name: this.props.file.name
|
||
}
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__["FormattedMessage"], {
|
||
defaultMessage: "No file selected.",
|
||
id: "tw.fileInput.none"
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
FileInput.propTypes = {
|
||
file: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(File),
|
||
accept: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (FileInput);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-documentation-link/documentation-link.jsx":
|
||
/*!*********************************************************************!*\
|
||
!*** ./src/components/tw-documentation-link/documentation-link.jsx ***!
|
||
\*********************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
|
||
|
||
|
||
const DocumentationLink = ({
|
||
slug,
|
||
children
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a", {
|
||
href: "https://docs.turbowarp.org/".concat(slug),
|
||
target: "_blank",
|
||
rel: "noopener noreferrer"
|
||
}, children);
|
||
|
||
DocumentationLink.propTypes = {
|
||
slug: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (DocumentationLink);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-extension-separator/separator.css":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/components/tw-extension-separator/separator.css ***!
|
||
\*************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./separator.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-extension-separator/separator.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-extension-separator/separator.jsx":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/components/tw-extension-separator/separator.jsx ***!
|
||
\*************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _separator_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./separator.css */ "./src/components/tw-extension-separator/separator.css");
|
||
/* harmony import */ var _separator_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_separator_css__WEBPACK_IMPORTED_MODULE_1__);
|
||
|
||
|
||
|
||
const Separator = () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("hr", {
|
||
className: _separator_css__WEBPACK_IMPORTED_MODULE_1___default.a.separator
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Separator);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fancy-checkbox/checkbox.css":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/tw-fancy-checkbox/checkbox.css ***!
|
||
\*******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./checkbox.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-fancy-checkbox/checkbox.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fancy-checkbox/checkbox.jsx":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/tw-fancy-checkbox/checkbox.jsx ***!
|
||
\*******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _checkbox_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./checkbox.css */ "./src/components/tw-fancy-checkbox/checkbox.css");
|
||
/* harmony import */ var _checkbox_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_checkbox_css__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_3__);
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const FancyCheckbox = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("input", _extends({}, props, {
|
||
type: "checkbox",
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_3___default()(props.className, _checkbox_css__WEBPACK_IMPORTED_MODULE_2___default.a.checkbox)
|
||
}));
|
||
|
||
FancyCheckbox.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (FancyCheckbox);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fancy-checkbox/checkbox.svg":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/tw-fancy-checkbox/checkbox.svg ***!
|
||
\*******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/620f707d6d9dcd512ec6604b0eda2cb3.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/add-button.jsx":
|
||
/*!******************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/add-button.jsx ***!
|
||
\******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fonts-modal.css */ "./src/components/tw-fonts-modal/fonts-modal.css");
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_fonts_modal_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
|
||
|
||
|
||
|
||
|
||
const AddButton = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
|
||
onClick: props.onClick,
|
||
disabled: props.disabled,
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_3___default.a.button
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "Add",
|
||
id: "tw.fonts.add"
|
||
}));
|
||
|
||
AddButton.propTypes = {
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
disabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (AddButton);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/add-custom-font.jsx":
|
||
/*!***********************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/add-custom-font.jsx ***!
|
||
\***********************************************************/
|
||
/*! exports provided: FONT_FORMATS, default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FONT_FORMATS", function() { return FONT_FORMATS; });
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./fonts-modal.css */ "./src/components/tw-fonts-modal/fonts-modal.css");
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_fonts_modal_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _load_temporary_font_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./load-temporary-font.jsx */ "./src/components/tw-fonts-modal/load-temporary-font.jsx");
|
||
/* harmony import */ var _font_name_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./font-name.jsx */ "./src/components/tw-fonts-modal/font-name.jsx");
|
||
/* harmony import */ var _font_playground_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./font-playground.jsx */ "./src/components/tw-fonts-modal/font-playground.jsx");
|
||
/* harmony import */ var _font_fallback_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./font-fallback.jsx */ "./src/components/tw-fonts-modal/font-fallback.jsx");
|
||
/* harmony import */ var _add_button_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./add-button.jsx */ "./src/components/tw-fonts-modal/add-button.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["defineMessages"])({
|
||
error: {
|
||
"id": "tw.fonts.readError",
|
||
"defaultMessage": "Failed to read font file: {error}"
|
||
}
|
||
});
|
||
const FONT_FORMATS = ['ttf', 'otf', 'woff', 'woff2'];
|
||
|
||
const formatFontName = filename => {
|
||
// Remove file extension
|
||
const idx = filename.indexOf('.');
|
||
|
||
if (idx !== -1) {
|
||
filename = filename.substring(0, idx);
|
||
}
|
||
|
||
return filename;
|
||
};
|
||
|
||
const getDataFormat = filename => {
|
||
const parts = filename.split('.');
|
||
const extension = parts[parts.length - 1];
|
||
|
||
if (FONT_FORMATS.includes(extension)) {
|
||
return extension;
|
||
} // We'll just guess
|
||
|
||
|
||
return 'ttf';
|
||
};
|
||
|
||
class AddCustomFont extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default()(this, ['handleChangeFile', 'handleChangeName', 'handleChangeFallback', 'handleFinish']);
|
||
this.state = {
|
||
file: null,
|
||
url: null,
|
||
name: '',
|
||
format: '',
|
||
fallback: _font_fallback_jsx__WEBPACK_IMPORTED_MODULE_8__["default"].DEFAULT,
|
||
loading: false
|
||
};
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
URL.revokeObjectURL(this.state.url);
|
||
}
|
||
|
||
handleChangeFile(e) {
|
||
const file = e.target.files[0] || null;
|
||
|
||
if (file) {
|
||
this.setState({
|
||
file,
|
||
name: formatFontName(file.name),
|
||
format: getDataFormat(file.name),
|
||
url: URL.createObjectURL(file)
|
||
});
|
||
} else {
|
||
URL.revokeObjectURL(this.state.url);
|
||
this.setState({
|
||
file,
|
||
name: null,
|
||
url: null
|
||
});
|
||
}
|
||
}
|
||
|
||
handleChangeName(name) {
|
||
this.setState({
|
||
name
|
||
});
|
||
}
|
||
|
||
handleChangeFallback(fallback) {
|
||
this.setState({
|
||
fallback
|
||
});
|
||
}
|
||
|
||
handleFinish() {
|
||
this.setState({
|
||
loading: true
|
||
});
|
||
const fr = new FileReader();
|
||
|
||
fr.onload = () => {
|
||
const data = new Uint8Array(fr.result);
|
||
const storage = this.props.fontManager.runtime.storage;
|
||
const asset = storage.createAsset(storage.AssetType.Font, this.state.format, data, null, true);
|
||
this.props.fontManager.addCustomFont(this.state.name, this.state.fallback, asset);
|
||
this.props.onClose();
|
||
};
|
||
|
||
fr.onerror = () => {
|
||
// eslint-disable-next-line no-alert
|
||
alert(this.props.intl.formatMessage(messages.error), {
|
||
error: fr.error
|
||
});
|
||
this.setState({
|
||
loading: false
|
||
});
|
||
};
|
||
|
||
fr.readAsArrayBuffer(this.state.file);
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "Select a font file from your computer:",
|
||
id: "tw.fonts.custom.file"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("input", {
|
||
type: "file",
|
||
onChange: this.handleChangeFile,
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.fileInput,
|
||
accept: FONT_FORMATS.map(ext => ".".concat(ext)).join(','),
|
||
readOnly: this.state.loading
|
||
}), this.state.file && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "Give the font a name:",
|
||
id: "tw.fonts.custom.name"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_font_name_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
name: this.state.name,
|
||
onChange: this.handleChangeName,
|
||
fontManager: this.props.fontManager
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_load_temporary_font_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
url: this.state.url
|
||
}, family => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_font_playground_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
family: "".concat(family, ", ").concat(this.state.fallback)
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_font_fallback_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], {
|
||
fallback: this.state.fallback,
|
||
onChange: this.handleChangeFallback
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_add_button_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
onClick: this.handleFinish,
|
||
disabled: !this.state.file || !this.state.name || this.state.loading
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
AddCustomFont.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_2__["intlShape"],
|
||
fontManager: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
addCustomFont: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
runtime: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
// eslint-disable-next-line react/forbid-prop-types
|
||
storage: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.any
|
||
})
|
||
}),
|
||
onClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["injectIntl"])(AddCustomFont));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/add-system-font.jsx":
|
||
/*!***********************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/add-system-font.jsx ***!
|
||
\***********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _font_name_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./font-name.jsx */ "./src/components/tw-fonts-modal/font-name.jsx");
|
||
/* harmony import */ var _font_playground_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./font-playground.jsx */ "./src/components/tw-fonts-modal/font-playground.jsx");
|
||
/* harmony import */ var _font_fallback_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./font-fallback.jsx */ "./src/components/tw-fonts-modal/font-fallback.jsx");
|
||
/* harmony import */ var _add_button_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./add-button.jsx */ "./src/components/tw-fonts-modal/add-button.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class AddSystemFont extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default()(this, ['handleChangeName', 'handleChangeFallback', 'handleFinish']);
|
||
this.state = {
|
||
name: '',
|
||
fallback: _font_fallback_jsx__WEBPACK_IMPORTED_MODULE_6__["default"].DEFAULT,
|
||
localFonts: null
|
||
};
|
||
}
|
||
|
||
componentDidMount() {
|
||
// Chrome-only API
|
||
if (typeof queryLocalFonts === 'function') {
|
||
// eslint-disable-next-line no-undef
|
||
queryLocalFonts().then(fonts => {
|
||
const uniqueFamilies = [...new Set(fonts.map(i => i.family))];
|
||
this.setState({
|
||
localFonts: uniqueFamilies
|
||
});
|
||
});
|
||
}
|
||
}
|
||
|
||
handleChangeName(name) {
|
||
this.setState({
|
||
name
|
||
});
|
||
}
|
||
|
||
handleChangeFallback(fallback) {
|
||
this.setState({
|
||
fallback
|
||
});
|
||
}
|
||
|
||
handleFinish() {
|
||
this.props.fontManager.addSystemFont(this.state.name, this.state.fallback);
|
||
this.props.onClose();
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Type in the name of any font built in to your computer. The font may not appear correctly for everyone.",
|
||
id: "tw.fonts.system.name"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_font_name_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
name: this.state.name,
|
||
onChange: this.handleChangeName,
|
||
fontManager: this.props.fontManager,
|
||
placeholder: "Wingdings",
|
||
options: this.state.localFonts
|
||
}), this.state.name && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_font_playground_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
family: "".concat(this.state.name, ", ").concat(this.state.fallback)
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_font_fallback_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
fallback: this.state.fallback,
|
||
onChange: this.handleChangeFallback
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_add_button_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
onClick: this.handleFinish,
|
||
disabled: !this.state.name
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
AddSystemFont.propTypes = {
|
||
fontManager: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
addSystemFont: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
hasFont: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
}).isRequired,
|
||
onClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (AddSystemFont);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/custom.svg":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/custom.svg ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/f0fc12e672912247cc20d34ea452b517.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/delete.svg":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/delete.svg ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/d71c0379472f709318ef81ff0dccf7d5.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/export.svg":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/export.svg ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/01011831acb632804df035321ff68afe.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/font-dropdown-item.jsx":
|
||
/*!**************************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/font-dropdown-item.jsx ***!
|
||
\**************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fonts-modal.css */ "./src/components/tw-fonts-modal/fonts-modal.css");
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_fonts_modal_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
|
||
|
||
|
||
|
||
|
||
class FontDropdownItem extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleSelect']);
|
||
}
|
||
|
||
handleSelect() {
|
||
this.props.onSelect(this.props.family);
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_3___default.a.fontDropdownItem,
|
||
title: this.props.family,
|
||
style: {
|
||
fontFamily: this.props.family
|
||
},
|
||
onMouseDown: this.handleSelect
|
||
}, this.props.family);
|
||
}
|
||
|
||
}
|
||
|
||
FontDropdownItem.propTypes = {
|
||
family: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
onSelect: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (FontDropdownItem);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/font-fallback.jsx":
|
||
/*!*********************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/font-fallback.jsx ***!
|
||
\*********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fonts-modal.css */ "./src/components/tw-fonts-modal/fonts-modal.css");
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_fonts_modal_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var scratch_paint_src_lib_fonts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-paint/src/lib/fonts */ "./node_modules/scratch-paint/src/lib/fonts.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_6__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class FontFallbackButton extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_5___default()(this, ['handleClick']);
|
||
}
|
||
|
||
handleClick() {
|
||
this.props.onClick(this.props.family);
|
||
}
|
||
|
||
formatName() {
|
||
// keep in sync with scratch-paint/src/containers/font-dropdown.jsx
|
||
switch (this.props.family) {
|
||
case scratch_paint_src_lib_fonts__WEBPACK_IMPORTED_MODULE_4__["default"].CHINESE:
|
||
return '中文';
|
||
|
||
case scratch_paint_src_lib_fonts__WEBPACK_IMPORTED_MODULE_4__["default"].KOREAN:
|
||
return '한국어';
|
||
|
||
case scratch_paint_src_lib_fonts__WEBPACK_IMPORTED_MODULE_4__["default"].JAPANESE:
|
||
return '日本語';
|
||
}
|
||
|
||
return this.props.family;
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(_fonts_modal_css__WEBPACK_IMPORTED_MODULE_3___default.a.fallbackButton, {
|
||
[_fonts_modal_css__WEBPACK_IMPORTED_MODULE_3___default.a.fallbackButtonSelected]: this.props.selected
|
||
}),
|
||
onClick: this.handleClick,
|
||
style: {
|
||
fontFamily: this.props.family
|
||
}
|
||
}, this.formatName());
|
||
}
|
||
|
||
}
|
||
|
||
FontFallbackButton.propTypes = {
|
||
family: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
selected: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired
|
||
};
|
||
|
||
const FontFallback = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_3___default.a.fallbackContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_3___default.a.fallbackLabel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "Choose a fallback font to use if the font fails to load or is deleted:",
|
||
id: "tw.fonts.fallback"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_3___default.a.fallbackList
|
||
}, Object.values(scratch_paint_src_lib_fonts__WEBPACK_IMPORTED_MODULE_4__["default"]).map(family => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(FontFallbackButton, {
|
||
key: family,
|
||
family: family,
|
||
onClick: props.onChange,
|
||
selected: props.fallback === family
|
||
}))));
|
||
|
||
FontFallback.DEFAULT = 'Sans Serif';
|
||
FontFallback.propTypes = {
|
||
fallback: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (FontFallback);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/font-name.jsx":
|
||
/*!*****************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/font-name.jsx ***!
|
||
\*****************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ "./node_modules/react-dom/index.js");
|
||
/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./fonts-modal.css */ "./src/components/tw-fonts-modal/fonts-modal.css");
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_fonts_modal_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _font_dropdown_item_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./font-dropdown-item.jsx */ "./src/components/tw-fonts-modal/font-dropdown-item.jsx");
|
||
const _excluded = ["name", "onChange", "fontManager", "options"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class FontName extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default()(this, ['setInputRef', 'handleChange', 'handleFocus', 'handleBlur', 'handleResize', 'handleSelectFont', 'handleKeyDown']);
|
||
this.state = {
|
||
focused: false,
|
||
rect: null
|
||
};
|
||
}
|
||
|
||
componentDidMount() {
|
||
window.addEventListener('resize', this.handleResize);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
window.removeEventListener('resize', this.handleResize);
|
||
}
|
||
|
||
setInputRef(input) {
|
||
this.input = input; // can't use autoFocus because handleFocus relies on the ref existing already
|
||
|
||
if (input) {
|
||
input.focus();
|
||
}
|
||
}
|
||
|
||
handleChange(e) {
|
||
this.props.onChange(e.target.value);
|
||
}
|
||
|
||
handleFocus() {
|
||
this.setState({
|
||
focused: true,
|
||
rect: this.input.getBoundingClientRect()
|
||
});
|
||
}
|
||
|
||
handleBlur() {
|
||
this.props.onChange(this.props.fontManager.getSafeName(this.props.name));
|
||
this.setState({
|
||
focused: false
|
||
});
|
||
}
|
||
|
||
handleResize() {
|
||
if (this.state.focused) {
|
||
this.setState({
|
||
rect: this.input.getBoundingClientRect()
|
||
});
|
||
}
|
||
}
|
||
|
||
handleSelectFont(font) {
|
||
this.props.onChange(font);
|
||
}
|
||
|
||
handleKeyDown(e) {
|
||
if (e.key === 'Enter') {
|
||
this.handleBlur();
|
||
e.target.blur();
|
||
}
|
||
}
|
||
|
||
getFilteredOptions() {
|
||
if (!this.state.focused || !this.props.options) {
|
||
return [];
|
||
}
|
||
|
||
const name = this.props.name.toLowerCase();
|
||
const candidates = this.props.options.filter(family => family.toLowerCase().includes(name));
|
||
|
||
if (candidates.length === 0 && candidates[0] === this.props.name) {
|
||
return [];
|
||
}
|
||
|
||
return candidates;
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
name,
|
||
onChange,
|
||
fontManager,
|
||
options
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
const filteredOptions = this.getFilteredOptions();
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.fontInputOuter
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("input", _extends({}, props, {
|
||
type: "text",
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.fontInput,
|
||
value: this.props.name,
|
||
ref: this.setInputRef,
|
||
onChange: this.handleChange,
|
||
onFocus: this.handleFocus,
|
||
onBlur: this.handleBlur,
|
||
onKeyDown: this.handleKeyDown
|
||
})), filteredOptions.length > 0 && /*#__PURE__*/react_dom__WEBPACK_IMPORTED_MODULE_1___default.a.createPortal( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.fontDropdownOuter,
|
||
style: {
|
||
left: "".concat(this.state.rect.left - 4, "px"),
|
||
top: "".concat(this.state.rect.top + this.state.rect.height + 4, "px"),
|
||
width: "".concat(this.state.rect.width + 8, "px")
|
||
}
|
||
}, this.getFilteredOptions().map(family => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_font_dropdown_item_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
key: family,
|
||
family: family,
|
||
onSelect: this.handleSelectFont
|
||
}))), document.body));
|
||
}
|
||
|
||
}
|
||
|
||
FontName.propTypes = {
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string.isRequired,
|
||
onChange: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
fontManager: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({
|
||
getSafeName: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired
|
||
}).isRequired,
|
||
options: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string.isRequired)
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (FontName);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/font-playground.jsx":
|
||
/*!***********************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/font-playground.jsx ***!
|
||
\***********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fonts-modal.css */ "./src/components/tw-fonts-modal/fonts-modal.css");
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_fonts_modal_css__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_4__);
|
||
|
||
|
||
|
||
|
||
// TODO: is this something to localize?
|
||
|
||
const QUICK_BROWN_FOX = 'The quick brown fox jumps over the lazy dog.';
|
||
|
||
class FontPlayground extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default()(this, ['handleChange']);
|
||
this.state = {
|
||
value: QUICK_BROWN_FOX
|
||
};
|
||
}
|
||
|
||
handleChange(e) {
|
||
this.setState({
|
||
value: e.target.value
|
||
});
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("textarea", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_2___default.a.fontPlayground,
|
||
value: this.state.value,
|
||
onChange: this.handleChange,
|
||
placeholder: QUICK_BROWN_FOX,
|
||
style: {
|
||
fontFamily: this.props.family
|
||
}
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
FontPlayground.propTypes = {
|
||
family: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (FontPlayground);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/fonts-modal.css":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/fonts-modal.css ***!
|
||
\*******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./fonts-modal.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-fonts-modal/fonts-modal.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/fonts-modal.jsx":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/fonts-modal.jsx ***!
|
||
\*******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _containers_modal_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../containers/modal.jsx */ "./src/containers/modal.jsx");
|
||
/* harmony import */ var _manage_font_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./manage-font.jsx */ "./src/components/tw-fonts-modal/manage-font.jsx");
|
||
/* harmony import */ var _add_system_font_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./add-system-font.jsx */ "./src/components/tw-fonts-modal/add-system-font.jsx");
|
||
/* harmony import */ var _add_custom_font_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./add-custom-font.jsx */ "./src/components/tw-fonts-modal/add-custom-font.jsx");
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./fonts-modal.css */ "./src/components/tw-fonts-modal/fonts-modal.css");
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_fonts_modal_css__WEBPACK_IMPORTED_MODULE_8__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["defineMessages"])({
|
||
title: {
|
||
"id": "tw.fonts.title",
|
||
"defaultMessage": "Fonts"
|
||
}
|
||
});
|
||
|
||
const FontModal = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_containers_modal_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.modalContent,
|
||
onRequestClose: props.onClose,
|
||
contentLabel: props.intl.formatMessage(messages.title),
|
||
id: "fontModal"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.body
|
||
}, props.screen === '' ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.openButtons
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.openButton,
|
||
onClick: props.onOpenSystemFonts
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_3___default()(_fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.openButtonImage, _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.systemImage)
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.openButtonText
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.openButtonTextMain
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Add a system font",
|
||
id: "tw.fonts.system1"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.openButtonTextSub
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "May work in Scratch, but will not appear correctly for everyone.",
|
||
id: "tw.fonts.system2"
|
||
})))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.openButton,
|
||
onClick: props.onOpenCustomFonts
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("img", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_3___default()(_fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.openButtonImage, _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.customImage)
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.openButtonText
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.openButtonTextMain
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Add font from a file",
|
||
id: "tw.fonts.custom1"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.openButtonTextSub
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Usually will not work in Scratch. Supported formats: {formats}." // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.fonts.custom2",
|
||
values: {
|
||
formats: Object.values(_add_custom_font_jsx__WEBPACK_IMPORTED_MODULE_7__["FONT_FORMATS"]).map(i => ".".concat(i)).join(', ')
|
||
}
|
||
}))))) : props.screen === 'system' ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_add_system_font_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
fontManager: props.fontManager,
|
||
onClose: props.onClose
|
||
}) : props.screen === 'custom' ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_add_custom_font_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
fontManager: props.fontManager,
|
||
onClose: props.onClose
|
||
}) : // Should never happen
|
||
null, props.screen === '' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.fontsOuter
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", null, props.fonts.length ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Installed fonts:",
|
||
id: "tw.fonts.list"
|
||
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "No fonts added yet.",
|
||
id: "tw.fonts.none"
|
||
})), props.fonts.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_8___default.a.fonts
|
||
}, props.fonts.map((font, index) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_manage_font_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
key: index,
|
||
system: font.system,
|
||
name: font.name,
|
||
family: font.family,
|
||
data: font.data,
|
||
format: font.format,
|
||
index: index,
|
||
fontManager: props.fontManager
|
||
}))))));
|
||
|
||
FontModal.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_0__["intlShape"],
|
||
onClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
fonts: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
system: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
family: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(Uint8Array),
|
||
format: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
}).isRequired).isRequired,
|
||
fontManager: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({}),
|
||
screen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['', 'system', 'custom']),
|
||
onOpenSystemFonts: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
// onOpenLibraryFonts: PropTypes.func.isRequired,
|
||
onOpenCustomFonts: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["injectIntl"])(FontModal));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/load-temporary-font.jsx":
|
||
/*!***************************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/load-temporary-font.jsx ***!
|
||
\***************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
|
||
|
||
let fontId = 0;
|
||
|
||
class LoadFont extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
this.id = ++fontId;
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.style = document.createElement('style');
|
||
this.style.className = 'gui-temp-font';
|
||
document.head.appendChild(this.style);
|
||
this.updateStyle();
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
if (this.props.url !== prevProps.url) {
|
||
this.updateStyle();
|
||
}
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.style.remove();
|
||
}
|
||
|
||
updateStyle() {
|
||
this.style.textContent = "@font-face { font-family: \"".concat(this.getFamily(), "\"; src: url(\"").concat(this.props.url, "\"); }");
|
||
}
|
||
|
||
getFamily() {
|
||
return "GUITempFont".concat(this.id);
|
||
}
|
||
|
||
render() {
|
||
return this.props.children(this.getFamily());
|
||
}
|
||
|
||
}
|
||
|
||
LoadFont.propTypes = {
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (LoadFont);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/manage-font.jsx":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/manage-font.jsx ***!
|
||
\*******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _lib_tw_bytes_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib/tw-bytes-utils */ "./src/lib/tw-bytes-utils.js");
|
||
/* harmony import */ var _lib_download_blob__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib/download-blob */ "./src/lib/download-blob.js");
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./fonts-modal.css */ "./src/components/tw-fonts-modal/fonts-modal.css");
|
||
/* harmony import */ var _fonts_modal_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_fonts_modal_css__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _delete_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./delete.svg */ "./src/components/tw-fonts-modal/delete.svg");
|
||
/* harmony import */ var _delete_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_delete_svg__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _export_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./export.svg */ "./src/components/tw-fonts-modal/export.svg");
|
||
/* harmony import */ var _export_svg__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_export_svg__WEBPACK_IMPORTED_MODULE_8__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["defineMessages"])({
|
||
delete: {
|
||
"id": "tw.fonts.delete",
|
||
"defaultMessage": "Are you sure you want to delete \"{font}\"? Any vector costumes will use the fallback font instead."
|
||
}
|
||
});
|
||
|
||
class ManageFont extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default()(this, ['handleExport', 'handleDelete']);
|
||
}
|
||
|
||
handleExport() {
|
||
const blob = new Blob([this.props.data], {
|
||
contentType: "font/".concat(this.props.format)
|
||
});
|
||
Object(_lib_download_blob__WEBPACK_IMPORTED_MODULE_5__["default"])("".concat(this.props.name, ".").concat(this.props.format), blob);
|
||
}
|
||
|
||
handleDelete() {
|
||
// eslint-disable-next-line no-alert
|
||
const allowed = confirm(this.props.intl.formatMessage(messages.delete, {
|
||
font: this.props.name
|
||
}));
|
||
|
||
if (allowed) {
|
||
this.props.fontManager.deleteFont(this.props.index);
|
||
}
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.manageFont
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.manageFontName,
|
||
title: this.props.family,
|
||
style: {
|
||
fontFamily: this.props.family
|
||
}
|
||
}, this.props.name), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.manageFontDetails
|
||
}, this.props.system ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "System font",
|
||
id: "tw.fonts.system"
|
||
}) : Object(_lib_tw_bytes_utils__WEBPACK_IMPORTED_MODULE_4__["formatBytes"])(this.props.data.byteLength))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.manageFontButtons
|
||
}, !this.props.system && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.manageFontButton,
|
||
onClick: this.handleExport
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {
|
||
src: _export_svg__WEBPACK_IMPORTED_MODULE_8___default.a,
|
||
alt: "Export",
|
||
draggable: false
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
|
||
className: _fonts_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.manageFontButton,
|
||
onClick: this.handleDelete
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {
|
||
src: _delete_svg__WEBPACK_IMPORTED_MODULE_7___default.a,
|
||
alt: "Delete",
|
||
draggable: false
|
||
}))));
|
||
}
|
||
|
||
}
|
||
|
||
ManageFont.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_2__["intlShape"],
|
||
system: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
family: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(Uint8Array),
|
||
format: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
index: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,
|
||
fontManager: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
deleteFont: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
}).isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["injectIntl"])(ManageFont));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-fonts-modal/system.svg":
|
||
/*!**************************************************!*\
|
||
!*** ./src/components/tw-fonts-modal/system.svg ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/89c89d8cb19c183635c7e00f2ff5a63c.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-framerate-indicator/framerate-indicator.css":
|
||
/*!***********************************************************************!*\
|
||
!*** ./src/components/tw-framerate-indicator/framerate-indicator.css ***!
|
||
\***********************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./framerate-indicator.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-framerate-indicator/framerate-indicator.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-framerate-indicator/framerate-indicator.jsx":
|
||
/*!***********************************************************************!*\
|
||
!*** ./src/components/tw-framerate-indicator/framerate-indicator.jsx ***!
|
||
\***********************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _framerate_indicator_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./framerate-indicator.css */ "./src/components/tw-framerate-indicator/framerate-indicator.css");
|
||
/* harmony import */ var _framerate_indicator_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_framerate_indicator_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
|
||
|
||
|
||
|
||
|
||
const FramerateIndicator = ({
|
||
framerate,
|
||
interpolation
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, framerate !== 30 && framerate !== 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _framerate_indicator_css__WEBPACK_IMPORTED_MODULE_3___default.a.framerateContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _framerate_indicator_css__WEBPACK_IMPORTED_MODULE_3___default.a.framerateLabel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "{framerate} FPS",
|
||
id: "tw.fps",
|
||
values: {
|
||
framerate: framerate
|
||
}
|
||
}))), interpolation && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _framerate_indicator_css__WEBPACK_IMPORTED_MODULE_3___default.a.framerateContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _framerate_indicator_css__WEBPACK_IMPORTED_MODULE_3___default.a.framerateLabel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "Interpolation",
|
||
id: "tw.interpolationEnabled"
|
||
}))));
|
||
|
||
FramerateIndicator.propTypes = {
|
||
framerate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
interpolation: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (FramerateIndicator);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-loading-spinner/spinner.css":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/tw-loading-spinner/spinner.css ***!
|
||
\*******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./spinner.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-loading-spinner/spinner.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-loading-spinner/spinner.jsx":
|
||
/*!*******************************************************!*\
|
||
!*** ./src/components/tw-loading-spinner/spinner.jsx ***!
|
||
\*******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _spinner_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./spinner.css */ "./src/components/tw-loading-spinner/spinner.css");
|
||
/* harmony import */ var _spinner_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_spinner_css__WEBPACK_IMPORTED_MODULE_1__);
|
||
|
||
|
||
|
||
const Loading = () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _spinner_css__WEBPACK_IMPORTED_MODULE_1___default.a.container
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _spinner_css__WEBPACK_IMPORTED_MODULE_1___default.a.spinner
|
||
}));
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Loading);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-restore-point-modal/delete.svg":
|
||
/*!**********************************************************!*\
|
||
!*** ./src/components/tw-restore-point-modal/delete.svg ***!
|
||
\**********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/870d942b2502550f58b9eab7561f42ec.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-restore-point-modal/restore-point-modal.css":
|
||
/*!***********************************************************************!*\
|
||
!*** ./src/components/tw-restore-point-modal/restore-point-modal.css ***!
|
||
\***********************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./restore-point-modal.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-restore-point-modal/restore-point-modal.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-restore-point-modal/restore-point-modal.jsx":
|
||
/*!***********************************************************************!*\
|
||
!*** ./src/components/tw-restore-point-modal/restore-point-modal.jsx ***!
|
||
\***********************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _containers_modal_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../containers/modal.jsx */ "./src/containers/modal.jsx");
|
||
/* harmony import */ var _restore_point_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./restore-point.jsx */ "./src/components/tw-restore-point-modal/restore-point.jsx");
|
||
/* harmony import */ var _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./restore-point-modal.css */ "./src/components/tw-restore-point-modal/restore-point-modal.css");
|
||
/* harmony import */ var _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _lib_brand__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib/brand */ "./src/lib/brand.js");
|
||
/* harmony import */ var _lib_tw_bytes_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../lib/tw-bytes-utils */ "./src/lib/tw-bytes-utils.js");
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["defineMessages"])({
|
||
title: {
|
||
"id": "tw.restorePoints.title",
|
||
"defaultMessage": "Restore Points"
|
||
},
|
||
never: {
|
||
"id": "tw.restorePoints.never",
|
||
"defaultMessage": "never"
|
||
},
|
||
oneMinute: {
|
||
"id": "tw.restorePoints.1minute",
|
||
"defaultMessage": "every minute"
|
||
},
|
||
minutes: {
|
||
"id": "tw.restorePoints.minutes",
|
||
"defaultMessage": "every {n} minutes"
|
||
}
|
||
});
|
||
const MINUTE = 1000 * 60;
|
||
const INTERVAL_OPTIONS = [MINUTE * 1, MINUTE * 5, MINUTE * 10, MINUTE * 15, MINUTE * 30, -1];
|
||
|
||
const IntervalSelector = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("select", {
|
||
value: props.value,
|
||
onChange: props.onChange
|
||
}, INTERVAL_OPTIONS.map(interval => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("option", {
|
||
key: interval,
|
||
value: interval
|
||
}, interval < 0 ? props.intl.formatMessage(messages.never) : interval === MINUTE ? props.intl.formatMessage(messages.oneMinute) : props.intl.formatMessage(messages.minutes, {
|
||
n: Math.round(interval / MINUTE)
|
||
}))), !INTERVAL_OPTIONS.includes(props.value) &&
|
||
/*#__PURE__*/
|
||
// This should never happen unless someone manually edits their storage, so we
|
||
// don't need to worry about making this work good.
|
||
react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("option", {
|
||
value: props.value
|
||
}, "every ".concat(props.value, "ms")));
|
||
|
||
IntervalSelector.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_0__["intlShape"],
|
||
value: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,
|
||
onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
};
|
||
|
||
const RestorePointModal = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_containers_modal_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.modalContent,
|
||
onRequestClose: props.onClose,
|
||
contentLabel: props.intl.formatMessage(messages.title),
|
||
id: "restorePointModal"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "{APP_NAME} periodically saves restore points on your computer to help recover your project if you forget to save. This is intended as a last resort for recovery. Your computer may silently delete these restore points at any time. DO NOT rely on this feature.",
|
||
id: "tw.restorePoints.description",
|
||
values: {
|
||
APP_NAME: _lib_brand__WEBPACK_IMPORTED_MODULE_7__["APP_NAME"]
|
||
}
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Restore points are created {time}.",
|
||
id: "tw.restorePoints.intervalOption" // eslint-disable-next-line max-len
|
||
,
|
||
values: {
|
||
time: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(IntervalSelector, {
|
||
intl: props.intl,
|
||
value: props.interval,
|
||
onChange: props.onChangeInterval
|
||
})
|
||
}
|
||
})), props.interval < 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.disabled
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Disabling restore points is dangerous." // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.restorePoints.off"
|
||
})), props.error ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.error
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Restore points are not available due to an error:" // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.restorePoints.error",
|
||
values: {
|
||
error: props.error
|
||
}
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.errorMessage
|
||
}, props.error)) : props.isLoading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.loading
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Loading...",
|
||
id: "tw.restorePoints.loading"
|
||
})) : props.restorePoints.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.empty
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "No restore points found.",
|
||
id: "tw.restorePoints.empty"
|
||
})) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_2___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.restorePointContainer
|
||
}, props.restorePoints.map(restorePoint => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_restore_point_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], _extends({
|
||
key: restorePoint.id,
|
||
onClickDelete: props.onClickDelete,
|
||
onClickLoad: props.onClickLoad
|
||
}, restorePoint)))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.extraContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.totalSize
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Estimated storage used: {size}",
|
||
id: "tw.restorePoints.size",
|
||
values: {
|
||
size: Object(_lib_tw_bytes_utils__WEBPACK_IMPORTED_MODULE_8__["formatBytes"])(props.totalSize)
|
||
}
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.totalSizeDescription
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Costumes or sounds used by multiple restore points are only stored once." // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.restorePoints.size2"
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
onClick: props.onClickDeleteAll,
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(_restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.button, _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.deleteAllButton),
|
||
disabled: props.isLoading
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Delete All",
|
||
id: "tw.restorePoints.deleteAll"
|
||
}))))));
|
||
|
||
RestorePointModal.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_0__["intlShape"],
|
||
interval: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,
|
||
onChangeInterval: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onClickCreate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onClickDelete: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onClickDeleteAll: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onClickLoad: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
isLoading: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
totalSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,
|
||
restorePoints: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({})),
|
||
error: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["injectIntl"])(RestorePointModal));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-restore-point-modal/restore-point.jsx":
|
||
/*!*****************************************************************!*\
|
||
!*** ./src/components/tw-restore-point-modal/restore-point.jsx ***!
|
||
\*****************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./restore-point-modal.css */ "./src/components/tw-restore-point-modal/restore-point-modal.css");
|
||
/* harmony import */ var _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_restore_point_modal_css__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _lib_tw_bytes_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib/tw-bytes-utils */ "./src/lib/tw-bytes-utils.js");
|
||
/* harmony import */ var _lib_tw_restore_point_api__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib/tw-restore-point-api */ "./src/lib/tw-restore-point-api.js");
|
||
/* harmony import */ var _lib_log__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib/log */ "./src/lib/log.js");
|
||
/* harmony import */ var _delete_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./delete.svg */ "./src/components/tw-restore-point-modal/delete.svg");
|
||
/* harmony import */ var _delete_svg__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_delete_svg__WEBPACK_IMPORTED_MODULE_8__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// Browser support is not perfect yet
|
||
|
||
const relativeTimeSupported = () => typeof Intl !== 'undefined' && typeof Intl.RelativeTimeFormat !== 'undefined';
|
||
|
||
class RestorePoint extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default()(this, ['handleClickDelete', 'handleClickLoad']);
|
||
this.state = {
|
||
thumbnail: null,
|
||
error: false
|
||
};
|
||
this.unmounted = false; // should never change for the same restore point
|
||
|
||
this.totalSize = this.getTotalSize();
|
||
}
|
||
|
||
componentDidMount() {
|
||
_lib_tw_restore_point_api__WEBPACK_IMPORTED_MODULE_6__["default"].getThumbnail(this.props.id).then(url => {
|
||
if (this.unmounted) {
|
||
URL.revokeObjectURL(url);
|
||
} else {
|
||
this.setState({
|
||
thumbnail: url
|
||
});
|
||
}
|
||
}).catch(error => {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_7__["default"].error(error);
|
||
|
||
if (!this.unmounted) {
|
||
this.setState({
|
||
error: true
|
||
});
|
||
}
|
||
});
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
if (this.state.thumbnail) {
|
||
URL.revokeObjectURL(this.state.thumbnail);
|
||
}
|
||
|
||
this.unmounted = true;
|
||
}
|
||
|
||
getTotalSize() {
|
||
let size = this.props.projectSize + this.props.thumbnailSize;
|
||
|
||
for (const assetSize of Object.values(this.props.assets)) {
|
||
size += assetSize;
|
||
}
|
||
|
||
return size;
|
||
}
|
||
|
||
handleClickDelete(e) {
|
||
e.stopPropagation();
|
||
this.props.onClickDelete(this.props.id);
|
||
}
|
||
|
||
handleClickLoad() {
|
||
this.props.onClickLoad(this.props.id);
|
||
}
|
||
|
||
render() {
|
||
const createdDate = new Date(this.props.created * 1000);
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
tabIndex: 0,
|
||
role: "button",
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.restorePoint,
|
||
onClick: this.handleClickLoad
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.thumbnailContainer
|
||
}, this.state.error ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.thumbnailPlaceholder
|
||
}, '?') : this.state.thumbnail ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.thumbnailImage,
|
||
src: this.state.thumbnail
|
||
}) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.restorePointTitle
|
||
}, this.props.title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, relativeTimeSupported() && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedRelative"], {
|
||
value: createdDate
|
||
}), ' ('), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedDate"], {
|
||
value: createdDate
|
||
}), ', ', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedTime"], {
|
||
value: createdDate
|
||
}), relativeTimeSupported() && ')'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, Object(_lib_tw_bytes_utils__WEBPACK_IMPORTED_MODULE_5__["formatBytes"])(this.totalSize), ', ', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "{n} assets" // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.restorePoints.assets",
|
||
values: {
|
||
n: Object.keys(this.props.assets).length
|
||
}
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
|
||
className: _restore_point_modal_css__WEBPACK_IMPORTED_MODULE_4___default.a.deleteButton,
|
||
onClick: this.handleClickDelete
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {
|
||
src: _delete_svg__WEBPACK_IMPORTED_MODULE_8___default.a,
|
||
alt: "Delete",
|
||
draggable: false
|
||
})));
|
||
}
|
||
|
||
}
|
||
|
||
RestorePoint.propTypes = {
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
created: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,
|
||
projectSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,
|
||
thumbnailSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,
|
||
assets: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({}).isRequired,
|
||
// Record<string, number>
|
||
onClickDelete: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onClickLoad: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (RestorePoint);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/data-url.css":
|
||
/*!***************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/data-url.css ***!
|
||
\***************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./data-url.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-security-manager-modal/data-url.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/data-url.jsx":
|
||
/*!***************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/data-url.jsx ***!
|
||
\***************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _data_url_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./data-url.css */ "./src/components/tw-security-manager-modal/data-url.css");
|
||
/* harmony import */ var _data_url_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_data_url_css__WEBPACK_IMPORTED_MODULE_2__);
|
||
|
||
|
||
|
||
/**
|
||
* @param {string} dataURI data: URI
|
||
* @returns {string} A hopefully human-readable version
|
||
*/
|
||
|
||
const decodeDataURI = dataURI => {
|
||
const delimeter = dataURI.indexOf(',');
|
||
|
||
if (delimeter === -1) {
|
||
return dataURI;
|
||
}
|
||
|
||
const contentType = dataURI.substring(0, delimeter);
|
||
const data = dataURI.substring(delimeter + 1);
|
||
|
||
if (contentType.endsWith(';base64')) {
|
||
try {
|
||
return atob(data);
|
||
} catch (e) {
|
||
return dataURI;
|
||
}
|
||
}
|
||
|
||
try {
|
||
return decodeURIComponent(data);
|
||
} catch (e) {
|
||
return dataURI;
|
||
}
|
||
};
|
||
|
||
const DataURL = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("textarea", {
|
||
className: _data_url_css__WEBPACK_IMPORTED_MODULE_2___default.a.code,
|
||
value: decodeDataURI(props.url),
|
||
readOnly: true,
|
||
spellCheck: false,
|
||
autoComplete: "off"
|
||
});
|
||
|
||
DataURL.propTypes = {
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (DataURL);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/delayed-mount-property-hoc.jsx":
|
||
/*!*********************************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/delayed-mount-property-hoc.jsx ***!
|
||
\*********************************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
|
||
|
||
const DelayedMountPropertyHOC = function DelayedMountPropertyHOC(WrappedComponent, duration, delayedProps) {
|
||
class DelayedMountProperty extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
this.state = {
|
||
done: false
|
||
};
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.timeout = setTimeout(() => {
|
||
this.setState({
|
||
done: true
|
||
});
|
||
}, duration);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
clearTimeout(this.timeout);
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(WrappedComponent, this.state.done ? _objectSpread(_objectSpread({}, this.props), delayedProps) : this.props);
|
||
}
|
||
|
||
}
|
||
|
||
return DelayedMountProperty;
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (DelayedMountPropertyHOC);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/embed.jsx":
|
||
/*!************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/embed.jsx ***!
|
||
\************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _url_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./url.jsx */ "./src/components/tw-security-manager-modal/url.jsx");
|
||
/* harmony import */ var _data_url_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./data-url.jsx */ "./src/components/tw-security-manager-modal/data-url.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const EmbedModal = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, props.url.startsWith('data:') ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "The project wants to embed HTML content over the stage:",
|
||
id: "tw.embed.title1"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_data_url_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
url: props.url
|
||
})) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "The project wants to embed remote content over the stage:",
|
||
id: "tw.embed.title2"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_url_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
url: props.url
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "While the embed will be sandboxed, it will still have access to information about your device such as your IP and general location.",
|
||
id: "tw.embed.risks"
|
||
})), !props.url.startsWith('data:') && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "If allowed, further embeds to the same site will be automatically allowed.",
|
||
id: "tw.embed.persistent"
|
||
})));
|
||
|
||
EmbedModal.propTypes = {
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (EmbedModal);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/fetch.jsx":
|
||
/*!************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/fetch.jsx ***!
|
||
\************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _url_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./url.jsx */ "./src/components/tw-security-manager-modal/url.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
const FetchModal = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "The project wants to connect to the website:",
|
||
id: "tw.fetch.title"
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_url_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
url: props.url
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "This could be used to download images or sounds, implement multiplayer, access an API, or for malicious purposes. This will share your IP address, general location, and possibly other data with the website.",
|
||
id: "tw.securityManager.why"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "If allowed, further requests to the same website will be automatically allowed.",
|
||
id: "tw.securityManager.trust"
|
||
})));
|
||
|
||
FetchModal.propTypes = {
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (FetchModal);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/geolocate.jsx":
|
||
/*!****************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/geolocate.jsx ***!
|
||
\****************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
|
||
|
||
|
||
const Geolocate = () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "The project wants to know your location." // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.geolocate.title"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "If allowed, you may be prompted to allow location access by your browser." // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.geolocate.permission"
|
||
})));
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Geolocate);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/load-extension.css":
|
||
/*!*********************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/load-extension.css ***!
|
||
\*********************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./load-extension.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-security-manager-modal/load-extension.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/load-extension.jsx":
|
||
/*!*********************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/load-extension.jsx ***!
|
||
\*********************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _load_extension_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./load-extension.css */ "./src/components/tw-security-manager-modal/load-extension.css");
|
||
/* harmony import */ var _load_extension_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_load_extension_css__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _url_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./url.jsx */ "./src/components/tw-security-manager-modal/url.jsx");
|
||
/* harmony import */ var _data_url_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./data-url.jsx */ "./src/components/tw-security-manager-modal/data-url.jsx");
|
||
/* harmony import */ var _tw_fancy_checkbox_checkbox_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../tw-fancy-checkbox/checkbox.jsx */ "./src/components/tw-fancy-checkbox/checkbox.jsx");
|
||
/* harmony import */ var _lib_brand__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib/brand */ "./src/lib/brand.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const LoadExtensionModal = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, props.url.startsWith('data:') ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "The project wants to load a custom extension with the code:",
|
||
id: "tw.loadExtension.embedded"
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_data_url_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
url: props.url
|
||
})) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "The project wants to load a custom extension from the URL:",
|
||
id: "tw.loadExtension.url"
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_url_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
url: props.url
|
||
})), props.onChangeUnsandboxed && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("label", {
|
||
className: _load_extension_css__WEBPACK_IMPORTED_MODULE_3___default.a.unsandboxedContainer
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_tw_fancy_checkbox_checkbox_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
className: _load_extension_css__WEBPACK_IMPORTED_MODULE_3___default.a.unsandboxedCheckbox,
|
||
checked: props.unsandboxed,
|
||
onChange: props.onChangeUnsandboxed
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "Run extension without sandbox",
|
||
id: "tw.loadExtension.unsandboxed"
|
||
})), props.unsandboxed && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _load_extension_css__WEBPACK_IMPORTED_MODULE_3___default.a.unsandboxedWarning
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Loading extensions without the sandbox is dangerous. It will be able to corrupt your project, delete your settings, phish for passwords, and other bad things. The {APP_NAME} developers are not responsible for any resulting issues.",
|
||
id: "tw.loadExtension.unsandboxedWarning",
|
||
values: {
|
||
APP_NAME: _lib_brand__WEBPACK_IMPORTED_MODULE_7__["APP_NAME"]
|
||
}
|
||
}))), !props.unsandboxed && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
|
||
className: _load_extension_css__WEBPACK_IMPORTED_MODULE_3___default.a.sandboxed
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "While the code will be sandboxed, it will still have access to information about your device such as your IP and general location. Make sure you trust the author of this extension before continuing.",
|
||
id: "tw.loadExtension.sandboxed"
|
||
})));
|
||
|
||
LoadExtensionModal.propTypes = {
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
unsandboxed: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
onChangeUnsandboxed: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (LoadExtensionModal);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/notify.jsx":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/notify.jsx ***!
|
||
\*************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
|
||
|
||
|
||
const Notify = () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "The project wants to display notifications." // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.notify.title"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "If allowed, you may be prompted to enable notifications by your browser, and further notifications will be automatically allowed." // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.notify.permission"
|
||
})));
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Notify);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/open-window.jsx":
|
||
/*!******************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/open-window.jsx ***!
|
||
\******************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _lib_brand__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../lib/brand */ "./src/lib/brand.js");
|
||
/* harmony import */ var _url_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./url.jsx */ "./src/components/tw-security-manager-modal/url.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const OpenWindowModal = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "The project wants to open a new window or tab with the URL:",
|
||
id: "tw.openWindow.title"
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_url_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
url: props.url
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "This website has not been reviewed by the {APP_NAME} developers. It may contain dangerous or malicious code.",
|
||
id: "tw.openWindow.dangerous",
|
||
values: {
|
||
APP_NAME: _lib_brand__WEBPACK_IMPORTED_MODULE_3__["APP_NAME"]
|
||
}
|
||
})));
|
||
|
||
OpenWindowModal.propTypes = {
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (OpenWindowModal);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/read-clipboard.jsx":
|
||
/*!*********************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/read-clipboard.jsx ***!
|
||
\*********************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
|
||
|
||
|
||
const ReadClipboard = () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "The project wants to read data from your clipboard.",
|
||
id: "tw.clipboard.title"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "If your clipboard contains things like passwords, the project may be able to share those with other users or servers.",
|
||
id: "tw.clipboard.danger"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Clipboard access may not work in some browsers. If allowed, further clipboard reads will be automatically allowed." // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.clipboard.permission"
|
||
})));
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (ReadClipboard);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/record-audio.jsx":
|
||
/*!*******************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/record-audio.jsx ***!
|
||
\*******************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
|
||
|
||
|
||
const RecordAudio = () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "The project wants to record audio from your microphone. This could include a text transcript or raw audio data. The project may be able to share audio with other users or servers.",
|
||
id: "tw.recordAudio.title"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "If allowed, you may be prompted to enable microphone access by your browser, and further microphone access will be automatically allowed.",
|
||
id: "tw.recordAudio.permission"
|
||
})));
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (RecordAudio);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/record-video.jsx":
|
||
/*!*******************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/record-video.jsx ***!
|
||
\*******************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
|
||
|
||
|
||
const RecordVideo = () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "The project wants to record video from your camera. The project may be able to share images with other users or servers.",
|
||
id: "tw.recordVideo.title"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "If allowed, you may be prompted to enable camera access by your browser, and further camera access will be automatically allowed.",
|
||
id: "tw.recordVideo.permission"
|
||
})));
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (RecordVideo);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/redirect.jsx":
|
||
/*!***************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/redirect.jsx ***!
|
||
\***************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _lib_brand__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../lib/brand */ "./src/lib/brand.js");
|
||
/* harmony import */ var _url_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./url.jsx */ "./src/components/tw-security-manager-modal/url.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const RedirectModal = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
|
||
defaultMessage: "The project wants to navigate this tab to the URL:",
|
||
id: "tw.redirect.title"
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_url_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
url: props.url
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "This website has not been reviewed by the {APP_NAME} developers. It may contain dangerous or malicious code.",
|
||
id: "tw.redirect.dangerous",
|
||
values: {
|
||
APP_NAME: _lib_brand__WEBPACK_IMPORTED_MODULE_3__["APP_NAME"]
|
||
}
|
||
})));
|
||
|
||
RedirectModal.propTypes = {
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (RedirectModal);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/security-manager-modal.css":
|
||
/*!*****************************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/security-manager-modal.css ***!
|
||
\*****************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./security-manager-modal.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-security-manager-modal/security-manager-modal.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/security-manager-modal.jsx":
|
||
/*!*****************************************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/security-manager-modal.jsx ***!
|
||
\*****************************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _containers_modal_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../containers/modal.jsx */ "./src/containers/modal.jsx");
|
||
/* harmony import */ var _lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib/tw-security-manager-constants */ "./src/lib/tw-security-manager-constants.js");
|
||
/* harmony import */ var _load_extension_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./load-extension.jsx */ "./src/components/tw-security-manager-modal/load-extension.jsx");
|
||
/* harmony import */ var _fetch_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./fetch.jsx */ "./src/components/tw-security-manager-modal/fetch.jsx");
|
||
/* harmony import */ var _open_window_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./open-window.jsx */ "./src/components/tw-security-manager-modal/open-window.jsx");
|
||
/* harmony import */ var _redirect_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./redirect.jsx */ "./src/components/tw-security-manager-modal/redirect.jsx");
|
||
/* harmony import */ var _record_audio_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./record-audio.jsx */ "./src/components/tw-security-manager-modal/record-audio.jsx");
|
||
/* harmony import */ var _record_video_jsx__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./record-video.jsx */ "./src/components/tw-security-manager-modal/record-video.jsx");
|
||
/* harmony import */ var _read_clipboard_jsx__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./read-clipboard.jsx */ "./src/components/tw-security-manager-modal/read-clipboard.jsx");
|
||
/* harmony import */ var _notify_jsx__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./notify.jsx */ "./src/components/tw-security-manager-modal/notify.jsx");
|
||
/* harmony import */ var _geolocate_jsx__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./geolocate.jsx */ "./src/components/tw-security-manager-modal/geolocate.jsx");
|
||
/* harmony import */ var _embed_jsx__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./embed.jsx */ "./src/components/tw-security-manager-modal/embed.jsx");
|
||
/* harmony import */ var _delayed_mount_property_hoc_jsx__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./delayed-mount-property-hoc.jsx */ "./src/components/tw-security-manager-modal/delayed-mount-property-hoc.jsx");
|
||
/* harmony import */ var _security_manager_modal_css__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./security-manager-modal.css */ "./src/components/tw-security-manager-modal/security-manager-modal.css");
|
||
/* harmony import */ var _security_manager_modal_css__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(_security_manager_modal_css__WEBPACK_IMPORTED_MODULE_17__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["defineMessages"])({
|
||
title: {
|
||
"id": "tw.securityManager.title",
|
||
"defaultMessage": "Extension Security"
|
||
}
|
||
});
|
||
|
||
const noop = () => {};
|
||
|
||
const SecurityManagerModalComponent = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_containers_modal_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _security_manager_modal_css__WEBPACK_IMPORTED_MODULE_17___default.a.modalContent,
|
||
onRequestClose: props.enableButtons ? props.onDenied : noop,
|
||
contentLabel: props.intl.formatMessage(messages.title),
|
||
id: "securitymanagermodal"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _security_manager_modal_css__WEBPACK_IMPORTED_MODULE_17___default.a.body
|
||
}, props.type === _lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_5__["default"].LoadExtension ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_load_extension_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], props.data) : props.type === _lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_5__["default"].Fetch ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_fetch_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], props.data) : props.type === _lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_5__["default"].OpenWindow ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_open_window_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], props.data) : props.type === _lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_5__["default"].Redirect ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_redirect_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], props.data) : props.type === _lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_5__["default"].RecordAudio ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_record_audio_jsx__WEBPACK_IMPORTED_MODULE_10__["default"], props.data) : props.type === _lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_5__["default"].RecordVideo ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_record_video_jsx__WEBPACK_IMPORTED_MODULE_11__["default"], props.data) : props.type === _lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_5__["default"].ReadClipboard ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_read_clipboard_jsx__WEBPACK_IMPORTED_MODULE_12__["default"], props.data) : props.type === _lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_5__["default"].Notify ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_notify_jsx__WEBPACK_IMPORTED_MODULE_13__["default"], props.data) : props.type === _lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_5__["default"].Geolocate ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_geolocate_jsx__WEBPACK_IMPORTED_MODULE_14__["default"], props.data) : props.type === _lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_5__["default"].Embed ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_embed_jsx__WEBPACK_IMPORTED_MODULE_15__["default"], props.data) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _security_manager_modal_css__WEBPACK_IMPORTED_MODULE_17___default.a.buttons
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _security_manager_modal_css__WEBPACK_IMPORTED_MODULE_17___default.a.denyButton,
|
||
onClick: props.onDenied,
|
||
disabled: !props.enableButtons
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Deny",
|
||
id: "tw.securityManager.deny"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _security_manager_modal_css__WEBPACK_IMPORTED_MODULE_17___default.a.allowButton,
|
||
onClick: props.onAllowed,
|
||
disabled: !props.enableButtons
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Allow",
|
||
id: "tw.securityManager.allow"
|
||
})))));
|
||
|
||
SecurityManagerModalComponent.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_0__["intlShape"],
|
||
type: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(Object.values(_lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_5__["default"])),
|
||
enableButtons: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
// Each modal may have different type of data
|
||
// eslint-disable-next-line react/forbid-prop-types
|
||
data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,
|
||
onAllowed: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onDenied: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
}; // Prevent accidentally pressing buttons immediately when a prompt appears.
|
||
|
||
const BUTTON_DELAY = 750;
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(_delayed_mount_property_hoc_jsx__WEBPACK_IMPORTED_MODULE_16__["default"])(Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["injectIntl"])(SecurityManagerModalComponent), BUTTON_DELAY, {
|
||
enableButtons: true
|
||
}));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/url.css":
|
||
/*!**********************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/url.css ***!
|
||
\**********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./url.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-security-manager-modal/url.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-security-manager-modal/url.jsx":
|
||
/*!**********************************************************!*\
|
||
!*** ./src/components/tw-security-manager-modal/url.jsx ***!
|
||
\**********************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _url_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./url.css */ "./src/components/tw-security-manager-modal/url.css");
|
||
/* harmony import */ var _url_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_url_css__WEBPACK_IMPORTED_MODULE_2__);
|
||
|
||
|
||
|
||
const MAX_URL_LENGTH = 100;
|
||
/**
|
||
* @param {string} url URL
|
||
* @returns {string} trimmed URL
|
||
*/
|
||
|
||
const trimURL = url => url.length > MAX_URL_LENGTH ? "".concat(url.substring(0, MAX_URL_LENGTH), "...") : url;
|
||
|
||
const URL = ({
|
||
url
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", {
|
||
className: _url_css__WEBPACK_IMPORTED_MODULE_2___default.a.url
|
||
}, trimURL(url));
|
||
|
||
URL.propTypes = {
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (URL);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-settings-modal/help-black.svg":
|
||
/*!*********************************************************!*\
|
||
!*** ./src/components/tw-settings-modal/help-black.svg ***!
|
||
\*********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/c4c75827d7f30081f493963fadec60a1.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-settings-modal/help-white.svg":
|
||
/*!*********************************************************!*\
|
||
!*** ./src/components/tw-settings-modal/help-white.svg ***!
|
||
\*********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/171fbf8ebb9d7127d4c59a04568e2af4.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-settings-modal/settings-modal.css":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/components/tw-settings-modal/settings-modal.css ***!
|
||
\*************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./settings-modal.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-settings-modal/settings-modal.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-settings-modal/settings-modal.jsx":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/components/tw-settings-modal/settings-modal.jsx ***!
|
||
\*************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _containers_modal_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../containers/modal.jsx */ "./src/containers/modal.jsx");
|
||
/* harmony import */ var _tw_fancy_checkbox_checkbox_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../tw-fancy-checkbox/checkbox.jsx */ "./src/components/tw-fancy-checkbox/checkbox.jsx");
|
||
/* harmony import */ var _forms_input_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../forms/input.jsx */ "./src/components/forms/input.jsx");
|
||
/* harmony import */ var _forms_buffered_input_hoc_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../forms/buffered-input-hoc.jsx */ "./src/components/forms/buffered-input-hoc.jsx");
|
||
/* harmony import */ var _tw_documentation_link_documentation_link_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../tw-documentation-link/documentation-link.jsx */ "./src/components/tw-documentation-link/documentation-link.jsx");
|
||
/* harmony import */ var _settings_modal_css__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./settings-modal.css */ "./src/components/tw-settings-modal/settings-modal.css");
|
||
/* harmony import */ var _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_settings_modal_css__WEBPACK_IMPORTED_MODULE_11__);
|
||
const _excluded = ["value", "onChange", "label"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/* eslint-disable react/no-multi-comp */
|
||
|
||
const BufferedInput = Object(_forms_buffered_input_hoc_jsx__WEBPACK_IMPORTED_MODULE_9__["default"])(_forms_input_jsx__WEBPACK_IMPORTED_MODULE_8__["default"]);
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["defineMessages"])({
|
||
title: {
|
||
"id": "tw.settingsModal.title",
|
||
"defaultMessage": "Advanced Settings"
|
||
},
|
||
help: {
|
||
"id": "tw.settingsModal.help",
|
||
"defaultMessage": "Click for help"
|
||
}
|
||
});
|
||
|
||
const LearnMore = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_2___default.a.Fragment, null, ' ', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_tw_documentation_link_documentation_link_jsx__WEBPACK_IMPORTED_MODULE_10__["default"], props, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Learn more.",
|
||
id: "gui.alerts.cloudInfoLearnMore"
|
||
})));
|
||
|
||
class UnwrappedSetting extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_4___default()(this, ['handleClickHelp']);
|
||
this.state = {
|
||
helpVisible: false
|
||
};
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
if (this.props.active && !prevProps.active) {
|
||
// eslint-disable-next-line react/no-did-update-set-state
|
||
this.setState({
|
||
helpVisible: true
|
||
});
|
||
}
|
||
}
|
||
|
||
handleClickHelp() {
|
||
this.setState(prevState => ({
|
||
helpVisible: !prevState.helpVisible
|
||
}));
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_3___default()(_settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.setting, {
|
||
[_settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.active]: this.props.active
|
||
})
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.label
|
||
}, this.props.primary, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.helpIcon,
|
||
onClick: this.handleClickHelp,
|
||
title: this.props.intl.formatMessage(messages.help)
|
||
})), this.state.helpVisible && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.detail
|
||
}, this.props.help, this.props.slug && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(LearnMore, {
|
||
slug: this.props.slug
|
||
})), this.props.secondary);
|
||
}
|
||
|
||
}
|
||
|
||
UnwrappedSetting.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_0__["intlShape"],
|
||
active: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
help: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node,
|
||
primary: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node,
|
||
secondary: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node,
|
||
slug: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
};
|
||
const Setting = Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["injectIntl"])(UnwrappedSetting);
|
||
|
||
const BooleanSetting = _ref => {
|
||
let {
|
||
value,
|
||
onChange,
|
||
label
|
||
} = _ref,
|
||
props = _objectWithoutProperties(_ref, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Setting, _extends({}, props, {
|
||
active: value,
|
||
primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("label", {
|
||
className: _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.label
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_tw_fancy_checkbox_checkbox_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
className: _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.checkbox,
|
||
checked: value,
|
||
onChange: onChange
|
||
}), label)
|
||
}));
|
||
};
|
||
|
||
BooleanSetting.propTypes = {
|
||
onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
value: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
label: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node.isRequired
|
||
};
|
||
|
||
const HighQualityPen = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(BooleanSetting, _extends({}, props, {
|
||
label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "High Quality Pen",
|
||
id: "tw.settingsModal.highQualityPen"
|
||
}),
|
||
help: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Allows pen projects to render at higher resolutions and disables some coordinate rounding in the editor. Not all projects benefit from this setting and it may impact performance.",
|
||
id: "tw.settingsModal.highQualityPenHelp"
|
||
}),
|
||
slug: "high-quality-pen"
|
||
}));
|
||
|
||
const CustomFPS = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(BooleanSetting, {
|
||
value: props.framerate !== 30,
|
||
onChange: props.onChange,
|
||
label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "60 FPS (Custom FPS)",
|
||
id: "tw.settingsModal.fps"
|
||
}),
|
||
help: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Runs scripts 60 times per second instead of 30. Most projects will not work properly with this enabled. You should try Interpolation with 60 FPS mode disabled if that is the case. {customFramerate}.",
|
||
id: "tw.settingsModal.fpsHelp",
|
||
values: {
|
||
customFramerate: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("a", {
|
||
onClick: props.onCustomizeFramerate,
|
||
tabIndex: "0"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Click to use a framerate other than 30 or 60",
|
||
id: "tw.settingsModal.fpsHelp.customFramerate"
|
||
}))
|
||
}
|
||
}),
|
||
slug: "custom-fps"
|
||
});
|
||
|
||
CustomFPS.propTypes = {
|
||
framerate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onCustomizeFramerate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
|
||
const Interpolation = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(BooleanSetting, _extends({}, props, {
|
||
label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Interpolation",
|
||
id: "tw.settingsModal.interpolation"
|
||
}),
|
||
help: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Makes projects appear smoother by interpolating sprite motion. Interpolation should not be used on 3D projects, raytracers, pen projects, and laggy projects as interpolation will make them run slower without making them appear smoother.",
|
||
id: "tw.settingsModal.interpolationHelp"
|
||
}),
|
||
slug: "interpolation"
|
||
}));
|
||
|
||
const InfiniteClones = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(BooleanSetting, _extends({}, props, {
|
||
label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Infinite Clones",
|
||
id: "tw.settingsModal.infiniteClones"
|
||
}),
|
||
help: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Disables Scratch's 300 clone limit.",
|
||
id: "tw.settingsModal.infiniteClonesHelp"
|
||
}),
|
||
slug: "infinite-clones"
|
||
}));
|
||
|
||
const RemoveFencing = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(BooleanSetting, _extends({}, props, {
|
||
label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Remove Fencing",
|
||
id: "tw.settingsModal.removeFencing"
|
||
}),
|
||
help: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Allows sprites to move offscreen, become as large or as small as they want, and makes touching blocks work offscreen.",
|
||
id: "tw.settingsModal.removeFencingHelp"
|
||
}),
|
||
slug: "remove-fencing"
|
||
}));
|
||
|
||
const RemoveMiscLimits = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(BooleanSetting, _extends({}, props, {
|
||
label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Remove Miscellaneous Limits",
|
||
id: "tw.settingsModal.removeMiscLimits"
|
||
}),
|
||
help: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Removes sound effect limits and pen size limits.",
|
||
id: "tw.settingsModal.removeMiscLimitsHelp"
|
||
}),
|
||
slug: "remove-misc-limits"
|
||
}));
|
||
|
||
const WarpTimer = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(BooleanSetting, _extends({}, props, {
|
||
label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Warp Timer",
|
||
id: "tw.settingsModal.warpTimer"
|
||
}),
|
||
help: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Makes scripts check if they are stuck in a long or infinite loop and run at a low framerate instead of getting stuck until the loop finishes. This fixes most crashes but has a significant performance impact, so it's only enabled by default in the editor.",
|
||
id: "tw.settingsModal.warpTimerHelp"
|
||
}),
|
||
slug: "warp-timer"
|
||
}));
|
||
|
||
const DisableCompiler = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(BooleanSetting, _extends({}, props, {
|
||
label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Disable Compiler",
|
||
id: "tw.settingsModal.disableCompiler"
|
||
}),
|
||
help: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Disables the TurboWarp compiler. You may want to enable this while editing projects so that scripts update immediately. Otherwise, you should never enable this.",
|
||
id: "tw.settingsModal.disableCompilerHelp"
|
||
}),
|
||
slug: "disable-compiler"
|
||
}));
|
||
|
||
const CustomStageSize = ({
|
||
customStageSizeEnabled,
|
||
stageWidth,
|
||
onStageWidthChange,
|
||
stageHeight,
|
||
onStageHeightChange
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Setting, {
|
||
active: customStageSizeEnabled,
|
||
primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_3___default()(_settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.label, _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.customStageSize)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Custom Stage Size:",
|
||
id: "tw.settingsModal.customStageSize"
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(BufferedInput, {
|
||
value: stageWidth,
|
||
onSubmit: onStageWidthChange,
|
||
className: _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.customStageSizeInput,
|
||
type: "number",
|
||
min: "0",
|
||
max: "1024",
|
||
step: "1"
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("span", null, '×'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(BufferedInput, {
|
||
value: stageHeight,
|
||
onSubmit: onStageHeightChange,
|
||
className: _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.customStageSizeInput,
|
||
type: "number",
|
||
min: "0",
|
||
max: "1024",
|
||
step: "1"
|
||
})),
|
||
secondary: (stageWidth >= 1000 || stageHeight >= 1000) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.warning
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Using a custom stage size this large is not recommended! Instead, use a lower size with the same aspect ratio and let fullscreen mode upscale it to match the user's display.",
|
||
id: "tw.settingsModal.largeStageWarning"
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(LearnMore, {
|
||
slug: "custom-stage-size"
|
||
})),
|
||
help: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Changes the size of the Scratch stage from 480x360 to something else. Try 640x360 to make the stage widescreen. Very few projects will handle this properly.",
|
||
id: "tw.settingsModal.customStageSizeHelp"
|
||
}),
|
||
slug: "custom-stage-size"
|
||
});
|
||
|
||
CustomStageSize.propTypes = {
|
||
customStageSizeEnabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
stageWidth: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
onStageWidthChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
stageHeight: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
onStageHeightChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
|
||
const StoreProjectOptions = ({
|
||
onStoreProjectOptions
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.setting
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
onClick: onStoreProjectOptions,
|
||
className: _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.button
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Store settings in project",
|
||
id: "tw.settingsModal.storeProjectOptions"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Stores the selected settings in the project so they will be automatically applied when TurboWarp loads this project. Warp timer and disable compiler will not be saved.",
|
||
id: "tw.settingsModal.storeProjectOptionsHelp"
|
||
}))));
|
||
|
||
StoreProjectOptions.propTypes = {
|
||
onStoreProjectOptions: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
|
||
const Header = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.header
|
||
}, props.children, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
className: _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.divider
|
||
}));
|
||
|
||
Header.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node
|
||
};
|
||
|
||
const SettingsModalComponent = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_containers_modal_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
className: _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.modalContent,
|
||
onRequestClose: props.onClose,
|
||
contentLabel: props.intl.formatMessage(messages.title),
|
||
id: "settingsModal"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: _settings_modal_css__WEBPACK_IMPORTED_MODULE_11___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Header, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Featured",
|
||
id: "tw.settingsModal.featured"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(CustomFPS, {
|
||
framerate: props.framerate,
|
||
onChange: props.onFramerateChange,
|
||
onCustomizeFramerate: props.onCustomizeFramerate
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Interpolation, {
|
||
value: props.interpolation,
|
||
onChange: props.onInterpolationChange
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(HighQualityPen, {
|
||
value: props.highQualityPen,
|
||
onChange: props.onHighQualityPenChange
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(WarpTimer, {
|
||
value: props.warpTimer,
|
||
onChange: props.onWarpTimerChange
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Header, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Remove Limits",
|
||
id: "tw.settingsModal.removeLimits"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(InfiniteClones, {
|
||
value: props.infiniteClones,
|
||
onChange: props.onInfiniteClonesChange
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(RemoveFencing, {
|
||
value: props.removeFencing,
|
||
onChange: props.onRemoveFencingChange
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(RemoveMiscLimits, {
|
||
value: props.removeLimits,
|
||
onChange: props.onRemoveLimitsChange
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Header, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Danger Zone",
|
||
id: "tw.settingsModal.dangerZone"
|
||
})), !props.isEmbedded && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(CustomStageSize, props), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(DisableCompiler, {
|
||
value: props.disableCompiler,
|
||
onChange: props.onDisableCompilerChange
|
||
}), !props.isEmbedded && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(StoreProjectOptions, props)));
|
||
|
||
SettingsModalComponent.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_0__["intlShape"],
|
||
onClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
isEmbedded: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
framerate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
onFramerateChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onCustomizeFramerate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
highQualityPen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onHighQualityPenChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
interpolation: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onInterpolationChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
infiniteClones: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onInfiniteClonesChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
removeFencing: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onRemoveFencingChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
removeLimits: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onRemoveLimitsChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
warpTimer: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onWarpTimerChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
disableCompiler: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onDisableCompilerChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["injectIntl"])(SettingsModalComponent));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-username-modal/username-modal.css":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/components/tw-username-modal/username-modal.css ***!
|
||
\*************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./username-modal.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/tw-username-modal/username-modal.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/tw-username-modal/username-modal.jsx":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/components/tw-username-modal/username-modal.jsx ***!
|
||
\*************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _containers_modal_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../containers/modal.jsx */ "./src/containers/modal.jsx");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
|
||
/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _username_modal_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./username-modal.css */ "./src/components/tw-username-modal/username-modal.css");
|
||
/* harmony import */ var _username_modal_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_username_modal_css__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _lib_isScratchDesktop_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib/isScratchDesktop.js */ "./src/lib/isScratchDesktop.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["defineMessages"])({
|
||
title: {
|
||
"id": "tw.usernameModal.title",
|
||
"defaultMessage": "Change Username"
|
||
}
|
||
});
|
||
|
||
const UsernameModalComponent = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_containers_modal_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: _username_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.modalContent,
|
||
onRequestClose: props.onCancel,
|
||
contentLabel: props.intl.formatMessage(messages.title),
|
||
id: "usernameModal"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _username_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.body
|
||
}, props.mustChangeUsername && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_2___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", {
|
||
className: classnames__WEBPACK_IMPORTED_MODULE_5___default()(_username_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.helpText, _username_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.mustChange)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Sorry, the cloud variable server thinks your username may be unsafe. Please change it to something else or {resetIt}.",
|
||
id: "tw.usernameModal.mustChange",
|
||
values: {
|
||
resetIt: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("a", {
|
||
className: _username_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.resetLink,
|
||
onClick: props.onReset
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "reset it (recommended)",
|
||
id: "tw.usernameModal.mustChange.resetIt"
|
||
}))
|
||
}
|
||
}))), Object(_lib_isScratchDesktop_js__WEBPACK_IMPORTED_MODULE_7__["default"])() ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", {
|
||
className: _username_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.helpText
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "New username:",
|
||
id: "tw.usernameModal.new"
|
||
})) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("input", {
|
||
autoFocus: true,
|
||
className: _username_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.textInput,
|
||
value: props.value,
|
||
onChange: props.onChange,
|
||
onFocus: props.onFocus,
|
||
onKeyPress: props.onKeyPress,
|
||
pattern: "^[a-zA-Z0-9_-]*$",
|
||
maxLength: "20",
|
||
spellCheck: "false"
|
||
})), Object(_lib_isScratchDesktop_js__WEBPACK_IMPORTED_MODULE_7__["default"])() ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_2___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", {
|
||
className: _username_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.helpText
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "This value will be stored in your browser's storage. It may be logged when you interact with projects that contain cloud variables.",
|
||
id: "tw.usernameModal.help"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", {
|
||
className: _username_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.helpText
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Values that do not correspond to a valid Scratch account will typically be rejected by the cloud variable server. We recommend leaving it as-is or changing it to your Scratch username.",
|
||
id: "tw.usernameModal.help2"
|
||
}))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _username_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.buttonRow
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _username_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.cancelButton,
|
||
onClick: props.onReset
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Reset",
|
||
id: "tw.usernameModal.reset"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _username_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.cancelButton,
|
||
onClick: props.onCancel
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "Cancel",
|
||
id: "gui.prompt.cancel"
|
||
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
|
||
className: _username_modal_css__WEBPACK_IMPORTED_MODULE_6___default.a.okButton,
|
||
onClick: props.onOk,
|
||
disabled: !props.valueValid
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
|
||
defaultMessage: "OK",
|
||
id: "gui.prompt.ok"
|
||
})))));
|
||
|
||
UsernameModalComponent.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_0__["intlShape"],
|
||
mustChangeUsername: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
value: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
valueValid: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
onCancel: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onFocus: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onKeyPress: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onOk: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onReset: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["injectIntl"])(UsernameModalComponent));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/watermark/watermark.css":
|
||
/*!************************************************!*\
|
||
!*** ./src/components/watermark/watermark.css ***!
|
||
\************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./watermark.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/watermark/watermark.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/watermark/watermark.jsx":
|
||
/*!************************************************!*\
|
||
!*** ./src/components/watermark/watermark.jsx ***!
|
||
\************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _watermark_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./watermark.css */ "./src/components/watermark/watermark.css");
|
||
/* harmony import */ var _watermark_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_watermark_css__WEBPACK_IMPORTED_MODULE_2__);
|
||
|
||
|
||
|
||
|
||
const Watermark = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
className: _watermark_css__WEBPACK_IMPORTED_MODULE_2___default.a.spriteImage,
|
||
src: props.costumeURL
|
||
});
|
||
|
||
Watermark.propTypes = {
|
||
costumeURL: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Watermark);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/waveform/waveform.css":
|
||
/*!**********************************************!*\
|
||
!*** ./src/components/waveform/waveform.css ***!
|
||
\**********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./waveform.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/waveform/waveform.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/waveform/waveform.jsx":
|
||
/*!**********************************************!*\
|
||
!*** ./src/components/waveform/waveform.jsx ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _waveform_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./waveform.css */ "./src/components/waveform/waveform.css");
|
||
/* harmony import */ var _waveform_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_waveform_css__WEBPACK_IMPORTED_MODULE_2__);
|
||
|
||
|
||
// Waveform is expensive to compute, make sure it only updates when data does
|
||
// by using PureComponent. In future can be changed back to function with React.memo
|
||
// eslint-disable-next-line react/prefer-stateless-function
|
||
|
||
class Waveform extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent {
|
||
render() {
|
||
const {
|
||
width,
|
||
height,
|
||
data
|
||
} = this.props; // Never want a density of points higher than the number of pixels
|
||
// This is very conservative, could be far fewer points because of curve smoothing.
|
||
// Drawing too many points seems to cause an explosion in browser
|
||
// composite time when animating the playhead
|
||
|
||
const takeEveryN = Math.ceil(data.length / width);
|
||
const filteredData = takeEveryN === 1 ? data.slice(0) : data.filter((_, i) => i % takeEveryN === 0); // Need at least two points to render waveform.
|
||
|
||
if (filteredData.length === 1) {
|
||
filteredData.push(filteredData[0]);
|
||
}
|
||
|
||
const maxIndex = filteredData.length - 1;
|
||
const points = [...filteredData.map((v, i) => [width * (i / maxIndex), height * v / 2]), ...filteredData.reverse().map((v, i) => [width * (1 - i / maxIndex), -height * v / 2])];
|
||
const pathComponents = points.map(([x, y], i) => {
|
||
const [nx, ny] = points[i < points.length - 1 ? i + 1 : 0];
|
||
return "Q".concat(x, " ").concat(y, " ").concat((x + nx) / 2, " ").concat((y + ny) / 2);
|
||
});
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("svg", {
|
||
className: _waveform_css__WEBPACK_IMPORTED_MODULE_2___default.a.container,
|
||
viewBox: "0 0 ".concat(width, " ").concat(height)
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("g", {
|
||
transform: "scale(1, -1) translate(0, -".concat(height / 2, ")")
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("path", {
|
||
className: _waveform_css__WEBPACK_IMPORTED_MODULE_2___default.a.waveformPath,
|
||
d: "M0 0".concat(pathComponents.join(' '), "Z"),
|
||
strokeLinejoin: 'round',
|
||
strokeWidth: 1
|
||
})));
|
||
}
|
||
|
||
}
|
||
|
||
Waveform.propTypes = {
|
||
data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number),
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Waveform);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/webgl-modal/unsupported.png":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/webgl-modal/unsupported.png ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/905aaa5ec7fca7cf364f5e74bcb10be1.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/webgl-modal/webgl-modal.css":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/webgl-modal/webgl-modal.css ***!
|
||
\****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--5-1!../../../node_modules/postcss-loader/src??postcss!./webgl-modal.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/components/webgl-modal/webgl-modal.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/components/webgl-modal/webgl-modal.jsx":
|
||
/*!****************************************************!*\
|
||
!*** ./src/components/webgl-modal/webgl-modal.jsx ***!
|
||
\****************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_modal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-modal */ "./node_modules/react-modal/lib/index.js");
|
||
/* harmony import */ var react_modal__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_modal__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _webgl_modal_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./webgl-modal.css */ "./src/components/webgl-modal/webgl-modal.css");
|
||
/* harmony import */ var _webgl_modal_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_webgl_modal_css__WEBPACK_IMPORTED_MODULE_5__);
|
||
const _excluded = ["intl"];
|
||
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["defineMessages"])({
|
||
label: {
|
||
"id": "gui.webglModal.label",
|
||
"defaultMessage": "Your Browser Does Not Support WebGL"
|
||
}
|
||
});
|
||
|
||
const WebGlModal = _ref => {
|
||
let {
|
||
intl
|
||
} = _ref,
|
||
props = _objectWithoutProperties(_ref, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_modal__WEBPACK_IMPORTED_MODULE_2___default.a, {
|
||
isOpen: true,
|
||
className: _webgl_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.modalContent,
|
||
contentLabel: intl.formatMessage(_objectSpread({}, messages.label)),
|
||
overlayClassName: _webgl_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.modalOverlay
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
dir: props.isRtl ? 'rtl' : 'ltr'
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _webgl_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.illustration
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: _webgl_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.body
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("h2", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], messages.label)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "Unfortunately it looks like your browser or computer {webGlLink}. This technology is needed for this site to run. Try updating your browser and graphics drivers or restarting your computer.",
|
||
id: "tw.webglModal.description",
|
||
values: {
|
||
webGlLink: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("a", {
|
||
className: _webgl_modal_css__WEBPACK_IMPORTED_MODULE_5___default.a.faqLink,
|
||
href: "https://get.webgl.org/"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__["FormattedMessage"], {
|
||
defaultMessage: "does not support WebGL",
|
||
id: "gui.webglModal.webgllink"
|
||
}))
|
||
}
|
||
})))));
|
||
};
|
||
|
||
WebGlModal.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_4__["intlShape"].isRequired,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["injectIntl"])(WebGlModal));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/alert.jsx":
|
||
/*!**********************************!*\
|
||
!*** ./src/containers/alert.jsx ***!
|
||
\**********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _sb3_downloader_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sb3-downloader.jsx */ "./src/containers/sb3-downloader.jsx");
|
||
/* harmony import */ var _components_alerts_alert_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/alerts/alert.jsx */ "./src/components/alerts/alert.jsx");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _reducers_connection_modal__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/connection-modal */ "./src/reducers/connection-modal.js");
|
||
/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../reducers/project-state */ "./src/reducers/project-state.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class Alert extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_1___default()(this, ['handleOnCloseAlert', 'handleOnReconnect']);
|
||
}
|
||
|
||
handleOnCloseAlert() {
|
||
this.props.onCloseAlert(this.props.index);
|
||
}
|
||
|
||
handleOnReconnect() {
|
||
this.props.onOpenConnectionModal(this.props.extensionId);
|
||
this.handleOnCloseAlert();
|
||
}
|
||
|
||
render() {
|
||
const {
|
||
closeButton,
|
||
content,
|
||
extensionName,
|
||
index,
|
||
// eslint-disable-line no-unused-vars
|
||
level,
|
||
iconSpinner,
|
||
iconURL,
|
||
message,
|
||
onSaveNow,
|
||
showDownload,
|
||
showReconnect,
|
||
showSaveNow
|
||
} = this.props;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_sb3_downloader_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], null, (_, downloadProject) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_alerts_alert_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
closeButton: closeButton,
|
||
content: content,
|
||
extensionName: extensionName,
|
||
iconSpinner: iconSpinner,
|
||
iconURL: iconURL,
|
||
level: level,
|
||
message: message,
|
||
showDownload: showDownload,
|
||
showReconnect: showReconnect,
|
||
showSaveNow: showSaveNow,
|
||
onCloseAlert: this.handleOnCloseAlert,
|
||
onDownload: downloadProject,
|
||
onReconnect: this.handleOnReconnect,
|
||
onSaveNow: onSaveNow
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
const mapStateToProps = () => ({});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onOpenConnectionModal: id => {
|
||
dispatch(Object(_reducers_connection_modal__WEBPACK_IMPORTED_MODULE_7__["setConnectionModalExtensionId"])(id));
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_6__["openConnectionModal"])());
|
||
},
|
||
onSaveNow: () => {
|
||
dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__["manualUpdateProject"])());
|
||
}
|
||
});
|
||
|
||
Alert.propTypes = {
|
||
closeButton: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
content: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.element,
|
||
extensionId: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
extensionName: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
iconSpinner: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
iconURL: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
index: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,
|
||
level: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string.isRequired,
|
||
message: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
onCloseAlert: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onOpenConnectionModal: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onSaveNow: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
showDownload: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
showReconnect: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
showSaveNow: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(Alert));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/alerts.jsx":
|
||
/*!***********************************!*\
|
||
!*** ./src/containers/alerts.jsx ***!
|
||
\***********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_alerts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../reducers/alerts */ "./src/reducers/alerts.js");
|
||
/* harmony import */ var _components_alerts_alerts_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/alerts/alerts.jsx */ "./src/components/alerts/alerts.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const Alerts = ({
|
||
alertsList,
|
||
className,
|
||
onCloseAlert
|
||
}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_alerts_alerts_jsx__WEBPACK_IMPORTED_MODULE_4__["default"] // only display standard and extension alerts here
|
||
, {
|
||
alertsList: Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_3__["filterPopupAlerts"])(alertsList),
|
||
className: className,
|
||
onCloseAlert: onCloseAlert
|
||
});
|
||
|
||
Alerts.propTypes = {
|
||
alertsList: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object),
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onCloseAlert: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
alertsList: state.scratchGui.alerts.alertsList
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onCloseAlert: index => dispatch(Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_3__["closeAlert"])(index))
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_2__["connect"])(mapStateToProps, mapDispatchToProps)(Alerts));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/audio-selector.jsx":
|
||
/*!*******************************************!*\
|
||
!*** ./src/containers/audio-selector.jsx ***!
|
||
\*******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_audio_trimmer_audio_selector_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/audio-trimmer/audio-selector.jsx */ "./src/components/audio-trimmer/audio-selector.jsx");
|
||
/* harmony import */ var _lib_touch_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/touch-utils */ "./src/lib/touch-utils.js");
|
||
/* harmony import */ var _lib_drag_recognizer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/drag-recognizer */ "./src/lib/drag-recognizer.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const MIN_LENGTH = 0.01;
|
||
const MIN_DURATION = 500;
|
||
|
||
class AudioSelector extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleNewSelectionMouseDown', 'handleTrimStartMouseDown', 'handleTrimEndMouseDown', 'handleTrimStartMouseMove', 'handleTrimEndMouseMove', 'handleTrimStartMouseUp', 'handleTrimEndMouseUp', 'storeRef']);
|
||
this.state = {
|
||
trimStart: props.trimStart,
|
||
trimEnd: props.trimEnd
|
||
};
|
||
this.clickStartTime = 0;
|
||
this.trimStartDragRecognizer = new _lib_drag_recognizer__WEBPACK_IMPORTED_MODULE_5__["default"]({
|
||
onDrag: this.handleTrimStartMouseMove,
|
||
onDragEnd: this.handleTrimStartMouseUp,
|
||
touchDragAngle: 90,
|
||
distanceThreshold: 0
|
||
});
|
||
this.trimEndDragRecognizer = new _lib_drag_recognizer__WEBPACK_IMPORTED_MODULE_5__["default"]({
|
||
onDrag: this.handleTrimEndMouseMove,
|
||
onDragEnd: this.handleTrimEndMouseUp,
|
||
touchDragAngle: 90,
|
||
distanceThreshold: 0
|
||
});
|
||
}
|
||
|
||
componentWillReceiveProps(newProps) {
|
||
const {
|
||
trimStart,
|
||
trimEnd
|
||
} = this.props;
|
||
if (newProps.trimStart === trimStart && newProps.trimEnd === trimEnd) return;
|
||
this.setState({
|
||
trimStart: newProps.trimStart,
|
||
trimEnd: newProps.trimEnd
|
||
});
|
||
}
|
||
|
||
clearSelection() {
|
||
this.props.onSetTrim(null, null);
|
||
}
|
||
|
||
handleNewSelectionMouseDown(e) {
|
||
const {
|
||
width,
|
||
left
|
||
} = this.containerElement.getBoundingClientRect();
|
||
this.initialTrimEnd = (Object(_lib_touch_utils__WEBPACK_IMPORTED_MODULE_4__["getEventXY"])(e).x - left) / width;
|
||
this.initialTrimStart = this.initialTrimEnd;
|
||
this.props.onSetTrim(this.initialTrimStart, this.initialTrimEnd);
|
||
this.clickStartTime = Date.now();
|
||
this.containerSize = width;
|
||
this.trimEndDragRecognizer.start(e);
|
||
e.preventDefault();
|
||
}
|
||
|
||
handleTrimStartMouseMove(currentOffset, initialOffset) {
|
||
const dx = (currentOffset.x - initialOffset.x) / this.containerSize;
|
||
const newTrim = Math.max(0, Math.min(1, this.initialTrimStart + dx));
|
||
|
||
if (newTrim > this.initialTrimEnd) {
|
||
this.setState({
|
||
trimStart: this.initialTrimEnd,
|
||
trimEnd: newTrim
|
||
});
|
||
} else {
|
||
this.setState({
|
||
trimStart: newTrim,
|
||
trimEnd: this.initialTrimEnd
|
||
});
|
||
}
|
||
}
|
||
|
||
handleTrimEndMouseMove(currentOffset, initialOffset) {
|
||
const dx = (currentOffset.x - initialOffset.x) / this.containerSize;
|
||
const newTrim = Math.min(1, Math.max(0, this.initialTrimEnd + dx));
|
||
|
||
if (newTrim < this.initialTrimStart) {
|
||
this.setState({
|
||
trimStart: newTrim,
|
||
trimEnd: this.initialTrimStart
|
||
});
|
||
} else {
|
||
this.setState({
|
||
trimStart: this.initialTrimStart,
|
||
trimEnd: newTrim
|
||
});
|
||
}
|
||
}
|
||
|
||
handleTrimStartMouseUp() {
|
||
this.props.onSetTrim(this.state.trimStart, this.state.trimEnd);
|
||
}
|
||
|
||
handleTrimEndMouseUp() {
|
||
// If the selection was made quickly (tooFast) and is small (tooShort),
|
||
// deselect instead. This allows click-to-deselect even if you drag
|
||
// a little bit by accident. It also allows very quickly making a
|
||
// selection, as long as it is above a minimum length.
|
||
const tooFast = Date.now() - this.clickStartTime < MIN_DURATION;
|
||
const tooShort = this.state.trimEnd - this.state.trimStart < MIN_LENGTH;
|
||
|
||
if (tooFast && tooShort) {
|
||
this.clearSelection();
|
||
} else {
|
||
this.props.onSetTrim(this.state.trimStart, this.state.trimEnd);
|
||
}
|
||
}
|
||
|
||
handleTrimStartMouseDown(e) {
|
||
this.containerSize = this.containerElement.getBoundingClientRect().width;
|
||
this.trimStartDragRecognizer.start(e);
|
||
this.initialTrimStart = this.props.trimStart;
|
||
this.initialTrimEnd = this.props.trimEnd;
|
||
e.stopPropagation();
|
||
e.preventDefault();
|
||
}
|
||
|
||
handleTrimEndMouseDown(e) {
|
||
this.containerSize = this.containerElement.getBoundingClientRect().width;
|
||
this.trimEndDragRecognizer.start(e);
|
||
this.initialTrimEnd = this.props.trimEnd;
|
||
this.initialTrimStart = this.props.trimStart;
|
||
e.stopPropagation();
|
||
e.preventDefault();
|
||
}
|
||
|
||
storeRef(el) {
|
||
this.containerElement = el;
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_audio_trimmer_audio_selector_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
containerRef: this.storeRef,
|
||
playhead: this.props.playhead,
|
||
trimEnd: this.state.trimEnd,
|
||
trimStart: this.state.trimStart,
|
||
onNewSelectionMouseDown: this.handleNewSelectionMouseDown,
|
||
onTrimEndMouseDown: this.handleTrimEndMouseDown,
|
||
onTrimStartMouseDown: this.handleTrimStartMouseDown
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
AudioSelector.propTypes = {
|
||
onSetTrim: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
playhead: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
trimEnd: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
trimStart: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (AudioSelector);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/audio-trimmer.jsx":
|
||
/*!******************************************!*\
|
||
!*** ./src/containers/audio-trimmer.jsx ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_audio_trimmer_audio_trimmer_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/audio-trimmer/audio-trimmer.jsx */ "./src/components/audio-trimmer/audio-trimmer.jsx");
|
||
/* harmony import */ var _lib_drag_recognizer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/drag-recognizer */ "./src/lib/drag-recognizer.js");
|
||
|
||
|
||
|
||
|
||
|
||
const MIN_LENGTH = 0.01; // Used to stop sounds being trimmed smaller than 1%
|
||
|
||
class AudioTrimmer extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleTrimStartMouseDown', 'handleTrimEndMouseDown', 'handleTrimStartMouseMove', 'handleTrimEndMouseMove', 'storeRef']);
|
||
this.trimStartDragRecognizer = new _lib_drag_recognizer__WEBPACK_IMPORTED_MODULE_4__["default"]({
|
||
onDrag: this.handleTrimStartMouseMove,
|
||
touchDragAngle: 90,
|
||
distanceThreshold: 0
|
||
});
|
||
this.trimEndDragRecognizer = new _lib_drag_recognizer__WEBPACK_IMPORTED_MODULE_4__["default"]({
|
||
onDrag: this.handleTrimEndMouseMove,
|
||
touchDragAngle: 90,
|
||
distanceThreshold: 0
|
||
});
|
||
}
|
||
|
||
handleTrimStartMouseMove(currentOffset, initialOffset) {
|
||
const dx = (currentOffset.x - initialOffset.x) / this.containerSize;
|
||
const newTrim = Math.max(0, Math.min(this.props.trimEnd - MIN_LENGTH, this.initialTrim + dx));
|
||
this.props.onSetTrimStart(newTrim);
|
||
}
|
||
|
||
handleTrimEndMouseMove(currentOffset, initialOffset) {
|
||
const dx = (currentOffset.x - initialOffset.x) / this.containerSize;
|
||
const newTrim = Math.min(1, Math.max(this.props.trimStart + MIN_LENGTH, this.initialTrim + dx));
|
||
this.props.onSetTrimEnd(newTrim);
|
||
}
|
||
|
||
handleTrimStartMouseDown(e) {
|
||
this.containerSize = this.containerElement.getBoundingClientRect().width;
|
||
this.trimStartDragRecognizer.start(e);
|
||
this.initialTrim = this.props.trimStart;
|
||
}
|
||
|
||
handleTrimEndMouseDown(e) {
|
||
this.containerSize = this.containerElement.getBoundingClientRect().width;
|
||
this.trimEndDragRecognizer.start(e);
|
||
this.initialTrim = this.props.trimEnd;
|
||
}
|
||
|
||
storeRef(el) {
|
||
this.containerElement = el;
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_audio_trimmer_audio_trimmer_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
containerRef: this.storeRef,
|
||
playhead: this.props.playhead,
|
||
trimEnd: this.props.trimEnd,
|
||
trimStart: this.props.trimStart,
|
||
onTrimEndMouseDown: this.handleTrimEndMouseDown,
|
||
onTrimStartMouseDown: this.handleTrimStartMouseDown
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
AudioTrimmer.propTypes = {
|
||
onSetTrimEnd: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onSetTrimStart: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
playhead: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
trimEnd: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
trimStart: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (AudioTrimmer);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/auto-scanning-step.jsx":
|
||
/*!***********************************************!*\
|
||
!*** ./src/containers/auto-scanning-step.jsx ***!
|
||
\***********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_connection_modal_auto_scanning_step_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/connection-modal/auto-scanning-step.jsx */ "./src/components/connection-modal/auto-scanning-step.jsx");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class AutoScanningStep extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handlePeripheralListUpdate', 'handlePeripheralScanTimeout', 'handleStartScan', 'handleRefresh']);
|
||
this.state = {
|
||
phase: _components_connection_modal_auto_scanning_step_jsx__WEBPACK_IMPORTED_MODULE_3__["PHASES"].prescan
|
||
};
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
// @todo: stop the peripheral scan here
|
||
this.unbindPeripheralUpdates();
|
||
}
|
||
|
||
handlePeripheralScanTimeout() {
|
||
this.setState({
|
||
phase: _components_connection_modal_auto_scanning_step_jsx__WEBPACK_IMPORTED_MODULE_3__["PHASES"].notfound
|
||
});
|
||
this.unbindPeripheralUpdates();
|
||
}
|
||
|
||
handlePeripheralListUpdate(newList) {
|
||
// TODO: sort peripherals by signal strength? so they don't jump around
|
||
const peripheralArray = Object.keys(newList).map(id => newList[id]);
|
||
|
||
if (peripheralArray.length > 0) {
|
||
this.props.onConnecting(peripheralArray[0].peripheralId);
|
||
}
|
||
}
|
||
|
||
bindPeripheralUpdates() {
|
||
this.props.vm.on('PERIPHERAL_LIST_UPDATE', this.handlePeripheralListUpdate);
|
||
this.props.vm.on('PERIPHERAL_SCAN_TIMEOUT', this.handlePeripheralScanTimeout);
|
||
}
|
||
|
||
unbindPeripheralUpdates() {
|
||
this.props.vm.removeListener('PERIPHERAL_LIST_UPDATE', this.handlePeripheralListUpdate);
|
||
this.props.vm.removeListener('PERIPHERAL_SCAN_TIMEOUT', this.handlePeripheralScanTimeout);
|
||
}
|
||
|
||
handleRefresh() {
|
||
// @todo: stop the peripheral scan here, it is more important for auto scan
|
||
// due to timeout and cancellation
|
||
this.setState({
|
||
phase: _components_connection_modal_auto_scanning_step_jsx__WEBPACK_IMPORTED_MODULE_3__["PHASES"].prescan
|
||
});
|
||
this.unbindPeripheralUpdates();
|
||
}
|
||
|
||
handleStartScan() {
|
||
this.bindPeripheralUpdates();
|
||
this.props.vm.scanForPeripheral(this.props.extensionId);
|
||
this.setState({
|
||
phase: _components_connection_modal_auto_scanning_step_jsx__WEBPACK_IMPORTED_MODULE_3__["PHASES"].pressbutton
|
||
});
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_connection_modal_auto_scanning_step_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
connectionTipIconURL: this.props.connectionTipIconURL,
|
||
phase: this.state.phase,
|
||
title: this.props.extensionId,
|
||
onRefresh: this.handleRefresh,
|
||
onStartScan: this.handleStartScan
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
AutoScanningStep.propTypes = {
|
||
connectionTipIconURL: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
extensionId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
onConnecting: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a).isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (AutoScanningStep);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/backdrop-library.jsx":
|
||
/*!*********************************************!*\
|
||
!*** ./src/containers/backdrop-library.jsx ***!
|
||
\*********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/libraries/tw-async-libraries */ "./src/lib/libraries/tw-async-libraries.js");
|
||
/* harmony import */ var _lib_libraries_backdrop_tags__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/libraries/backdrop-tags */ "./src/lib/libraries/backdrop-tags.js");
|
||
/* harmony import */ var _components_library_library_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/library/library.jsx */ "./src/components/library/library.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
libraryTitle: {
|
||
"id": "gui.costumeLibrary.chooseABackdrop",
|
||
"defaultMessage": "Choose a Backdrop"
|
||
}
|
||
});
|
||
|
||
class BackdropLibrary extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleItemSelect']);
|
||
}
|
||
|
||
handleItemSelect(item) {
|
||
const vmBackdrop = {
|
||
name: item.name,
|
||
rotationCenterX: item.rotationCenterX,
|
||
rotationCenterY: item.rotationCenterY,
|
||
bitmapResolution: item.bitmapResolution,
|
||
skinId: null
|
||
}; // Do not switch to stage, just add the backdrop
|
||
|
||
this.props.vm.addBackdrop(item.md5ext, vmBackdrop);
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_library_library_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
data: Object(_lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_5__["getBackdropLibrary"])(),
|
||
id: "backdropLibrary",
|
||
tags: _lib_libraries_backdrop_tags__WEBPACK_IMPORTED_MODULE_6__["default"],
|
||
title: this.props.intl.formatMessage(messages.libraryTitle),
|
||
onItemSelected: this.handleItemSelect,
|
||
onRequestClose: this.props.onRequestClose
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
BackdropLibrary.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"].isRequired,
|
||
onRequestClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a).isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(BackdropLibrary));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/backpack.jsx":
|
||
/*!*************************************!*\
|
||
!*** ./src/containers/backpack.jsx ***!
|
||
\*************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _components_backpack_backpack_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/backpack/backpack.jsx */ "./src/components/backpack/backpack.jsx");
|
||
/* harmony import */ var _lib_backpack_api__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/backpack-api */ "./src/lib/backpack-api.js");
|
||
/* harmony import */ var _lib_drag_constants__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/drag-constants */ "./src/lib/drag-constants.js");
|
||
/* harmony import */ var _lib_drop_area_hoc_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/drop-area-hoc.jsx */ "./src/lib/drop-area-hoc.jsx");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _lib_storage__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../lib/storage */ "./src/lib/storage.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_10__);
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const dragTypes = [_lib_drag_constants__WEBPACK_IMPORTED_MODULE_6__["default"].COSTUME, _lib_drag_constants__WEBPACK_IMPORTED_MODULE_6__["default"].SOUND, _lib_drag_constants__WEBPACK_IMPORTED_MODULE_6__["default"].SPRITE];
|
||
const DroppableBackpack = Object(_lib_drop_area_hoc_jsx__WEBPACK_IMPORTED_MODULE_7__["default"])(dragTypes)(_components_backpack_backpack_jsx__WEBPACK_IMPORTED_MODULE_4__["default"]);
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
rename: {
|
||
"id": "tw.backpack.rename",
|
||
"defaultMessage": "New name:"
|
||
}
|
||
});
|
||
|
||
class Backpack extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleDrop', 'handleToggle', 'handleDelete', 'handleRename', 'getBackpackAssetURL', 'getContents', 'handleMouseEnter', 'handleMouseLeave', 'handleBlockDragEnd', 'handleBlockDragUpdate', 'handleMore']);
|
||
this.state = {
|
||
// While the DroppableHOC manages drop interactions for asset tiles,
|
||
// we still need to micromanage drops coming from the block workspace.
|
||
// TODO this may be refactorable with the share-the-love logic in SpriteSelectorItem
|
||
blockDragOutsideWorkspace: false,
|
||
blockDragOverBackpack: false,
|
||
error: false,
|
||
itemsPerPage: 20,
|
||
moreToLoad: false,
|
||
loading: false,
|
||
expanded: false,
|
||
contents: []
|
||
}; // If a host is given, add it as a web source to the storage module
|
||
// TODO remove the hacky flag that prevents double adding
|
||
|
||
if (props.host && !_lib_storage__WEBPACK_IMPORTED_MODULE_9__["default"]._hasAddedBackpackSource && props.host !== _lib_backpack_api__WEBPACK_IMPORTED_MODULE_5__["LOCAL_API"]) {
|
||
_lib_storage__WEBPACK_IMPORTED_MODULE_9__["default"].addWebSource([_lib_storage__WEBPACK_IMPORTED_MODULE_9__["default"].AssetType.ImageVector, _lib_storage__WEBPACK_IMPORTED_MODULE_9__["default"].AssetType.ImageBitmap, _lib_storage__WEBPACK_IMPORTED_MODULE_9__["default"].AssetType.Sound], this.getBackpackAssetURL);
|
||
_lib_storage__WEBPACK_IMPORTED_MODULE_9__["default"]._hasAddedBackpackSource = true;
|
||
}
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.props.vm.addListener('BLOCK_DRAG_END', this.handleBlockDragEnd);
|
||
this.props.vm.addListener('BLOCK_DRAG_UPDATE', this.handleBlockDragUpdate);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.props.vm.removeListener('BLOCK_DRAG_END', this.handleBlockDragEnd);
|
||
this.props.vm.removeListener('BLOCK_DRAG_UPDATE', this.handleBlockDragUpdate);
|
||
}
|
||
|
||
getBackpackAssetURL(asset) {
|
||
return "".concat(this.props.host, "/").concat(asset.assetId, ".").concat(asset.dataFormat);
|
||
}
|
||
|
||
handleToggle() {
|
||
const newState = !this.state.expanded;
|
||
this.setState({
|
||
expanded: newState,
|
||
contents: []
|
||
}, () => {
|
||
// Emit resize on window to get blocks to resize
|
||
window.dispatchEvent(new Event('resize'));
|
||
});
|
||
|
||
if (newState) {
|
||
this.getContents();
|
||
}
|
||
}
|
||
|
||
handleError(error) {
|
||
this.setState({
|
||
error: "".concat(error),
|
||
loading: false
|
||
}); // Log error to console and make the Promise reject.
|
||
|
||
throw error;
|
||
}
|
||
|
||
handleDrop(dragInfo) {
|
||
let payloader = null;
|
||
let presaveAsset = null;
|
||
|
||
switch (dragInfo.dragType) {
|
||
case _lib_drag_constants__WEBPACK_IMPORTED_MODULE_6__["default"].COSTUME:
|
||
payloader = _lib_backpack_api__WEBPACK_IMPORTED_MODULE_5__["costumePayload"];
|
||
presaveAsset = dragInfo.payload.asset;
|
||
break;
|
||
|
||
case _lib_drag_constants__WEBPACK_IMPORTED_MODULE_6__["default"].SOUND:
|
||
payloader = _lib_backpack_api__WEBPACK_IMPORTED_MODULE_5__["soundPayload"];
|
||
presaveAsset = dragInfo.payload.asset;
|
||
break;
|
||
|
||
case _lib_drag_constants__WEBPACK_IMPORTED_MODULE_6__["default"].SPRITE:
|
||
payloader = _lib_backpack_api__WEBPACK_IMPORTED_MODULE_5__["spritePayload"];
|
||
break;
|
||
|
||
case _lib_drag_constants__WEBPACK_IMPORTED_MODULE_6__["default"].CODE:
|
||
payloader = _lib_backpack_api__WEBPACK_IMPORTED_MODULE_5__["codePayload"];
|
||
break;
|
||
}
|
||
|
||
if (!payloader) return; // Creating the payload is async, so set loading before starting
|
||
|
||
this.setState({
|
||
loading: true
|
||
}, () => {
|
||
payloader(dragInfo.payload, this.props.vm).then(payload => {
|
||
// Force the asset to save to the asset server before storing in backpack
|
||
// Ensures any asset present in the backpack is also on the asset server
|
||
if (presaveAsset && !presaveAsset.clean && !this.props.host === _lib_backpack_api__WEBPACK_IMPORTED_MODULE_5__["LOCAL_API"]) {
|
||
return _lib_storage__WEBPACK_IMPORTED_MODULE_9__["default"].store(presaveAsset.assetType, presaveAsset.dataFormat, presaveAsset.data, presaveAsset.assetId).then(() => payload);
|
||
}
|
||
|
||
return payload;
|
||
}).then(payload => Object(_lib_backpack_api__WEBPACK_IMPORTED_MODULE_5__["saveBackpackObject"])(_objectSpread({
|
||
host: this.props.host,
|
||
token: this.props.token,
|
||
username: this.props.username
|
||
}, payload))).then(item => {
|
||
this.setState({
|
||
loading: false,
|
||
contents: [item].concat(this.state.contents)
|
||
});
|
||
}).catch(error => {
|
||
this.handleError(error);
|
||
});
|
||
});
|
||
}
|
||
|
||
handleDelete(id) {
|
||
this.setState({
|
||
loading: true
|
||
}, () => {
|
||
Object(_lib_backpack_api__WEBPACK_IMPORTED_MODULE_5__["deleteBackpackObject"])({
|
||
host: this.props.host,
|
||
token: this.props.token,
|
||
username: this.props.username,
|
||
id: id
|
||
}).then(() => {
|
||
this.setState({
|
||
loading: false,
|
||
contents: this.state.contents.filter(o => o.id !== id)
|
||
});
|
||
}).catch(error => {
|
||
this.handleError(error);
|
||
});
|
||
});
|
||
}
|
||
|
||
findItemById(id) {
|
||
return this.state.contents.find(i => i.id === id);
|
||
}
|
||
|
||
async handleRename(id) {
|
||
const item = this.findItemById(id); // prompt() returns Promise in desktop app
|
||
// eslint-disable-next-line no-alert
|
||
|
||
const newName = await prompt(this.props.intl.formatMessage(messages.rename), item.name);
|
||
|
||
if (!newName) {
|
||
return;
|
||
}
|
||
|
||
this.setState({
|
||
loading: true
|
||
}, () => {
|
||
Object(_lib_backpack_api__WEBPACK_IMPORTED_MODULE_5__["updateBackpackObject"])(_objectSpread(_objectSpread({
|
||
host: this.props.host
|
||
}, item), {}, {
|
||
name: newName
|
||
})).then(newItem => {
|
||
this.setState({
|
||
loading: false,
|
||
contents: this.state.contents.map(i => i === item ? newItem : i)
|
||
});
|
||
}).catch(error => {
|
||
this.handleError(error);
|
||
});
|
||
});
|
||
}
|
||
|
||
getContents() {
|
||
if (this.props.token && this.props.username || this.props.host === _lib_backpack_api__WEBPACK_IMPORTED_MODULE_5__["LOCAL_API"]) {
|
||
this.setState({
|
||
loading: true,
|
||
error: false
|
||
}, () => {
|
||
Object(_lib_backpack_api__WEBPACK_IMPORTED_MODULE_5__["getBackpackContents"])({
|
||
host: this.props.host,
|
||
token: this.props.token,
|
||
username: this.props.username,
|
||
offset: this.state.contents.length,
|
||
limit: this.state.itemsPerPage
|
||
}).then(contents => {
|
||
this.setState({
|
||
contents: this.state.contents.concat(contents),
|
||
moreToLoad: contents.length === this.state.itemsPerPage,
|
||
loading: false
|
||
});
|
||
}).catch(error => {
|
||
this.handleError(error);
|
||
});
|
||
});
|
||
}
|
||
}
|
||
|
||
handleBlockDragUpdate(isOutsideWorkspace) {
|
||
this.setState({
|
||
blockDragOutsideWorkspace: isOutsideWorkspace
|
||
});
|
||
}
|
||
|
||
handleMouseEnter() {
|
||
if (this.state.blockDragOutsideWorkspace) {
|
||
this.setState({
|
||
blockDragOverBackpack: true
|
||
});
|
||
}
|
||
}
|
||
|
||
handleMouseLeave() {
|
||
this.setState({
|
||
blockDragOverBackpack: false
|
||
});
|
||
}
|
||
|
||
handleBlockDragEnd(blocks, topBlockId) {
|
||
if (this.state.blockDragOverBackpack) {
|
||
this.handleDrop({
|
||
dragType: _lib_drag_constants__WEBPACK_IMPORTED_MODULE_6__["default"].CODE,
|
||
payload: {
|
||
blockObjects: this.props.vm.exportStandaloneBlocks(blocks),
|
||
topBlockId: topBlockId
|
||
}
|
||
});
|
||
}
|
||
|
||
this.setState({
|
||
blockDragOverBackpack: false,
|
||
blockDragOutsideWorkspace: false
|
||
});
|
||
}
|
||
|
||
handleMore() {
|
||
this.getContents();
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(DroppableBackpack, {
|
||
blockDragOver: this.state.blockDragOverBackpack,
|
||
contents: this.state.contents,
|
||
error: this.state.error,
|
||
expanded: this.state.expanded,
|
||
loading: this.state.loading,
|
||
showMore: this.state.moreToLoad,
|
||
onDelete: this.handleDelete,
|
||
onRename: this.handleRename,
|
||
onDrop: this.handleDrop,
|
||
onMore: this.handleMore,
|
||
onMouseEnter: this.handleMouseEnter,
|
||
onMouseLeave: this.handleMouseLeave,
|
||
onToggle: this.props.host ? this.handleToggle : null
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
Backpack.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"],
|
||
host: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
token: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
username: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_10___default.a)
|
||
};
|
||
|
||
const getTokenAndUsername = state => {
|
||
// Look for the session state provided by scratch-www
|
||
if (state.session && state.session.session && state.session.session.user) {
|
||
return {
|
||
token: state.session.session.user.token,
|
||
username: state.session.session.user.username
|
||
};
|
||
} // Otherwise try to pull testing params out of the URL, or return nulls
|
||
// TODO a hack for testing the backpack
|
||
|
||
|
||
const tokenMatches = window.location.href.match(/[?&]token=([^&]*)&?/);
|
||
const usernameMatches = window.location.href.match(/[?&]username=([^&]*)&?/);
|
||
return {
|
||
token: tokenMatches ? tokenMatches[1] : null,
|
||
username: usernameMatches ? usernameMatches[1] : null
|
||
};
|
||
};
|
||
|
||
const mapStateToProps = state => Object.assign({
|
||
dragInfo: state.scratchGui.assetDrag,
|
||
vm: state.scratchGui.vm,
|
||
blockDrag: state.scratchGui.blockDrag
|
||
}, getTokenAndUsername(state));
|
||
|
||
const mapDispatchToProps = () => ({});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_8__["connect"])(mapStateToProps, mapDispatchToProps)(Backpack)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/blocks.jsx":
|
||
/*!***********************************!*\
|
||
!*** ./src/containers/blocks.jsx ***!
|
||
\***********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash.debounce */ "./node_modules/lodash.debounce/index.js");
|
||
/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_defaultsdeep__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.defaultsdeep */ "./node_modules/lodash.defaultsdeep/index.js");
|
||
/* harmony import */ var lodash_defaultsdeep__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_defaultsdeep__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _lib_make_toolbox_xml__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/make-toolbox-xml */ "./src/lib/make-toolbox-xml.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _lib_blocks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/blocks */ "./src/lib/blocks.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var _lib_log_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../lib/log.js */ "./src/lib/log.js");
|
||
/* harmony import */ var _prompt_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./prompt.jsx */ "./src/containers/prompt.jsx");
|
||
/* harmony import */ var _components_blocks_blocks_jsx__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../components/blocks/blocks.jsx */ "./src/components/blocks/blocks.jsx");
|
||
/* harmony import */ var _extension_library_jsx__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./extension-library.jsx */ "./src/containers/extension-library.jsx");
|
||
/* harmony import */ var _lib_libraries_extensions_index_jsx__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../lib/libraries/extensions/index.jsx */ "./src/lib/libraries/extensions/index.jsx");
|
||
/* harmony import */ var _custom_procedures_jsx__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./custom-procedures.jsx */ "./src/containers/custom-procedures.jsx");
|
||
/* harmony import */ var _lib_error_boundary_hoc_jsx__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../lib/error-boundary-hoc.jsx */ "./src/lib/error-boundary-hoc.jsx");
|
||
/* harmony import */ var _lib_layout_constants__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../lib/layout-constants */ "./src/lib/layout-constants.js");
|
||
/* harmony import */ var _lib_drop_area_hoc_jsx__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../lib/drop-area-hoc.jsx */ "./src/lib/drop-area-hoc.jsx");
|
||
/* harmony import */ var _lib_drag_constants__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../lib/drag-constants */ "./src/lib/drag-constants.js");
|
||
/* harmony import */ var _lib_define_dynamic_block__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../lib/define-dynamic-block */ "./src/lib/define-dynamic-block.js");
|
||
/* harmony import */ var _addons_hooks__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../addons/hooks */ "./src/addons/hooks.js");
|
||
/* harmony import */ var _lib_tw_load_scratch_blocks_hoc_jsx__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../lib/tw-load-scratch-blocks-hoc.jsx */ "./src/lib/tw-load-scratch-blocks-hoc.jsx");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_toolbox__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../reducers/toolbox */ "./src/reducers/toolbox.js");
|
||
/* harmony import */ var _reducers_color_picker__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../reducers/color-picker */ "./src/reducers/color-picker.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _reducers_custom_procedures__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../reducers/custom-procedures */ "./src/reducers/custom-procedures.js");
|
||
/* harmony import */ var _reducers_connection_modal__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../reducers/connection-modal */ "./src/reducers/connection-modal.js");
|
||
/* harmony import */ var _reducers_workspace_metrics__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../reducers/workspace-metrics */ "./src/reducers/workspace-metrics.js");
|
||
/* harmony import */ var _reducers_editor_tab__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../reducers/editor-tab */ "./src/reducers/editor-tab.js");
|
||
const _excluded = ["anyModalVisible", "canUseCloud", "customStageSize", "customProceduresVisible", "extensionLibraryVisible", "options", "stageSize", "vm", "isRtl", "isVisible", "onActivateColorPicker", "onOpenConnectionModal", "onOpenSoundRecorder", "onOpenCustomExtensionModal", "updateToolboxState", "onActivateCustomProcedures", "onRequestCloseExtensionLibrary", "onRequestCloseCustomProcedures", "toolboxXML", "updateMetrics", "workspaceMetrics"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// TW: Strings we add to scratch-blocks are localized here
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_6__["defineMessages"])({
|
||
PROCEDURES_RETURN: {
|
||
"id": "tw.blocks.PROCEDURES_RETURN",
|
||
"defaultMessage": "return {v}"
|
||
},
|
||
PROCEDURES_TO_REPORTER: {
|
||
"id": "tw.blocks.PROCEDURES_TO_REPORTER",
|
||
"defaultMessage": "Change To Reporter"
|
||
},
|
||
PROCEDURES_TO_STATEMENT: {
|
||
"id": "tw.blocks.PROCEDURES_TO_STATEMENT",
|
||
"defaultMessage": "Change To Statement"
|
||
},
|
||
PROCEDURES_DOCS: {
|
||
"id": "tw.blocks.PROCEDURES_DOCS",
|
||
"defaultMessage": "How to use return"
|
||
}
|
||
});
|
||
|
||
const addFunctionListener = (object, property, callback) => {
|
||
const oldFn = object[property];
|
||
|
||
object[property] = function (...args) {
|
||
const result = oldFn.apply(this, args);
|
||
callback.apply(this, result);
|
||
return result;
|
||
};
|
||
};
|
||
|
||
const DroppableBlocks = Object(_lib_drop_area_hoc_jsx__WEBPACK_IMPORTED_MODULE_17__["default"])([_lib_drag_constants__WEBPACK_IMPORTED_MODULE_18__["default"].BACKPACK_CODE])(_components_blocks_blocks_jsx__WEBPACK_IMPORTED_MODULE_11__["default"]);
|
||
|
||
class Blocks extends react__WEBPACK_IMPORTED_MODULE_5___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
this.ScratchBlocks = Object(_lib_blocks__WEBPACK_IMPORTED_MODULE_7__["default"])(props.vm);
|
||
window.ScratchBlocks = this.ScratchBlocks;
|
||
_addons_hooks__WEBPACK_IMPORTED_MODULE_20__["default"].blockly = this.ScratchBlocks;
|
||
_addons_hooks__WEBPACK_IMPORTED_MODULE_20__["default"].blocklyCallbacks.forEach(i => i());
|
||
_addons_hooks__WEBPACK_IMPORTED_MODULE_20__["default"].blocklyCallbacks.length = 0;
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['attachVM', 'detachVM', 'getToolboxXML', 'handleCategorySelected', 'handleConnectionModalStart', 'handleDrop', 'handleStatusButtonUpdate', 'handleOpenSoundRecorder', 'handlePromptStart', 'handlePromptCallback', 'handlePromptClose', 'handleCustomProceduresClose', 'onScriptGlowOn', 'onScriptGlowOff', 'onBlockGlowOn', 'onBlockGlowOff', 'handleMonitorsUpdate', 'handleExtensionAdded', 'handleBlocksInfoUpdate', 'onTargetsUpdate', 'onVisualReport', 'onWorkspaceUpdate', 'onWorkspaceMetricsChange', 'setBlocks', 'setLocale', 'handleEnableProcedureReturns']);
|
||
this.ScratchBlocks.prompt = this.handlePromptStart;
|
||
this.ScratchBlocks.statusButtonCallback = this.handleConnectionModalStart;
|
||
this.ScratchBlocks.recordSoundCallback = this.handleOpenSoundRecorder;
|
||
this.state = {
|
||
prompt: null
|
||
};
|
||
this.onTargetsUpdate = lodash_debounce__WEBPACK_IMPORTED_MODULE_1___default()(this.onTargetsUpdate, 100);
|
||
this.toolboxUpdateQueue = [];
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.props.vm.setCompilerOptions({
|
||
warpTimer: true
|
||
});
|
||
this.props.vm.setInEditor(false);
|
||
this.ScratchBlocks.FieldColourSlider.activateEyedropper_ = this.props.onActivateColorPicker;
|
||
this.ScratchBlocks.Procedures.externalProcedureDefCallback = this.props.onActivateCustomProcedures;
|
||
this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale);
|
||
const Msg = this.ScratchBlocks.Msg;
|
||
Msg.PROCEDURES_RETURN = this.props.intl.formatMessage(messages.PROCEDURES_RETURN, {
|
||
v: '%1'
|
||
});
|
||
Msg.PROCEDURES_TO_REPORTER = this.props.intl.formatMessage(messages.PROCEDURES_TO_REPORTER);
|
||
Msg.PROCEDURES_TO_STATEMENT = this.props.intl.formatMessage(messages.PROCEDURES_TO_STATEMENT);
|
||
Msg.PROCEDURES_DOCS = this.props.intl.formatMessage(messages.PROCEDURES_DOCS);
|
||
const workspaceConfig = lodash_defaultsdeep__WEBPACK_IMPORTED_MODULE_2___default()({}, Blocks.defaultOptions, this.props.options, {
|
||
rtl: this.props.isRtl,
|
||
toolbox: this.props.toolboxXML
|
||
});
|
||
this.workspace = this.ScratchBlocks.inject(this.blocks, workspaceConfig); // Register buttons under new callback keys for creating variables,
|
||
// lists, and procedures from extensions.
|
||
|
||
const toolboxWorkspace = this.workspace.getFlyout().getWorkspace();
|
||
|
||
const varListButtonCallback = type => () => this.ScratchBlocks.Variables.createVariable(this.workspace, null, type);
|
||
|
||
const procButtonCallback = () => {
|
||
this.ScratchBlocks.Procedures.createProcedureDefCallback_(this.workspace);
|
||
};
|
||
|
||
toolboxWorkspace.registerButtonCallback('MAKE_A_VARIABLE', varListButtonCallback(''));
|
||
toolboxWorkspace.registerButtonCallback('MAKE_A_LIST', varListButtonCallback('list'));
|
||
toolboxWorkspace.registerButtonCallback('MAKE_A_PROCEDURE', procButtonCallback);
|
||
toolboxWorkspace.registerButtonCallback('EXTENSION_CALLBACK', block => {
|
||
this.props.vm.handleExtensionButtonPress(block.callbackData_);
|
||
});
|
||
toolboxWorkspace.registerButtonCallback('OPEN_EXTENSION_DOCS', block => {
|
||
const docsURI = block.callbackData_;
|
||
const url = new URL(docsURI);
|
||
|
||
if (url.protocol === 'http:' || url.protocol === 'https:') {
|
||
window.open(docsURI, '_blank');
|
||
}
|
||
});
|
||
toolboxWorkspace.registerButtonCallback('OPEN_RETURN_DOCS', () => {
|
||
window.open('https://docs.turbowarp.org/return', '_blank');
|
||
}); // Store the xml of the toolbox that is actually rendered.
|
||
// This is used in componentDidUpdate instead of prevProps, because
|
||
// the xml can change while e.g. on the costumes tab.
|
||
|
||
this._renderedToolboxXML = this.props.toolboxXML; // we actually never want the workspace to enable "refresh toolbox" - this basically re-renders the
|
||
// entire toolbox every time we reset the workspace. We call updateToolbox as a part of
|
||
// componentDidUpdate so the toolbox will still correctly be updated
|
||
|
||
this.setToolboxRefreshEnabled = this.workspace.setToolboxRefreshEnabled.bind(this.workspace);
|
||
|
||
this.workspace.setToolboxRefreshEnabled = () => {
|
||
this.setToolboxRefreshEnabled(false);
|
||
}; // @todo change this when blockly supports UI events
|
||
|
||
|
||
addFunctionListener(this.workspace, 'translate', this.onWorkspaceMetricsChange);
|
||
addFunctionListener(this.workspace, 'zoom', this.onWorkspaceMetricsChange);
|
||
this.attachVM(); // Only update blocks/vm locale when visible to avoid sizing issues
|
||
// If locale changes while not visible it will get handled in didUpdate
|
||
|
||
if (this.props.isVisible) {
|
||
this.setLocale();
|
||
} // tw: Handle when extensions are added when Blocks isn't mounted
|
||
|
||
|
||
for (const category of this.props.vm.runtime._blockInfo) {
|
||
this.handleExtensionAdded(category);
|
||
}
|
||
}
|
||
|
||
shouldComponentUpdate(nextProps, nextState) {
|
||
return this.state.prompt !== nextState.prompt || this.props.isVisible !== nextProps.isVisible || this._renderedToolboxXML !== nextProps.toolboxXML || this.props.extensionLibraryVisible !== nextProps.extensionLibraryVisible || this.props.customProceduresVisible !== nextProps.customProceduresVisible || this.props.locale !== nextProps.locale || this.props.anyModalVisible !== nextProps.anyModalVisible || this.props.stageSize !== nextProps.stageSize || this.props.customStageSize !== nextProps.customStageSize;
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
// If any modals are open, call hideChaff to close z-indexed field editors
|
||
if (this.props.anyModalVisible && !prevProps.anyModalVisible) {
|
||
this.ScratchBlocks.hideChaff();
|
||
} // Only rerender the toolbox when the blocks are visible and the xml is
|
||
// different from the previously rendered toolbox xml.
|
||
// Do not check against prevProps.toolboxXML because that may not have been rendered.
|
||
|
||
|
||
if (this.props.isVisible && this.props.toolboxXML !== this._renderedToolboxXML) {
|
||
this.requestToolboxUpdate();
|
||
}
|
||
|
||
if (this.props.isVisible === prevProps.isVisible) {
|
||
if (this.props.stageSize !== prevProps.stageSize || this.props.customStageSize !== prevProps.customStageSize) {
|
||
// force workspace to redraw for the new stage size
|
||
window.dispatchEvent(new Event('resize'));
|
||
}
|
||
|
||
return;
|
||
} // @todo hack to resize blockly manually in case resize happened while hidden
|
||
// @todo hack to reload the workspace due to gui bug #413
|
||
|
||
|
||
if (this.props.isVisible) {
|
||
// Scripts tab
|
||
this.workspace.setVisible(true);
|
||
|
||
if (prevProps.locale !== this.props.locale || this.props.locale !== this.props.vm.getLocale()) {
|
||
// call setLocale if the locale has changed, or changed while the blocks were hidden.
|
||
// vm.getLocale() will be out of sync if locale was changed while not visible
|
||
this.setLocale();
|
||
} else {
|
||
this.props.vm.refreshWorkspace();
|
||
this.requestToolboxUpdate();
|
||
}
|
||
|
||
window.dispatchEvent(new Event('resize'));
|
||
} else {
|
||
this.workspace.setVisible(false);
|
||
}
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.detachVM();
|
||
this.workspace.dispose();
|
||
clearTimeout(this.toolboxUpdateTimeout);
|
||
this.props.vm.setInEditor(false);
|
||
}
|
||
|
||
requestToolboxUpdate() {
|
||
clearTimeout(this.toolboxUpdateTimeout);
|
||
this.toolboxUpdateTimeout = setTimeout(() => {
|
||
this.updateToolbox();
|
||
}, 0);
|
||
}
|
||
|
||
setLocale() {
|
||
this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale);
|
||
this.props.vm.setLocale(this.props.locale, this.props.messages).then(() => {
|
||
this.workspace.getFlyout().setRecyclingEnabled(false);
|
||
this.props.vm.refreshWorkspace();
|
||
this.requestToolboxUpdate();
|
||
this.withToolboxUpdates(() => {
|
||
this.workspace.getFlyout().setRecyclingEnabled(true);
|
||
});
|
||
});
|
||
}
|
||
|
||
updateToolbox() {
|
||
this.toolboxUpdateTimeout = false;
|
||
const categoryId = this.workspace.toolbox_.getSelectedCategoryId();
|
||
const offset = this.workspace.toolbox_.getCategoryScrollOffset();
|
||
this.workspace.updateToolbox(this.props.toolboxXML);
|
||
this._renderedToolboxXML = this.props.toolboxXML; // In order to catch any changes that mutate the toolbox during "normal runtime"
|
||
// (variable changes/etc), re-enable toolbox refresh.
|
||
// Using the setter function will rerender the entire toolbox which we just rendered.
|
||
|
||
this.workspace.toolboxRefreshEnabled_ = true;
|
||
const currentCategoryPos = this.workspace.toolbox_.getCategoryPositionById(categoryId);
|
||
const currentCategoryLen = this.workspace.toolbox_.getCategoryLengthById(categoryId);
|
||
|
||
if (offset < currentCategoryLen) {
|
||
this.workspace.toolbox_.setFlyoutScrollPos(currentCategoryPos + offset);
|
||
} else {
|
||
this.workspace.toolbox_.setFlyoutScrollPos(currentCategoryPos);
|
||
}
|
||
|
||
const queue = this.toolboxUpdateQueue;
|
||
this.toolboxUpdateQueue = [];
|
||
queue.forEach(fn => fn());
|
||
}
|
||
|
||
withToolboxUpdates(fn) {
|
||
// if there is a queued toolbox update, we need to wait
|
||
if (this.toolboxUpdateTimeout) {
|
||
this.toolboxUpdateQueue.push(fn);
|
||
} else {
|
||
fn();
|
||
}
|
||
}
|
||
|
||
attachVM() {
|
||
this.workspace.addChangeListener(this.props.vm.blockListener);
|
||
this.flyoutWorkspace = this.workspace.getFlyout().getWorkspace();
|
||
this.flyoutWorkspace.addChangeListener(this.props.vm.flyoutBlockListener);
|
||
this.flyoutWorkspace.addChangeListener(this.props.vm.monitorBlockListener);
|
||
this.props.vm.addListener('SCRIPT_GLOW_ON', this.onScriptGlowOn);
|
||
this.props.vm.addListener('SCRIPT_GLOW_OFF', this.onScriptGlowOff);
|
||
this.props.vm.addListener('BLOCK_GLOW_ON', this.onBlockGlowOn);
|
||
this.props.vm.addListener('BLOCK_GLOW_OFF', this.onBlockGlowOff);
|
||
this.props.vm.addListener('VISUAL_REPORT', this.onVisualReport);
|
||
this.props.vm.addListener('workspaceUpdate', this.onWorkspaceUpdate);
|
||
this.props.vm.addListener('targetsUpdate', this.onTargetsUpdate);
|
||
this.props.vm.addListener('MONITORS_UPDATE', this.handleMonitorsUpdate);
|
||
this.props.vm.addListener('EXTENSION_ADDED', this.handleExtensionAdded);
|
||
this.props.vm.addListener('BLOCKSINFO_UPDATE', this.handleBlocksInfoUpdate);
|
||
this.props.vm.addListener('PERIPHERAL_CONNECTED', this.handleStatusButtonUpdate);
|
||
this.props.vm.addListener('PERIPHERAL_DISCONNECTED', this.handleStatusButtonUpdate);
|
||
}
|
||
|
||
detachVM() {
|
||
this.props.vm.removeListener('SCRIPT_GLOW_ON', this.onScriptGlowOn);
|
||
this.props.vm.removeListener('SCRIPT_GLOW_OFF', this.onScriptGlowOff);
|
||
this.props.vm.removeListener('BLOCK_GLOW_ON', this.onBlockGlowOn);
|
||
this.props.vm.removeListener('BLOCK_GLOW_OFF', this.onBlockGlowOff);
|
||
this.props.vm.removeListener('VISUAL_REPORT', this.onVisualReport);
|
||
this.props.vm.removeListener('workspaceUpdate', this.onWorkspaceUpdate);
|
||
this.props.vm.removeListener('targetsUpdate', this.onTargetsUpdate);
|
||
this.props.vm.removeListener('MONITORS_UPDATE', this.handleMonitorsUpdate);
|
||
this.props.vm.removeListener('EXTENSION_ADDED', this.handleExtensionAdded);
|
||
this.props.vm.removeListener('BLOCKSINFO_UPDATE', this.handleBlocksInfoUpdate);
|
||
this.props.vm.removeListener('PERIPHERAL_CONNECTED', this.handleStatusButtonUpdate);
|
||
this.props.vm.removeListener('PERIPHERAL_DISCONNECTED', this.handleStatusButtonUpdate);
|
||
}
|
||
|
||
updateToolboxBlockValue(id, value) {
|
||
this.withToolboxUpdates(() => {
|
||
const block = this.workspace.getFlyout().getWorkspace().getBlockById(id);
|
||
|
||
if (block) {
|
||
block.inputList[0].fieldRow[0].setValue(value);
|
||
}
|
||
});
|
||
}
|
||
|
||
onTargetsUpdate() {
|
||
if (this.props.vm.editingTarget && this.workspace.getFlyout()) {
|
||
['glide', 'move', 'set'].forEach(prefix => {
|
||
this.updateToolboxBlockValue("".concat(prefix, "x"), Math.round(this.props.vm.editingTarget.x).toString());
|
||
this.updateToolboxBlockValue("".concat(prefix, "y"), Math.round(this.props.vm.editingTarget.y).toString());
|
||
});
|
||
}
|
||
}
|
||
|
||
onWorkspaceMetricsChange() {
|
||
const target = this.props.vm.editingTarget;
|
||
|
||
if (target && target.id) {
|
||
// Dispatch updateMetrics later, since onWorkspaceMetricsChange may be (very indirectly)
|
||
// called from a reducer, i.e. when you create a custom procedure.
|
||
// TODO: Is this a vehement hack?
|
||
setTimeout(() => {
|
||
this.props.updateMetrics({
|
||
targetID: target.id,
|
||
scrollX: this.workspace.scrollX,
|
||
scrollY: this.workspace.scrollY,
|
||
scale: this.workspace.scale
|
||
});
|
||
}, 0);
|
||
}
|
||
}
|
||
|
||
onScriptGlowOn(data) {
|
||
this.workspace.glowStack(data.id, true);
|
||
}
|
||
|
||
onScriptGlowOff(data) {
|
||
this.workspace.glowStack(data.id, false);
|
||
}
|
||
|
||
onBlockGlowOn(data) {
|
||
this.workspace.glowBlock(data.id, true);
|
||
}
|
||
|
||
onBlockGlowOff(data) {
|
||
this.workspace.glowBlock(data.id, false);
|
||
}
|
||
|
||
onVisualReport(data) {
|
||
this.workspace.reportValue(data.id, data.value);
|
||
}
|
||
|
||
getToolboxXML() {
|
||
// Use try/catch because this requires digging pretty deep into the VM
|
||
// Code inside intentionally ignores several error situations (no stage, etc.)
|
||
// Because they would get caught by this try/catch
|
||
try {
|
||
let {
|
||
editingTarget: target,
|
||
runtime
|
||
} = this.props.vm;
|
||
const stage = runtime.getTargetForStage();
|
||
if (!target) target = stage; // If no editingTarget, use the stage
|
||
|
||
const stageCostumes = stage.getCostumes();
|
||
const targetCostumes = target.getCostumes();
|
||
const targetSounds = target.getSounds();
|
||
const dynamicBlocksXML = this.props.vm.runtime.getBlocksXML(target);
|
||
return Object(_lib_make_toolbox_xml__WEBPACK_IMPORTED_MODULE_3__["default"])(false, target.isStage, target.id, dynamicBlocksXML, targetCostumes[targetCostumes.length - 1].name, stageCostumes[stageCostumes.length - 1].name, targetSounds.length > 0 ? targetSounds[targetSounds.length - 1].name : '');
|
||
} catch (_unused) {
|
||
return null;
|
||
}
|
||
}
|
||
|
||
onWorkspaceUpdate(data) {
|
||
// When we change sprites, update the toolbox to have the new sprite's blocks
|
||
const toolboxXML = this.getToolboxXML();
|
||
|
||
if (toolboxXML) {
|
||
this.props.updateToolboxState(toolboxXML);
|
||
}
|
||
|
||
if (this.props.vm.editingTarget && !this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]) {
|
||
this.onWorkspaceMetricsChange();
|
||
} // Remove and reattach the workspace listener (but allow flyout events)
|
||
|
||
|
||
this.workspace.removeChangeListener(this.props.vm.blockListener);
|
||
const dom = this.ScratchBlocks.Xml.textToDom(data.xml);
|
||
|
||
try {
|
||
this.ScratchBlocks.Xml.clearWorkspaceAndLoadFromXml(dom, this.workspace);
|
||
} catch (error) {
|
||
// The workspace is likely incomplete. What did update should be
|
||
// functional.
|
||
//
|
||
// Instead of throwing the error, by logging it and continuing as
|
||
// normal lets the other workspace update processes complete in the
|
||
// gui and vm, which lets the vm run even if the workspace is
|
||
// incomplete. Throwing the error would keep things like setting the
|
||
// correct editing target from happening which can interfere with
|
||
// some blocks and processes in the vm.
|
||
if (error.message) {
|
||
error.message = "Workspace Update Error: ".concat(error.message);
|
||
}
|
||
|
||
_lib_log_js__WEBPACK_IMPORTED_MODULE_9__["default"].error(error);
|
||
}
|
||
|
||
this.workspace.addChangeListener(this.props.vm.blockListener);
|
||
|
||
if (this.props.vm.editingTarget && this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]) {
|
||
const {
|
||
scrollX,
|
||
scrollY,
|
||
scale
|
||
} = this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id];
|
||
this.workspace.scrollX = scrollX;
|
||
this.workspace.scrollY = scrollY;
|
||
this.workspace.scale = scale;
|
||
this.workspace.resize();
|
||
} // Clear the undo state of the workspace since this is a
|
||
// fresh workspace and we don't want any changes made to another sprites
|
||
// workspace to be 'undone' here.
|
||
|
||
|
||
this.workspace.clearUndo();
|
||
}
|
||
|
||
handleMonitorsUpdate(monitors) {
|
||
// Update the checkboxes of the relevant monitors.
|
||
// TODO: What about monitors that have fields? See todo in scratch-vm blocks.js changeBlock:
|
||
// https://github.com/LLK/scratch-vm/blob/2373f9483edaf705f11d62662f7bb2a57fbb5e28/src/engine/blocks.js#L569-L576
|
||
const flyout = this.workspace.getFlyout();
|
||
|
||
for (const monitor of monitors.values()) {
|
||
const blockId = monitor.get('id');
|
||
const isVisible = monitor.get('visible');
|
||
flyout.setCheckboxState(blockId, isVisible); // We also need to update the isMonitored flag for this block on the VM, since it's used to determine
|
||
// whether the checkbox is activated or not when the checkbox is re-displayed (e.g. local variables/blocks
|
||
// when switching between sprites).
|
||
|
||
const block = this.props.vm.runtime.monitorBlocks.getBlock(blockId);
|
||
|
||
if (block) {
|
||
block.isMonitored = isVisible;
|
||
}
|
||
}
|
||
}
|
||
|
||
handleExtensionAdded(categoryInfo) {
|
||
const defineBlocks = blockInfoArray => {
|
||
if (blockInfoArray && blockInfoArray.length > 0) {
|
||
const staticBlocksJson = [];
|
||
const dynamicBlocksInfo = [];
|
||
blockInfoArray.forEach(blockInfo => {
|
||
if (blockInfo.info && blockInfo.info.isDynamic) {
|
||
dynamicBlocksInfo.push(blockInfo);
|
||
} else if (blockInfo.json) {
|
||
staticBlocksJson.push(blockInfo.json);
|
||
} // otherwise it's a non-block entry such as '---'
|
||
|
||
});
|
||
this.ScratchBlocks.defineBlocksWithJsonArray(staticBlocksJson);
|
||
dynamicBlocksInfo.forEach(blockInfo => {
|
||
// This is creating the block factory / constructor -- NOT a specific instance of the block.
|
||
// The factory should only know static info about the block: the category info and the opcode.
|
||
// Anything else will be picked up from the XML attached to the block instance.
|
||
const extendedOpcode = "".concat(categoryInfo.id, "_").concat(blockInfo.info.opcode);
|
||
const blockDefinition = Object(_lib_define_dynamic_block__WEBPACK_IMPORTED_MODULE_19__["default"])(this.ScratchBlocks, categoryInfo, blockInfo, extendedOpcode);
|
||
this.ScratchBlocks.Blocks[extendedOpcode] = blockDefinition;
|
||
});
|
||
}
|
||
}; // scratch-blocks implements a menu or custom field as a special kind of block ("shadow" block)
|
||
// these actually define blocks and MUST run regardless of the UI state
|
||
|
||
|
||
defineBlocks(Object.getOwnPropertyNames(categoryInfo.customFieldTypes).map(fieldTypeName => categoryInfo.customFieldTypes[fieldTypeName].scratchBlocksDefinition));
|
||
defineBlocks(categoryInfo.menus);
|
||
defineBlocks(categoryInfo.blocks); // Update the toolbox with new blocks if possible
|
||
|
||
const toolboxXML = this.getToolboxXML();
|
||
|
||
if (toolboxXML) {
|
||
this.props.updateToolboxState(toolboxXML);
|
||
}
|
||
}
|
||
|
||
handleBlocksInfoUpdate(categoryInfo) {
|
||
// @todo Later we should replace this to avoid all the warnings from redefining blocks.
|
||
this.handleExtensionAdded(categoryInfo);
|
||
}
|
||
|
||
handleCategorySelected(categoryId) {
|
||
const extension = _lib_libraries_extensions_index_jsx__WEBPACK_IMPORTED_MODULE_13__["default"].find(ext => ext.extensionId === categoryId);
|
||
|
||
if (extension && extension.launchPeripheralConnectionFlow) {
|
||
this.handleConnectionModalStart(categoryId);
|
||
}
|
||
|
||
this.withToolboxUpdates(() => {
|
||
this.workspace.toolbox_.setSelectedCategoryById(categoryId);
|
||
});
|
||
}
|
||
|
||
setBlocks(blocks) {
|
||
this.blocks = blocks;
|
||
}
|
||
|
||
handlePromptStart(message, defaultValue, callback, optTitle, optVarType) {
|
||
const p = {
|
||
prompt: {
|
||
callback,
|
||
message,
|
||
defaultValue
|
||
}
|
||
};
|
||
p.prompt.title = optTitle ? optTitle : this.ScratchBlocks.Msg.VARIABLE_MODAL_TITLE;
|
||
p.prompt.varType = typeof optVarType === 'string' ? optVarType : this.ScratchBlocks.SCALAR_VARIABLE_TYPE;
|
||
p.prompt.showVariableOptions = // This flag means that we should show variable/list options about scope
|
||
optVarType !== this.ScratchBlocks.BROADCAST_MESSAGE_VARIABLE_TYPE && p.prompt.title !== this.ScratchBlocks.Msg.RENAME_VARIABLE_MODAL_TITLE && p.prompt.title !== this.ScratchBlocks.Msg.RENAME_LIST_MODAL_TITLE;
|
||
p.prompt.showCloudOption = optVarType === this.ScratchBlocks.SCALAR_VARIABLE_TYPE && this.props.canUseCloud;
|
||
this.setState(p);
|
||
}
|
||
|
||
handleConnectionModalStart(extensionId) {
|
||
this.props.onOpenConnectionModal(extensionId);
|
||
}
|
||
|
||
handleStatusButtonUpdate() {
|
||
this.ScratchBlocks.refreshStatusButtons(this.workspace);
|
||
}
|
||
|
||
handleOpenSoundRecorder() {
|
||
this.props.onOpenSoundRecorder();
|
||
}
|
||
/*
|
||
* Pass along information about proposed name and variable options (scope and isCloud)
|
||
* and additional potentially conflicting variable names from the VM
|
||
* to the variable validation prompt callback used in scratch-blocks.
|
||
*/
|
||
|
||
|
||
handlePromptCallback(input, variableOptions) {
|
||
this.state.prompt.callback(input, this.props.vm.runtime.getAllVarNamesOfType(this.state.prompt.varType), variableOptions);
|
||
this.handlePromptClose();
|
||
}
|
||
|
||
handlePromptClose() {
|
||
this.setState({
|
||
prompt: null
|
||
});
|
||
}
|
||
|
||
handleCustomProceduresClose(data) {
|
||
this.props.onRequestCloseCustomProcedures(data);
|
||
const ws = this.workspace;
|
||
ws.refreshToolboxSelection_();
|
||
ws.toolbox_.scrollToCategoryById('myBlocks');
|
||
}
|
||
|
||
handleDrop(dragInfo) {
|
||
fetch(dragInfo.payload.bodyUrl).then(response => response.json()).then(blocks => this.props.vm.shareBlocksToTarget(blocks, this.props.vm.editingTarget.id)).then(() => {
|
||
this.props.vm.refreshWorkspace();
|
||
this.updateToolbox(); // To show new variables/custom blocks
|
||
});
|
||
}
|
||
|
||
handleEnableProcedureReturns() {
|
||
this.workspace.enableProcedureReturns();
|
||
this.requestToolboxUpdate();
|
||
}
|
||
|
||
render() {
|
||
/* eslint-disable no-unused-vars */
|
||
const _this$props = this.props,
|
||
{
|
||
anyModalVisible,
|
||
canUseCloud,
|
||
customStageSize,
|
||
customProceduresVisible,
|
||
extensionLibraryVisible,
|
||
options,
|
||
stageSize,
|
||
vm,
|
||
isRtl,
|
||
isVisible,
|
||
onActivateColorPicker,
|
||
onOpenConnectionModal,
|
||
onOpenSoundRecorder,
|
||
onOpenCustomExtensionModal,
|
||
updateToolboxState,
|
||
onActivateCustomProcedures,
|
||
onRequestCloseExtensionLibrary,
|
||
onRequestCloseCustomProcedures,
|
||
toolboxXML,
|
||
updateMetrics: updateMetricsProp,
|
||
workspaceMetrics
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
/* eslint-enable no-unused-vars */
|
||
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_5___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(DroppableBlocks, _extends({
|
||
componentRef: this.setBlocks,
|
||
onDrop: this.handleDrop
|
||
}, props)), this.state.prompt ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_prompt_jsx__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
||
defaultValue: this.state.prompt.defaultValue,
|
||
isStage: vm.runtime.getEditingTarget().isStage,
|
||
showListMessage: this.state.prompt.varType === this.ScratchBlocks.LIST_VARIABLE_TYPE,
|
||
label: this.state.prompt.message,
|
||
showCloudOption: this.state.prompt.showCloudOption,
|
||
showVariableOptions: this.state.prompt.showVariableOptions,
|
||
title: this.state.prompt.title,
|
||
vm: vm,
|
||
onCancel: this.handlePromptClose,
|
||
onOk: this.handlePromptCallback
|
||
}) : null, extensionLibraryVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_extension_library_jsx__WEBPACK_IMPORTED_MODULE_12__["default"], {
|
||
vm: vm,
|
||
onCategorySelected: this.handleCategorySelected,
|
||
onEnableProcedureReturns: this.handleEnableProcedureReturns,
|
||
onRequestClose: onRequestCloseExtensionLibrary,
|
||
onOpenCustomExtensionModal: this.props.onOpenCustomExtensionModal
|
||
}) : null, customProceduresVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_custom_procedures_jsx__WEBPACK_IMPORTED_MODULE_14__["default"], {
|
||
options: {
|
||
media: options.media
|
||
},
|
||
onRequestClose: this.handleCustomProceduresClose
|
||
}) : null);
|
||
}
|
||
|
||
}
|
||
|
||
Blocks.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_6__["intlShape"],
|
||
anyModalVisible: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
canUseCloud: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
customStageSize: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number
|
||
}),
|
||
customProceduresVisible: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
extensionLibraryVisible: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
isVisible: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
locale: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string.isRequired,
|
||
messages: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.objectOf(prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string),
|
||
onActivateColorPicker: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onActivateCustomProcedures: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onOpenConnectionModal: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onOpenSoundRecorder: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onOpenCustomExtensionModal: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onRequestCloseCustomProcedures: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
onRequestCloseExtensionLibrary: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
options: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({
|
||
media: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
zoom: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({
|
||
controls: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
wheel: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
startScale: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number
|
||
}),
|
||
colours: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({
|
||
workspace: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
flyout: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
toolbox: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
toolboxSelected: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
scrollbar: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
scrollbarHover: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
insertionMarker: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
insertionMarkerOpacity: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,
|
||
fieldShadow: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
dragShadowOpacity: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number
|
||
}),
|
||
comments: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,
|
||
collapse: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool
|
||
}),
|
||
stageSize: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(Object.keys(_lib_layout_constants__WEBPACK_IMPORTED_MODULE_16__["STAGE_DISPLAY_SIZES"])).isRequired,
|
||
toolboxXML: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,
|
||
updateMetrics: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
updateToolboxState: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_8___default.a).isRequired,
|
||
workspaceMetrics: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({
|
||
targets: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.objectOf(prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object)
|
||
})
|
||
};
|
||
Blocks.defaultOptions = {
|
||
zoom: {
|
||
controls: true,
|
||
wheel: true,
|
||
startScale: _lib_layout_constants__WEBPACK_IMPORTED_MODULE_16__["BLOCKS_DEFAULT_SCALE"]
|
||
},
|
||
grid: {
|
||
spacing: 40,
|
||
length: 2,
|
||
colour: '#ddd'
|
||
},
|
||
colours: {
|
||
workspace: '#F9F9F9',
|
||
flyout: '#F9F9F9',
|
||
toolbox: '#FFFFFF',
|
||
toolboxSelected: '#E9EEF2',
|
||
scrollbar: '#CECDCE',
|
||
scrollbarHover: '#CECDCE',
|
||
insertionMarker: '#000000',
|
||
insertionMarkerOpacity: 0.2,
|
||
fieldShadow: 'rgba(255, 255, 255, 0.3)',
|
||
dragShadowOpacity: 0.6
|
||
},
|
||
comments: true,
|
||
collapse: false,
|
||
sounds: false
|
||
};
|
||
Blocks.defaultProps = {
|
||
isVisible: true,
|
||
options: Blocks.defaultOptions
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
anyModalVisible: Object.keys(state.scratchGui.modals).some(key => state.scratchGui.modals[key]) || state.scratchGui.mode.isFullScreen,
|
||
customStageSize: state.scratchGui.customStageSize,
|
||
extensionLibraryVisible: state.scratchGui.modals.extensionLibrary,
|
||
isRtl: state.locales.isRtl,
|
||
locale: state.locales.locale,
|
||
messages: state.locales.messages,
|
||
toolboxXML: state.scratchGui.toolbox.toolboxXML,
|
||
customProceduresVisible: state.scratchGui.customProcedures.active,
|
||
workspaceMetrics: state.scratchGui.workspaceMetrics
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onActivateColorPicker: callback => dispatch(Object(_reducers_color_picker__WEBPACK_IMPORTED_MODULE_24__["activateColorPicker"])(callback)),
|
||
onActivateCustomProcedures: (data, callback) => dispatch(Object(_reducers_custom_procedures__WEBPACK_IMPORTED_MODULE_26__["activateCustomProcedures"])(data, callback)),
|
||
onOpenConnectionModal: id => {
|
||
dispatch(Object(_reducers_connection_modal__WEBPACK_IMPORTED_MODULE_27__["setConnectionModalExtensionId"])(id));
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_25__["openConnectionModal"])());
|
||
},
|
||
onOpenSoundRecorder: () => {
|
||
dispatch(Object(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_29__["activateTab"])(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_29__["SOUNDS_TAB_INDEX"]));
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_25__["openSoundRecorder"])());
|
||
},
|
||
onOpenCustomExtensionModal: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_25__["openCustomExtensionModal"])()),
|
||
onRequestCloseExtensionLibrary: () => {
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_25__["closeExtensionLibrary"])());
|
||
},
|
||
onRequestCloseCustomProcedures: data => {
|
||
dispatch(Object(_reducers_custom_procedures__WEBPACK_IMPORTED_MODULE_26__["deactivateCustomProcedures"])(data));
|
||
},
|
||
updateToolboxState: toolboxXML => {
|
||
dispatch(Object(_reducers_toolbox__WEBPACK_IMPORTED_MODULE_23__["updateToolbox"])(toolboxXML));
|
||
},
|
||
updateMetrics: metrics => {
|
||
dispatch(Object(_reducers_workspace_metrics__WEBPACK_IMPORTED_MODULE_28__["updateMetrics"])(metrics));
|
||
}
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_6__["injectIntl"])(Object(_lib_error_boundary_hoc_jsx__WEBPACK_IMPORTED_MODULE_15__["default"])('Blocks')(Object(react_redux__WEBPACK_IMPORTED_MODULE_22__["connect"])(mapStateToProps, mapDispatchToProps)(Object(_lib_tw_load_scratch_blocks_hoc_jsx__WEBPACK_IMPORTED_MODULE_21__["default"])(Blocks)))));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/cards.jsx":
|
||
/*!**********************************!*\
|
||
!*** ./src/containers/cards.jsx ***!
|
||
\**********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _reducers_cards__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../reducers/cards */ "./src/reducers/cards.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _components_cards_cards_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/cards/cards.jsx */ "./src/components/cards/cards.jsx");
|
||
/* harmony import */ var _lib_libraries_decks_translate_image_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/libraries/decks/translate-image.js */ "./src/lib/libraries/decks/translate-image.js");
|
||
/* harmony import */ var _lib_isScratchDesktop__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/isScratchDesktop */ "./src/lib/isScratchDesktop.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class Cards extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
componentDidMount() {
|
||
if (this.props.locale !== 'en') {
|
||
Object(_lib_libraries_decks_translate_image_js__WEBPACK_IMPORTED_MODULE_6__["loadImageData"])(this.props.locale);
|
||
}
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
if (this.props.locale !== prevProps.locale) {
|
||
Object(_lib_libraries_decks_translate_image_js__WEBPACK_IMPORTED_MODULE_6__["loadImageData"])(this.props.locale);
|
||
}
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_cards_cards_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], this.props);
|
||
}
|
||
|
||
}
|
||
|
||
Cards.propTypes = {
|
||
locale: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
visible: state.scratchGui.cards.visible,
|
||
content: state.scratchGui.cards.content,
|
||
activeDeckId: state.scratchGui.cards.activeDeckId,
|
||
step: state.scratchGui.cards.step,
|
||
expanded: state.scratchGui.cards.expanded,
|
||
x: state.scratchGui.cards.x,
|
||
y: state.scratchGui.cards.y,
|
||
isRtl: state.locales.isRtl,
|
||
locale: state.locales.locale,
|
||
dragging: state.scratchGui.cards.dragging,
|
||
showVideos: Object(_lib_isScratchDesktop__WEBPACK_IMPORTED_MODULE_7__["notScratchDesktop"])()
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onActivateDeckFactory: id => () => dispatch(Object(_reducers_cards__WEBPACK_IMPORTED_MODULE_3__["activateDeck"])(id)),
|
||
onShowAll: () => {
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_4__["openTipsLibrary"])());
|
||
dispatch(Object(_reducers_cards__WEBPACK_IMPORTED_MODULE_3__["closeCards"])());
|
||
},
|
||
onCloseCards: () => dispatch(Object(_reducers_cards__WEBPACK_IMPORTED_MODULE_3__["closeCards"])()),
|
||
onShrinkExpandCards: () => dispatch(Object(_reducers_cards__WEBPACK_IMPORTED_MODULE_3__["shrinkExpandCards"])()),
|
||
onNextStep: () => dispatch(Object(_reducers_cards__WEBPACK_IMPORTED_MODULE_3__["nextStep"])()),
|
||
onPrevStep: () => dispatch(Object(_reducers_cards__WEBPACK_IMPORTED_MODULE_3__["prevStep"])()),
|
||
onDrag: (e_, data) => dispatch(Object(_reducers_cards__WEBPACK_IMPORTED_MODULE_3__["dragCard"])(data.x, data.y)),
|
||
onStartDrag: () => dispatch(Object(_reducers_cards__WEBPACK_IMPORTED_MODULE_3__["startDrag"])()),
|
||
onEndDrag: () => dispatch(Object(_reducers_cards__WEBPACK_IMPORTED_MODULE_3__["endDrag"])())
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_0__["connect"])(mapStateToProps, mapDispatchToProps)(Cards));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/connection-modal.jsx":
|
||
/*!*********************************************!*\
|
||
!*** ./src/containers/connection-modal.jsx ***!
|
||
\*********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_connection_modal_connection_modal_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/connection-modal/connection-modal.jsx */ "./src/components/connection-modal/connection-modal.jsx");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _lib_analytics__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/analytics */ "./src/lib/analytics.js");
|
||
/* harmony import */ var _lib_libraries_extensions_index_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/libraries/extensions/index.jsx */ "./src/lib/libraries/extensions/index.jsx");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class ConnectionModal extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleScanning', 'handleCancel', 'handleConnected', 'handleConnecting', 'handleDisconnect', 'handleError', 'handleHelp']);
|
||
this.state = {
|
||
extension: _lib_libraries_extensions_index_jsx__WEBPACK_IMPORTED_MODULE_6__["default"].find(ext => ext.extensionId === props.extensionId),
|
||
phase: props.vm.getPeripheralIsConnected(props.extensionId) ? _components_connection_modal_connection_modal_jsx__WEBPACK_IMPORTED_MODULE_3__["PHASES"].connected : _components_connection_modal_connection_modal_jsx__WEBPACK_IMPORTED_MODULE_3__["PHASES"].scanning
|
||
};
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.props.vm.on('PERIPHERAL_CONNECTED', this.handleConnected);
|
||
this.props.vm.on('PERIPHERAL_REQUEST_ERROR', this.handleError);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.props.vm.removeListener('PERIPHERAL_CONNECTED', this.handleConnected);
|
||
this.props.vm.removeListener('PERIPHERAL_REQUEST_ERROR', this.handleError);
|
||
}
|
||
|
||
handleScanning() {
|
||
this.setState({
|
||
phase: _components_connection_modal_connection_modal_jsx__WEBPACK_IMPORTED_MODULE_3__["PHASES"].scanning
|
||
});
|
||
}
|
||
|
||
handleConnecting(peripheralId) {
|
||
this.props.vm.connectPeripheral(this.props.extensionId, peripheralId);
|
||
this.setState({
|
||
phase: _components_connection_modal_connection_modal_jsx__WEBPACK_IMPORTED_MODULE_3__["PHASES"].connecting
|
||
});
|
||
_lib_analytics__WEBPACK_IMPORTED_MODULE_5__["default"].event({
|
||
category: 'extensions',
|
||
action: 'connecting',
|
||
label: this.props.extensionId
|
||
});
|
||
}
|
||
|
||
handleDisconnect() {
|
||
try {
|
||
this.props.vm.disconnectPeripheral(this.props.extensionId);
|
||
} finally {
|
||
this.props.onCancel();
|
||
}
|
||
}
|
||
|
||
handleCancel() {
|
||
try {
|
||
// If we're not connected to a peripheral, close the websocket so we stop scanning.
|
||
if (!this.props.vm.getPeripheralIsConnected(this.props.extensionId)) {
|
||
this.props.vm.disconnectPeripheral(this.props.extensionId);
|
||
}
|
||
} finally {
|
||
// Close the modal.
|
||
this.props.onCancel();
|
||
}
|
||
}
|
||
|
||
handleError() {
|
||
// Assume errors that come in during scanning phase are the result of not
|
||
// having scratch-link installed.
|
||
if (this.state.phase === _components_connection_modal_connection_modal_jsx__WEBPACK_IMPORTED_MODULE_3__["PHASES"].scanning || this.state.phase === _components_connection_modal_connection_modal_jsx__WEBPACK_IMPORTED_MODULE_3__["PHASES"].unavailable) {
|
||
this.setState({
|
||
phase: _components_connection_modal_connection_modal_jsx__WEBPACK_IMPORTED_MODULE_3__["PHASES"].unavailable
|
||
});
|
||
} else {
|
||
this.setState({
|
||
phase: _components_connection_modal_connection_modal_jsx__WEBPACK_IMPORTED_MODULE_3__["PHASES"].error
|
||
});
|
||
_lib_analytics__WEBPACK_IMPORTED_MODULE_5__["default"].event({
|
||
category: 'extensions',
|
||
action: 'connecting error',
|
||
label: this.props.extensionId
|
||
});
|
||
}
|
||
}
|
||
|
||
handleConnected() {
|
||
this.setState({
|
||
phase: _components_connection_modal_connection_modal_jsx__WEBPACK_IMPORTED_MODULE_3__["PHASES"].connected
|
||
});
|
||
_lib_analytics__WEBPACK_IMPORTED_MODULE_5__["default"].event({
|
||
category: 'extensions',
|
||
action: 'connected',
|
||
label: this.props.extensionId
|
||
});
|
||
}
|
||
|
||
handleHelp() {
|
||
window.open(this.state.extension.helpLink, '_blank');
|
||
_lib_analytics__WEBPACK_IMPORTED_MODULE_5__["default"].event({
|
||
category: 'extensions',
|
||
action: 'help',
|
||
label: this.props.extensionId
|
||
});
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_connection_modal_connection_modal_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
connectingMessage: this.state.extension && this.state.extension.connectingMessage,
|
||
connectionIconURL: this.state.extension && this.state.extension.connectionIconURL,
|
||
connectionSmallIconURL: this.state.extension && this.state.extension.connectionSmallIconURL,
|
||
connectionTipIconURL: this.state.extension && this.state.extension.connectionTipIconURL,
|
||
extensionId: this.props.extensionId,
|
||
name: this.state.extension && this.state.extension.name,
|
||
phase: this.state.phase,
|
||
title: this.props.extensionId,
|
||
useAutoScan: this.state.extension && this.state.extension.useAutoScan,
|
||
vm: this.props.vm,
|
||
onCancel: this.handleCancel,
|
||
onConnected: this.handleConnected,
|
||
onConnecting: this.handleConnecting,
|
||
onDisconnect: this.handleDisconnect,
|
||
onHelp: this.handleHelp,
|
||
onScanning: this.handleScanning
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
ConnectionModal.propTypes = {
|
||
extensionId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
onCancel: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a).isRequired
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
extensionId: state.scratchGui.connectionModal.extensionId
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onCancel: () => {
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_8__["closeConnectionModal"])());
|
||
}
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_7__["connect"])(mapStateToProps, mapDispatchToProps)(ConnectionModal));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/controls.jsx":
|
||
/*!*************************************!*\
|
||
!*** ./src/containers/controls.jsx ***!
|
||
\*************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _components_controls_controls_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/controls/controls.jsx */ "./src/components/controls/controls.jsx");
|
||
/* harmony import */ var _lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/layout-constants.js */ "./src/lib/layout-constants.js");
|
||
const _excluded = ["vm", "isStarted", "projectRunning", "turbo"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class Controls extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleGreenFlagClick', 'handleStopAllClick']);
|
||
}
|
||
|
||
handleGreenFlagClick(e) {
|
||
e.preventDefault(); // tw: implement alt+click and right click to toggle FPS
|
||
|
||
if (e.shiftKey || e.altKey || e.type === 'contextmenu') {
|
||
if (e.shiftKey) {
|
||
this.props.vm.setTurboMode(!this.props.turbo);
|
||
}
|
||
|
||
if (e.altKey || e.type === 'contextmenu') {
|
||
if (this.props.framerate === 30) {
|
||
this.props.vm.setFramerate(60);
|
||
} else {
|
||
this.props.vm.setFramerate(30);
|
||
}
|
||
}
|
||
} else {
|
||
if (!this.props.isStarted) {
|
||
this.props.vm.start();
|
||
}
|
||
|
||
this.props.vm.greenFlag();
|
||
}
|
||
}
|
||
|
||
handleStopAllClick(e) {
|
||
e.preventDefault();
|
||
this.props.vm.stopAll();
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
vm,
|
||
// eslint-disable-line no-unused-vars
|
||
isStarted,
|
||
// eslint-disable-line no-unused-vars
|
||
projectRunning,
|
||
turbo
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_controls_controls_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], _extends({}, props, {
|
||
active: projectRunning && isStarted,
|
||
turbo: turbo,
|
||
onGreenFlagClick: this.handleGreenFlagClick,
|
||
onStopAllClick: this.handleStopAllClick
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
Controls.propTypes = {
|
||
isStarted: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
projectRunning: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
turbo: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
framerate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,
|
||
interpolation: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
isSmall: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_3___default.a)
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
isStarted: state.scratchGui.vmStatus.started,
|
||
projectRunning: state.scratchGui.vmStatus.running,
|
||
framerate: state.scratchGui.tw.framerate,
|
||
interpolation: state.scratchGui.tw.interpolation,
|
||
turbo: state.scratchGui.vmStatus.turbo
|
||
}); // no-op function to prevent dispatch prop being passed to component
|
||
|
||
|
||
const mapDispatchToProps = () => ({});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_4__["connect"])(mapStateToProps, mapDispatchToProps)(Controls));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/costume-library.jsx":
|
||
/*!********************************************!*\
|
||
!*** ./src/containers/costume-library.jsx ***!
|
||
\********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/libraries/tw-async-libraries */ "./src/lib/libraries/tw-async-libraries.js");
|
||
/* harmony import */ var _lib_libraries_sprite_tags__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/libraries/sprite-tags */ "./src/lib/libraries/sprite-tags.js");
|
||
/* harmony import */ var _components_library_library_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/library/library.jsx */ "./src/components/library/library.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
libraryTitle: {
|
||
"id": "gui.costumeLibrary.chooseACostume",
|
||
"defaultMessage": "Choose a Costume"
|
||
}
|
||
});
|
||
|
||
class CostumeLibrary extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleItemSelected']);
|
||
}
|
||
|
||
handleItemSelected(item) {
|
||
const vmCostume = {
|
||
name: item.name,
|
||
rotationCenterX: item.rotationCenterX,
|
||
rotationCenterY: item.rotationCenterY,
|
||
bitmapResolution: item.bitmapResolution,
|
||
skinId: null
|
||
};
|
||
this.props.vm.addCostumeFromLibrary(item.md5ext, vmCostume);
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_library_library_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||
data: Object(_lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_5__["getCostumeLibrary"])(),
|
||
id: "costumeLibrary",
|
||
tags: _lib_libraries_sprite_tags__WEBPACK_IMPORTED_MODULE_6__["default"],
|
||
title: this.props.intl.formatMessage(messages.libraryTitle),
|
||
onItemSelected: this.handleItemSelected,
|
||
onRequestClose: this.props.onRequestClose
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
CostumeLibrary.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"].isRequired,
|
||
onRequestClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a).isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(CostumeLibrary));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/costume-tab.jsx":
|
||
/*!****************************************!*\
|
||
!*** ./src/containers/costume-tab.jsx ***!
|
||
\****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _components_asset_panel_asset_panel_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/asset-panel/asset-panel.jsx */ "./src/components/asset-panel/asset-panel.jsx");
|
||
/* harmony import */ var _paint_editor_wrapper_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./paint-editor-wrapper.jsx */ "./src/containers/paint-editor-wrapper.jsx");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _lib_file_uploader_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../lib/file-uploader.js */ "./src/lib/file-uploader.js");
|
||
/* harmony import */ var _lib_error_boundary_hoc_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../lib/error-boundary-hoc.jsx */ "./src/lib/error-boundary-hoc.jsx");
|
||
/* harmony import */ var _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../lib/drag-constants */ "./src/lib/drag-constants.js");
|
||
/* harmony import */ var _lib_empty_assets__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../lib/empty-assets */ "./src/lib/empty-assets.js");
|
||
/* harmony import */ var _lib_shared_messages__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../lib/shared-messages */ "./src/lib/shared-messages.js");
|
||
/* harmony import */ var _lib_download_blob__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../lib/download-blob */ "./src/lib/download-blob.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _reducers_editor_tab__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../reducers/editor-tab */ "./src/reducers/editor-tab.js");
|
||
/* harmony import */ var _reducers_restore_deletion__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../reducers/restore-deletion */ "./src/reducers/restore-deletion.js");
|
||
/* harmony import */ var _reducers_alerts__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../reducers/alerts */ "./src/reducers/alerts.js");
|
||
/* harmony import */ var _components_asset_panel_icon_add_backdrop_lib_svg__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../components/asset-panel/icon--add-backdrop-lib.svg */ "./src/components/asset-panel/icon--add-backdrop-lib.svg");
|
||
/* harmony import */ var _components_asset_panel_icon_add_backdrop_lib_svg__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(_components_asset_panel_icon_add_backdrop_lib_svg__WEBPACK_IMPORTED_MODULE_18__);
|
||
/* harmony import */ var _components_asset_panel_icon_add_costume_lib_svg__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../components/asset-panel/icon--add-costume-lib.svg */ "./src/components/asset-panel/icon--add-costume-lib.svg");
|
||
/* harmony import */ var _components_asset_panel_icon_add_costume_lib_svg__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(_components_asset_panel_icon_add_costume_lib_svg__WEBPACK_IMPORTED_MODULE_19__);
|
||
/* harmony import */ var _components_action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../components/action-menu/icon--file-upload.svg */ "./src/components/action-menu/icon--file-upload.svg");
|
||
/* harmony import */ var _components_action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(_components_action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_20__);
|
||
/* harmony import */ var _components_action_menu_icon_paint_svg__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../components/action-menu/icon--paint.svg */ "./src/components/action-menu/icon--paint.svg");
|
||
/* harmony import */ var _components_action_menu_icon_paint_svg__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(_components_action_menu_icon_paint_svg__WEBPACK_IMPORTED_MODULE_21__);
|
||
/* harmony import */ var _components_action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../components/action-menu/icon--surprise.svg */ "./src/components/action-menu/icon--surprise.svg");
|
||
/* harmony import */ var _components_action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(_components_action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_22__);
|
||
/* harmony import */ var _components_action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../components/action-menu/icon--search.svg */ "./src/components/action-menu/icon--search.svg");
|
||
/* harmony import */ var _components_action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(_components_action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_23__);
|
||
/* harmony import */ var _lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../lib/libraries/tw-async-libraries */ "./src/lib/libraries/tw-async-libraries.js");
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
let messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
addLibraryBackdropMsg: {
|
||
"id": "gui.costumeTab.addBackdropFromLibrary",
|
||
"defaultMessage": "Choose a Backdrop"
|
||
},
|
||
addLibraryCostumeMsg: {
|
||
"id": "gui.costumeTab.addCostumeFromLibrary",
|
||
"defaultMessage": "Choose a Costume"
|
||
},
|
||
addBlankCostumeMsg: {
|
||
"id": "gui.costumeTab.addBlankCostume",
|
||
"defaultMessage": "Paint"
|
||
},
|
||
addSurpriseCostumeMsg: {
|
||
"id": "gui.costumeTab.addSurpriseCostume",
|
||
"defaultMessage": "Surprise"
|
||
},
|
||
addFileBackdropMsg: {
|
||
"id": "gui.costumeTab.addFileBackdrop",
|
||
"defaultMessage": "Upload Backdrop"
|
||
},
|
||
addFileCostumeMsg: {
|
||
"id": "gui.costumeTab.addFileCostume",
|
||
"defaultMessage": "Upload Costume"
|
||
}
|
||
});
|
||
messages = _objectSpread(_objectSpread({}, messages), _lib_shared_messages__WEBPACK_IMPORTED_MODULE_12__["default"]);
|
||
|
||
class CostumeTab extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleSelectCostume', 'handleDeleteCostume', 'handleDuplicateCostume', 'handleExportCostume', 'handleNewCostume', 'handleNewBlankCostume', 'handleSurpriseCostume', 'handleSurpriseBackdrop', 'handleFileUploadClick', 'handleCostumeUpload', 'handleDrop', 'setFileInput']);
|
||
const {
|
||
editingTarget,
|
||
sprites,
|
||
stage
|
||
} = props;
|
||
const target = editingTarget && sprites[editingTarget] ? sprites[editingTarget] : stage;
|
||
|
||
if (target && target.currentCostume) {
|
||
this.state = {
|
||
selectedCostumeIndex: target.currentCostume
|
||
};
|
||
} else {
|
||
this.state = {
|
||
selectedCostumeIndex: 0
|
||
};
|
||
}
|
||
}
|
||
|
||
componentWillReceiveProps(nextProps) {
|
||
const {
|
||
editingTarget,
|
||
sprites,
|
||
stage
|
||
} = nextProps;
|
||
const target = editingTarget && sprites[editingTarget] ? sprites[editingTarget] : stage;
|
||
|
||
if (!target || !target.costumes) {
|
||
return;
|
||
}
|
||
|
||
if (this.props.editingTarget === editingTarget) {
|
||
// If costumes have been added or removed, change costumes to the editing target's
|
||
// current costume.
|
||
const oldTarget = this.props.sprites[editingTarget] ? this.props.sprites[editingTarget] : this.props.stage; // @todo: Find and switch to the index of the costume that is new. This is blocked by
|
||
// https://github.com/LLK/scratch-vm/issues/967
|
||
// Right now, you can land on the wrong costume if a costume changing script is running.
|
||
|
||
if (oldTarget.costumeCount !== target.costumeCount) {
|
||
this.setState({
|
||
selectedCostumeIndex: target.currentCostume
|
||
});
|
||
}
|
||
} else {
|
||
// If switching editing targets, update the costume index
|
||
this.setState({
|
||
selectedCostumeIndex: target.currentCostume
|
||
});
|
||
}
|
||
}
|
||
|
||
handleSelectCostume(costumeIndex) {
|
||
this.props.vm.editingTarget.setCostume(costumeIndex);
|
||
this.setState({
|
||
selectedCostumeIndex: costumeIndex
|
||
});
|
||
}
|
||
|
||
handleDeleteCostume(costumeIndex) {
|
||
const restoreCostumeFun = this.props.vm.deleteCostume(costumeIndex);
|
||
this.props.dispatchUpdateRestore({
|
||
restoreFun: restoreCostumeFun,
|
||
deletedItem: 'Costume'
|
||
});
|
||
}
|
||
|
||
handleDuplicateCostume(costumeIndex) {
|
||
this.props.vm.duplicateCostume(costumeIndex);
|
||
}
|
||
|
||
handleExportCostume(costumeIndex) {
|
||
const item = this.props.vm.editingTarget.sprite.costumes[costumeIndex];
|
||
const blob = new Blob([this.props.vm.getExportedCostume(item)], {
|
||
type: item.asset.assetType.contentType
|
||
});
|
||
Object(_lib_download_blob__WEBPACK_IMPORTED_MODULE_13__["default"])("".concat(item.name, ".").concat(item.asset.dataFormat), blob);
|
||
}
|
||
|
||
handleNewCostume(costume, fromCostumeLibrary, targetId) {
|
||
const costumes = Array.isArray(costume) ? costume : [costume];
|
||
return Promise.all(costumes.map(c => {
|
||
if (fromCostumeLibrary) {
|
||
return this.props.vm.addCostumeFromLibrary(c.md5, c);
|
||
} // If targetId is falsy, VM should default it to editingTarget.id
|
||
// However, targetId should be provided to prevent #5876,
|
||
// if making new costume takes a while
|
||
|
||
|
||
return this.props.vm.addCostume(c.md5, c, targetId);
|
||
}));
|
||
}
|
||
|
||
handleNewBlankCostume() {
|
||
const name = this.props.vm.editingTarget.isStage ? this.props.intl.formatMessage(messages.backdrop, {
|
||
index: 1
|
||
}) : this.props.intl.formatMessage(messages.costume, {
|
||
index: 1
|
||
});
|
||
this.handleNewCostume(Object(_lib_empty_assets__WEBPACK_IMPORTED_MODULE_11__["emptyCostume"])(name));
|
||
}
|
||
|
||
async handleSurpriseCostume() {
|
||
const costumeLibraryContent = await Object(_lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_24__["getCostumeLibrary"])();
|
||
const item = costumeLibraryContent[Math.floor(Math.random() * costumeLibraryContent.length)];
|
||
const vmCostume = {
|
||
name: item.name,
|
||
md5: item.md5ext,
|
||
rotationCenterX: item.rotationCenterX,
|
||
rotationCenterY: item.rotationCenterY,
|
||
bitmapResolution: item.bitmapResolution,
|
||
skinId: null
|
||
};
|
||
this.handleNewCostume(vmCostume, true
|
||
/* fromCostumeLibrary */
|
||
);
|
||
}
|
||
|
||
async handleSurpriseBackdrop() {
|
||
const backdropLibraryContent = await Object(_lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_24__["getBackdropLibrary"])();
|
||
const item = backdropLibraryContent[Math.floor(Math.random() * backdropLibraryContent.length)];
|
||
const vmCostume = {
|
||
name: item.name,
|
||
md5: item.md5ext,
|
||
rotationCenterX: item.rotationCenterX,
|
||
rotationCenterY: item.rotationCenterY,
|
||
bitmapResolution: item.bitmapResolution,
|
||
skinId: null
|
||
};
|
||
this.handleNewCostume(vmCostume);
|
||
}
|
||
|
||
handleCostumeUpload(e) {
|
||
const vm = this.props.vm;
|
||
const targetId = this.props.vm.editingTarget.id;
|
||
this.props.onShowImporting();
|
||
Object(_lib_file_uploader_js__WEBPACK_IMPORTED_MODULE_8__["handleFileUpload"])(e.target, (buffer, fileType, fileName, fileIndex, fileCount) => {
|
||
Object(_lib_file_uploader_js__WEBPACK_IMPORTED_MODULE_8__["costumeUpload"])(buffer, fileType, vm, vmCostumes => {
|
||
vmCostumes.forEach((costume, i) => {
|
||
costume.name = "".concat(fileName).concat(i ? i + 1 : '');
|
||
});
|
||
this.handleNewCostume(vmCostumes, false, targetId).then(() => {
|
||
if (fileIndex === fileCount - 1) {
|
||
this.props.onCloseImporting();
|
||
}
|
||
});
|
||
}, this.props.onCloseImporting);
|
||
}, this.props.onCloseImporting);
|
||
}
|
||
|
||
handleFileUploadClick() {
|
||
this.fileInput.click();
|
||
}
|
||
|
||
handleDrop(dropInfo) {
|
||
if (dropInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].COSTUME) {
|
||
const sprite = this.props.vm.editingTarget.sprite;
|
||
const activeCostume = sprite.costumes[this.state.selectedCostumeIndex];
|
||
this.props.vm.reorderCostume(this.props.vm.editingTarget.id, dropInfo.index, dropInfo.newIndex);
|
||
this.setState({
|
||
selectedCostumeIndex: sprite.costumes.indexOf(activeCostume)
|
||
});
|
||
} else if (dropInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].BACKPACK_COSTUME) {
|
||
this.props.vm.addCostume(dropInfo.payload.body, {
|
||
name: dropInfo.payload.name
|
||
});
|
||
} else if (dropInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].BACKPACK_SOUND) {
|
||
this.props.onActivateSoundsTab();
|
||
this.props.vm.addSound({
|
||
md5: dropInfo.payload.body,
|
||
name: dropInfo.payload.name
|
||
});
|
||
}
|
||
}
|
||
|
||
setFileInput(input) {
|
||
this.fileInput = input;
|
||
}
|
||
|
||
formatCostumeDetails(size, optResolution) {
|
||
// If no resolution is given, assume that the costume is an SVG
|
||
const resolution = optResolution ? optResolution : 1; // Convert size to stage units by dividing by resolution
|
||
// Round up width and height for scratch-flash compatibility
|
||
// https://github.com/LLK/scratch-flash/blob/9fbac92ef3d09ceca0c0782f8a08deaa79e4df69/src/ui/media/MediaInfo.as#L224-L237
|
||
|
||
return "".concat(Math.ceil(size[0] / resolution), " x ").concat(Math.ceil(size[1] / resolution));
|
||
}
|
||
|
||
render() {
|
||
const {
|
||
dispatchUpdateRestore,
|
||
// eslint-disable-line no-unused-vars
|
||
intl,
|
||
isRtl,
|
||
onNewLibraryBackdropClick,
|
||
onNewLibraryCostumeClick,
|
||
vm
|
||
} = this.props;
|
||
|
||
if (!vm.editingTarget) {
|
||
return null;
|
||
}
|
||
|
||
const isStage = vm.editingTarget.isStage;
|
||
const target = vm.editingTarget.sprite;
|
||
const addLibraryMessage = isStage ? messages.addLibraryBackdropMsg : messages.addLibraryCostumeMsg;
|
||
const addFileMessage = isStage ? messages.addFileBackdropMsg : messages.addFileCostumeMsg;
|
||
const addSurpriseFunc = isStage ? this.handleSurpriseBackdrop : this.handleSurpriseCostume;
|
||
const addLibraryFunc = isStage ? onNewLibraryBackdropClick : onNewLibraryCostumeClick;
|
||
const addLibraryIcon = isStage ? _components_asset_panel_icon_add_backdrop_lib_svg__WEBPACK_IMPORTED_MODULE_18___default.a : _components_asset_panel_icon_add_costume_lib_svg__WEBPACK_IMPORTED_MODULE_19___default.a;
|
||
const costumeData = target.costumes ? target.costumes.map(costume => ({
|
||
name: costume.name,
|
||
asset: costume.asset,
|
||
details: costume.size ? this.formatCostumeDetails(costume.size, costume.bitmapResolution) : null,
|
||
dragPayload: costume
|
||
})) : [];
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_asset_panel_asset_panel_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
buttons: [{
|
||
title: intl.formatMessage(addLibraryMessage),
|
||
img: addLibraryIcon,
|
||
onClick: addLibraryFunc
|
||
}, {
|
||
title: intl.formatMessage(addFileMessage),
|
||
img: _components_action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_20___default.a,
|
||
onClick: this.handleFileUploadClick,
|
||
fileAccept: '.svg, .png, .bmp, .jpg, .jpeg, .jfif, .webp, .gif',
|
||
fileChange: this.handleCostumeUpload,
|
||
fileInput: this.setFileInput,
|
||
fileMultiple: true
|
||
}, {
|
||
title: intl.formatMessage(messages.addSurpriseCostumeMsg),
|
||
img: _components_action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_22___default.a,
|
||
onClick: addSurpriseFunc
|
||
}, {
|
||
title: intl.formatMessage(messages.addBlankCostumeMsg),
|
||
img: _components_action_menu_icon_paint_svg__WEBPACK_IMPORTED_MODULE_21___default.a,
|
||
onClick: this.handleNewBlankCostume
|
||
}, {
|
||
title: intl.formatMessage(addLibraryMessage),
|
||
img: _components_action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_23___default.a,
|
||
onClick: addLibraryFunc
|
||
}],
|
||
dragType: _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].COSTUME,
|
||
isRtl: isRtl,
|
||
items: costumeData,
|
||
selectedItemIndex: this.state.selectedCostumeIndex,
|
||
onDeleteClick: target && target.costumes && target.costumes.length > 1 ? this.handleDeleteCostume : null,
|
||
onDrop: this.handleDrop,
|
||
onDuplicateClick: this.handleDuplicateCostume,
|
||
onExportClick: this.handleExportCostume,
|
||
onItemClick: this.handleSelectCostume
|
||
}, target.costumes ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_paint_editor_wrapper_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
selectedCostumeIndex: this.state.selectedCostumeIndex,
|
||
isDark: this.props.isDark
|
||
}) : null);
|
||
}
|
||
|
||
}
|
||
|
||
CostumeTab.propTypes = {
|
||
dispatchUpdateRestore: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
editingTarget: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"],
|
||
isDark: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
onActivateSoundsTab: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onCloseImporting: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onNewLibraryBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onNewLibraryCostumeClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onShowImporting: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
sprites: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
costumes: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
skinId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
}))
|
||
})
|
||
}),
|
||
stage: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
sounds: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired
|
||
}))
|
||
}),
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a)
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
editingTarget: state.scratchGui.targets.editingTarget,
|
||
isRtl: state.locales.isRtl,
|
||
sprites: state.scratchGui.targets.sprites,
|
||
stage: state.scratchGui.targets.stage,
|
||
dragging: state.scratchGui.assetDrag.dragging
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onActivateSoundsTab: () => dispatch(Object(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_15__["activateTab"])(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_15__["SOUNDS_TAB_INDEX"])),
|
||
onNewLibraryBackdropClick: e => {
|
||
e.preventDefault();
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_14__["openBackdropLibrary"])());
|
||
},
|
||
onNewLibraryCostumeClick: e => {
|
||
e.preventDefault();
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_14__["openCostumeLibrary"])());
|
||
},
|
||
dispatchUpdateRestore: restoreState => {
|
||
dispatch(Object(_reducers_restore_deletion__WEBPACK_IMPORTED_MODULE_16__["setRestore"])(restoreState));
|
||
},
|
||
onCloseImporting: () => dispatch(Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_17__["closeAlertWithId"])('importingAsset')),
|
||
onShowImporting: () => dispatch(Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_17__["showStandardAlert"])('importingAsset'))
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(_lib_error_boundary_hoc_jsx__WEBPACK_IMPORTED_MODULE_9__["default"])('Costume Tab')(Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_7__["connect"])(mapStateToProps, mapDispatchToProps)(CostumeTab))));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/custom-procedures.jsx":
|
||
/*!**********************************************!*\
|
||
!*** ./src/containers/custom-procedures.jsx ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var lodash_defaultsdeep__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash.defaultsdeep */ "./node_modules/lodash.defaultsdeep/index.js");
|
||
/* harmony import */ var lodash_defaultsdeep__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_defaultsdeep__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _components_custom_procedures_custom_procedures_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/custom-procedures/custom-procedures.jsx */ "./src/components/custom-procedures/custom-procedures.jsx");
|
||
/* harmony import */ var _lib_tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/tw-lazy-scratch-blocks */ "./src/lib/tw-lazy-scratch-blocks.js");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class CustomProcedures extends react__WEBPACK_IMPORTED_MODULE_3___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleAddLabel', 'handleAddBoolean', 'handleAddTextNumber', 'handleToggleWarp', 'handleCancel', 'handleOk', 'setBlocks']);
|
||
this.state = {
|
||
rtlOffset: 0,
|
||
warp: false
|
||
};
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
if (this.workspace) {
|
||
this.workspace.dispose();
|
||
}
|
||
}
|
||
|
||
setBlocks(blocksRef) {
|
||
if (!blocksRef) return;
|
||
this.blocks = blocksRef;
|
||
const workspaceConfig = lodash_defaultsdeep__WEBPACK_IMPORTED_MODULE_1___default()({}, CustomProcedures.defaultOptions, this.props.options, {
|
||
rtl: this.props.isRtl
|
||
}); // @todo This is a hack to make there be no toolbox.
|
||
|
||
const ScratchBlocks = _lib_tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_5__["default"].get();
|
||
const oldDefaultToolbox = ScratchBlocks.Blocks.defaultToolbox;
|
||
ScratchBlocks.Blocks.defaultToolbox = null;
|
||
this.workspace = ScratchBlocks.inject(this.blocks, workspaceConfig);
|
||
ScratchBlocks.Blocks.defaultToolbox = oldDefaultToolbox; // Create the procedure declaration block for editing the mutation.
|
||
|
||
this.mutationRoot = this.workspace.newBlock('procedures_declaration'); // Make the declaration immovable, undeletable and have no context menu
|
||
|
||
this.mutationRoot.setMovable(false);
|
||
this.mutationRoot.setDeletable(false);
|
||
this.mutationRoot.contextMenu = false;
|
||
this.workspace.addChangeListener(() => {
|
||
this.mutationRoot.onChangeFn(); // Keep the block centered on the workspace
|
||
|
||
const metrics = this.workspace.getMetrics();
|
||
const {
|
||
x,
|
||
y
|
||
} = this.mutationRoot.getRelativeToSurfaceXY();
|
||
const dy = metrics.viewHeight / 2 - this.mutationRoot.height / 2 - y;
|
||
let dx;
|
||
|
||
if (this.props.isRtl) {
|
||
// // TODO: https://github.com/LLK/scratch-gui/issues/2838
|
||
// This is temporary until we can figure out what's going on width
|
||
// block positioning on the workspace for RTL.
|
||
// Workspace is always origin top-left, with x increasing to the right
|
||
// Calculate initial starting offset and save it, every other move
|
||
// has to take the original offset into account.
|
||
// Calculate a new left postion based on new width
|
||
// Convert current x position into LTR (mirror) x position (uses original offset)
|
||
// Use the difference between ltrX and mirrorX as the amount to move
|
||
const ltrX = metrics.viewWidth / 2 - this.mutationRoot.width / 2 + 25;
|
||
const mirrorX = x - (x - this.state.rtlOffset) * 2;
|
||
|
||
if (mirrorX === ltrX) {
|
||
return;
|
||
}
|
||
|
||
dx = mirrorX - ltrX;
|
||
const midPoint = metrics.viewWidth / 2;
|
||
|
||
if (x === 0) {
|
||
// if it's the first time positioning, it should always move right
|
||
if (this.mutationRoot.width < midPoint) {
|
||
dx = ltrX;
|
||
} else if (this.mutationRoot.width < metrics.viewWidth) {
|
||
dx = midPoint - (metrics.viewWidth - this.mutationRoot.width) / 2;
|
||
} else {
|
||
dx = midPoint + (this.mutationRoot.width - metrics.viewWidth);
|
||
}
|
||
|
||
this.mutationRoot.moveBy(dx, dy);
|
||
this.setState({
|
||
rtlOffset: this.mutationRoot.getRelativeToSurfaceXY().x
|
||
});
|
||
return;
|
||
}
|
||
|
||
if (this.mutationRoot.width > metrics.viewWidth) {
|
||
dx = dx + this.mutationRoot.width - metrics.viewWidth;
|
||
}
|
||
} else {
|
||
dx = metrics.viewWidth / 2 - this.mutationRoot.width / 2 - x; // If the procedure declaration is wider than the view width,
|
||
// keep the right-hand side of the procedure in view.
|
||
|
||
if (this.mutationRoot.width > metrics.viewWidth) {
|
||
dx = metrics.viewWidth - this.mutationRoot.width - x;
|
||
}
|
||
}
|
||
|
||
this.mutationRoot.moveBy(dx, dy);
|
||
});
|
||
this.mutationRoot.domToMutation(this.props.mutator);
|
||
this.mutationRoot.initSvg();
|
||
this.mutationRoot.render();
|
||
this.setState({
|
||
warp: this.mutationRoot.getWarp()
|
||
}); // Allow the initial events to run to position this block, then focus.
|
||
|
||
setTimeout(() => {
|
||
this.mutationRoot.focusLastEditor_();
|
||
});
|
||
}
|
||
|
||
handleCancel() {
|
||
this.props.onRequestClose();
|
||
}
|
||
|
||
handleOk() {
|
||
const newMutation = this.mutationRoot ? this.mutationRoot.mutationToDom(true) : null;
|
||
this.props.onRequestClose(newMutation);
|
||
}
|
||
|
||
handleAddLabel() {
|
||
if (this.mutationRoot) {
|
||
this.mutationRoot.addLabelExternal();
|
||
}
|
||
}
|
||
|
||
handleAddBoolean() {
|
||
if (this.mutationRoot) {
|
||
this.mutationRoot.addBooleanExternal();
|
||
}
|
||
}
|
||
|
||
handleAddTextNumber() {
|
||
if (this.mutationRoot) {
|
||
this.mutationRoot.addStringNumberExternal();
|
||
}
|
||
}
|
||
|
||
handleToggleWarp() {
|
||
if (this.mutationRoot) {
|
||
const newWarp = !this.mutationRoot.getWarp();
|
||
this.mutationRoot.setWarp(newWarp);
|
||
this.setState({
|
||
warp: newWarp
|
||
});
|
||
}
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_components_custom_procedures_custom_procedures_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
componentRef: this.setBlocks,
|
||
warp: this.state.warp,
|
||
onAddBoolean: this.handleAddBoolean,
|
||
onAddLabel: this.handleAddLabel,
|
||
onAddTextNumber: this.handleAddTextNumber,
|
||
onCancel: this.handleCancel,
|
||
onOk: this.handleOk,
|
||
onToggleWarp: this.handleToggleWarp
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
CustomProcedures.propTypes = {
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
mutator: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(Element),
|
||
onRequestClose: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
options: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({
|
||
media: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
zoom: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({
|
||
controls: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
wheel: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
startScale: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number
|
||
}),
|
||
comments: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
collapse: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool
|
||
})
|
||
};
|
||
CustomProcedures.defaultOptions = {
|
||
zoom: {
|
||
controls: false,
|
||
wheel: false,
|
||
startScale: 0.9
|
||
},
|
||
comments: false,
|
||
collapse: false,
|
||
scrollbars: true
|
||
};
|
||
CustomProcedures.defaultProps = {
|
||
options: CustomProcedures.defaultOptions
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
isRtl: state.locales.isRtl,
|
||
mutator: state.scratchGui.customProcedures.mutator
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_6__["connect"])(mapStateToProps)(CustomProcedures));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/deletion-restorer.jsx":
|
||
/*!**********************************************!*\
|
||
!*** ./src/containers/deletion-restorer.jsx ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_restore_deletion__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../reducers/restore-deletion */ "./src/reducers/restore-deletion.js");
|
||
const _excluded = ["children", "dispatchUpdateRestore"];
|
||
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/**
|
||
* DeletionRestorer component passes a restoreDeletion function to its child.
|
||
* It expects this child to be a function with the signature
|
||
* function (restoreDeletion, props) {}
|
||
* The component can then be used to attach deletion restoring functionality
|
||
* to any other component:
|
||
*
|
||
* <DeletionRestorer>{(restoreDeletion, props) => (
|
||
* <MyCoolComponent
|
||
* onClick={restoreDeletion}
|
||
* {...props}
|
||
* />
|
||
* )}</DeletionRestorer>
|
||
*/
|
||
|
||
class DeletionRestorer extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['restoreDeletion']);
|
||
}
|
||
|
||
restoreDeletion() {
|
||
if (typeof this.props.restore === 'function') {
|
||
this.props.restore();
|
||
this.props.dispatchUpdateRestore({
|
||
restoreFun: null,
|
||
deletedItem: ''
|
||
});
|
||
}
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
children,
|
||
dispatchUpdateRestore
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
const restorable = typeof this.props.restore === 'function';
|
||
return this.props.children(this.restoreDeletion, _objectSpread(_objectSpread({}, props), {}, {
|
||
restorable
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
DeletionRestorer.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
deletedItem: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
dispatchUpdateRestore: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
restore: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
deletedItem: state.scratchGui.restoreDeletion.deletedItem,
|
||
restore: state.scratchGui.restoreDeletion.restoreFun
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
dispatchUpdateRestore: updatedState => {
|
||
dispatch(Object(_reducers_restore_deletion__WEBPACK_IMPORTED_MODULE_4__["setRestore"])(updatedState));
|
||
}
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(DeletionRestorer));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/direction-picker.jsx":
|
||
/*!*********************************************!*\
|
||
!*** ./src/containers/direction-picker.jsx ***!
|
||
\*********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_direction_picker_direction_picker_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/direction-picker/direction-picker.jsx */ "./src/components/direction-picker/direction-picker.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
class DirectionPicker extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleOpenPopover', 'handleClosePopover', 'handleClickLeftRight', 'handleClickDontRotate', 'handleClickAllAround']);
|
||
this.state = {
|
||
popoverOpen: false
|
||
};
|
||
}
|
||
|
||
handleOpenPopover() {
|
||
this.setState({
|
||
popoverOpen: true
|
||
});
|
||
}
|
||
|
||
handleClosePopover() {
|
||
this.setState({
|
||
popoverOpen: false
|
||
});
|
||
}
|
||
|
||
handleClickAllAround() {
|
||
this.props.onChangeRotationStyle(_components_direction_picker_direction_picker_jsx__WEBPACK_IMPORTED_MODULE_3__["RotationStyles"].ALL_AROUND);
|
||
}
|
||
|
||
handleClickLeftRight() {
|
||
this.props.onChangeRotationStyle(_components_direction_picker_direction_picker_jsx__WEBPACK_IMPORTED_MODULE_3__["RotationStyles"].LEFT_RIGHT);
|
||
}
|
||
|
||
handleClickDontRotate() {
|
||
this.props.onChangeRotationStyle(_components_direction_picker_direction_picker_jsx__WEBPACK_IMPORTED_MODULE_3__["RotationStyles"].DONT_ROTATE);
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_direction_picker_direction_picker_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
direction: this.props.direction,
|
||
disabled: this.props.disabled,
|
||
labelAbove: this.props.labelAbove,
|
||
popoverOpen: this.state.popoverOpen && !this.props.disabled,
|
||
rotationStyle: this.props.rotationStyle,
|
||
onChangeDirection: this.props.onChangeDirection,
|
||
onClickAllAround: this.handleClickAllAround,
|
||
onClickDontRotate: this.handleClickDontRotate,
|
||
onClickLeftRight: this.handleClickLeftRight,
|
||
onClosePopover: this.handleClosePopover,
|
||
onOpenPopover: this.handleOpenPopover
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
DirectionPicker.propTypes = {
|
||
direction: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
disabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
labelAbove: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onChangeDirection: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onChangeRotationStyle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
rotationStyle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (DirectionPicker);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/dom-element-renderer.jsx":
|
||
/*!*************************************************!*\
|
||
!*** ./src/containers/dom-element-renderer.jsx ***!
|
||
\*************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.omit */ "./node_modules/lodash.omit/index.js");
|
||
/* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_omit__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var to_style__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! to-style */ "./node_modules/to-style/index.js");
|
||
/* harmony import */ var to_style__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(to_style__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_style_proptype__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-style-proptype */ "./node_modules/react-style-proptype/src/index.js");
|
||
/* harmony import */ var react_style_proptype__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_style_proptype__WEBPACK_IMPORTED_MODULE_4__);
|
||
|
||
|
||
|
||
|
||
|
||
/*
|
||
* DOMElementRenderer wraps a DOM element, allowing it to be
|
||
* rendered by React. It's up to the containing component
|
||
* to retain a reference to the element prop, or else it
|
||
* will be garbage collected after unmounting.
|
||
*
|
||
* Props passed to the DOMElementRenderer will be set on the
|
||
* DOM element like it's a normal component.
|
||
*/
|
||
|
||
class DOMElementRenderer extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
this.setContainer = this.setContainer.bind(this);
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.container.appendChild(this.props.domElement);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.container.removeChild(this.props.domElement);
|
||
}
|
||
|
||
setContainer(c) {
|
||
this.container = c;
|
||
}
|
||
|
||
render() {
|
||
// Apply props to the DOM element, so its attributes
|
||
// are updated as if it were a normal component.
|
||
// Look at me, I'm the React now!
|
||
Object.assign(this.props.domElement, lodash_omit__WEBPACK_IMPORTED_MODULE_0___default()(this.props, ['domElement', 'children', 'style'])); // Convert react style prop to dom element styling.
|
||
|
||
if (this.props.style) {
|
||
this.props.domElement.style.cssText = to_style__WEBPACK_IMPORTED_MODULE_3___default.a.string(this.props.style);
|
||
}
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
|
||
ref: this.setContainer
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
DOMElementRenderer.propTypes = {
|
||
domElement: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(Element).isRequired,
|
||
style: react_style_proptype__WEBPACK_IMPORTED_MODULE_4___default.a
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (DOMElementRenderer);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/drag-layer.jsx":
|
||
/*!***************************************!*\
|
||
!*** ./src/containers/drag-layer.jsx ***!
|
||
\***************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _components_drag_layer_drag_layer_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/drag-layer/drag-layer.jsx */ "./src/components/drag-layer/drag-layer.jsx");
|
||
|
||
|
||
|
||
const mapStateToProps = state => ({
|
||
dragging: state.scratchGui.assetDrag.dragging,
|
||
currentOffset: state.scratchGui.assetDrag.currentOffset,
|
||
img: state.scratchGui.assetDrag.img
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_0__["connect"])(mapStateToProps)(_components_drag_layer_drag_layer_jsx__WEBPACK_IMPORTED_MODULE_1__["default"]));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/error-boundary.jsx":
|
||
/*!*******************************************!*\
|
||
!*** ./src/containers/error-boundary.jsx ***!
|
||
\*******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _components_crash_message_crash_message_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/crash-message/crash-message.jsx */ "./src/components/crash-message/crash-message.jsx");
|
||
/* harmony import */ var _lib_log_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/log.js */ "./src/lib/log.js");
|
||
/* harmony import */ var _lib_supported_browser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/supported-browser */ "./src/lib/supported-browser.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class ErrorBoundary extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
this.state = {
|
||
hasError: false,
|
||
errorId: null
|
||
};
|
||
}
|
||
|
||
componentDidCatch(error, info) {
|
||
// Error object may be undefined (IE?)
|
||
error = error || {
|
||
stack: 'Unknown stack',
|
||
message: 'Unknown error'
|
||
}; // Log errors to analytics, leaving out browsers that are not in our recommended set
|
||
|
||
if (Object(_lib_supported_browser__WEBPACK_IMPORTED_MODULE_4__["recommendedBrowser"])() && window.Sentry) {
|
||
window.Sentry.withScope(scope => {
|
||
Object.keys(info).forEach(key => {
|
||
scope.setExtra(key, info[key]);
|
||
});
|
||
scope.setExtra('action', this.props.action);
|
||
window.Sentry.captureException(error);
|
||
});
|
||
} // Display fallback UI
|
||
|
||
|
||
this.setState({
|
||
hasError: true,
|
||
errorId: window.Sentry ? window.Sentry.lastEventId() : null,
|
||
errorMessage: "".concat(error && error.message || error)
|
||
}); // Log error locally for debugging as well.
|
||
|
||
_lib_log_js__WEBPACK_IMPORTED_MODULE_3__["default"].error("Unhandled Error: ".concat(error.stack, "\nComponent stack: ").concat(info.componentStack));
|
||
}
|
||
|
||
handleBack() {
|
||
window.history.back();
|
||
}
|
||
|
||
handleReload() {
|
||
window.location.replace(window.location.origin + window.location.pathname);
|
||
}
|
||
|
||
render() {
|
||
if (this.state.hasError) {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_crash_message_crash_message_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
||
eventId: this.state.errorId,
|
||
errorMessage: this.state.errorMessage,
|
||
onReload: this.handleReload
|
||
});
|
||
}
|
||
|
||
return this.props.children;
|
||
}
|
||
|
||
}
|
||
|
||
ErrorBoundary.propTypes = {
|
||
action: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
// Used for defining tracking action
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (ErrorBoundary);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/extension-library.jsx":
|
||
/*!**********************************************!*\
|
||
!*** ./src/containers/extension-library.jsx ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _lib_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/log */ "./src/lib/log.js");
|
||
/* harmony import */ var _lib_libraries_extensions_index_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/libraries/extensions/index.jsx */ "./src/lib/libraries/extensions/index.jsx");
|
||
/* harmony import */ var _lib_libraries_tw_extension_tags__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/libraries/tw-extension-tags */ "./src/lib/libraries/tw-extension-tags.js");
|
||
/* harmony import */ var _components_library_library_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/library/library.jsx */ "./src/components/library/library.jsx");
|
||
/* harmony import */ var _components_action_menu_icon_sprite_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../components/action-menu/icon--sprite.svg */ "./src/components/action-menu/icon--sprite.svg");
|
||
/* harmony import */ var _components_action_menu_icon_sprite_svg__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_components_action_menu_icon_sprite_svg__WEBPACK_IMPORTED_MODULE_9__);
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["defineMessages"])({
|
||
extensionTitle: {
|
||
"id": "gui.extensionLibrary.chooseAnExtension",
|
||
"defaultMessage": "Choose an Extension"
|
||
}
|
||
});
|
||
|
||
const toLibraryItem = extension => {
|
||
if (typeof extension === 'object') {
|
||
return _objectSpread({
|
||
rawURL: extension.iconURL || _components_action_menu_icon_sprite_svg__WEBPACK_IMPORTED_MODULE_9___default.a
|
||
}, extension);
|
||
}
|
||
|
||
return extension;
|
||
};
|
||
|
||
let cachedGallery = null;
|
||
|
||
const fetchLibrary = async () => {
|
||
const res = await fetch('https://extensions.turbowarp.org/generated-metadata/extensions-v0.json');
|
||
|
||
if (!res.ok) {
|
||
throw new Error("HTTP status ".concat(res.status));
|
||
}
|
||
|
||
const data = await res.json();
|
||
return data.extensions.map(extension => ({
|
||
name: extension.name,
|
||
description: extension.description,
|
||
extensionId: extension.id,
|
||
extensionURL: "https://extensions.turbowarp.org/".concat(extension.slug, ".js"),
|
||
iconURL: "https://extensions.turbowarp.org/".concat(extension.image || 'images/unknown.svg'),
|
||
tags: ['tw'],
|
||
credits: [...(extension.by || []), ...(extension.original || [])].map(credit => {
|
||
if (credit.link) {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("a", {
|
||
href: credit.link,
|
||
target: "_blank",
|
||
rel: "noreferrer"
|
||
}, credit.name);
|
||
}
|
||
|
||
return credit.name;
|
||
}),
|
||
docsURI: extension.docs ? "https://extensions.turbowarp.org/".concat(extension.slug) : null,
|
||
samples: extension.samples ? extension.samples.map(sample => ({
|
||
href: "".concat("", "editor?project_url=https://extensions.turbowarp.org/samples/").concat(encodeURIComponent(sample), ".sb3"),
|
||
text: sample
|
||
})) : null,
|
||
incompatibleWithScratch: true,
|
||
featured: true
|
||
}));
|
||
};
|
||
|
||
class ExtensionLibrary extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleItemSelect']);
|
||
this.state = {
|
||
gallery: cachedGallery,
|
||
galleryError: null
|
||
};
|
||
}
|
||
|
||
componentDidMount() {
|
||
if (!this.state.gallery) {
|
||
fetchLibrary().then(gallery => {
|
||
cachedGallery = gallery;
|
||
this.setState({
|
||
gallery
|
||
});
|
||
}).catch(error => {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_5__["default"].error(error);
|
||
this.setState({
|
||
galleryError: error
|
||
});
|
||
});
|
||
}
|
||
}
|
||
|
||
handleItemSelect(item) {
|
||
if (item.href) {
|
||
return;
|
||
}
|
||
|
||
const extensionId = item.extensionId;
|
||
|
||
if (extensionId === 'custom_extension') {
|
||
this.props.onOpenCustomExtensionModal();
|
||
return;
|
||
}
|
||
|
||
if (extensionId === 'procedures_enable_return') {
|
||
this.props.onEnableProcedureReturns();
|
||
this.props.onCategorySelected('myBlocks');
|
||
return;
|
||
}
|
||
|
||
const url = item.extensionURL ? item.extensionURL : extensionId;
|
||
|
||
if (!item.disabled) {
|
||
if (this.props.vm.extensionManager.isExtensionLoaded(extensionId)) {
|
||
this.props.onCategorySelected(extensionId);
|
||
} else {
|
||
this.props.vm.extensionManager.loadExtensionURL(url).then(() => {
|
||
this.props.onCategorySelected(extensionId);
|
||
}).catch(err => {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_5__["default"].error(err); // eslint-disable-next-line no-alert
|
||
|
||
alert(err);
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
render() {
|
||
const library = _lib_libraries_extensions_index_jsx__WEBPACK_IMPORTED_MODULE_6__["default"].map(toLibraryItem);
|
||
library.push('---');
|
||
|
||
if (this.state.gallery) {
|
||
library.push(toLibraryItem(_lib_libraries_extensions_index_jsx__WEBPACK_IMPORTED_MODULE_6__["galleryMore"]));
|
||
library.push(...this.state.gallery.map(toLibraryItem));
|
||
} else if (this.state.galleryError) {
|
||
library.push(toLibraryItem(_lib_libraries_extensions_index_jsx__WEBPACK_IMPORTED_MODULE_6__["galleryError"]));
|
||
} else {
|
||
library.push(toLibraryItem(_lib_libraries_extensions_index_jsx__WEBPACK_IMPORTED_MODULE_6__["galleryLoading"]));
|
||
}
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_library_library_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], {
|
||
data: library,
|
||
filterable: true,
|
||
persistableKey: "extensionId",
|
||
id: "extensionLibrary",
|
||
tags: _lib_libraries_tw_extension_tags__WEBPACK_IMPORTED_MODULE_7__["default"],
|
||
title: this.props.intl.formatMessage(messages.extensionTitle),
|
||
visible: this.props.visible,
|
||
onItemSelected: this.handleItemSelect,
|
||
onRequestClose: this.props.onRequestClose
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
ExtensionLibrary.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_4__["intlShape"].isRequired,
|
||
onCategorySelected: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onEnableProcedureReturns: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onOpenCustomExtensionModal: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onRequestClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
visible: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_3___default.a).isRequired // eslint-disable-line react/no-unused-prop-types
|
||
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["injectIntl"])(ExtensionLibrary));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/green-flag-overlay.jsx":
|
||
/*!***********************************************!*\
|
||
!*** ./src/containers/green-flag-overlay.jsx ***!
|
||
\***********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _components_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/box/box.jsx */ "./src/components/box/box.jsx");
|
||
/* harmony import */ var _components_green_flag_icon_green_flag_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/green-flag/icon--green-flag.svg */ "./src/components/green-flag/icon--green-flag.svg");
|
||
/* harmony import */ var _components_green_flag_icon_green_flag_svg__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_components_green_flag_icon_green_flag_svg__WEBPACK_IMPORTED_MODULE_6__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class GreenFlagOverlay extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleClick']);
|
||
}
|
||
|
||
handleClick() {
|
||
this.props.vm.start();
|
||
this.props.vm.greenFlag();
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_box_box_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
className: this.props.wrapperClass,
|
||
onClick: this.handleClick
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: this.props.className
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("img", {
|
||
draggable: false,
|
||
src: _components_green_flag_icon_green_flag_svg__WEBPACK_IMPORTED_MODULE_6___default.a
|
||
})));
|
||
}
|
||
|
||
}
|
||
|
||
GreenFlagOverlay.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a),
|
||
wrapperClass: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
vm: state.scratchGui.vm
|
||
});
|
||
|
||
const mapDispatchToProps = () => ({});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(GreenFlagOverlay));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/gui.jsx":
|
||
/*!********************************!*\
|
||
!*** ./src/containers/gui.jsx ***!
|
||
\********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! redux */ "./node_modules/redux/es/index.js");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var react_modal__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-modal */ "./node_modules/react-modal/lib/index.js");
|
||
/* harmony import */ var react_modal__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_modal__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _lib_error_boundary_hoc_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/error-boundary-hoc.jsx */ "./src/lib/error-boundary-hoc.jsx");
|
||
/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../reducers/project-state */ "./src/reducers/project-state.js");
|
||
/* harmony import */ var _reducers_editor_tab__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../reducers/editor-tab */ "./src/reducers/editor-tab.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _lib_font_loader_hoc_jsx__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../lib/font-loader-hoc.jsx */ "./src/lib/font-loader-hoc.jsx");
|
||
/* harmony import */ var _lib_localization_hoc_jsx__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../lib/localization-hoc.jsx */ "./src/lib/localization-hoc.jsx");
|
||
/* harmony import */ var _lib_sb_file_uploader_hoc_jsx__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../lib/sb-file-uploader-hoc.jsx */ "./src/lib/sb-file-uploader-hoc.jsx");
|
||
/* harmony import */ var _lib_project_fetcher_hoc_jsx__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../lib/project-fetcher-hoc.jsx */ "./src/lib/project-fetcher-hoc.jsx");
|
||
/* harmony import */ var _lib_titled_hoc_jsx__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../lib/titled-hoc.jsx */ "./src/lib/titled-hoc.jsx");
|
||
/* harmony import */ var _lib_project_saver_hoc_jsx__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../lib/project-saver-hoc.jsx */ "./src/lib/project-saver-hoc.jsx");
|
||
/* harmony import */ var _lib_query_parser_hoc_jsx__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../lib/query-parser-hoc.jsx */ "./src/lib/query-parser-hoc.jsx");
|
||
/* harmony import */ var _lib_storage__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../lib/storage */ "./src/lib/storage.js");
|
||
/* harmony import */ var _lib_vm_listener_hoc_jsx__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../lib/vm-listener-hoc.jsx */ "./src/lib/vm-listener-hoc.jsx");
|
||
/* harmony import */ var _lib_vm_manager_hoc_jsx__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../lib/vm-manager-hoc.jsx */ "./src/lib/vm-manager-hoc.jsx");
|
||
/* harmony import */ var _lib_cloud_manager_hoc_jsx__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../lib/cloud-manager-hoc.jsx */ "./src/lib/cloud-manager-hoc.jsx");
|
||
/* harmony import */ var _lib_tw_fullscreen_resizer_hoc_jsx__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../lib/tw-fullscreen-resizer-hoc.jsx */ "./src/lib/tw-fullscreen-resizer-hoc.jsx");
|
||
/* harmony import */ var _components_gui_gui_jsx__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../components/gui/gui.jsx */ "./src/components/gui/gui.jsx");
|
||
/* harmony import */ var _lib_isScratchDesktop_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../lib/isScratchDesktop.js */ "./src/lib/isScratchDesktop.js");
|
||
const _excluded = ["assetHost", "cloudHost", "error", "isError", "isScratchDesktop", "isShowingProject", "onProjectLoaded", "onStorageInit", "onUpdateProjectId", "onVmInit", "projectHost", "projectId", "children", "fetchingProject", "isLoading", "loadingStateVisible"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class GUI extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
componentDidMount() {
|
||
Object(_lib_isScratchDesktop_js__WEBPACK_IMPORTED_MODULE_24__["setIsScratchDesktop"])(this.props.isScratchDesktop);
|
||
this.props.onStorageInit(_lib_storage__WEBPACK_IMPORTED_MODULE_18__["default"]);
|
||
this.props.onVmInit(this.props.vm);
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
if (this.props.projectId !== prevProps.projectId && this.props.projectId !== null) {
|
||
this.props.onUpdateProjectId(this.props.projectId);
|
||
}
|
||
|
||
if (this.props.isShowingProject && !prevProps.isShowingProject) {
|
||
// this only notifies container when a project changes from not yet loaded to loaded
|
||
// At this time the project view in www doesn't need to know when a project is unloaded
|
||
this.props.onProjectLoaded();
|
||
}
|
||
}
|
||
|
||
render() {
|
||
if (this.props.isError) {
|
||
throw new Error("Error in GUI [location=".concat(window.location, "]: ").concat(this.props.error));
|
||
}
|
||
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
assetHost,
|
||
cloudHost,
|
||
error,
|
||
isError,
|
||
isScratchDesktop,
|
||
isShowingProject,
|
||
onProjectLoaded,
|
||
onStorageInit,
|
||
onUpdateProjectId,
|
||
onVmInit,
|
||
projectHost,
|
||
projectId,
|
||
|
||
/* eslint-enable no-unused-vars */
|
||
children,
|
||
fetchingProject,
|
||
isLoading,
|
||
loadingStateVisible
|
||
} = _this$props,
|
||
componentProps = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_gui_gui_jsx__WEBPACK_IMPORTED_MODULE_23__["default"], _extends({
|
||
loading: fetchingProject || isLoading || loadingStateVisible
|
||
}, componentProps), children);
|
||
}
|
||
|
||
}
|
||
|
||
GUI.propTypes = {
|
||
assetHost: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.node,
|
||
cloudHost: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
error: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string]),
|
||
fetchingProject: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_6__["intlShape"],
|
||
isError: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
isEmbedded: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
isFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
isLoading: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
isScratchDesktop: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
isShowingProject: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
loadingStateVisible: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
onProjectLoaded: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onSeeCommunity: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onStorageInit: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onUpdateProjectId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onVmInit: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
projectHost: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
projectId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number]),
|
||
telemetryModalVisible: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_5___default.a).isRequired
|
||
};
|
||
GUI.defaultProps = {
|
||
isScratchDesktop: false,
|
||
onStorageInit: storageInstance => storageInstance.addOfficialScratchWebStores(),
|
||
onProjectLoaded: () => {},
|
||
onUpdateProjectId: () => {},
|
||
onVmInit: () => {}
|
||
};
|
||
|
||
const mapStateToProps = state => {
|
||
const loadingState = state.scratchGui.projectState.loadingState;
|
||
return {
|
||
activeTabIndex: state.scratchGui.editorTab.activeTabIndex,
|
||
alertsVisible: state.scratchGui.alerts.visible,
|
||
backdropLibraryVisible: state.scratchGui.modals.backdropLibrary,
|
||
blocksTabVisible: state.scratchGui.editorTab.activeTabIndex === _reducers_editor_tab__WEBPACK_IMPORTED_MODULE_9__["BLOCKS_TAB_INDEX"],
|
||
cardsVisible: state.scratchGui.cards.visible,
|
||
connectionModalVisible: state.scratchGui.modals.connectionModal,
|
||
costumeLibraryVisible: state.scratchGui.modals.costumeLibrary,
|
||
costumesTabVisible: state.scratchGui.editorTab.activeTabIndex === _reducers_editor_tab__WEBPACK_IMPORTED_MODULE_9__["COSTUMES_TAB_INDEX"],
|
||
error: state.scratchGui.projectState.error,
|
||
isError: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__["getIsError"])(loadingState),
|
||
isEmbedded: state.scratchGui.mode.isEmbedded,
|
||
isFullScreen: state.scratchGui.mode.isFullScreen || state.scratchGui.mode.isEmbedded,
|
||
isPlayerOnly: state.scratchGui.mode.isPlayerOnly,
|
||
isRtl: state.locales.isRtl,
|
||
isShowingProject: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__["getIsShowingProject"])(loadingState),
|
||
loadingStateVisible: state.scratchGui.modals.loadingProject,
|
||
projectId: state.scratchGui.projectState.projectId,
|
||
soundsTabVisible: state.scratchGui.editorTab.activeTabIndex === _reducers_editor_tab__WEBPACK_IMPORTED_MODULE_9__["SOUNDS_TAB_INDEX"],
|
||
targetIsStage: state.scratchGui.targets.stage && state.scratchGui.targets.stage.id === state.scratchGui.targets.editingTarget,
|
||
telemetryModalVisible: state.scratchGui.modals.telemetryModal,
|
||
tipsLibraryVisible: state.scratchGui.modals.tipsLibrary,
|
||
usernameModalVisible: state.scratchGui.modals.usernameModal,
|
||
settingsModalVisible: state.scratchGui.modals.settingsModal,
|
||
customExtensionModalVisible: state.scratchGui.modals.customExtensionModal,
|
||
fontsModalVisible: state.scratchGui.modals.fontsModal,
|
||
vm: state.scratchGui.vm
|
||
};
|
||
};
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onExtensionButtonClick: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_10__["openExtensionLibrary"])()),
|
||
onActivateTab: tab => dispatch(Object(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_9__["activateTab"])(tab)),
|
||
onActivateCostumesTab: () => dispatch(Object(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_9__["activateTab"])(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_9__["COSTUMES_TAB_INDEX"])),
|
||
onActivateSoundsTab: () => dispatch(Object(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_9__["activateTab"])(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_9__["SOUNDS_TAB_INDEX"])),
|
||
onRequestCloseBackdropLibrary: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_10__["closeBackdropLibrary"])()),
|
||
onRequestCloseCostumeLibrary: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_10__["closeCostumeLibrary"])()),
|
||
onRequestCloseTelemetryModal: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_10__["closeTelemetryModal"])())
|
||
});
|
||
|
||
const ConnectedGUI = Object(react_intl__WEBPACK_IMPORTED_MODULE_6__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(GUI)); // note that redux's 'compose' function is just being used as a general utility to make
|
||
// the hierarchy of HOC constructor calls clearer here; it has nothing to do with redux's
|
||
// ability to compose reducers.
|
||
|
||
const WrappedGui = Object(redux__WEBPACK_IMPORTED_MODULE_2__["compose"])(_lib_localization_hoc_jsx__WEBPACK_IMPORTED_MODULE_12__["default"], Object(_lib_error_boundary_hoc_jsx__WEBPACK_IMPORTED_MODULE_7__["default"])('Top Level App'), _lib_font_loader_hoc_jsx__WEBPACK_IMPORTED_MODULE_11__["default"], // QueryParserHOC, // tw: HOC is unused
|
||
_lib_project_fetcher_hoc_jsx__WEBPACK_IMPORTED_MODULE_14__["default"], _lib_titled_hoc_jsx__WEBPACK_IMPORTED_MODULE_15__["default"], _lib_project_saver_hoc_jsx__WEBPACK_IMPORTED_MODULE_16__["default"], _lib_vm_listener_hoc_jsx__WEBPACK_IMPORTED_MODULE_19__["default"], _lib_vm_manager_hoc_jsx__WEBPACK_IMPORTED_MODULE_20__["default"], _lib_sb_file_uploader_hoc_jsx__WEBPACK_IMPORTED_MODULE_13__["default"], _lib_cloud_manager_hoc_jsx__WEBPACK_IMPORTED_MODULE_21__["default"], _lib_tw_fullscreen_resizer_hoc_jsx__WEBPACK_IMPORTED_MODULE_22__["default"])(ConnectedGUI);
|
||
WrappedGui.setAppElement = react_modal__WEBPACK_IMPORTED_MODULE_4___default.a.setAppElement;
|
||
/* harmony default export */ __webpack_exports__["default"] = (WrappedGui);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/inline-messages.jsx":
|
||
/*!********************************************!*\
|
||
!*** ./src/containers/inline-messages.jsx ***!
|
||
\********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_alerts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../reducers/alerts */ "./src/reducers/alerts.js");
|
||
/* harmony import */ var _components_alerts_inline_message_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/alerts/inline-message.jsx */ "./src/components/alerts/inline-message.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const InlineMessages = ({
|
||
alertsList,
|
||
className
|
||
}) => {
|
||
if (!alertsList) {
|
||
return null;
|
||
} // only display inline alerts here
|
||
|
||
|
||
const inlineAlerts = Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_3__["filterInlineAlerts"])(alertsList);
|
||
|
||
if (!inlineAlerts || !inlineAlerts.length) {
|
||
return null;
|
||
} // get first alert
|
||
|
||
|
||
const firstInlineAlert = inlineAlerts[0];
|
||
const {
|
||
content,
|
||
iconSpinner,
|
||
level
|
||
} = firstInlineAlert;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_alerts_inline_message_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
className: className,
|
||
content: content,
|
||
iconSpinner: iconSpinner,
|
||
level: level
|
||
});
|
||
};
|
||
|
||
InlineMessages.propTypes = {
|
||
alertsList: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object),
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
alertsList: state.scratchGui.alerts.alertsList
|
||
});
|
||
|
||
const mapDispatchToProps = () => ({});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_2__["connect"])(mapStateToProps, mapDispatchToProps)(InlineMessages));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/language-selector.jsx":
|
||
/*!**********************************************!*\
|
||
!*** ./src/containers/language-selector.jsx ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_locales__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../reducers/locales */ "./src/reducers/locales.js");
|
||
/* harmony import */ var _reducers_menus__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/menus */ "./src/reducers/menus.js");
|
||
/* harmony import */ var _components_language_selector_language_selector_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/language-selector/language-selector.jsx */ "./src/components/language-selector/language-selector.jsx");
|
||
const _excluded = ["onChangeLanguage", "messagesByLocale", "children"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class LanguageSelector extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleChange']);
|
||
document.documentElement.lang = props.currentLocale;
|
||
}
|
||
|
||
handleChange(e) {
|
||
const newLocale = e.target.value;
|
||
|
||
if (this.props.messagesByLocale[newLocale]) {
|
||
this.props.onChangeLanguage(newLocale);
|
||
document.documentElement.lang = newLocale;
|
||
}
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
onChangeLanguage,
|
||
// eslint-disable-line no-unused-vars
|
||
messagesByLocale,
|
||
// eslint-disable-line no-unused-vars
|
||
children
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_language_selector_language_selector_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], _extends({
|
||
onChange: this.handleChange
|
||
}, props), children);
|
||
}
|
||
|
||
}
|
||
|
||
LanguageSelector.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node,
|
||
currentLocale: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
// Only checking key presence for messagesByLocale, no need to be more specific than object
|
||
messagesByLocale: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,
|
||
// eslint-disable-line react/forbid-prop-types
|
||
onChangeLanguage: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
currentLocale: state.locales.locale,
|
||
messagesByLocale: state.locales.messagesByLocale
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onChangeLanguage: locale => {
|
||
dispatch(Object(_reducers_locales__WEBPACK_IMPORTED_MODULE_4__["selectLocale"])(locale));
|
||
dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_5__["closeLanguageMenu"])());
|
||
}
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(LanguageSelector));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/library-item.jsx":
|
||
/*!*****************************************!*\
|
||
!*** ./src/containers/library-item.jsx ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _components_library_item_library_item_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/library-item/library-item.jsx */ "./src/components/library-item/library-item.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
incompatible: {
|
||
"id": "tw.confirmIncompatibleExtension",
|
||
"defaultMessage": "This extension is incompatible with Scratch. Projects made with it cannot be uploaded to the Scratch website. Are you sure you want to enable it?"
|
||
}
|
||
});
|
||
|
||
class LibraryItem extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleBlur', 'handleClick', 'handleFavorite', 'handleFocus', 'handleKeyPress', 'handleMouseEnter', 'handleMouseLeave', 'handlePlay', 'handleStop', 'rotateIcon', 'startRotatingIcons', 'stopRotatingIcons']);
|
||
this.state = {
|
||
iconIndex: 0,
|
||
isRotatingIcon: false
|
||
};
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
clearInterval(this.intervalId);
|
||
}
|
||
|
||
handleBlur(id) {
|
||
this.handleMouseLeave(id);
|
||
}
|
||
|
||
handleClick(e) {
|
||
if (e.target.closest('a')) {
|
||
// Allow clicking on links inside the item
|
||
return;
|
||
}
|
||
|
||
if (!this.props.favorite && this.props.incompatibleWithScratch && // eslint-disable-next-line no-alert
|
||
!confirm(this.props.intl.formatMessage(messages.incompatible))) {
|
||
return;
|
||
}
|
||
|
||
if (!this.props.disabled) {
|
||
if (this.props.href) {
|
||
window.open(this.props.href);
|
||
} else {
|
||
this.props.onSelect(this.props.id);
|
||
}
|
||
}
|
||
|
||
e.preventDefault();
|
||
}
|
||
|
||
handleFavorite(e) {
|
||
e.stopPropagation();
|
||
this.props.onFavorite(this.props.id);
|
||
}
|
||
|
||
handleFocus(id) {
|
||
if (!this.props.showPlayButton) {
|
||
this.handleMouseEnter(id);
|
||
}
|
||
}
|
||
|
||
handleKeyPress(e) {
|
||
if (e.key === ' ' || e.key === 'Enter') {
|
||
e.preventDefault();
|
||
this.props.onSelect(this.props.id);
|
||
}
|
||
}
|
||
|
||
handleMouseEnter() {
|
||
// only show hover effects on the item if not showing a play button
|
||
if (!this.props.showPlayButton) {
|
||
this.props.onMouseEnter(this.props.id);
|
||
|
||
if (this.props.icons && this.props.icons.length) {
|
||
this.stopRotatingIcons();
|
||
this.setState({
|
||
isRotatingIcon: true
|
||
}, this.startRotatingIcons);
|
||
}
|
||
}
|
||
}
|
||
|
||
handleMouseLeave() {
|
||
// only show hover effects on the item if not showing a play button
|
||
if (!this.props.showPlayButton) {
|
||
this.props.onMouseLeave(this.props.id);
|
||
|
||
if (this.props.icons && this.props.icons.length) {
|
||
this.setState({
|
||
isRotatingIcon: false
|
||
}, this.stopRotatingIcons);
|
||
}
|
||
}
|
||
}
|
||
|
||
handlePlay() {
|
||
this.props.onMouseEnter(this.props.id);
|
||
}
|
||
|
||
handleStop() {
|
||
this.props.onMouseLeave(this.props.id);
|
||
}
|
||
|
||
startRotatingIcons() {
|
||
this.rotateIcon();
|
||
this.intervalId = setInterval(this.rotateIcon, 300);
|
||
}
|
||
|
||
stopRotatingIcons() {
|
||
if (this.intervalId) {
|
||
this.intervalId = clearInterval(this.intervalId);
|
||
}
|
||
}
|
||
|
||
rotateIcon() {
|
||
const nextIconIndex = (this.state.iconIndex + 1) % this.props.icons.length;
|
||
this.setState({
|
||
iconIndex: nextIconIndex
|
||
});
|
||
}
|
||
|
||
curIconMd5() {
|
||
const iconMd5Prop = this.props.iconMd5;
|
||
|
||
if (this.props.icons && this.state.isRotatingIcon && this.state.iconIndex < this.props.icons.length) {
|
||
const icon = this.props.icons[this.state.iconIndex] || {};
|
||
return icon.md5ext || // 3.0 library format
|
||
icon.baseLayerMD5 || // 2.0 library format, TODO GH-5084
|
||
iconMd5Prop;
|
||
}
|
||
|
||
return iconMd5Prop;
|
||
}
|
||
|
||
render() {
|
||
const iconMd5 = this.curIconMd5();
|
||
const iconURL = iconMd5 ? "https://cdn.assets.scratch.mit.edu/internalapi/asset/".concat(iconMd5, "/get/") : this.props.iconRawURL;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_library_item_library_item_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
intl: this.props.intl,
|
||
bluetoothRequired: this.props.bluetoothRequired,
|
||
collaborator: this.props.collaborator,
|
||
description: this.props.description,
|
||
disabled: this.props.disabled,
|
||
extensionId: this.props.extensionId,
|
||
featured: this.props.featured,
|
||
hidden: this.props.hidden,
|
||
iconURL: iconURL,
|
||
icons: this.props.icons,
|
||
id: this.props.id,
|
||
insetIconURL: this.props.insetIconURL,
|
||
internetConnectionRequired: this.props.internetConnectionRequired,
|
||
isPlaying: this.props.isPlaying,
|
||
name: this.props.name,
|
||
credits: this.props.credits,
|
||
docsURI: this.props.docsURI,
|
||
samples: this.props.samples,
|
||
favorite: this.props.favorite,
|
||
onFavorite: this.handleFavorite,
|
||
showPlayButton: this.props.showPlayButton,
|
||
onBlur: this.handleBlur,
|
||
onClick: this.handleClick,
|
||
onFocus: this.handleFocus,
|
||
onKeyPress: this.handleKeyPress,
|
||
onMouseEnter: this.handleMouseEnter,
|
||
onMouseLeave: this.handleMouseLeave,
|
||
onPlay: this.handlePlay,
|
||
onStop: this.handleStop
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
LibraryItem.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"],
|
||
bluetoothRequired: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
collaborator: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
description: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node]),
|
||
disabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
extensionId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
href: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
featured: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
hidden: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
iconMd5: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
iconRawURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
icons: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
baseLayerMD5: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
// 2.0 library format, TODO GH-5084
|
||
md5ext: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string // 3.0 library format
|
||
|
||
})),
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,
|
||
incompatibleWithScratch: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
insetIconURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
internetConnectionRequired: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isPlaying: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node]),
|
||
credits: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node])),
|
||
docsURI: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
samples: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
href: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
text: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
})),
|
||
favorite: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onFavorite: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onMouseEnter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onMouseLeave: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onSelect: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
showPlayButton: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(LibraryItem));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/list-monitor.jsx":
|
||
/*!*****************************************!*\
|
||
!*** ./src/containers/list-monitor.jsx ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _lib_touch_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/touch-utils */ "./src/lib/touch-utils.js");
|
||
/* harmony import */ var _lib_variable_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/variable-utils */ "./src/lib/variable-utils.js");
|
||
/* harmony import */ var _components_monitor_list_monitor_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/monitor/list-monitor.jsx */ "./src/components/monitor/list-monitor.jsx");
|
||
/* harmony import */ var immutable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! immutable */ "./node_modules/immutable/dist/immutable.js");
|
||
/* harmony import */ var immutable__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(immutable__WEBPACK_IMPORTED_MODULE_8__);
|
||
const _excluded = ["vm"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class ListMonitor extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleActivate', 'handleDeactivate', 'handleInput', 'handleRemove', 'handleKeyPress', 'handleFocus', 'handleAdd', 'handleResizeMouseDown']);
|
||
this.state = {
|
||
activeIndex: null,
|
||
activeValue: null,
|
||
width: props.width || 100,
|
||
height: props.height || 200
|
||
};
|
||
}
|
||
|
||
handleActivate(index) {
|
||
// Do nothing if activating the currently active item
|
||
if (this.state.activeIndex === index) {
|
||
return;
|
||
}
|
||
|
||
this.setState({
|
||
activeIndex: index,
|
||
activeValue: this.props.value[index]
|
||
});
|
||
}
|
||
|
||
handleDeactivate() {
|
||
// Submit any in-progress value edits on blur
|
||
if (this.state.activeIndex !== null) {
|
||
const {
|
||
vm,
|
||
targetId,
|
||
id: variableId
|
||
} = this.props;
|
||
const newListValue = Object(_lib_variable_utils__WEBPACK_IMPORTED_MODULE_6__["getVariableValue"])(vm, targetId, variableId);
|
||
newListValue[this.state.activeIndex] = this.state.activeValue;
|
||
Object(_lib_variable_utils__WEBPACK_IMPORTED_MODULE_6__["setVariableValue"])(vm, targetId, variableId, newListValue);
|
||
this.setState({
|
||
activeIndex: null,
|
||
activeValue: null
|
||
});
|
||
}
|
||
}
|
||
|
||
handleFocus(e) {
|
||
// Select all the text in the input when it is focused.
|
||
e.target.select();
|
||
}
|
||
|
||
handleKeyPress(e) {
|
||
// Special case for tab, arrow keys and enter.
|
||
// Tab / shift+tab navigate down / up the list.
|
||
// Arrow down / arrow up navigate down / up the list.
|
||
// Enter / shift+enter insert new blank item below / above.
|
||
const previouslyActiveIndex = this.state.activeIndex;
|
||
const {
|
||
vm,
|
||
targetId,
|
||
id: variableId
|
||
} = this.props;
|
||
let navigateDirection = 0;
|
||
if (e.key === 'Tab') navigateDirection = e.shiftKey ? -1 : 1;else if (e.key === 'ArrowUp') navigateDirection = -1;else if (e.key === 'ArrowDown') navigateDirection = 1;
|
||
|
||
if (navigateDirection) {
|
||
this.handleDeactivate(); // Submit in-progress edits
|
||
|
||
const newIndex = this.wrapListIndex(previouslyActiveIndex + navigateDirection, this.props.value.length);
|
||
this.setState({
|
||
activeIndex: newIndex,
|
||
activeValue: this.props.value[newIndex]
|
||
});
|
||
e.preventDefault(); // Stop default tab behavior, handled by this state change
|
||
} else if (e.key === 'Enter') {
|
||
this.handleDeactivate(); // Submit in-progress edits
|
||
|
||
const newListItemValue = ''; // Enter adds a blank item
|
||
|
||
const newValueOffset = e.shiftKey ? 0 : 1; // Shift-enter inserts above
|
||
|
||
const listValue = Object(_lib_variable_utils__WEBPACK_IMPORTED_MODULE_6__["getVariableValue"])(vm, targetId, variableId);
|
||
const newListValue = listValue.slice(0, previouslyActiveIndex + newValueOffset).concat([newListItemValue]).concat(listValue.slice(previouslyActiveIndex + newValueOffset));
|
||
Object(_lib_variable_utils__WEBPACK_IMPORTED_MODULE_6__["setVariableValue"])(vm, targetId, variableId, newListValue);
|
||
const newIndex = this.wrapListIndex(previouslyActiveIndex + newValueOffset, newListValue.length);
|
||
this.setState({
|
||
activeIndex: newIndex,
|
||
activeValue: newListItemValue
|
||
});
|
||
}
|
||
}
|
||
|
||
handleInput(e) {
|
||
this.setState({
|
||
activeValue: e.target.value
|
||
});
|
||
}
|
||
|
||
handleRemove(e) {
|
||
e.preventDefault(); // Default would blur input, prevent that.
|
||
|
||
e.stopPropagation(); // Bubbling would activate, which will be handled here
|
||
|
||
const {
|
||
vm,
|
||
targetId,
|
||
id: variableId
|
||
} = this.props;
|
||
const listValue = Object(_lib_variable_utils__WEBPACK_IMPORTED_MODULE_6__["getVariableValue"])(vm, targetId, variableId);
|
||
const newListValue = listValue.slice(0, this.state.activeIndex).concat(listValue.slice(this.state.activeIndex + 1));
|
||
Object(_lib_variable_utils__WEBPACK_IMPORTED_MODULE_6__["setVariableValue"])(vm, targetId, variableId, newListValue);
|
||
const newActiveIndex = Math.min(newListValue.length - 1, this.state.activeIndex);
|
||
this.setState({
|
||
activeIndex: newActiveIndex,
|
||
activeValue: newListValue[newActiveIndex]
|
||
});
|
||
}
|
||
|
||
handleAdd() {
|
||
// Add button appends a blank value and switches to it
|
||
const {
|
||
vm,
|
||
targetId,
|
||
id: variableId
|
||
} = this.props;
|
||
const newListValue = Object(_lib_variable_utils__WEBPACK_IMPORTED_MODULE_6__["getVariableValue"])(vm, targetId, variableId).concat(['']);
|
||
Object(_lib_variable_utils__WEBPACK_IMPORTED_MODULE_6__["setVariableValue"])(vm, targetId, variableId, newListValue);
|
||
this.setState({
|
||
activeIndex: newListValue.length - 1,
|
||
activeValue: ''
|
||
});
|
||
}
|
||
|
||
handleResizeMouseDown(e) {
|
||
this.initialPosition = Object(_lib_touch_utils__WEBPACK_IMPORTED_MODULE_5__["getEventXY"])(e);
|
||
this.initialWidth = this.state.width;
|
||
this.initialHeight = this.state.height;
|
||
|
||
const onMouseMove = ev => {
|
||
const newPosition = Object(_lib_touch_utils__WEBPACK_IMPORTED_MODULE_5__["getEventXY"])(ev);
|
||
const dx = newPosition.x - this.initialPosition.x;
|
||
const dy = newPosition.y - this.initialPosition.y;
|
||
this.setState({
|
||
width: Math.max(Math.min(this.initialWidth + dx, this.props.customStageSize.width), 100),
|
||
height: Math.max(Math.min(this.initialHeight + dy, this.props.customStageSize.height), 60)
|
||
});
|
||
};
|
||
|
||
const onMouseUp = ev => {
|
||
onMouseMove(ev); // Make sure width/height are up-to-date
|
||
|
||
window.removeEventListener('mousemove', onMouseMove);
|
||
window.removeEventListener('mouseup', onMouseUp);
|
||
this.props.vm.runtime.requestUpdateMonitor(Object(immutable__WEBPACK_IMPORTED_MODULE_8__["Map"])({
|
||
id: this.props.id,
|
||
height: this.state.height,
|
||
width: this.state.width
|
||
}));
|
||
};
|
||
|
||
window.addEventListener('mousemove', onMouseMove);
|
||
window.addEventListener('mouseup', onMouseUp);
|
||
}
|
||
|
||
wrapListIndex(index, length) {
|
||
return (index + length) % length;
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
vm
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_monitor_list_monitor_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], _extends({}, props, {
|
||
activeIndex: this.state.activeIndex,
|
||
activeValue: this.state.activeValue,
|
||
height: this.state.height,
|
||
width: this.state.width,
|
||
onActivate: this.handleActivate,
|
||
onAdd: this.handleAdd,
|
||
onDeactivate: this.handleDeactivate,
|
||
onFocus: this.handleFocus,
|
||
onInput: this.handleInput,
|
||
onKeyPress: this.handleKeyPress,
|
||
onRemove: this.handleRemove,
|
||
onResizeMouseDown: this.handleResizeMouseDown
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
ListMonitor.propTypes = {
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
customStageSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
}),
|
||
targetId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
value: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string]),
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_3___default.a),
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
x: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
y: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
customStageSize: state.scratchGui.customStageSize,
|
||
vm: state.scratchGui.vm
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_4__["connect"])(mapStateToProps)(ListMonitor));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/menu-bar-hoc.jsx":
|
||
/*!*****************************************!*\
|
||
!*** ./src/containers/menu-bar-hoc.jsx ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _sb3_downloader_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sb3-downloader.jsx */ "./src/containers/sb3-downloader.jsx");
|
||
const _excluded = ["projectChanged"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const MenuBarHOC = function MenuBarHOC(WrappedComponent) {
|
||
class MenuBarContainer extends react__WEBPACK_IMPORTED_MODULE_3___default.a.PureComponent {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['confirmReadyToReplaceProject', 'shouldSaveBeforeTransition']);
|
||
}
|
||
|
||
confirmReadyToReplaceProject(message) {
|
||
let readyToReplaceProject = true;
|
||
|
||
if (this.props.projectChanged && !this.props.canCreateNew) {
|
||
readyToReplaceProject = this.props.confirmWithMessage(message);
|
||
}
|
||
|
||
return readyToReplaceProject;
|
||
}
|
||
|
||
shouldSaveBeforeTransition() {
|
||
return this.props.canSave && this.props.projectChanged;
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
projectChanged
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_sb3_downloader_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], null, (_className, _downloadProject, extended) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(WrappedComponent, _extends({
|
||
confirmReadyToReplaceProject: this.confirmReadyToReplaceProject,
|
||
shouldSaveBeforeTransition: this.shouldSaveBeforeTransition,
|
||
handleSaveProject: extended.smartSave
|
||
}, props)));
|
||
}
|
||
|
||
}
|
||
|
||
MenuBarContainer.propTypes = {
|
||
canCreateNew: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
canSave: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
confirmWithMessage: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
projectChanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
MenuBarContainer.defaultProps = {
|
||
// default to using standard js confirm
|
||
confirmWithMessage: message => confirm(message) // eslint-disable-line no-alert
|
||
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
projectChanged: state.scratchGui.projectChanged
|
||
});
|
||
|
||
const mapDispatchToProps = () => ({}); // Allow incoming props to override redux-provided props. Used to mock in tests.
|
||
|
||
|
||
const mergeProps = (stateProps, dispatchProps, ownProps) => Object.assign({}, stateProps, dispatchProps, ownProps);
|
||
|
||
return Object(react_redux__WEBPACK_IMPORTED_MODULE_0__["connect"])(mapStateToProps, mapDispatchToProps, mergeProps)(MenuBarContainer);
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (MenuBarHOC);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/menu.jsx":
|
||
/*!*********************************!*\
|
||
!*** ./src/containers/menu.jsx ***!
|
||
\*********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/menu/menu.jsx */ "./src/components/menu/menu.jsx");
|
||
const _excluded = ["open", "children"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class Menu extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['addListeners', 'removeListeners', 'handleClick', 'ref']);
|
||
}
|
||
|
||
componentDidMount() {
|
||
if (this.props.open) this.addListeners();
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
if (this.props.open && !prevProps.open) this.addListeners();
|
||
if (!this.props.open && prevProps.open) this.removeListeners();
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.removeListeners();
|
||
}
|
||
|
||
addListeners() {
|
||
document.addEventListener('mouseup', this.handleClick);
|
||
}
|
||
|
||
removeListeners() {
|
||
document.removeEventListener('mouseup', this.handleClick);
|
||
}
|
||
|
||
handleClick(e) {
|
||
if (this.props.open && !this.menu.contains(e.target)) {
|
||
this.props.onRequestClose();
|
||
}
|
||
}
|
||
|
||
ref(c) {
|
||
this.menu = c;
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
open,
|
||
children
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
if (!open) return null;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_menu_menu_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({
|
||
componentRef: this.ref
|
||
}, props), children);
|
||
}
|
||
|
||
}
|
||
|
||
Menu.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node,
|
||
onRequestClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
open: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Menu);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/modal.jsx":
|
||
/*!**********************************!*\
|
||
!*** ./src/containers/modal.jsx ***!
|
||
\**********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _components_modal_modal_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/modal/modal.jsx */ "./src/components/modal/modal.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class Modal extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['addEventListeners', 'removeEventListeners', 'handlePopState', 'pushHistory']);
|
||
this.addEventListeners();
|
||
}
|
||
|
||
componentDidMount() {
|
||
// Add a history event only if it's not currently for our modal. This
|
||
// avoids polluting the history with many entries. We only need one.
|
||
this.pushHistory(this.id, history.state === null || history.state !== this.id);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.removeEventListeners();
|
||
}
|
||
|
||
addEventListeners() {
|
||
window.addEventListener('popstate', this.handlePopState);
|
||
}
|
||
|
||
removeEventListeners() {
|
||
window.removeEventListener('popstate', this.handlePopState);
|
||
}
|
||
|
||
handlePopState() {
|
||
// Whenever someone navigates, we want to be closed
|
||
this.props.onRequestClose();
|
||
}
|
||
|
||
get id() {
|
||
return "modal-".concat(this.props.id);
|
||
}
|
||
|
||
pushHistory(state, push) {
|
||
if (push) return history.pushState(state, this.id, null);
|
||
history.replaceState(state, this.id, null);
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_modal_modal_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], this.props);
|
||
}
|
||
|
||
}
|
||
|
||
Modal.propTypes = {
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onRequestClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onRequestOpen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
isRtl: state.locales.isRtl
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps)(Modal));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/monitor-list.jsx":
|
||
/*!*****************************************!*\
|
||
!*** ./src/containers/monitor-list.jsx ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_monitor_layout__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/monitor-layout */ "./src/reducers/monitor-layout.js");
|
||
/* harmony import */ var _lib_error_boundary_hoc_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/error-boundary-hoc.jsx */ "./src/lib/error-boundary-hoc.jsx");
|
||
/* harmony import */ var _lib_opcode_labels__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/opcode-labels */ "./src/lib/opcode-labels.js");
|
||
/* harmony import */ var _components_monitor_list_monitor_list_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/monitor-list/monitor-list.jsx */ "./src/components/monitor-list/monitor-list.jsx");
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class MonitorList extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleMonitorChange']);
|
||
_lib_opcode_labels__WEBPACK_IMPORTED_MODULE_7__["default"].setTranslatorFunction(props.intl.formatMessage);
|
||
this.state = {
|
||
key: 0
|
||
};
|
||
}
|
||
|
||
componentWillReceiveProps(nextProps) {
|
||
// TW: When stage size changes, we'll force all monitors to re-render completely
|
||
// This is important because the VM moves monitors after resize to preserve locations but
|
||
// Scratch's monitor layout logic is very complex and it won't notice that
|
||
if (this.props.customStageSize !== nextProps.customStageSize) {
|
||
this.props.resetMonitorLayout();
|
||
this.setState({
|
||
key: this.state.key + 1
|
||
});
|
||
}
|
||
}
|
||
|
||
handleMonitorChange(id, x, y) {
|
||
// eslint-disable-line no-unused-vars
|
||
this.props.moveMonitorRect(id, x, y);
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_monitor_list_monitor_list_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], _extends({
|
||
onMonitorChange: this.handleMonitorChange,
|
||
key: this.state.key
|
||
}, this.props));
|
||
}
|
||
|
||
}
|
||
|
||
MonitorList.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"].isRequired,
|
||
customStageSize: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.height
|
||
}),
|
||
monitorLayout: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({
|
||
monitors: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object,
|
||
// eslint-disable-line react/forbid-prop-types
|
||
savedMonitorPositions: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object // eslint-disable-line react/forbid-prop-types
|
||
|
||
}).isRequired,
|
||
moveMonitorRect: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
resetMonitorLayout: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
customStageSize: state.scratchGui.customStageSize,
|
||
monitors: state.scratchGui.monitors,
|
||
monitorLayout: state.scratchGui.monitorLayout
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
moveMonitorRect: (id, x, y) => dispatch(Object(_reducers_monitor_layout__WEBPACK_IMPORTED_MODULE_5__["moveMonitorRect"])(id, x, y)),
|
||
resetMonitorLayout: () => dispatch(Object(_reducers_monitor_layout__WEBPACK_IMPORTED_MODULE_5__["resetMonitorLayout"])())
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(_lib_error_boundary_hoc_jsx__WEBPACK_IMPORTED_MODULE_6__["default"])('Monitors')(Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_4__["connect"])(mapStateToProps, mapDispatchToProps)(MonitorList))));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/monitor.jsx":
|
||
/*!************************************!*\
|
||
!*** ./src/containers/monitor.jsx ***!
|
||
\************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _lib_monitor_adapter_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/monitor-adapter.js */ "./src/lib/monitor-adapter.js");
|
||
/* harmony import */ var _components_monitor_monitor_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/monitor/monitor.jsx */ "./src/components/monitor/monitor.jsx");
|
||
/* harmony import */ var _reducers_monitor_layout__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/monitor-layout */ "./src/reducers/monitor-layout.js");
|
||
/* harmony import */ var _lib_variable_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/variable-utils */ "./src/lib/variable-utils.js");
|
||
/* harmony import */ var _lib_import_csv__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../lib/import-csv */ "./src/lib/import-csv.js");
|
||
/* harmony import */ var _lib_download_blob__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../lib/download-blob */ "./src/lib/download-blob.js");
|
||
/* harmony import */ var _slider_prompt_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./slider-prompt.jsx */ "./src/containers/slider-prompt.jsx");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var immutable__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! immutable */ "./node_modules/immutable/dist/immutable.js");
|
||
/* harmony import */ var immutable__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(immutable__WEBPACK_IMPORTED_MODULE_12__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_13__);
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const availableModes = opcode => _components_monitor_monitor_jsx__WEBPACK_IMPORTED_MODULE_5__["monitorModes"].filter(t => {
|
||
if (opcode === 'data_variable') {
|
||
return t !== 'list';
|
||
} else if (opcode === 'data_listcontents') {
|
||
return t === 'list';
|
||
}
|
||
|
||
return t !== 'slider' && t !== 'list';
|
||
});
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
columnPrompt: {
|
||
"id": "gui.monitors.importListColumnPrompt",
|
||
"defaultMessage": "Which column should be used (1-{numberOfColumns})?"
|
||
}
|
||
});
|
||
|
||
class Monitor extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleDragEnd', 'handleHide', 'handleNextMode', 'handleSetModeToDefault', 'handleSetModeToLarge', 'handleSetModeToSlider', 'handleSliderPromptClose', 'handleSliderPromptOk', 'handleSliderPromptOpen', 'handleImport', 'handleExport', 'setElement']);
|
||
this.state = {
|
||
sliderPrompt: false
|
||
};
|
||
}
|
||
|
||
componentDidMount() {
|
||
let rect;
|
||
|
||
const isNum = num => typeof num === 'number' && !isNaN(num); // Load the VM provided position if not loaded already
|
||
// If a monitor has numbers for the x and y positions, load the saved position.
|
||
// Otherwise, auto-position the monitor.
|
||
|
||
|
||
if (isNum(this.props.x) && isNum(this.props.y) && !this.props.monitorLayout.savedMonitorPositions[this.props.id]) {
|
||
rect = {
|
||
upperStart: {
|
||
x: this.props.x,
|
||
y: this.props.y
|
||
},
|
||
lowerEnd: {
|
||
x: this.props.x + this.element.offsetWidth,
|
||
y: this.props.y + this.element.offsetHeight
|
||
}
|
||
};
|
||
this.props.addMonitorRect(this.props.id, rect, true
|
||
/* savePosition */
|
||
);
|
||
} else {
|
||
// Newly created user monitor
|
||
rect = Object(_reducers_monitor_layout__WEBPACK_IMPORTED_MODULE_6__["getInitialPosition"])(this.props.monitorLayout, this.props.id, this.element.offsetWidth, this.element.offsetHeight);
|
||
this.props.addMonitorRect(this.props.id, rect);
|
||
this.props.vm.runtime.requestUpdateMonitor(Object(immutable__WEBPACK_IMPORTED_MODULE_12__["Map"])({
|
||
id: this.props.id,
|
||
x: rect.upperStart.x,
|
||
y: rect.upperStart.y
|
||
}));
|
||
}
|
||
|
||
this.element.style.top = "".concat(rect.upperStart.y, "px");
|
||
this.element.style.left = "".concat(rect.upperStart.x, "px");
|
||
}
|
||
|
||
shouldComponentUpdate(nextProps, nextState) {
|
||
if (nextState !== this.state) {
|
||
return true;
|
||
}
|
||
|
||
for (const key of Object.getOwnPropertyNames(nextProps)) {
|
||
// Don't need to rerender when other monitors are moved.
|
||
// monitorLayout is only used during initial layout.
|
||
if (key !== 'monitorLayout' && nextProps[key] !== this.props[key]) {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
componentDidUpdate() {
|
||
// tw: if monitor is not draggable (ie. not in editor), do not calculate size of monitor for performance
|
||
if (!this.props.draggable) {
|
||
return;
|
||
}
|
||
|
||
this.props.resizeMonitorRect(this.props.id, this.element.offsetWidth, this.element.offsetHeight);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.props.removeMonitorRect(this.props.id);
|
||
}
|
||
|
||
handleDragEnd(e, {
|
||
x,
|
||
y
|
||
}) {
|
||
const newX = parseInt(this.element.style.left, 10) + x;
|
||
const newY = parseInt(this.element.style.top, 10) + y;
|
||
this.props.onDragEnd(this.props.id, newX, newY);
|
||
this.props.vm.runtime.requestUpdateMonitor(Object(immutable__WEBPACK_IMPORTED_MODULE_12__["Map"])({
|
||
id: this.props.id,
|
||
x: newX,
|
||
y: newY
|
||
}));
|
||
}
|
||
|
||
handleHide() {
|
||
this.props.vm.runtime.requestUpdateMonitor(Object(immutable__WEBPACK_IMPORTED_MODULE_12__["Map"])({
|
||
id: this.props.id,
|
||
visible: false
|
||
}));
|
||
}
|
||
|
||
handleNextMode() {
|
||
const modes = availableModes(this.props.opcode);
|
||
const modeIndex = modes.indexOf(this.props.mode);
|
||
const newMode = modes[(modeIndex + 1) % modes.length];
|
||
this.props.vm.runtime.requestUpdateMonitor(Object(immutable__WEBPACK_IMPORTED_MODULE_12__["Map"])({
|
||
id: this.props.id,
|
||
mode: newMode
|
||
}));
|
||
}
|
||
|
||
handleSetModeToDefault() {
|
||
this.props.vm.runtime.requestUpdateMonitor(Object(immutable__WEBPACK_IMPORTED_MODULE_12__["Map"])({
|
||
id: this.props.id,
|
||
mode: 'default'
|
||
}));
|
||
}
|
||
|
||
handleSetModeToLarge() {
|
||
this.props.vm.runtime.requestUpdateMonitor(Object(immutable__WEBPACK_IMPORTED_MODULE_12__["Map"])({
|
||
id: this.props.id,
|
||
mode: 'large'
|
||
}));
|
||
}
|
||
|
||
handleSetModeToSlider() {
|
||
this.props.vm.runtime.requestUpdateMonitor(Object(immutable__WEBPACK_IMPORTED_MODULE_12__["Map"])({
|
||
id: this.props.id,
|
||
mode: 'slider'
|
||
}));
|
||
}
|
||
|
||
handleSliderPromptClose() {
|
||
this.setState({
|
||
sliderPrompt: false
|
||
});
|
||
}
|
||
|
||
handleSliderPromptOpen() {
|
||
this.setState({
|
||
sliderPrompt: true
|
||
});
|
||
}
|
||
|
||
handleSliderPromptOk(min, max, isDiscrete) {
|
||
const realMin = Math.min(min, max);
|
||
const realMax = Math.max(min, max);
|
||
this.props.vm.runtime.requestUpdateMonitor(Object(immutable__WEBPACK_IMPORTED_MODULE_12__["Map"])({
|
||
id: this.props.id,
|
||
sliderMin: realMin,
|
||
sliderMax: realMax,
|
||
isDiscrete: isDiscrete
|
||
}));
|
||
this.handleSliderPromptClose();
|
||
}
|
||
|
||
setElement(monitorElt) {
|
||
this.element = monitorElt;
|
||
}
|
||
|
||
handleImport() {
|
||
Object(_lib_import_csv__WEBPACK_IMPORTED_MODULE_8__["default"])().then(async ({
|
||
rows,
|
||
text
|
||
}) => {
|
||
const numberOfColumns = rows[0].length;
|
||
let columnNumber = 1;
|
||
|
||
if (numberOfColumns > 1) {
|
||
const msg = this.props.intl.formatMessage(messages.columnPrompt, {
|
||
numberOfColumns
|
||
}); // prompt() returns Promise in desktop app
|
||
|
||
columnNumber = parseInt(await prompt(msg), 10); // eslint-disable-line no-alert
|
||
}
|
||
|
||
let newListValue;
|
||
|
||
if (isNaN(columnNumber) || numberOfColumns === 1) {
|
||
newListValue = text.replace(/\r/g, '').split('\n');
|
||
} else {
|
||
newListValue = rows.map(row => row[columnNumber - 1]).filter(item => typeof item === 'string'); // CSV importer can leave undefineds
|
||
}
|
||
|
||
const {
|
||
vm,
|
||
targetId,
|
||
id: variableId
|
||
} = this.props;
|
||
Object(_lib_variable_utils__WEBPACK_IMPORTED_MODULE_7__["setVariableValue"])(vm, targetId, variableId, newListValue);
|
||
});
|
||
}
|
||
|
||
handleExport() {
|
||
const {
|
||
vm,
|
||
targetId,
|
||
id: variableId
|
||
} = this.props;
|
||
const variable = Object(_lib_variable_utils__WEBPACK_IMPORTED_MODULE_7__["getVariable"])(vm, targetId, variableId);
|
||
const text = variable.value.join('\r\n');
|
||
const blob = new Blob([text], {
|
||
type: 'text/plain;charset=utf-8'
|
||
});
|
||
Object(_lib_download_blob__WEBPACK_IMPORTED_MODULE_9__["default"])("".concat(variable.name, ".txt"), blob);
|
||
}
|
||
|
||
render() {
|
||
const monitorProps = Object(_lib_monitor_adapter_js__WEBPACK_IMPORTED_MODULE_4__["default"])(this.props);
|
||
const showSliderOption = availableModes(this.props.opcode).indexOf('slider') !== -1;
|
||
const isList = this.props.mode === 'list';
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1___default.a.Fragment, null, this.state.sliderPrompt && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_slider_prompt_jsx__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
||
isDiscrete: this.props.isDiscrete,
|
||
maxValue: parseFloat(this.props.max),
|
||
minValue: parseFloat(this.props.min),
|
||
onCancel: this.handleSliderPromptClose,
|
||
onOk: this.handleSliderPromptOk
|
||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_monitor_monitor_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], _extends({
|
||
componentRef: this.setElement
|
||
}, monitorProps, {
|
||
opcode: this.props.opcode,
|
||
draggable: this.props.draggable,
|
||
height: this.props.height,
|
||
isDiscrete: this.props.isDiscrete,
|
||
max: this.props.max,
|
||
min: this.props.min,
|
||
mode: this.props.mode,
|
||
targetId: this.props.targetId,
|
||
width: this.props.width,
|
||
onDragEnd: this.handleDragEnd,
|
||
onExport: isList ? this.handleExport : null,
|
||
onImport: isList ? this.handleImport : null,
|
||
onHide: this.handleHide,
|
||
onNextMode: this.handleNextMode,
|
||
onSetModeToDefault: isList ? null : this.handleSetModeToDefault,
|
||
onSetModeToLarge: isList ? null : this.handleSetModeToLarge,
|
||
onSetModeToSlider: showSliderOption ? this.handleSetModeToSlider : null,
|
||
onSliderPromptOpen: this.handleSliderPromptOpen
|
||
})));
|
||
}
|
||
|
||
}
|
||
|
||
Monitor.propTypes = {
|
||
addMonitorRect: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
draggable: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string.isRequired,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"],
|
||
isDiscrete: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
max: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,
|
||
min: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,
|
||
mode: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(['default', 'slider', 'large', 'list']),
|
||
monitorLayout: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({
|
||
monitors: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object,
|
||
// eslint-disable-line react/forbid-prop-types
|
||
savedMonitorPositions: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object // eslint-disable-line react/forbid-prop-types
|
||
|
||
}).isRequired,
|
||
onDragEnd: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
opcode: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string.isRequired,
|
||
// eslint-disable-line react/no-unused-prop-types
|
||
params: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object,
|
||
// eslint-disable-line react/no-unused-prop-types, react/forbid-prop-types
|
||
removeMonitorRect: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
resizeMonitorRect: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
spriteName: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
// eslint-disable-line react/no-unused-prop-types
|
||
targetId: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
value: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number]))]),
|
||
// eslint-disable-line react/no-unused-prop-types
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_13___default.a),
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,
|
||
x: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,
|
||
y: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
monitorLayout: state.scratchGui.monitorLayout,
|
||
vm: state.scratchGui.vm
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
addMonitorRect: (id, rect, savePosition) => dispatch(Object(_reducers_monitor_layout__WEBPACK_IMPORTED_MODULE_6__["addMonitorRect"])(id, rect.upperStart, rect.lowerEnd, savePosition)),
|
||
resizeMonitorRect: (id, newWidth, newHeight) => dispatch(Object(_reducers_monitor_layout__WEBPACK_IMPORTED_MODULE_6__["resizeMonitorRect"])(id, newWidth, newHeight)),
|
||
removeMonitorRect: id => dispatch(Object(_reducers_monitor_layout__WEBPACK_IMPORTED_MODULE_6__["removeMonitorRect"])(id))
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_11__["connect"])(mapStateToProps, mapDispatchToProps)(Monitor)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/paint-editor-wrapper.jsx":
|
||
/*!*************************************************!*\
|
||
!*** ./src/containers/paint-editor-wrapper.jsx ***!
|
||
\*************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _lib_tw_scratch_paint__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/tw-scratch-paint */ "./src/lib/tw-scratch-paint.js");
|
||
/* harmony import */ var scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! scratch-svg-renderer */ "./node_modules/scratch-svg-renderer/src/index.js");
|
||
/* harmony import */ var scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _lib_error_boundary_hoc_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/error-boundary-hoc.jsx */ "./src/lib/error-boundary-hoc.jsx");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
const _excluded = ["selectedCostumeIndex", "vm"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class PaintEditorWrapper extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleUpdateImage', 'handleUpdateName', 'handleUpdateFonts']);
|
||
this.state = {
|
||
fonts: this.props.vm.runtime.fontManager.getFonts()
|
||
};
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.props.vm.runtime.fontManager.on('change', this.handleUpdateFonts);
|
||
}
|
||
|
||
shouldComponentUpdate(nextProps, nextState) {
|
||
return this.props.imageId !== nextProps.imageId || this.props.rtl !== nextProps.rtl || this.props.name !== nextProps.name || this.props.isDark !== nextProps.isDark || this.props.customStageSize !== nextProps.customStageSize || this.state.fonts !== nextState.fonts;
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.props.vm.runtime.fontManager.off('change', this.handleUpdateFonts);
|
||
}
|
||
|
||
handleUpdateFonts() {
|
||
this.setState({
|
||
fonts: this.props.vm.runtime.fontManager.getFonts()
|
||
});
|
||
}
|
||
|
||
handleUpdateName(name) {
|
||
this.props.vm.renameCostume(this.props.selectedCostumeIndex, name);
|
||
}
|
||
|
||
handleUpdateImage(isVector, image, rotationCenterX, rotationCenterY) {
|
||
if (isVector) {
|
||
this.props.vm.updateSvg(this.props.selectedCostumeIndex, image, rotationCenterX, rotationCenterY);
|
||
} else {
|
||
this.props.vm.updateBitmap(this.props.selectedCostumeIndex, image, rotationCenterX, rotationCenterY, 2
|
||
/* bitmapResolution */
|
||
);
|
||
}
|
||
}
|
||
|
||
render() {
|
||
if (!this.props.imageId) return null;
|
||
|
||
const _this$props = this.props,
|
||
{
|
||
selectedCostumeIndex,
|
||
vm
|
||
} = _this$props,
|
||
componentProps = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_lib_tw_scratch_paint__WEBPACK_IMPORTED_MODULE_4__["default"], _extends({}, componentProps, {
|
||
image: vm.getCostume(selectedCostumeIndex),
|
||
onUpdateImage: this.handleUpdateImage,
|
||
onUpdateName: this.handleUpdateName,
|
||
fontInlineFn: scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_5__["inlineSvgFonts"],
|
||
theme: this.props.isDark ? 'dark' : 'light',
|
||
customFonts: this.state.fonts,
|
||
width: this.props.customStageSize.width,
|
||
height: this.props.customStageSize.height
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
PaintEditorWrapper.propTypes = {
|
||
customStageSize: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.width,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
}),
|
||
onManageFonts: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
imageFormat: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
imageId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
isDark: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
rotationCenterX: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
rotationCenterY: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
rtl: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
selectedCostumeIndex: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number.isRequired,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_3___default.a)
|
||
};
|
||
|
||
const mapStateToProps = (state, {
|
||
selectedCostumeIndex
|
||
}) => {
|
||
const targetId = state.scratchGui.vm.editingTarget.id;
|
||
const sprite = state.scratchGui.vm.editingTarget.sprite; // Make sure the costume index doesn't go out of range.
|
||
|
||
const index = selectedCostumeIndex < sprite.costumes.length ? selectedCostumeIndex : sprite.costumes.length - 1;
|
||
const costume = state.scratchGui.vm.editingTarget.sprite.costumes[index];
|
||
return {
|
||
customStageSize: state.scratchGui.customStageSize,
|
||
name: costume && costume.name,
|
||
rotationCenterX: costume && costume.rotationCenterX,
|
||
rotationCenterY: costume && costume.rotationCenterY,
|
||
imageFormat: costume && costume.dataFormat,
|
||
imageId: targetId && "".concat(targetId).concat(costume.skinId),
|
||
rtl: state.locales.isRtl,
|
||
selectedCostumeIndex: index,
|
||
vm: state.scratchGui.vm,
|
||
zoomLevelId: targetId
|
||
};
|
||
};
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onManageFonts: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_7__["openFontsModal"])())
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(_lib_error_boundary_hoc_jsx__WEBPACK_IMPORTED_MODULE_6__["default"])('paint')(Object(react_redux__WEBPACK_IMPORTED_MODULE_8__["connect"])(mapStateToProps, mapDispatchToProps)(PaintEditorWrapper)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/play-button.jsx":
|
||
/*!****************************************!*\
|
||
!*** ./src/containers/play-button.jsx ***!
|
||
\****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_play_button_play_button_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/play-button/play-button.jsx */ "./src/components/play-button/play-button.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
class PlayButton extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleClick', 'handleMouseDown', 'handleMouseEnter', 'handleMouseLeave', 'handleTouchStart', 'setButtonRef']);
|
||
this.state = {
|
||
touchStarted: false
|
||
};
|
||
}
|
||
|
||
getDerivedStateFromProps(props, state) {
|
||
// if touchStarted is true and it's not playing, the sound must have ended.
|
||
// reset the touchStarted state to allow the sound to be replayed
|
||
if (state.touchStarted && !props.isPlaying) {
|
||
return {
|
||
touchStarted: false
|
||
};
|
||
}
|
||
|
||
return null; // nothing changed
|
||
}
|
||
|
||
componentDidMount() {
|
||
// Touch start
|
||
this.buttonRef.addEventListener('touchstart', this.handleTouchStart);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.buttonRef.removeEventListener('touchstart', this.handleTouchStart);
|
||
}
|
||
|
||
handleClick(e) {
|
||
// stop the click from propagating out of the button
|
||
e.stopPropagation();
|
||
}
|
||
|
||
handleMouseDown(e) {
|
||
// prevent default (focus) on mouseDown
|
||
e.preventDefault();
|
||
|
||
if (this.props.isPlaying) {
|
||
// stop sound and reset touch state
|
||
this.props.onStop();
|
||
if (this.state.touchstarted) this.setState({
|
||
touchStarted: false
|
||
});
|
||
} else {
|
||
this.props.onPlay();
|
||
|
||
if (this.state.touchstarted) {
|
||
// started on touch, but now clicked mouse
|
||
this.setState({
|
||
touchStarted: false
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
handleTouchStart(e) {
|
||
if (this.props.isPlaying) {
|
||
// If playing, stop sound, and reset touch state
|
||
e.preventDefault();
|
||
this.setState({
|
||
touchStarted: false
|
||
});
|
||
this.props.onStop();
|
||
} else {
|
||
// otherwise start playing, and set touch state
|
||
e.preventDefault();
|
||
this.setState({
|
||
touchStarted: true
|
||
});
|
||
this.props.onPlay();
|
||
}
|
||
}
|
||
|
||
handleMouseEnter(e) {
|
||
// start the sound if it's not already playing
|
||
e.preventDefault();
|
||
|
||
if (!this.props.isPlaying) {
|
||
this.props.onPlay();
|
||
}
|
||
}
|
||
|
||
handleMouseLeave() {
|
||
// stop the sound unless it was started by touch
|
||
if (this.props.isPlaying && !this.state.touchstarted) {
|
||
this.props.onStop();
|
||
}
|
||
}
|
||
|
||
setButtonRef(ref) {
|
||
this.buttonRef = ref;
|
||
}
|
||
|
||
render() {
|
||
const {
|
||
className,
|
||
isPlaying,
|
||
onPlay,
|
||
// eslint-disable-line no-unused-vars
|
||
onStop // eslint-disable-line no-unused-vars
|
||
|
||
} = this.props;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_play_button_play_button_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
className: className,
|
||
isPlaying: isPlaying,
|
||
onClick: this.handleClick,
|
||
onMouseDown: this.handleMouseDown,
|
||
onMouseEnter: this.handleMouseEnter,
|
||
onMouseLeave: this.handleMouseLeave,
|
||
setButtonRef: this.setButtonRef
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
PlayButton.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
isPlaying: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
onPlay: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onStop: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (PlayButton);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/playback-step.jsx":
|
||
/*!******************************************!*\
|
||
!*** ./src/containers/playback-step.jsx ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_record_modal_playback_step_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/record-modal/playback-step.jsx */ "./src/components/record-modal/playback-step.jsx");
|
||
/* harmony import */ var _lib_audio_audio_buffer_player_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/audio/audio-buffer-player.js */ "./src/lib/audio/audio-buffer-player.js");
|
||
const _excluded = ["sampleRate", "onPlay", "onStopPlaying", "onSetPlayhead"];
|
||
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class PlaybackStep extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handlePlay', 'handleStopPlaying']);
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.audioBufferPlayer = new _lib_audio_audio_buffer_player_js__WEBPACK_IMPORTED_MODULE_4__["default"](this.props.samples, this.props.sampleRate);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.audioBufferPlayer.stop();
|
||
}
|
||
|
||
handlePlay() {
|
||
this.audioBufferPlayer.play(this.props.trimStart, this.props.trimEnd, this.props.onSetPlayhead, this.props.onStopPlaying);
|
||
this.props.onPlay();
|
||
}
|
||
|
||
handleStopPlaying() {
|
||
this.audioBufferPlayer.stop();
|
||
this.props.onStopPlaying();
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
sampleRate,
|
||
// eslint-disable-line no-unused-vars
|
||
onPlay,
|
||
// eslint-disable-line no-unused-vars
|
||
onStopPlaying,
|
||
// eslint-disable-line no-unused-vars
|
||
onSetPlayhead
|
||
} = _this$props,
|
||
componentProps = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_record_modal_playback_step_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({
|
||
onPlay: this.handlePlay,
|
||
onStopPlaying: this.handleStopPlaying
|
||
}, componentProps));
|
||
}
|
||
|
||
}
|
||
|
||
PlaybackStep.propTypes = _objectSpread({
|
||
sampleRate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,
|
||
samples: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(Float32Array).isRequired
|
||
}, _components_record_modal_playback_step_jsx__WEBPACK_IMPORTED_MODULE_3__["default"].propTypes);
|
||
/* harmony default export */ __webpack_exports__["default"] = (PlaybackStep);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/project-watcher.jsx":
|
||
/*!********************************************!*\
|
||
!*** ./src/containers/project-watcher.jsx ***!
|
||
\********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../reducers/project-state */ "./src/reducers/project-state.js");
|
||
|
||
|
||
|
||
|
||
|
||
/**
|
||
* Watches for project to finish updating before taking some action.
|
||
*
|
||
* To use ProjectWatcher, pass it a callback function using the onDoneUpdating prop.
|
||
* ProjectWatcher passes a waitForUpdate function to its children, which they can call
|
||
* to set ProjectWatcher to request that it call the onDoneUpdating callback when
|
||
* project is no longer updating.
|
||
*/
|
||
|
||
class ProjectWatcher extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['waitForUpdate']);
|
||
this.state = {
|
||
waiting: false
|
||
};
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
if (this.state.waiting && this.props.isShowingWithId && !prevProps.isShowingWithId) {
|
||
this.fulfill();
|
||
}
|
||
}
|
||
|
||
fulfill() {
|
||
this.props.onDoneUpdating();
|
||
this.setState({
|
||
// eslint-disable-line react/no-did-update-set-state
|
||
waiting: false
|
||
});
|
||
}
|
||
|
||
waitForUpdate(isUpdating) {
|
||
if (isUpdating) {
|
||
this.setState({
|
||
waiting: true
|
||
});
|
||
} else {
|
||
// fulfill immediately
|
||
this.fulfill();
|
||
}
|
||
}
|
||
|
||
render() {
|
||
return this.props.children(this.waitForUpdate);
|
||
}
|
||
|
||
}
|
||
|
||
ProjectWatcher.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
isShowingWithId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onDoneUpdating: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
ProjectWatcher.defaultProps = {
|
||
onDoneUpdating: () => {}
|
||
};
|
||
|
||
const mapStateToProps = state => {
|
||
const loadingState = state.scratchGui.projectState.loadingState;
|
||
return {
|
||
isShowingWithId: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_4__["getIsShowingWithId"])(loadingState)
|
||
};
|
||
};
|
||
|
||
const mapDispatchToProps = () => ({});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(ProjectWatcher));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/prompt.jsx":
|
||
/*!***********************************!*\
|
||
!*** ./src/containers/prompt.jsx ***!
|
||
\***********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_prompt_prompt_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/prompt/prompt.jsx */ "./src/components/prompt/prompt.jsx");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _lib_tw_cloud_limits_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/tw-cloud-limits.js */ "./src/lib/tw-cloud-limits.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class Prompt extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleOk', 'handleScopeOptionSelection', 'handleCancel', 'handleChange', 'handleKeyPress', 'handleCloudVariableOptionChange']);
|
||
this.state = {
|
||
isAddingCloudVariableScratchSafe: props.vm && props.vm.runtime.getNumberOfCloudVariables() < _lib_tw_cloud_limits_js__WEBPACK_IMPORTED_MODULE_5__["SCRATCH_MAX_CLOUD_VARIABLES"] || false,
|
||
inputValue: '',
|
||
globalSelected: true,
|
||
cloudSelected: false,
|
||
canAddCloudVariable: props.vm && props.vm.runtime.canAddCloudVariable() || false
|
||
};
|
||
}
|
||
|
||
handleKeyPress(event) {
|
||
if (event.key === 'Enter') this.handleOk();
|
||
}
|
||
|
||
handleFocus(event) {
|
||
event.target.select();
|
||
}
|
||
|
||
handleOk() {
|
||
this.props.onOk(this.state.inputValue, {
|
||
scope: this.state.globalSelected ? 'global' : 'local',
|
||
isCloud: this.state.cloudSelected
|
||
});
|
||
}
|
||
|
||
handleCancel() {
|
||
this.props.onCancel();
|
||
}
|
||
|
||
handleChange(e) {
|
||
this.setState({
|
||
inputValue: e.target.value
|
||
});
|
||
}
|
||
|
||
handleScopeOptionSelection(e) {
|
||
this.setState({
|
||
globalSelected: e.target.value === 'global'
|
||
});
|
||
}
|
||
|
||
handleCloudVariableOptionChange(e) {
|
||
if (!this.props.showCloudOption) return;
|
||
const checked = e.target.checked;
|
||
this.setState({
|
||
cloudSelected: checked
|
||
});
|
||
|
||
if (checked) {
|
||
this.setState({
|
||
globalSelected: true
|
||
});
|
||
}
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_prompt_prompt_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
isAddingCloudVariableScratchSafe: this.state.isAddingCloudVariableScratchSafe,
|
||
canAddCloudVariable: this.state.canAddCloudVariable,
|
||
cloudSelected: this.state.cloudSelected,
|
||
defaultValue: this.props.defaultValue,
|
||
globalSelected: this.state.globalSelected,
|
||
isStage: this.props.isStage,
|
||
showListMessage: this.props.showListMessage,
|
||
label: this.props.label,
|
||
showCloudOption: this.props.showCloudOption,
|
||
showVariableOptions: this.props.showVariableOptions,
|
||
title: this.props.title,
|
||
onCancel: this.handleCancel,
|
||
onChange: this.handleChange,
|
||
onCloudVarOptionChange: this.handleCloudVariableOptionChange,
|
||
onFocus: this.handleFocus,
|
||
onKeyPress: this.handleKeyPress,
|
||
onOk: this.handleOk,
|
||
onScopeOptionSelection: this.handleScopeOptionSelection
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
Prompt.propTypes = {
|
||
defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
isStage: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
showListMessage: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
label: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
onCancel: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onOk: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
showCloudOption: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
showVariableOptions: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
title: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a)
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Prompt);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/question.jsx":
|
||
/*!*************************************!*\
|
||
!*** ./src/containers/question.jsx ***!
|
||
\*************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_question_question_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/question/question.jsx */ "./src/components/question/question.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
class Question extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleChange', 'handleKeyPress', 'handleSubmit']);
|
||
this.state = {
|
||
answer: ''
|
||
};
|
||
}
|
||
|
||
handleChange(e) {
|
||
this.setState({
|
||
answer: e.target.value
|
||
});
|
||
}
|
||
|
||
handleKeyPress(event) {
|
||
if (event.key === 'Enter') this.handleSubmit();
|
||
}
|
||
|
||
handleSubmit() {
|
||
this.props.onQuestionAnswered(this.state.answer);
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_question_question_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
answer: this.state.answer,
|
||
question: this.props.question,
|
||
onChange: this.handleChange,
|
||
onClick: this.handleSubmit,
|
||
onKeyPress: this.handleKeyPress
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
Question.propTypes = {
|
||
onQuestionAnswered: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
question: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Question);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/record-modal.jsx":
|
||
/*!*****************************************!*\
|
||
!*** ./src/containers/record-modal.jsx ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _lib_audio_audio_util_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/audio/audio-util.js */ "./src/lib/audio/audio-util.js");
|
||
/* harmony import */ var _components_record_modal_record_modal_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/record-modal/record-modal.jsx */ "./src/components/record-modal/record-modal.jsx");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class RecordModal extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleRecord', 'handleStopRecording', 'handlePlay', 'handleStopPlaying', 'handleBack', 'handleSubmit', 'handleCancel', 'handleSetPlayhead', 'handleSetTrimStart', 'handleSetTrimEnd']);
|
||
this.state = {
|
||
samples: null,
|
||
encoding: false,
|
||
levels: null,
|
||
playhead: null,
|
||
playing: false,
|
||
recording: false,
|
||
sampleRate: null,
|
||
trimStart: 0,
|
||
trimEnd: 1
|
||
};
|
||
}
|
||
|
||
handleRecord() {
|
||
this.setState({
|
||
recording: true
|
||
});
|
||
}
|
||
|
||
handleStopRecording(samples, sampleRate, levels, trimStart, trimEnd) {
|
||
if (samples.length > 0) {
|
||
this.setState({
|
||
samples,
|
||
sampleRate,
|
||
levels,
|
||
trimStart,
|
||
trimEnd,
|
||
recording: false
|
||
});
|
||
}
|
||
}
|
||
|
||
handlePlay() {
|
||
this.setState({
|
||
playing: true
|
||
});
|
||
}
|
||
|
||
handleStopPlaying() {
|
||
this.setState({
|
||
playing: false,
|
||
playhead: null
|
||
});
|
||
}
|
||
|
||
handleBack() {
|
||
this.setState({
|
||
playing: false,
|
||
samples: null
|
||
});
|
||
}
|
||
|
||
handleSetTrimEnd(trimEnd) {
|
||
this.setState({
|
||
trimEnd
|
||
});
|
||
}
|
||
|
||
handleSetTrimStart(trimStart) {
|
||
this.setState({
|
||
trimStart
|
||
});
|
||
}
|
||
|
||
handleSetPlayhead(playhead) {
|
||
this.setState({
|
||
playhead
|
||
});
|
||
}
|
||
|
||
handleSubmit() {
|
||
this.setState({
|
||
encoding: true
|
||
}, () => {
|
||
const sampleCount = this.state.samples.length;
|
||
const startIndex = Math.floor(this.state.trimStart * sampleCount);
|
||
const endIndex = Math.floor(this.state.trimEnd * sampleCount);
|
||
const clippedSamples = this.state.samples.slice(startIndex, endIndex);
|
||
Object(_lib_audio_audio_util_js__WEBPACK_IMPORTED_MODULE_5__["encodeAndAddSoundToVM"])(this.props.vm, clippedSamples, this.state.sampleRate, 'recording1', () => {
|
||
this.props.onClose();
|
||
this.props.onNewSound();
|
||
});
|
||
});
|
||
}
|
||
|
||
handleCancel() {
|
||
this.props.onClose();
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_record_modal_record_modal_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
encoding: this.state.encoding,
|
||
levels: this.state.levels,
|
||
playhead: this.state.playhead,
|
||
playing: this.state.playing,
|
||
recording: this.state.recording,
|
||
sampleRate: this.state.sampleRate,
|
||
samples: this.state.samples,
|
||
trimEnd: this.state.trimEnd,
|
||
trimStart: this.state.trimStart,
|
||
onBack: this.handleBack,
|
||
onCancel: this.handleCancel,
|
||
onPlay: this.handlePlay,
|
||
onRecord: this.handleRecord,
|
||
onSetPlayhead: this.handleSetPlayhead,
|
||
onSetTrimEnd: this.handleSetTrimEnd,
|
||
onSetTrimStart: this.handleSetTrimStart,
|
||
onStopPlaying: this.handleStopPlaying,
|
||
onStopRecording: this.handleStopRecording,
|
||
onSubmit: this.handleSubmit
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
RecordModal.propTypes = {
|
||
onClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onNewSound: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_3___default.a)
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
vm: state.scratchGui.vm
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onClose: () => {
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_7__["closeSoundRecorder"])());
|
||
}
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_4__["connect"])(mapStateToProps, mapDispatchToProps)(RecordModal));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/recording-step.jsx":
|
||
/*!*******************************************!*\
|
||
!*** ./src/containers/recording-step.jsx ***!
|
||
\*******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_record_modal_recording_step_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/record-modal/recording-step.jsx */ "./src/components/record-modal/recording-step.jsx");
|
||
/* harmony import */ var _lib_audio_audio_recorder_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/audio/audio-recorder.js */ "./src/lib/audio/audio-recorder.js");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _lib_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/log */ "./src/lib/log.js");
|
||
const _excluded = ["onRecord", "onStopRecording"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_5__["defineMessages"])({
|
||
alertMsg: {
|
||
"id": "gui.recordingStep.alertMsg",
|
||
"defaultMessage": "Could not start recording"
|
||
}
|
||
});
|
||
|
||
class RecordingStep extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleRecord', 'handleStopRecording', 'handleStarted', 'handleLevelUpdate', 'handleRecordingError']);
|
||
this.state = {
|
||
listening: false,
|
||
level: 0,
|
||
levels: null
|
||
};
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.audioRecorder = new _lib_audio_audio_recorder_js__WEBPACK_IMPORTED_MODULE_4__["default"]();
|
||
this.audioRecorder.startListening(this.handleStarted, this.handleLevelUpdate, this.handleRecordingError);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.audioRecorder.dispose();
|
||
}
|
||
|
||
handleStarted() {
|
||
this.setState({
|
||
listening: true
|
||
});
|
||
}
|
||
|
||
handleRecordingError(error) {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_6__["default"].error(error);
|
||
alert(this.props.intl.formatMessage(messages.alertMsg)); // eslint-disable-line no-alert
|
||
}
|
||
|
||
handleLevelUpdate(level) {
|
||
this.setState({
|
||
level: level,
|
||
levels: this.props.recording ? (this.state.levels || []).concat([level]) : this.state.levels
|
||
});
|
||
}
|
||
|
||
handleRecord() {
|
||
this.audioRecorder.startRecording();
|
||
this.props.onRecord();
|
||
}
|
||
|
||
handleStopRecording() {
|
||
const {
|
||
samples,
|
||
sampleRate,
|
||
levels,
|
||
trimStart,
|
||
trimEnd
|
||
} = this.audioRecorder.stop();
|
||
this.props.onStopRecording(samples, sampleRate, levels, trimStart, trimEnd);
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
onRecord,
|
||
// eslint-disable-line no-unused-vars
|
||
onStopRecording
|
||
} = _this$props,
|
||
componentProps = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_record_modal_recording_step_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({
|
||
level: this.state.level,
|
||
levels: this.state.levels,
|
||
listening: this.state.listening,
|
||
onRecord: this.handleRecord,
|
||
onStopRecording: this.handleStopRecording
|
||
}, componentProps));
|
||
}
|
||
|
||
}
|
||
|
||
RecordingStep.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_5__["intlShape"].isRequired,
|
||
onRecord: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onStopRecording: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
recording: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_5__["injectIntl"])(RecordingStep));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/sb3-downloader.jsx":
|
||
/*!*******************************************!*\
|
||
!*** ./src/containers/sb3-downloader.jsx ***!
|
||
\*******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_project_title__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../reducers/project-title */ "./src/reducers/project-title.js");
|
||
/* harmony import */ var _lib_download_blob__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/download-blob */ "./src/lib/download-blob.js");
|
||
/* harmony import */ var _reducers_project_changed__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/project-changed */ "./src/reducers/project-changed.js");
|
||
/* harmony import */ var _reducers_alerts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/alerts */ "./src/reducers/alerts.js");
|
||
/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../reducers/tw */ "./src/reducers/tw.js");
|
||
/* harmony import */ var _lib_tw_filesystem_api__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../lib/tw-filesystem-api */ "./src/lib/tw-filesystem-api.js");
|
||
/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../reducers/project-state */ "./src/reducers/project-state.js");
|
||
/* harmony import */ var _lib_log__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../lib/log */ "./src/lib/log.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// from sb-file-uploader-hoc.jsx
|
||
|
||
const getProjectTitleFromFilename = fileInputFilename => {
|
||
if (!fileInputFilename) return ''; // only parse title with valid scratch project extensions
|
||
// (.sb, .sb2, and .sb3)
|
||
|
||
const matches = fileInputFilename.match(/^(.*)\.sb[23]?$/);
|
||
if (!matches) return '';
|
||
return matches[1].substring(0, 100); // truncate project title to max 100 chars
|
||
};
|
||
/**
|
||
* @param {Uint8Array[]} arrays List of byte arrays
|
||
* @returns {number} Total length of the arrays
|
||
*/
|
||
|
||
|
||
const getLengthOfByteArrays = arrays => {
|
||
let length = 0;
|
||
|
||
for (let i = 0; i < arrays.length; i++) {
|
||
length += arrays[i].byteLength;
|
||
}
|
||
|
||
return length;
|
||
};
|
||
/**
|
||
* @param {Uint8Array[]} arrays List of byte arrays
|
||
* @returns {Uint8Array} One big array containing all of the little arrays in order.
|
||
*/
|
||
|
||
|
||
const concatenateByteArrays = arrays => {
|
||
const totalLength = getLengthOfByteArrays(arrays);
|
||
const newArray = new Uint8Array(totalLength);
|
||
let p = 0;
|
||
|
||
for (let i = 0; i < arrays.length; i++) {
|
||
newArray.set(arrays[i], p);
|
||
p += arrays[i].byteLength;
|
||
}
|
||
|
||
return newArray;
|
||
};
|
||
/**
|
||
* Project saver component passes a downloadProject function to its child.
|
||
* It expects this child to be a function with the signature
|
||
* function (downloadProject, props) {}
|
||
* The component can then be used to attach project saving functionality
|
||
* to any other component:
|
||
*
|
||
* <SB3Downloader>{(downloadProject, props) => (
|
||
* <MyCoolComponent
|
||
* onClick={downloadProject}
|
||
* {...props}
|
||
* />
|
||
* )}</SB3Downloader>
|
||
*/
|
||
|
||
|
||
class SB3Downloader extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['downloadProject', 'saveAsNew', 'saveToLastFile', 'saveToLastFileOrNew']);
|
||
}
|
||
|
||
startedSaving() {
|
||
this.props.onShowSavingAlert();
|
||
}
|
||
|
||
finishedSaving() {
|
||
this.props.onProjectUnchanged();
|
||
this.props.onShowSaveSuccessAlert();
|
||
|
||
if (this.props.onSaveFinished) {
|
||
this.props.onSaveFinished();
|
||
}
|
||
}
|
||
|
||
downloadProject() {
|
||
if (!this.props.canSaveProject) {
|
||
return;
|
||
}
|
||
|
||
this.startedSaving();
|
||
this.props.saveProjectSb3().then(content => {
|
||
this.finishedSaving();
|
||
Object(_lib_download_blob__WEBPACK_IMPORTED_MODULE_5__["default"])(this.props.projectFilename, content);
|
||
});
|
||
}
|
||
|
||
async saveAsNew() {
|
||
if (!this.props.canSaveProject) {
|
||
return;
|
||
}
|
||
|
||
try {
|
||
const handle = await _lib_tw_filesystem_api__WEBPACK_IMPORTED_MODULE_9__["default"].showSaveFilePicker(this.props.projectFilename);
|
||
await this.saveToHandle(handle);
|
||
this.props.onSetFileHandle(handle);
|
||
const title = getProjectTitleFromFilename(handle.name);
|
||
|
||
if (title) {
|
||
this.props.onSetProjectTitle(title);
|
||
}
|
||
} catch (e) {
|
||
this.handleSaveError(e);
|
||
}
|
||
}
|
||
|
||
async saveToLastFile() {
|
||
try {
|
||
await this.saveToHandle(this.props.fileHandle);
|
||
} catch (e) {
|
||
this.handleSaveError(e);
|
||
}
|
||
}
|
||
|
||
saveToLastFileOrNew() {
|
||
if (this.props.fileHandle) {
|
||
return this.saveToLastFile();
|
||
}
|
||
|
||
return this.saveAsNew();
|
||
}
|
||
|
||
async saveToHandle(handle) {
|
||
if (!this.props.canSaveProject) {
|
||
return;
|
||
}
|
||
|
||
const writable = await handle.createWritable();
|
||
this.startedSaving();
|
||
await new Promise((resolve, reject) => {
|
||
// Projects can be very large, so we'll utilize JSZip's stream API to avoid having the
|
||
// entire sb3 in memory at the same time.
|
||
const jszipStream = this.props.saveProjectSb3Stream();
|
||
const abortController = new AbortController();
|
||
jszipStream.on('error', error => {
|
||
abortController.abort(error);
|
||
}); // JSZip's stream pause() and resume() methods are not necessarily completely no-ops
|
||
// if they are already paused or resumed. These also make it easier to add debug
|
||
// logging of when we actually pause or resume.
|
||
// Note that JSZip will keep sending some data after you ask it to pause.
|
||
|
||
let jszipStreamRunning = false;
|
||
|
||
const pauseJSZipStream = () => {
|
||
if (jszipStreamRunning) {
|
||
jszipStreamRunning = false;
|
||
jszipStream.pause();
|
||
}
|
||
};
|
||
|
||
const resumeJSZipStream = () => {
|
||
if (!jszipStreamRunning) {
|
||
jszipStreamRunning = true;
|
||
jszipStream.resume();
|
||
}
|
||
}; // Allow the JSZip stream to run quite a bit ahead of file writing. This helps
|
||
// reduce zip stream pauses on systems with high latency storage.
|
||
|
||
|
||
const HIGH_WATER_MARK_BYTES = 1024 * 1024 * 5; // Minimum size of buffer to pass into write(). Small buffers will be queued and
|
||
// written in batches as they reach or exceed this size.
|
||
|
||
const WRITE_BUFFER_TARGET_SIZE_BYTES = 1024 * 1024;
|
||
const zipStream = new ReadableStream({
|
||
start: controller => {
|
||
jszipStream.on('data', data => {
|
||
controller.enqueue(data);
|
||
|
||
if (controller.desiredSize <= 0) {
|
||
pauseJSZipStream();
|
||
}
|
||
});
|
||
jszipStream.on('end', () => {
|
||
controller.close();
|
||
});
|
||
resumeJSZipStream();
|
||
},
|
||
pull: () => {
|
||
resumeJSZipStream();
|
||
},
|
||
cancel: () => {
|
||
pauseJSZipStream();
|
||
}
|
||
}, new ByteLengthQueuingStrategy({
|
||
highWaterMark: HIGH_WATER_MARK_BYTES
|
||
}));
|
||
const queuedChunks = [];
|
||
const fileStream = new WritableStream({
|
||
write: chunk => {
|
||
queuedChunks.push(chunk);
|
||
const currentSize = getLengthOfByteArrays(queuedChunks);
|
||
|
||
if (currentSize >= WRITE_BUFFER_TARGET_SIZE_BYTES) {
|
||
const newBuffer = concatenateByteArrays(queuedChunks);
|
||
queuedChunks.length = 0;
|
||
return writable.write(newBuffer);
|
||
} // Otherwise wait for more data
|
||
|
||
},
|
||
close: async () => {
|
||
// Write the last batch of data.
|
||
const lastBuffer = concatenateByteArrays(queuedChunks);
|
||
|
||
if (lastBuffer.byteLength) {
|
||
await writable.write(lastBuffer);
|
||
} // File handle must be closed at the end to actually save the file.
|
||
|
||
|
||
await writable.close();
|
||
},
|
||
abort: async () => {
|
||
await writable.abort();
|
||
}
|
||
});
|
||
zipStream.pipeTo(fileStream, {
|
||
signal: abortController.signal
|
||
}).then(() => {
|
||
this.finishedSaving();
|
||
resolve();
|
||
}).catch(error => {
|
||
reject(error);
|
||
});
|
||
});
|
||
}
|
||
|
||
handleSaveError(e) {
|
||
// AbortError can happen when someone cancels the file selector dialog
|
||
if (e && e.name === 'AbortError') {
|
||
return;
|
||
}
|
||
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_11__["default"].error(e);
|
||
this.props.onShowSaveErrorAlert();
|
||
}
|
||
|
||
render() {
|
||
const {
|
||
children
|
||
} = this.props;
|
||
return children(this.props.className, this.downloadProject, _lib_tw_filesystem_api__WEBPACK_IMPORTED_MODULE_9__["default"].available() ? {
|
||
available: true,
|
||
name: this.props.fileHandle ? this.props.fileHandle.name : null,
|
||
saveAsNew: this.saveAsNew,
|
||
saveToLastFile: this.saveToLastFile,
|
||
saveToLastFileOrNew: this.saveToLastFileOrNew,
|
||
smartSave: this.saveToLastFileOrNew
|
||
} : {
|
||
available: false,
|
||
smartSave: this.downloadProject
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
const getProjectFilename = (curTitle, defaultTitle) => {
|
||
let filenameTitle = curTitle;
|
||
|
||
if (!filenameTitle || filenameTitle.length === 0) {
|
||
filenameTitle = defaultTitle;
|
||
}
|
||
|
||
return "".concat(filenameTitle.substring(0, 100), ".sb3");
|
||
};
|
||
|
||
SB3Downloader.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
fileHandle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string
|
||
}),
|
||
onSaveFinished: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
projectFilename: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
saveProjectSb3: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
saveProjectSb3Stream: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
canSaveProject: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onSetFileHandle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onSetProjectTitle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onShowSavingAlert: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onShowSaveSuccessAlert: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onShowSaveErrorAlert: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onProjectUnchanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
SB3Downloader.defaultProps = {
|
||
className: ''
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
fileHandle: state.scratchGui.tw.fileHandle,
|
||
saveProjectSb3: state.scratchGui.vm.saveProjectSb3.bind(state.scratchGui.vm),
|
||
saveProjectSb3Stream: state.scratchGui.vm.saveProjectSb3Stream.bind(state.scratchGui.vm),
|
||
canSaveProject: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_10__["getIsShowingProject"])(state.scratchGui.projectState.loadingState),
|
||
projectFilename: getProjectFilename(state.scratchGui.projectTitle, _reducers_project_title__WEBPACK_IMPORTED_MODULE_4__["projectTitleInitialState"])
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onSetFileHandle: fileHandle => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_8__["setFileHandle"])(fileHandle)),
|
||
onSetProjectTitle: title => dispatch(Object(_reducers_project_title__WEBPACK_IMPORTED_MODULE_4__["setProjectTitle"])(title)),
|
||
onShowSavingAlert: () => Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_7__["showAlertWithTimeout"])(dispatch, 'saving'),
|
||
onShowSaveSuccessAlert: () => Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_7__["showAlertWithTimeout"])(dispatch, 'twSaveToDiskSuccess'),
|
||
onShowSaveErrorAlert: () => dispatch(Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_7__["showStandardAlert"])('savingError')),
|
||
onProjectUnchanged: () => dispatch(Object(_reducers_project_changed__WEBPACK_IMPORTED_MODULE_6__["setProjectUnchanged"])())
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(SB3Downloader));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/scanning-step.jsx":
|
||
/*!******************************************!*\
|
||
!*** ./src/containers/scanning-step.jsx ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_connection_modal_scanning_step_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/connection-modal/scanning-step.jsx */ "./src/components/connection-modal/scanning-step.jsx");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class ScanningStep extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handlePeripheralListUpdate', 'handlePeripheralScanTimeout', 'handleRefresh']);
|
||
this.state = {
|
||
scanning: true,
|
||
peripheralList: []
|
||
};
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.props.vm.scanForPeripheral(this.props.extensionId);
|
||
this.props.vm.on('PERIPHERAL_LIST_UPDATE', this.handlePeripheralListUpdate);
|
||
this.props.vm.on('PERIPHERAL_SCAN_TIMEOUT', this.handlePeripheralScanTimeout);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
// @todo: stop the peripheral scan here
|
||
this.props.vm.removeListener('PERIPHERAL_LIST_UPDATE', this.handlePeripheralListUpdate);
|
||
this.props.vm.removeListener('PERIPHERAL_SCAN_TIMEOUT', this.handlePeripheralScanTimeout);
|
||
}
|
||
|
||
handlePeripheralScanTimeout() {
|
||
this.setState({
|
||
scanning: false,
|
||
peripheralList: []
|
||
});
|
||
}
|
||
|
||
handlePeripheralListUpdate(newList) {
|
||
// TODO: sort peripherals by signal strength? so they don't jump around
|
||
const peripheralArray = Object.keys(newList).map(id => newList[id]);
|
||
this.setState({
|
||
peripheralList: peripheralArray
|
||
});
|
||
}
|
||
|
||
handleRefresh() {
|
||
this.props.vm.scanForPeripheral(this.props.extensionId);
|
||
this.setState({
|
||
scanning: true,
|
||
peripheralList: []
|
||
});
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_connection_modal_scanning_step_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
connectionSmallIconURL: this.props.connectionSmallIconURL,
|
||
peripheralList: this.state.peripheralList,
|
||
phase: this.state.phase,
|
||
scanning: this.state.scanning,
|
||
title: this.props.extensionId,
|
||
onConnected: this.props.onConnected,
|
||
onConnecting: this.props.onConnecting,
|
||
onRefresh: this.handleRefresh
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
ScanningStep.propTypes = {
|
||
connectionSmallIconURL: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
extensionId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired,
|
||
onConnected: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onConnecting: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a).isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (ScanningStep);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/slider-monitor.jsx":
|
||
/*!*******************************************!*\
|
||
!*** ./src/containers/slider-monitor.jsx ***!
|
||
\*******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _lib_variable_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/variable-utils */ "./src/lib/variable-utils.js");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _components_monitor_slider_monitor_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/monitor/slider-monitor.jsx */ "./src/components/monitor/slider-monitor.jsx");
|
||
const _excluded = ["vm", "value"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class SliderMonitor extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleSliderUpdate']);
|
||
this.state = {
|
||
value: props.value
|
||
};
|
||
}
|
||
|
||
componentWillReceiveProps(nextProps) {
|
||
if (this.state.value !== nextProps.value) {
|
||
this.setState({
|
||
value: nextProps.value
|
||
});
|
||
}
|
||
}
|
||
|
||
handleSliderUpdate(e) {
|
||
this.setState({
|
||
value: Number(e.target.value)
|
||
});
|
||
const {
|
||
vm,
|
||
targetId,
|
||
id: variableId
|
||
} = this.props;
|
||
Object(_lib_variable_utils__WEBPACK_IMPORTED_MODULE_4__["setVariableValue"])(vm, targetId, variableId, Number(e.target.value));
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
vm,
|
||
// eslint-disable-line no-unused-vars
|
||
value
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_monitor_slider_monitor_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], _extends({}, props, {
|
||
value: this.state.value,
|
||
onSliderUpdate: this.handleSliderUpdate
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
SliderMonitor.propTypes = {
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
targetId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
value: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string]),
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_3___default.a)
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
vm: state.scratchGui.vm
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_5__["connect"])(mapStateToProps)(SliderMonitor));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/slider-prompt.jsx":
|
||
/*!******************************************!*\
|
||
!*** ./src/containers/slider-prompt.jsx ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_slider_prompt_slider_prompt_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/slider-prompt/slider-prompt.jsx */ "./src/components/slider-prompt/slider-prompt.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
class SliderPrompt extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleOk', 'handleCancel', 'handleChangeMin', 'handleChangeMax', 'handleKeyPress', 'validates', 'shouldBeDiscrete']);
|
||
const {
|
||
isDiscrete,
|
||
minValue,
|
||
maxValue
|
||
} = this.props;
|
||
this.state = {
|
||
// For internal use, convert values to strings based on isDiscrete
|
||
// This is because `<input />` always returns values as strings.
|
||
minValue: isDiscrete ? minValue.toFixed(0) : minValue.toFixed(2),
|
||
maxValue: isDiscrete ? maxValue.toFixed(0) : maxValue.toFixed(2)
|
||
};
|
||
}
|
||
|
||
handleKeyPress(event) {
|
||
if (event.key === 'Enter') this.handleOk();
|
||
}
|
||
|
||
handleOk() {
|
||
const {
|
||
minValue,
|
||
maxValue
|
||
} = this.state;
|
||
|
||
if (!this.validates(minValue, maxValue)) {
|
||
this.props.onCancel();
|
||
return;
|
||
}
|
||
|
||
this.props.onOk(parseFloat(minValue), parseFloat(maxValue), this.shouldBeDiscrete(minValue, maxValue));
|
||
}
|
||
|
||
handleCancel() {
|
||
this.props.onCancel();
|
||
}
|
||
|
||
handleChangeMin(e) {
|
||
this.setState({
|
||
minValue: e.target.value
|
||
});
|
||
}
|
||
|
||
handleChangeMax(e) {
|
||
this.setState({
|
||
maxValue: e.target.value
|
||
});
|
||
}
|
||
|
||
shouldBeDiscrete(min, max) {
|
||
return min.indexOf('.') + max.indexOf('.') === -2; // Both -1
|
||
}
|
||
|
||
validates(min, max) {
|
||
return isFinite(min) && isFinite(max);
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_slider_prompt_slider_prompt_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||
maxValue: this.state.maxValue,
|
||
minValue: this.state.minValue,
|
||
onCancel: this.handleCancel,
|
||
onChangeMax: this.handleChangeMax,
|
||
onChangeMin: this.handleChangeMin,
|
||
onKeyPress: this.handleKeyPress,
|
||
onOk: this.handleOk
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
SliderPrompt.propTypes = {
|
||
isDiscrete: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
maxValue: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
minValue: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
onCancel: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onOk: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired
|
||
};
|
||
SliderPrompt.defaultProps = {
|
||
maxValue: 100,
|
||
minValue: 0,
|
||
isDiscrete: true
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (SliderPrompt);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/sound-editor.jsx":
|
||
/*!*****************************************!*\
|
||
!*** ./src/containers/sound-editor.jsx ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var wav_encoder__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! wav-encoder */ "./node_modules/wav-encoder/index.js");
|
||
/* harmony import */ var wav_encoder__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(wav_encoder__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _lib_audio_audio_util_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/audio/audio-util.js */ "./src/lib/audio/audio-util.js");
|
||
/* harmony import */ var _lib_audio_audio_effects_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/audio/audio-effects.js */ "./src/lib/audio/audio-effects.js");
|
||
/* harmony import */ var _components_sound_editor_sound_editor_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/sound-editor/sound-editor.jsx */ "./src/components/sound-editor/sound-editor.jsx");
|
||
/* harmony import */ var _lib_audio_audio_buffer_player_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../lib/audio/audio-buffer-player.js */ "./src/lib/audio/audio-buffer-player.js");
|
||
/* harmony import */ var _lib_log_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../lib/log.js */ "./src/lib/log.js");
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const UNDO_STACK_SIZE = 99;
|
||
const MAX_RMS = 1.2;
|
||
|
||
class SoundEditor extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['copy', 'copyCurrentBuffer', 'handleCopyToNew', 'handleStoppedPlaying', 'handleChangeName', 'handlePlay', 'handleStopPlaying', 'handleUpdatePlayhead', 'handleDelete', 'handleUpdateTrim', 'handleEffect', 'handleUndo', 'handleRedo', 'submitNewSamples', 'handleCopy', 'handlePaste', 'paste', 'handleKeyPress', 'handleContainerClick', 'setRef', 'resampleBufferToRate']);
|
||
this.state = {
|
||
copyBuffer: null,
|
||
chunkLevels: Object(_lib_audio_audio_util_js__WEBPACK_IMPORTED_MODULE_6__["computeChunkedRMS"])(this.props.samples),
|
||
playhead: null,
|
||
// null is not playing, [0 -> 1] is playing percent
|
||
trimStart: null,
|
||
trimEnd: null
|
||
};
|
||
this.redoStack = [];
|
||
this.undoStack = [];
|
||
this.ref = null;
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.audioBufferPlayer = new _lib_audio_audio_buffer_player_js__WEBPACK_IMPORTED_MODULE_9__["default"](this.props.samples, this.props.sampleRate);
|
||
document.addEventListener('keydown', this.handleKeyPress);
|
||
}
|
||
|
||
componentWillReceiveProps(newProps) {
|
||
if (newProps.soundId !== this.props.soundId) {
|
||
// A different sound has been selected
|
||
this.redoStack = [];
|
||
this.undoStack = [];
|
||
this.resetState(newProps.samples, newProps.sampleRate);
|
||
this.setState({
|
||
trimStart: null,
|
||
trimEnd: null
|
||
});
|
||
}
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.audioBufferPlayer.stop();
|
||
document.removeEventListener('keydown', this.handleKeyPress);
|
||
}
|
||
|
||
handleKeyPress(event) {
|
||
if (event.target instanceof HTMLInputElement) {
|
||
// Ignore keyboard shortcuts if a text input field is focused
|
||
return;
|
||
}
|
||
|
||
if (this.props.isFullScreen) {
|
||
// Ignore keyboard shortcuts if the stage is fullscreen mode
|
||
return;
|
||
}
|
||
|
||
if (event.key === ' ') {
|
||
event.preventDefault();
|
||
|
||
if (this.state.playhead) {
|
||
this.handleStopPlaying();
|
||
} else {
|
||
this.handlePlay();
|
||
}
|
||
}
|
||
|
||
if (event.key === 'Delete' || event.key === 'Backspace') {
|
||
event.preventDefault();
|
||
|
||
if (event.shiftKey) {
|
||
this.handleDeleteInverse();
|
||
} else {
|
||
this.handleDelete();
|
||
}
|
||
}
|
||
|
||
if (event.key === 'Escape') {
|
||
event.preventDefault();
|
||
this.handleUpdateTrim(null, null);
|
||
}
|
||
|
||
if (event.metaKey || event.ctrlKey) {
|
||
if (event.shiftKey && event.key.toLowerCase() === 'z') {
|
||
event.preventDefault();
|
||
|
||
if (this.redoStack.length > 0) {
|
||
this.handleRedo();
|
||
}
|
||
} else if (event.key === 'z') {
|
||
if (this.undoStack.length > 0) {
|
||
event.preventDefault();
|
||
this.handleUndo();
|
||
}
|
||
} else if (event.key === 'c') {
|
||
event.preventDefault();
|
||
this.handleCopy();
|
||
} else if (event.key === 'v') {
|
||
event.preventDefault();
|
||
this.handlePaste();
|
||
} else if (event.key === 'a') {
|
||
event.preventDefault();
|
||
this.handleUpdateTrim(0, 1);
|
||
}
|
||
}
|
||
}
|
||
|
||
resetState(samples, sampleRate) {
|
||
this.audioBufferPlayer.stop();
|
||
this.audioBufferPlayer = new _lib_audio_audio_buffer_player_js__WEBPACK_IMPORTED_MODULE_9__["default"](samples, sampleRate);
|
||
this.setState({
|
||
chunkLevels: Object(_lib_audio_audio_util_js__WEBPACK_IMPORTED_MODULE_6__["computeChunkedRMS"])(samples),
|
||
playhead: null
|
||
});
|
||
}
|
||
|
||
submitNewSamples(samples, sampleRate, skipUndo) {
|
||
return Object(_lib_audio_audio_util_js__WEBPACK_IMPORTED_MODULE_6__["downsampleIfNeeded"])({
|
||
samples,
|
||
sampleRate
|
||
}, this.resampleBufferToRate).then(({
|
||
samples: newSamples,
|
||
sampleRate: newSampleRate
|
||
}) => wav_encoder__WEBPACK_IMPORTED_MODULE_3___default.a.encode({
|
||
sampleRate: newSampleRate,
|
||
channelData: [newSamples]
|
||
}).then(wavBuffer => {
|
||
if (!skipUndo) {
|
||
this.redoStack = [];
|
||
|
||
if (this.undoStack.length >= UNDO_STACK_SIZE) {
|
||
this.undoStack.shift(); // Drop the first element off the array
|
||
}
|
||
|
||
this.undoStack.push(this.getUndoItem());
|
||
}
|
||
|
||
this.resetState(newSamples, newSampleRate);
|
||
this.props.vm.updateSoundBuffer(this.props.soundIndex, this.audioBufferPlayer.buffer, new Uint8Array(wavBuffer));
|
||
return true; // Edit was successful
|
||
})).catch(e => {
|
||
// Encoding failed, or the sound was too large to save so edit is rejected
|
||
_lib_log_js__WEBPACK_IMPORTED_MODULE_10__["default"].error("Encountered error while trying to encode sound update: ".concat(e.message));
|
||
return false; // Edit was not applied
|
||
});
|
||
}
|
||
|
||
handlePlay() {
|
||
this.audioBufferPlayer.stop();
|
||
this.audioBufferPlayer.play(this.state.trimStart || 0, this.state.trimEnd || 1, this.handleUpdatePlayhead, this.handleStoppedPlaying);
|
||
}
|
||
|
||
handleStopPlaying() {
|
||
this.audioBufferPlayer.stop();
|
||
this.handleStoppedPlaying();
|
||
}
|
||
|
||
handleStoppedPlaying() {
|
||
this.setState({
|
||
playhead: null
|
||
});
|
||
}
|
||
|
||
handleUpdatePlayhead(playhead) {
|
||
this.setState({
|
||
playhead
|
||
});
|
||
}
|
||
|
||
handleChangeName(name) {
|
||
this.props.vm.renameSound(this.props.soundIndex, name);
|
||
}
|
||
|
||
handleDelete() {
|
||
const {
|
||
samples,
|
||
sampleRate
|
||
} = this.copyCurrentBuffer();
|
||
const sampleCount = samples.length;
|
||
const startIndex = Math.floor(this.state.trimStart * sampleCount);
|
||
const endIndex = Math.floor(this.state.trimEnd * sampleCount);
|
||
const firstPart = samples.slice(0, startIndex);
|
||
const secondPart = samples.slice(endIndex, sampleCount);
|
||
const newLength = firstPart.length + secondPart.length;
|
||
let newSamples;
|
||
|
||
if (newLength === 0) {
|
||
newSamples = new Float32Array(1);
|
||
} else {
|
||
newSamples = new Float32Array(newLength);
|
||
newSamples.set(firstPart, 0);
|
||
newSamples.set(secondPart, firstPart.length);
|
||
}
|
||
|
||
this.submitNewSamples(newSamples, sampleRate).then(() => {
|
||
this.setState({
|
||
trimStart: null,
|
||
trimEnd: null
|
||
});
|
||
});
|
||
}
|
||
|
||
handleDeleteInverse() {
|
||
// Delete everything outside of the trimmers
|
||
const {
|
||
samples,
|
||
sampleRate
|
||
} = this.copyCurrentBuffer();
|
||
const sampleCount = samples.length;
|
||
const startIndex = Math.floor(this.state.trimStart * sampleCount);
|
||
const endIndex = Math.floor(this.state.trimEnd * sampleCount);
|
||
let clippedSamples = samples.slice(startIndex, endIndex);
|
||
|
||
if (clippedSamples.length === 0) {
|
||
clippedSamples = new Float32Array(1);
|
||
}
|
||
|
||
this.submitNewSamples(clippedSamples, sampleRate).then(success => {
|
||
if (success) {
|
||
this.setState({
|
||
trimStart: null,
|
||
trimEnd: null
|
||
});
|
||
}
|
||
});
|
||
}
|
||
|
||
handleUpdateTrim(trimStart, trimEnd) {
|
||
this.setState({
|
||
trimStart,
|
||
trimEnd
|
||
});
|
||
this.handleStopPlaying();
|
||
}
|
||
|
||
effectFactory(name) {
|
||
return () => this.handleEffect(name);
|
||
}
|
||
|
||
copyCurrentBuffer() {
|
||
// Cannot reliably use props.samples because it gets detached by Firefox
|
||
return {
|
||
samples: this.audioBufferPlayer.buffer.getChannelData(0),
|
||
sampleRate: this.audioBufferPlayer.buffer.sampleRate
|
||
};
|
||
}
|
||
|
||
handleEffect(name) {
|
||
const trimStart = this.state.trimStart === null ? 0.0 : this.state.trimStart;
|
||
const trimEnd = this.state.trimEnd === null ? 1.0 : this.state.trimEnd; // Offline audio context needs at least 2 samples
|
||
|
||
if (this.audioBufferPlayer.buffer.length < 2) {
|
||
return;
|
||
}
|
||
|
||
const effects = new _lib_audio_audio_effects_js__WEBPACK_IMPORTED_MODULE_7__["default"](this.audioBufferPlayer.buffer, name, trimStart, trimEnd);
|
||
effects.process((renderedBuffer, adjustedTrimStart, adjustedTrimEnd) => {
|
||
const samples = renderedBuffer.getChannelData(0);
|
||
const sampleRate = renderedBuffer.sampleRate;
|
||
this.submitNewSamples(samples, sampleRate).then(success => {
|
||
if (success) {
|
||
if (this.state.trimStart === null) {
|
||
this.handlePlay();
|
||
} else {
|
||
this.setState({
|
||
trimStart: adjustedTrimStart,
|
||
trimEnd: adjustedTrimEnd
|
||
}, this.handlePlay);
|
||
}
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
tooLoud() {
|
||
const numChunks = this.state.chunkLevels.length;
|
||
const startIndex = this.state.trimStart === null ? 0 : Math.floor(this.state.trimStart * numChunks);
|
||
const endIndex = this.state.trimEnd === null ? numChunks - 1 : Math.ceil(this.state.trimEnd * numChunks);
|
||
const trimChunks = this.state.chunkLevels.slice(startIndex, endIndex);
|
||
let max = 0;
|
||
|
||
for (const i of trimChunks) {
|
||
if (i > max) {
|
||
max = i;
|
||
}
|
||
}
|
||
|
||
return max > MAX_RMS;
|
||
}
|
||
|
||
getUndoItem() {
|
||
return _objectSpread(_objectSpread({}, this.copyCurrentBuffer()), {}, {
|
||
trimStart: this.state.trimStart,
|
||
trimEnd: this.state.trimEnd
|
||
});
|
||
}
|
||
|
||
handleUndo() {
|
||
this.redoStack.push(this.getUndoItem());
|
||
const {
|
||
samples,
|
||
sampleRate,
|
||
trimStart,
|
||
trimEnd
|
||
} = this.undoStack.pop();
|
||
|
||
if (samples) {
|
||
return this.submitNewSamples(samples, sampleRate, true).then(success => {
|
||
if (success) {
|
||
this.setState({
|
||
trimStart: trimStart,
|
||
trimEnd: trimEnd
|
||
}, this.handlePlay);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
handleRedo() {
|
||
const {
|
||
samples,
|
||
sampleRate,
|
||
trimStart,
|
||
trimEnd
|
||
} = this.redoStack.pop();
|
||
|
||
if (samples) {
|
||
this.undoStack.push(this.getUndoItem());
|
||
return this.submitNewSamples(samples, sampleRate, true).then(success => {
|
||
if (success) {
|
||
this.setState({
|
||
trimStart: trimStart,
|
||
trimEnd: trimEnd
|
||
}, this.handlePlay);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
handleCopy() {
|
||
this.copy();
|
||
}
|
||
|
||
copy(callback) {
|
||
const trimStart = this.state.trimStart === null ? 0.0 : this.state.trimStart;
|
||
const trimEnd = this.state.trimEnd === null ? 1.0 : this.state.trimEnd;
|
||
const newCopyBuffer = this.copyCurrentBuffer();
|
||
const trimStartSamples = trimStart * newCopyBuffer.samples.length;
|
||
const trimEndSamples = trimEnd * newCopyBuffer.samples.length;
|
||
newCopyBuffer.samples = newCopyBuffer.samples.slice(trimStartSamples, trimEndSamples);
|
||
this.setState({
|
||
copyBuffer: newCopyBuffer
|
||
}, callback);
|
||
}
|
||
|
||
handleCopyToNew() {
|
||
this.copy(() => {
|
||
Object(_lib_audio_audio_util_js__WEBPACK_IMPORTED_MODULE_6__["encodeAndAddSoundToVM"])(this.props.vm, this.state.copyBuffer.samples, this.state.copyBuffer.sampleRate, this.props.name);
|
||
});
|
||
}
|
||
|
||
resampleBufferToRate(buffer, newRate) {
|
||
return new Promise((resolve, reject) => {
|
||
const sampleRateRatio = newRate / buffer.sampleRate;
|
||
const newLength = sampleRateRatio * buffer.samples.length;
|
||
let offlineContext; // Try to use either OfflineAudioContext or webkitOfflineAudioContext to resample
|
||
// The constructors will throw if trying to resample at an unsupported rate
|
||
// (e.g. Safari/webkitOAC does not support lower than 44khz).
|
||
|
||
try {
|
||
if (window.OfflineAudioContext) {
|
||
offlineContext = new window.OfflineAudioContext(1, newLength, newRate);
|
||
} else if (window.webkitOfflineAudioContext) {
|
||
offlineContext = new window.webkitOfflineAudioContext(1, newLength, newRate);
|
||
}
|
||
} catch (_unused) {
|
||
// If no OAC available and downsampling by 2, downsample by dropping every other sample.
|
||
if (newRate === buffer.sampleRate / 2) {
|
||
return resolve(Object(_lib_audio_audio_util_js__WEBPACK_IMPORTED_MODULE_6__["dropEveryOtherSample"])(buffer));
|
||
}
|
||
|
||
return reject(new Error('Could not resample'));
|
||
}
|
||
|
||
const source = offlineContext.createBufferSource();
|
||
const audioBuffer = offlineContext.createBuffer(1, buffer.samples.length, buffer.sampleRate);
|
||
audioBuffer.getChannelData(0).set(buffer.samples);
|
||
source.buffer = audioBuffer;
|
||
source.connect(offlineContext.destination);
|
||
source.start();
|
||
offlineContext.startRendering();
|
||
|
||
offlineContext.oncomplete = ({
|
||
renderedBuffer
|
||
}) => {
|
||
resolve({
|
||
samples: renderedBuffer.getChannelData(0),
|
||
sampleRate: newRate
|
||
});
|
||
};
|
||
});
|
||
}
|
||
|
||
paste() {
|
||
// If there's no selection, paste at the end of the sound
|
||
const {
|
||
samples
|
||
} = this.copyCurrentBuffer();
|
||
|
||
if (this.state.trimStart === null) {
|
||
const newLength = samples.length + this.state.copyBuffer.samples.length;
|
||
const newSamples = new Float32Array(newLength);
|
||
newSamples.set(samples, 0);
|
||
newSamples.set(this.state.copyBuffer.samples, samples.length);
|
||
this.submitNewSamples(newSamples, this.props.sampleRate, false).then(success => {
|
||
if (success) {
|
||
this.handlePlay();
|
||
}
|
||
});
|
||
} else {
|
||
// else replace the selection with the pasted sound
|
||
const trimStartSamples = this.state.trimStart * samples.length;
|
||
const trimEndSamples = this.state.trimEnd * samples.length;
|
||
const firstPart = samples.slice(0, trimStartSamples);
|
||
const lastPart = samples.slice(trimEndSamples);
|
||
const newLength = firstPart.length + this.state.copyBuffer.samples.length + lastPart.length;
|
||
const newSamples = new Float32Array(newLength);
|
||
newSamples.set(firstPart, 0);
|
||
newSamples.set(this.state.copyBuffer.samples, firstPart.length);
|
||
newSamples.set(lastPart, firstPart.length + this.state.copyBuffer.samples.length);
|
||
const trimStartSeconds = trimStartSamples / this.props.sampleRate;
|
||
const trimEndSeconds = trimStartSeconds + this.state.copyBuffer.samples.length / this.state.copyBuffer.sampleRate;
|
||
const newDurationSeconds = newSamples.length / this.state.copyBuffer.sampleRate;
|
||
const adjustedTrimStart = trimStartSeconds / newDurationSeconds;
|
||
const adjustedTrimEnd = trimEndSeconds / newDurationSeconds;
|
||
this.submitNewSamples(newSamples, this.props.sampleRate, false).then(success => {
|
||
if (success) {
|
||
this.setState({
|
||
trimStart: adjustedTrimStart,
|
||
trimEnd: adjustedTrimEnd
|
||
}, this.handlePlay);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
handlePaste() {
|
||
if (!this.state.copyBuffer) return;
|
||
|
||
if (this.state.copyBuffer.sampleRate === this.props.sampleRate) {
|
||
this.paste();
|
||
} else {
|
||
this.resampleBufferToRate(this.state.copyBuffer, this.props.sampleRate).then(buffer => {
|
||
this.setState({
|
||
copyBuffer: buffer
|
||
}, this.paste);
|
||
});
|
||
}
|
||
}
|
||
|
||
setRef(element) {
|
||
this.ref = element;
|
||
}
|
||
|
||
handleContainerClick(e) {
|
||
// If the click is on the sound editor's div (and not any other element), delesect
|
||
if (e.target === this.ref && this.state.trimStart !== null) {
|
||
this.handleUpdateTrim(null, null);
|
||
}
|
||
}
|
||
|
||
render() {
|
||
const {
|
||
effectTypes
|
||
} = _lib_audio_audio_effects_js__WEBPACK_IMPORTED_MODULE_7__["default"];
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_sound_editor_sound_editor_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], {
|
||
isStereo: this.props.isStereo,
|
||
duration: this.props.duration,
|
||
size: this.props.size,
|
||
sampleRate: this.props.sampleRate,
|
||
canPaste: this.state.copyBuffer !== null,
|
||
canRedo: this.redoStack.length > 0,
|
||
canUndo: this.undoStack.length > 0,
|
||
chunkLevels: this.state.chunkLevels,
|
||
name: this.props.name,
|
||
playhead: this.state.playhead,
|
||
setRef: this.setRef,
|
||
tooLoud: this.tooLoud(),
|
||
trimEnd: this.state.trimEnd,
|
||
trimStart: this.state.trimStart,
|
||
onChangeName: this.handleChangeName,
|
||
onContainerClick: this.handleContainerClick,
|
||
onCopy: this.handleCopy,
|
||
onCopyToNew: this.handleCopyToNew,
|
||
onDelete: this.handleDelete,
|
||
onEcho: this.effectFactory(effectTypes.ECHO),
|
||
onFadeIn: this.effectFactory(effectTypes.FADEIN),
|
||
onFadeOut: this.effectFactory(effectTypes.FADEOUT),
|
||
onFaster: this.effectFactory(effectTypes.FASTER),
|
||
onLouder: this.effectFactory(effectTypes.LOUDER),
|
||
onMute: this.effectFactory(effectTypes.MUTE),
|
||
onPaste: this.handlePaste,
|
||
onPlay: this.handlePlay,
|
||
onRedo: this.handleRedo,
|
||
onReverse: this.effectFactory(effectTypes.REVERSE),
|
||
onRobot: this.effectFactory(effectTypes.ROBOT),
|
||
onSetTrim: this.handleUpdateTrim,
|
||
onSlower: this.effectFactory(effectTypes.SLOWER),
|
||
onSofter: this.effectFactory(effectTypes.SOFTER),
|
||
onStop: this.handleStopPlaying,
|
||
onUndo: this.handleUndo
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
SoundEditor.propTypes = {
|
||
isStereo: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
duration: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
size: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
isFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,
|
||
sampleRate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
samples: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(Float32Array),
|
||
soundId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
soundIndex: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a).isRequired
|
||
};
|
||
|
||
const mapStateToProps = (state, {
|
||
soundIndex
|
||
}) => {
|
||
const sprite = state.scratchGui.vm.editingTarget.sprite; // Make sure the sound index doesn't go out of range.
|
||
|
||
const index = soundIndex < sprite.sounds.length ? soundIndex : sprite.sounds.length - 1;
|
||
const sound = state.scratchGui.vm.editingTarget.sprite.sounds[index];
|
||
const audioBuffer = state.scratchGui.vm.getSoundBuffer(index);
|
||
return {
|
||
isStereo: audioBuffer.numberOfChannels !== 1,
|
||
duration: sound.sampleCount / sound.rate,
|
||
size: sound.asset ? sound.asset.data.byteLength : 0,
|
||
soundId: sound.soundId,
|
||
sampleRate: audioBuffer.sampleRate,
|
||
samples: audioBuffer.getChannelData(0),
|
||
isFullScreen: state.scratchGui.mode.isFullScreen,
|
||
name: sound.name,
|
||
vm: state.scratchGui.vm
|
||
};
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_5__["connect"])(mapStateToProps)(SoundEditor));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/sound-library.jsx":
|
||
/*!******************************************!*\
|
||
!*** ./src/containers/sound-library.jsx ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var scratch_audio__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! scratch-audio */ "./node_modules/scratch-audio/src/index.js");
|
||
/* harmony import */ var scratch_audio__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(scratch_audio__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _components_library_library_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/library/library.jsx */ "./src/components/library/library.jsx");
|
||
/* harmony import */ var _components_library_item_lib_icon_sound_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/library-item/lib-icon--sound.svg */ "./src/components/library-item/lib-icon--sound.svg");
|
||
/* harmony import */ var _components_library_item_lib_icon_sound_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_components_library_item_lib_icon_sound_svg__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _components_library_item_lib_icon_sound_rtl_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/library-item/lib-icon--sound-rtl.svg */ "./src/components/library-item/lib-icon--sound-rtl.svg");
|
||
/* harmony import */ var _components_library_item_lib_icon_sound_rtl_svg__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_components_library_item_lib_icon_sound_rtl_svg__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var _lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../lib/libraries/tw-async-libraries */ "./src/lib/libraries/tw-async-libraries.js");
|
||
/* harmony import */ var _lib_libraries_sound_tags__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../lib/libraries/sound-tags */ "./src/lib/libraries/sound-tags.js");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
const _excluded = ["md5ext"];
|
||
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
libraryTitle: {
|
||
"id": "gui.soundLibrary.chooseASound",
|
||
"defaultMessage": "Choose a Sound"
|
||
}
|
||
}); // @todo need to use this hack to avoid library using md5 for image
|
||
|
||
const getSoundLibraryThumbnailData = (soundLibraryContent, isRtl) => soundLibraryContent.map(sound => {
|
||
const {
|
||
md5ext
|
||
} = sound,
|
||
otherData = _objectWithoutProperties(sound, _excluded);
|
||
|
||
return _objectSpread({
|
||
_md5: md5ext,
|
||
rawURL: isRtl ? _components_library_item_lib_icon_sound_rtl_svg__WEBPACK_IMPORTED_MODULE_8___default.a : _components_library_item_lib_icon_sound_svg__WEBPACK_IMPORTED_MODULE_7___default.a
|
||
}, otherData);
|
||
});
|
||
|
||
class SoundLibrary extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleItemSelected', 'handleItemMouseEnter', 'handleItemMouseLeave', 'onStop', 'setStopHandler']);
|
||
/**
|
||
* AudioEngine that will decode and play sounds for us.
|
||
* @type {AudioEngine}
|
||
*/
|
||
|
||
this.audioEngine = null;
|
||
/**
|
||
* A promise for the sound queued to play as soon as it loads and
|
||
* decodes.
|
||
* @type {Promise<SoundPlayer>}
|
||
*/
|
||
|
||
this.playingSoundPromise = null;
|
||
/**
|
||
* function to call when the sound ends
|
||
*/
|
||
|
||
this.handleStop = null;
|
||
const soundLibrary = Object(_lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_9__["getSoundLibrary"])();
|
||
this.data = Array.isArray(soundLibrary) ? getSoundLibraryThumbnailData(soundLibrary, this.props.isRtl) : soundLibrary.then(data => getSoundLibraryThumbnailData(data, this.props.isRtl));
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.audioEngine = new scratch_audio__WEBPACK_IMPORTED_MODULE_5___default.a();
|
||
this.playingSoundPromise = null;
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.stopPlayingSound();
|
||
}
|
||
|
||
onStop() {
|
||
if (this.playingSoundPromise !== null) {
|
||
this.playingSoundPromise.then(soundPlayer => soundPlayer && soundPlayer.removeListener('stop', this.onStop));
|
||
if (this.handleStop) this.handleStop();
|
||
}
|
||
}
|
||
|
||
setStopHandler(func) {
|
||
this.handleStop = func;
|
||
}
|
||
|
||
stopPlayingSound() {
|
||
// Playback is queued, playing, or has played recently and finished
|
||
// normally.
|
||
if (this.playingSoundPromise !== null) {
|
||
// Forcing sound to stop, so stop listening for sound ending:
|
||
this.playingSoundPromise.then(soundPlayer => soundPlayer && soundPlayer.removeListener('stop', this.onStop)); // Queued playback began playing before this method.
|
||
|
||
if (this.playingSoundPromise.isPlaying) {
|
||
// Fetch the player from the promise and stop playback soon.
|
||
this.playingSoundPromise.then(soundPlayer => {
|
||
soundPlayer.stop();
|
||
});
|
||
} else {
|
||
// Fetch the player from the promise and stop immediately. Since
|
||
// the sound is not playing yet, this callback will be called
|
||
// immediately after the sound starts playback. Stopping it
|
||
// immediately will have the effect of no sound being played.
|
||
this.playingSoundPromise.then(soundPlayer => {
|
||
if (soundPlayer) soundPlayer.stopImmediately();
|
||
});
|
||
} // No further work should be performed on this promise and its
|
||
// soundPlayer.
|
||
|
||
|
||
this.playingSoundPromise = null;
|
||
}
|
||
}
|
||
|
||
handleItemMouseEnter(soundItem) {
|
||
const md5ext = soundItem._md5;
|
||
const idParts = md5ext.split('.');
|
||
const md5 = idParts[0];
|
||
const vm = this.props.vm; // In case enter is called twice without a corresponding leave
|
||
// inbetween, stop the last playback before queueing a new sound.
|
||
|
||
this.stopPlayingSound(); // Save the promise so code to stop the sound may queue the stop
|
||
// instruction after the play instruction.
|
||
|
||
this.playingSoundPromise = vm.runtime.storage.load(vm.runtime.storage.AssetType.Sound, md5).then(soundAsset => {
|
||
if (soundAsset) {
|
||
const sound = {
|
||
md5: md5ext,
|
||
name: soundItem.name,
|
||
format: soundItem.format,
|
||
data: soundAsset.data
|
||
};
|
||
return this.audioEngine.decodeSoundPlayer(sound).then(soundPlayer => {
|
||
soundPlayer.connect(this.audioEngine); // Play the sound. Playing the sound will always come before a
|
||
// paired stop if the sound must stop early.
|
||
|
||
soundPlayer.play();
|
||
soundPlayer.addListener('stop', this.onStop); // Set that the sound is playing. This affects the type of stop
|
||
// instruction given if the sound must stop early.
|
||
|
||
if (this.playingSoundPromise !== null) {
|
||
this.playingSoundPromise.isPlaying = true;
|
||
}
|
||
|
||
return soundPlayer;
|
||
});
|
||
}
|
||
});
|
||
}
|
||
|
||
handleItemMouseLeave() {
|
||
this.stopPlayingSound();
|
||
}
|
||
|
||
handleItemSelected(soundItem) {
|
||
const vmSound = {
|
||
format: soundItem.format,
|
||
md5: soundItem._md5,
|
||
rate: soundItem.rate,
|
||
sampleCount: soundItem.sampleCount,
|
||
name: soundItem.name
|
||
};
|
||
this.props.vm.addSound(vmSound).then(() => {
|
||
this.props.onNewSound();
|
||
});
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_library_library_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||
showPlayButton: true,
|
||
data: this.data,
|
||
id: "soundLibrary",
|
||
setStopHandler: this.setStopHandler,
|
||
tags: _lib_libraries_sound_tags__WEBPACK_IMPORTED_MODULE_10__["default"],
|
||
title: this.props.intl.formatMessage(messages.libraryTitle),
|
||
onItemMouseEnter: this.handleItemMouseEnter,
|
||
onItemMouseLeave: this.handleItemMouseLeave,
|
||
onItemSelected: this.handleItemSelected,
|
||
onRequestClose: this.props.onRequestClose
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
SoundLibrary.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"].isRequired,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onNewSound: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onRequestClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a).isRequired
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
isRtl: state.locales.isRtl
|
||
});
|
||
|
||
const mapDispatchToProps = () => ({});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_11__["connect"])(mapStateToProps, mapDispatchToProps)(SoundLibrary)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/sound-tab.jsx":
|
||
/*!**************************************!*\
|
||
!*** ./src/containers/sound-tab.jsx ***!
|
||
\**************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _components_asset_panel_asset_panel_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/asset-panel/asset-panel.jsx */ "./src/components/asset-panel/asset-panel.jsx");
|
||
/* harmony import */ var _components_asset_panel_icon_sound_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/asset-panel/icon--sound.svg */ "./src/components/asset-panel/icon--sound.svg");
|
||
/* harmony import */ var _components_asset_panel_icon_sound_svg__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_components_asset_panel_icon_sound_svg__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _components_asset_panel_icon_sound_rtl_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/asset-panel/icon--sound-rtl.svg */ "./src/components/asset-panel/icon--sound-rtl.svg");
|
||
/* harmony import */ var _components_asset_panel_icon_sound_rtl_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_components_asset_panel_icon_sound_rtl_svg__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _components_asset_panel_icon_add_sound_lib_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/asset-panel/icon--add-sound-lib.svg */ "./src/components/asset-panel/icon--add-sound-lib.svg");
|
||
/* harmony import */ var _components_asset_panel_icon_add_sound_lib_svg__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_components_asset_panel_icon_add_sound_lib_svg__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var _components_asset_panel_icon_add_sound_record_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../components/asset-panel/icon--add-sound-record.svg */ "./src/components/asset-panel/icon--add-sound-record.svg");
|
||
/* harmony import */ var _components_asset_panel_icon_add_sound_record_svg__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_components_asset_panel_icon_add_sound_record_svg__WEBPACK_IMPORTED_MODULE_9__);
|
||
/* harmony import */ var _components_action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../components/action-menu/icon--file-upload.svg */ "./src/components/action-menu/icon--file-upload.svg");
|
||
/* harmony import */ var _components_action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_components_action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_10__);
|
||
/* harmony import */ var _components_action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../components/action-menu/icon--surprise.svg */ "./src/components/action-menu/icon--surprise.svg");
|
||
/* harmony import */ var _components_action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_components_action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_11__);
|
||
/* harmony import */ var _components_action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../components/action-menu/icon--search.svg */ "./src/components/action-menu/icon--search.svg");
|
||
/* harmony import */ var _components_action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_components_action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_12__);
|
||
/* harmony import */ var _record_modal_jsx__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./record-modal.jsx */ "./src/containers/record-modal.jsx");
|
||
/* harmony import */ var _sound_editor_jsx__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./sound-editor.jsx */ "./src/containers/sound-editor.jsx");
|
||
/* harmony import */ var _sound_library_jsx__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./sound-library.jsx */ "./src/containers/sound-library.jsx");
|
||
/* harmony import */ var _lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../lib/libraries/tw-async-libraries */ "./src/lib/libraries/tw-async-libraries.js");
|
||
/* harmony import */ var _lib_file_uploader_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../lib/file-uploader.js */ "./src/lib/file-uploader.js");
|
||
/* harmony import */ var _lib_error_boundary_hoc_jsx__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../lib/error-boundary-hoc.jsx */ "./src/lib/error-boundary-hoc.jsx");
|
||
/* harmony import */ var _lib_drag_constants__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../lib/drag-constants */ "./src/lib/drag-constants.js");
|
||
/* harmony import */ var _lib_download_blob__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../lib/download-blob */ "./src/lib/download-blob.js");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _reducers_editor_tab__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../reducers/editor-tab */ "./src/reducers/editor-tab.js");
|
||
/* harmony import */ var _reducers_restore_deletion__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../reducers/restore-deletion */ "./src/reducers/restore-deletion.js");
|
||
/* harmony import */ var _reducers_alerts__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../reducers/alerts */ "./src/reducers/alerts.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class SoundTab extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleSelectSound', 'handleDeleteSound', 'handleDuplicateSound', 'handleExportSound', 'handleNewSound', 'handleSurpriseSound', 'handleFileUploadClick', 'handleSoundUpload', 'handleDrop', 'setFileInput']);
|
||
this.state = {
|
||
selectedSoundIndex: 0
|
||
};
|
||
}
|
||
|
||
componentWillReceiveProps(nextProps) {
|
||
const {
|
||
editingTarget,
|
||
sprites,
|
||
stage
|
||
} = nextProps;
|
||
const target = editingTarget && sprites[editingTarget] ? sprites[editingTarget] : stage;
|
||
|
||
if (!target || !target.sounds) {
|
||
return;
|
||
} // If switching editing targets, reset the sound index
|
||
|
||
|
||
if (this.props.editingTarget !== editingTarget) {
|
||
this.setState({
|
||
selectedSoundIndex: 0
|
||
});
|
||
} else if (this.state.selectedSoundIndex > target.sounds.length - 1) {
|
||
this.setState({
|
||
selectedSoundIndex: Math.max(target.sounds.length - 1, 0)
|
||
});
|
||
}
|
||
}
|
||
|
||
handleSelectSound(soundIndex) {
|
||
this.setState({
|
||
selectedSoundIndex: soundIndex
|
||
});
|
||
}
|
||
|
||
handleDeleteSound(soundIndex) {
|
||
const restoreFun = this.props.vm.deleteSound(soundIndex);
|
||
|
||
if (soundIndex >= this.state.selectedSoundIndex) {
|
||
this.setState({
|
||
selectedSoundIndex: Math.max(0, soundIndex - 1)
|
||
});
|
||
}
|
||
|
||
this.props.dispatchUpdateRestore({
|
||
restoreFun,
|
||
deletedItem: 'Sound'
|
||
});
|
||
}
|
||
|
||
handleExportSound(soundIndex) {
|
||
const item = this.props.vm.editingTarget.sprite.sounds[soundIndex];
|
||
const blob = new Blob([item.asset.data], {
|
||
type: item.asset.assetType.contentType
|
||
});
|
||
Object(_lib_download_blob__WEBPACK_IMPORTED_MODULE_20__["default"])("".concat(item.name, ".").concat(item.asset.dataFormat), blob);
|
||
}
|
||
|
||
handleDuplicateSound(soundIndex) {
|
||
this.props.vm.duplicateSound(soundIndex).then(() => {
|
||
this.setState({
|
||
selectedSoundIndex: soundIndex + 1
|
||
});
|
||
});
|
||
}
|
||
|
||
handleNewSound() {
|
||
if (!this.props.vm.editingTarget) {
|
||
return null;
|
||
}
|
||
|
||
const sprite = this.props.vm.editingTarget.sprite;
|
||
const sounds = sprite.sounds ? sprite.sounds : [];
|
||
this.setState({
|
||
selectedSoundIndex: Math.max(sounds.length - 1, 0)
|
||
});
|
||
}
|
||
|
||
async handleSurpriseSound() {
|
||
const soundLibraryContent = await Object(_lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_16__["getSoundLibrary"])();
|
||
const soundItem = soundLibraryContent[Math.floor(Math.random() * soundLibraryContent.length)];
|
||
const vmSound = {
|
||
format: soundItem.dataFormat,
|
||
md5: soundItem.md5ext,
|
||
rate: soundItem.rate,
|
||
sampleCount: soundItem.sampleCount,
|
||
name: soundItem.name
|
||
};
|
||
this.props.vm.addSound(vmSound).then(() => {
|
||
this.handleNewSound();
|
||
});
|
||
}
|
||
|
||
handleFileUploadClick() {
|
||
this.fileInput.click();
|
||
}
|
||
|
||
handleSoundUpload(e) {
|
||
const storage = this.props.vm.runtime.storage;
|
||
const targetId = this.props.vm.editingTarget.id;
|
||
this.props.onShowImporting();
|
||
Object(_lib_file_uploader_js__WEBPACK_IMPORTED_MODULE_17__["handleFileUpload"])(e.target, (buffer, fileType, fileName, fileIndex, fileCount) => {
|
||
Object(_lib_file_uploader_js__WEBPACK_IMPORTED_MODULE_17__["soundUpload"])(buffer, fileType, storage, newSound => {
|
||
newSound.name = fileName;
|
||
this.props.vm.addSound(newSound, targetId).then(() => {
|
||
this.handleNewSound();
|
||
|
||
if (fileIndex === fileCount - 1) {
|
||
this.props.onCloseImporting();
|
||
}
|
||
});
|
||
}, this.props.onCloseImporting);
|
||
}, this.props.onCloseImporting);
|
||
}
|
||
|
||
handleDrop(dropInfo) {
|
||
if (dropInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_19__["default"].SOUND) {
|
||
const sprite = this.props.vm.editingTarget.sprite;
|
||
const activeSound = sprite.sounds[this.state.selectedSoundIndex];
|
||
this.props.vm.reorderSound(this.props.vm.editingTarget.id, dropInfo.index, dropInfo.newIndex);
|
||
this.setState({
|
||
selectedSoundIndex: sprite.sounds.indexOf(activeSound)
|
||
});
|
||
} else if (dropInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_19__["default"].BACKPACK_COSTUME) {
|
||
this.props.onActivateCostumesTab();
|
||
this.props.vm.addCostume(dropInfo.payload.body, {
|
||
name: dropInfo.payload.name
|
||
});
|
||
} else if (dropInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_19__["default"].BACKPACK_SOUND) {
|
||
this.props.vm.addSound({
|
||
md5: dropInfo.payload.body,
|
||
name: dropInfo.payload.name
|
||
}).then(this.handleNewSound);
|
||
}
|
||
}
|
||
|
||
setFileInput(input) {
|
||
this.fileInput = input;
|
||
}
|
||
|
||
render() {
|
||
const {
|
||
dispatchUpdateRestore,
|
||
// eslint-disable-line no-unused-vars
|
||
intl,
|
||
isRtl,
|
||
vm,
|
||
onNewSoundFromLibraryClick,
|
||
onNewSoundFromRecordingClick
|
||
} = this.props;
|
||
|
||
if (!vm.editingTarget) {
|
||
return null;
|
||
}
|
||
|
||
const sprite = vm.editingTarget.sprite;
|
||
const sounds = sprite.sounds ? sprite.sounds.map(sound => ({
|
||
url: isRtl ? _components_asset_panel_icon_sound_rtl_svg__WEBPACK_IMPORTED_MODULE_7___default.a : _components_asset_panel_icon_sound_svg__WEBPACK_IMPORTED_MODULE_6___default.a,
|
||
name: sound.name,
|
||
details: (sound.sampleCount / sound.rate).toFixed(2),
|
||
dragPayload: sound
|
||
})) : [];
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
fileUploadSound: {
|
||
"id": "gui.soundTab.fileUploadSound",
|
||
"defaultMessage": "Upload Sound"
|
||
},
|
||
surpriseSound: {
|
||
"id": "gui.soundTab.surpriseSound",
|
||
"defaultMessage": "Surprise"
|
||
},
|
||
recordSound: {
|
||
"id": "gui.soundTab.recordSound",
|
||
"defaultMessage": "Record"
|
||
},
|
||
addSound: {
|
||
"id": "gui.soundTab.addSoundFromLibrary",
|
||
"defaultMessage": "Choose a Sound"
|
||
}
|
||
});
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_asset_panel_asset_panel_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
buttons: [{
|
||
title: intl.formatMessage(messages.addSound),
|
||
img: _components_asset_panel_icon_add_sound_lib_svg__WEBPACK_IMPORTED_MODULE_8___default.a,
|
||
onClick: onNewSoundFromLibraryClick
|
||
}, {
|
||
title: intl.formatMessage(messages.fileUploadSound),
|
||
img: _components_action_menu_icon_file_upload_svg__WEBPACK_IMPORTED_MODULE_10___default.a,
|
||
onClick: this.handleFileUploadClick,
|
||
fileAccept: '.wav, .mp3, .ogg, .flac, .aac',
|
||
fileChange: this.handleSoundUpload,
|
||
fileInput: this.setFileInput,
|
||
fileMultiple: true
|
||
}, {
|
||
title: intl.formatMessage(messages.surpriseSound),
|
||
img: _components_action_menu_icon_surprise_svg__WEBPACK_IMPORTED_MODULE_11___default.a,
|
||
onClick: this.handleSurpriseSound
|
||
}, {
|
||
title: intl.formatMessage(messages.recordSound),
|
||
img: _components_asset_panel_icon_add_sound_record_svg__WEBPACK_IMPORTED_MODULE_9___default.a,
|
||
onClick: onNewSoundFromRecordingClick
|
||
}, {
|
||
title: intl.formatMessage(messages.addSound),
|
||
img: _components_action_menu_icon_search_svg__WEBPACK_IMPORTED_MODULE_12___default.a,
|
||
onClick: onNewSoundFromLibraryClick
|
||
}],
|
||
dragType: _lib_drag_constants__WEBPACK_IMPORTED_MODULE_19__["default"].SOUND,
|
||
isRtl: isRtl,
|
||
items: sounds,
|
||
selectedItemIndex: this.state.selectedSoundIndex,
|
||
onDeleteClick: this.handleDeleteSound,
|
||
onDrop: this.handleDrop,
|
||
onDuplicateClick: this.handleDuplicateSound,
|
||
onExportClick: this.handleExportSound,
|
||
onItemClick: this.handleSelectSound
|
||
}, sprite.sounds && sprite.sounds[this.state.selectedSoundIndex] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_sound_editor_jsx__WEBPACK_IMPORTED_MODULE_14__["default"], {
|
||
soundIndex: this.state.selectedSoundIndex
|
||
}) : null, this.props.soundRecorderVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_record_modal_jsx__WEBPACK_IMPORTED_MODULE_13__["default"], {
|
||
onNewSound: this.handleNewSound
|
||
}) : null, this.props.soundLibraryVisible ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_sound_library_jsx__WEBPACK_IMPORTED_MODULE_15__["default"], {
|
||
vm: this.props.vm,
|
||
onNewSound: this.handleNewSound,
|
||
onRequestClose: this.props.onRequestCloseSoundLibrary
|
||
}) : null);
|
||
}
|
||
|
||
}
|
||
|
||
SoundTab.propTypes = {
|
||
dispatchUpdateRestore: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
editingTarget: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"],
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
onActivateCostumesTab: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onCloseImporting: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onNewSoundFromLibraryClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onNewSoundFromRecordingClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onRequestCloseSoundLibrary: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onShowImporting: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
soundLibraryVisible: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
soundRecorderVisible: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
sprites: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
sounds: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired
|
||
}))
|
||
})
|
||
}),
|
||
stage: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
sounds: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string.isRequired
|
||
}))
|
||
}),
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a).isRequired
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
editingTarget: state.scratchGui.targets.editingTarget,
|
||
isRtl: state.locales.isRtl,
|
||
sprites: state.scratchGui.targets.sprites,
|
||
stage: state.scratchGui.targets.stage,
|
||
soundLibraryVisible: state.scratchGui.modals.soundLibrary,
|
||
soundRecorderVisible: state.scratchGui.modals.soundRecorder
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onActivateCostumesTab: () => dispatch(Object(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_23__["activateTab"])(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_23__["COSTUMES_TAB_INDEX"])),
|
||
onNewSoundFromLibraryClick: e => {
|
||
e.preventDefault();
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_22__["openSoundLibrary"])());
|
||
},
|
||
onNewSoundFromRecordingClick: () => {
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_22__["openSoundRecorder"])());
|
||
},
|
||
onRequestCloseSoundLibrary: () => {
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_22__["closeSoundLibrary"])());
|
||
},
|
||
dispatchUpdateRestore: restoreState => {
|
||
dispatch(Object(_reducers_restore_deletion__WEBPACK_IMPORTED_MODULE_24__["setRestore"])(restoreState));
|
||
},
|
||
onCloseImporting: () => dispatch(Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_25__["closeAlertWithId"])('importingAsset')),
|
||
onShowImporting: () => dispatch(Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_25__["showStandardAlert"])('importingAsset'))
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(_lib_error_boundary_hoc_jsx__WEBPACK_IMPORTED_MODULE_18__["default"])('Sound Tab')(Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_21__["connect"])(mapStateToProps, mapDispatchToProps)(SoundTab))));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/sprite-info.jsx":
|
||
/*!****************************************!*\
|
||
!*** ./src/containers/sprite-info.jsx ***!
|
||
\****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_sprite_info_sprite_info_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/sprite-info/sprite-info.jsx */ "./src/components/sprite-info/sprite-info.jsx");
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class SpriteInfo extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleClickVisible', 'handleClickNotVisible', 'handlePressVisible', 'handlePressNotVisible']);
|
||
}
|
||
|
||
handleClickVisible(e) {
|
||
e.preventDefault();
|
||
this.props.onChangeVisibility(true);
|
||
}
|
||
|
||
handleClickNotVisible(e) {
|
||
e.preventDefault();
|
||
this.props.onChangeVisibility(false);
|
||
}
|
||
|
||
handlePressVisible(e) {
|
||
if (e.key === ' ' || e.key === 'Enter') {
|
||
e.preventDefault();
|
||
this.props.onChangeVisibility(true);
|
||
}
|
||
}
|
||
|
||
handlePressNotVisible(e) {
|
||
if (e.key === ' ' || e.key === 'Enter') {
|
||
e.preventDefault();
|
||
this.props.onChangeVisibility(false);
|
||
}
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_sprite_info_sprite_info_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({}, this.props, {
|
||
onClickNotVisible: this.handleClickNotVisible,
|
||
onClickVisible: this.handleClickVisible,
|
||
onPressNotVisible: this.handlePressNotVisible,
|
||
onPressVisible: this.handlePressVisible
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
SpriteInfo.propTypes = _objectSpread(_objectSpread({}, _components_sprite_info_sprite_info_jsx__WEBPACK_IMPORTED_MODULE_3__["default"].propTypes), {}, {
|
||
onChangeDirection: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onChangeName: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onChangeSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onChangeVisibility: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onChangeX: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onChangeY: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
x: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
y: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
});
|
||
/* harmony default export */ __webpack_exports__["default"] = (SpriteInfo);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/sprite-library.jsx":
|
||
/*!*******************************************!*\
|
||
!*** ./src/containers/sprite-library.jsx ***!
|
||
\*******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/libraries/tw-async-libraries */ "./src/lib/libraries/tw-async-libraries.js");
|
||
/* harmony import */ var _lib_randomize_sprite_position__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/randomize-sprite-position */ "./src/lib/randomize-sprite-position.js");
|
||
/* harmony import */ var _lib_libraries_sprite_tags__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/libraries/sprite-tags */ "./src/lib/libraries/sprite-tags.js");
|
||
/* harmony import */ var _components_library_library_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/library/library.jsx */ "./src/components/library/library.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
libraryTitle: {
|
||
"id": "gui.spriteLibrary.chooseASprite",
|
||
"defaultMessage": "Choose a Sprite"
|
||
}
|
||
});
|
||
|
||
class SpriteLibrary extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleItemSelect']);
|
||
}
|
||
|
||
handleItemSelect(item) {
|
||
// Randomize position of library sprite
|
||
Object(_lib_randomize_sprite_position__WEBPACK_IMPORTED_MODULE_6__["default"])(item);
|
||
this.props.vm.addSprite(JSON.stringify(item)).then(() => {
|
||
this.props.onActivateBlocksTab();
|
||
});
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_library_library_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], {
|
||
data: Object(_lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_5__["getSpriteLibrary"])(),
|
||
id: "spriteLibrary",
|
||
tags: _lib_libraries_sprite_tags__WEBPACK_IMPORTED_MODULE_7__["default"],
|
||
title: this.props.intl.formatMessage(messages.libraryTitle),
|
||
onItemSelected: this.handleItemSelect,
|
||
onRequestClose: this.props.onRequestClose
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
SpriteLibrary.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"].isRequired,
|
||
onActivateBlocksTab: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onRequestClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a).isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(SpriteLibrary));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/sprite-selector-item.jsx":
|
||
/*!*************************************************!*\
|
||
!*** ./src/containers/sprite-selector-item.jsx ***!
|
||
\*************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_hovered_target__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../reducers/hovered-target */ "./src/reducers/hovered-target.js");
|
||
/* harmony import */ var _reducers_asset_drag__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/asset-drag */ "./src/reducers/asset-drag.js");
|
||
/* harmony import */ var _lib_storage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/storage */ "./src/lib/storage.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _lib_get_costume_url__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../lib/get-costume-url */ "./src/lib/get-costume-url.js");
|
||
/* harmony import */ var _lib_drag_recognizer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../lib/drag-recognizer */ "./src/lib/drag-recognizer.js");
|
||
/* harmony import */ var _lib_touch_utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../lib/touch-utils */ "./src/lib/touch-utils.js");
|
||
/* harmony import */ var _components_sprite_selector_item_sprite_selector_item_jsx__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../components/sprite-selector-item/sprite-selector-item.jsx */ "./src/components/sprite-selector-item/sprite-selector-item.jsx");
|
||
const _excluded = ["asset", "id", "index", "onClick", "onDeleteButtonClick", "onDuplicateButtonClick", "onExportButtonClick", "onRenameButtonClick", "dragPayload", "receivedBlocks", "costumeURL", "vm"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class SpriteSelectorItem extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['getCostumeData', 'setRef', 'handleClick', 'handleDelete', 'handleDuplicate', 'handleExport', 'handleRename', 'handleMouseEnter', 'handleMouseLeave', 'handleMouseDown', 'handleDragEnd', 'handleDrag', 'handleTouchEnd']);
|
||
this.dragRecognizer = new _lib_drag_recognizer__WEBPACK_IMPORTED_MODULE_9__["default"]({
|
||
onDrag: this.handleDrag,
|
||
onDragEnd: this.handleDragEnd
|
||
});
|
||
}
|
||
|
||
componentDidMount() {
|
||
document.addEventListener('touchend', this.handleTouchEnd);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
document.removeEventListener('touchend', this.handleTouchEnd);
|
||
this.dragRecognizer.reset();
|
||
}
|
||
|
||
getCostumeData() {
|
||
if (this.props.costumeURL) return this.props.costumeURL;
|
||
if (!this.props.asset) return null;
|
||
return Object(_lib_get_costume_url__WEBPACK_IMPORTED_MODULE_8__["default"])(this.props.asset);
|
||
}
|
||
|
||
handleDragEnd() {
|
||
if (this.props.dragging) {
|
||
this.props.onDrag({
|
||
img: null,
|
||
currentOffset: null,
|
||
dragging: false,
|
||
dragType: null,
|
||
index: null
|
||
});
|
||
}
|
||
|
||
setTimeout(() => {
|
||
this.noClick = false;
|
||
});
|
||
}
|
||
|
||
handleDrag(currentOffset) {
|
||
this.props.onDrag({
|
||
img: this.getCostumeData(),
|
||
currentOffset: currentOffset,
|
||
dragging: true,
|
||
dragType: this.props.dragType,
|
||
index: this.props.index,
|
||
payload: this.props.dragPayload
|
||
});
|
||
this.noClick = true;
|
||
}
|
||
|
||
handleTouchEnd(e) {
|
||
const {
|
||
x,
|
||
y
|
||
} = Object(_lib_touch_utils__WEBPACK_IMPORTED_MODULE_10__["getEventXY"])(e);
|
||
const {
|
||
top,
|
||
left,
|
||
bottom,
|
||
right
|
||
} = this.ref.getBoundingClientRect();
|
||
|
||
if (x >= left && x <= right && y >= top && y <= bottom) {
|
||
this.handleMouseEnter();
|
||
}
|
||
}
|
||
|
||
handleMouseDown(e) {
|
||
this.dragRecognizer.start(e);
|
||
}
|
||
|
||
handleClick(e) {
|
||
e.preventDefault();
|
||
|
||
if (!this.noClick) {
|
||
this.props.onClick(this.props.id);
|
||
}
|
||
}
|
||
|
||
handleDelete(e) {
|
||
e.stopPropagation(); // To prevent from bubbling back to handleClick
|
||
|
||
this.props.onDeleteButtonClick(this.props.id);
|
||
}
|
||
|
||
handleDuplicate(e) {
|
||
e.stopPropagation(); // To prevent from bubbling back to handleClick
|
||
|
||
this.props.onDuplicateButtonClick(this.props.id);
|
||
}
|
||
|
||
handleExport(e) {
|
||
e.stopPropagation();
|
||
this.props.onExportButtonClick(this.props.id);
|
||
}
|
||
|
||
handleRename(e) {
|
||
e.stopPropagation();
|
||
this.props.onRenameButtonClick(this.props.id);
|
||
}
|
||
|
||
handleMouseLeave() {
|
||
this.props.dispatchSetHoveredSprite(null);
|
||
}
|
||
|
||
handleMouseEnter() {
|
||
this.props.dispatchSetHoveredSprite(this.props.id);
|
||
}
|
||
|
||
setRef(component) {
|
||
// Access the DOM node using .elem because it is going through ContextMenuTrigger
|
||
this.ref = component && component.elem;
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
asset,
|
||
id,
|
||
index,
|
||
onClick,
|
||
onDeleteButtonClick,
|
||
onDuplicateButtonClick,
|
||
onExportButtonClick,
|
||
onRenameButtonClick,
|
||
dragPayload,
|
||
receivedBlocks,
|
||
costumeURL,
|
||
vm
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_sprite_selector_item_sprite_selector_item_jsx__WEBPACK_IMPORTED_MODULE_11__["default"], _extends({
|
||
componentRef: this.setRef,
|
||
costumeURL: this.getCostumeData(),
|
||
preventContextMenu: this.dragRecognizer.gestureInProgress(),
|
||
onClick: this.handleClick,
|
||
onDeleteButtonClick: onDeleteButtonClick ? this.handleDelete : null,
|
||
onDuplicateButtonClick: onDuplicateButtonClick ? this.handleDuplicate : null,
|
||
onExportButtonClick: onExportButtonClick ? this.handleExport : null,
|
||
onRenameButtonClick: onRenameButtonClick ? this.handleRename : null,
|
||
onMouseDown: this.handleMouseDown,
|
||
onMouseEnter: this.handleMouseEnter,
|
||
onMouseLeave: this.handleMouseLeave
|
||
}, props));
|
||
}
|
||
|
||
}
|
||
|
||
SpriteSelectorItem.propTypes = {
|
||
// eslint-disable-next-line react/forbid-prop-types
|
||
asset: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.any,
|
||
costumeURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
dispatchSetHoveredSprite: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
// eslint-disable-next-line react/forbid-prop-types
|
||
dragPayload: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.any,
|
||
dragType: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
dragging: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
// eslint-disable-next-line react/forbid-prop-types
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.any,
|
||
index: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
// eslint-disable-next-line react/forbid-prop-types
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.any,
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onDeleteButtonClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onRenameButtonClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onDrag: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onDuplicateButtonClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onExportButtonClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
receivedBlocks: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
selected: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_7___default.a).isRequired
|
||
};
|
||
|
||
const mapStateToProps = (state, {
|
||
id
|
||
}) => ({
|
||
dragging: state.scratchGui.assetDrag.dragging,
|
||
receivedBlocks: state.scratchGui.hoveredTarget.receivedBlocks && state.scratchGui.hoveredTarget.sprite === id,
|
||
vm: state.scratchGui.vm
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
dispatchSetHoveredSprite: spriteId => {
|
||
dispatch(Object(_reducers_hovered_target__WEBPACK_IMPORTED_MODULE_4__["setHoveredSprite"])(spriteId));
|
||
},
|
||
onDrag: data => dispatch(Object(_reducers_asset_drag__WEBPACK_IMPORTED_MODULE_5__["updateAssetDrag"])(data))
|
||
});
|
||
|
||
const ConnectedComponent = Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(SpriteSelectorItem);
|
||
/* harmony default export */ __webpack_exports__["default"] = (ConnectedComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/stage-header.jsx":
|
||
/*!*****************************************!*\
|
||
!*** ./src/containers/stage-header.jsx ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _lib_layout_constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/layout-constants */ "./src/lib/layout-constants.js");
|
||
/* harmony import */ var _reducers_stage_size__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/stage-size */ "./src/reducers/stage-size.js");
|
||
/* harmony import */ var _reducers_mode__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/mode */ "./src/reducers/mode.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _components_stage_header_stage_header_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../components/stage-header/stage-header.jsx */ "./src/components/stage-header/stage-header.jsx");
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// eslint-disable-next-line react/prefer-stateless-function
|
||
|
||
class StageHeader extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleKeyPress']);
|
||
}
|
||
|
||
componentDidMount() {
|
||
document.addEventListener('keydown', this.handleKeyPress);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
document.removeEventListener('keydown', this.handleKeyPress);
|
||
}
|
||
|
||
handleKeyPress(event) {
|
||
if (event.key === 'Escape' && this.props.isFullScreen) {
|
||
this.props.onSetStageUnFull(false);
|
||
}
|
||
}
|
||
|
||
render() {
|
||
const props = _extends({}, this.props);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_stage_header_stage_header_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], _extends({}, props, {
|
||
onKeyPress: this.handleKeyPress
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
StageHeader.propTypes = {
|
||
isFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
// tw: update when dimensions or isWindowFullScreen changes
|
||
isWindowFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
dimensions: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number),
|
||
isPlayerOnly: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
onSetStageUnFull: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
onOpenSettings: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,
|
||
// tw: replace showBranding
|
||
isEmbedded: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
stageSizeMode: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf(Object.keys(_lib_layout_constants__WEBPACK_IMPORTED_MODULE_4__["STAGE_SIZE_MODES"])),
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_3___default.a).isRequired
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
stageSizeMode: state.scratchGui.stageSize.stageSize,
|
||
// tw: replace showBranding
|
||
isEmbedded: state.scratchGui.mode.isEmbedded,
|
||
isFullScreen: state.scratchGui.mode.isFullScreen,
|
||
// tw: update when dimensions or isWindowFullScreen changes
|
||
isWindowFullScreen: state.scratchGui.tw.isWindowFullScreen,
|
||
dimensions: state.scratchGui.tw.dimensions,
|
||
isPlayerOnly: state.scratchGui.mode.isPlayerOnly
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onSetStageLarge: () => dispatch(Object(_reducers_stage_size__WEBPACK_IMPORTED_MODULE_5__["setStageSize"])(_lib_layout_constants__WEBPACK_IMPORTED_MODULE_4__["STAGE_SIZE_MODES"].large)),
|
||
onSetStageSmall: () => dispatch(Object(_reducers_stage_size__WEBPACK_IMPORTED_MODULE_5__["setStageSize"])(_lib_layout_constants__WEBPACK_IMPORTED_MODULE_4__["STAGE_SIZE_MODES"].small)),
|
||
onSetStageFull: () => dispatch(Object(_reducers_mode__WEBPACK_IMPORTED_MODULE_6__["setFullScreen"])(true)),
|
||
onSetStageUnFull: () => dispatch(Object(_reducers_mode__WEBPACK_IMPORTED_MODULE_6__["setFullScreen"])(false)),
|
||
onOpenSettings: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_7__["openSettingsModal"])())
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_8__["connect"])(mapStateToProps, mapDispatchToProps)(StageHeader));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/stage-selector.jsx":
|
||
/*!*******************************************!*\
|
||
!*** ./src/containers/stage-selector.jsx ***!
|
||
\*******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash.omit */ "./node_modules/lodash.omit/index.js");
|
||
/* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_omit__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _reducers_editor_tab__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/editor-tab */ "./src/reducers/editor-tab.js");
|
||
/* harmony import */ var _reducers_alerts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../reducers/alerts */ "./src/reducers/alerts.js");
|
||
/* harmony import */ var _reducers_hovered_target__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../reducers/hovered-target */ "./src/reducers/hovered-target.js");
|
||
/* harmony import */ var _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../lib/drag-constants */ "./src/lib/drag-constants.js");
|
||
/* harmony import */ var _lib_drop_area_hoc_jsx__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../lib/drop-area-hoc.jsx */ "./src/lib/drop-area-hoc.jsx");
|
||
/* harmony import */ var _lib_throttled_property_hoc_jsx__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../lib/throttled-property-hoc.jsx */ "./src/lib/throttled-property-hoc.jsx");
|
||
/* harmony import */ var _lib_empty_assets__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../lib/empty-assets */ "./src/lib/empty-assets.js");
|
||
/* harmony import */ var _lib_shared_messages__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../lib/shared-messages */ "./src/lib/shared-messages.js");
|
||
/* harmony import */ var _lib_backpack_api__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../lib/backpack-api */ "./src/lib/backpack-api.js");
|
||
/* harmony import */ var _lib_touch_utils__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../lib/touch-utils */ "./src/lib/touch-utils.js");
|
||
/* harmony import */ var _components_stage_selector_stage_selector_jsx__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../components/stage-selector/stage-selector.jsx */ "./src/components/stage-selector/stage-selector.jsx");
|
||
/* harmony import */ var _lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../lib/libraries/tw-async-libraries */ "./src/lib/libraries/tw-async-libraries.js");
|
||
/* harmony import */ var _lib_file_uploader_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../lib/file-uploader.js */ "./src/lib/file-uploader.js");
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const dragTypes = [_lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].COSTUME, _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].SOUND, _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].BACKPACK_COSTUME, _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].BACKPACK_SOUND, _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].BACKPACK_CODE];
|
||
const DroppableThrottledStage = Object(_lib_drop_area_hoc_jsx__WEBPACK_IMPORTED_MODULE_11__["default"])(dragTypes)(Object(_lib_throttled_property_hoc_jsx__WEBPACK_IMPORTED_MODULE_12__["default"])('url', 500)(_components_stage_selector_stage_selector_jsx__WEBPACK_IMPORTED_MODULE_17__["default"]));
|
||
|
||
class StageSelector extends react__WEBPACK_IMPORTED_MODULE_3___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleClick', 'handleNewBackdrop', 'handleSurpriseBackdrop', 'handleEmptyBackdrop', 'addBackdropFromLibraryItem', 'handleFileUploadClick', 'handleBackdropUpload', 'handleMouseEnter', 'handleMouseLeave', 'handleTouchEnd', 'handleDrop', 'setFileInput', 'setRef']);
|
||
}
|
||
|
||
componentDidMount() {
|
||
document.addEventListener('touchend', this.handleTouchEnd);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
document.removeEventListener('touchend', this.handleTouchEnd);
|
||
}
|
||
|
||
handleTouchEnd(e) {
|
||
const {
|
||
x,
|
||
y
|
||
} = Object(_lib_touch_utils__WEBPACK_IMPORTED_MODULE_16__["getEventXY"])(e);
|
||
const {
|
||
top,
|
||
left,
|
||
bottom,
|
||
right
|
||
} = this.ref.getBoundingClientRect();
|
||
|
||
if (x >= left && x <= right && y >= top && y <= bottom) {
|
||
this.handleMouseEnter();
|
||
}
|
||
}
|
||
|
||
addBackdropFromLibraryItem(item, shouldActivateTab = true) {
|
||
const vmBackdrop = {
|
||
name: item.name,
|
||
md5: item.md5ext,
|
||
rotationCenterX: item.rotationCenterX,
|
||
rotationCenterY: item.rotationCenterY,
|
||
bitmapResolution: item.bitmapResolution,
|
||
skinId: null
|
||
};
|
||
this.handleNewBackdrop(vmBackdrop, shouldActivateTab);
|
||
}
|
||
|
||
handleClick() {
|
||
this.props.onSelect(this.props.id);
|
||
}
|
||
|
||
handleNewBackdrop(backdrops_, shouldActivateTab = true) {
|
||
const backdrops = Array.isArray(backdrops_) ? backdrops_ : [backdrops_];
|
||
return Promise.all(backdrops.map(backdrop => this.props.vm.addBackdrop(backdrop.md5, backdrop))).then(() => {
|
||
if (shouldActivateTab) {
|
||
return this.props.onActivateTab(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_7__["COSTUMES_TAB_INDEX"]);
|
||
}
|
||
});
|
||
}
|
||
|
||
async handleSurpriseBackdrop(e) {
|
||
e.stopPropagation(); // Prevent click from falling through to selecting stage.
|
||
|
||
const backdropLibraryContent = await Object(_lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_18__["getBackdropLibrary"])(); // @todo should this not add a backdrop you already have?
|
||
|
||
const item = backdropLibraryContent[Math.floor(Math.random() * backdropLibraryContent.length)];
|
||
this.addBackdropFromLibraryItem(item, false);
|
||
}
|
||
|
||
handleEmptyBackdrop(e) {
|
||
e.stopPropagation(); // Prevent click from falling through to stage selector, select it manually below
|
||
|
||
this.props.vm.setEditingTarget(this.props.id);
|
||
this.handleNewBackdrop(Object(_lib_empty_assets__WEBPACK_IMPORTED_MODULE_13__["emptyCostume"])(this.props.intl.formatMessage(_lib_shared_messages__WEBPACK_IMPORTED_MODULE_14__["default"].backdrop, {
|
||
index: 1
|
||
})));
|
||
}
|
||
|
||
handleBackdropUpload(e) {
|
||
const vm = this.props.vm;
|
||
this.props.onShowImporting();
|
||
Object(_lib_file_uploader_js__WEBPACK_IMPORTED_MODULE_19__["handleFileUpload"])(e.target, (buffer, fileType, fileName, fileIndex, fileCount) => {
|
||
Object(_lib_file_uploader_js__WEBPACK_IMPORTED_MODULE_19__["costumeUpload"])(buffer, fileType, vm, vmCostumes => {
|
||
this.props.vm.setEditingTarget(this.props.id);
|
||
vmCostumes.forEach((costume, i) => {
|
||
costume.name = "".concat(fileName).concat(i ? i + 1 : '');
|
||
});
|
||
this.handleNewBackdrop(vmCostumes).then(() => {
|
||
if (fileIndex === fileCount - 1) {
|
||
this.props.onCloseImporting();
|
||
}
|
||
});
|
||
}, this.props.onCloseImporting);
|
||
}, this.props.onCloseImporting);
|
||
}
|
||
|
||
handleFileUploadClick(e) {
|
||
e.stopPropagation(); // Prevent click from selecting the stage, that is handled manually in backdrop upload
|
||
|
||
this.fileInput.click();
|
||
}
|
||
|
||
handleMouseEnter() {
|
||
this.props.dispatchSetHoveredSprite(this.props.id);
|
||
}
|
||
|
||
handleMouseLeave() {
|
||
this.props.dispatchSetHoveredSprite(null);
|
||
}
|
||
|
||
handleDrop(dragInfo) {
|
||
if (dragInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].COSTUME) {
|
||
this.props.vm.shareCostumeToTarget(dragInfo.index, this.props.id);
|
||
} else if (dragInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].SOUND) {
|
||
this.props.vm.shareSoundToTarget(dragInfo.index, this.props.id);
|
||
} else if (dragInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].BACKPACK_COSTUME) {
|
||
this.props.vm.addCostume(dragInfo.payload.body, {
|
||
name: dragInfo.payload.name
|
||
}, this.props.id);
|
||
} else if (dragInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].BACKPACK_SOUND) {
|
||
this.props.vm.addSound({
|
||
md5: dragInfo.payload.body,
|
||
name: dragInfo.payload.name
|
||
}, this.props.id);
|
||
} else if (dragInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].BACKPACK_CODE) {
|
||
Object(_lib_backpack_api__WEBPACK_IMPORTED_MODULE_15__["fetchCode"])(dragInfo.payload.bodyUrl).then(blocks => {
|
||
this.props.vm.shareBlocksToTarget(blocks, this.props.id);
|
||
this.props.vm.refreshWorkspace();
|
||
});
|
||
}
|
||
}
|
||
|
||
setFileInput(input) {
|
||
this.fileInput = input;
|
||
}
|
||
|
||
setRef(ref) {
|
||
this.ref = ref;
|
||
}
|
||
|
||
render() {
|
||
const componentProps = lodash_omit__WEBPACK_IMPORTED_MODULE_1___default()(this.props, ['asset', 'dispatchSetHoveredSprite', 'id', 'intl', 'onActivateTab', 'onSelect', 'onShowImporting', 'onCloseImporting']);
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(DroppableThrottledStage, _extends({
|
||
componentRef: this.setRef,
|
||
fileInputRef: this.setFileInput,
|
||
onBackdropFileUpload: this.handleBackdropUpload,
|
||
onBackdropFileUploadClick: this.handleFileUploadClick,
|
||
onClick: this.handleClick,
|
||
onDrop: this.handleDrop,
|
||
onEmptyBackdropClick: this.handleEmptyBackdrop,
|
||
onMouseEnter: this.handleMouseEnter,
|
||
onMouseLeave: this.handleMouseLeave,
|
||
onSurpriseBackdropClick: this.handleSurpriseBackdrop
|
||
}, componentProps));
|
||
}
|
||
|
||
}
|
||
|
||
StageSelector.propTypes = _objectSpread(_objectSpread({}, _components_stage_selector_stage_selector_jsx__WEBPACK_IMPORTED_MODULE_17__["default"].propTypes), {}, {
|
||
id: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_4__["intlShape"].isRequired,
|
||
onCloseImporting: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onSelect: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onShowImporting: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func
|
||
});
|
||
|
||
const mapStateToProps = (state, {
|
||
asset,
|
||
id
|
||
}) => ({
|
||
url: asset && asset.encodeDataURI(),
|
||
vm: state.scratchGui.vm,
|
||
receivedBlocks: state.scratchGui.hoveredTarget.receivedBlocks && state.scratchGui.hoveredTarget.sprite === id,
|
||
raised: state.scratchGui.blockDrag
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onNewBackdropClick: e => {
|
||
e.stopPropagation();
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_6__["openBackdropLibrary"])());
|
||
},
|
||
onActivateTab: tabIndex => {
|
||
dispatch(Object(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_7__["activateTab"])(tabIndex));
|
||
},
|
||
dispatchSetHoveredSprite: spriteId => {
|
||
dispatch(Object(_reducers_hovered_target__WEBPACK_IMPORTED_MODULE_9__["setHoveredSprite"])(spriteId));
|
||
},
|
||
onCloseImporting: () => dispatch(Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_8__["closeAlertWithId"])('importingAsset')),
|
||
onShowImporting: () => dispatch(Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_8__["showStandardAlert"])('importingAsset'))
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_5__["connect"])(mapStateToProps, mapDispatchToProps)(StageSelector)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/stage-wrapper.jsx":
|
||
/*!******************************************!*\
|
||
!*** ./src/containers/stage-wrapper.jsx ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/layout-constants.js */ "./src/lib/layout-constants.js");
|
||
/* harmony import */ var _components_stage_wrapper_stage_wrapper_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/stage-wrapper/stage-wrapper.jsx */ "./src/components/stage-wrapper/stage-wrapper.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const StageWrapper = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_stage_wrapper_stage_wrapper_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], props);
|
||
|
||
StageWrapper.propTypes = {
|
||
isRendererSupported: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
stageSize: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf(Object.keys(_lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_3__["STAGE_DISPLAY_SIZES"])).isRequired,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_2___default.a).isRequired
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (StageWrapper);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/stage.jsx":
|
||
/*!**********************************!*\
|
||
!*** ./src/containers/stage.jsx ***!
|
||
\**********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var scratch_render__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! scratch-render */ "./node_modules/scratch-render/src/index.js");
|
||
/* harmony import */ var scratch_render__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(scratch_render__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _lib_layout_constants__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/layout-constants */ "./src/lib/layout-constants.js");
|
||
/* harmony import */ var _lib_touch_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/touch-utils */ "./src/lib/touch-utils.js");
|
||
/* harmony import */ var _lib_video_video_provider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../lib/video/video-provider */ "./src/lib/video/video-provider.js");
|
||
/* harmony import */ var scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! scratch-svg-renderer */ "./node_modules/scratch-svg-renderer/src/index.js");
|
||
/* harmony import */ var scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_9__);
|
||
/* harmony import */ var _components_stage_stage_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../components/stage/stage.jsx */ "./src/components/stage/stage.jsx");
|
||
/* harmony import */ var _reducers_color_picker__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../reducers/color-picker */ "./src/reducers/color-picker.js");
|
||
/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../reducers/tw */ "./src/reducers/tw.js");
|
||
const _excluded = ["vm", "onActivateColorPicker", "disableEditingTargetChange"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const colorPickerRadius = 20;
|
||
const dragThreshold = 3; // Same as the block drag threshold
|
||
|
||
class Stage extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['attachMouseEvents', 'cancelMouseDownTimeout', 'detachMouseEvents', 'handleDoubleClick', 'handleQuestionAnswered', 'onMouseUp', 'onMouseMove', 'onMouseDown', 'onStartDrag', 'onStopDrag', 'onWheel', 'onContextMenu', 'updateRect', 'questionListener', 'setDragCanvas', 'clearDragCanvas', 'drawDragCanvas', 'positionDragCanvas']);
|
||
this.state = {
|
||
mouseDownTimeoutId: null,
|
||
mouseDownPosition: null,
|
||
isDragging: false,
|
||
dragOffset: null,
|
||
dragId: null,
|
||
colorInfo: null,
|
||
question: null
|
||
};
|
||
|
||
if (this.props.vm.renderer) {
|
||
this.renderer = this.props.vm.renderer;
|
||
this.canvas = this.renderer.canvas;
|
||
} else {
|
||
this.canvas = document.createElement('canvas');
|
||
this.renderer = new scratch_render__WEBPACK_IMPORTED_MODULE_3___default.a(this.canvas, -this.props.customStageSize.width / 2, this.props.customStageSize.width / 2, -this.props.customStageSize.height / 2, this.props.customStageSize.height / 2);
|
||
this.props.vm.setStageSize(this.props.customStageSize.width, this.props.customStageSize.height);
|
||
this.props.vm.attachRenderer(this.renderer); // Only attach a video provider once because it is stateful
|
||
|
||
this.props.vm.setVideoProvider(new _lib_video_video_provider__WEBPACK_IMPORTED_MODULE_8__["default"]()); // Calling draw a single time before any project is loaded just makes
|
||
// the canvas white instead of solid black–needed because it is not
|
||
// possible to use CSS to style the canvas to have a different
|
||
// default color
|
||
|
||
this.props.vm.renderer.draw(); // tw: handle changes to high quality pen
|
||
|
||
this.props.vm.renderer.on('UseHighQualityRenderChanged', this.props.onHighQualityPenChanged);
|
||
}
|
||
|
||
this.props.vm.attachV2BitmapAdapter(new scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_9__["BitmapAdapter"]());
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.attachRectEvents();
|
||
this.attachMouseEvents(this.canvas);
|
||
this.updateRect();
|
||
this.props.vm.runtime.addListener('QUESTION', this.questionListener);
|
||
}
|
||
|
||
shouldComponentUpdate(nextProps, nextState) {
|
||
return this.props.stageSize !== nextProps.stageSize || this.props.isColorPicking !== nextProps.isColorPicking || this.state.colorInfo !== nextState.colorInfo || this.props.isFullScreen !== nextProps.isFullScreen || this.props.isWindowFullScreen !== nextProps.isWindowFullScreen || this.props.dimensions !== nextProps.dimensions || this.state.question !== nextState.question || this.props.micIndicator !== nextProps.micIndicator || this.props.isStarted !== nextProps.isStarted || this.props.customStageSize !== nextProps.customStageSize;
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
if (this.props.isColorPicking && !prevProps.isColorPicking) {
|
||
this.startColorPickingLoop();
|
||
} else if (!this.props.isColorPicking && prevProps.isColorPicking) {
|
||
this.stopColorPickingLoop();
|
||
}
|
||
|
||
this.updateRect();
|
||
this.renderer.resize(this.rect.width, this.rect.height);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.detachMouseEvents(this.canvas);
|
||
this.detachRectEvents();
|
||
this.stopColorPickingLoop();
|
||
this.props.vm.runtime.removeListener('QUESTION', this.questionListener);
|
||
}
|
||
|
||
questionListener(question) {
|
||
this.setState({
|
||
question: question
|
||
});
|
||
}
|
||
|
||
handleQuestionAnswered(answer) {
|
||
this.setState({
|
||
question: null
|
||
}, () => {
|
||
this.props.vm.runtime.emit('ANSWER', answer);
|
||
});
|
||
}
|
||
|
||
startColorPickingLoop() {
|
||
const callback = () => {
|
||
this.animationFrameId = requestAnimationFrame(callback);
|
||
|
||
if (typeof this.pickX === 'number') {
|
||
this.setState({
|
||
colorInfo: this.getColorInfo(this.pickX, this.pickY)
|
||
});
|
||
}
|
||
};
|
||
|
||
this.animationFrameId = requestAnimationFrame(callback);
|
||
}
|
||
|
||
stopColorPickingLoop() {
|
||
cancelAnimationFrame(this.animationFrameId);
|
||
}
|
||
|
||
attachMouseEvents(canvas) {
|
||
document.addEventListener('mousemove', this.onMouseMove);
|
||
document.addEventListener('mouseup', this.onMouseUp);
|
||
document.addEventListener('touchmove', this.onMouseMove);
|
||
document.addEventListener('touchend', this.onMouseUp);
|
||
canvas.addEventListener('mousedown', this.onMouseDown);
|
||
canvas.addEventListener('touchstart', this.onMouseDown);
|
||
canvas.addEventListener('wheel', this.onWheel);
|
||
canvas.addEventListener('contextmenu', this.onContextMenu);
|
||
}
|
||
|
||
detachMouseEvents(canvas) {
|
||
document.removeEventListener('mousemove', this.onMouseMove);
|
||
document.removeEventListener('mouseup', this.onMouseUp);
|
||
document.removeEventListener('touchmove', this.onMouseMove);
|
||
document.removeEventListener('touchend', this.onMouseUp);
|
||
canvas.removeEventListener('mousedown', this.onMouseDown);
|
||
canvas.removeEventListener('touchstart', this.onMouseDown);
|
||
canvas.removeEventListener('wheel', this.onWheel);
|
||
canvas.removeEventListener('contextmenu', this.onContextMenu);
|
||
}
|
||
|
||
attachRectEvents() {
|
||
window.addEventListener('resize', this.updateRect);
|
||
window.addEventListener('scroll', this.updateRect);
|
||
}
|
||
|
||
detachRectEvents() {
|
||
window.removeEventListener('resize', this.updateRect);
|
||
window.removeEventListener('scroll', this.updateRect);
|
||
}
|
||
|
||
updateRect() {
|
||
this.rect = this.canvas.getBoundingClientRect();
|
||
}
|
||
|
||
getScratchCoords(x, y) {
|
||
const nativeSize = this.renderer.getNativeSize();
|
||
return [nativeSize[0] / this.rect.width * (x - this.rect.width / 2), nativeSize[1] / this.rect.height * (y - this.rect.height / 2)];
|
||
}
|
||
|
||
getColorInfo(x, y) {
|
||
return _objectSpread({
|
||
x: x,
|
||
y: y
|
||
}, this.renderer.extractColor(x, y, colorPickerRadius));
|
||
}
|
||
|
||
handleDoubleClick(e) {
|
||
// tw: Disable editing target changing in certain circumstances to avoid lag
|
||
if (this.props.disableEditingTargetChange) {
|
||
return;
|
||
}
|
||
|
||
const {
|
||
x,
|
||
y
|
||
} = Object(_lib_touch_utils__WEBPACK_IMPORTED_MODULE_7__["getEventXY"])(e); // Set editing target from cursor position, if clicking on a sprite.
|
||
|
||
const mousePosition = [x - this.rect.left, y - this.rect.top];
|
||
const drawableId = this.renderer.pick(mousePosition[0], mousePosition[1]);
|
||
if (drawableId === null) return;
|
||
const targetId = this.props.vm.getTargetIdForDrawableId(drawableId);
|
||
if (targetId === null) return;
|
||
this.props.vm.setEditingTarget(targetId);
|
||
}
|
||
|
||
onMouseMove(e) {
|
||
const {
|
||
x,
|
||
y
|
||
} = Object(_lib_touch_utils__WEBPACK_IMPORTED_MODULE_7__["getEventXY"])(e);
|
||
const mousePosition = [x - this.rect.left, y - this.rect.top];
|
||
|
||
if (this.props.isColorPicking) {
|
||
// Set the pickX/Y for the color picker loop to pick up
|
||
this.pickX = mousePosition[0];
|
||
this.pickY = mousePosition[1];
|
||
}
|
||
|
||
if (this.state.mouseDown && !this.state.isDragging) {
|
||
const distanceFromMouseDown = Math.sqrt(Math.pow(mousePosition[0] - this.state.mouseDownPosition[0], 2) + Math.pow(mousePosition[1] - this.state.mouseDownPosition[1], 2));
|
||
|
||
if (distanceFromMouseDown > dragThreshold) {
|
||
this.cancelMouseDownTimeout();
|
||
this.onStartDrag(...this.state.mouseDownPosition);
|
||
}
|
||
}
|
||
|
||
if (this.state.mouseDown && this.state.isDragging) {
|
||
// Editor drag style only updates the drag canvas, does full update at the end of drag
|
||
// Non-editor drag style just updates the sprite continuously.
|
||
if (this.props.useEditorDragStyle) {
|
||
this.positionDragCanvas(mousePosition[0], mousePosition[1]);
|
||
} else {
|
||
const spritePosition = this.getScratchCoords(mousePosition[0], mousePosition[1]);
|
||
this.props.vm.postSpriteInfo({
|
||
x: spritePosition[0] + this.state.dragOffset[0],
|
||
y: -(spritePosition[1] + this.state.dragOffset[1]),
|
||
force: true
|
||
});
|
||
}
|
||
}
|
||
|
||
const coordinates = {
|
||
x: mousePosition[0],
|
||
y: mousePosition[1],
|
||
canvasWidth: this.rect.width,
|
||
canvasHeight: this.rect.height
|
||
};
|
||
this.props.vm.postIOData('mouse', coordinates);
|
||
}
|
||
|
||
onMouseUp(e) {
|
||
const {
|
||
x,
|
||
y
|
||
} = Object(_lib_touch_utils__WEBPACK_IMPORTED_MODULE_7__["getEventXY"])(e);
|
||
const mousePosition = [x - this.rect.left, y - this.rect.top];
|
||
this.cancelMouseDownTimeout();
|
||
this.setState({
|
||
mouseDown: false,
|
||
mouseDownPosition: null
|
||
});
|
||
const data = {
|
||
isDown: false,
|
||
button: e.button,
|
||
x: x - this.rect.left,
|
||
y: y - this.rect.top,
|
||
canvasWidth: this.rect.width,
|
||
canvasHeight: this.rect.height,
|
||
wasDragged: this.state.isDragging
|
||
};
|
||
|
||
if (this.state.isDragging) {
|
||
this.onStopDrag(mousePosition[0], mousePosition[1]);
|
||
}
|
||
|
||
this.props.vm.postIOData('mouse', data);
|
||
|
||
if (this.props.isColorPicking && mousePosition[0] > 0 && mousePosition[0] < this.rect.width && mousePosition[1] > 0 && mousePosition[1] < this.rect.height) {
|
||
const {
|
||
r,
|
||
g,
|
||
b
|
||
} = this.state.colorInfo.color;
|
||
|
||
const componentToString = c => {
|
||
const hex = c.toString(16);
|
||
return hex.length === 1 ? "0".concat(hex) : hex;
|
||
};
|
||
|
||
const colorString = "#".concat(componentToString(r)).concat(componentToString(g)).concat(componentToString(b));
|
||
this.props.onDeactivateColorPicker(colorString);
|
||
this.setState({
|
||
colorInfo: null
|
||
});
|
||
this.pickX = null;
|
||
this.pickY = null;
|
||
}
|
||
}
|
||
|
||
onMouseDown(e) {
|
||
this.updateRect();
|
||
const {
|
||
x,
|
||
y
|
||
} = Object(_lib_touch_utils__WEBPACK_IMPORTED_MODULE_7__["getEventXY"])(e);
|
||
const mousePosition = [x - this.rect.left, y - this.rect.top];
|
||
|
||
if (this.props.isColorPicking) {
|
||
// Set the pickX/Y for the color picker loop to pick up
|
||
this.pickX = mousePosition[0];
|
||
this.pickY = mousePosition[1]; // Immediately update the color picker info
|
||
|
||
this.setState({
|
||
colorInfo: this.getColorInfo(this.pickX, this.pickY)
|
||
});
|
||
} else {
|
||
const isTouchEvent = window.TouchEvent && e instanceof TouchEvent;
|
||
|
||
if (e.button === 0 || isTouchEvent) {
|
||
this.setState({
|
||
mouseDown: true,
|
||
mouseDownPosition: mousePosition,
|
||
mouseDownTimeoutId: setTimeout(this.onStartDrag.bind(this, mousePosition[0], mousePosition[1]), 400)
|
||
});
|
||
}
|
||
|
||
const data = {
|
||
isDown: true,
|
||
button: e.button,
|
||
x: mousePosition[0],
|
||
y: mousePosition[1],
|
||
canvasWidth: this.rect.width,
|
||
canvasHeight: this.rect.height
|
||
};
|
||
this.props.vm.postIOData('mouse', data);
|
||
|
||
if (isTouchEvent && e.preventDefault) {
|
||
// Prevent default to prevent touch from dragging page
|
||
e.preventDefault(); // But we do want any active input to be blurred
|
||
|
||
if (document.activeElement && document.activeElement.blur) {
|
||
document.activeElement.blur();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
onWheel(e) {
|
||
const data = {
|
||
deltaX: e.deltaX,
|
||
deltaY: e.deltaY
|
||
};
|
||
this.props.vm.postIOData('mouseWheel', data);
|
||
}
|
||
|
||
onContextMenu(e) {
|
||
if (this.props.vm.runtime.ioDevices.mouse.usesRightClickDown) {
|
||
e.preventDefault();
|
||
}
|
||
}
|
||
|
||
cancelMouseDownTimeout() {
|
||
if (this.state.mouseDownTimeoutId !== null) {
|
||
clearTimeout(this.state.mouseDownTimeoutId);
|
||
}
|
||
|
||
this.setState({
|
||
mouseDownTimeoutId: null
|
||
});
|
||
}
|
||
/**
|
||
* Initialize the position of the "dragged sprite" canvas
|
||
* @param {DrawableExtraction} drawableData The data returned from renderer.extractDrawableScreenSpace
|
||
* @param {number} x The x position of the initial drag event
|
||
* @param {number} y The y position of the initial drag event
|
||
*/
|
||
|
||
|
||
drawDragCanvas(drawableData, x, y) {
|
||
const {
|
||
imageData,
|
||
x: boundsX,
|
||
y: boundsY,
|
||
width: boundsWidth,
|
||
height: boundsHeight
|
||
} = drawableData;
|
||
this.dragCanvas.width = imageData.width;
|
||
this.dragCanvas.height = imageData.height; // On high-DPI devices, the canvas size in layout-pixels is not equal to the size of the extracted data.
|
||
|
||
this.dragCanvas.style.width = "".concat(boundsWidth, "px");
|
||
this.dragCanvas.style.height = "".concat(boundsHeight, "px");
|
||
this.dragCanvas.getContext('2d').putImageData(imageData, 0, 0); // Position so that pick location is at (0, 0) so that positionDragCanvas()
|
||
// can use translation to move to mouse position smoothly.
|
||
|
||
this.dragCanvas.style.left = "".concat(boundsX - x, "px");
|
||
this.dragCanvas.style.top = "".concat(boundsY - y, "px");
|
||
this.dragCanvas.style.display = 'block';
|
||
}
|
||
|
||
clearDragCanvas() {
|
||
this.dragCanvas.width = this.dragCanvas.height = 0;
|
||
this.dragCanvas.style.display = 'none';
|
||
}
|
||
|
||
positionDragCanvas(mouseX, mouseY) {
|
||
// mouseX/Y are relative to stage top/left, and dragCanvas is already
|
||
// positioned so that the pick location is at (0,0).
|
||
this.dragCanvas.style.transform = "translate(".concat(mouseX, "px, ").concat(mouseY, "px)");
|
||
}
|
||
|
||
onStartDrag(x, y) {
|
||
if (this.state.dragId) return;
|
||
const drawableId = this.renderer.pick(x, y);
|
||
if (drawableId === null) return;
|
||
const targetId = this.props.vm.getTargetIdForDrawableId(drawableId);
|
||
if (targetId === null) return;
|
||
const target = this.props.vm.runtime.getTargetById(targetId); // Do not start drag unless in editor drag mode or target is draggable
|
||
|
||
if (!(this.props.useEditorDragStyle || target.draggable)) return; // Dragging always brings the target to the front
|
||
|
||
target.goToFront();
|
||
const [scratchMouseX, scratchMouseY] = this.getScratchCoords(x, y);
|
||
const offsetX = target.x - scratchMouseX;
|
||
const offsetY = -(target.y + scratchMouseY);
|
||
this.props.vm.startDrag(targetId);
|
||
this.setState({
|
||
isDragging: true,
|
||
dragId: targetId,
|
||
dragOffset: [offsetX, offsetY]
|
||
});
|
||
|
||
if (this.props.useEditorDragStyle) {
|
||
// Extract the drawable art
|
||
const drawableData = this.renderer.extractDrawableScreenSpace(drawableId);
|
||
this.drawDragCanvas(drawableData, x, y);
|
||
this.positionDragCanvas(x, y);
|
||
this.props.vm.postSpriteInfo({
|
||
visible: false
|
||
});
|
||
this.props.vm.renderer.draw();
|
||
}
|
||
}
|
||
|
||
onStopDrag(mouseX, mouseY) {
|
||
const dragId = this.state.dragId;
|
||
|
||
const commonStopDragActions = () => {
|
||
this.props.vm.stopDrag(dragId);
|
||
this.setState({
|
||
isDragging: false,
|
||
dragOffset: null,
|
||
dragId: null
|
||
});
|
||
};
|
||
|
||
if (this.props.useEditorDragStyle) {
|
||
// Need to sequence these actions to prevent flickering.
|
||
const spriteInfo = {
|
||
visible: true
|
||
}; // First update the sprite position if dropped in the stage.
|
||
|
||
if (mouseX > 0 && mouseX < this.rect.width && mouseY > 0 && mouseY < this.rect.height) {
|
||
const spritePosition = this.getScratchCoords(mouseX, mouseY);
|
||
spriteInfo.x = spritePosition[0] + this.state.dragOffset[0];
|
||
spriteInfo.y = -(spritePosition[1] + this.state.dragOffset[1]);
|
||
spriteInfo.force = true;
|
||
}
|
||
|
||
this.props.vm.postSpriteInfo(spriteInfo); // Then clear the dragging canvas and stop drag (potentially slow if selecting sprite)
|
||
|
||
this.clearDragCanvas();
|
||
commonStopDragActions();
|
||
this.props.vm.renderer.draw();
|
||
} else {
|
||
commonStopDragActions();
|
||
}
|
||
}
|
||
|
||
setDragCanvas(canvas) {
|
||
this.dragCanvas = canvas;
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
vm,
|
||
// eslint-disable-line no-unused-vars
|
||
onActivateColorPicker,
|
||
// eslint-disable-line no-unused-vars
|
||
disableEditingTargetChange
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_stage_stage_jsx__WEBPACK_IMPORTED_MODULE_10__["default"], _extends({
|
||
canvas: this.canvas,
|
||
overlay: this.props.vm.runtime.renderer.overlayContainer,
|
||
colorInfo: this.state.colorInfo,
|
||
dragRef: this.setDragCanvas,
|
||
question: this.state.question,
|
||
onDoubleClick: this.handleDoubleClick,
|
||
onQuestionAnswered: this.handleQuestionAnswered
|
||
}, props));
|
||
}
|
||
|
||
}
|
||
|
||
Stage.propTypes = {
|
||
onHighQualityPenChanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
highQualityPen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
customStageSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
}),
|
||
disableEditingTargetChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isColorPicking: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
isPlayerOnly: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isWindowFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
dimensions: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number),
|
||
isStarted: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
micIndicator: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onActivateColorPicker: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onDeactivateColorPicker: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
stageSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(Object.keys(_lib_layout_constants__WEBPACK_IMPORTED_MODULE_6__["STAGE_DISPLAY_SIZES"])).isRequired,
|
||
useEditorDragStyle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a).isRequired
|
||
};
|
||
Stage.defaultProps = {
|
||
useEditorDragStyle: true
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
highQualityPen: state.scratchGui.tw.highQualityPen,
|
||
customStageSize: state.scratchGui.customStageSize,
|
||
disableEditingTargetChange: state.scratchGui.mode.isFullScreen || state.scratchGui.mode.isEmbedded || state.scratchGui.mode.isPlayerOnly,
|
||
isColorPicking: state.scratchGui.colorPicker.active,
|
||
isFullScreen: state.scratchGui.mode.isFullScreen || state.scratchGui.mode.isEmbedded,
|
||
isPlayerOnly: state.scratchGui.mode.isPlayerOnly,
|
||
isWindowFullScreen: state.scratchGui.tw.isWindowFullScreen,
|
||
dimensions: state.scratchGui.tw.dimensions,
|
||
isStarted: state.scratchGui.vmStatus.started,
|
||
micIndicator: state.scratchGui.micIndicator,
|
||
// Do not use editor drag style in fullscreen or player mode.
|
||
useEditorDragStyle: !(state.scratchGui.mode.isFullScreen || state.scratchGui.mode.isPlayerOnly)
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
// tw: handler for syncing high quality pen option changes
|
||
onHighQualityPenChanged: enabled => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_12__["setHighQualityPenState"])(enabled)),
|
||
onActivateColorPicker: () => dispatch(Object(_reducers_color_picker__WEBPACK_IMPORTED_MODULE_11__["activateColorPicker"])()),
|
||
onDeactivateColorPicker: color => dispatch(Object(_reducers_color_picker__WEBPACK_IMPORTED_MODULE_11__["deactivateColorPicker"])(color))
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_5__["connect"])(mapStateToProps, mapDispatchToProps)(Stage));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/tag-button.jsx":
|
||
/*!***************************************!*\
|
||
!*** ./src/containers/tag-button.jsx ***!
|
||
\***************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _components_tag_button_tag_button_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/tag-button/tag-button.jsx */ "./src/components/tag-button/tag-button.jsx");
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class TagButton extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleClick']);
|
||
}
|
||
|
||
handleClick() {
|
||
this.props.onClick(this.props.tag);
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_tag_button_tag_button_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({}, this.props, {
|
||
onClick: this.handleClick
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
TagButton.propTypes = _objectSpread(_objectSpread({}, _components_tag_button_tag_button_jsx__WEBPACK_IMPORTED_MODULE_3__["default"].propTypes), {}, {
|
||
onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
});
|
||
/* harmony default export */ __webpack_exports__["default"] = (TagButton);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/target-highlight.jsx":
|
||
/*!*********************************************!*\
|
||
!*** ./src/containers/target-highlight.jsx ***!
|
||
\*********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class TargetHighlight extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['getPageCoords']);
|
||
} // Transform scratch coordinates into page coordinates
|
||
|
||
|
||
getPageCoords(x, y) {
|
||
const {
|
||
stageWidth,
|
||
stageHeight,
|
||
vm
|
||
} = this.props; // The renderers "nativeSize" is the [width, height] of the stage in scratch-units
|
||
|
||
const nativeSize = vm.renderer.getNativeSize();
|
||
return [stageWidth / nativeSize[0] * x + stageWidth / 2, -(stageHeight / nativeSize[1] * y) + stageHeight / 2];
|
||
}
|
||
|
||
render() {
|
||
const {
|
||
className,
|
||
highlightedTargetId,
|
||
highlightedTargetTime,
|
||
vm
|
||
} = this.props;
|
||
if (!(highlightedTargetId && vm && vm.renderer && vm.runtime.getTargetById(highlightedTargetId))) return null;
|
||
const target = vm.runtime.getTargetById(highlightedTargetId);
|
||
const bounds = vm.renderer.getBounds(target.drawableID);
|
||
const [left, top] = this.getPageCoords(bounds.left, bounds.top);
|
||
const [right, bottom] = this.getPageCoords(bounds.right, bounds.bottom);
|
||
const pad = 2; // px
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
|
||
className: className // Ensure new DOM element each update to restart animation
|
||
,
|
||
key: highlightedTargetTime,
|
||
style: {
|
||
position: 'absolute',
|
||
top: "".concat(top - pad, "px"),
|
||
left: "".concat(left - pad, "px"),
|
||
width: "".concat(right - left + 2 * pad, "px"),
|
||
height: "".concat(bottom - top + 2 * pad, "px")
|
||
}
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
TargetHighlight.propTypes = {
|
||
className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
highlightedTargetId: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
highlightedTargetTime: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,
|
||
stageHeight: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,
|
||
stageWidth: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a)
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
highlightedTargetTime: state.scratchGui.targets.highlightedTargetTime,
|
||
highlightedTargetId: state.scratchGui.targets.highlightedTargetId,
|
||
vm: state.scratchGui.vm
|
||
});
|
||
|
||
const mapDispatchToProps = () => ({});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(TargetHighlight));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/target-pane.jsx":
|
||
/*!****************************************!*\
|
||
!*** ./src/containers/target-pane.jsx ***!
|
||
\****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _reducers_editor_tab__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/editor-tab */ "./src/reducers/editor-tab.js");
|
||
/* harmony import */ var _reducers_hovered_target__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/hovered-target */ "./src/reducers/hovered-target.js");
|
||
/* harmony import */ var _reducers_alerts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../reducers/alerts */ "./src/reducers/alerts.js");
|
||
/* harmony import */ var _reducers_restore_deletion__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../reducers/restore-deletion */ "./src/reducers/restore-deletion.js");
|
||
/* harmony import */ var _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../lib/drag-constants */ "./src/lib/drag-constants.js");
|
||
/* harmony import */ var _components_target_pane_target_pane_jsx__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../components/target-pane/target-pane.jsx */ "./src/components/target-pane/target-pane.jsx");
|
||
/* harmony import */ var _lib_layout_constants__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../lib/layout-constants */ "./src/lib/layout-constants.js");
|
||
/* harmony import */ var _lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../lib/libraries/tw-async-libraries */ "./src/lib/libraries/tw-async-libraries.js");
|
||
/* harmony import */ var _lib_file_uploader_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../lib/file-uploader.js */ "./src/lib/file-uploader.js");
|
||
/* harmony import */ var _lib_shared_messages__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../lib/shared-messages */ "./src/lib/shared-messages.js");
|
||
/* harmony import */ var _lib_empty_assets__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../lib/empty-assets */ "./src/lib/empty-assets.js");
|
||
/* harmony import */ var _reducers_targets__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../reducers/targets */ "./src/reducers/targets.js");
|
||
/* harmony import */ var _lib_backpack_api__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../lib/backpack-api */ "./src/lib/backpack-api.js");
|
||
/* harmony import */ var _lib_randomize_sprite_position__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../lib/randomize-sprite-position */ "./src/lib/randomize-sprite-position.js");
|
||
/* harmony import */ var _lib_download_blob__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../lib/download-blob */ "./src/lib/download-blob.js");
|
||
/* harmony import */ var _lib_log__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../lib/log */ "./src/lib/log.js");
|
||
const _excluded = ["dispatchUpdateRestore", "isRtl", "onActivateTab", "onCloseImporting", "onHighlightTarget", "onReceivedBlocks", "onShowImporting", "workspaceMetrics"];
|
||
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class TargetPane extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleActivateBlocksTab', 'handleBlockDragEnd', 'handleChangeSpriteRotationStyle', 'handleChangeSpriteDirection', 'handleChangeSpriteName', 'handleChangeSpriteSize', 'handleChangeSpriteVisibility', 'handleChangeSpriteX', 'handleChangeSpriteY', 'handleDeleteSprite', 'handleDrop', 'handleDuplicateSprite', 'handleExportSprite', 'handleNewSprite', 'handleSelectSprite', 'handleSurpriseSpriteClick', 'handlePaintSpriteClick', 'handleFileUploadClick', 'handleSpriteUpload', 'setFileInput']);
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.props.vm.addListener('BLOCK_DRAG_END', this.handleBlockDragEnd);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.props.vm.removeListener('BLOCK_DRAG_END', this.handleBlockDragEnd);
|
||
}
|
||
|
||
handleChangeSpriteDirection(direction) {
|
||
this.props.vm.postSpriteInfo({
|
||
direction
|
||
});
|
||
}
|
||
|
||
handleChangeSpriteRotationStyle(rotationStyle) {
|
||
this.props.vm.postSpriteInfo({
|
||
rotationStyle
|
||
});
|
||
}
|
||
|
||
handleChangeSpriteName(name) {
|
||
this.props.vm.renameSprite(this.props.editingTarget, name);
|
||
}
|
||
|
||
handleChangeSpriteSize(size) {
|
||
this.props.vm.postSpriteInfo({
|
||
size
|
||
});
|
||
}
|
||
|
||
handleChangeSpriteVisibility(visible) {
|
||
this.props.vm.postSpriteInfo({
|
||
visible
|
||
});
|
||
}
|
||
|
||
handleChangeSpriteX(x) {
|
||
this.props.vm.postSpriteInfo({
|
||
x
|
||
});
|
||
}
|
||
|
||
handleChangeSpriteY(y) {
|
||
this.props.vm.postSpriteInfo({
|
||
y
|
||
});
|
||
}
|
||
|
||
handleDeleteSprite(id) {
|
||
const restoreSprite = this.props.vm.deleteSprite(id);
|
||
|
||
const restoreFun = () => restoreSprite().then(this.handleActivateBlocksTab);
|
||
|
||
this.props.dispatchUpdateRestore({
|
||
restoreFun: restoreFun,
|
||
deletedItem: 'Sprite'
|
||
});
|
||
}
|
||
|
||
handleDuplicateSprite(id) {
|
||
this.props.vm.duplicateSprite(id);
|
||
}
|
||
|
||
handleExportSprite(id) {
|
||
const spriteName = this.props.vm.runtime.getTargetById(id).getName();
|
||
const saveLink = document.createElement('a');
|
||
document.body.appendChild(saveLink);
|
||
this.props.vm.exportSprite(id).then(content => {
|
||
Object(_lib_download_blob__WEBPACK_IMPORTED_MODULE_20__["default"])("".concat(spriteName, ".sprite3"), content);
|
||
});
|
||
}
|
||
|
||
handleSelectSprite(id) {
|
||
this.props.vm.setEditingTarget(id);
|
||
|
||
if (this.props.stage && id !== this.props.stage.id) {
|
||
this.props.onHighlightTarget(id);
|
||
}
|
||
}
|
||
|
||
async handleSurpriseSpriteClick() {
|
||
const spriteLibraryContent = await Object(_lib_libraries_tw_async_libraries__WEBPACK_IMPORTED_MODULE_13__["getSpriteLibrary"])();
|
||
const surpriseSprites = spriteLibraryContent.filter(sprite => sprite.tags.indexOf('letters') === -1 && sprite.tags.indexOf('numbers') === -1);
|
||
const item = surpriseSprites[Math.floor(Math.random() * surpriseSprites.length)];
|
||
Object(_lib_randomize_sprite_position__WEBPACK_IMPORTED_MODULE_19__["default"])(item);
|
||
this.props.vm.addSprite(JSON.stringify(item)).then(this.handleActivateBlocksTab);
|
||
}
|
||
|
||
handlePaintSpriteClick() {
|
||
const formatMessage = this.props.intl.formatMessage;
|
||
const emptyItem = Object(_lib_empty_assets__WEBPACK_IMPORTED_MODULE_16__["emptySprite"])(formatMessage(_lib_shared_messages__WEBPACK_IMPORTED_MODULE_15__["default"].sprite, {
|
||
index: 1
|
||
}), formatMessage(_lib_shared_messages__WEBPACK_IMPORTED_MODULE_15__["default"].pop), formatMessage(_lib_shared_messages__WEBPACK_IMPORTED_MODULE_15__["default"].costume, {
|
||
index: 1
|
||
}));
|
||
this.props.vm.addSprite(JSON.stringify(emptyItem)).then(() => {
|
||
setTimeout(() => {
|
||
// Wait for targets update to propagate before tab switching
|
||
this.props.onActivateTab(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_6__["COSTUMES_TAB_INDEX"]);
|
||
});
|
||
});
|
||
}
|
||
|
||
handleActivateBlocksTab() {
|
||
this.props.onActivateTab(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_6__["BLOCKS_TAB_INDEX"]);
|
||
}
|
||
|
||
handleNewSprite(spriteJSONString) {
|
||
return this.props.vm.addSprite(spriteJSONString).then(this.handleActivateBlocksTab).catch(err => {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_21__["default"].error(err);
|
||
});
|
||
}
|
||
|
||
handleFileUploadClick() {
|
||
this.fileInput.click();
|
||
}
|
||
|
||
handleSpriteUpload(e) {
|
||
const vm = this.props.vm;
|
||
this.props.onShowImporting();
|
||
Object(_lib_file_uploader_js__WEBPACK_IMPORTED_MODULE_14__["handleFileUpload"])(e.target, (buffer, fileType, fileName, fileIndex, fileCount) => {
|
||
Object(_lib_file_uploader_js__WEBPACK_IMPORTED_MODULE_14__["spriteUpload"])(buffer, fileType, fileName, vm, newSprite => {
|
||
this.handleNewSprite(newSprite).then(() => {
|
||
if (fileIndex === fileCount - 1) {
|
||
this.props.onCloseImporting();
|
||
}
|
||
}).catch(this.props.onCloseImporting);
|
||
}, this.props.onCloseImporting);
|
||
}, this.props.onCloseImporting);
|
||
}
|
||
|
||
setFileInput(input) {
|
||
this.fileInput = input;
|
||
}
|
||
|
||
handleBlockDragEnd(blocks) {
|
||
if (this.props.hoveredTarget.sprite && this.props.hoveredTarget.sprite !== this.props.editingTarget) {
|
||
this.shareBlocks(blocks, this.props.hoveredTarget.sprite, this.props.editingTarget);
|
||
this.props.onReceivedBlocks(true);
|
||
}
|
||
}
|
||
|
||
shareBlocks(blocks, targetId, optFromTargetId) {
|
||
// Position the top-level block based on the scroll position.
|
||
const topBlock = blocks.find(block => block.topLevel);
|
||
|
||
if (topBlock) {
|
||
let metrics;
|
||
|
||
if (this.props.workspaceMetrics.targets[targetId]) {
|
||
metrics = this.props.workspaceMetrics.targets[targetId];
|
||
} else {
|
||
metrics = {
|
||
scrollX: 0,
|
||
scrollY: 0,
|
||
scale: _lib_layout_constants__WEBPACK_IMPORTED_MODULE_12__["BLOCKS_DEFAULT_SCALE"]
|
||
};
|
||
} // Determine position of the top-level block based on the target's workspace metrics.
|
||
|
||
|
||
const {
|
||
scrollX,
|
||
scrollY,
|
||
scale
|
||
} = metrics;
|
||
const posY = -scrollY + 30;
|
||
let posX;
|
||
|
||
if (this.props.isRtl) {
|
||
posX = scrollX + 30;
|
||
} else {
|
||
posX = -scrollX + 30;
|
||
} // Actually apply the position!
|
||
|
||
|
||
topBlock.x = posX / scale;
|
||
topBlock.y = posY / scale;
|
||
}
|
||
|
||
return this.props.vm.shareBlocksToTarget(blocks, targetId, optFromTargetId);
|
||
}
|
||
|
||
handleDrop(dragInfo) {
|
||
const {
|
||
sprite: targetId
|
||
} = this.props.hoveredTarget;
|
||
|
||
if (dragInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].SPRITE) {
|
||
// Add one to both new and target index because we are not counting/moving the stage
|
||
this.props.vm.reorderTarget(dragInfo.index + 1, dragInfo.newIndex + 1);
|
||
} else if (dragInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].BACKPACK_SPRITE) {
|
||
// TODO storage does not have a way of loading zips right now, and may never need it.
|
||
// So for now just grab the zip manually.
|
||
Object(_lib_backpack_api__WEBPACK_IMPORTED_MODULE_18__["fetchSprite"])(dragInfo.payload.bodyUrl).then(sprite3Zip => this.props.vm.addSprite(sprite3Zip));
|
||
} else if (targetId) {
|
||
// Something is being dragged over one of the sprite tiles or the backdrop.
|
||
// Dropping assets like sounds and costumes duplicate the asset on the
|
||
// hovered target. Shared costumes also become the current costume on that target.
|
||
// However, dropping does not switch the editing target or activate that editor tab.
|
||
// This is based on 2.0 behavior, but seems like it keeps confusing switching to a minimum.
|
||
// it allows the user to share multiple things without switching back and forth.
|
||
if (dragInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].COSTUME) {
|
||
this.props.vm.shareCostumeToTarget(dragInfo.index, targetId);
|
||
} else if (targetId && dragInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].SOUND) {
|
||
this.props.vm.shareSoundToTarget(dragInfo.index, targetId);
|
||
} else if (dragInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].BACKPACK_COSTUME) {
|
||
// In scratch 2, this only creates a new sprite from the costume.
|
||
// We may be able to handle both kinds of drops, depending on where
|
||
// the drop happens. For now, just add the costume.
|
||
this.props.vm.addCostume(dragInfo.payload.body, {
|
||
name: dragInfo.payload.name
|
||
}, targetId);
|
||
} else if (dragInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].BACKPACK_SOUND) {
|
||
this.props.vm.addSound({
|
||
md5: dragInfo.payload.body,
|
||
name: dragInfo.payload.name
|
||
}, targetId);
|
||
} else if (dragInfo.dragType === _lib_drag_constants__WEBPACK_IMPORTED_MODULE_10__["default"].BACKPACK_CODE) {
|
||
Object(_lib_backpack_api__WEBPACK_IMPORTED_MODULE_18__["fetchCode"])(dragInfo.payload.bodyUrl).then(blocks => this.shareBlocks(blocks, targetId)).then(() => this.props.vm.refreshWorkspace());
|
||
}
|
||
}
|
||
}
|
||
|
||
render() {
|
||
/* eslint-disable no-unused-vars */
|
||
const _this$props = this.props,
|
||
{
|
||
dispatchUpdateRestore,
|
||
isRtl,
|
||
onActivateTab,
|
||
onCloseImporting,
|
||
onHighlightTarget,
|
||
onReceivedBlocks,
|
||
onShowImporting,
|
||
workspaceMetrics
|
||
} = _this$props,
|
||
componentProps = _objectWithoutProperties(_this$props, _excluded);
|
||
/* eslint-enable no-unused-vars */
|
||
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_target_pane_target_pane_jsx__WEBPACK_IMPORTED_MODULE_11__["default"], _extends({}, componentProps, {
|
||
fileInputRef: this.setFileInput,
|
||
onActivateBlocksTab: this.handleActivateBlocksTab,
|
||
onChangeSpriteDirection: this.handleChangeSpriteDirection,
|
||
onChangeSpriteName: this.handleChangeSpriteName,
|
||
onChangeSpriteRotationStyle: this.handleChangeSpriteRotationStyle,
|
||
onChangeSpriteSize: this.handleChangeSpriteSize,
|
||
onChangeSpriteVisibility: this.handleChangeSpriteVisibility,
|
||
onChangeSpriteX: this.handleChangeSpriteX,
|
||
onChangeSpriteY: this.handleChangeSpriteY,
|
||
onDeleteSprite: this.handleDeleteSprite,
|
||
onDrop: this.handleDrop,
|
||
onDuplicateSprite: this.handleDuplicateSprite,
|
||
onExportSprite: this.handleExportSprite,
|
||
onFileUploadClick: this.handleFileUploadClick,
|
||
onPaintSpriteClick: this.handlePaintSpriteClick,
|
||
onSelectSprite: this.handleSelectSprite,
|
||
onSpriteUpload: this.handleSpriteUpload,
|
||
onSurpriseSpriteClick: this.handleSurpriseSpriteClick
|
||
}));
|
||
}
|
||
|
||
}
|
||
|
||
const _TargetPaneComponent$ = _components_target_pane_target_pane_jsx__WEBPACK_IMPORTED_MODULE_11__["default"].propTypes,
|
||
{
|
||
onSelectSprite,
|
||
// eslint-disable-line no-unused-vars
|
||
onActivateBlocksTab
|
||
} = _TargetPaneComponent$,
|
||
targetPaneProps = _objectWithoutProperties(_TargetPaneComponent$, ["onSelectSprite", "onActivateBlocksTab"]);
|
||
|
||
TargetPane.propTypes = _objectSpread({
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_4__["intlShape"].isRequired,
|
||
onCloseImporting: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onShowImporting: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func
|
||
}, targetPaneProps);
|
||
|
||
const mapStateToProps = state => ({
|
||
editingTarget: state.scratchGui.targets.editingTarget,
|
||
hoveredTarget: state.scratchGui.hoveredTarget,
|
||
isRtl: state.locales.isRtl,
|
||
spriteLibraryVisible: state.scratchGui.modals.spriteLibrary,
|
||
sprites: state.scratchGui.targets.sprites,
|
||
stage: state.scratchGui.targets.stage,
|
||
raiseSprites: state.scratchGui.blockDrag,
|
||
workspaceMetrics: state.scratchGui.workspaceMetrics
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onNewSpriteClick: e => {
|
||
e.preventDefault();
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_5__["openSpriteLibrary"])());
|
||
},
|
||
onRequestCloseSpriteLibrary: () => {
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_5__["closeSpriteLibrary"])());
|
||
},
|
||
onActivateTab: tabIndex => {
|
||
dispatch(Object(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_6__["activateTab"])(tabIndex));
|
||
},
|
||
onReceivedBlocks: receivedBlocks => {
|
||
dispatch(Object(_reducers_hovered_target__WEBPACK_IMPORTED_MODULE_7__["setReceivedBlocks"])(receivedBlocks));
|
||
},
|
||
dispatchUpdateRestore: restoreState => {
|
||
dispatch(Object(_reducers_restore_deletion__WEBPACK_IMPORTED_MODULE_9__["setRestore"])(restoreState));
|
||
},
|
||
onHighlightTarget: id => {
|
||
dispatch(Object(_reducers_targets__WEBPACK_IMPORTED_MODULE_17__["highlightTarget"])(id));
|
||
},
|
||
onCloseImporting: () => dispatch(Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_8__["closeAlertWithId"])('importingAsset')),
|
||
onShowImporting: () => dispatch(Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_8__["showStandardAlert"])('importingAsset'))
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(TargetPane)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/tips-library.jsx":
|
||
/*!*****************************************!*\
|
||
!*** ./src/containers/tips-library.jsx ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/libraries/decks/index.jsx */ "./src/lib/libraries/decks/index.jsx");
|
||
/* harmony import */ var _lib_libraries_tutorial_tags__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/libraries/tutorial-tags */ "./src/lib/libraries/tutorial-tags.js");
|
||
/* harmony import */ var _lib_analytics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/analytics */ "./src/lib/analytics.js");
|
||
/* harmony import */ var _lib_isScratchDesktop__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/isScratchDesktop */ "./src/lib/isScratchDesktop.js");
|
||
/* harmony import */ var _components_library_library_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/library/library.jsx */ "./src/components/library/library.jsx");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _reducers_cards__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../reducers/cards */ "./src/reducers/cards.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
tipsLibraryTitle: {
|
||
"id": "gui.tipsLibrary.tutorials",
|
||
"defaultMessage": "Choose a Tutorial"
|
||
}
|
||
});
|
||
|
||
class TipsLibrary extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleItemSelect']);
|
||
}
|
||
|
||
handleItemSelect(item) {
|
||
_lib_analytics__WEBPACK_IMPORTED_MODULE_6__["default"].event({
|
||
category: 'library',
|
||
action: 'Select How-to',
|
||
label: item.id
|
||
});
|
||
/*
|
||
Support tutorials that require specific starter projects.
|
||
If a tutorial declares "requiredProjectId", check that the URL contains
|
||
it. If it is not, open a new page with this tutorial and project id.
|
||
TODO remove this at first opportunity. If this is still here after HOC2018,
|
||
blame Eric R. Andrew is also on record saying "this is temporary".
|
||
UPDATE well now Paul is wrapped into this as well. Sigh...
|
||
eventually we will find a solution that doesn't involve loading a whole project
|
||
*/
|
||
|
||
if (item.requiredProjectId && item.requiredProjectId !== this.props.projectId) {
|
||
const urlParams = "/projects/".concat(item.requiredProjectId, "/editor?tutorial=").concat(item.urlId);
|
||
return window.open(window.location.origin + urlParams, '_blank');
|
||
}
|
||
|
||
this.props.onActivateDeck(item.id);
|
||
}
|
||
|
||
render() {
|
||
const decksLibraryThumbnailData = Object.keys(_lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_4__["default"]).filter(id => {
|
||
if (Object(_lib_isScratchDesktop__WEBPACK_IMPORTED_MODULE_7__["notScratchDesktop"])()) return true; // Do not filter anything in online editor
|
||
|
||
const deck = _lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_4__["default"][id]; // Scratch Desktop doesn't want tutorials with `requiredProjectId`
|
||
|
||
if (deck.hasOwnProperty('requiredProjectId')) return false; // Scratch Desktop should not load tutorials that are _only_ videos
|
||
|
||
if (deck.steps.filter(s => s.title).length === 0) return false; // Allow any other tutorials
|
||
|
||
return true;
|
||
}).map(id => ({
|
||
rawURL: _lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_4__["default"][id].img,
|
||
id: id,
|
||
name: _lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_4__["default"][id].name,
|
||
featured: true,
|
||
tags: _lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_4__["default"][id].tags,
|
||
urlId: _lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_4__["default"][id].urlId,
|
||
requiredProjectId: _lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_4__["default"][id].requiredProjectId,
|
||
hidden: _lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_4__["default"][id].hidden || false
|
||
}));
|
||
if (!this.props.visible) return null;
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_components_library_library_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], {
|
||
filterable: true,
|
||
data: decksLibraryThumbnailData,
|
||
id: "tipsLibrary",
|
||
tags: _lib_libraries_tutorial_tags__WEBPACK_IMPORTED_MODULE_5__["default"],
|
||
title: this.props.intl.formatMessage(messages.tipsLibraryTitle),
|
||
visible: this.props.visible,
|
||
onItemSelected: this.handleItemSelect,
|
||
onRequestClose: this.props.onRequestClose
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
TipsLibrary.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"].isRequired,
|
||
onActivateDeck: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onRequestClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
projectId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number]),
|
||
visible: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
visible: state.scratchGui.modals.tipsLibrary,
|
||
projectId: state.scratchGui.projectState.projectId
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onActivateDeck: id => dispatch(Object(_reducers_cards__WEBPACK_IMPORTED_MODULE_11__["activateDeck"])(id)),
|
||
onRequestClose: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_10__["closeTipsLibrary"])())
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_9__["connect"])(mapStateToProps, mapDispatchToProps)(TipsLibrary)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/turbo-mode.jsx":
|
||
/*!***************************************!*\
|
||
!*** ./src/containers/turbo-mode.jsx ***!
|
||
\***************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
const _excluded = ["children", "vm"];
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
/**
|
||
* Turbo Mode component passes toggleTurboMode function to its child.
|
||
* It also includes `turboMode` in the props passed to the children.
|
||
* It expects this child to be a function with the signature
|
||
* function (toggleTurboMode, {turboMode, ...props}) {}
|
||
* The component can then be used to attach turbo mode setting functionality
|
||
* to any other component:
|
||
*
|
||
* <TurboMode>{(toggleTurboMode, props) => (
|
||
* <MyCoolComponent
|
||
* turboEnabled={props.turboMode}
|
||
* onClick={toggleTurboMode}
|
||
* {...props}
|
||
* />
|
||
* )}</TurboMode>
|
||
*/
|
||
|
||
class TurboMode extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['toggleTurboMode']);
|
||
}
|
||
|
||
toggleTurboMode() {
|
||
this.props.vm.setTurboMode(!this.props.turboMode);
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
children,
|
||
vm
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return this.props.children(this.toggleTurboMode, props);
|
||
}
|
||
|
||
}
|
||
|
||
TurboMode.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
turboMode: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
setTurboMode: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
})
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
vm: state.scratchGui.vm,
|
||
turboMode: state.scratchGui.vmStatus.turbo
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, () => ({}) // omit dispatch prop
|
||
)(TurboMode));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/tw-change-username.jsx":
|
||
/*!***********************************************!*\
|
||
!*** ./src/containers/tw-change-username.jsx ***!
|
||
\***********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _reducers_menus__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/menus */ "./src/reducers/menus.js");
|
||
/* harmony import */ var _lib_isScratchDesktop__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/isScratchDesktop */ "./src/lib/isScratchDesktop.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["defineMessages"])({
|
||
cannotChangeWhileRunning: {
|
||
"id": "tw.changeUsername.cannotChangeWhileRunning",
|
||
"defaultMessage": "Username cannot be changed while the project is running."
|
||
}
|
||
});
|
||
|
||
class ChangeUsername extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['changeUsername']);
|
||
}
|
||
|
||
changeUsername() {
|
||
if (this.props.running && !Object(_lib_isScratchDesktop__WEBPACK_IMPORTED_MODULE_7__["default"])()) {
|
||
// eslint-disable-next-line no-alert
|
||
alert(this.props.intl.formatMessage(messages.cannotChangeWhileRunning));
|
||
return;
|
||
}
|
||
|
||
this.props.onOpenUsernameModal();
|
||
}
|
||
|
||
render() {
|
||
return this.props.children(this.changeUsername);
|
||
}
|
||
|
||
}
|
||
|
||
ChangeUsername.propTypes = {
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onOpenUsernameModal: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
running: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_4__["intlShape"]
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
running: state.scratchGui.vmStatus.running
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onOpenUsernameModal: () => {
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_5__["openUsernameModal"])());
|
||
dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_6__["closeEditMenu"])());
|
||
}
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(ChangeUsername)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/tw-cloud-toggler.jsx":
|
||
/*!*********************************************!*\
|
||
!*** ./src/containers/tw-cloud-toggler.jsx ***!
|
||
\*********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/tw */ "./src/reducers/tw.js");
|
||
/* harmony import */ var _lib_isScratchDesktop__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/isScratchDesktop */ "./src/lib/isScratchDesktop.js");
|
||
const _excluded = ["children"];
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
cloudUnavailableAlert: {
|
||
"id": "tw.menuBar.cloudUnavailableAlert",
|
||
"defaultMessage": "Cannot use cloud variables, most likely because you opened the editor."
|
||
},
|
||
cloudUnavailableDesktop: {
|
||
"id": "tw.menuBar.cloudUnavailableDesktop",
|
||
"defaultMessage": "Cannot use cloud variables in desktop app."
|
||
}
|
||
});
|
||
|
||
class CloudVariablesToggler extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['toggleCloudVariables']);
|
||
}
|
||
|
||
toggleCloudVariables() {
|
||
if (!this.props.canUseCloudVariables) {
|
||
const message = this.props.intl.formatMessage(Object(_lib_isScratchDesktop__WEBPACK_IMPORTED_MODULE_6__["default"])() ? messages.cloudUnavailableDesktop : messages.cloudUnavailableAlert); // eslint-disable-next-line no-alert
|
||
|
||
alert(message);
|
||
return;
|
||
}
|
||
|
||
this.props.onCloudChange(!this.props.enabled);
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
children
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return this.props.children(this.toggleCloudVariables, props);
|
||
}
|
||
|
||
}
|
||
|
||
CloudVariablesToggler.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"],
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
enabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
username: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onCloudChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
canUseCloudVariables: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
username: state.scratchGui.tw.username,
|
||
enabled: state.scratchGui.tw.cloud,
|
||
canUseCloudVariables: !state.scratchGui.mode.hasEverEnteredEditor
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onCloudChange: enabled => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_5__["setCloud"])(enabled))
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_4__["connect"])(mapStateToProps, mapDispatchToProps)(CloudVariablesToggler)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/tw-custom-extension-modal.jsx":
|
||
/*!******************************************************!*\
|
||
!*** ./src/containers/tw-custom-extension-modal.jsx ***!
|
||
\******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _lib_log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/log */ "./src/lib/log.js");
|
||
/* harmony import */ var _components_tw_custom_extension_modal_custom_extension_modal_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/tw-custom-extension-modal/custom-extension-modal.jsx */ "./src/components/tw-custom-extension-modal/custom-extension-modal.jsx");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _tw_security_manager_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tw-security-manager.jsx */ "./src/containers/tw-security-manager.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class CustomExtensionModal extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleChangeFile', 'handleChangeURL', 'handleClose', 'handleKeyDown', 'handleLoadExtension', 'handleSwitchToFile', 'handleSwitchToURL', 'handleSwitchToText', 'handleChangeText', 'handleDragOver', 'handleDragLeave', 'handleDrop', 'handleChangeUnsandboxed']);
|
||
this.state = {
|
||
files: null,
|
||
type: 'url',
|
||
url: '',
|
||
file: null,
|
||
text: '',
|
||
unsandboxed: false
|
||
};
|
||
}
|
||
|
||
getExtensionURL() {
|
||
if (this.state.type === 'url') {
|
||
return this.state.url;
|
||
}
|
||
|
||
if (this.state.type === 'file') {
|
||
return new Promise((resolve, reject) => {
|
||
const reader = new FileReader();
|
||
|
||
reader.onload = () => resolve(reader.result);
|
||
|
||
reader.onerror = () => reject(new Error("Could not read extension as data URL: ".concat(reader.error)));
|
||
|
||
reader.readAsDataURL(this.state.file);
|
||
});
|
||
}
|
||
|
||
if (this.state.type === 'text') {
|
||
return "data:application/javascript,".concat(encodeURIComponent(this.state.text));
|
||
}
|
||
|
||
return Promise.reject(new Error('Unknown type'));
|
||
}
|
||
|
||
hasValidInput() {
|
||
if (this.state.type === 'url') {
|
||
try {
|
||
const parsed = new URL(this.state.url);
|
||
return parsed.protocol === 'https:' || parsed.protocol === 'http:' || parsed.protocol === 'data:';
|
||
} catch (e) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
if (this.state.type === 'file') {
|
||
return !!this.state.file;
|
||
}
|
||
|
||
if (this.state.type === 'text') {
|
||
return !!this.state.text;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
handleChangeFile(file) {
|
||
this.setState({
|
||
file
|
||
});
|
||
}
|
||
|
||
handleChangeURL(e) {
|
||
this.setState({
|
||
url: e.target.value
|
||
});
|
||
}
|
||
|
||
handleClose() {
|
||
this.props.onClose();
|
||
}
|
||
|
||
handleKeyDown(e) {
|
||
if (e.key === 'Enter' && this.hasValidInput()) {
|
||
e.preventDefault();
|
||
this.handleLoadExtension();
|
||
}
|
||
}
|
||
|
||
async handleLoadExtension() {
|
||
this.handleClose();
|
||
|
||
try {
|
||
const url = await this.getExtensionURL();
|
||
|
||
if (this.state.type !== 'url' && this.state.unsandboxed) {
|
||
Object(_tw_security_manager_jsx__WEBPACK_IMPORTED_MODULE_7__["manuallyTrustExtension"])(url);
|
||
}
|
||
|
||
await this.props.vm.extensionManager.loadExtensionURL(url);
|
||
} catch (err) {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_4__["default"].error(err); // eslint-disable-next-line no-alert
|
||
|
||
alert(err);
|
||
}
|
||
}
|
||
|
||
handleSwitchToFile() {
|
||
this.setState({
|
||
type: 'file'
|
||
});
|
||
}
|
||
|
||
handleSwitchToURL() {
|
||
this.setState({
|
||
type: 'url'
|
||
});
|
||
}
|
||
|
||
handleSwitchToText() {
|
||
this.setState({
|
||
type: 'text'
|
||
});
|
||
}
|
||
|
||
handleChangeText(e) {
|
||
this.setState({
|
||
text: e.target.value
|
||
});
|
||
}
|
||
|
||
handleDragOver(e) {
|
||
if (e.dataTransfer.types.includes('Files')) {
|
||
e.preventDefault();
|
||
e.dataTransfer.dropEffect = 'copy';
|
||
}
|
||
}
|
||
|
||
handleDragLeave() {}
|
||
|
||
handleDrop(e) {
|
||
const file = e.dataTransfer.files[0];
|
||
|
||
if (file) {
|
||
e.preventDefault();
|
||
this.setState({
|
||
type: 'file',
|
||
file
|
||
});
|
||
}
|
||
}
|
||
|
||
isUnsandboxed() {
|
||
if (this.state.type === 'url') {
|
||
return Object(_tw_security_manager_jsx__WEBPACK_IMPORTED_MODULE_7__["isTrustedExtension"])(this.state.url);
|
||
}
|
||
|
||
return this.state.unsandboxed;
|
||
}
|
||
|
||
canChangeUnsandboxed() {
|
||
return this.state.type !== 'url';
|
||
}
|
||
|
||
handleChangeUnsandboxed(e) {
|
||
this.setState({
|
||
unsandboxed: e.target.checked
|
||
});
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_tw_custom_extension_modal_custom_extension_modal_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
canLoadExtension: this.hasValidInput(),
|
||
type: this.state.type,
|
||
onSwitchToFile: this.handleSwitchToFile,
|
||
onSwitchToURL: this.handleSwitchToURL,
|
||
onSwitchToText: this.handleSwitchToText,
|
||
file: this.state.file,
|
||
onChangeFile: this.handleChangeFile,
|
||
onDragOver: this.handleDragOver,
|
||
onDragLeave: this.handleDragLeave,
|
||
onDrop: this.handleDrop,
|
||
url: this.state.url,
|
||
onChangeURL: this.handleChangeURL,
|
||
onKeyDown: this.handleKeyDown,
|
||
text: this.state.text,
|
||
onChangeText: this.handleChangeText,
|
||
unsandboxed: this.isUnsandboxed(),
|
||
onChangeUnsandboxed: this.canChangeUnsandboxed() ? this.handleChangeUnsandboxed : null,
|
||
onLoadExtension: this.handleLoadExtension,
|
||
onClose: this.handleClose
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
CustomExtensionModal.propTypes = {
|
||
onClose: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
extensionManager: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
loadExtensionURL: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func
|
||
})
|
||
})
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
vm: state.scratchGui.vm
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onClose: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_6__["closeCustomExtensionModal"])())
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(CustomExtensionModal));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/tw-fonts-modal.jsx":
|
||
/*!*******************************************!*\
|
||
!*** ./src/containers/tw-fonts-modal.jsx ***!
|
||
\*******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _components_tw_fonts_modal_fonts_modal_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/tw-fonts-modal/fonts-modal.jsx */ "./src/components/tw-fonts-modal/fonts-modal.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class TWFontsModal extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default()(this, ['handleClose', 'handleCustomFontsChanged', 'handleCancelAddFont', 'handleOpenSystemFonts', 'handleOpenLibaryFonts', 'handleOpenCustomFonts']);
|
||
this.state = {
|
||
fonts: this.props.vm.runtime.fontManager.getFonts(),
|
||
screen: ''
|
||
};
|
||
}
|
||
|
||
componentDidMount() {
|
||
this.props.vm.runtime.fontManager.on('change', this.handleCustomFontsChanged);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.props.vm.runtime.fontManager.off('change', this.handleCustomFontsChanged);
|
||
}
|
||
|
||
handleClose() {
|
||
if (this.state.screen) {
|
||
this.setState({
|
||
screen: ''
|
||
});
|
||
} else {
|
||
this.props.onClose();
|
||
}
|
||
}
|
||
|
||
handleCustomFontsChanged() {
|
||
this.setState({
|
||
fonts: this.props.vm.runtime.fontManager.getFonts()
|
||
});
|
||
}
|
||
|
||
handleCancelAddFont() {
|
||
this.setState({
|
||
screen: ''
|
||
});
|
||
}
|
||
|
||
handleOpenSystemFonts() {
|
||
this.setState({
|
||
screen: 'system'
|
||
});
|
||
}
|
||
|
||
handleOpenLibaryFonts() {
|
||
this.setState({
|
||
screen: 'library'
|
||
});
|
||
}
|
||
|
||
handleOpenCustomFonts() {
|
||
this.setState({
|
||
screen: 'custom'
|
||
});
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_tw_fonts_modal_fonts_modal_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
onClose: this.handleClose,
|
||
screen: this.state.screen,
|
||
fonts: this.state.fonts,
|
||
fontManager: this.props.vm.runtime.fontManager,
|
||
onCancelAddFont: this.handleCancelAddFont,
|
||
onOpenSystemFonts: this.handleOpenSystemFonts,
|
||
onOpenLibraryFonts: this.handleOpenLibaryFonts,
|
||
onOpenCustomFonts: this.handleOpenCustomFonts
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
TWFontsModal.propTypes = {
|
||
onClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
runtime: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
fontManager: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
getFonts: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
addSystemFont: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
on: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
off: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
})
|
||
})
|
||
})
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
vm: state.scratchGui.vm
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onClose: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_4__["closeFontsModal"])())
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_2__["connect"])(mapStateToProps, mapDispatchToProps)(TWFontsModal));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/tw-framerate-changer.jsx":
|
||
/*!*************************************************!*\
|
||
!*** ./src/containers/tw-framerate-changer.jsx ***!
|
||
\*************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_5__);
|
||
const _excluded = ["intl", "children", "vm"];
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["defineMessages"])({
|
||
newFramerate: {
|
||
"id": "tw.menuBar.newFramerate",
|
||
"defaultMessage": "New framerate:"
|
||
}
|
||
});
|
||
|
||
class FramerateChanger extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['changeFramerate']);
|
||
}
|
||
|
||
async changeFramerate(e) {
|
||
if (e && (e.ctrlKey || e.shiftKey)) {
|
||
// prompt() returns Promise in desktop app
|
||
// eslint-disable-next-line no-alert
|
||
const newFPS = await prompt(this.props.intl.formatMessage(messages.newFramerate), this.props.framerate);
|
||
|
||
if (newFPS === null) {
|
||
return;
|
||
}
|
||
|
||
const fps = +newFPS;
|
||
|
||
if (isFinite(fps) && fps > 0) {
|
||
this.props.vm.setFramerate(fps);
|
||
}
|
||
} else if (this.props.framerate === 60) {
|
||
this.props.vm.setFramerate(30);
|
||
} else {
|
||
this.props.vm.setFramerate(60);
|
||
}
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
intl,
|
||
children,
|
||
vm
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return this.props.children(this.changeFramerate, props);
|
||
}
|
||
|
||
}
|
||
|
||
FramerateChanger.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_4__["intlShape"],
|
||
children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
framerate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_5___default.a)
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
framerate: state.scratchGui.tw.framerate,
|
||
vm: state.scratchGui.vm
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_4__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, () => ({}) // omit dispatch prop
|
||
)(FramerateChanger)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/tw-restore-point-manager.jsx":
|
||
/*!*****************************************************!*\
|
||
!*** ./src/containers/tw-restore-point-manager.jsx ***!
|
||
\*****************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _reducers_alerts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/alerts */ "./src/reducers/alerts.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/project-state */ "./src/reducers/project-state.js");
|
||
/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../reducers/tw */ "./src/reducers/tw.js");
|
||
/* harmony import */ var _components_tw_restore_point_modal_restore_point_modal_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../components/tw-restore-point-modal/restore-point-modal.jsx */ "./src/components/tw-restore-point-modal/restore-point-modal.jsx");
|
||
/* harmony import */ var _lib_tw_restore_point_api__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../lib/tw-restore-point-api */ "./src/lib/tw-restore-point-api.js");
|
||
/* harmony import */ var _lib_log__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../lib/log */ "./src/lib/log.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/* eslint-disable no-alert */
|
||
|
||
const SAVE_DELAY = 250;
|
||
const MINIMUM_SAVE_TIME = 750;
|
||
|
||
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["defineMessages"])({
|
||
confirmLoad: {
|
||
"id": "tw.restorePoints.confirmLoad",
|
||
"defaultMessage": "You have unsaved changes. Replace existing project?"
|
||
},
|
||
confirmDelete: {
|
||
"id": "tw.restorePoints.confirmDelete",
|
||
"defaultMessage": "Are you sure you want to delete \"{projectTitle}\"? This cannot be undone."
|
||
},
|
||
confirmDeleteAll: {
|
||
"id": "tw.restorePoints.confirmDeleteAll",
|
||
"defaultMessage": "Are you sure you want to delete ALL restore points? This cannot be undone."
|
||
},
|
||
loadError: {
|
||
"id": "tw.restorePoints.error",
|
||
"defaultMessage": "Error loading restore point: {error}"
|
||
}
|
||
});
|
||
|
||
class TWRestorePointManager extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_4___default()(this, ['handleClickCreate', 'handleClickDelete', 'handleClickDeleteAll', 'handleChangeInterval', 'handleClickLoad']);
|
||
this.state = {
|
||
loading: true,
|
||
totalSize: 0,
|
||
restorePoints: [],
|
||
error: null,
|
||
wasChanged: props.projectChanged,
|
||
interval: _lib_tw_restore_point_api__WEBPACK_IMPORTED_MODULE_10__["default"].readInterval()
|
||
};
|
||
this.timeout = null;
|
||
}
|
||
|
||
componentDidMount() {
|
||
if (this.state.wasChanged) {
|
||
this.queueRestorePoint();
|
||
}
|
||
|
||
_lib_tw_restore_point_api__WEBPACK_IMPORTED_MODULE_10__["default"].deleteLegacyRestorePoint();
|
||
}
|
||
|
||
componentWillReceiveProps(nextProps) {
|
||
if (nextProps.isModalVisible && !this.props.isModalVisible) {
|
||
this.refreshState();
|
||
} else if (!nextProps.isModalVisible && this.props.isModalVisible) {
|
||
this.setState({
|
||
restorePoints: []
|
||
});
|
||
}
|
||
|
||
if (nextProps.projectChanged && !this.props.projectChanged && !this.state.wasChanged) {
|
||
this.setState({
|
||
wasChanged: true
|
||
});
|
||
}
|
||
|
||
if (!nextProps.isShowingProject && this.props.isShowingProject) {
|
||
this.setState({
|
||
wasChanged: false
|
||
});
|
||
}
|
||
}
|
||
|
||
componentDidUpdate(prevProps, prevState) {
|
||
if (this.state.wasChanged && !prevState.wasChanged) {
|
||
this.queueRestorePoint();
|
||
} else if (!this.state.wasChanged && prevState.wasChanged) {
|
||
this.cancelQueuedRestorePoint();
|
||
}
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.cancelQueuedRestorePoint();
|
||
}
|
||
|
||
handleClickCreate() {
|
||
this.createRestorePoint(_lib_tw_restore_point_api__WEBPACK_IMPORTED_MODULE_10__["default"].TYPE_MANUAL).catch(error => {
|
||
this.handleModalError(error);
|
||
});
|
||
}
|
||
|
||
handleClickDelete(id) {
|
||
const projectTitle = this.state.restorePoints.find(i => i.id === id).title;
|
||
|
||
if (!confirm(this.props.intl.formatMessage(messages.confirmDelete, {
|
||
projectTitle
|
||
}))) {
|
||
return;
|
||
}
|
||
|
||
this.setState({
|
||
loading: true
|
||
});
|
||
_lib_tw_restore_point_api__WEBPACK_IMPORTED_MODULE_10__["default"].deleteRestorePoint(id).then(() => {
|
||
this.refreshState();
|
||
}).catch(error => {
|
||
this.handleModalError(error);
|
||
});
|
||
}
|
||
|
||
handleClickDeleteAll() {
|
||
if (!confirm(this.props.intl.formatMessage(messages.confirmDeleteAll))) {
|
||
return;
|
||
}
|
||
|
||
this.setState({
|
||
loading: true
|
||
});
|
||
_lib_tw_restore_point_api__WEBPACK_IMPORTED_MODULE_10__["default"].deleteAllRestorePoints().then(() => {
|
||
this.refreshState();
|
||
}).catch(error => {
|
||
this.handleModalError(error);
|
||
});
|
||
}
|
||
|
||
canLoadProject() {
|
||
if (!this.props.isShowingProject) {
|
||
// Loading a project now will break the state machine
|
||
return false;
|
||
}
|
||
|
||
if (this.props.projectChanged && !confirm(this.props.intl.formatMessage(messages.confirmLoad))) {
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
handleClickLoad(id) {
|
||
if (!this.canLoadProject()) {
|
||
return;
|
||
}
|
||
|
||
this.props.onCloseModal();
|
||
this.props.onStartLoadingRestorePoint(this.props.loadingState);
|
||
_lib_tw_restore_point_api__WEBPACK_IMPORTED_MODULE_10__["default"].loadRestorePoint(this.props.vm, id).then(() => {
|
||
this.props.onFinishLoadingRestorePoint(true, this.props.loadingState);
|
||
setTimeout(() => {
|
||
this.props.vm.renderer.draw();
|
||
});
|
||
}).catch(error => {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_11__["default"].error(error);
|
||
alert(this.props.intl.formatMessage(messages.loadError, {
|
||
error
|
||
}));
|
||
this.props.onFinishLoadingRestorePoint(false, this.props.loadingState);
|
||
});
|
||
}
|
||
|
||
handleChangeInterval(e) {
|
||
const interval = +e.target.value;
|
||
_lib_tw_restore_point_api__WEBPACK_IMPORTED_MODULE_10__["default"].setInterval(interval);
|
||
this.setState({
|
||
interval
|
||
}, () => {
|
||
if (this.state.wasChanged) {
|
||
this.cancelQueuedRestorePoint();
|
||
this.queueRestorePoint();
|
||
}
|
||
});
|
||
}
|
||
|
||
queueRestorePoint() {
|
||
if (this.timeout || this.state.interval < 0) {
|
||
return;
|
||
}
|
||
|
||
this.timeout = setTimeout(() => {
|
||
this.createRestorePoint(_lib_tw_restore_point_api__WEBPACK_IMPORTED_MODULE_10__["default"].TYPE_AUTOMATIC).then(() => {
|
||
this.timeout = null;
|
||
this.queueRestorePoint();
|
||
});
|
||
}, this.state.interval);
|
||
}
|
||
|
||
cancelQueuedRestorePoint() {
|
||
if (this.timeout) {
|
||
clearTimeout(this.timeout);
|
||
this.timeout = null;
|
||
}
|
||
}
|
||
|
||
createRestorePoint(type) {
|
||
if (this.props.isModalVisible) {
|
||
this.setState({
|
||
loading: true
|
||
});
|
||
}
|
||
|
||
this.props.onStartCreatingRestorePoint();
|
||
return Promise.all([// Wait a little bit before saving so UI can update before saving, which can cause stutter
|
||
sleep(SAVE_DELAY).then(() => _lib_tw_restore_point_api__WEBPACK_IMPORTED_MODULE_10__["default"].createRestorePoint(this.props.vm, this.props.projectTitle, type)).then(() => _lib_tw_restore_point_api__WEBPACK_IMPORTED_MODULE_10__["default"].removeExtraneousRestorePoints()), // Force saves to not be instant so people can see that we're making a restore point
|
||
// It also makes refreshes less likely to cause accidental clicks in the modal
|
||
sleep(MINIMUM_SAVE_TIME)]).then(() => {
|
||
this.props.onFinishCreatingRestorePoint();
|
||
|
||
if (this.props.isModalVisible) {
|
||
this.refreshState();
|
||
}
|
||
}).catch(error => {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_11__["default"].error(error);
|
||
this.props.onErrorCreatingRestorePoint();
|
||
|
||
if (this.props.isModalVisible) {
|
||
this.refreshState();
|
||
}
|
||
});
|
||
}
|
||
|
||
refreshState() {
|
||
this.setState({
|
||
loading: true,
|
||
error: null,
|
||
restorePoints: []
|
||
});
|
||
_lib_tw_restore_point_api__WEBPACK_IMPORTED_MODULE_10__["default"].getAllRestorePoints().then(data => {
|
||
this.setState({
|
||
loading: false,
|
||
totalSize: data.totalSize,
|
||
restorePoints: data.restorePoints
|
||
});
|
||
}).catch(error => {
|
||
this.handleModalError(error);
|
||
});
|
||
}
|
||
|
||
handleModalError(error) {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_11__["default"].error('Restore point error', error);
|
||
this.setState({
|
||
error: "".concat(error),
|
||
loading: false
|
||
});
|
||
}
|
||
|
||
render() {
|
||
if (this.props.isModalVisible) {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_tw_restore_point_modal_restore_point_modal_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
||
onClose: this.props.onCloseModal,
|
||
onClickCreate: this.handleClickCreate,
|
||
onClickDelete: this.handleClickDelete,
|
||
onClickDeleteAll: this.handleClickDeleteAll,
|
||
onClickLoad: this.handleClickLoad,
|
||
interval: this.state.interval,
|
||
onChangeInterval: this.handleChangeInterval,
|
||
isLoading: this.state.loading,
|
||
totalSize: this.state.totalSize,
|
||
restorePoints: this.state.restorePoints,
|
||
error: this.state.error
|
||
});
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
}
|
||
|
||
TWRestorePointManager.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_2__["intlShape"],
|
||
projectChanged: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool.isRequired,
|
||
projectTitle: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string.isRequired,
|
||
onStartCreatingRestorePoint: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func.isRequired,
|
||
onFinishCreatingRestorePoint: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func.isRequired,
|
||
onErrorCreatingRestorePoint: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func.isRequired,
|
||
onStartLoadingRestorePoint: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func.isRequired,
|
||
onFinishLoadingRestorePoint: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func.isRequired,
|
||
onCloseModal: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func.isRequired,
|
||
loadingState: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_reducers_project_state__WEBPACK_IMPORTED_MODULE_7__["LoadingStates"]).isRequired,
|
||
isShowingProject: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool.isRequired,
|
||
isModalVisible: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool.isRequired,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({
|
||
loadProject: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func.isRequired,
|
||
stop: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func.isRequired,
|
||
renderer: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({
|
||
draw: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func.isRequired
|
||
})
|
||
}).isRequired
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
projectChanged: state.scratchGui.projectChanged,
|
||
projectTitle: state.scratchGui.projectTitle,
|
||
loadingState: state.scratchGui.projectState.loadingState,
|
||
isShowingProject: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_7__["getIsShowingProject"])(state.scratchGui.projectState.loadingState),
|
||
isModalVisible: state.scratchGui.modals.restorePointModal,
|
||
vm: state.scratchGui.vm
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onStartCreatingRestorePoint: () => dispatch(Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_5__["showStandardAlert"])('twCreatingRestorePoint')),
|
||
onFinishCreatingRestorePoint: () => Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_5__["showAlertWithTimeout"])(dispatch, 'twRestorePointSuccess'),
|
||
onErrorCreatingRestorePoint: () => Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_5__["showAlertWithTimeout"])(dispatch, 'twRestorePointError'),
|
||
onStartLoadingRestorePoint: loadingState => {
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_6__["openLoadingProject"])());
|
||
dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_7__["requestProjectUpload"])(loadingState));
|
||
},
|
||
onFinishLoadingRestorePoint: (success, loadingState) => {
|
||
dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_7__["onLoadedProject"])(loadingState, false, success));
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_6__["closeLoadingProject"])());
|
||
dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_8__["setFileHandle"])(null));
|
||
},
|
||
onCloseModal: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_6__["closeRestorePointModal"])())
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_1__["connect"])(mapStateToProps, mapDispatchToProps)(TWRestorePointManager)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/tw-security-manager.jsx":
|
||
/*!************************************************!*\
|
||
!*** ./src/containers/tw-security-manager.jsx ***!
|
||
\************************************************/
|
||
/*! exports provided: default, manuallyTrustExtension, isTrustedExtension */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ConnectedSecurityManagerComponent; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "manuallyTrustExtension", function() { return manuallyTrustExtension; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isTrustedExtension", function() { return isTrustedExtension; });
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _lib_log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/log */ "./src/lib/log.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _components_tw_security_manager_modal_security_manager_modal_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/tw-security-manager-modal/security-manager-modal.jsx */ "./src/components/tw-security-manager-modal/security-manager-modal.jsx");
|
||
/* harmony import */ var _lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/tw-security-manager-constants */ "./src/lib/tw-security-manager-constants.js");
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/**
|
||
* Set of extension URLs that the user has manually trusted to load unsandboxed.
|
||
*/
|
||
|
||
const extensionsTrustedByUser = new Set();
|
||
|
||
const manuallyTrustExtension = url => {
|
||
extensionsTrustedByUser.add(url);
|
||
};
|
||
/**
|
||
* Trusted extensions are loaded automatically and without a sandbox.
|
||
* @param {string} url URL as a string.
|
||
* @returns {boolean} True if the extension can is trusted
|
||
*/
|
||
|
||
|
||
const isTrustedExtension = url => // Always trust our official extension repostiory.
|
||
url.startsWith('https://extensions.turbowarp.org/') || // For development.
|
||
url.startsWith('http://localhost:8000/') || extensionsTrustedByUser.has(url);
|
||
/**
|
||
* Set of fetch resource origins that were manually trusted by the user.
|
||
* @type {Set<string>}
|
||
*/
|
||
|
||
|
||
const fetchOriginsTrustedByUser = new Set();
|
||
/**
|
||
* Set of origins manually trusted by the user for embedding.
|
||
* @type {Set<string>}
|
||
*/
|
||
|
||
const embedOriginsTrustedByUser = new Set();
|
||
/**
|
||
* @param {URL} parsed Parsed URL object
|
||
* @returns {boolean} True if the URL is part of the builtin set of URLs to always trust fetching from.
|
||
*/
|
||
|
||
const isAlwaysTrustedForFetching = parsed => // If we would trust loading an extension from here, we can trust loading resources too.
|
||
isTrustedExtension(parsed.href) || // Any TurboWarp service such as trampoline
|
||
parsed.origin === 'https://turbowarp.org' || parsed.origin.endsWith('.turbowarp.org') || parsed.origin.endsWith('.turbowarp.xyz') || // GitHub
|
||
parsed.origin === 'https://raw.githubusercontent.com' || parsed.origin === 'https://api.github.com' || // GitLab
|
||
parsed.origin === 'https://gitlab.com' || // Itch
|
||
parsed.origin.endsWith('.itch.io') || // GameJolt
|
||
parsed.origin === 'https://api.gamejolt.com' || // httpbin
|
||
parsed.origin === 'https://httpbin.org' || // ScratchDB
|
||
parsed.origin === 'https://scratchdb.lefty.one';
|
||
/**
|
||
* @param {string} url Original URL string
|
||
* @returns {URL|null} A URL object if it is valid and of a known protocol, otherwise null.
|
||
*/
|
||
|
||
|
||
const parseURL = url => {
|
||
let parsed;
|
||
|
||
try {
|
||
parsed = new URL(url);
|
||
} catch (e) {
|
||
return null;
|
||
}
|
||
|
||
const protocols = ['http:', 'https:', 'ws:', 'wss:', 'data:', 'blob:'];
|
||
|
||
if (!protocols.includes(parsed.protocol)) {
|
||
return null;
|
||
}
|
||
|
||
return parsed;
|
||
};
|
||
|
||
let allowedAudio = false;
|
||
let allowedVideo = false;
|
||
let allowedReadClipboard = false;
|
||
let allowedNotify = false;
|
||
let allowedGeolocation = false;
|
||
const SECURITY_MANAGER_METHODS = ['getSandboxMode', 'canLoadExtensionFromProject', 'canFetch', 'canOpenWindow', 'canRedirect', 'canRecordAudio', 'canRecordVideo', 'canReadClipboard', 'canNotify', 'canGeolocate', 'canEmbed'];
|
||
|
||
class TWSecurityManagerComponent extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_4___default()(this, ['handleAllowed', 'handleDenied']);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_4___default()(this, SECURITY_MANAGER_METHODS);
|
||
this.nextModalCallbacks = [];
|
||
this.modalLocked = false;
|
||
this.state = {
|
||
type: null,
|
||
data: null,
|
||
callback: null,
|
||
modalCount: 0
|
||
};
|
||
}
|
||
|
||
componentDidMount() {
|
||
const securityManager = this.props.vm.extensionManager.securityManager;
|
||
|
||
for (const method of SECURITY_MANAGER_METHODS) {
|
||
securityManager[method] = this[method];
|
||
}
|
||
} // eslint-disable-next-line valid-jsdoc
|
||
|
||
/**
|
||
* @returns {Promise<() => Promise<boolean>>} Resolves with a function that you can call to show the modal.
|
||
* The resolved function returns a promise that resolves with true if the request was approved.
|
||
*/
|
||
|
||
|
||
async acquireModalLock() {
|
||
// We need a two-step process for showing a modal so that we don't overwrite or overlap modals,
|
||
// and so that multiple attempts to fetch resources from the same origin will all be allowed
|
||
// with just one click. This means that some places have to wait until previous modals are
|
||
// closed before it knows if it needs to display another modal.
|
||
if (this.modalLocked) {
|
||
await new Promise(resolve => {
|
||
this.nextModalCallbacks.push(resolve);
|
||
});
|
||
} else {
|
||
this.modalLocked = true;
|
||
}
|
||
|
||
const releaseLock = () => {
|
||
if (this.nextModalCallbacks.length) {
|
||
const nextModalCallback = this.nextModalCallbacks.shift();
|
||
nextModalCallback();
|
||
} else {
|
||
this.modalLocked = false;
|
||
this.setState({
|
||
// only clear type in case other data needs to be accessed
|
||
type: null
|
||
});
|
||
}
|
||
};
|
||
|
||
const showModal = async (type, data) => {
|
||
const result = await new Promise(resolve => {
|
||
this.setState(oldState => ({
|
||
type,
|
||
data,
|
||
callback: resolve,
|
||
modalCount: oldState.modalCount + 1
|
||
}));
|
||
});
|
||
releaseLock();
|
||
return result;
|
||
};
|
||
|
||
return {
|
||
showModal,
|
||
releaseLock
|
||
};
|
||
}
|
||
|
||
handleAllowed() {
|
||
this.state.callback(true);
|
||
}
|
||
|
||
handleDenied() {
|
||
this.state.callback(false);
|
||
}
|
||
/**
|
||
* @param {string} url The extension's URL
|
||
* @returns {string} The VM worker mode to use
|
||
*/
|
||
|
||
|
||
getSandboxMode(url) {
|
||
if (isTrustedExtension(url)) {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_3__["default"].info("Loading extension ".concat(url, " unsandboxed"));
|
||
return 'unsandboxed';
|
||
}
|
||
|
||
return 'iframe';
|
||
}
|
||
|
||
handleChangeUnsandboxed(e) {
|
||
const checked = e.target.checked;
|
||
this.setState(oldState => ({
|
||
data: _objectSpread(_objectSpread({}, oldState.data), {}, {
|
||
unsandboxed: checked
|
||
})
|
||
}));
|
||
}
|
||
/**
|
||
* @param {string} url The extension's URL
|
||
* @returns {Promise<boolean>} Whether the extension can be loaded
|
||
*/
|
||
|
||
|
||
async canLoadExtensionFromProject(url) {
|
||
if (isTrustedExtension(url)) {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_3__["default"].info("Loading extension ".concat(url, " automatically"));
|
||
return true;
|
||
}
|
||
|
||
const {
|
||
showModal
|
||
} = await this.acquireModalLock();
|
||
|
||
if (url.startsWith('data:')) {
|
||
const allowed = await showModal(_lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_6__["default"].LoadExtension, {
|
||
url,
|
||
unsandboxed: false,
|
||
onChangeUnsandboxed: this.handleChangeUnsandboxed.bind(this)
|
||
});
|
||
|
||
if (this.state.data.unsandboxed) {
|
||
manuallyTrustExtension(url);
|
||
}
|
||
|
||
return allowed;
|
||
}
|
||
|
||
return showModal(_lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_6__["default"].LoadExtension, {
|
||
url,
|
||
unsandboxed: false
|
||
});
|
||
}
|
||
/**
|
||
* @param {string} url The resource to fetch
|
||
* @returns {Promise<boolean>} True if the resource is allowed to be fetched
|
||
*/
|
||
|
||
|
||
async canFetch(url) {
|
||
const parsed = parseURL(url);
|
||
|
||
if (!parsed) {
|
||
return false;
|
||
}
|
||
|
||
if (isAlwaysTrustedForFetching(parsed)) {
|
||
return true;
|
||
}
|
||
|
||
const {
|
||
showModal,
|
||
releaseLock
|
||
} = await this.acquireModalLock();
|
||
|
||
if (fetchOriginsTrustedByUser.has(origin)) {
|
||
releaseLock();
|
||
return true;
|
||
}
|
||
|
||
const allowed = await showModal(_lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_6__["default"].Fetch, {
|
||
url
|
||
});
|
||
|
||
if (allowed) {
|
||
fetchOriginsTrustedByUser.add(origin);
|
||
}
|
||
|
||
return allowed;
|
||
}
|
||
/**
|
||
* @param {string} url The website to open
|
||
* @returns {Promise<boolean>} True if the website can be opened
|
||
*/
|
||
|
||
|
||
async canOpenWindow(url) {
|
||
const parsed = parseURL(url);
|
||
|
||
if (!parsed) {
|
||
return false;
|
||
}
|
||
|
||
const {
|
||
showModal
|
||
} = await this.acquireModalLock();
|
||
return showModal(_lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_6__["default"].OpenWindow, {
|
||
url
|
||
});
|
||
}
|
||
/**
|
||
* @param {string} url The website to redirect to
|
||
* @returns {Promise<boolean>} True if the website can be redirected to
|
||
*/
|
||
|
||
|
||
async canRedirect(url) {
|
||
const parsed = parseURL(url);
|
||
|
||
if (!parsed) {
|
||
return false;
|
||
}
|
||
|
||
const {
|
||
showModal
|
||
} = await this.acquireModalLock();
|
||
return showModal(_lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_6__["default"].Redirect, {
|
||
url
|
||
});
|
||
}
|
||
/**
|
||
* @returns {Promise<boolean>} True if audio can be recorded
|
||
*/
|
||
|
||
|
||
async canRecordAudio() {
|
||
if (!allowedAudio) {
|
||
const {
|
||
showModal
|
||
} = await this.acquireModalLock();
|
||
allowedAudio = await showModal(_lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_6__["default"].RecordAudio);
|
||
}
|
||
|
||
return allowedAudio;
|
||
}
|
||
/**
|
||
* @returns {Promise<boolean>} True if video can be recorded
|
||
*/
|
||
|
||
|
||
async canRecordVideo() {
|
||
if (!allowedVideo) {
|
||
const {
|
||
showModal
|
||
} = await this.acquireModalLock();
|
||
allowedVideo = await showModal(_lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_6__["default"].RecordVideo);
|
||
}
|
||
|
||
return allowedVideo;
|
||
}
|
||
/**
|
||
* @returns {Promise<boolean>} True if the clipboard can be read
|
||
*/
|
||
|
||
|
||
async canReadClipboard() {
|
||
if (!allowedReadClipboard) {
|
||
const {
|
||
showModal
|
||
} = await this.acquireModalLock();
|
||
allowedReadClipboard = await showModal(_lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_6__["default"].ReadClipboard);
|
||
}
|
||
|
||
return allowedReadClipboard;
|
||
}
|
||
/**
|
||
* @returns {Promise<boolean>} True if the notifications are allowed
|
||
*/
|
||
|
||
|
||
async canNotify() {
|
||
if (!allowedNotify) {
|
||
const {
|
||
showModal
|
||
} = await this.acquireModalLock();
|
||
allowedNotify = await showModal(_lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_6__["default"].Notify);
|
||
}
|
||
|
||
return allowedNotify;
|
||
}
|
||
/**
|
||
* @returns {Promise<boolean>} True if geolocation is allowed.
|
||
*/
|
||
|
||
|
||
async canGeolocate() {
|
||
if (!allowedGeolocation) {
|
||
const {
|
||
showModal
|
||
} = await this.acquireModalLock();
|
||
allowedGeolocation = await showModal(_lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_6__["default"].Geolocate);
|
||
}
|
||
|
||
return allowedGeolocation;
|
||
}
|
||
/**
|
||
* @param {string} url Frame URL
|
||
* @returns {Promise<boolean>} True if embed is allowed.
|
||
*/
|
||
|
||
|
||
async canEmbed(url) {
|
||
const parsed = parseURL(url);
|
||
|
||
if (!parsed) {
|
||
return false;
|
||
}
|
||
|
||
const origin = parsed.protocol === 'http:' || parsed.protocol === 'https:' ? parsed.origin : null;
|
||
const {
|
||
showModal,
|
||
releaseLock
|
||
} = await this.acquireModalLock();
|
||
|
||
if (origin && embedOriginsTrustedByUser.has(origin)) {
|
||
releaseLock();
|
||
return true;
|
||
}
|
||
|
||
const allowed = await showModal(_lib_tw_security_manager_constants__WEBPACK_IMPORTED_MODULE_6__["default"].Embed, {
|
||
url
|
||
});
|
||
|
||
if (origin && allowed) {
|
||
embedOriginsTrustedByUser.add(origin);
|
||
}
|
||
|
||
return allowed;
|
||
}
|
||
|
||
render() {
|
||
if (this.state.type) {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_tw_security_manager_modal_security_manager_modal_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
type: this.state.type,
|
||
data: this.state.data,
|
||
onAllowed: this.handleAllowed,
|
||
onDenied: this.handleDenied,
|
||
key: this.state.modalCount
|
||
});
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
}
|
||
|
||
TWSecurityManagerComponent.propTypes = {
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
extensionManager: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
securityManager: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape(SECURITY_MANAGER_METHODS.reduce((obj, method) => {
|
||
obj[method] = prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired;
|
||
return obj;
|
||
}, {})).isRequired
|
||
}).isRequired
|
||
}).isRequired
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
vm: state.scratchGui.vm
|
||
});
|
||
|
||
const mapDispatchToProps = () => ({});
|
||
|
||
const ConnectedSecurityManagerComponent = Object(react_redux__WEBPACK_IMPORTED_MODULE_2__["connect"])(mapStateToProps, mapDispatchToProps)(TWSecurityManagerComponent);
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/tw-settings-modal.jsx":
|
||
/*!**********************************************!*\
|
||
!*** ./src/containers/tw-settings-modal.jsx ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _components_tw_settings_modal_settings_modal_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/tw-settings-modal/settings-modal.jsx */ "./src/components/tw-settings-modal/settings-modal.jsx");
|
||
/* harmony import */ var _reducers_custom_stage_size__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/custom-stage-size */ "./src/reducers/custom-stage-size.js");
|
||
const _excluded = ["onClose", "vm"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["defineMessages"])({
|
||
newFramerate: {
|
||
"id": "tw.menuBar.newFramerate",
|
||
"defaultMessage": "New framerate:"
|
||
}
|
||
});
|
||
|
||
class UsernameModal extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default()(this, ['handleFramerateChange', 'handleCustomizeFramerate', 'handleHighQualityPenChange', 'handleInterpolationChange', 'handleInfiniteClonesChange', 'handleRemoveFencingChange', 'handleRemoveLimitsChange', 'handleWarpTimerChange', 'handleStageWidthChange', 'handleStageHeightChange', 'handleDisableCompilerChange', 'handleStoreProjectOptions']);
|
||
}
|
||
|
||
handleFramerateChange(e) {
|
||
this.props.vm.setFramerate(e.target.checked ? 60 : 30);
|
||
}
|
||
|
||
async handleCustomizeFramerate() {
|
||
// prompt() returns Promise in desktop app
|
||
// eslint-disable-next-line no-alert
|
||
const newFramerate = await prompt(this.props.intl.formatMessage(messages.newFramerate), this.props.framerate);
|
||
const parsed = parseFloat(newFramerate);
|
||
|
||
if (isFinite(parsed)) {
|
||
this.props.vm.setFramerate(parsed);
|
||
}
|
||
}
|
||
|
||
handleHighQualityPenChange(e) {
|
||
this.props.vm.renderer.setUseHighQualityRender(e.target.checked);
|
||
}
|
||
|
||
handleInterpolationChange(e) {
|
||
this.props.vm.setInterpolation(e.target.checked);
|
||
}
|
||
|
||
handleInfiniteClonesChange(e) {
|
||
this.props.vm.setRuntimeOptions({
|
||
maxClones: e.target.checked ? Infinity : 300
|
||
});
|
||
}
|
||
|
||
handleRemoveFencingChange(e) {
|
||
this.props.vm.setRuntimeOptions({
|
||
fencing: !e.target.checked
|
||
});
|
||
}
|
||
|
||
handleRemoveLimitsChange(e) {
|
||
this.props.vm.setRuntimeOptions({
|
||
miscLimits: !e.target.checked
|
||
});
|
||
}
|
||
|
||
handleWarpTimerChange(e) {
|
||
this.props.vm.setCompilerOptions({
|
||
warpTimer: e.target.checked
|
||
});
|
||
}
|
||
|
||
handleDisableCompilerChange(e) {
|
||
this.props.vm.setCompilerOptions({
|
||
enabled: !e.target.checked
|
||
});
|
||
}
|
||
|
||
handleStageWidthChange(value) {
|
||
this.props.vm.setStageSize(value, this.props.customStageSize.height);
|
||
}
|
||
|
||
handleStageHeightChange(value) {
|
||
this.props.vm.setStageSize(this.props.customStageSize.width, value);
|
||
}
|
||
|
||
handleStoreProjectOptions() {
|
||
this.props.vm.storeProjectOptions();
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
onClose,
|
||
vm
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_tw_settings_modal_settings_modal_jsx__WEBPACK_IMPORTED_MODULE_6__["default"], _extends({
|
||
onClose: this.props.onClose,
|
||
onFramerateChange: this.handleFramerateChange,
|
||
onCustomizeFramerate: this.handleCustomizeFramerate,
|
||
onHighQualityPenChange: this.handleHighQualityPenChange,
|
||
onInterpolationChange: this.handleInterpolationChange,
|
||
onInfiniteClonesChange: this.handleInfiniteClonesChange,
|
||
onRemoveFencingChange: this.handleRemoveFencingChange,
|
||
onRemoveLimitsChange: this.handleRemoveLimitsChange,
|
||
onWarpTimerChange: this.handleWarpTimerChange,
|
||
onStageWidthChange: this.handleStageWidthChange,
|
||
onStageHeightChange: this.handleStageHeightChange,
|
||
onDisableCompilerChange: this.handleDisableCompilerChange,
|
||
stageWidth: this.props.customStageSize.width,
|
||
stageHeight: this.props.customStageSize.height,
|
||
customStageSizeEnabled: this.props.customStageSize.width !== _reducers_custom_stage_size__WEBPACK_IMPORTED_MODULE_7__["defaultStageSize"].width || this.props.customStageSize.height !== _reducers_custom_stage_size__WEBPACK_IMPORTED_MODULE_7__["defaultStageSize"].height,
|
||
onStoreProjectOptions: this.handleStoreProjectOptions
|
||
}, props));
|
||
}
|
||
|
||
}
|
||
|
||
UsernameModal.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_2__["intlShape"],
|
||
onClose: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
renderer: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
setUseHighQualityRender: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func
|
||
}),
|
||
setFramerate: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
setCompilerOptions: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
setInterpolation: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
setRuntimeOptions: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
setStageSize: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
storeProjectOptions: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func
|
||
}),
|
||
isEmbedded: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
framerate: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
highQualityPen: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
interpolation: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
infiniteClones: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
removeFencing: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
removeLimits: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
warpTimer: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
customStageSize: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number
|
||
}),
|
||
disableCompiler: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
vm: state.scratchGui.vm,
|
||
isEmbedded: state.scratchGui.mode.isEmbedded,
|
||
framerate: state.scratchGui.tw.framerate,
|
||
highQualityPen: state.scratchGui.tw.highQualityPen,
|
||
interpolation: state.scratchGui.tw.interpolation,
|
||
infiniteClones: state.scratchGui.tw.runtimeOptions.maxClones === Infinity,
|
||
removeFencing: !state.scratchGui.tw.runtimeOptions.fencing,
|
||
removeLimits: !state.scratchGui.tw.runtimeOptions.miscLimits,
|
||
warpTimer: state.scratchGui.tw.compilerOptions.warpTimer,
|
||
customStageSize: state.scratchGui.customStageSize,
|
||
disableCompiler: !state.scratchGui.tw.compilerOptions.enabled
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onClose: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_5__["closeSettingsModal"])())
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_4__["connect"])(mapStateToProps, mapDispatchToProps)(UsernameModal)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/tw-username-modal.jsx":
|
||
/*!**********************************************!*\
|
||
!*** ./src/containers/tw-username-modal.jsx ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../reducers/tw */ "./src/reducers/tw.js");
|
||
/* harmony import */ var _components_tw_username_modal_username_modal_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/tw-username-modal/username-modal.jsx */ "./src/components/tw-username-modal/username-modal.jsx");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _lib_tw_username__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/tw-username */ "./src/lib/tw-username.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class UsernameModal extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_2___default()(this, ['handleKeyPress', 'handleFocus', 'handleOk', 'handleCancel', 'handleChange', 'handleReset']);
|
||
this.state = {
|
||
value: this.props.username,
|
||
valueValid: !this.props.usernameInvalid
|
||
};
|
||
}
|
||
|
||
handleKeyPress(event) {
|
||
if (event.key === 'Enter' && this.state.valueValid) {
|
||
this.handleOk();
|
||
}
|
||
}
|
||
|
||
handleFocus(event) {
|
||
event.target.select();
|
||
}
|
||
|
||
handleOk() {
|
||
this.props.onSetUsername(this.state.value);
|
||
this.props.onCloseUsernameModal();
|
||
}
|
||
|
||
handleCancel() {
|
||
this.props.onCloseUsernameModal();
|
||
}
|
||
|
||
handleChange(e) {
|
||
this.setState({
|
||
value: e.target.value,
|
||
valueValid: e.target.checkValidity()
|
||
});
|
||
}
|
||
|
||
handleReset() {
|
||
const randomUsername = Object(_lib_tw_username__WEBPACK_IMPORTED_MODULE_7__["generateRandomUsername"])();
|
||
this.props.onCloseUsernameModal();
|
||
this.props.onSetUsername(randomUsername);
|
||
}
|
||
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_components_tw_username_modal_username_modal_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
||
mustChangeUsername: this.props.usernameInvalid,
|
||
value: this.state.value,
|
||
valueValid: this.state.valueValid,
|
||
onKeyPress: this.handleKeyPress,
|
||
onFocus: this.handleFocus,
|
||
onOk: this.handleOk,
|
||
onCancel: this.handleCancel,
|
||
onChange: this.handleChange,
|
||
onReset: this.handleReset
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
UsernameModal.propTypes = {
|
||
onCloseUsernameModal: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onSetUsername: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
username: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
usernameInvalid: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
username: state.scratchGui.tw.username,
|
||
usernameInvalid: state.scratchGui.tw.usernameInvalid
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onCloseUsernameModal: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_6__["closeUsernameModal"])()),
|
||
onSetUsername: username => {
|
||
dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_4__["setUsername"])(username));
|
||
dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_4__["setUsernameInvalid"])(false));
|
||
}
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(UsernameModal));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/watermark.jsx":
|
||
/*!**************************************!*\
|
||
!*** ./src/containers/watermark.jsx ***!
|
||
\**************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash.omit */ "./node_modules/lodash.omit/index.js");
|
||
/* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_omit__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _lib_throttled_property_hoc_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/throttled-property-hoc.jsx */ "./src/lib/throttled-property-hoc.jsx");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _lib_storage__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/storage */ "./src/lib/storage.js");
|
||
/* harmony import */ var _lib_get_costume_url__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../lib/get-costume-url */ "./src/lib/get-costume-url.js");
|
||
/* harmony import */ var _components_watermark_watermark_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../components/watermark/watermark.jsx */ "./src/components/watermark/watermark.jsx");
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class Watermark extends react__WEBPACK_IMPORTED_MODULE_3___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['getCostumeData']);
|
||
}
|
||
|
||
getCostumeData() {
|
||
if (!this.props.asset) return null;
|
||
return Object(_lib_get_costume_url__WEBPACK_IMPORTED_MODULE_8__["default"])(this.props.asset);
|
||
}
|
||
|
||
render() {
|
||
const componentProps = lodash_omit__WEBPACK_IMPORTED_MODULE_1___default()(this.props, ['asset', 'vm']);
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_components_watermark_watermark_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], _extends({
|
||
costumeURL: this.getCostumeData()
|
||
}, componentProps));
|
||
}
|
||
|
||
}
|
||
|
||
Watermark.propTypes = {
|
||
asset: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(_lib_storage__WEBPACK_IMPORTED_MODULE_7__["default"].Asset),
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_6___default.a).isRequired
|
||
};
|
||
|
||
const mapStateToProps = state => {
|
||
const targets = state.scratchGui.targets;
|
||
const currentTargetId = targets.editingTarget;
|
||
let asset;
|
||
|
||
if (currentTargetId) {
|
||
if (targets.stage.id === currentTargetId) {
|
||
asset = targets.stage.costume.asset;
|
||
} else if (targets.sprites.hasOwnProperty(currentTargetId)) {
|
||
const currentSprite = targets.sprites[currentTargetId];
|
||
asset = currentSprite.costume.asset;
|
||
}
|
||
}
|
||
|
||
return {
|
||
vm: state.scratchGui.vm,
|
||
asset: asset
|
||
};
|
||
};
|
||
|
||
const ConnectedComponent = Object(react_redux__WEBPACK_IMPORTED_MODULE_4__["connect"])(mapStateToProps)(Object(_lib_throttled_property_hoc_jsx__WEBPACK_IMPORTED_MODULE_5__["default"])('asset', 500)(Watermark));
|
||
/* harmony default export */ __webpack_exports__["default"] = (ConnectedComponent);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/containers/webgl-modal.jsx":
|
||
/*!****************************************!*\
|
||
!*** ./src/containers/webgl-modal.jsx ***!
|
||
\****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _components_webgl_modal_webgl_modal_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/webgl-modal/webgl-modal.jsx */ "./src/components/webgl-modal/webgl-modal.jsx");
|
||
|
||
|
||
|
||
|
||
class WebGlModal extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
render() {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_webgl_modal_webgl_modal_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
||
isRtl: this.props.isRtl
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
WebGlModal.propTypes = {
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (WebGlModal);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/alerts/index.jsx":
|
||
/*!**********************************!*\
|
||
!*** ./src/lib/alerts/index.jsx ***!
|
||
\**********************************/
|
||
/*! exports provided: default, AlertLevels, AlertTypes */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return alerts; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AlertLevels", function() { return AlertLevels; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AlertTypes", function() { return AlertTypes; });
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! keymirror */ "./node_modules/keymirror/index.js");
|
||
/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(keymirror__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../assets/icon--success.svg */ "./src/lib/assets/icon--success.svg");
|
||
/* harmony import */ var _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3__);
|
||
|
||
|
||
|
||
|
||
const AlertTypes = keymirror__WEBPACK_IMPORTED_MODULE_2___default()({
|
||
STANDARD: null,
|
||
EXTENSION: null,
|
||
INLINE: null
|
||
});
|
||
const AlertLevels = {
|
||
SUCCESS: 'success',
|
||
INFO: 'info',
|
||
WARN: 'warn'
|
||
};
|
||
const alerts = [{
|
||
alertId: 'createSuccess',
|
||
alertType: AlertTypes.STANDARD,
|
||
clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "New project created.",
|
||
id: "gui.alerts.createsuccess"
|
||
}),
|
||
iconURL: _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default.a,
|
||
level: AlertLevels.SUCCESS,
|
||
maxDisplaySecs: 5
|
||
}, {
|
||
alertId: 'createCopySuccess',
|
||
alertType: AlertTypes.STANDARD,
|
||
clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Project saved as a copy.",
|
||
id: "gui.alerts.createcopysuccess"
|
||
}),
|
||
iconURL: _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default.a,
|
||
level: AlertLevels.SUCCESS,
|
||
maxDisplaySecs: 5
|
||
}, {
|
||
alertId: 'createRemixSuccess',
|
||
alertType: AlertTypes.STANDARD,
|
||
clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Project saved as a remix.",
|
||
id: "gui.alerts.createremixsuccess"
|
||
}),
|
||
iconURL: _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default.a,
|
||
level: AlertLevels.SUCCESS,
|
||
maxDisplaySecs: 5
|
||
}, {
|
||
alertId: 'creating',
|
||
alertType: AlertTypes.STANDARD,
|
||
clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Creating new\u2026",
|
||
id: "gui.alerts.creating"
|
||
}),
|
||
iconSpinner: true,
|
||
level: AlertLevels.SUCCESS
|
||
}, {
|
||
alertId: 'creatingCopy',
|
||
alertType: AlertTypes.STANDARD,
|
||
clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Copying project\u2026",
|
||
id: "gui.alerts.creatingCopy"
|
||
}),
|
||
iconSpinner: true,
|
||
level: AlertLevels.SUCCESS
|
||
}, {
|
||
alertId: 'creatingRemix',
|
||
alertType: AlertTypes.STANDARD,
|
||
clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Remixing project\u2026",
|
||
id: "gui.alerts.creatingRemix"
|
||
}),
|
||
iconSpinner: true,
|
||
level: AlertLevels.SUCCESS
|
||
}, {
|
||
alertId: 'creatingError',
|
||
clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],
|
||
closeButton: true,
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Could not create the project. Please try again!",
|
||
id: "gui.alerts.creatingError"
|
||
}),
|
||
level: AlertLevels.WARN
|
||
}, {
|
||
alertId: 'savingError',
|
||
clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],
|
||
showDownload: true,
|
||
// showSaveNow: true,
|
||
closeButton: true,
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Project could not save.",
|
||
id: "gui.alerts.savingError"
|
||
}),
|
||
level: AlertLevels.WARN
|
||
}, {
|
||
alertId: 'saveSuccess',
|
||
alertType: AlertTypes.INLINE,
|
||
clearList: ['saveSuccess', 'saving', 'savingError', 'twSaveToDiskSuccess', 'twCreatingRestorePoint', 'twRestorePointSuccess', 'twRestorePointError'],
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Project saved.",
|
||
id: "gui.alerts.savesuccess"
|
||
}),
|
||
iconURL: _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default.a,
|
||
level: AlertLevels.SUCCESS,
|
||
maxDisplaySecs: 3
|
||
}, {
|
||
alertId: 'twSaveToDiskSuccess',
|
||
alertType: AlertTypes.INLINE,
|
||
clearList: ['saveSuccess', 'saving', 'savingError', 'twCreatingRestorePoint', 'twRestorePointSuccess', 'twRestorePointError'],
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Saved to your computer.",
|
||
id: "tw.alerts.savedToDisk"
|
||
}),
|
||
iconURL: _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default.a,
|
||
level: AlertLevels.SUCCESS,
|
||
maxDisplaySecs: 3
|
||
}, {
|
||
alertId: 'saving',
|
||
alertType: AlertTypes.INLINE,
|
||
clearList: ['saveSuccess', 'saving', 'savingError', 'twSaveToDiskSuccess', 'twCreatingRestorePoint', 'twRestorePointSuccess', 'twRestorePointError'],
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Saving project\u2026",
|
||
id: "gui.alerts.saving"
|
||
}),
|
||
iconSpinner: true,
|
||
level: AlertLevels.INFO
|
||
}, {
|
||
alertId: 'twCreatingRestorePoint',
|
||
alertType: AlertTypes.INLINE,
|
||
clearList: ['twRestorePointSuccess', 'twRestorePointError'],
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Creating restore point\u2026",
|
||
id: "tw.alerts.creatingRestorePoint"
|
||
}),
|
||
iconSpinner: true,
|
||
level: AlertLevels.INFO
|
||
}, {
|
||
alertId: 'twRestorePointSuccess',
|
||
alertType: AlertTypes.INLINE,
|
||
clearList: ['twCreatingRestorePoint', 'twRestorePointError'],
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Access restore points in \"File\"" // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.alerts.restorePointSuccess"
|
||
}),
|
||
iconURL: _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default.a,
|
||
level: AlertLevels.SUCCESS,
|
||
maxDisplaySecs: 3
|
||
}, {
|
||
alertId: 'twRestorePointError',
|
||
alertType: AlertTypes.INLINE,
|
||
clearList: ['twCreatingRestorePoint', 'twRestorePointSuccess'],
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Could not create restore point" // eslint-disable-next-line max-len
|
||
,
|
||
id: "tw.alerts.restorePointError"
|
||
}),
|
||
iconURL: _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default.a,
|
||
level: AlertLevels.WARN,
|
||
maxDisplaySecs: 5
|
||
}, {
|
||
alertId: 'cloudInfo',
|
||
alertType: AlertTypes.STANDARD,
|
||
clearList: ['cloudInfo'],
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Please note, cloud variables only support numbers, not letters or symbols. {learnMoreLink}" // eslint-disable-line max-len
|
||
,
|
||
id: "gui.alerts.cloudInfo",
|
||
values: {
|
||
learnMoreLink: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a", {
|
||
href: "https://scratch.mit.edu/info/faq/#clouddata",
|
||
rel: "noopener noreferrer",
|
||
target: "_blank"
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Learn more.",
|
||
id: "gui.alerts.cloudInfoLearnMore"
|
||
}))
|
||
}
|
||
}),
|
||
closeButton: true,
|
||
level: AlertLevels.SUCCESS,
|
||
maxDisplaySecs: 15
|
||
}, {
|
||
alertId: 'importingAsset',
|
||
alertType: AlertTypes.STANDARD,
|
||
clearList: [],
|
||
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Importing\u2026",
|
||
id: "gui.alerts.importing"
|
||
}),
|
||
iconSpinner: true,
|
||
level: AlertLevels.SUCCESS
|
||
}];
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/analytics.js":
|
||
/*!******************************!*\
|
||
!*** ./src/lib/analytics.js ***!
|
||
\******************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
const GoogleAnalytics = {
|
||
// Disable Scratch's analytics
|
||
event() {}
|
||
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (GoogleAnalytics);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/app-state-hoc.jsx":
|
||
/*!***********************************!*\
|
||
!*** ./src/lib/app-state-hoc.jsx ***!
|
||
\***********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! redux */ "./node_modules/redux/es/index.js");
|
||
/* harmony import */ var _connected_intl_provider_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./connected-intl-provider.jsx */ "./src/lib/connected-intl-provider.jsx");
|
||
/* harmony import */ var _addons_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../addons/hooks */ "./src/addons/hooks.js");
|
||
/* harmony import */ var _reducers_locales__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/locales */ "./src/reducers/locales.js");
|
||
/* harmony import */ var _reducers_mode_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/mode.js */ "./src/reducers/mode.js");
|
||
/* harmony import */ var _turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @turbowarp/scratch-l10n */ "./node_modules/@turbowarp/scratch-l10n/src/index.js");
|
||
/* harmony import */ var _detect_locale__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./detect-locale */ "./src/lib/detect-locale.js");
|
||
const _excluded = ["isFullScreen", "isPlayerOnly", "showTelemetryModal"];
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || redux__WEBPACK_IMPORTED_MODULE_3__["compose"];
|
||
/*
|
||
* Higher Order Component to provide redux state. If an `intl` prop is provided
|
||
* it will override the internal `intl` redux state
|
||
* @param {React.Component} WrappedComponent - component to provide state for
|
||
* @param {boolean} localesOnly - only provide the locale state, not everything
|
||
* required by the GUI. Used to exclude excess state when
|
||
only rendering modals, not the GUI.
|
||
* @returns {React.Component} component with redux and intl state provided
|
||
*/
|
||
|
||
const AppStateHOC = function AppStateHOC(WrappedComponent, localesOnly) {
|
||
class AppStateWrapper extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
let initialState = {};
|
||
let reducers = {};
|
||
let enhancer;
|
||
let initializedLocales = _reducers_locales__WEBPACK_IMPORTED_MODULE_6__["localesInitialState"];
|
||
const locale = Object(_detect_locale__WEBPACK_IMPORTED_MODULE_9__["detectLocale"])(Object.keys(_turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_8__["default"]));
|
||
|
||
if (locale !== 'en') {
|
||
initializedLocales = Object(_reducers_locales__WEBPACK_IMPORTED_MODULE_6__["initLocale"])(initializedLocales, locale);
|
||
}
|
||
|
||
if (localesOnly) {
|
||
// Used for instantiating minimal state for the unsupported
|
||
// browser modal
|
||
reducers = {
|
||
locales: _reducers_locales__WEBPACK_IMPORTED_MODULE_6__["default"]
|
||
};
|
||
initialState = {
|
||
locales: initializedLocales
|
||
};
|
||
enhancer = composeEnhancers();
|
||
} else {
|
||
// You are right, this is gross. But it's necessary to avoid
|
||
// importing unneeded code that will crash unsupported browsers.
|
||
const guiRedux = __webpack_require__(/*! ../reducers/gui */ "./src/reducers/gui.js");
|
||
|
||
const guiReducer = guiRedux.default;
|
||
const {
|
||
guiInitialState,
|
||
guiMiddleware,
|
||
initFullScreen,
|
||
initPlayer,
|
||
initEmbedded,
|
||
initTelemetryModal
|
||
} = guiRedux;
|
||
|
||
const {
|
||
ScratchPaintReducer
|
||
} = __webpack_require__(/*! ./tw-scratch-paint */ "./src/lib/tw-scratch-paint.js");
|
||
|
||
let initializedGui = guiInitialState;
|
||
|
||
if (props.isFullScreen || props.isPlayerOnly) {
|
||
if (props.isFullScreen) {
|
||
initializedGui = initFullScreen(initializedGui);
|
||
}
|
||
|
||
if (props.isPlayerOnly) {
|
||
initializedGui = initPlayer(initializedGui);
|
||
}
|
||
} else if (props.showTelemetryModal) {
|
||
initializedGui = initTelemetryModal(initializedGui);
|
||
}
|
||
|
||
if (props.isEmbedded) {
|
||
initializedGui = initEmbedded(initializedGui);
|
||
}
|
||
|
||
reducers = {
|
||
locales: _reducers_locales__WEBPACK_IMPORTED_MODULE_6__["default"],
|
||
scratchGui: guiReducer,
|
||
scratchPaint: ScratchPaintReducer
|
||
};
|
||
initialState = {
|
||
locales: initializedLocales,
|
||
scratchGui: initializedGui
|
||
};
|
||
enhancer = composeEnhancers(guiMiddleware);
|
||
}
|
||
|
||
const reducer = Object(redux__WEBPACK_IMPORTED_MODULE_3__["combineReducers"])(reducers);
|
||
|
||
const reducer2 = (previousState, action) => {
|
||
const nextState = reducer(previousState, action);
|
||
_addons_hooks__WEBPACK_IMPORTED_MODULE_5__["default"].appStateReducer(action, previousState, nextState);
|
||
return nextState;
|
||
};
|
||
|
||
this.store = Object(redux__WEBPACK_IMPORTED_MODULE_3__["createStore"])(reducer2, initialState, enhancer);
|
||
window.ReduxStore = this.store;
|
||
_addons_hooks__WEBPACK_IMPORTED_MODULE_5__["default"].appStateStore = this.store;
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
if (localesOnly) return;
|
||
|
||
if (prevProps.isPlayerOnly !== this.props.isPlayerOnly) {
|
||
this.store.dispatch(Object(_reducers_mode_js__WEBPACK_IMPORTED_MODULE_7__["setPlayer"])(this.props.isPlayerOnly));
|
||
}
|
||
|
||
if (prevProps.isFullScreen !== this.props.isFullScreen) {
|
||
this.store.dispatch(Object(_reducers_mode_js__WEBPACK_IMPORTED_MODULE_7__["setFullScreen"])(this.props.isFullScreen));
|
||
}
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
isFullScreen,
|
||
// eslint-disable-line no-unused-vars
|
||
isPlayerOnly,
|
||
// eslint-disable-line no-unused-vars
|
||
showTelemetryModal
|
||
} = _this$props,
|
||
componentProps = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_redux__WEBPACK_IMPORTED_MODULE_2__["Provider"], {
|
||
store: this.store
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_connected_intl_provider_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(WrappedComponent, componentProps)));
|
||
}
|
||
|
||
}
|
||
|
||
AppStateWrapper.propTypes = {
|
||
isFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isPlayerOnly: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isTelemetryEnabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
showTelemetryModal: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isEmbedded: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
return AppStateWrapper;
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (AppStateHOC);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/assets/icon--back.svg":
|
||
/*!***************************************!*\
|
||
!*** ./src/lib/assets/icon--back.svg ***!
|
||
\***************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/aaa4a3575852fe11d04f44c4a972ae73.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/assets/icon--help.svg":
|
||
/*!***************************************!*\
|
||
!*** ./src/lib/assets/icon--help.svg ***!
|
||
\***************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/4b6100c9f591be6470cdfd4697de0b54.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/assets/icon--success.svg":
|
||
/*!******************************************!*\
|
||
!*** ./src/lib/assets/icon--success.svg ***!
|
||
\******************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/bc45b073cd2fc0c2265374bdb4e05d67.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/assets/icon--tutorials.svg":
|
||
/*!********************************************!*\
|
||
!*** ./src/lib/assets/icon--tutorials.svg ***!
|
||
\********************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/b433ee02a13fa2a12f7f7059f1f6729a.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/audio/audio-buffer-player.js":
|
||
/*!**********************************************!*\
|
||
!*** ./src/lib/audio/audio-buffer-player.js ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _shared_audio_context_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shared-audio-context.js */ "./src/lib/audio/shared-audio-context.js");
|
||
|
||
|
||
class AudioBufferPlayer {
|
||
constructor(samples, sampleRate) {
|
||
this.audioContext = new _shared_audio_context_js__WEBPACK_IMPORTED_MODULE_0__["default"]();
|
||
this.buffer = this.audioContext.createBuffer(1, samples.length, sampleRate);
|
||
this.buffer.getChannelData(0).set(samples);
|
||
this.source = null;
|
||
this.startTime = null;
|
||
this.updateCallback = null;
|
||
this.trimStart = null;
|
||
this.trimEnd = null;
|
||
}
|
||
|
||
play(trimStart, trimEnd, onUpdate, onEnded) {
|
||
this.updateCallback = onUpdate;
|
||
this.trimStart = trimStart;
|
||
this.trimEnd = trimEnd;
|
||
this.startTime = Date.now();
|
||
const trimStartTime = this.buffer.duration * trimStart;
|
||
const trimmedDuration = this.buffer.duration * trimEnd - trimStartTime;
|
||
this.source = this.audioContext.createBufferSource();
|
||
this.source.onended = onEnded;
|
||
this.source.buffer = this.buffer;
|
||
this.source.connect(this.audioContext.destination);
|
||
this.source.start(0, trimStartTime, trimmedDuration);
|
||
this.update();
|
||
}
|
||
|
||
update() {
|
||
const timeSinceStart = (Date.now() - this.startTime) / 1000;
|
||
const percentage = timeSinceStart / this.buffer.duration;
|
||
|
||
if (percentage + this.trimStart < this.trimEnd && this.source.onended) {
|
||
requestAnimationFrame(this.update.bind(this));
|
||
this.updateCallback(percentage + this.trimStart);
|
||
} else {
|
||
this.updateCallback = null;
|
||
}
|
||
}
|
||
|
||
stop() {
|
||
if (this.source) {
|
||
this.source.onended = null; // Do not call onEnded callback if manually stopped
|
||
|
||
try {
|
||
this.source.stop();
|
||
} catch (e) {
|
||
// This is probably Safari, which dies when you call stop more than once
|
||
// which the spec says is allowed: https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode
|
||
console.log('Caught error while stopping buffer source node.'); // eslint-disable-line no-console
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (AudioBufferPlayer);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/audio/audio-effects.js":
|
||
/*!****************************************!*\
|
||
!*** ./src/lib/audio/audio-effects.js ***!
|
||
\****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _effects_echo_effect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./effects/echo-effect.js */ "./src/lib/audio/effects/echo-effect.js");
|
||
/* harmony import */ var _effects_robot_effect_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./effects/robot-effect.js */ "./src/lib/audio/effects/robot-effect.js");
|
||
/* harmony import */ var _effects_volume_effect_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./effects/volume-effect.js */ "./src/lib/audio/effects/volume-effect.js");
|
||
/* harmony import */ var _effects_fade_effect_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./effects/fade-effect.js */ "./src/lib/audio/effects/fade-effect.js");
|
||
/* harmony import */ var _effects_mute_effect_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./effects/mute-effect.js */ "./src/lib/audio/effects/mute-effect.js");
|
||
|
||
|
||
|
||
|
||
|
||
const effectTypes = {
|
||
ROBOT: 'robot',
|
||
REVERSE: 'reverse',
|
||
LOUDER: 'higher',
|
||
SOFTER: 'lower',
|
||
FASTER: 'faster',
|
||
SLOWER: 'slower',
|
||
ECHO: 'echo',
|
||
FADEIN: 'fade in',
|
||
FADEOUT: 'fade out',
|
||
MUTE: 'mute'
|
||
};
|
||
|
||
class AudioEffects {
|
||
static get effectTypes() {
|
||
return effectTypes;
|
||
}
|
||
|
||
constructor(buffer, name, trimStart, trimEnd) {
|
||
this.trimStartSeconds = trimStart * buffer.length / buffer.sampleRate;
|
||
this.trimEndSeconds = trimEnd * buffer.length / buffer.sampleRate;
|
||
this.adjustedTrimStartSeconds = this.trimStartSeconds;
|
||
this.adjustedTrimEndSeconds = this.trimEndSeconds; // Some effects will modify the playback rate and/or number of samples.
|
||
// Need to precompute those values to create the offline audio context.
|
||
|
||
const pitchRatio = Math.pow(2, 4 / 12); // A major third
|
||
|
||
let sampleCount = buffer.length;
|
||
const affectedSampleCount = Math.floor((this.trimEndSeconds - this.trimStartSeconds) * buffer.sampleRate);
|
||
let adjustedAffectedSampleCount = affectedSampleCount;
|
||
const unaffectedSampleCount = sampleCount - affectedSampleCount;
|
||
this.playbackRate = 1;
|
||
|
||
switch (name) {
|
||
case effectTypes.ECHO:
|
||
sampleCount = Math.max(sampleCount, Math.floor((this.trimEndSeconds + _effects_echo_effect_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAIL_SECONDS) * buffer.sampleRate));
|
||
break;
|
||
|
||
case effectTypes.FASTER:
|
||
this.playbackRate = pitchRatio;
|
||
adjustedAffectedSampleCount = Math.floor(affectedSampleCount / this.playbackRate);
|
||
sampleCount = unaffectedSampleCount + adjustedAffectedSampleCount;
|
||
break;
|
||
|
||
case effectTypes.SLOWER:
|
||
this.playbackRate = 1 / pitchRatio;
|
||
adjustedAffectedSampleCount = Math.floor(affectedSampleCount / this.playbackRate);
|
||
sampleCount = unaffectedSampleCount + adjustedAffectedSampleCount;
|
||
break;
|
||
}
|
||
|
||
const durationSeconds = sampleCount / buffer.sampleRate;
|
||
this.adjustedTrimEndSeconds = this.trimStartSeconds + adjustedAffectedSampleCount / buffer.sampleRate;
|
||
this.adjustedTrimStart = this.adjustedTrimStartSeconds / durationSeconds;
|
||
this.adjustedTrimEnd = this.adjustedTrimEndSeconds / durationSeconds;
|
||
|
||
if (window.OfflineAudioContext) {
|
||
this.audioContext = new window.OfflineAudioContext(1, sampleCount, buffer.sampleRate);
|
||
} else {
|
||
// Need to use webkitOfflineAudioContext, which doesn't support all sample rates.
|
||
// Resample by adjusting sample count to make room and set offline context to desired sample rate.
|
||
const sampleScale = 44100 / buffer.sampleRate;
|
||
this.audioContext = new window.webkitOfflineAudioContext(1, sampleScale * sampleCount, 44100);
|
||
} // For the reverse effect we need to manually reverse the data into a new audio buffer
|
||
// to prevent overwriting the original, so that the undo stack works correctly.
|
||
// Doing buffer.reverse() would mutate the original data.
|
||
|
||
|
||
if (name === effectTypes.REVERSE) {
|
||
const originalBufferData = buffer.getChannelData(0);
|
||
const newBuffer = this.audioContext.createBuffer(1, buffer.length, buffer.sampleRate);
|
||
const newBufferData = newBuffer.getChannelData(0);
|
||
const bufferLength = buffer.length;
|
||
const startSamples = Math.floor(this.trimStartSeconds * buffer.sampleRate);
|
||
const endSamples = Math.floor(this.trimEndSeconds * buffer.sampleRate);
|
||
let counter = 0;
|
||
|
||
for (let i = 0; i < bufferLength; i++) {
|
||
if (i >= startSamples && i < endSamples) {
|
||
newBufferData[i] = originalBufferData[endSamples - counter - 1];
|
||
counter++;
|
||
} else {
|
||
newBufferData[i] = originalBufferData[i];
|
||
}
|
||
}
|
||
|
||
this.buffer = newBuffer;
|
||
} else {
|
||
// All other effects use the original buffer because it is not modified.
|
||
this.buffer = buffer;
|
||
}
|
||
|
||
this.source = this.audioContext.createBufferSource();
|
||
this.source.buffer = this.buffer;
|
||
this.name = name;
|
||
}
|
||
|
||
process(done) {
|
||
// Some effects need to use more nodes and must expose an input and output
|
||
let input;
|
||
let output;
|
||
|
||
switch (this.name) {
|
||
case effectTypes.FASTER:
|
||
case effectTypes.SLOWER:
|
||
this.source.playbackRate.setValueAtTime(this.playbackRate, this.adjustedTrimStartSeconds);
|
||
this.source.playbackRate.setValueAtTime(1.0, this.adjustedTrimEndSeconds);
|
||
break;
|
||
|
||
case effectTypes.LOUDER:
|
||
({
|
||
input,
|
||
output
|
||
} = new _effects_volume_effect_js__WEBPACK_IMPORTED_MODULE_2__["default"](this.audioContext, 1.25, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds));
|
||
break;
|
||
|
||
case effectTypes.SOFTER:
|
||
({
|
||
input,
|
||
output
|
||
} = new _effects_volume_effect_js__WEBPACK_IMPORTED_MODULE_2__["default"](this.audioContext, 0.75, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds));
|
||
break;
|
||
|
||
case effectTypes.ECHO:
|
||
({
|
||
input,
|
||
output
|
||
} = new _effects_echo_effect_js__WEBPACK_IMPORTED_MODULE_0__["default"](this.audioContext, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds));
|
||
break;
|
||
|
||
case effectTypes.ROBOT:
|
||
({
|
||
input,
|
||
output
|
||
} = new _effects_robot_effect_js__WEBPACK_IMPORTED_MODULE_1__["default"](this.audioContext, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds));
|
||
break;
|
||
|
||
case effectTypes.FADEIN:
|
||
({
|
||
input,
|
||
output
|
||
} = new _effects_fade_effect_js__WEBPACK_IMPORTED_MODULE_3__["default"](this.audioContext, true, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds));
|
||
break;
|
||
|
||
case effectTypes.FADEOUT:
|
||
({
|
||
input,
|
||
output
|
||
} = new _effects_fade_effect_js__WEBPACK_IMPORTED_MODULE_3__["default"](this.audioContext, false, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds));
|
||
break;
|
||
|
||
case effectTypes.MUTE:
|
||
({
|
||
input,
|
||
output
|
||
} = new _effects_mute_effect_js__WEBPACK_IMPORTED_MODULE_4__["default"](this.audioContext, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds));
|
||
break;
|
||
}
|
||
|
||
if (input && output) {
|
||
this.source.connect(input);
|
||
output.connect(this.audioContext.destination);
|
||
} else {
|
||
// No effects nodes are needed, wire directly to the output
|
||
this.source.connect(this.audioContext.destination);
|
||
}
|
||
|
||
this.source.start();
|
||
this.audioContext.startRendering();
|
||
|
||
this.audioContext.oncomplete = ({
|
||
renderedBuffer
|
||
}) => {
|
||
done(renderedBuffer, this.adjustedTrimStart, this.adjustedTrimEnd);
|
||
};
|
||
}
|
||
|
||
}
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (AudioEffects);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/audio/audio-recorder.js":
|
||
/*!*****************************************!*\
|
||
!*** ./src/lib/audio/audio-recorder.js ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var get_float_time_domain_data__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! get-float-time-domain-data */ "./node_modules/get-float-time-domain-data/lib/get-float-time-domain-data.js");
|
||
/* harmony import */ var get_float_time_domain_data__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(get_float_time_domain_data__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var get_user_media_promise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! get-user-media-promise */ "./node_modules/get-user-media-promise/lib/get-user-media-promise.js");
|
||
/* harmony import */ var get_user_media_promise__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(get_user_media_promise__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _shared_audio_context_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./shared-audio-context.js */ "./src/lib/audio/shared-audio-context.js");
|
||
/* harmony import */ var _audio_util_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./audio-util.js */ "./src/lib/audio/audio-util.js");
|
||
|
||
|
||
|
||
|
||
|
||
class AudioRecorder {
|
||
constructor() {
|
||
this.audioContext = new _shared_audio_context_js__WEBPACK_IMPORTED_MODULE_2__["default"]();
|
||
this.bufferLength = 8192;
|
||
this.userMediaStream = null;
|
||
this.mediaStreamSource = null;
|
||
this.sourceNode = null;
|
||
this.scriptProcessorNode = null;
|
||
this.recordedSamples = 0;
|
||
this.recording = false;
|
||
this.started = false;
|
||
this.buffers = [];
|
||
this.disposed = false;
|
||
}
|
||
|
||
startListening(onStarted, onUpdate, onError) {
|
||
try {
|
||
get_user_media_promise__WEBPACK_IMPORTED_MODULE_1___default()({
|
||
audio: true
|
||
}).then(userMediaStream => {
|
||
if (!this.disposed) {
|
||
this.started = true;
|
||
onStarted();
|
||
this.attachUserMediaStream(userMediaStream, onUpdate);
|
||
}
|
||
}).catch(e => {
|
||
if (!this.disposed) {
|
||
onError(e);
|
||
}
|
||
});
|
||
} catch (e) {
|
||
if (!this.disposed) {
|
||
onError(e);
|
||
}
|
||
}
|
||
}
|
||
|
||
startRecording() {
|
||
this.recording = true;
|
||
}
|
||
|
||
attachUserMediaStream(userMediaStream, onUpdate) {
|
||
this.userMediaStream = userMediaStream;
|
||
this.mediaStreamSource = this.audioContext.createMediaStreamSource(userMediaStream);
|
||
this.sourceNode = this.audioContext.createGain();
|
||
this.scriptProcessorNode = this.audioContext.createScriptProcessor(this.bufferLength, 1, 1);
|
||
|
||
this.scriptProcessorNode.onaudioprocess = processEvent => {
|
||
if (this.recording && !this.disposed) {
|
||
this.buffers.push(new Float32Array(processEvent.inputBuffer.getChannelData(0)));
|
||
}
|
||
};
|
||
|
||
this.analyserNode = this.audioContext.createAnalyser();
|
||
this.analyserNode.fftSize = 2048;
|
||
const bufferLength = this.analyserNode.frequencyBinCount;
|
||
const dataArray = new Float32Array(bufferLength);
|
||
|
||
const update = () => {
|
||
if (this.disposed) return;
|
||
this.analyserNode.getFloatTimeDomainData(dataArray);
|
||
onUpdate(Object(_audio_util_js__WEBPACK_IMPORTED_MODULE_3__["computeRMS"])(dataArray));
|
||
requestAnimationFrame(update);
|
||
};
|
||
|
||
requestAnimationFrame(update); // Wire everything together, ending in the destination
|
||
|
||
this.mediaStreamSource.connect(this.sourceNode);
|
||
this.sourceNode.connect(this.analyserNode);
|
||
this.analyserNode.connect(this.scriptProcessorNode);
|
||
this.scriptProcessorNode.connect(this.audioContext.destination);
|
||
}
|
||
|
||
stop() {
|
||
const buffer = new Float32Array(this.buffers.length * this.bufferLength);
|
||
let offset = 0;
|
||
|
||
for (let i = 0; i < this.buffers.length; i++) {
|
||
const bufferChunk = this.buffers[i];
|
||
buffer.set(bufferChunk, offset);
|
||
offset += bufferChunk.length;
|
||
}
|
||
|
||
const chunkLevels = Object(_audio_util_js__WEBPACK_IMPORTED_MODULE_3__["computeChunkedRMS"])(buffer);
|
||
const maxRMS = Math.max.apply(null, chunkLevels);
|
||
const threshold = maxRMS / 8;
|
||
let firstChunkAboveThreshold = null;
|
||
let lastChunkAboveThreshold = null;
|
||
|
||
for (let i = 0; i < chunkLevels.length; i++) {
|
||
if (chunkLevels[i] > threshold) {
|
||
if (firstChunkAboveThreshold === null) firstChunkAboveThreshold = i + 1;
|
||
lastChunkAboveThreshold = i + 1;
|
||
}
|
||
}
|
||
|
||
let trimStart = Math.max(2, firstChunkAboveThreshold - 2) / this.buffers.length;
|
||
let trimEnd = Math.min(this.buffers.length - 2, lastChunkAboveThreshold + 2) / this.buffers.length; // With very few samples, the automatic trimming can produce invalid values
|
||
|
||
if (trimStart >= trimEnd) {
|
||
trimStart = 0;
|
||
trimEnd = 1;
|
||
}
|
||
|
||
return {
|
||
levels: chunkLevels,
|
||
samples: buffer,
|
||
sampleRate: this.audioContext.sampleRate,
|
||
trimStart: trimStart,
|
||
trimEnd: trimEnd
|
||
};
|
||
}
|
||
|
||
dispose() {
|
||
if (this.started) {
|
||
this.scriptProcessorNode.onaudioprocess = null;
|
||
this.scriptProcessorNode.disconnect();
|
||
this.analyserNode.disconnect();
|
||
this.sourceNode.disconnect();
|
||
this.mediaStreamSource.disconnect();
|
||
this.userMediaStream.getAudioTracks()[0].stop();
|
||
}
|
||
|
||
this.disposed = true;
|
||
}
|
||
|
||
}
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (AudioRecorder);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/audio/audio-util.js":
|
||
/*!*************************************!*\
|
||
!*** ./src/lib/audio/audio-util.js ***!
|
||
\*************************************/
|
||
/*! exports provided: SOUND_BYTE_LIMIT, computeRMS, computeChunkedRMS, encodeAndAddSoundToVM, downsampleIfNeeded, dropEveryOtherSample */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SOUND_BYTE_LIMIT", function() { return SOUND_BYTE_LIMIT; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeRMS", function() { return computeRMS; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeChunkedRMS", function() { return computeChunkedRMS; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "encodeAndAddSoundToVM", function() { return encodeAndAddSoundToVM; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "downsampleIfNeeded", function() { return downsampleIfNeeded; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dropEveryOtherSample", function() { return dropEveryOtherSample; });
|
||
/* harmony import */ var wav_encoder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! wav-encoder */ "./node_modules/wav-encoder/index.js");
|
||
/* harmony import */ var wav_encoder__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(wav_encoder__WEBPACK_IMPORTED_MODULE_0__);
|
||
|
||
const SOUND_BYTE_LIMIT = 10 * 1000 * 1000; // 10mb
|
||
|
||
const _computeRMS = function _computeRMS(samples, start, end, scaling = 0.55) {
|
||
const length = end - start;
|
||
if (length === 0) return 0; // Calculate RMS, adapted from https://github.com/Tonejs/Tone.js/blob/master/Tone/component/Meter.js#L88
|
||
|
||
let sum = 0;
|
||
|
||
for (let i = start; i < end; i++) {
|
||
const sample = samples[i];
|
||
sum += sample ** 2;
|
||
}
|
||
|
||
const rms = Math.sqrt(sum / length);
|
||
const val = rms / scaling;
|
||
return Math.sqrt(val);
|
||
};
|
||
|
||
const computeRMS = (samples, scaling) => _computeRMS(samples, 0, samples.length, scaling);
|
||
|
||
const computeChunkedRMS = function computeChunkedRMS(samples, chunkSize = 1024) {
|
||
const sampleCount = samples.length;
|
||
const chunkLevels = [];
|
||
|
||
for (let i = 0; i < sampleCount; i += chunkSize) {
|
||
const maxIndex = Math.min(sampleCount, i + chunkSize);
|
||
chunkLevels.push(_computeRMS(samples, i, maxIndex));
|
||
}
|
||
|
||
return chunkLevels;
|
||
};
|
||
|
||
const encodeAndAddSoundToVM = function encodeAndAddSoundToVM(vm, samples, sampleRate, name, callback) {
|
||
wav_encoder__WEBPACK_IMPORTED_MODULE_0___default.a.encode({
|
||
sampleRate: sampleRate,
|
||
channelData: [samples]
|
||
}).then(wavBuffer => {
|
||
const vmSound = {
|
||
format: '',
|
||
dataFormat: 'wav',
|
||
rate: sampleRate,
|
||
sampleCount: samples.length
|
||
}; // Create an asset from the encoded .wav and get resulting md5
|
||
|
||
const storage = vm.runtime.storage;
|
||
vmSound.asset = storage.createAsset(storage.AssetType.Sound, storage.DataFormat.WAV, new Uint8Array(wavBuffer), null, true // generate md5
|
||
);
|
||
vmSound.assetId = vmSound.asset.assetId; // update vmSound object with md5 property
|
||
|
||
vmSound.md5 = "".concat(vmSound.assetId, ".").concat(vmSound.dataFormat); // The VM will update the sound name to a fresh name
|
||
|
||
vmSound.name = name;
|
||
vm.addSound(vmSound).then(() => {
|
||
if (callback) callback();
|
||
});
|
||
});
|
||
};
|
||
/**
|
||
@typedef SoundBuffer
|
||
@type {Object}
|
||
@property {Float32Array} samples Array of audio samples
|
||
@property {number} sampleRate Audio sample rate
|
||
*/
|
||
|
||
/**
|
||
* Downsample the given buffer to try to reduce file size below SOUND_BYTE_LIMIT
|
||
* @param {SoundBuffer} buffer - Buffer to resample
|
||
* @param {function(SoundBuffer):Promise<SoundBuffer>} resampler - resampler function
|
||
* @returns {SoundBuffer} Downsampled buffer with half the sample rate
|
||
*/
|
||
|
||
|
||
const downsampleIfNeeded = (buffer, resampler) => {
|
||
const {
|
||
samples,
|
||
sampleRate
|
||
} = buffer;
|
||
const encodedByteLength = samples.length * 2;
|
||
/* bitDepth 16 bit */
|
||
// Resolve immediately if already within byte limit
|
||
|
||
if (encodedByteLength < SOUND_BYTE_LIMIT) {
|
||
return Promise.resolve({
|
||
samples,
|
||
sampleRate
|
||
});
|
||
} // TW: Don't check if the sound will still fit at this reduced sample rate.
|
||
// Instead the GUI will show a warning if it's too large.
|
||
|
||
|
||
return resampler({
|
||
samples,
|
||
sampleRate
|
||
}, 22050);
|
||
};
|
||
/**
|
||
* Drop every other sample of an audio buffer as a last-resort way of downsampling.
|
||
* @param {SoundBuffer} buffer - Buffer to resample
|
||
* @returns {SoundBuffer} Downsampled buffer with half the sample rate
|
||
*/
|
||
|
||
|
||
const dropEveryOtherSample = buffer => {
|
||
const newLength = Math.floor(buffer.samples.length / 2);
|
||
const newSamples = new Float32Array(newLength);
|
||
|
||
for (let i = 0; i < newLength; i++) {
|
||
newSamples[i] = buffer.samples[i * 2];
|
||
}
|
||
|
||
return {
|
||
samples: newSamples,
|
||
sampleRate: buffer.sampleRate / 2
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/audio/effects/echo-effect.js":
|
||
/*!**********************************************!*\
|
||
!*** ./src/lib/audio/effects/echo-effect.js ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
class EchoEffect {
|
||
static get DELAY_TIME() {
|
||
return 0.25;
|
||
}
|
||
|
||
static get TAIL_SECONDS() {
|
||
return 0.75;
|
||
}
|
||
|
||
constructor(audioContext, startTime, endTime) {
|
||
this.audioContext = audioContext;
|
||
this.input = this.audioContext.createGain();
|
||
this.output = this.audioContext.createGain();
|
||
this.effectInput = this.audioContext.createGain();
|
||
this.effectInput.gain.value = 0;
|
||
this.effectInput.gain.setValueAtTime(0.75, startTime);
|
||
this.effectInput.gain.setValueAtTime(0, endTime);
|
||
this.delay = this.audioContext.createDelay(1);
|
||
this.delay.delayTime.value = EchoEffect.DELAY_TIME;
|
||
this.decay = this.audioContext.createGain();
|
||
this.decay.gain.value = 0.3;
|
||
this.compressor = this.audioContext.createDynamicsCompressor();
|
||
this.compressor.threshold.value = -5;
|
||
this.compressor.knee.value = 15;
|
||
this.compressor.ratio.value = 12;
|
||
this.compressor.attack.value = 0;
|
||
this.compressor.release.value = 0.25;
|
||
this.input.connect(this.effectInput);
|
||
this.effectInput.connect(this.delay);
|
||
this.delay.connect(this.compressor);
|
||
this.input.connect(this.compressor);
|
||
this.delay.connect(this.decay);
|
||
this.decay.connect(this.delay);
|
||
this.compressor.connect(this.output);
|
||
}
|
||
|
||
}
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (EchoEffect);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/audio/effects/fade-effect.js":
|
||
/*!**********************************************!*\
|
||
!*** ./src/lib/audio/effects/fade-effect.js ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
class FadeEffect {
|
||
constructor(audioContext, fadeIn, startSeconds, endSeconds) {
|
||
this.audioContext = audioContext;
|
||
this.input = this.audioContext.createGain();
|
||
this.output = this.audioContext.createGain();
|
||
this.gain = this.audioContext.createGain();
|
||
this.gain.gain.setValueAtTime(1, 0);
|
||
|
||
if (fadeIn) {
|
||
this.gain.gain.setValueAtTime(0, startSeconds);
|
||
this.gain.gain.linearRampToValueAtTime(1, endSeconds);
|
||
} else {
|
||
this.gain.gain.setValueAtTime(1, startSeconds);
|
||
this.gain.gain.linearRampToValueAtTime(0, endSeconds);
|
||
}
|
||
|
||
this.gain.gain.setValueAtTime(1, endSeconds);
|
||
this.input.connect(this.gain);
|
||
this.gain.connect(this.output);
|
||
}
|
||
|
||
}
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (FadeEffect);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/audio/effects/mute-effect.js":
|
||
/*!**********************************************!*\
|
||
!*** ./src/lib/audio/effects/mute-effect.js ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
class MuteEffect {
|
||
constructor(audioContext, startSeconds, endSeconds) {
|
||
this.audioContext = audioContext;
|
||
this.input = this.audioContext.createGain();
|
||
this.output = this.audioContext.createGain();
|
||
this.gain = this.audioContext.createGain(); // Smoothly ramp the gain down before the start time, and up after the end time.
|
||
|
||
this.rampLength = 0.001;
|
||
this.gain.gain.setValueAtTime(1.0, Math.max(0, startSeconds - this.rampLength));
|
||
this.gain.gain.linearRampToValueAtTime(0, startSeconds);
|
||
this.gain.gain.setValueAtTime(0, endSeconds);
|
||
this.gain.gain.linearRampToValueAtTime(1.0, endSeconds + this.rampLength);
|
||
this.input.connect(this.gain);
|
||
this.gain.connect(this.output);
|
||
}
|
||
|
||
}
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (MuteEffect);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/audio/effects/robot-effect.js":
|
||
/*!***********************************************!*\
|
||
!*** ./src/lib/audio/effects/robot-effect.js ***!
|
||
\***********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
class RobotEffect {
|
||
constructor(audioContext, startTime, endTime) {
|
||
this.audioContext = audioContext;
|
||
this.input = this.audioContext.createGain();
|
||
this.output = this.audioContext.createGain();
|
||
this.passthrough = this.audioContext.createGain();
|
||
this.effectInput = this.audioContext.createGain();
|
||
this.passthrough.gain.value = 1;
|
||
this.effectInput.gain.value = 0;
|
||
this.passthrough.gain.setValueAtTime(0, startTime);
|
||
this.passthrough.gain.setValueAtTime(1, endTime);
|
||
this.effectInput.gain.setValueAtTime(1, startTime);
|
||
this.effectInput.gain.setValueAtTime(0, endTime); // Ring modulator inspired by BBC Dalek voice
|
||
// http://recherche.ircam.fr/pub/dafx11/Papers/66_e.pdf
|
||
// https://github.com/bbc/webaudio.prototyping.bbc.co.uk
|
||
// > There are four parallel signal paths, two which process the
|
||
// > combination Vc + Vin / 2 and two which process Vc - Vin/2.
|
||
// > Each branch consists of a non-linearity [diode]...
|
||
|
||
const createDiodeNode = () => {
|
||
const node = this.audioContext.createWaveShaper(); // Piecewise function given by (2) in Parker paper
|
||
|
||
const transform = (v, vb = 0.2, vl = 0.4, h = 0.65) => {
|
||
if (v <= vb) return 0;
|
||
if (v <= vl) return h * (Math.pow(v - vb, 2) / (2 * vl - 2 * vb));
|
||
return h * v - h * vl + h * (Math.pow(v - vb, 2) / (2 * vl - 2 * vb));
|
||
}; // Create the waveshaper curve with the voltage transform above
|
||
|
||
|
||
const bufferLength = 1024;
|
||
const curve = new Float32Array(bufferLength);
|
||
|
||
for (let i = 0; i < bufferLength; i++) {
|
||
const voltage = 2 * (i / bufferLength) - 1;
|
||
curve[i] = transform(voltage);
|
||
}
|
||
|
||
node.curve = curve;
|
||
return node;
|
||
};
|
||
|
||
const oscillator = this.audioContext.createOscillator();
|
||
oscillator.frequency.value = 50;
|
||
oscillator.start(0);
|
||
const vInGain = this.audioContext.createGain();
|
||
vInGain.gain.value = 0.5;
|
||
const vInInverter1 = this.audioContext.createGain();
|
||
vInInverter1.gain.value = -1;
|
||
const vInInverter2 = this.audioContext.createGain();
|
||
vInInverter2.gain.value = -1;
|
||
const vInDiode1 = createDiodeNode(this.audioContext);
|
||
const vInDiode2 = createDiodeNode(this.audioContext);
|
||
const vInInverter3 = this.audioContext.createGain();
|
||
vInInverter3.gain.value = -1;
|
||
const vcInverter1 = this.audioContext.createGain();
|
||
vcInverter1.gain.value = -1;
|
||
const vcDiode3 = createDiodeNode(this.audioContext);
|
||
const vcDiode4 = createDiodeNode(this.audioContext);
|
||
const compressor = this.audioContext.createDynamicsCompressor();
|
||
compressor.threshold.value = -5;
|
||
compressor.knee.value = 15;
|
||
compressor.ratio.value = 12;
|
||
compressor.attack.value = 0;
|
||
compressor.release.value = 0.25;
|
||
const biquadFilter = this.audioContext.createBiquadFilter();
|
||
biquadFilter.type = 'highpass';
|
||
biquadFilter.frequency.value = 1000;
|
||
biquadFilter.gain.value = 1.25;
|
||
this.input.connect(this.effectInput);
|
||
this.input.connect(this.passthrough);
|
||
this.passthrough.connect(this.output);
|
||
this.effectInput.connect(vcInverter1);
|
||
this.effectInput.connect(vcDiode4);
|
||
vcInverter1.connect(vcDiode3);
|
||
oscillator.connect(vInGain);
|
||
vInGain.connect(vInInverter1);
|
||
vInGain.connect(vcInverter1);
|
||
vInGain.connect(vcDiode4);
|
||
vInInverter1.connect(vInInverter2);
|
||
vInInverter1.connect(vInDiode2);
|
||
vInInverter2.connect(vInDiode1);
|
||
vInDiode1.connect(vInInverter3);
|
||
vInDiode2.connect(vInInverter3);
|
||
vInInverter3.connect(compressor);
|
||
vcDiode3.connect(compressor);
|
||
vcDiode4.connect(compressor);
|
||
this.effectInput.connect(biquadFilter);
|
||
biquadFilter.connect(compressor);
|
||
compressor.connect(this.output);
|
||
}
|
||
|
||
}
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (RobotEffect);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/audio/effects/volume-effect.js":
|
||
/*!************************************************!*\
|
||
!*** ./src/lib/audio/effects/volume-effect.js ***!
|
||
\************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
class VolumeEffect {
|
||
constructor(audioContext, volume, startSeconds, endSeconds) {
|
||
this.audioContext = audioContext;
|
||
this.input = this.audioContext.createGain();
|
||
this.output = this.audioContext.createGain();
|
||
this.gain = this.audioContext.createGain(); // Smoothly ramp the gain up before the start time, and down after the end time.
|
||
|
||
this.rampLength = 0.01;
|
||
this.gain.gain.setValueAtTime(1.0, Math.max(0, startSeconds - this.rampLength));
|
||
this.gain.gain.exponentialRampToValueAtTime(volume, startSeconds);
|
||
this.gain.gain.setValueAtTime(volume, endSeconds);
|
||
this.gain.gain.exponentialRampToValueAtTime(1.0, endSeconds + this.rampLength);
|
||
this.input.connect(this.gain);
|
||
this.gain.connect(this.output);
|
||
}
|
||
|
||
}
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (VolumeEffect);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/audio/shared-audio-context.js":
|
||
/*!***********************************************!*\
|
||
!*** ./src/lib/audio/shared-audio-context.js ***!
|
||
\***********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var startaudiocontext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! startaudiocontext */ "./node_modules/startaudiocontext/StartAudioContext.js");
|
||
/* harmony import */ var startaudiocontext__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(startaudiocontext__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var bowser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! bowser */ "./node_modules/bowser/src/bowser.js");
|
||
/* harmony import */ var bowser__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(bowser__WEBPACK_IMPORTED_MODULE_1__);
|
||
|
||
|
||
let AUDIO_CONTEXT;
|
||
|
||
if (!bowser__WEBPACK_IMPORTED_MODULE_1___default.a.msie) {
|
||
/**
|
||
* AudioContext can be initialized only when user interaction event happens
|
||
*/
|
||
const event = typeof document.ontouchstart === 'undefined' ? 'mousedown' : 'touchstart';
|
||
|
||
const initAudioContext = () => {
|
||
document.removeEventListener(event, initAudioContext);
|
||
AUDIO_CONTEXT = new (window.AudioContext || window.webkitAudioContext)();
|
||
startaudiocontext__WEBPACK_IMPORTED_MODULE_0___default()(AUDIO_CONTEXT);
|
||
};
|
||
|
||
document.addEventListener(event, initAudioContext);
|
||
}
|
||
/**
|
||
* Wrap browser AudioContext because we shouldn't create more than one
|
||
* @return {AudioContext} The singleton AudioContext
|
||
*/
|
||
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (function () {
|
||
return AUDIO_CONTEXT;
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/backpack-api.js":
|
||
/*!*********************************!*\
|
||
!*** ./src/lib/backpack-api.js ***!
|
||
\*********************************/
|
||
/*! exports provided: LOCAL_API, getBackpackContents, saveBackpackObject, deleteBackpackObject, updateBackpackObject, costumePayload, soundPayload, spritePayload, codePayload, fetchCode, fetchSprite */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LOCAL_API", function() { return LOCAL_API; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBackpackContents", function() { return getBackpackContents; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveBackpackObject", function() { return saveBackpackObject; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "deleteBackpackObject", function() { return deleteBackpackObject; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateBackpackObject", function() { return updateBackpackObject; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchCode", function() { return fetchCode; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchSprite", function() { return fetchSprite; });
|
||
/* harmony import */ var xhr__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! xhr */ "./node_modules/xhr/index.js");
|
||
/* harmony import */ var xhr__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(xhr__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _backpack_costume_payload__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./backpack/costume-payload */ "./src/lib/backpack/costume-payload.js");
|
||
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "costumePayload", function() { return _backpack_costume_payload__WEBPACK_IMPORTED_MODULE_1__["default"]; });
|
||
|
||
/* harmony import */ var _backpack_sound_payload__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./backpack/sound-payload */ "./src/lib/backpack/sound-payload.js");
|
||
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "soundPayload", function() { return _backpack_sound_payload__WEBPACK_IMPORTED_MODULE_2__["default"]; });
|
||
|
||
/* harmony import */ var _backpack_sprite_payload__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./backpack/sprite-payload */ "./src/lib/backpack/sprite-payload.js");
|
||
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "spritePayload", function() { return _backpack_sprite_payload__WEBPACK_IMPORTED_MODULE_3__["default"]; });
|
||
|
||
/* harmony import */ var _backpack_code_payload__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./backpack/code-payload */ "./src/lib/backpack/code-payload.js");
|
||
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "codePayload", function() { return _backpack_code_payload__WEBPACK_IMPORTED_MODULE_4__["default"]; });
|
||
|
||
/* harmony import */ var _tw_local_backpack_api__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tw-local-backpack-api */ "./src/lib/tw-local-backpack-api.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const LOCAL_API = '_local_'; // Add a new property for the full thumbnail url, which includes the host.
|
||
// Also include a full body url for loading sprite zips
|
||
// TODO retreiving the images through storage would allow us to remove this.
|
||
|
||
const includeFullUrls = (item, host) => Object.assign({}, item, {
|
||
thumbnailUrl: "".concat(host, "/").concat(item.thumbnail),
|
||
bodyUrl: "".concat(host, "/").concat(item.body)
|
||
});
|
||
|
||
const getBackpackContents = ({
|
||
host,
|
||
username,
|
||
token,
|
||
limit,
|
||
offset
|
||
}) => new Promise((resolve, reject) => {
|
||
if (host === LOCAL_API) {
|
||
return resolve(_tw_local_backpack_api__WEBPACK_IMPORTED_MODULE_5__["default"].getBackpackContents({
|
||
limit,
|
||
offset
|
||
}));
|
||
}
|
||
|
||
xhr__WEBPACK_IMPORTED_MODULE_0___default()({
|
||
method: 'GET',
|
||
uri: "".concat(host, "/").concat(username, "?limit=").concat(limit, "&offset=").concat(offset),
|
||
headers: {
|
||
'x-token': token
|
||
},
|
||
json: true
|
||
}, (error, response) => {
|
||
if (error || response.statusCode !== 200) {
|
||
return reject(new Error(response.status));
|
||
}
|
||
|
||
return resolve(response.body.map(item => includeFullUrls(item, host)));
|
||
});
|
||
});
|
||
|
||
const saveBackpackObject = ({
|
||
host,
|
||
username,
|
||
token,
|
||
type,
|
||
// Type of object being saved to the backpack
|
||
mime,
|
||
// Mime-type of the object being saved
|
||
name,
|
||
// User-facing name of the object being saved
|
||
body,
|
||
// Base64-encoded body of the object being saved
|
||
thumbnail // Base64-encoded JPEG thumbnail of the object being saved
|
||
|
||
}) => new Promise((resolve, reject) => {
|
||
if (host === LOCAL_API) {
|
||
return resolve(_tw_local_backpack_api__WEBPACK_IMPORTED_MODULE_5__["default"].saveBackpackObject({
|
||
type,
|
||
mime,
|
||
name,
|
||
body,
|
||
thumbnail
|
||
}));
|
||
}
|
||
|
||
xhr__WEBPACK_IMPORTED_MODULE_0___default()({
|
||
method: 'POST',
|
||
uri: "".concat(host, "/").concat(username),
|
||
headers: {
|
||
'x-token': token
|
||
},
|
||
json: {
|
||
type,
|
||
mime,
|
||
name,
|
||
body,
|
||
thumbnail
|
||
}
|
||
}, (error, response) => {
|
||
if (error || response.statusCode !== 200) {
|
||
return reject(new Error(response.status));
|
||
}
|
||
|
||
return resolve(includeFullUrls(response.body, host));
|
||
});
|
||
});
|
||
|
||
const deleteBackpackObject = ({
|
||
host,
|
||
username,
|
||
token,
|
||
id
|
||
}) => new Promise((resolve, reject) => {
|
||
if (host === LOCAL_API) {
|
||
return resolve(_tw_local_backpack_api__WEBPACK_IMPORTED_MODULE_5__["default"].deleteBackpackObject({
|
||
id
|
||
}));
|
||
}
|
||
|
||
xhr__WEBPACK_IMPORTED_MODULE_0___default()({
|
||
method: 'DELETE',
|
||
uri: "".concat(host, "/").concat(username, "/").concat(id),
|
||
headers: {
|
||
'x-token': token
|
||
}
|
||
}, (error, response) => {
|
||
if (error || response.statusCode !== 200) {
|
||
return reject(new Error(response.status));
|
||
}
|
||
|
||
return resolve(response.body);
|
||
});
|
||
});
|
||
|
||
const updateBackpackObject = ({
|
||
host,
|
||
id,
|
||
name
|
||
}) => new Promise((resolve, reject) => {
|
||
if (host === LOCAL_API) {
|
||
return resolve(_tw_local_backpack_api__WEBPACK_IMPORTED_MODULE_5__["default"].updateBackpackObject({
|
||
id,
|
||
name
|
||
}));
|
||
}
|
||
|
||
reject(new Error('updateBackpackObject not supported'));
|
||
}); // Two types of backpack items are not retreivable through storage
|
||
// code, as json and sprite3 as arraybuffer zips.
|
||
|
||
|
||
const fetchAs = (responseType, uri) => new Promise((resolve, reject) => {
|
||
xhr__WEBPACK_IMPORTED_MODULE_0___default()({
|
||
uri,
|
||
responseType
|
||
}, (error, response) => {
|
||
if (error || response.statusCode !== 200) {
|
||
return reject(new Error(response.status));
|
||
}
|
||
|
||
return resolve(response.body);
|
||
});
|
||
}); // These two helpers allow easy fetching of backpack code and sprite zips
|
||
// Use the curried fetchAs here so the consumer does not worry about XHR responseTypes
|
||
|
||
|
||
const fetchCode = fetchAs.bind(null, 'json');
|
||
const fetchSprite = fetchAs.bind(null, 'arraybuffer');
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/backpack/block-to-image.js":
|
||
/*!********************************************!*\
|
||
!*** ./src/lib/backpack/block-to-image.js ***!
|
||
\********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var computed_style_to_inline_style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! computed-style-to-inline-style */ "./node_modules/computed-style-to-inline-style/dist/index.js");
|
||
/* harmony import */ var computed_style_to_inline_style__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(computed_style_to_inline_style__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tw-lazy-scratch-blocks */ "./src/lib/tw-lazy-scratch-blocks.js");
|
||
|
||
|
||
/**
|
||
* Given a blockId, return a data-uri image that can be used to create a thumbnail.
|
||
* @param {string} blockId the ID of the block to imagify
|
||
* @return {Promise} resolves to a data-url of a picture of the blocks
|
||
*/
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (function (blockId) {
|
||
const ScratchBlocks = _tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_1__["default"].get(); // Not sure any better way to access the scratch-blocks workspace than this...
|
||
|
||
const block = ScratchBlocks.getMainWorkspace().getBlockById(blockId);
|
||
const blockSvg = block.getSvgRoot().cloneNode(true
|
||
/* deep */
|
||
); // Once we have the cloned SVG, do the rest in a setTimeout to prevent
|
||
// blocking the drag end from finishing promptly.
|
||
|
||
return new Promise(resolve => {
|
||
setTimeout(() => {
|
||
// TW: Fixes issues caused by scratch-blocks block hiding
|
||
blockSvg.style.display = ''; // Strip entities that cannot be inlined
|
||
|
||
blockSvg.innerHTML = blockSvg.innerHTML.replace(/ /g, ' '); // Create an <svg> element to put the cloned blockSvg inside
|
||
|
||
const NS = 'http://www.w3.org/2000/svg';
|
||
const svg = document.createElementNS(NS, 'svg');
|
||
svg.appendChild(blockSvg); // Needs to be on the DOM to get CSS properties and correct sizing
|
||
|
||
document.body.appendChild(svg);
|
||
const padding = 10;
|
||
const extraHatPadding = 16;
|
||
const topPadding = padding + (blockSvg.getAttribute('data-shapes') === 'hat' ? extraHatPadding : 0);
|
||
const leftPadding = padding;
|
||
blockSvg.setAttribute('transform', "translate(".concat(leftPadding, " ").concat(topPadding, ")"));
|
||
const bounds = blockSvg.getBoundingClientRect();
|
||
svg.setAttribute('width', bounds.width + 2 * padding);
|
||
svg.setAttribute('height', bounds.height + 2 * padding); // We need to inline the styles set by CSS rules because
|
||
// not all the styles are set directly on the SVG. This makes the
|
||
// image styled the same way the block actually appears.
|
||
// TODO this doesn't handle images that are xlink:href in the SVG
|
||
|
||
computed_style_to_inline_style__WEBPACK_IMPORTED_MODULE_0___default()(svg, {
|
||
recursive: true,
|
||
// Enumerate the specific properties we need to inline.
|
||
// Specifically properties that are set from CSS in scratch-blocks
|
||
properties: ['fill', 'font-family', 'font-size', 'font-weight']
|
||
});
|
||
const svgString = new XMLSerializer().serializeToString(svg); // Once we have the svg as a string, remove it from the DOM
|
||
|
||
svg.parentNode.removeChild(svg);
|
||
resolve("data:image/svg+xml;utf-8,".concat(encodeURIComponent(svgString)));
|
||
}, 10);
|
||
});
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/backpack/code-payload.js":
|
||
/*!******************************************!*\
|
||
!*** ./src/lib/backpack/code-payload.js ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _block_to_image__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./block-to-image */ "./src/lib/backpack/block-to-image.js");
|
||
/* harmony import */ var _thumbnail__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./thumbnail */ "./src/lib/backpack/thumbnail.js");
|
||
/* harmony import */ var js_base64__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! js-base64 */ "./node_modules/js-base64/base64.js");
|
||
/* harmony import */ var js_base64__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(js_base64__WEBPACK_IMPORTED_MODULE_2__);
|
||
|
||
|
||
|
||
|
||
const codePayload = ({
|
||
blockObjects,
|
||
topBlockId
|
||
}) => {
|
||
const payload = {
|
||
type: 'script',
|
||
// Needs to match backpack-server type name
|
||
name: 'code',
|
||
// All code currently gets the same name
|
||
mime: 'application/json',
|
||
// Backpack expects a base64 encoded string to store. Cannot use btoa because
|
||
// the code can contain characters outside the 0-255 code-point range supported by btoa
|
||
body: js_base64__WEBPACK_IMPORTED_MODULE_2__["Base64"].encode(JSON.stringify(blockObjects)) // Base64 encode the json
|
||
|
||
};
|
||
return Object(_block_to_image__WEBPACK_IMPORTED_MODULE_0__["default"])(topBlockId).then(_thumbnail__WEBPACK_IMPORTED_MODULE_1__["default"]).then(thumbnail => {
|
||
payload.thumbnail = thumbnail;
|
||
return payload;
|
||
});
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (codePayload);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/backpack/costume-payload.js":
|
||
/*!*********************************************!*\
|
||
!*** ./src/lib/backpack/costume-payload.js ***!
|
||
\*********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _thumbnail__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./thumbnail */ "./src/lib/backpack/thumbnail.js");
|
||
/* harmony import */ var _get_costume_url__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../get-costume-url */ "./src/lib/get-costume-url.js");
|
||
|
||
|
||
|
||
const costumePayload = (costume, vm) => {
|
||
// TODO is it ok to base64 encode SVGs? What about unicode text inside them?
|
||
const assetDataUrl = vm.getExportedCostumeBase64(costume);
|
||
const assetDataFormat = costume.dataFormat;
|
||
const payload = {
|
||
type: 'costume',
|
||
name: costume.name,
|
||
// Params to be filled in below
|
||
mime: '',
|
||
body: '',
|
||
thumbnail: ''
|
||
};
|
||
|
||
switch (assetDataFormat) {
|
||
case 'svg':
|
||
payload.mime = 'image/svg+xml';
|
||
payload.body = assetDataUrl;
|
||
break;
|
||
|
||
case 'png':
|
||
payload.mime = 'image/png';
|
||
payload.body = assetDataUrl;
|
||
break;
|
||
|
||
case 'jpg':
|
||
payload.mime = 'image/jpeg';
|
||
payload.body = assetDataUrl;
|
||
break;
|
||
|
||
default:
|
||
alert("Cannot serialize for format: ".concat(assetDataFormat));
|
||
// eslint-disable-line
|
||
} // Do not generate the thumbnail from the raw asset. Instead use the getCostumeUrl
|
||
// utility which inlines the fonts to make the thumbnail show the right fonts.
|
||
|
||
|
||
const inlinedFontDataUrl = Object(_get_costume_url__WEBPACK_IMPORTED_MODULE_1__["default"])(costume.asset);
|
||
return Object(_thumbnail__WEBPACK_IMPORTED_MODULE_0__["default"])(inlinedFontDataUrl).then(thumbnail => {
|
||
payload.thumbnail = thumbnail;
|
||
return payload;
|
||
});
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (costumePayload);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/backpack/sound-payload.js":
|
||
/*!*******************************************!*\
|
||
!*** ./src/lib/backpack/sound-payload.js ***!
|
||
\*******************************************/
|
||
/*! exports provided: default, soundThumbnail */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return soundPayload; });
|
||
/* harmony import */ var _base64_loader_sound_thumbnail_png__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! base64-loader!./sound-thumbnail.png */ "./node_modules/base64-loader/index.js!./src/lib/backpack/sound-thumbnail.png");
|
||
/* harmony import */ var _base64_loader_sound_thumbnail_png__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_base64_loader_sound_thumbnail_png__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony reexport (default from non-harmony) */ __webpack_require__.d(__webpack_exports__, "soundThumbnail", function() { return _base64_loader_sound_thumbnail_png__WEBPACK_IMPORTED_MODULE_0___default.a; });
|
||
// eslint-disable-next-line import/no-unresolved
|
||
|
||
|
||
const soundPayload = sound => {
|
||
const assetDataUrl = sound.asset.encodeDataURI();
|
||
const assetDataFormat = sound.dataFormat;
|
||
const payload = {
|
||
type: 'sound',
|
||
name: sound.name,
|
||
thumbnail: _base64_loader_sound_thumbnail_png__WEBPACK_IMPORTED_MODULE_0___default.a,
|
||
// Params to be filled in below
|
||
mime: '',
|
||
body: ''
|
||
};
|
||
|
||
switch (assetDataFormat) {
|
||
case 'wav':
|
||
payload.mime = 'audio/x-wav';
|
||
payload.body = assetDataUrl.replace('data:audio/x-wav;base64,', '');
|
||
break;
|
||
|
||
case 'mp3':
|
||
payload.mime = 'audio/mp3'; // TODO scratch-storage should be fixed so that encodeDataURI does not
|
||
// always prepend the wave format header; Once that is fixed, the following
|
||
// line will have to change.
|
||
|
||
payload.body = assetDataUrl.replace('data:audio/x-wav;base64,', '');
|
||
break;
|
||
|
||
default:
|
||
alert("Cannot serialize for format: ".concat(assetDataFormat));
|
||
// eslint-disable-line
|
||
} // Return a promise to make it consistent with other payload constructors like costume-payload
|
||
|
||
|
||
return new Promise(resolve => resolve(payload));
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/backpack/sprite-payload.js":
|
||
/*!********************************************!*\
|
||
!*** ./src/lib/backpack/sprite-payload.js ***!
|
||
\********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _thumbnail__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./thumbnail */ "./src/lib/backpack/thumbnail.js");
|
||
|
||
|
||
const spritePayload = (id, vm) => {
|
||
const target = vm.runtime.getTargetById(id);
|
||
if (!target) return null;
|
||
return vm.exportSprite(id, 'base64').then(zippedSprite => {
|
||
const payload = {
|
||
type: 'sprite',
|
||
name: target.sprite.name,
|
||
mime: 'application/zip',
|
||
body: zippedSprite,
|
||
// Filled in below
|
||
thumbnail: ''
|
||
};
|
||
const costumeDataUrl = target.sprite.costumes[target.currentCostume].asset.encodeDataURI();
|
||
return Object(_thumbnail__WEBPACK_IMPORTED_MODULE_0__["default"])(costumeDataUrl).then(thumbnail => {
|
||
payload.thumbnail = thumbnail;
|
||
return payload;
|
||
});
|
||
});
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (spritePayload);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/backpack/thumbnail.js":
|
||
/*!***************************************!*\
|
||
!*** ./src/lib/backpack/thumbnail.js ***!
|
||
\***************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
const jpegThumbnail = dataUrl => new Promise((resolve, reject) => {
|
||
const image = new Image();
|
||
|
||
image.onload = () => {
|
||
const canvas = document.createElement('canvas');
|
||
const ctx = canvas.getContext('2d');
|
||
const maxDimension = 96; // 3x the maximum displayed size of 32px
|
||
// TW: After setting canvas width/height, the canvas is automatically cleared.
|
||
|
||
if (image.height < 1 || image.width < 1) {
|
||
canvas.width = canvas.height = maxDimension; // drawImage can fail if image height/width is less than 1
|
||
// Use blank image; the costume is too small to render anyway
|
||
} else {
|
||
if (image.height > image.width) {
|
||
canvas.height = maxDimension;
|
||
canvas.width = maxDimension / image.height * image.width;
|
||
} else {
|
||
canvas.width = maxDimension;
|
||
canvas.height = maxDimension / image.width * image.height;
|
||
}
|
||
|
||
ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
|
||
} // TW: PNG allows using transparency while JPEG does not.
|
||
// A white background looks quite ugly in dark mode.
|
||
|
||
|
||
const dataURL = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');
|
||
resolve(dataURL);
|
||
};
|
||
|
||
image.onerror = err => {
|
||
reject(err);
|
||
};
|
||
|
||
image.src = dataUrl;
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (jpegThumbnail);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/blocks.js":
|
||
/*!***************************!*\
|
||
!*** ./src/lib/blocks.js ***!
|
||
\***************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tw-lazy-scratch-blocks */ "./src/lib/tw-lazy-scratch-blocks.js");
|
||
|
||
/**
|
||
* Connect scratch blocks with the vm
|
||
* @param {VirtualMachine} vm - The scratch vm
|
||
* @return {ScratchBlocks} ScratchBlocks connected with the vm
|
||
*/
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (function (vm) {
|
||
const ScratchBlocks = _tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_0__["default"].get();
|
||
|
||
const jsonForMenuBlock = function jsonForMenuBlock(name, menuOptionsFn, colors, start) {
|
||
return {
|
||
message0: '%1',
|
||
args0: [{
|
||
type: 'field_dropdown',
|
||
name: name,
|
||
options: function options() {
|
||
return start.concat(menuOptionsFn());
|
||
}
|
||
}],
|
||
inputsInline: true,
|
||
output: 'String',
|
||
colour: colors.secondary,
|
||
colourSecondary: colors.secondary,
|
||
colourTertiary: colors.tertiary,
|
||
outputShape: ScratchBlocks.OUTPUT_SHAPE_ROUND
|
||
};
|
||
};
|
||
|
||
const jsonForHatBlockMenu = function jsonForHatBlockMenu(hatName, name, menuOptionsFn, colors, start) {
|
||
return {
|
||
message0: hatName,
|
||
args0: [{
|
||
type: 'field_dropdown',
|
||
name: name,
|
||
options: function options() {
|
||
return start.concat(menuOptionsFn());
|
||
}
|
||
}],
|
||
colour: colors.primary,
|
||
colourSecondary: colors.secondary,
|
||
colourTertiary: colors.tertiary,
|
||
extensions: ['shape_hat']
|
||
};
|
||
};
|
||
|
||
const jsonForSensingMenus = function jsonForSensingMenus(menuOptionsFn) {
|
||
return {
|
||
message0: ScratchBlocks.Msg.SENSING_OF,
|
||
args0: [{
|
||
type: 'field_dropdown',
|
||
name: 'PROPERTY',
|
||
options: function options() {
|
||
return menuOptionsFn();
|
||
}
|
||
}, {
|
||
type: 'input_value',
|
||
name: 'OBJECT'
|
||
}],
|
||
output: true,
|
||
colour: ScratchBlocks.Colours.sensing.primary,
|
||
colourSecondary: ScratchBlocks.Colours.sensing.secondary,
|
||
colourTertiary: ScratchBlocks.Colours.sensing.tertiary,
|
||
outputShape: ScratchBlocks.OUTPUT_SHAPE_ROUND
|
||
};
|
||
};
|
||
|
||
const soundsMenu = function soundsMenu() {
|
||
let menu = [['', '']];
|
||
|
||
if (vm.editingTarget && vm.editingTarget.sprite.sounds.length > 0) {
|
||
menu = vm.editingTarget.sprite.sounds.map(sound => [sound.name, sound.name]);
|
||
}
|
||
|
||
menu.push([ScratchBlocks.ScratchMsgs.translate('SOUND_RECORD', 'record...'), ScratchBlocks.recordSoundCallback]);
|
||
return menu;
|
||
};
|
||
|
||
const costumesMenu = function costumesMenu() {
|
||
if (vm.editingTarget && vm.editingTarget.getCostumes().length > 0) {
|
||
return vm.editingTarget.getCostumes().map(costume => [costume.name, costume.name]);
|
||
}
|
||
|
||
return [['', '']];
|
||
};
|
||
|
||
const backdropsMenu = function backdropsMenu() {
|
||
const next = ScratchBlocks.ScratchMsgs.translate('LOOKS_NEXTBACKDROP', 'next backdrop');
|
||
const previous = ScratchBlocks.ScratchMsgs.translate('LOOKS_PREVIOUSBACKDROP', 'previous backdrop');
|
||
const random = ScratchBlocks.ScratchMsgs.translate('LOOKS_RANDOMBACKDROP', 'random backdrop');
|
||
|
||
if (vm.runtime.targets[0] && vm.runtime.targets[0].getCostumes().length > 0) {
|
||
return vm.runtime.targets[0].getCostumes().map(costume => [costume.name, costume.name]).concat([[next, 'next backdrop'], [previous, 'previous backdrop'], [random, 'random backdrop']]);
|
||
}
|
||
|
||
return [['', '']];
|
||
};
|
||
|
||
const backdropNamesMenu = function backdropNamesMenu() {
|
||
const stage = vm.runtime.getTargetForStage();
|
||
|
||
if (stage && stage.getCostumes().length > 0) {
|
||
return stage.getCostumes().map(costume => [costume.name, costume.name]);
|
||
}
|
||
|
||
return [['', '']];
|
||
};
|
||
|
||
const spriteMenu = function spriteMenu() {
|
||
const sprites = [];
|
||
|
||
for (const targetId in vm.runtime.targets) {
|
||
if (!vm.runtime.targets.hasOwnProperty(targetId)) continue;
|
||
|
||
if (vm.runtime.targets[targetId].isOriginal) {
|
||
if (!vm.runtime.targets[targetId].isStage) {
|
||
if (vm.runtime.targets[targetId] === vm.editingTarget) {
|
||
continue;
|
||
}
|
||
|
||
sprites.push([vm.runtime.targets[targetId].sprite.name, vm.runtime.targets[targetId].sprite.name]);
|
||
}
|
||
}
|
||
}
|
||
|
||
return sprites;
|
||
};
|
||
|
||
const cloneMenu = function cloneMenu() {
|
||
if (vm.editingTarget && vm.editingTarget.isStage) {
|
||
const menu = spriteMenu();
|
||
|
||
if (menu.length === 0) {
|
||
return [['', '']]; // Empty menu matches Scratch 2 behavior
|
||
}
|
||
|
||
return menu;
|
||
}
|
||
|
||
const myself = ScratchBlocks.ScratchMsgs.translate('CONTROL_CREATECLONEOF_MYSELF', 'myself');
|
||
return [[myself, '_myself_']].concat(spriteMenu());
|
||
};
|
||
|
||
const soundColors = ScratchBlocks.Colours.sounds;
|
||
const looksColors = ScratchBlocks.Colours.looks;
|
||
const motionColors = ScratchBlocks.Colours.motion;
|
||
const sensingColors = ScratchBlocks.Colours.sensing;
|
||
const controlColors = ScratchBlocks.Colours.control;
|
||
const eventColors = ScratchBlocks.Colours.event;
|
||
|
||
ScratchBlocks.Blocks.sound_sounds_menu.init = function () {
|
||
const json = jsonForMenuBlock('SOUND_MENU', soundsMenu, soundColors, []);
|
||
this.jsonInit(json);
|
||
};
|
||
|
||
ScratchBlocks.Blocks.looks_costume.init = function () {
|
||
const json = jsonForMenuBlock('COSTUME', costumesMenu, looksColors, []);
|
||
this.jsonInit(json);
|
||
};
|
||
|
||
ScratchBlocks.Blocks.looks_backdrops.init = function () {
|
||
const json = jsonForMenuBlock('BACKDROP', backdropsMenu, looksColors, []);
|
||
this.jsonInit(json);
|
||
};
|
||
|
||
ScratchBlocks.Blocks.event_whenbackdropswitchesto.init = function () {
|
||
const json = jsonForHatBlockMenu(ScratchBlocks.Msg.EVENT_WHENBACKDROPSWITCHESTO, 'BACKDROP', backdropNamesMenu, eventColors, []);
|
||
this.jsonInit(json);
|
||
};
|
||
|
||
ScratchBlocks.Blocks.motion_pointtowards_menu.init = function () {
|
||
const random = ScratchBlocks.ScratchMsgs.translate('MOTION_POINTTOWARDS_RANDOM', 'random direction');
|
||
const mouse = ScratchBlocks.ScratchMsgs.translate('MOTION_POINTTOWARDS_POINTER', 'mouse-pointer');
|
||
const json = jsonForMenuBlock('TOWARDS', spriteMenu, motionColors, [[mouse, '_mouse_'], [random, '_random_']]);
|
||
this.jsonInit(json);
|
||
};
|
||
|
||
ScratchBlocks.Blocks.motion_goto_menu.init = function () {
|
||
const random = ScratchBlocks.ScratchMsgs.translate('MOTION_GOTO_RANDOM', 'random position');
|
||
const mouse = ScratchBlocks.ScratchMsgs.translate('MOTION_GOTO_POINTER', 'mouse-pointer');
|
||
const json = jsonForMenuBlock('TO', spriteMenu, motionColors, [[random, '_random_'], [mouse, '_mouse_']]);
|
||
this.jsonInit(json);
|
||
};
|
||
|
||
ScratchBlocks.Blocks.motion_glideto_menu.init = function () {
|
||
const random = ScratchBlocks.ScratchMsgs.translate('MOTION_GLIDETO_RANDOM', 'random position');
|
||
const mouse = ScratchBlocks.ScratchMsgs.translate('MOTION_GLIDETO_POINTER', 'mouse-pointer');
|
||
const json = jsonForMenuBlock('TO', spriteMenu, motionColors, [[random, '_random_'], [mouse, '_mouse_']]);
|
||
this.jsonInit(json);
|
||
};
|
||
|
||
ScratchBlocks.Blocks.sensing_of_object_menu.init = function () {
|
||
const stage = ScratchBlocks.ScratchMsgs.translate('SENSING_OF_STAGE', 'Stage');
|
||
const json = jsonForMenuBlock('OBJECT', spriteMenu, sensingColors, [[stage, '_stage_']]);
|
||
this.jsonInit(json);
|
||
};
|
||
|
||
ScratchBlocks.Blocks.sensing_of.init = function () {
|
||
const blockId = this.id;
|
||
const blockType = this.type; // Get the sensing_of block from vm.
|
||
|
||
let defaultSensingOfBlock;
|
||
const blocks = vm.runtime.flyoutBlocks._blocks;
|
||
Object.keys(blocks).forEach(id => {
|
||
const block = blocks[id];
|
||
|
||
if (id === blockType || block && block.opcode === blockType) {
|
||
defaultSensingOfBlock = block;
|
||
}
|
||
}); // Function that fills in menu for the first input in the sensing block.
|
||
// Called every time it opens since it depends on the values in the other block input.
|
||
|
||
const menuFn = function menuFn() {
|
||
const stageOptions = [[ScratchBlocks.Msg.SENSING_OF_BACKDROPNUMBER, 'backdrop #'], [ScratchBlocks.Msg.SENSING_OF_BACKDROPNAME, 'backdrop name'], [ScratchBlocks.Msg.SENSING_OF_VOLUME, 'volume']];
|
||
const spriteOptions = [[ScratchBlocks.Msg.SENSING_OF_XPOSITION, 'x position'], [ScratchBlocks.Msg.SENSING_OF_YPOSITION, 'y position'], [ScratchBlocks.Msg.SENSING_OF_DIRECTION, 'direction'], [ScratchBlocks.Msg.SENSING_OF_COSTUMENUMBER, 'costume #'], [ScratchBlocks.Msg.SENSING_OF_COSTUMENAME, 'costume name'], [ScratchBlocks.Msg.SENSING_OF_SIZE, 'size'], [ScratchBlocks.Msg.SENSING_OF_VOLUME, 'volume']];
|
||
|
||
if (vm.editingTarget) {
|
||
let lookupBlocks = vm.editingTarget.blocks;
|
||
let sensingOfBlock = lookupBlocks.getBlock(blockId); // The block doesn't exist, but should be in the flyout. Look there.
|
||
|
||
if (!sensingOfBlock) {
|
||
sensingOfBlock = vm.runtime.flyoutBlocks.getBlock(blockId) || defaultSensingOfBlock; // If we still don't have a block, just return an empty list . This happens during
|
||
// scratch blocks construction.
|
||
|
||
if (!sensingOfBlock) {
|
||
return [['', '']];
|
||
} // The block was in the flyout so look up future block info there.
|
||
|
||
|
||
lookupBlocks = vm.runtime.flyoutBlocks;
|
||
}
|
||
|
||
const sort = function sort(options) {
|
||
options.sort(ScratchBlocks.scratchBlocksUtils.compareStrings);
|
||
}; // Get all the stage variables (no lists) so we can add them to menu when the stage is selected.
|
||
|
||
|
||
const stageVariableOptions = vm.runtime.getTargetForStage().getAllVariableNamesInScopeByType('');
|
||
sort(stageVariableOptions);
|
||
const stageVariableMenuItems = stageVariableOptions.map(variable => [variable, variable]);
|
||
|
||
if (sensingOfBlock.inputs.OBJECT.shadow !== sensingOfBlock.inputs.OBJECT.block) {
|
||
// There's a block dropped on top of the menu. It'd be nice to evaluate it and
|
||
// return the correct list, but that is tricky. Scratch2 just returns stage options
|
||
// so just do that here too.
|
||
return stageOptions.concat(stageVariableMenuItems);
|
||
}
|
||
|
||
const menuBlock = lookupBlocks.getBlock(sensingOfBlock.inputs.OBJECT.shadow);
|
||
const selectedItem = menuBlock.fields.OBJECT.value;
|
||
|
||
if (selectedItem === '_stage_') {
|
||
return stageOptions.concat(stageVariableMenuItems);
|
||
} // Get all the local variables (no lists) and add them to the menu.
|
||
|
||
|
||
const target = vm.runtime.getSpriteTargetByName(selectedItem);
|
||
let spriteVariableOptions = []; // The target should exist, but there are ways for it not to (e.g. #4203).
|
||
|
||
if (target) {
|
||
spriteVariableOptions = target.getAllVariableNamesInScopeByType('', true);
|
||
sort(spriteVariableOptions);
|
||
}
|
||
|
||
const spriteVariableMenuItems = spriteVariableOptions.map(variable => [variable, variable]);
|
||
return spriteOptions.concat(spriteVariableMenuItems);
|
||
}
|
||
|
||
return [['', '']];
|
||
};
|
||
|
||
const json = jsonForSensingMenus(menuFn);
|
||
this.jsonInit(json);
|
||
};
|
||
|
||
ScratchBlocks.Blocks.sensing_distancetomenu.init = function () {
|
||
const mouse = ScratchBlocks.ScratchMsgs.translate('SENSING_DISTANCETO_POINTER', 'mouse-pointer');
|
||
const json = jsonForMenuBlock('DISTANCETOMENU', spriteMenu, sensingColors, [[mouse, '_mouse_']]);
|
||
this.jsonInit(json);
|
||
};
|
||
|
||
ScratchBlocks.Blocks.sensing_touchingobjectmenu.init = function () {
|
||
const mouse = ScratchBlocks.ScratchMsgs.translate('SENSING_TOUCHINGOBJECT_POINTER', 'mouse-pointer');
|
||
const edge = ScratchBlocks.ScratchMsgs.translate('SENSING_TOUCHINGOBJECT_EDGE', 'edge');
|
||
const json = jsonForMenuBlock('TOUCHINGOBJECTMENU', spriteMenu, sensingColors, [[mouse, '_mouse_'], [edge, '_edge_']]);
|
||
this.jsonInit(json);
|
||
};
|
||
|
||
ScratchBlocks.Blocks.control_create_clone_of_menu.init = function () {
|
||
const json = jsonForMenuBlock('CLONE_OPTION', cloneMenu, controlColors, []);
|
||
this.jsonInit(json);
|
||
};
|
||
|
||
ScratchBlocks.VerticalFlyout.getCheckboxState = function (blockId) {
|
||
const monitoredBlock = vm.runtime.monitorBlocks._blocks[blockId];
|
||
return monitoredBlock ? monitoredBlock.isMonitored : false;
|
||
};
|
||
|
||
ScratchBlocks.FlyoutExtensionCategoryHeader.getExtensionState = function (extensionId) {
|
||
if (vm.getPeripheralIsConnected(extensionId)) {
|
||
return ScratchBlocks.StatusButtonState.READY;
|
||
}
|
||
|
||
return ScratchBlocks.StatusButtonState.NOT_READY;
|
||
};
|
||
|
||
ScratchBlocks.FieldNote.playNote_ = function (noteNum, extensionId) {
|
||
vm.runtime.emit('PLAY_NOTE', noteNum, extensionId);
|
||
}; // Use a collator's compare instead of localeCompare which internally
|
||
// creates a collator. Using this is a lot faster in browsers that create a
|
||
// collator for every localeCompare call.
|
||
|
||
|
||
const collator = new Intl.Collator([], {
|
||
sensitivity: 'base',
|
||
numeric: true
|
||
});
|
||
|
||
ScratchBlocks.scratchBlocksUtils.compareStrings = function (str1, str2) {
|
||
return collator.compare(str1, str2);
|
||
}; // Blocks wants to know if 3D CSS transforms are supported. The cross
|
||
// section of browsers Scratch supports and browsers that support 3D CSS
|
||
// transforms will make the return always true.
|
||
//
|
||
// Shortcutting to true lets us skip an expensive style recalculation when
|
||
// first loading the Scratch editor.
|
||
|
||
|
||
ScratchBlocks.utils.is3dSupported = function () {
|
||
return true;
|
||
};
|
||
|
||
return ScratchBlocks;
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/bmp-converter.js":
|
||
/*!**********************************!*\
|
||
!*** ./src/lib/bmp-converter.js ***!
|
||
\**********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony default export */ __webpack_exports__["default"] = ((bmpImage, type = 'image/bmp') => new Promise(resolve => {
|
||
// If the input is an ArrayBuffer, we need to convert it to a `Blob` and give it a URL so we can use it as an <img>
|
||
// `src`. If it's a data URI, we can use it as-is.
|
||
const imageUrl = bmpImage instanceof String ? bmpImage : window.URL.createObjectURL(new Blob([bmpImage], {
|
||
type
|
||
}));
|
||
const canvas = document.createElement('canvas');
|
||
const ctx = canvas.getContext('2d');
|
||
const image = document.createElement('img');
|
||
image.addEventListener('load', () => {
|
||
canvas.width = image.naturalWidth;
|
||
canvas.height = image.naturalHeight;
|
||
ctx.drawImage(image, 0, 0);
|
||
const dataUrl = canvas.toDataURL('image/png'); // Revoke URL. If a blob URL was generated earlier, this allows the blob to be GC'd and prevents a memory leak.
|
||
|
||
window.URL.revokeObjectURL(imageUrl);
|
||
resolve(dataUrl);
|
||
});
|
||
image.setAttribute('src', imageUrl);
|
||
}));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/brand.js":
|
||
/*!**************************!*\
|
||
!*** ./src/lib/brand.js ***!
|
||
\**************************/
|
||
/*! exports provided: APP_NAME */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "APP_NAME", function() { return APP_NAME; });
|
||
const APP_NAME = 'TurboWarp';
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/cloud-manager-hoc.jsx":
|
||
/*!***************************************!*\
|
||
!*** ./src/lib/cloud-manager-hoc.jsx ***!
|
||
\***************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _lib_cloud_provider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/cloud-provider */ "./src/lib/cloud-provider.js");
|
||
/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/project-state */ "./src/reducers/project-state.js");
|
||
/* harmony import */ var _reducers_alerts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/alerts */ "./src/reducers/alerts.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../reducers/tw */ "./src/reducers/tw.js");
|
||
const _excluded = ["canModifyCloudData", "cloudHost", "reduxCloudHost", "onSetReduxCloudHost", "projectId", "username", "hasCloudPermission", "isShowingWithId", "onShowCloudInfo", "onInvalidUsername", "vm"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/*
|
||
* Higher Order Component to manage the connection to the cloud server.
|
||
* @param {React.Component} WrappedComponent component to manage VM events for
|
||
* @returns {React.Component} connected component with vm events bound to redux
|
||
*/
|
||
|
||
const cloudManagerHOC = function cloudManagerHOC(WrappedComponent) {
|
||
class CloudManager extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
this.cloudProvider = null;
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default()(this, ['handleCloudDataUpdate', 'onInvalidUsername']);
|
||
this.props.vm.on('HAS_CLOUD_DATA_UPDATE', this.handleCloudDataUpdate);
|
||
this.props.onSetReduxCloudHost(this.props.cloudHost);
|
||
}
|
||
|
||
componentDidMount() {
|
||
if (this.shouldConnect(this.props)) {
|
||
this.connectToCloud();
|
||
}
|
||
}
|
||
|
||
componentWillReceiveProps(nextProps) {
|
||
if (this.props.reduxCloudHost !== nextProps.cloudHost) {
|
||
this.props.onSetReduxCloudHost(nextProps.cloudHost);
|
||
}
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
// TODO need to add cloud provider disconnection logic and cloud data clearing logic
|
||
// when loading a new project e.g. via file upload
|
||
// (and eventually move it out of the vm.clear function)
|
||
if (this.shouldReconnect(this.props, prevProps)) {
|
||
this.disconnectFromCloud();
|
||
|
||
if (this.shouldConnect(this.props)) {
|
||
this.connectToCloud();
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
if (this.shouldConnect(this.props) && !this.shouldConnect(prevProps)) {
|
||
this.connectToCloud();
|
||
}
|
||
|
||
if (this.shouldDisconnect(this.props, prevProps)) {
|
||
this.disconnectFromCloud();
|
||
}
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.props.vm.off('HAS_CLOUD_DATA_UPDATE', this.handleCloudDataUpdate);
|
||
this.disconnectFromCloud();
|
||
}
|
||
|
||
canUseCloud(props) {
|
||
return !!(props.reduxCloudHost && props.username && props.vm && props.projectId && props.hasCloudPermission);
|
||
}
|
||
|
||
shouldConnect(props) {
|
||
return !this.isConnected() && this.canUseCloud(props) && props.isShowingWithId && props.vm.runtime.hasCloudData() && props.canModifyCloudData;
|
||
}
|
||
|
||
shouldDisconnect(props, prevProps) {
|
||
return this.isConnected() && ( // Can no longer use cloud or cloud provider info is now stale
|
||
!this.canUseCloud(props) || !props.vm.runtime.hasCloudData() || props.projectId !== prevProps.projectId || // tw: username changes are handled in "reconnect"
|
||
// (props.username !== prevProps.username) ||
|
||
// Editing someone else's project
|
||
!props.canModifyCloudData);
|
||
}
|
||
|
||
shouldReconnect(props, prevProps) {
|
||
return this.isConnected() && (props.username !== prevProps.username || props.reduxCloudHost !== prevProps.reduxCloudHost);
|
||
}
|
||
|
||
isConnected() {
|
||
return this.cloudProvider && !!this.cloudProvider.connection;
|
||
}
|
||
|
||
connectToCloud() {
|
||
this.cloudProvider = new _lib_cloud_provider__WEBPACK_IMPORTED_MODULE_5__["default"](this.props.reduxCloudHost, this.props.vm, this.props.username, this.props.projectId);
|
||
this.cloudProvider.onInvalidUsername = this.onInvalidUsername;
|
||
this.props.vm.setCloudProvider(this.cloudProvider);
|
||
}
|
||
|
||
disconnectFromCloud() {
|
||
if (this.cloudProvider) {
|
||
this.cloudProvider.requestCloseConnection();
|
||
this.cloudProvider = null;
|
||
this.props.vm.setCloudProvider(null);
|
||
}
|
||
}
|
||
|
||
handleCloudDataUpdate(projectHasCloudData) {
|
||
if (this.isConnected() && !projectHasCloudData) {
|
||
this.disconnectFromCloud();
|
||
} else if (this.shouldConnect(this.props)) {
|
||
this.props.onShowCloudInfo();
|
||
this.connectToCloud();
|
||
}
|
||
}
|
||
|
||
onInvalidUsername() {
|
||
this.props.onInvalidUsername();
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
canModifyCloudData,
|
||
cloudHost,
|
||
reduxCloudHost,
|
||
onSetReduxCloudHost,
|
||
projectId,
|
||
username,
|
||
hasCloudPermission,
|
||
isShowingWithId,
|
||
onShowCloudInfo,
|
||
onInvalidUsername,
|
||
|
||
/* eslint-enable no-unused-vars */
|
||
vm
|
||
} = _this$props,
|
||
componentProps = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(WrappedComponent, _extends({
|
||
canUseCloud: this.canUseCloud(this.props),
|
||
vm: vm
|
||
}, componentProps));
|
||
}
|
||
|
||
}
|
||
|
||
CloudManager.propTypes = {
|
||
canModifyCloudData: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
cloudHost: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
reduxCloudHost: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
onSetReduxCloudHost: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
hasCloudPermission: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
isShowingWithId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool.isRequired,
|
||
onInvalidUsername: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onShowCloudInfo: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
projectId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number]),
|
||
username: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a).isRequired
|
||
};
|
||
CloudManager.defaultProps = {
|
||
cloudHost: null,
|
||
onShowCloudInfo: () => {},
|
||
username: null
|
||
};
|
||
|
||
const mapStateToProps = (state, ownProps) => {
|
||
const loadingState = state.scratchGui.projectState.loadingState;
|
||
return {
|
||
reduxCloudHost: state.scratchGui.tw.cloudHost,
|
||
isShowingWithId: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_6__["getIsShowingWithId"])(loadingState),
|
||
projectId: state.scratchGui.projectState.projectId,
|
||
hasCloudPermission: state.scratchGui.tw.cloud,
|
||
username: state.scratchGui.tw.username,
|
||
canModifyCloudData: !state.scratchGui.mode.hasEverEnteredEditor || ownProps.canSave
|
||
};
|
||
};
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onSetReduxCloudHost: cloudHost => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_9__["setCloudHost"])(cloudHost)),
|
||
onShowCloudInfo: () => Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_7__["showAlertWithTimeout"])(dispatch, 'cloudInfo'),
|
||
onInvalidUsername: () => {
|
||
dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_9__["setUsernameInvalid"])(true));
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_8__["openUsernameModal"])());
|
||
}
|
||
}); // Allow incoming props to override redux-provided props. Used to mock in tests.
|
||
|
||
|
||
const mergeProps = (stateProps, dispatchProps, ownProps) => Object.assign({}, stateProps, dispatchProps, ownProps);
|
||
|
||
return Object(react_redux__WEBPACK_IMPORTED_MODULE_2__["connect"])(mapStateToProps, mapDispatchToProps, mergeProps)(CloudManager);
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (cloudManagerHOC);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/cloud-provider.js":
|
||
/*!***********************************!*\
|
||
!*** ./src/lib/cloud-provider.js ***!
|
||
\***********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./log.js */ "./src/lib/log.js");
|
||
/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash.throttle */ "./node_modules/lodash.throttle/index.js");
|
||
/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_1__);
|
||
|
||
|
||
|
||
const anonymizeUsername = username => {
|
||
if (/^player\d{2,7}$/i.test(username)) {
|
||
return 'player';
|
||
}
|
||
|
||
return username;
|
||
};
|
||
|
||
class CloudProvider {
|
||
/**
|
||
* A cloud data provider which creates and manages a web socket connection
|
||
* to the Scratch cloud data server. This provider is responsible for
|
||
* interfacing with the VM's cloud io device.
|
||
* @param {string} cloudHost The url for the cloud data server
|
||
* @param {VirtualMachine} vm The Scratch virtual machine to interface with
|
||
* @param {string} username The username to associate cloud data updates with
|
||
* @param {string} projectId The id associated with the project containing
|
||
* cloud data.
|
||
*/
|
||
constructor(cloudHost, vm, username, projectId) {
|
||
this.vm = vm;
|
||
this.username = anonymizeUsername(username);
|
||
this.projectId = projectId;
|
||
this.cloudHost = cloudHost;
|
||
this.connectionAttempts = 0; // A queue of messages to send which were received before the
|
||
// connection was ready
|
||
|
||
this.queuedData = [];
|
||
this.openConnection(); // Send a message to the cloud server at a rate of no more
|
||
// than 10 messages/sec.
|
||
// tw: we let cloud variables change at a greater rate
|
||
|
||
this.sendCloudData = lodash_throttle__WEBPACK_IMPORTED_MODULE_1___default()(this._sendCloudData, 50);
|
||
}
|
||
/**
|
||
* Open a new websocket connection to the clouddata server.
|
||
* @param {string} cloudHost The cloud data server to connect to.
|
||
*/
|
||
|
||
|
||
openConnection() {
|
||
this.connectionAttempts += 1;
|
||
|
||
try {
|
||
// tw: only add ws:// or wss:// if it not already present in the cloudHost
|
||
if (!this.cloudHost || !this.cloudHost.includes('ws://') && !this.cloudHost.includes('wss://')) {
|
||
this.cloudHost = (location.protocol === 'http:' ? 'ws://' : 'wss://') + this.cloudHost;
|
||
}
|
||
|
||
this.connection = new WebSocket(this.cloudHost);
|
||
} catch (e) {
|
||
_log_js__WEBPACK_IMPORTED_MODULE_0__["default"].warn('Websocket support is not available in this browser', e);
|
||
this.connection = null;
|
||
return;
|
||
}
|
||
|
||
this.connection.onerror = this.onError.bind(this);
|
||
this.connection.onmessage = this.onMessage.bind(this);
|
||
this.connection.onopen = this.onOpen.bind(this);
|
||
this.connection.onclose = this.onClose.bind(this);
|
||
}
|
||
|
||
onError(event) {
|
||
_log_js__WEBPACK_IMPORTED_MODULE_0__["default"].error("Websocket connection error: ".concat(JSON.stringify(event))); // Error is always followed by close, which handles reconnect logic.
|
||
}
|
||
|
||
onMessage(event) {
|
||
const messageString = event.data; // Multiple commands can be received, newline separated
|
||
|
||
messageString.split('\n').forEach(message => {
|
||
if (message) {
|
||
// .split can also contain '' in the array it returns
|
||
const parsedData = this.parseMessage(JSON.parse(message));
|
||
this.vm.postIOData('cloud', parsedData);
|
||
}
|
||
});
|
||
}
|
||
|
||
onOpen() {
|
||
// Reset connection attempts to 1 to make sure any subsequent reconnects
|
||
// use connectionAttempts=1 to calculate timeout
|
||
this.connectionAttempts = 1;
|
||
this.writeToServer('handshake');
|
||
_log_js__WEBPACK_IMPORTED_MODULE_0__["default"].info("Successfully connected to clouddata server."); // Go through the queued data and send off messages that we weren't
|
||
// ready to send before
|
||
|
||
this.queuedData.forEach(data => {
|
||
this.sendCloudData(data);
|
||
}); // Reset the queue
|
||
|
||
this.queuedData = [];
|
||
}
|
||
|
||
onClose(e) {
|
||
// tw: code 4002 is "Username Error" -- do not try to reconnect
|
||
if (e && e.code === 4002) {
|
||
_log_js__WEBPACK_IMPORTED_MODULE_0__["default"].info('Cloud username is invalid. Not reconnecting.');
|
||
this.onInvalidUsername();
|
||
return;
|
||
} // tw: code 4004 is "Project Unavailable" -- do not try to reconnect
|
||
|
||
|
||
if (e && e.code === 4004) {
|
||
_log_js__WEBPACK_IMPORTED_MODULE_0__["default"].info('Cloud variables are disabled for this project. Not reconnecting.');
|
||
return;
|
||
}
|
||
|
||
_log_js__WEBPACK_IMPORTED_MODULE_0__["default"].info("Closed connection to websocket");
|
||
const randomizedTimeout = this.randomizeDuration(this.exponentialTimeout());
|
||
this.setTimeout(this.openConnection.bind(this), randomizedTimeout);
|
||
} // tw: method called when username is invalid
|
||
|
||
|
||
onInvalidUsername() {
|
||
/* no-op */
|
||
}
|
||
|
||
exponentialTimeout() {
|
||
return (Math.pow(2, Math.min(this.connectionAttempts, 5)) - 1) * 1000;
|
||
}
|
||
|
||
randomizeDuration(t) {
|
||
return Math.random() * t;
|
||
}
|
||
|
||
setTimeout(fn, time) {
|
||
_log_js__WEBPACK_IMPORTED_MODULE_0__["default"].info("Reconnecting in ".concat((time / 1000).toFixed(1), "s, attempt ").concat(this.connectionAttempts));
|
||
this._connectionTimeout = window.setTimeout(fn, time);
|
||
}
|
||
|
||
parseMessage(message) {
|
||
const varData = {};
|
||
|
||
switch (message.method) {
|
||
case 'set':
|
||
{
|
||
varData.varUpdate = {
|
||
name: message.name,
|
||
value: message.value
|
||
};
|
||
break;
|
||
}
|
||
}
|
||
|
||
return varData;
|
||
}
|
||
/**
|
||
* Format and send a message to the cloud data server.
|
||
* @param {string} methodName The message method, indicating the action to perform.
|
||
* @param {string} dataName The name of the cloud variable this message pertains to
|
||
* @param {string | number} dataValue The value to set the cloud variable to
|
||
* @param {string} dataNewName The new name for the cloud variable (if renaming)
|
||
*/
|
||
|
||
|
||
writeToServer(methodName, dataName, dataValue, dataNewName) {
|
||
const msg = {};
|
||
msg.method = methodName;
|
||
msg.user = this.username;
|
||
msg.project_id = this.projectId; // Optional string params can use simple falsey undefined check
|
||
|
||
if (dataName) msg.name = dataName;
|
||
if (dataNewName) msg.new_name = dataNewName; // Optional number params need different undefined check
|
||
|
||
if (typeof dataValue !== 'undefined' && dataValue !== null) msg.value = dataValue;
|
||
const dataToWrite = JSON.stringify(msg);
|
||
|
||
if (this.connection && this.connection.readyState === WebSocket.OPEN) {
|
||
this.sendCloudData(dataToWrite);
|
||
} else if (msg.method === 'create' || msg.method === 'delete' || msg.method === 'rename') {
|
||
// Save data for sending when connection is open, iff the data
|
||
// is a create, rename, or delete
|
||
this.queuedData.push(dataToWrite);
|
||
}
|
||
}
|
||
/**
|
||
* Send a formatted message to the cloud data server.
|
||
* @param {string} data The formatted message to send.
|
||
*/
|
||
|
||
|
||
_sendCloudData(data) {
|
||
this.connection.send("".concat(data, "\n"));
|
||
}
|
||
/**
|
||
* Provides an API for the VM's cloud IO device to create
|
||
* a new cloud variable on the server.
|
||
* @param {string} name The name of the variable to create
|
||
* @param {string | number} value The value of the new cloud variable.
|
||
*/
|
||
|
||
|
||
createVariable(name, value) {
|
||
this.writeToServer('create', name, value);
|
||
}
|
||
/**
|
||
* Provides an API for the VM's cloud IO device to update
|
||
* a cloud variable on the server.
|
||
* @param {string} name The name of the variable to update
|
||
* @param {string | number} value The new value for the variable
|
||
*/
|
||
|
||
|
||
updateVariable(name, value) {
|
||
this.writeToServer('set', name, value);
|
||
}
|
||
/**
|
||
* Provides an API for the VM's cloud IO device to rename
|
||
* a cloud variable on the server.
|
||
* @param {string} oldName The old name of the variable to rename
|
||
* @param {string} newName The new name for the cloud variable.
|
||
*/
|
||
|
||
|
||
renameVariable(oldName, newName) {
|
||
this.writeToServer('rename', oldName, null, newName);
|
||
}
|
||
/**
|
||
* Provides an API for the VM's cloud IO device to delete
|
||
* a cloud variable on the server.
|
||
* @param {string} name The name of the variable to delete
|
||
*/
|
||
|
||
|
||
deleteVariable(name) {
|
||
this.writeToServer('delete', name);
|
||
}
|
||
/**
|
||
* Closes the connection to the web socket and clears the cloud
|
||
* provider of references related to the cloud data project.
|
||
*/
|
||
|
||
|
||
requestCloseConnection() {
|
||
if (this.connection && this.connection.readyState !== WebSocket.CLOSING && this.connection.readyState !== WebSocket.CLOSED) {
|
||
_log_js__WEBPACK_IMPORTED_MODULE_0__["default"].info('Request close cloud connection without reconnecting'); // Remove listeners, after this point we do not want to react to connection updates
|
||
|
||
this.connection.onclose = () => {};
|
||
|
||
this.connection.onerror = () => {};
|
||
|
||
this.connection.close();
|
||
}
|
||
|
||
this.clear();
|
||
}
|
||
/**
|
||
* Clear this provider of references related to the project
|
||
* and current state.
|
||
*/
|
||
|
||
|
||
clear() {
|
||
this.connection = null;
|
||
this.vm = null;
|
||
this.username = null;
|
||
this.projectId = null;
|
||
|
||
if (this._connectionTimeout) {
|
||
clearTimeout(this._connectionTimeout);
|
||
this._connectionTimeout = null;
|
||
}
|
||
|
||
this.connectionAttempts = 0;
|
||
}
|
||
|
||
}
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (CloudProvider);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/collect-metadata.js":
|
||
/*!*************************************!*\
|
||
!*** ./src/lib/collect-metadata.js ***!
|
||
\*************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/**
|
||
* Report a telemetry event.
|
||
* @param {string} event - one of `projectWasCreated`, `projectDidLoad`, `projectDidSave`, `projectWasUploaded`
|
||
*/
|
||
// TODO make a telemetry HOC and move this stuff there
|
||
const collectMetadata = function collectMetadata(vm, projectName = '', locale = '') {
|
||
// TODO move most or all of this into a collectMetadata() method on the VM/Runtime
|
||
const metadata = {
|
||
projectName: projectName,
|
||
language: locale,
|
||
spriteCount: 0,
|
||
blocksCount: 0,
|
||
costumesCount: 0,
|
||
listsCount: 0,
|
||
scriptCount: 0,
|
||
soundsCount: 0,
|
||
variablesCount: 0
|
||
};
|
||
|
||
for (const target of vm.runtime.targets) {
|
||
++metadata.spriteCount;
|
||
metadata.blocksCount += Object.keys(target.sprite.blocks._blocks).length;
|
||
metadata.costumesCount += target.sprite.costumes_.length;
|
||
metadata.scriptCount += target.sprite.blocks._scripts.length;
|
||
metadata.soundsCount += target.sprite.sounds.length;
|
||
|
||
for (const variableName in target.variables) {
|
||
const variable = target.variables[variableName];
|
||
|
||
if (variable.type === 'list') {
|
||
++metadata.listsCount;
|
||
} else {
|
||
++metadata.variablesCount;
|
||
}
|
||
}
|
||
}
|
||
|
||
return metadata;
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (collectMetadata);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/connected-intl-provider.jsx":
|
||
/*!*********************************************!*\
|
||
!*** ./src/lib/connected-intl-provider.jsx ***!
|
||
\*********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
|
||
|
||
|
||
const mapStateToProps = state => ({
|
||
key: state.locales.locale,
|
||
locale: state.locales.locale,
|
||
messages: state.locales.messages
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_1__["connect"])(mapStateToProps)(react_intl__WEBPACK_IMPORTED_MODULE_0__["IntlProvider"]));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/data-uri-to-blob.js":
|
||
/*!*************************************!*\
|
||
!*** ./src/lib/data-uri-to-blob.js ***!
|
||
\*************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return dataURItoBlob; });
|
||
/**
|
||
* Utility to convert data URIs to blobs
|
||
* Adapted from https://stackoverflow.com/questions/12168909/blob-from-dataurl
|
||
* @param {string} dataURI the data uri to blobify
|
||
* @return {Blob} a blob representing the data uri
|
||
*/
|
||
function dataURItoBlob(dataURI) {
|
||
const byteString = atob(dataURI.split(',')[1]);
|
||
const mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
|
||
const arrayBuffer = new ArrayBuffer(byteString.length);
|
||
const uintArray = new Uint8Array(arrayBuffer);
|
||
|
||
for (let i = 0; i < byteString.length; i++) {
|
||
uintArray[i] = byteString.charCodeAt(i);
|
||
}
|
||
|
||
const blob = new Blob([arrayBuffer], {
|
||
type: mimeString
|
||
});
|
||
return blob;
|
||
}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/default-project/index.js":
|
||
/*!******************************************!*\
|
||
!*** ./src/lib/default-project/index.js ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _project_data__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./project-data */ "./src/lib/default-project/project-data.js");
|
||
/* harmony import */ var _raw_loader_cd21514d0531fdffb22204e0ec5ed84a_svg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! raw-loader!./cd21514d0531fdffb22204e0ec5ed84a.svg */ "./node_modules/raw-loader/index.js!./src/lib/default-project/cd21514d0531fdffb22204e0ec5ed84a.svg");
|
||
/* harmony import */ var _raw_loader_cd21514d0531fdffb22204e0ec5ed84a_svg__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_raw_loader_cd21514d0531fdffb22204e0ec5ed84a_svg__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _raw_loader_dango_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! raw-loader!./dango.svg */ "./node_modules/raw-loader/index.js!./src/lib/default-project/dango.svg");
|
||
/* harmony import */ var _raw_loader_dango_svg__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_raw_loader_dango_svg__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _tw_text_encoder__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tw-text-encoder */ "./src/lib/tw-text-encoder.js");
|
||
|
||
/* eslint-disable import/no-unresolved */
|
||
|
||
|
||
|
||
/* eslint-enable import/no-unresolved */
|
||
|
||
|
||
|
||
const defaultProject = translator => {
|
||
const encoder = new _tw_text_encoder__WEBPACK_IMPORTED_MODULE_3__["TextEncoder"]();
|
||
const projectJson = Object(_project_data__WEBPACK_IMPORTED_MODULE_0__["default"])(translator);
|
||
return [{
|
||
id: 0,
|
||
assetType: 'Project',
|
||
dataFormat: 'JSON',
|
||
data: JSON.stringify(projectJson)
|
||
}, {
|
||
id: 'cd21514d0531fdffb22204e0ec5ed84a',
|
||
assetType: 'ImageVector',
|
||
dataFormat: 'SVG',
|
||
data: encoder.encode(_raw_loader_cd21514d0531fdffb22204e0ec5ed84a_svg__WEBPACK_IMPORTED_MODULE_1___default.a)
|
||
}, {
|
||
id: '592bae6f8bb9c8d88401b54ac431f7b6',
|
||
assetType: 'ImageVector',
|
||
dataFormat: 'SVG',
|
||
data: encoder.encode(_raw_loader_dango_svg__WEBPACK_IMPORTED_MODULE_2___default.a)
|
||
}];
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (defaultProject);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/default-project/project-data.js":
|
||
/*!*************************************************!*\
|
||
!*** ./src/lib/default-project/project-data.js ***!
|
||
\*************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _shared_messages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../shared-messages */ "./src/lib/shared-messages.js");
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
|
||
|
||
let messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["defineMessages"])({
|
||
variable: {
|
||
"id": "gui.defaultProject.variable",
|
||
"defaultMessage": "my variable"
|
||
}
|
||
});
|
||
messages = _objectSpread(_objectSpread({}, messages), _shared_messages__WEBPACK_IMPORTED_MODULE_1__["default"]); // use the default message if a translation function is not passed
|
||
|
||
const defaultTranslator = msgObj => msgObj.defaultMessage;
|
||
/**
|
||
* Generate a localized version of the default project
|
||
* @param {function} translateFunction a function to use for translating the default names
|
||
* @return {object} the project data json for the default project
|
||
*/
|
||
|
||
|
||
const projectData = translateFunction => {
|
||
const translator = translateFunction || defaultTranslator;
|
||
return {
|
||
targets: [{
|
||
isStage: true,
|
||
name: 'Stage',
|
||
variables: {
|
||
'`jEk@4|i[#Fk?(8x)AV.-my variable': [translator(messages.variable), 0]
|
||
},
|
||
lists: {},
|
||
broadcasts: {},
|
||
blocks: {},
|
||
currentCostume: 0,
|
||
costumes: [{
|
||
assetId: 'cd21514d0531fdffb22204e0ec5ed84a',
|
||
name: translator(messages.backdrop, {
|
||
index: 1
|
||
}),
|
||
md5ext: 'cd21514d0531fdffb22204e0ec5ed84a.svg',
|
||
dataFormat: 'svg',
|
||
rotationCenterX: 240,
|
||
rotationCenterY: 180
|
||
}],
|
||
sounds: [],
|
||
volume: 100
|
||
}, {
|
||
isStage: false,
|
||
name: translator(messages.sprite, {
|
||
index: 1
|
||
}),
|
||
variables: {},
|
||
lists: {},
|
||
broadcasts: {},
|
||
blocks: {},
|
||
comments: {},
|
||
currentCostume: 0,
|
||
costumes: [{
|
||
assetId: '592bae6f8bb9c8d88401b54ac431f7b6',
|
||
name: translator(messages.costume, {
|
||
index: 1
|
||
}),
|
||
bitmapResolution: 1,
|
||
md5ext: '592bae6f8bb9c8d88401b54ac431f7b6.svg',
|
||
dataFormat: 'svg',
|
||
rotationCenterX: 44,
|
||
rotationCenterY: 44
|
||
}],
|
||
sounds: [],
|
||
volume: 100,
|
||
visible: true,
|
||
x: 0,
|
||
y: 0,
|
||
size: 100,
|
||
direction: 90,
|
||
draggable: false,
|
||
rotationStyle: 'all around'
|
||
}],
|
||
meta: {
|
||
semver: '3.0.0',
|
||
vm: '0.1.0',
|
||
agent: ''
|
||
}
|
||
};
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (projectData);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/define-dynamic-block.js":
|
||
/*!*****************************************!*\
|
||
!*** ./src/lib/define-dynamic-block.js ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var scratch_vm_src_extension_support_argument_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! scratch-vm/src/extension-support/argument-type */ "./node_modules/scratch-vm/src/extension-support/argument-type.js");
|
||
/* harmony import */ var scratch_vm_src_extension_support_argument_type__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(scratch_vm_src_extension_support_argument_type__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var scratch_vm_src_extension_support_block_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! scratch-vm/src/extension-support/block-type */ "./node_modules/scratch-vm/src/extension-support/block-type.js");
|
||
/* harmony import */ var scratch_vm_src_extension_support_block_type__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(scratch_vm_src_extension_support_block_type__WEBPACK_IMPORTED_MODULE_1__);
|
||
// TODO: access `BlockType` and `ArgumentType` without reaching into VM
|
||
// Should we move these into a new extension support module or something?
|
||
|
||
|
||
/**
|
||
* Define a block using extension info which has the ability to dynamically determine (and update) its layout.
|
||
* This functionality is used for extension blocks which can change its properties based on different state
|
||
* information. For example, the `control_stop` block changes its shape based on which menu item is selected
|
||
* and a variable block changes its text to reflect the variable name without using an editable field.
|
||
* @param {object} ScratchBlocks - The ScratchBlocks name space.
|
||
* @param {object} categoryInfo - Information about this block's extension category, including any menus and icons.
|
||
* @param {object} staticBlockInfo - The base block information before any dynamic changes.
|
||
* @param {string} extendedOpcode - The opcode for the block (including the extension ID).
|
||
*/
|
||
// TODO: grow this until it can fully replace `_convertForScratchBlocks` in the VM runtime
|
||
|
||
const defineDynamicBlock = (ScratchBlocks, categoryInfo, staticBlockInfo, extendedOpcode) => ({
|
||
init: function init() {
|
||
const blockJson = {
|
||
type: extendedOpcode,
|
||
inputsInline: true,
|
||
category: categoryInfo.name,
|
||
colour: categoryInfo.color1,
|
||
colourSecondary: categoryInfo.color2,
|
||
colourTertiary: categoryInfo.color3
|
||
}; // There is a scratch-blocks / Blockly extension called "scratch_extension" which adjusts the styling of
|
||
// blocks to allow for an icon, a feature of Scratch extension blocks. However, Scratch "core" extension
|
||
// blocks don't have icons and so they should not use 'scratch_extension'. Adding a scratch-blocks / Blockly
|
||
// extension after `jsonInit` isn't fully supported (?), so we decide now whether there will be an icon.
|
||
|
||
if (staticBlockInfo.blockIconURI || categoryInfo.blockIconURI) {
|
||
blockJson.extensions = ['scratch_extension'];
|
||
} // initialize the basics of the block, to be overridden & extended later by `domToMutation`
|
||
|
||
|
||
this.jsonInit(blockJson); // initialize the cached block info used to carry block info from `domToMutation` to `mutationToDom`
|
||
|
||
this.blockInfoText = '{}'; // we need a block info update (through `domToMutation`) before we have a completely initialized block
|
||
|
||
this.needsBlockInfoUpdate = true;
|
||
},
|
||
mutationToDom: function mutationToDom() {
|
||
const container = document.createElement('mutation');
|
||
container.setAttribute('blockInfo', this.blockInfoText);
|
||
return container;
|
||
},
|
||
domToMutation: function domToMutation(xmlElement) {
|
||
const blockInfoText = xmlElement.getAttribute('blockInfo');
|
||
if (!blockInfoText) return;
|
||
|
||
if (!this.needsBlockInfoUpdate) {
|
||
throw new Error('Attempted to update block info twice');
|
||
}
|
||
|
||
delete this.needsBlockInfoUpdate;
|
||
this.blockInfoText = blockInfoText;
|
||
const blockInfo = JSON.parse(blockInfoText);
|
||
|
||
switch (blockInfo.blockType) {
|
||
case scratch_vm_src_extension_support_block_type__WEBPACK_IMPORTED_MODULE_1___default.a.COMMAND:
|
||
case scratch_vm_src_extension_support_block_type__WEBPACK_IMPORTED_MODULE_1___default.a.CONDITIONAL:
|
||
case scratch_vm_src_extension_support_block_type__WEBPACK_IMPORTED_MODULE_1___default.a.LOOP:
|
||
this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_SQUARE);
|
||
this.setPreviousStatement(true);
|
||
this.setNextStatement(!blockInfo.isTerminal);
|
||
break;
|
||
|
||
case scratch_vm_src_extension_support_block_type__WEBPACK_IMPORTED_MODULE_1___default.a.REPORTER:
|
||
this.setOutput(true);
|
||
this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_ROUND);
|
||
|
||
if (!blockInfo.disableMonitor) {
|
||
this.setCheckboxInFlyout(true);
|
||
}
|
||
|
||
break;
|
||
|
||
case scratch_vm_src_extension_support_block_type__WEBPACK_IMPORTED_MODULE_1___default.a.BOOLEAN:
|
||
this.setOutput(true);
|
||
this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_HEXAGONAL);
|
||
break;
|
||
|
||
case scratch_vm_src_extension_support_block_type__WEBPACK_IMPORTED_MODULE_1___default.a.HAT:
|
||
case scratch_vm_src_extension_support_block_type__WEBPACK_IMPORTED_MODULE_1___default.a.EVENT:
|
||
this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_SQUARE);
|
||
this.setNextStatement(true);
|
||
break;
|
||
}
|
||
|
||
if (blockInfo.color1 || blockInfo.color2 || blockInfo.color3) {
|
||
// `setColour` handles undefined parameters by adjusting defined colors
|
||
this.setColour(blockInfo.color1, blockInfo.color2, blockInfo.color3);
|
||
} // Layout block arguments
|
||
// TODO handle E/C Blocks
|
||
|
||
|
||
const blockText = blockInfo.text;
|
||
const args = [];
|
||
let argCount = 0;
|
||
const scratchBlocksStyleText = blockText.replace(/\[(.+?)]/g, (match, argName) => {
|
||
const arg = blockInfo.arguments[argName];
|
||
|
||
switch (arg.type) {
|
||
case scratch_vm_src_extension_support_argument_type__WEBPACK_IMPORTED_MODULE_0___default.a.STRING:
|
||
args.push({
|
||
type: 'input_value',
|
||
name: argName
|
||
});
|
||
break;
|
||
|
||
case scratch_vm_src_extension_support_argument_type__WEBPACK_IMPORTED_MODULE_0___default.a.BOOLEAN:
|
||
args.push({
|
||
type: 'input_value',
|
||
name: argName,
|
||
check: 'Boolean'
|
||
});
|
||
break;
|
||
}
|
||
|
||
return "%".concat(++argCount);
|
||
});
|
||
this.interpolate_(scratchBlocksStyleText, args);
|
||
}
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (defineDynamicBlock);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/detect-locale.js":
|
||
/*!**********************************!*\
|
||
!*** ./src/lib/detect-locale.js ***!
|
||
\**********************************/
|
||
/*! exports provided: LANGUAGE_KEY, detectLocale */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LANGUAGE_KEY", function() { return LANGUAGE_KEY; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "detectLocale", function() { return detectLocale; });
|
||
/* harmony import */ var query_string__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! query-string */ "./node_modules/query-string/index.js");
|
||
/* harmony import */ var query_string__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(query_string__WEBPACK_IMPORTED_MODULE_0__);
|
||
/**
|
||
* @fileoverview
|
||
* Utility function to detect locale from the browser setting or paramenter on the URL.
|
||
*/
|
||
// tw: read language from localStorage
|
||
|
||
const LANGUAGE_KEY = 'tw:language';
|
||
/**
|
||
* look for language setting in the browser. Check against supported locales.
|
||
* If there's a parameter in the URL, override the browser setting
|
||
* @param {Array.string} supportedLocales An array of supported locale codes.
|
||
* @return {string} the preferred locale
|
||
*/
|
||
|
||
const detectLocale = supportedLocales => {
|
||
// tw: read language from localStorage
|
||
try {
|
||
const storedLanguage = localStorage.getItem(LANGUAGE_KEY);
|
||
|
||
if (storedLanguage && supportedLocales.includes(storedLanguage)) {
|
||
return storedLanguage;
|
||
}
|
||
} catch (e) {
|
||
/* ignore */
|
||
}
|
||
|
||
let locale = 'en'; // default
|
||
|
||
let browserLocale = window.navigator.userLanguage || window.navigator.language;
|
||
browserLocale = browserLocale.toLowerCase(); // try to set locale from browserLocale
|
||
|
||
if (supportedLocales.includes(browserLocale)) {
|
||
locale = browserLocale;
|
||
} else {
|
||
browserLocale = browserLocale.split('-')[0];
|
||
|
||
if (supportedLocales.includes(browserLocale)) {
|
||
locale = browserLocale;
|
||
}
|
||
}
|
||
|
||
const queryParams = query_string__WEBPACK_IMPORTED_MODULE_0___default.a.parse(location.search); // Flatten potential arrays and remove falsy values
|
||
|
||
const potentialLocales = [].concat(queryParams.locale, queryParams.lang).filter(l => l);
|
||
|
||
if (!potentialLocales.length) {
|
||
return locale;
|
||
}
|
||
|
||
const urlLocale = potentialLocales[0].toLowerCase();
|
||
|
||
if (supportedLocales.includes(urlLocale)) {
|
||
return urlLocale;
|
||
}
|
||
|
||
return locale;
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/download-blob.js":
|
||
/*!**********************************!*\
|
||
!*** ./src/lib/download-blob.js ***!
|
||
\**********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony default export */ __webpack_exports__["default"] = ((filename, blob) => {
|
||
const downloadLink = document.createElement('a');
|
||
document.body.appendChild(downloadLink); // Use special ms version if available to get it working on Edge.
|
||
|
||
if (navigator.msSaveOrOpenBlob) {
|
||
navigator.msSaveOrOpenBlob(blob, filename);
|
||
return;
|
||
}
|
||
|
||
if ('download' in HTMLAnchorElement.prototype) {
|
||
const url = window.URL.createObjectURL(blob);
|
||
downloadLink.href = url;
|
||
downloadLink.download = filename;
|
||
downloadLink.type = blob.type;
|
||
downloadLink.click(); // remove the link after a timeout to prevent a crash on iOS 13 Safari
|
||
|
||
window.setTimeout(() => {
|
||
document.body.removeChild(downloadLink);
|
||
window.URL.revokeObjectURL(url);
|
||
}, 1000);
|
||
} else {
|
||
// iOS 12 Safari, open a new page and set href to data-uri
|
||
let popup = window.open('', '_blank');
|
||
const reader = new FileReader();
|
||
|
||
reader.onloadend = function () {
|
||
popup.location.href = reader.result;
|
||
popup = null;
|
||
};
|
||
|
||
reader.readAsDataURL(blob);
|
||
}
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/drag-constants.js":
|
||
/*!***********************************!*\
|
||
!*** ./src/lib/drag-constants.js ***!
|
||
\***********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony default export */ __webpack_exports__["default"] = ({
|
||
SOUND: 'SOUND',
|
||
COSTUME: 'COSTUME',
|
||
SPRITE: 'SPRITE',
|
||
CODE: 'CODE',
|
||
BACKPACK_SOUND: 'BACKPACK_SOUND',
|
||
BACKPACK_COSTUME: 'BACKPACK_COSTUME',
|
||
BACKPACK_SPRITE: 'BACKPACK_SPRITE',
|
||
BACKPACK_CODE: 'BACKPACK_CODE'
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/drag-recognizer.js":
|
||
/*!************************************!*\
|
||
!*** ./src/lib/drag-recognizer.js ***!
|
||
\************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _lib_touch_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/touch-utils */ "./src/lib/touch-utils.js");
|
||
|
||
|
||
|
||
class DragRecognizer {
|
||
/* Gesture states */
|
||
static get STATE_UNIDENTIFIED() {
|
||
return 'unidentified';
|
||
}
|
||
|
||
static get STATE_SCROLL() {
|
||
return 'scroll';
|
||
}
|
||
|
||
static get STATE_DRAG() {
|
||
return 'drag';
|
||
}
|
||
|
||
constructor({
|
||
onDrag = () => {},
|
||
onDragEnd = () => {},
|
||
touchDragAngle = 70,
|
||
// Angle and distance thresholds are the same as scratch-blocks
|
||
distanceThreshold = 3
|
||
}) {
|
||
this._onDrag = onDrag;
|
||
this._onDragEnd = onDragEnd;
|
||
this._touchDragAngle = touchDragAngle;
|
||
this._distanceThreshold = distanceThreshold;
|
||
this._initialOffset = null;
|
||
this._gestureState = DragRecognizer.STATE_UNIDENTIFIED;
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['start', 'gestureInProgress', 'reset', '_handleMove', '_handleEnd']);
|
||
}
|
||
|
||
start(event) {
|
||
if (typeof event.button === 'number' && event.button !== 0) {
|
||
return;
|
||
}
|
||
|
||
this._initialOffset = Object(_lib_touch_utils__WEBPACK_IMPORTED_MODULE_1__["getEventXY"])(event);
|
||
|
||
this._bindListeners();
|
||
}
|
||
|
||
gestureInProgress() {
|
||
return this._gestureState !== DragRecognizer.STATE_UNIDENTIFIED;
|
||
}
|
||
|
||
reset() {
|
||
this._unbindListeners();
|
||
|
||
this._initialOffset = null;
|
||
this._gestureState = DragRecognizer.STATE_UNIDENTIFIED;
|
||
} //
|
||
// Internal functions
|
||
//
|
||
|
||
|
||
_bindListeners() {
|
||
window.addEventListener('mouseup', this._handleEnd);
|
||
window.addEventListener('mousemove', this._handleMove);
|
||
window.addEventListener('touchend', this._handleEnd); // touchmove must be marked as non-passive, or else it cannot prevent scrolling
|
||
|
||
window.addEventListener('touchmove', this._handleMove, {
|
||
passive: false
|
||
});
|
||
}
|
||
|
||
_unbindListeners() {
|
||
window.removeEventListener('mouseup', this._handleEnd);
|
||
window.removeEventListener('mousemove', this._handleMove);
|
||
window.removeEventListener('touchend', this._handleEnd);
|
||
window.removeEventListener('touchmove', this._handleMove, {
|
||
passive: false
|
||
});
|
||
}
|
||
|
||
_handleMove(event) {
|
||
// For gestures identified as vertical scrolls, do not process movement events
|
||
if (this._isScroll()) return;
|
||
const currentOffset = Object(_lib_touch_utils__WEBPACK_IMPORTED_MODULE_1__["getEventXY"])(event); // Try to identify this gesture if it hasn't been identified already
|
||
|
||
if (!this.gestureInProgress()) {
|
||
const dx = currentOffset.x - this._initialOffset.x;
|
||
const dy = currentOffset.y - this._initialOffset.y;
|
||
const dragDistance = Math.sqrt(dx * dx + dy * dy);
|
||
if (dragDistance < this._distanceThreshold) return; // For touch moves, additionally check if the angle suggests drag vs. scroll
|
||
|
||
if (event.type === 'touchmove') {
|
||
// Direction goes from -180 to 180, with 0 toward the right.
|
||
let angle = Math.atan2(dy, dx) / Math.PI * 180; // Fold over horizontal axis, range now 0 to 180
|
||
|
||
angle = Math.abs(angle); // Fold over vertical axis, range now 0 to 90
|
||
|
||
if (angle > 90) angle = 180 - angle;
|
||
|
||
if (angle > this._touchDragAngle) {
|
||
this._gestureState = DragRecognizer.STATE_SCROLL;
|
||
} else {
|
||
this._gestureState = DragRecognizer.STATE_DRAG;
|
||
}
|
||
} else {
|
||
// Mouse moves are always considered drags
|
||
this._gestureState = DragRecognizer.STATE_DRAG;
|
||
}
|
||
}
|
||
|
||
if (this._isDrag()) {
|
||
this._onDrag(currentOffset, this._initialOffset);
|
||
|
||
event.preventDefault();
|
||
}
|
||
}
|
||
|
||
_handleEnd() {
|
||
this.reset(); // Call the callback after reset to make sure if gestureInProgress()
|
||
// is used in response, it get the correct value (i.e. no gesture in progress)
|
||
|
||
this._onDragEnd();
|
||
}
|
||
|
||
_isDrag() {
|
||
return this._gestureState === DragRecognizer.STATE_DRAG;
|
||
}
|
||
|
||
_isScroll() {
|
||
return this._gestureState === DragRecognizer.STATE_SCROLL;
|
||
}
|
||
|
||
}
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (DragRecognizer);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/drag-utils.js":
|
||
/*!*******************************!*\
|
||
!*** ./src/lib/drag-utils.js ***!
|
||
\*******************************/
|
||
/*! exports provided: indexForPositionOnList */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "indexForPositionOnList", function() { return indexForPositionOnList; });
|
||
/**
|
||
* @fileoverview
|
||
* Utility functions for drag interactions, e.g. sorting items in a grid/list.
|
||
*/
|
||
|
||
/**
|
||
* From an xy position and a list of boxes {top, left, bottom, right}, return there
|
||
* corresponding box index the position is over. The boxes are in a (possibly wrapped)
|
||
* list, the only requirement being all boxes are flush against the edges, that is,
|
||
* if they are along an outer edge, the position of that edge is identical.
|
||
* This functionality works for a single column of items, a wrapped list with
|
||
* many rows, or a single row of items.
|
||
* @param {{x: number, y: number}} position The xy coordinates to retreive the corresponding index of.
|
||
* @param {Array.<DOMRect>} boxes The rects of the items, returned from `getBoundingClientRect`
|
||
* @param {bool} isRtl are the boxes in RTL order.
|
||
* @return {?number} index of the corresponding box, or null if one could not be found.
|
||
*/
|
||
const indexForPositionOnList = ({
|
||
x,
|
||
y
|
||
}, boxes, isRtl) => {
|
||
if (boxes.length === 0) return null;
|
||
let index = null;
|
||
const leftEdge = Math.min.apply(null, boxes.map(b => b.left));
|
||
const rightEdge = Math.max.apply(null, boxes.map(b => b.right));
|
||
const topEdge = Math.min.apply(null, boxes.map(b => b.top));
|
||
const bottomEdge = Math.max.apply(null, boxes.map(b => b.bottom));
|
||
|
||
for (let n = 0; n < boxes.length; n++) {
|
||
const box = boxes[n]; // Construct an "extended" box for each, extending out to infinity if
|
||
// the box is along a boundary.
|
||
|
||
let minX = box.left === leftEdge ? -Infinity : box.left;
|
||
let maxX = box.right === rightEdge ? Infinity : box.right;
|
||
const minY = box.top === topEdge ? -Infinity : box.top;
|
||
const maxY = box.bottom === bottomEdge ? Infinity : box.bottom; // The last item in the wrapped list gets a right edge at infinity, even
|
||
// if it isn't the farthest right, in RTL mode. In LTR mode, it gets a
|
||
// left edge at infinity.
|
||
|
||
if (n === boxes.length - 1) {
|
||
if (isRtl) {
|
||
minX = -Infinity;
|
||
} else {
|
||
maxX = Infinity;
|
||
}
|
||
} // Check if the point is in the bounds.
|
||
|
||
|
||
if (x >= minX && x <= maxX && y >= minY && y <= maxY) {
|
||
index = n;
|
||
break; // No need to keep looking.
|
||
}
|
||
}
|
||
|
||
return index;
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/drop-area-hoc.jsx":
|
||
/*!***********************************!*\
|
||
!*** ./src/lib/drop-area-hoc.jsx ***!
|
||
\***********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash.omit */ "./node_modules/lodash.omit/index.js");
|
||
/* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_omit__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/**
|
||
* Higher Order Component to give components the ability to react to drag overs
|
||
* and drops of objects stored in the assetDrag redux state.
|
||
*
|
||
* Example: You want to enable MyComponent to receive drops from a drag type
|
||
* Wrapped = DropAreaHOC([...dragTypes])(
|
||
* <MyComponent />
|
||
* )
|
||
*
|
||
* MyComponent now receives 2 new props
|
||
* containerRef: a ref that must be set on the container element
|
||
* dragOver: boolean if an asset is being dragged above the component
|
||
*
|
||
* Use the wrapped component:
|
||
* <Wrapped onDrop={yourDropHandler} />
|
||
*
|
||
* NB: This HOC _only_ works with objects that drag using the assetDrag reducer.
|
||
* This _does not_ handle drags for blocks coming from the workspace.
|
||
*
|
||
* @param {Array.<string>} dragTypes Types to respond to, from DragConstants
|
||
* @returns {function} The HOC, specialized for those drag types
|
||
*/
|
||
|
||
const DropAreaHOC = function DropAreaHOC(dragTypes) {
|
||
/**
|
||
* Return the HOC, specialized for the dragTypes
|
||
* @param {React.Component} WrappedComponent component to receive drop behaviors
|
||
* @returns {React.Component} component with drag over/drop behavior
|
||
*/
|
||
return function (WrappedComponent) {
|
||
class DropAreaWrapper extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['setRef']);
|
||
this.state = {
|
||
dragOver: false
|
||
};
|
||
this.ref = null;
|
||
this.containerBox = null;
|
||
}
|
||
|
||
componentWillReceiveProps(newProps) {
|
||
// If `dragging` becomes true, record the drop area rectangle
|
||
if (newProps.dragInfo.dragging && !this.props.dragInfo.dragging) {
|
||
this.dropAreaRect = this.ref && this.ref.getBoundingClientRect(); // If `dragging` becomes false, call the drop handler
|
||
} else if (!newProps.dragInfo.dragging && this.props.dragInfo.dragging && this.state.dragOver) {
|
||
this.props.onDrop(this.props.dragInfo);
|
||
this.setState({
|
||
dragOver: false
|
||
});
|
||
} // If a drag is in progress (currentOffset) and it matches the relevant drag types,
|
||
// test if the drag is within the drop area rect and set the state accordingly.
|
||
|
||
|
||
if (this.dropAreaRect && newProps.dragInfo.currentOffset && dragTypes.includes(newProps.dragInfo.dragType)) {
|
||
const {
|
||
x,
|
||
y
|
||
} = newProps.dragInfo.currentOffset;
|
||
const {
|
||
top,
|
||
right,
|
||
bottom,
|
||
left
|
||
} = this.dropAreaRect;
|
||
|
||
if (x > left && x < right && y > top && y < bottom) {
|
||
this.setState({
|
||
dragOver: true
|
||
});
|
||
} else {
|
||
this.setState({
|
||
dragOver: false
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
setRef(el) {
|
||
this.ref = el;
|
||
|
||
if (this.props.componentRef) {
|
||
this.props.componentRef(this.ref);
|
||
}
|
||
}
|
||
|
||
render() {
|
||
const componentProps = lodash_omit__WEBPACK_IMPORTED_MODULE_3___default()(this.props, ['onDrop', 'dragInfo', 'componentRef']);
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(WrappedComponent, _extends({
|
||
containerRef: this.setRef,
|
||
dragOver: this.state.dragOver
|
||
}, componentProps));
|
||
}
|
||
|
||
}
|
||
|
||
DropAreaWrapper.propTypes = {
|
||
componentRef: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
dragInfo: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
currentOffset: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
x: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
y: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
}),
|
||
dragType: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
dragging: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
index: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
}),
|
||
onDrop: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
dragInfo: state.scratchGui.assetDrag
|
||
});
|
||
|
||
const mapDispatchToProps = () => ({});
|
||
|
||
return Object(react_redux__WEBPACK_IMPORTED_MODULE_4__["connect"])(mapStateToProps, mapDispatchToProps)(DropAreaWrapper);
|
||
};
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (DropAreaHOC);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/empty-assets.js":
|
||
/*!*********************************!*\
|
||
!*** ./src/lib/empty-assets.js ***!
|
||
\*********************************/
|
||
/*! exports provided: emptyCostume, emptySprite */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "emptyCostume", function() { return emptyCostume; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "emptySprite", function() { return emptySprite; });
|
||
/**
|
||
* @fileoverview
|
||
* Utility functions to return json corresponding to default empty assets.
|
||
*/
|
||
|
||
/**
|
||
* Generate a blank costume object for vm.addCostume with the provided name.
|
||
* @param {string} name the name to use for the costume, caller should localize
|
||
* @return {object} vm costume object
|
||
*/
|
||
const emptyCostume = name => ({
|
||
name: name,
|
||
md5: 'cd21514d0531fdffb22204e0ec5ed84a.svg',
|
||
rotationCenterX: 0,
|
||
rotationCenterY: 0,
|
||
bitmapResolution: 1,
|
||
skinId: null
|
||
});
|
||
/**
|
||
* Generate a new empty sprite. The caller should provide localized versions of the
|
||
* default names.
|
||
* @param {string} name the name to use for the sprite
|
||
* @param {string} soundName the name to use for the default sound
|
||
* @param {string} costumeName the name to use for the default costume
|
||
* @return {object} object expected by vm.addSprite
|
||
*/
|
||
|
||
|
||
const emptySprite = (name, soundName, costumeName) => ({
|
||
objName: name,
|
||
sounds: [],
|
||
costumes: [{
|
||
costumeName: costumeName,
|
||
baseLayerID: -1,
|
||
baseLayerMD5: 'cd21514d0531fdffb22204e0ec5ed84a.svg',
|
||
bitmapResolution: 1,
|
||
rotationCenterX: 0,
|
||
rotationCenterY: 0
|
||
}],
|
||
currentCostumeIndex: 0,
|
||
scratchX: 36,
|
||
scratchY: 28,
|
||
scale: 1,
|
||
direction: 90,
|
||
rotationStyle: 'normal',
|
||
isDraggable: false,
|
||
visible: true,
|
||
spriteInfo: {}
|
||
});
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/error-boundary-hoc.jsx":
|
||
/*!****************************************!*\
|
||
!*** ./src/lib/error-boundary-hoc.jsx ***!
|
||
\****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _containers_error_boundary_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../containers/error-boundary.jsx */ "./src/containers/error-boundary.jsx");
|
||
|
||
|
||
/*
|
||
* Higher Order Component to provide error boundary for wrapped component.
|
||
* A curried function, call like errorHOC(<tracking label>)(<Component>).
|
||
* @param {string} action - Label for GA tracking of errors.
|
||
* @returns {function} a function that accepts a component to wrap.
|
||
*/
|
||
|
||
const ErrorBoundaryHOC = function ErrorBoundaryHOC(action) {
|
||
/**
|
||
* The function to be called with a React component to wrap it.
|
||
* @param {React.Component} WrappedComponent - Component to wrap with an error boundary.
|
||
* @returns {React.Component} the component wrapped with an error boundary.
|
||
*/
|
||
return function (WrappedComponent) {
|
||
const ErrorBoundaryWrapper = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_containers_error_boundary_jsx__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
||
action: action
|
||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(WrappedComponent, props));
|
||
|
||
return ErrorBoundaryWrapper;
|
||
};
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (ErrorBoundaryHOC);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/file-uploader.js":
|
||
/*!**********************************!*\
|
||
!*** ./src/lib/file-uploader.js ***!
|
||
\**********************************/
|
||
/*! exports provided: handleFileUpload, costumeUpload, soundUpload, spriteUpload */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "handleFileUpload", function() { return handleFileUpload; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "costumeUpload", function() { return costumeUpload; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "soundUpload", function() { return soundUpload; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spriteUpload", function() { return spriteUpload; });
|
||
/* harmony import */ var scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! scratch-svg-renderer */ "./node_modules/scratch-svg-renderer/src/index.js");
|
||
/* harmony import */ var scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _randomize_sprite_position_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./randomize-sprite-position.js */ "./src/lib/randomize-sprite-position.js");
|
||
/* harmony import */ var _bmp_converter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./bmp-converter */ "./src/lib/bmp-converter.js");
|
||
/* harmony import */ var _gif_decoder__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./gif-decoder */ "./src/lib/gif-decoder.js");
|
||
/* harmony import */ var _tw_svg_fixer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tw-svg-fixer */ "./src/lib/tw-svg-fixer.js");
|
||
/* harmony import */ var _tw_convert_audio_wav_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tw-convert-audio-wav.js */ "./src/lib/tw-convert-audio-wav.js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/**
|
||
* Extract the file name given a string of the form fileName + ext
|
||
* @param {string} nameExt File name + extension (e.g. 'my_image.png')
|
||
* @return {string} The name without the extension, or the full name if
|
||
* there was no '.' in the string (e.g. 'my_image')
|
||
*/
|
||
|
||
const extractFileName = function extractFileName(nameExt) {
|
||
// There could be multiple dots, but get the stuff before the first .
|
||
const nameParts = nameExt.split('.', 1); // we only care about the first .
|
||
|
||
return nameParts[0];
|
||
};
|
||
/**
|
||
* Handle a file upload given the input element that contains the file,
|
||
* and a function to handle loading the file.
|
||
* @param {Input} fileInput The <input/> element that contains the file being loaded
|
||
* @param {Function} onload The function that handles loading the file
|
||
* @param {Function} onerror The function that handles any error loading the file
|
||
*/
|
||
|
||
|
||
const handleFileUpload = function handleFileUpload(fileInput, onload, onerror) {
|
||
const readFile = (i, files) => {
|
||
if (i === files.length) {
|
||
// Reset the file input value now that we have everything we need
|
||
// so that the user can upload the same sound multiple times if
|
||
// they choose
|
||
fileInput.value = null;
|
||
return;
|
||
}
|
||
|
||
const file = files[i];
|
||
const reader = new FileReader();
|
||
|
||
reader.onload = () => {
|
||
const fileType = file.type;
|
||
const fileName = extractFileName(file.name);
|
||
onload(reader.result, fileType, fileName, i, files.length);
|
||
readFile(i + 1, files);
|
||
};
|
||
|
||
reader.onerror = onerror;
|
||
reader.readAsArrayBuffer(file);
|
||
};
|
||
|
||
readFile(0, fileInput.files);
|
||
};
|
||
/**
|
||
* @typedef VMAsset
|
||
* @property {string} name The user-readable name of this asset - This will
|
||
* automatically get translated to a fresh name if this one already exists in the
|
||
* scope of this vm asset (e.g. if a sound already exists with the same name for
|
||
* the same target)
|
||
* @property {string} dataFormat The data format of this asset, typically
|
||
* the extension to be used for that particular asset, e.g. 'svg' for vector images
|
||
* @property {string} md5 The md5 hash of the asset data, followed by '.'' and dataFormat
|
||
* @property {string} The md5 hash of the asset data // TODO remove duplication....
|
||
*/
|
||
|
||
/**
|
||
* Create an asset (costume, sound) with storage and return an object representation
|
||
* of the asset to track in the VM.
|
||
* @param {ScratchStorage} storage The storage to cache the asset in
|
||
* @param {AssetType} assetType A ScratchStorage AssetType indicating what kind of
|
||
* asset this is.
|
||
* @param {string} dataFormat The format of this data (typically the file extension)
|
||
* @param {UInt8Array} data The asset data buffer
|
||
* @return {VMAsset} An object representing this asset and relevant information
|
||
* which can be used to look up the data in storage
|
||
*/
|
||
|
||
|
||
const createVMAsset = function createVMAsset(storage, assetType, dataFormat, data) {
|
||
const asset = storage.createAsset(assetType, dataFormat, data, null, true // generate md5
|
||
);
|
||
return {
|
||
name: null,
|
||
// Needs to be set by caller
|
||
dataFormat: dataFormat,
|
||
asset: asset,
|
||
md5: "".concat(asset.assetId, ".").concat(dataFormat),
|
||
assetId: asset.assetId
|
||
};
|
||
};
|
||
/**
|
||
* Handles loading a costume or a backdrop using the provided, context-relevant information.
|
||
* @param {ArrayBuffer | string} fileData The costume data to load (this can be a base64 string
|
||
* iff the image is a bitmap)
|
||
* @param {string} fileType The MIME type of this file
|
||
* @param {VM} vm The ScratchStorage instance to cache the costume data
|
||
* @param {Function} handleCostume The function to execute on the costume object returned after
|
||
* caching this costume in storage - This function should be responsible for
|
||
* adding the costume to the VM and handling other UI flow that should come after adding the costume
|
||
* @param {Function} handleError The function to execute if there is an error parsing the costume
|
||
*/
|
||
|
||
|
||
const costumeUpload = function costumeUpload(fileData, fileType, vm, handleCostume, handleError = () => {}) {
|
||
const storage = vm.runtime.storage;
|
||
let costumeFormat = null;
|
||
let assetType = null;
|
||
|
||
switch (fileType) {
|
||
case 'image/svg+xml':
|
||
{
|
||
// run svg bytes through scratch-svg-renderer's sanitization code
|
||
fileData = scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_0__["sanitizeSvg"].sanitizeByteStream(fileData);
|
||
costumeFormat = storage.DataFormat.SVG;
|
||
assetType = storage.AssetType.ImageVector;
|
||
fileData = Object(_tw_svg_fixer__WEBPACK_IMPORTED_MODULE_4__["default"])(fileData);
|
||
break;
|
||
}
|
||
|
||
case 'image/jpeg':
|
||
{
|
||
costumeFormat = storage.DataFormat.JPG;
|
||
assetType = storage.AssetType.ImageBitmap;
|
||
break;
|
||
}
|
||
|
||
case 'image/bmp':
|
||
{
|
||
// Convert .bmp files to .png to compress them. .bmps are completely uncompressed,
|
||
// and would otherwise take up a lot of storage space and take much longer to upload and download.
|
||
Object(_bmp_converter__WEBPACK_IMPORTED_MODULE_2__["default"])(fileData).then(dataUrl => {
|
||
costumeUpload(dataUrl, 'image/png', vm, handleCostume);
|
||
});
|
||
return; // Return early because we're triggering another proper costumeUpload
|
||
}
|
||
|
||
case 'image/png':
|
||
{
|
||
costumeFormat = storage.DataFormat.PNG;
|
||
assetType = storage.AssetType.ImageBitmap;
|
||
break;
|
||
}
|
||
|
||
case 'image/webp':
|
||
{
|
||
// Scratch does not natively support webp, so convert to png
|
||
// see image/bmp logic above
|
||
Object(_bmp_converter__WEBPACK_IMPORTED_MODULE_2__["default"])(fileData, 'image/webp').then(dataUrl => {
|
||
costumeUpload(dataUrl, 'image/png', vm, handleCostume);
|
||
});
|
||
return;
|
||
}
|
||
|
||
case 'image/gif':
|
||
{
|
||
let costumes = [];
|
||
Object(_gif_decoder__WEBPACK_IMPORTED_MODULE_3__["default"])(fileData, (frameNumber, dataUrl, numFrames) => {
|
||
costumeUpload(dataUrl, 'image/png', vm, costumes_ => {
|
||
costumes = costumes.concat(costumes_);
|
||
|
||
if (frameNumber === numFrames - 1) {
|
||
handleCostume(costumes);
|
||
}
|
||
}, handleError);
|
||
});
|
||
return; // Abandon this load, do not try to load gif itself
|
||
}
|
||
|
||
default:
|
||
handleError("Encountered unexpected file type: ".concat(fileType));
|
||
return;
|
||
}
|
||
|
||
const bitmapAdapter = new scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_0__["BitmapAdapter"]();
|
||
|
||
if (bitmapAdapter.setStageSize) {
|
||
const width = vm.runtime.stageWidth;
|
||
const height = vm.runtime.stageHeight;
|
||
bitmapAdapter.setStageSize(width, height);
|
||
}
|
||
|
||
const addCostumeFromBuffer = function addCostumeFromBuffer(dataBuffer) {
|
||
const vmCostume = createVMAsset(storage, assetType, costumeFormat, dataBuffer);
|
||
handleCostume([vmCostume]);
|
||
};
|
||
|
||
if (costumeFormat === storage.DataFormat.SVG) {
|
||
// Must pass in file data as a Uint8Array,
|
||
// passing in an array buffer causes the sprite/costume
|
||
// thumbnails to not display because the data URI for the costume
|
||
// is invalid
|
||
addCostumeFromBuffer(new Uint8Array(fileData));
|
||
} else {
|
||
// otherwise it's a bitmap
|
||
bitmapAdapter.importBitmap(fileData, fileType).then(addCostumeFromBuffer).catch(handleError);
|
||
}
|
||
};
|
||
/**
|
||
* Handles loading a sound using the provided, context-relevant information.
|
||
* @param {ArrayBuffer} fileData The sound data to load
|
||
* @param {string} fileType The MIME type of this file; This function will exit
|
||
* early if the fileType is unexpected.
|
||
* @param {ScratchStorage} storage The ScratchStorage instance to cache the sound data
|
||
* @param {Function} handleSound The function to execute on the sound object of type VMAsset
|
||
* This function should be responsible for adding the sound to the VM
|
||
* as well as handling other UI flow that should come after adding the sound
|
||
* @param {Function} handleError The function to execute if there is an error parsing the sound
|
||
*/
|
||
|
||
|
||
const soundUpload = function soundUpload(fileData, fileType, storage, handleSound, handleError) {
|
||
let soundFormat;
|
||
|
||
switch (fileType) {
|
||
case 'audio/mp3':
|
||
case 'audio/mpeg':
|
||
{
|
||
soundFormat = storage.DataFormat.MP3;
|
||
break;
|
||
}
|
||
|
||
case 'audio/wav':
|
||
case 'audio/wave':
|
||
case 'audio/x-wav':
|
||
case 'audio/x-pn-wav':
|
||
{
|
||
soundFormat = storage.DataFormat.WAV;
|
||
break;
|
||
}
|
||
|
||
default:
|
||
Object(_tw_convert_audio_wav_js__WEBPACK_IMPORTED_MODULE_5__["default"])(fileData).then(fixed => {
|
||
soundUpload(fixed, 'audio/wav', storage, handleSound, handleError);
|
||
}).catch(handleError);
|
||
return;
|
||
}
|
||
|
||
const vmSound = createVMAsset(storage, storage.AssetType.Sound, soundFormat, new Uint8Array(fileData));
|
||
handleSound(vmSound);
|
||
};
|
||
|
||
const spriteUpload = function spriteUpload(fileData, fileType, spriteName, vm, handleSprite, handleError = () => {}) {
|
||
switch (fileType) {
|
||
case '':
|
||
case 'application/zip':
|
||
{
|
||
// We think this is a .sprite2 or .sprite3 file
|
||
handleSprite(new Uint8Array(fileData));
|
||
return;
|
||
}
|
||
|
||
case 'image/svg+xml':
|
||
case 'image/png':
|
||
case 'image/bmp':
|
||
case 'image/jpeg':
|
||
case 'image/webp':
|
||
case 'image/gif':
|
||
{
|
||
// Make a sprite from an image by making it a costume first
|
||
costumeUpload(fileData, fileType, vm, vmCostumes => {
|
||
vmCostumes.forEach((costume, i) => {
|
||
costume.name = "".concat(spriteName).concat(i ? i + 1 : '');
|
||
});
|
||
const newSprite = {
|
||
name: spriteName,
|
||
isStage: false,
|
||
x: 0,
|
||
// x/y will be randomized below
|
||
y: 0,
|
||
visible: true,
|
||
size: 100,
|
||
rotationStyle: 'all around',
|
||
direction: 90,
|
||
draggable: false,
|
||
currentCostume: 0,
|
||
blocks: {},
|
||
variables: {},
|
||
costumes: vmCostumes,
|
||
sounds: [] // TODO are all of these necessary?
|
||
|
||
};
|
||
Object(_randomize_sprite_position_js__WEBPACK_IMPORTED_MODULE_1__["default"])(newSprite); // TODO probably just want sprite upload to handle this object directly
|
||
|
||
handleSprite(JSON.stringify(newSprite));
|
||
}, handleError);
|
||
return;
|
||
}
|
||
|
||
default:
|
||
{
|
||
handleError("Encountered unexpected file type: ".concat(fileType));
|
||
return;
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/font-loader-hoc.jsx":
|
||
/*!*************************************!*\
|
||
!*** ./src/lib/font-loader-hoc.jsx ***!
|
||
\*************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FontLoaderHOC; });
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.omit */ "./node_modules/lodash.omit/index.js");
|
||
/* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_omit__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_fonts_loaded__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../reducers/fonts-loaded */ "./src/reducers/fonts-loaded.js");
|
||
/* harmony import */ var scratch_render_fonts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! scratch-render-fonts */ "./src/lib/tw-scratch-render-fonts/index.js");
|
||
/* harmony import */ var scratch_render_fonts__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(scratch_render_fonts__WEBPACK_IMPORTED_MODULE_5__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/* Higher Order Component to provide behavior for loading fonts.
|
||
* @param {React.Component} WrappedComponent component to receive fontsLoaded prop
|
||
* @returns {React.Component} component with font loading behavior
|
||
*/
|
||
|
||
const FontLoaderHOC = function FontLoaderHOC(WrappedComponent) {
|
||
class FontLoaderComponent extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
componentDidMount() {
|
||
if (this.props.fontsLoaded) return;
|
||
Object(scratch_render_fonts__WEBPACK_IMPORTED_MODULE_5__["loadFonts"])().then(() => this.props.onSetFontsLoaded());
|
||
}
|
||
|
||
render() {
|
||
const componentProps = lodash_omit__WEBPACK_IMPORTED_MODULE_2___default()(this.props, ['onSetFontsLoaded']);
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(WrappedComponent, componentProps);
|
||
}
|
||
|
||
}
|
||
|
||
FontLoaderComponent.propTypes = {
|
||
fontsLoaded: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,
|
||
onSetFontsLoaded: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
fontsLoaded: state.scratchGui.fontsLoaded
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onSetFontsLoaded: () => dispatch(Object(_reducers_fonts_loaded__WEBPACK_IMPORTED_MODULE_4__["setFontsLoaded"])())
|
||
});
|
||
|
||
return Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(FontLoaderComponent);
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/get-costume-url.js":
|
||
/*!************************************!*\
|
||
!*** ./src/lib/get-costume-url.js ***!
|
||
\************************************/
|
||
/*! exports provided: default, HAS_FONT_REGEXP */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getCostumeUrl; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HAS_FONT_REGEXP", function() { return HAS_FONT_REGEXP; });
|
||
/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./storage */ "./src/lib/storage.js");
|
||
/* harmony import */ var scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! scratch-svg-renderer */ "./node_modules/scratch-svg-renderer/src/index.js");
|
||
/* harmony import */ var scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_1__);
|
||
|
||
// Contains 'font-family', but doesn't only contain 'font-family="none"'
|
||
|
||
const HAS_FONT_REGEXP = 'font-family(?!="none")';
|
||
|
||
const getCostumeUrl = function () {
|
||
let cachedAssetId;
|
||
let cachedUrl;
|
||
return function (asset) {
|
||
if (cachedAssetId === asset.assetId) {
|
||
return cachedUrl;
|
||
}
|
||
|
||
cachedAssetId = asset.assetId; // If the SVG refers to fonts, they must be inlined in order to display correctly in the img tag.
|
||
// Avoid parsing the SVG when possible, since it's expensive.
|
||
|
||
if (asset.assetType === _storage__WEBPACK_IMPORTED_MODULE_0__["default"].AssetType.ImageVector) {
|
||
const svgString = asset.decodeText();
|
||
|
||
if (svgString.match(HAS_FONT_REGEXP)) {
|
||
const svgText = Object(scratch_svg_renderer__WEBPACK_IMPORTED_MODULE_1__["inlineSvgFonts"])(svgString);
|
||
cachedUrl = "data:image/svg+xml;utf8,".concat(encodeURIComponent(svgText));
|
||
} else {
|
||
cachedUrl = asset.encodeDataURI();
|
||
}
|
||
} else {
|
||
cachedUrl = asset.encodeDataURI();
|
||
}
|
||
|
||
return cachedUrl;
|
||
};
|
||
}();
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/gif-decoder.js":
|
||
/*!********************************!*\
|
||
!*** ./src/lib/gif-decoder.js ***!
|
||
\********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var omggif__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! omggif */ "./node_modules/omggif/omggif.js");
|
||
/* harmony import */ var omggif__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(omggif__WEBPACK_IMPORTED_MODULE_0__);
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = ((arrayBuffer, onFrame) => {
|
||
const canvas = document.createElement('canvas');
|
||
const ctx = canvas.getContext('2d');
|
||
const gifReader = new omggif__WEBPACK_IMPORTED_MODULE_0__["GifReader"](new Uint8Array(arrayBuffer));
|
||
const numFrames = gifReader.numFrames();
|
||
canvas.width = gifReader.width;
|
||
canvas.height = gifReader.height;
|
||
let imageData = ctx.createImageData(canvas.width, canvas.height);
|
||
let previousData = ctx.createImageData(canvas.width, canvas.height);
|
||
|
||
const loadFrame = i => {
|
||
const framePixels = [];
|
||
gifReader.decodeAndBlitFrameRGBA(i, framePixels);
|
||
const {
|
||
x,
|
||
y,
|
||
width,
|
||
height,
|
||
disposal
|
||
} = gifReader.frameInfo(i);
|
||
|
||
for (let row = 0; row < height; row++) {
|
||
for (let column = 0; column < width; column++) {
|
||
const indexOffset = 4 * (x + y * canvas.width);
|
||
const j = indexOffset + 4 * (column + row * canvas.width);
|
||
|
||
if (framePixels[j + 3]) {
|
||
imageData.data[j + 0] = framePixels[j + 0];
|
||
imageData.data[j + 1] = framePixels[j + 1];
|
||
imageData.data[j + 2] = framePixels[j + 2];
|
||
imageData.data[j + 3] = framePixels[j + 3];
|
||
}
|
||
}
|
||
}
|
||
|
||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||
ctx.putImageData(imageData, 0, 0);
|
||
const dataUrl = canvas.toDataURL();
|
||
|
||
switch (disposal) {
|
||
case 2:
|
||
// "Return to background", blank out the current frame
|
||
ctx.clearRect(x, y, width, height);
|
||
imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
||
break;
|
||
|
||
case 3:
|
||
// "Restore to previous", copy previous data to current
|
||
imageData = ctx.createImageData(canvas.width, canvas.height);
|
||
imageData.data.set(previousData.data);
|
||
break;
|
||
|
||
default:
|
||
// 0 and 1, as well as 4+ modes = do-not-dispose, so cache frame
|
||
previousData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
||
break;
|
||
}
|
||
|
||
onFrame(i, dataUrl, numFrames);
|
||
|
||
if (i < numFrames - 1) {
|
||
setTimeout(() => {
|
||
loadFrame(i + 1);
|
||
});
|
||
}
|
||
};
|
||
|
||
loadFrame(0);
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/import-csv.js":
|
||
/*!*******************************!*\
|
||
!*** ./src/lib/import-csv.js ***!
|
||
\*******************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var papaparse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! papaparse */ "./node_modules/papaparse/papaparse.min.js");
|
||
/* harmony import */ var papaparse__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(papaparse__WEBPACK_IMPORTED_MODULE_0__);
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (() => new Promise((resolve, reject) => {
|
||
const fileInput = document.createElement('input');
|
||
fileInput.setAttribute('type', 'file');
|
||
fileInput.setAttribute('accept', '.csv, .tsv, .txt'); // parser auto-detects delimiter
|
||
|
||
fileInput.onchange = e => {
|
||
const file = e.target.files[0];
|
||
const fr = new FileReader();
|
||
|
||
fr.onload = () => {
|
||
document.body.removeChild(fileInput);
|
||
const text = fr.result;
|
||
papaparse__WEBPACK_IMPORTED_MODULE_0___default.a.parse(text, {
|
||
header: false,
|
||
complete: results => {
|
||
resolve({
|
||
rows: results.data,
|
||
text
|
||
});
|
||
},
|
||
error: err => {
|
||
reject(err);
|
||
}
|
||
});
|
||
};
|
||
|
||
fr.onerror = () => {
|
||
document.body.removeChild(fileInput);
|
||
reject(new Error('Cannot read file'));
|
||
};
|
||
|
||
fr.readAsText(file);
|
||
};
|
||
|
||
document.body.appendChild(fileInput);
|
||
fileInput.click();
|
||
}));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/isScratchDesktop.js":
|
||
/*!*************************************!*\
|
||
!*** ./src/lib/isScratchDesktop.js ***!
|
||
\*************************************/
|
||
/*! exports provided: default, isScratchDesktop, notScratchDesktop, setIsScratchDesktop */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isScratchDesktop", function() { return isScratchDesktop; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "notScratchDesktop", function() { return notScratchDesktop; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setIsScratchDesktop", function() { return setIsScratchDesktop; });
|
||
/**
|
||
* Internal stored state. Not valid until after at least one call to `setIsScratchDesktop()`.
|
||
* @type {boolean}
|
||
*/
|
||
let _isScratchDesktop; // undefined = not ready yet
|
||
|
||
/**
|
||
* Tell the `isScratchDesktop()` whether or not the GUI is running under Scratch Desktop.
|
||
* @param {boolean} value - the new value which `isScratchDesktop()` should return in the future.
|
||
*/
|
||
|
||
|
||
const setIsScratchDesktop = function setIsScratchDesktop(value) {
|
||
_isScratchDesktop = value;
|
||
};
|
||
/**
|
||
* @returns {boolean} - true if it seems like the GUI is running under Scratch Desktop; false otherwise.
|
||
* If `setIsScratchDesktop()` has not yet been called, this can return `undefined`.
|
||
*/
|
||
|
||
|
||
const isScratchDesktop = function isScratchDesktop() {
|
||
return _isScratchDesktop;
|
||
};
|
||
/**
|
||
* @returns {boolean} - false if it seems like the GUI is running under Scratch Desktop; true otherwise.
|
||
*/
|
||
|
||
|
||
const notScratchDesktop = function notScratchDesktop() {
|
||
return !isScratchDesktop();
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (isScratchDesktop);
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/layout-constants.js":
|
||
/*!*************************************!*\
|
||
!*** ./src/lib/layout-constants.js ***!
|
||
\*************************************/
|
||
/*! exports provided: default, BLOCKS_DEFAULT_SCALE, STAGE_DISPLAY_SCALES, STAGE_DISPLAY_SIZES, STAGE_SIZE_MODES */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BLOCKS_DEFAULT_SCALE", function() { return BLOCKS_DEFAULT_SCALE; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "STAGE_DISPLAY_SCALES", function() { return STAGE_DISPLAY_SCALES; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "STAGE_DISPLAY_SIZES", function() { return STAGE_DISPLAY_SIZES; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "STAGE_SIZE_MODES", function() { return STAGE_SIZE_MODES; });
|
||
/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! keymirror */ "./node_modules/keymirror/index.js");
|
||
/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(keymirror__WEBPACK_IMPORTED_MODULE_0__);
|
||
|
||
/**
|
||
* Names for each state of the stage size toggle
|
||
* @enum {string}
|
||
*/
|
||
|
||
const STAGE_SIZE_MODES = keymirror__WEBPACK_IMPORTED_MODULE_0___default()({
|
||
/**
|
||
* The "large stage" button is pressed; the user would like a large stage.
|
||
*/
|
||
large: null,
|
||
|
||
/**
|
||
* The "small stage" button is pressed; the user would like a small stage.
|
||
*/
|
||
small: null
|
||
});
|
||
/**
|
||
* Names for each stage render size
|
||
* @enum {string}
|
||
*/
|
||
|
||
const STAGE_DISPLAY_SIZES = keymirror__WEBPACK_IMPORTED_MODULE_0___default()({
|
||
/**
|
||
* Large stage with wide browser
|
||
*/
|
||
large: null,
|
||
|
||
/**
|
||
* Large stage with narrow browser
|
||
*/
|
||
largeConstrained: null,
|
||
|
||
/**
|
||
* Small stage (ignores browser width)
|
||
*/
|
||
small: null
|
||
}); // zoom level to start with
|
||
|
||
const BLOCKS_DEFAULT_SCALE = 0.675;
|
||
const STAGE_DISPLAY_SCALES = {};
|
||
STAGE_DISPLAY_SCALES[STAGE_DISPLAY_SIZES.large] = 1; // large mode, wide browser (standard)
|
||
|
||
STAGE_DISPLAY_SCALES[STAGE_DISPLAY_SIZES.largeConstrained] = 0.85; // large mode but narrow browser
|
||
|
||
STAGE_DISPLAY_SCALES[STAGE_DISPLAY_SIZES.small] = 0.5; // small mode, regardless of browser size
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = ({
|
||
fullSizeMinWidth: 1096,
|
||
referenceWidth: 480
|
||
});
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/backdrop-tags.js":
|
||
/*!********************************************!*\
|
||
!*** ./src/lib/libraries/backdrop-tags.js ***!
|
||
\********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tag-messages.js */ "./src/lib/libraries/tag-messages.js");
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = ([{
|
||
tag: 'fantasy',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].fantasy
|
||
}, {
|
||
tag: 'music',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].music
|
||
}, {
|
||
tag: 'sports',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].sports
|
||
}, {
|
||
tag: 'outdoors',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].outdoors
|
||
}, {
|
||
tag: 'indoors',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].indoors
|
||
}, {
|
||
tag: 'space',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].space
|
||
}, {
|
||
tag: 'underwater',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].underwater
|
||
}, {
|
||
tag: 'patterns',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].patterns
|
||
}]);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/decks/index.jsx":
|
||
/*!*******************************************!*\
|
||
!*** ./src/lib/libraries/decks/index.jsx ***!
|
||
\*******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony default export */ __webpack_exports__["default"] = ({// tw: remove decks. we don't use them.
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/decks/translate-image.js":
|
||
/*!****************************************************!*\
|
||
!*** ./src/lib/libraries/decks/translate-image.js ***!
|
||
\****************************************************/
|
||
/*! exports provided: loadImageData, translateImage */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadImageData", function() { return loadImageData; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "translateImage", function() { return translateImage; });
|
||
/**
|
||
* @fileoverview
|
||
* Utility functions for handling tutorial images in multiple languages
|
||
*/
|
||
const defaultImages = {};
|
||
let savedImages = {};
|
||
let savedLocale = '';
|
||
const translations = {};
|
||
|
||
const loadImageData = locale => {
|
||
if (translations.hasOwnProperty(locale)) {
|
||
translations[locale]().then(newImages => {
|
||
savedImages = newImages;
|
||
savedLocale = locale;
|
||
});
|
||
}
|
||
};
|
||
/**
|
||
* Return image data for tutorials based on locale (default: en)
|
||
* @param {string} imageId key in the images object, or id string.
|
||
* @param {string} locale requested locale
|
||
* @return {string} image
|
||
*/
|
||
|
||
|
||
const translateImage = (imageId, locale) => {
|
||
if (locale !== savedLocale || !savedImages.hasOwnProperty(imageId)) {
|
||
return defaultImages[imageId];
|
||
}
|
||
|
||
return savedImages[imageId];
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/decks/translate-video.js":
|
||
/*!****************************************************!*\
|
||
!*** ./src/lib/libraries/decks/translate-video.js ***!
|
||
\****************************************************/
|
||
/*! exports provided: translateVideo */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "translateVideo", function() { return translateVideo; });
|
||
/**
|
||
* @fileoverview
|
||
* Utility function to look up whether a translated video exists for a locale.
|
||
*/
|
||
// TODO: ja-Hira are copies of ja, replace with real ja-Hira when available.
|
||
const videos = {// tw: we don't use the videos, remove them
|
||
};
|
||
/**
|
||
* Return a video identifier (on our video hosting service)
|
||
* @param {string} videoId key in the videos object, or id string.
|
||
* @param {string} locale locale to look up. If locale is not defined return the id for 'en' by default
|
||
* @return {string} identifier for the video on our video hosting service.
|
||
*/
|
||
|
||
const translateVideo = (videoId, locale) => {
|
||
// if the videoId is not recognized in the videos object, assume it's already a video id on wistia
|
||
if (!videos.hasOwnProperty(videoId)) return videoId;
|
||
|
||
if (videos[videoId].hasOwnProperty(locale)) {
|
||
return videos[videoId][locale];
|
||
}
|
||
|
||
return videos[videoId].en;
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/boost/boost-button-illustration.svg":
|
||
/*!**************************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/boost/boost-button-illustration.svg ***!
|
||
\**************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/d92e74438d72c2223692825df66e026e.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/boost/boost-illustration.svg":
|
||
/*!*******************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/boost/boost-illustration.svg ***!
|
||
\*******************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/73773f78bf2bfc449218fbaee1922964.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/boost/boost-small.svg":
|
||
/*!************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/boost/boost-small.svg ***!
|
||
\************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/3d9e2585d6ed12b9fb994438e0c4c42a.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/boost/boost.png":
|
||
/*!******************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/boost/boost.png ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/43f8dc8949ea47e4c49bf228e351f99b.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/custom/custom.svg":
|
||
/*!********************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/custom/custom.svg ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/f2adf12644f88d04104fb8c18fdc355c.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/custom/return.svg":
|
||
/*!********************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/custom/return.svg ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/d8aa8f7a1fbfb47233c1d90287ee5982.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/ev3/ev3-hub-illustration.svg":
|
||
/*!*******************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/ev3/ev3-hub-illustration.svg ***!
|
||
\*******************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/8e5e28b23ba596614a60d319d9c64165.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/ev3/ev3-small.svg":
|
||
/*!********************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/ev3/ev3-small.svg ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/3286e2838658ebdb82f62d062b14e951.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/ev3/ev3.png":
|
||
/*!**************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/ev3/ev3.png ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/7596fe1f3c3a043a6e41a1aa6645e1b3.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/gallery/gallery.svg":
|
||
/*!**********************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/gallery/gallery.svg ***!
|
||
\**********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/da651c4aad54932d9ccac36246769c14.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/gdxfor/gdxfor-illustration.svg":
|
||
/*!*********************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/gdxfor/gdxfor-illustration.svg ***!
|
||
\*********************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/60fc7acc624571cfa9d250d7d5cff041.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/gdxfor/gdxfor-small.svg":
|
||
/*!**************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/gdxfor/gdxfor-small.svg ***!
|
||
\**************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/7b6399d516d5921bb199f57cdd8bbbbe.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/gdxfor/gdxfor.png":
|
||
/*!********************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/gdxfor/gdxfor.png ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/69356611b88705ba55f6680a2010f539.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/index.jsx":
|
||
/*!************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/index.jsx ***!
|
||
\************************************************/
|
||
/*! exports provided: default, galleryLoading, galleryMore, galleryError */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "galleryLoading", function() { return galleryLoading; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "galleryMore", function() { return galleryMore; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "galleryError", function() { return galleryError; });
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _music_music_png__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./music/music.png */ "./src/lib/libraries/extensions/music/music.png");
|
||
/* harmony import */ var _music_music_png__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_music_music_png__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _music_music_small_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./music/music-small.svg */ "./src/lib/libraries/extensions/music/music-small.svg");
|
||
/* harmony import */ var _music_music_small_svg__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_music_music_small_svg__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var _pen_pen_png__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pen/pen.png */ "./src/lib/libraries/extensions/pen/pen.png");
|
||
/* harmony import */ var _pen_pen_png__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_pen_pen_png__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _pen_pen_small_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pen/pen-small.svg */ "./src/lib/libraries/extensions/pen/pen-small.svg");
|
||
/* harmony import */ var _pen_pen_small_svg__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_pen_pen_small_svg__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _videoSensing_video_sensing_png__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./videoSensing/video-sensing.png */ "./src/lib/libraries/extensions/videoSensing/video-sensing.png");
|
||
/* harmony import */ var _videoSensing_video_sensing_png__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_videoSensing_video_sensing_png__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _videoSensing_video_sensing_small_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./videoSensing/video-sensing-small.svg */ "./src/lib/libraries/extensions/videoSensing/video-sensing-small.svg");
|
||
/* harmony import */ var _videoSensing_video_sensing_small_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_videoSensing_video_sensing_small_svg__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _text2speech_text2speech_png__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./text2speech/text2speech.png */ "./src/lib/libraries/extensions/text2speech/text2speech.png");
|
||
/* harmony import */ var _text2speech_text2speech_png__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_text2speech_text2speech_png__WEBPACK_IMPORTED_MODULE_8__);
|
||
/* harmony import */ var _text2speech_text2speech_small_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./text2speech/text2speech-small.svg */ "./src/lib/libraries/extensions/text2speech/text2speech-small.svg");
|
||
/* harmony import */ var _text2speech_text2speech_small_svg__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_text2speech_text2speech_small_svg__WEBPACK_IMPORTED_MODULE_9__);
|
||
/* harmony import */ var _translate_translate_png__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./translate/translate.png */ "./src/lib/libraries/extensions/translate/translate.png");
|
||
/* harmony import */ var _translate_translate_png__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_translate_translate_png__WEBPACK_IMPORTED_MODULE_10__);
|
||
/* harmony import */ var _translate_translate_small_png__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./translate/translate-small.png */ "./src/lib/libraries/extensions/translate/translate-small.png");
|
||
/* harmony import */ var _translate_translate_small_png__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_translate_translate_small_png__WEBPACK_IMPORTED_MODULE_11__);
|
||
/* harmony import */ var _makeymakey_makeymakey_png__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./makeymakey/makeymakey.png */ "./src/lib/libraries/extensions/makeymakey/makeymakey.png");
|
||
/* harmony import */ var _makeymakey_makeymakey_png__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_makeymakey_makeymakey_png__WEBPACK_IMPORTED_MODULE_12__);
|
||
/* harmony import */ var _makeymakey_makeymakey_small_svg__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./makeymakey/makeymakey-small.svg */ "./src/lib/libraries/extensions/makeymakey/makeymakey-small.svg");
|
||
/* harmony import */ var _makeymakey_makeymakey_small_svg__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_makeymakey_makeymakey_small_svg__WEBPACK_IMPORTED_MODULE_13__);
|
||
/* harmony import */ var _microbit_microbit_png__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./microbit/microbit.png */ "./src/lib/libraries/extensions/microbit/microbit.png");
|
||
/* harmony import */ var _microbit_microbit_png__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_microbit_microbit_png__WEBPACK_IMPORTED_MODULE_14__);
|
||
/* harmony import */ var _microbit_microbit_small_svg__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./microbit/microbit-small.svg */ "./src/lib/libraries/extensions/microbit/microbit-small.svg");
|
||
/* harmony import */ var _microbit_microbit_small_svg__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(_microbit_microbit_small_svg__WEBPACK_IMPORTED_MODULE_15__);
|
||
/* harmony import */ var _microbit_microbit_illustration_svg__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./microbit/microbit-illustration.svg */ "./src/lib/libraries/extensions/microbit/microbit-illustration.svg");
|
||
/* harmony import */ var _microbit_microbit_illustration_svg__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(_microbit_microbit_illustration_svg__WEBPACK_IMPORTED_MODULE_16__);
|
||
/* harmony import */ var _ev3_ev3_png__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./ev3/ev3.png */ "./src/lib/libraries/extensions/ev3/ev3.png");
|
||
/* harmony import */ var _ev3_ev3_png__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(_ev3_ev3_png__WEBPACK_IMPORTED_MODULE_17__);
|
||
/* harmony import */ var _ev3_ev3_small_svg__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./ev3/ev3-small.svg */ "./src/lib/libraries/extensions/ev3/ev3-small.svg");
|
||
/* harmony import */ var _ev3_ev3_small_svg__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(_ev3_ev3_small_svg__WEBPACK_IMPORTED_MODULE_18__);
|
||
/* harmony import */ var _ev3_ev3_hub_illustration_svg__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./ev3/ev3-hub-illustration.svg */ "./src/lib/libraries/extensions/ev3/ev3-hub-illustration.svg");
|
||
/* harmony import */ var _ev3_ev3_hub_illustration_svg__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(_ev3_ev3_hub_illustration_svg__WEBPACK_IMPORTED_MODULE_19__);
|
||
/* harmony import */ var _wedo2_wedo_png__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./wedo2/wedo.png */ "./src/lib/libraries/extensions/wedo2/wedo.png");
|
||
/* harmony import */ var _wedo2_wedo_png__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(_wedo2_wedo_png__WEBPACK_IMPORTED_MODULE_20__);
|
||
/* harmony import */ var _wedo2_wedo_small_svg__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./wedo2/wedo-small.svg */ "./src/lib/libraries/extensions/wedo2/wedo-small.svg");
|
||
/* harmony import */ var _wedo2_wedo_small_svg__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(_wedo2_wedo_small_svg__WEBPACK_IMPORTED_MODULE_21__);
|
||
/* harmony import */ var _wedo2_wedo_illustration_svg__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./wedo2/wedo-illustration.svg */ "./src/lib/libraries/extensions/wedo2/wedo-illustration.svg");
|
||
/* harmony import */ var _wedo2_wedo_illustration_svg__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(_wedo2_wedo_illustration_svg__WEBPACK_IMPORTED_MODULE_22__);
|
||
/* harmony import */ var _wedo2_wedo_button_illustration_svg__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./wedo2/wedo-button-illustration.svg */ "./src/lib/libraries/extensions/wedo2/wedo-button-illustration.svg");
|
||
/* harmony import */ var _wedo2_wedo_button_illustration_svg__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(_wedo2_wedo_button_illustration_svg__WEBPACK_IMPORTED_MODULE_23__);
|
||
/* harmony import */ var _boost_boost_png__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./boost/boost.png */ "./src/lib/libraries/extensions/boost/boost.png");
|
||
/* harmony import */ var _boost_boost_png__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(_boost_boost_png__WEBPACK_IMPORTED_MODULE_24__);
|
||
/* harmony import */ var _boost_boost_small_svg__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./boost/boost-small.svg */ "./src/lib/libraries/extensions/boost/boost-small.svg");
|
||
/* harmony import */ var _boost_boost_small_svg__WEBPACK_IMPORTED_MODULE_25___default = /*#__PURE__*/__webpack_require__.n(_boost_boost_small_svg__WEBPACK_IMPORTED_MODULE_25__);
|
||
/* harmony import */ var _boost_boost_illustration_svg__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./boost/boost-illustration.svg */ "./src/lib/libraries/extensions/boost/boost-illustration.svg");
|
||
/* harmony import */ var _boost_boost_illustration_svg__WEBPACK_IMPORTED_MODULE_26___default = /*#__PURE__*/__webpack_require__.n(_boost_boost_illustration_svg__WEBPACK_IMPORTED_MODULE_26__);
|
||
/* harmony import */ var _boost_boost_button_illustration_svg__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./boost/boost-button-illustration.svg */ "./src/lib/libraries/extensions/boost/boost-button-illustration.svg");
|
||
/* harmony import */ var _boost_boost_button_illustration_svg__WEBPACK_IMPORTED_MODULE_27___default = /*#__PURE__*/__webpack_require__.n(_boost_boost_button_illustration_svg__WEBPACK_IMPORTED_MODULE_27__);
|
||
/* harmony import */ var _gdxfor_gdxfor_png__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./gdxfor/gdxfor.png */ "./src/lib/libraries/extensions/gdxfor/gdxfor.png");
|
||
/* harmony import */ var _gdxfor_gdxfor_png__WEBPACK_IMPORTED_MODULE_28___default = /*#__PURE__*/__webpack_require__.n(_gdxfor_gdxfor_png__WEBPACK_IMPORTED_MODULE_28__);
|
||
/* harmony import */ var _gdxfor_gdxfor_small_svg__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./gdxfor/gdxfor-small.svg */ "./src/lib/libraries/extensions/gdxfor/gdxfor-small.svg");
|
||
/* harmony import */ var _gdxfor_gdxfor_small_svg__WEBPACK_IMPORTED_MODULE_29___default = /*#__PURE__*/__webpack_require__.n(_gdxfor_gdxfor_small_svg__WEBPACK_IMPORTED_MODULE_29__);
|
||
/* harmony import */ var _gdxfor_gdxfor_illustration_svg__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./gdxfor/gdxfor-illustration.svg */ "./src/lib/libraries/extensions/gdxfor/gdxfor-illustration.svg");
|
||
/* harmony import */ var _gdxfor_gdxfor_illustration_svg__WEBPACK_IMPORTED_MODULE_30___default = /*#__PURE__*/__webpack_require__.n(_gdxfor_gdxfor_illustration_svg__WEBPACK_IMPORTED_MODULE_30__);
|
||
/* harmony import */ var _tw_tw_svg__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./tw/tw.svg */ "./src/lib/libraries/extensions/tw/tw.svg");
|
||
/* harmony import */ var _tw_tw_svg__WEBPACK_IMPORTED_MODULE_31___default = /*#__PURE__*/__webpack_require__.n(_tw_tw_svg__WEBPACK_IMPORTED_MODULE_31__);
|
||
/* harmony import */ var _custom_custom_svg__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./custom/custom.svg */ "./src/lib/libraries/extensions/custom/custom.svg");
|
||
/* harmony import */ var _custom_custom_svg__WEBPACK_IMPORTED_MODULE_32___default = /*#__PURE__*/__webpack_require__.n(_custom_custom_svg__WEBPACK_IMPORTED_MODULE_32__);
|
||
/* harmony import */ var _custom_return_svg__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./custom/return.svg */ "./src/lib/libraries/extensions/custom/return.svg");
|
||
/* harmony import */ var _custom_return_svg__WEBPACK_IMPORTED_MODULE_33___default = /*#__PURE__*/__webpack_require__.n(_custom_return_svg__WEBPACK_IMPORTED_MODULE_33__);
|
||
/* harmony import */ var _gallery_gallery_svg__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./gallery/gallery.svg */ "./src/lib/libraries/extensions/gallery/gallery.svg");
|
||
/* harmony import */ var _gallery_gallery_svg__WEBPACK_IMPORTED_MODULE_34___default = /*#__PURE__*/__webpack_require__.n(_gallery_gallery_svg__WEBPACK_IMPORTED_MODULE_34__);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// TODO: Rename file names to match variable/prop names?
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = ([{
|
||
name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Music",
|
||
id: "gui.extension.music.name"
|
||
}),
|
||
extensionId: 'music',
|
||
iconURL: _music_music_png__WEBPACK_IMPORTED_MODULE_2___default.a,
|
||
insetIconURL: _music_music_small_svg__WEBPACK_IMPORTED_MODULE_3___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Play instruments and drums.",
|
||
id: "gui.extension.music.description"
|
||
}),
|
||
tags: ['scratch'],
|
||
featured: true
|
||
}, {
|
||
name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Pen",
|
||
id: "gui.extension.pen.name"
|
||
}),
|
||
extensionId: 'pen',
|
||
iconURL: _pen_pen_png__WEBPACK_IMPORTED_MODULE_4___default.a,
|
||
insetIconURL: _pen_pen_small_svg__WEBPACK_IMPORTED_MODULE_5___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Draw with your sprites.",
|
||
id: "gui.extension.pen.description"
|
||
}),
|
||
tags: ['scratch'],
|
||
featured: true
|
||
}, {
|
||
name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Video Sensing",
|
||
id: "gui.extension.videosensing.name"
|
||
}),
|
||
extensionId: 'videoSensing',
|
||
iconURL: _videoSensing_video_sensing_png__WEBPACK_IMPORTED_MODULE_6___default.a,
|
||
insetIconURL: _videoSensing_video_sensing_small_svg__WEBPACK_IMPORTED_MODULE_7___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Sense motion with the camera.",
|
||
id: "gui.extension.videosensing.description"
|
||
}),
|
||
tags: ['scratch'],
|
||
featured: true
|
||
}, {
|
||
name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Text to Speech",
|
||
id: "gui.extension.text2speech.name"
|
||
}),
|
||
extensionId: 'text2speech',
|
||
collaborator: 'Amazon Web Services',
|
||
iconURL: _text2speech_text2speech_png__WEBPACK_IMPORTED_MODULE_8___default.a,
|
||
insetIconURL: _text2speech_text2speech_small_svg__WEBPACK_IMPORTED_MODULE_9___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Make your projects talk.",
|
||
id: "gui.extension.text2speech.description"
|
||
}),
|
||
tags: ['scratch'],
|
||
featured: true,
|
||
internetConnectionRequired: true
|
||
}, {
|
||
name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Translate",
|
||
id: "gui.extension.translate.name"
|
||
}),
|
||
extensionId: 'translate',
|
||
collaborator: 'Google',
|
||
iconURL: _translate_translate_png__WEBPACK_IMPORTED_MODULE_10___default.a,
|
||
insetIconURL: _translate_translate_small_png__WEBPACK_IMPORTED_MODULE_11___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Translate text into many languages.",
|
||
id: "gui.extension.translate.description"
|
||
}),
|
||
tags: ['scratch'],
|
||
featured: true,
|
||
internetConnectionRequired: true
|
||
}, {
|
||
name: 'Makey Makey',
|
||
extensionId: 'makeymakey',
|
||
collaborator: 'JoyLabz',
|
||
iconURL: _makeymakey_makeymakey_png__WEBPACK_IMPORTED_MODULE_12___default.a,
|
||
insetIconURL: _makeymakey_makeymakey_small_svg__WEBPACK_IMPORTED_MODULE_13___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Make anything into a key.",
|
||
id: "gui.extension.makeymakey.description"
|
||
}),
|
||
tags: ['scratch'],
|
||
featured: true
|
||
}, {
|
||
name: 'micro:bit',
|
||
extensionId: 'microbit',
|
||
collaborator: 'micro:bit',
|
||
iconURL: _microbit_microbit_png__WEBPACK_IMPORTED_MODULE_14___default.a,
|
||
insetIconURL: _microbit_microbit_small_svg__WEBPACK_IMPORTED_MODULE_15___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Connect your projects with the world.",
|
||
id: "gui.extension.microbit.description"
|
||
}),
|
||
tags: ['scratch'],
|
||
featured: true,
|
||
disabled: false,
|
||
bluetoothRequired: true,
|
||
internetConnectionRequired: true,
|
||
launchPeripheralConnectionFlow: true,
|
||
useAutoScan: false,
|
||
connectionIconURL: _microbit_microbit_illustration_svg__WEBPACK_IMPORTED_MODULE_16___default.a,
|
||
connectionSmallIconURL: _microbit_microbit_small_svg__WEBPACK_IMPORTED_MODULE_15___default.a,
|
||
connectingMessage: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Connecting",
|
||
id: "gui.extension.microbit.connectingMessage"
|
||
}),
|
||
helpLink: 'https://scratch.mit.edu/microbit'
|
||
}, {
|
||
name: 'LEGO MINDSTORMS EV3',
|
||
extensionId: 'ev3',
|
||
collaborator: 'LEGO',
|
||
iconURL: _ev3_ev3_png__WEBPACK_IMPORTED_MODULE_17___default.a,
|
||
insetIconURL: _ev3_ev3_small_svg__WEBPACK_IMPORTED_MODULE_18___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Build interactive robots and more.",
|
||
id: "gui.extension.ev3.description"
|
||
}),
|
||
tags: ['scratch'],
|
||
featured: true,
|
||
disabled: false,
|
||
bluetoothRequired: true,
|
||
internetConnectionRequired: true,
|
||
launchPeripheralConnectionFlow: true,
|
||
useAutoScan: false,
|
||
connectionIconURL: _ev3_ev3_hub_illustration_svg__WEBPACK_IMPORTED_MODULE_19___default.a,
|
||
connectionSmallIconURL: _ev3_ev3_small_svg__WEBPACK_IMPORTED_MODULE_18___default.a,
|
||
connectingMessage: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Connecting. Make sure the pin on your EV3 is set to 1234.",
|
||
id: "gui.extension.ev3.connectingMessage"
|
||
}),
|
||
helpLink: 'https://scratch.mit.edu/ev3'
|
||
}, {
|
||
name: 'LEGO BOOST',
|
||
extensionId: 'boost',
|
||
collaborator: 'LEGO',
|
||
iconURL: _boost_boost_png__WEBPACK_IMPORTED_MODULE_24___default.a,
|
||
insetIconURL: _boost_boost_small_svg__WEBPACK_IMPORTED_MODULE_25___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Bring robotic creations to life.",
|
||
id: "gui.extension.boost.description"
|
||
}),
|
||
tags: ['scratch'],
|
||
featured: true,
|
||
disabled: false,
|
||
bluetoothRequired: true,
|
||
internetConnectionRequired: true,
|
||
launchPeripheralConnectionFlow: true,
|
||
useAutoScan: true,
|
||
connectionIconURL: _boost_boost_illustration_svg__WEBPACK_IMPORTED_MODULE_26___default.a,
|
||
connectionSmallIconURL: _boost_boost_small_svg__WEBPACK_IMPORTED_MODULE_25___default.a,
|
||
connectionTipIconURL: _boost_boost_button_illustration_svg__WEBPACK_IMPORTED_MODULE_27___default.a,
|
||
connectingMessage: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Connecting",
|
||
id: "gui.extension.boost.connectingMessage"
|
||
}),
|
||
helpLink: 'https://scratch.mit.edu/boost'
|
||
}, {
|
||
name: 'LEGO Education WeDo 2.0',
|
||
extensionId: 'wedo2',
|
||
collaborator: 'LEGO',
|
||
iconURL: _wedo2_wedo_png__WEBPACK_IMPORTED_MODULE_20___default.a,
|
||
insetIconURL: _wedo2_wedo_small_svg__WEBPACK_IMPORTED_MODULE_21___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Build with motors and sensors.",
|
||
id: "gui.extension.wedo2.description"
|
||
}),
|
||
tags: ['scratch'],
|
||
featured: true,
|
||
disabled: false,
|
||
bluetoothRequired: true,
|
||
internetConnectionRequired: true,
|
||
launchPeripheralConnectionFlow: true,
|
||
useAutoScan: true,
|
||
connectionIconURL: _wedo2_wedo_illustration_svg__WEBPACK_IMPORTED_MODULE_22___default.a,
|
||
connectionSmallIconURL: _wedo2_wedo_small_svg__WEBPACK_IMPORTED_MODULE_21___default.a,
|
||
connectionTipIconURL: _wedo2_wedo_button_illustration_svg__WEBPACK_IMPORTED_MODULE_23___default.a,
|
||
connectingMessage: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Connecting",
|
||
id: "gui.extension.wedo2.connectingMessage"
|
||
}),
|
||
helpLink: 'https://scratch.mit.edu/wedo'
|
||
}, {
|
||
name: 'Go Direct Force & Acceleration',
|
||
extensionId: 'gdxfor',
|
||
collaborator: 'Vernier',
|
||
iconURL: _gdxfor_gdxfor_png__WEBPACK_IMPORTED_MODULE_28___default.a,
|
||
insetIconURL: _gdxfor_gdxfor_small_svg__WEBPACK_IMPORTED_MODULE_29___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Sense push, pull, motion, and spin.",
|
||
id: "gui.extension.gdxfor.description"
|
||
}),
|
||
tags: ['scratch'],
|
||
featured: true,
|
||
disabled: false,
|
||
bluetoothRequired: true,
|
||
internetConnectionRequired: true,
|
||
launchPeripheralConnectionFlow: true,
|
||
useAutoScan: false,
|
||
connectionIconURL: _gdxfor_gdxfor_illustration_svg__WEBPACK_IMPORTED_MODULE_30___default.a,
|
||
connectionSmallIconURL: _gdxfor_gdxfor_small_svg__WEBPACK_IMPORTED_MODULE_29___default.a,
|
||
connectingMessage: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Connecting",
|
||
id: "gui.extension.gdxfor.connectingMessage"
|
||
}),
|
||
helpLink: 'https://scratch.mit.edu/vernier'
|
||
}, {
|
||
// not really an extension, but it's easiest to present it as one
|
||
name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Custom Reporters",
|
||
id: "tw.customReporters.name"
|
||
}),
|
||
extensionId: 'procedures_enable_return',
|
||
iconURL: _custom_return_svg__WEBPACK_IMPORTED_MODULE_33___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Allow custom blocks to output values and be used as inputs.",
|
||
id: "tw.customReporters.description"
|
||
}),
|
||
tags: ['tw'],
|
||
incompatibleWithScratch: true,
|
||
featured: true
|
||
}, {
|
||
name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "TurboWarp Blocks",
|
||
id: "tw.twExtension.name"
|
||
}),
|
||
extensionId: 'tw',
|
||
iconURL: _tw_tw_svg__WEBPACK_IMPORTED_MODULE_31___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Weird new blocks.",
|
||
id: "tw.twExtension.description"
|
||
}),
|
||
incompatibleWithScratch: true,
|
||
tags: ['tw'],
|
||
featured: true
|
||
}, {
|
||
name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Custom Extension",
|
||
id: "tw.customExtension.name"
|
||
}),
|
||
extensionId: 'custom_extension',
|
||
iconURL: _custom_custom_svg__WEBPACK_IMPORTED_MODULE_32___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "Load custom extensions from URLs, files, or JavaScript source code.",
|
||
id: "tw.customExtension.description"
|
||
}),
|
||
tags: ['tw'],
|
||
featured: true // Not marked as incompatible with Scratch so that clicking on it doesn't show a prompt
|
||
|
||
}]);
|
||
const galleryLoading = {
|
||
name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "TurboWarp Extension Gallery",
|
||
id: "tw.extensionGallery.name"
|
||
}),
|
||
href: 'https://extensions.turbowarp.org/',
|
||
extensionId: 'gallery',
|
||
iconURL: _gallery_gallery_svg__WEBPACK_IMPORTED_MODULE_34___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Loading extension gallery...",
|
||
id: "tw.extensionGallery.loading"
|
||
}),
|
||
tags: ['tw'],
|
||
featured: true
|
||
};
|
||
const galleryMore = {
|
||
name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "TurboWarp Extension Gallery",
|
||
id: "tw.extensionGallery.name"
|
||
}),
|
||
href: 'https://extensions.turbowarp.org/',
|
||
extensionId: 'gallery',
|
||
iconURL: _gallery_gallery_svg__WEBPACK_IMPORTED_MODULE_34___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Learn more about extensions at extensions.turbowarp.org.",
|
||
id: "tw.extensionGallery.more"
|
||
}),
|
||
tags: ['tw'],
|
||
featured: true
|
||
};
|
||
const galleryError = {
|
||
name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
|
||
defaultMessage: "TurboWarp Extension Gallery",
|
||
id: "tw.extensionGallery.name"
|
||
}),
|
||
href: 'https://extensions.turbowarp.org/',
|
||
extensionId: 'gallery',
|
||
iconURL: _gallery_gallery_svg__WEBPACK_IMPORTED_MODULE_34___default.a,
|
||
description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"] // eslint-disable-next-line max-len
|
||
, {
|
||
defaultMessage: "Error loading extension gallery. Visit extensions.turbowarp.org to find more extensions.",
|
||
id: "tw.extensionGallery.error"
|
||
}),
|
||
tags: ['tw'],
|
||
featured: true
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/makeymakey/makeymakey-small.svg":
|
||
/*!**********************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/makeymakey/makeymakey-small.svg ***!
|
||
\**********************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/d61429ad96a25ec2917ebc77d900aae0.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/makeymakey/makeymakey.png":
|
||
/*!****************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/makeymakey/makeymakey.png ***!
|
||
\****************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/153f207c1b27eff452e2e136af72b4a3.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/microbit/microbit-illustration.svg":
|
||
/*!*************************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/microbit/microbit-illustration.svg ***!
|
||
\*************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/84a9455c54ab68ad8dcf8b6f6465ae71.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/microbit/microbit-small.svg":
|
||
/*!******************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/microbit/microbit-small.svg ***!
|
||
\******************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/6be143c7cb9d23c787f7f20674a76f72.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/microbit/microbit.png":
|
||
/*!************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/microbit/microbit.png ***!
|
||
\************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/98760e9a26be1c3ab6cd6850eccd74dc.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/music/music-small.svg":
|
||
/*!************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/music/music-small.svg ***!
|
||
\************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/504d73be1b361b4b9ca7f655ce085dc6.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/music/music.png":
|
||
/*!******************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/music/music.png ***!
|
||
\******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/208e51b7ec440e9cad5d2bf72f584d04.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/pen/pen-small.svg":
|
||
/*!********************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/pen/pen-small.svg ***!
|
||
\********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/800f6f1573677d59954e8d3164602287.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/pen/pen.png":
|
||
/*!**************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/pen/pen.png ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/6860234c7e1c6f6d7ae3eea3b4949759.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/text2speech/text2speech-small.svg":
|
||
/*!************************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/text2speech/text2speech-small.svg ***!
|
||
\************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/c7ffd288176b935f835311512a224d4b.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/text2speech/text2speech.png":
|
||
/*!******************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/text2speech/text2speech.png ***!
|
||
\******************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/0130b626059c966bb76a43b50979f8f2.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/translate/translate-small.png":
|
||
/*!********************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/translate/translate-small.png ***!
|
||
\********************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/f40501ed87782097b1a4eec8747eb84a.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/translate/translate.png":
|
||
/*!**************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/translate/translate.png ***!
|
||
\**************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/d2bea2877a81351c11d73712ce9a06c9.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/tw/tw.svg":
|
||
/*!************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/tw/tw.svg ***!
|
||
\************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/baccf211a9d3610d8c020d21a4ce3573.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/videoSensing/video-sensing-small.svg":
|
||
/*!***************************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/videoSensing/video-sensing-small.svg ***!
|
||
\***************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/5e8eccd5a576638f029a1ed2deb4784b.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/videoSensing/video-sensing.png":
|
||
/*!*********************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/videoSensing/video-sensing.png ***!
|
||
\*********************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/b08053db99e46c6c4abe88ebe7b3eb92.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/wedo2/wedo-button-illustration.svg":
|
||
/*!*************************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/wedo2/wedo-button-illustration.svg ***!
|
||
\*************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/7130491bf33852e50503dcb4024c0279.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/wedo2/wedo-illustration.svg":
|
||
/*!******************************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/wedo2/wedo-illustration.svg ***!
|
||
\******************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/5f7a79af3db62e0f5b7306ac0bd5ebf9.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/wedo2/wedo-small.svg":
|
||
/*!***********************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/wedo2/wedo-small.svg ***!
|
||
\***********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/0f9efe3bd6e80747dfa3aeb9e19997b5.svg";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/extensions/wedo2/wedo.png":
|
||
/*!*****************************************************!*\
|
||
!*** ./src/lib/libraries/extensions/wedo2/wedo.png ***!
|
||
\*****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/5fe00313bc2f246caa98b0bfd62b0581.png";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/sound-tags.js":
|
||
/*!*****************************************!*\
|
||
!*** ./src/lib/libraries/sound-tags.js ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tag-messages.js */ "./src/lib/libraries/tag-messages.js");
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = ([{
|
||
tag: 'animals',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].animals
|
||
}, {
|
||
tag: 'effects',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].effects
|
||
}, {
|
||
tag: 'loops',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].loops
|
||
}, {
|
||
tag: 'notes',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].notes
|
||
}, {
|
||
tag: 'percussion',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].percussion
|
||
}, {
|
||
tag: 'space',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].space
|
||
}, {
|
||
tag: 'sports',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].sports
|
||
}, {
|
||
tag: 'voice',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].voice
|
||
}, {
|
||
tag: 'wacky',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].wacky
|
||
}]);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/sprite-tags.js":
|
||
/*!******************************************!*\
|
||
!*** ./src/lib/libraries/sprite-tags.js ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tag-messages.js */ "./src/lib/libraries/tag-messages.js");
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = ([{
|
||
tag: 'animals',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].animals
|
||
}, {
|
||
tag: 'people',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].people
|
||
}, {
|
||
tag: 'fantasy',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].fantasy
|
||
}, {
|
||
tag: 'dance',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].dance
|
||
}, {
|
||
tag: 'music',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].music
|
||
}, {
|
||
tag: 'sports',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].sports
|
||
}, {
|
||
tag: 'food',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].food
|
||
}, {
|
||
tag: 'fashion',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].fashion
|
||
}, {
|
||
tag: 'letters',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].letters
|
||
}]);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/tag-messages.js":
|
||
/*!*******************************************!*\
|
||
!*** ./src/lib/libraries/tag-messages.js ***!
|
||
\*******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["defineMessages"])({
|
||
all: {
|
||
"id": "gui.libraryTags.all",
|
||
"defaultMessage": "All"
|
||
},
|
||
animals: {
|
||
"id": "gui.libraryTags.animals",
|
||
"defaultMessage": "Animals"
|
||
},
|
||
dance: {
|
||
"id": "gui.libraryTags.dance",
|
||
"defaultMessage": "Dance"
|
||
},
|
||
effects: {
|
||
"id": "gui.libraryTags.effects",
|
||
"defaultMessage": "Effects"
|
||
},
|
||
fantasy: {
|
||
"id": "gui.libraryTags.fantasy",
|
||
"defaultMessage": "Fantasy"
|
||
},
|
||
fashion: {
|
||
"id": "gui.libraryTags.fashion",
|
||
"defaultMessage": "Fashion"
|
||
},
|
||
food: {
|
||
"id": "gui.libraryTags.food",
|
||
"defaultMessage": "Food"
|
||
},
|
||
indoors: {
|
||
"id": "gui.libraryTags.indoors",
|
||
"defaultMessage": "Indoors"
|
||
},
|
||
loops: {
|
||
"id": "gui.libraryTags.loops",
|
||
"defaultMessage": "Loops"
|
||
},
|
||
music: {
|
||
"id": "gui.libraryTags.music",
|
||
"defaultMessage": "Music"
|
||
},
|
||
notes: {
|
||
"id": "gui.libraryTags.notes",
|
||
"defaultMessage": "Notes"
|
||
},
|
||
outdoors: {
|
||
"id": "gui.libraryTags.outdoors",
|
||
"defaultMessage": "Outdoors"
|
||
},
|
||
patterns: {
|
||
"id": "gui.libraryTags.patterns",
|
||
"defaultMessage": "Patterns"
|
||
},
|
||
people: {
|
||
"id": "gui.libraryTags.people",
|
||
"defaultMessage": "People"
|
||
},
|
||
percussion: {
|
||
"id": "gui.libraryTags.percussion",
|
||
"defaultMessage": "Percussion"
|
||
},
|
||
space: {
|
||
"id": "gui.libraryTags.space",
|
||
"defaultMessage": "Space"
|
||
},
|
||
sports: {
|
||
"id": "gui.libraryTags.sports",
|
||
"defaultMessage": "Sports"
|
||
},
|
||
underwater: {
|
||
"id": "gui.libraryTags.underwater",
|
||
"defaultMessage": "Underwater"
|
||
},
|
||
voice: {
|
||
"id": "gui.libraryTags.voice",
|
||
"defaultMessage": "Voice"
|
||
},
|
||
wacky: {
|
||
"id": "gui.libraryTags.wacky",
|
||
"defaultMessage": "Wacky"
|
||
},
|
||
animation: {
|
||
"id": "gui.libraryTags.animation",
|
||
"defaultMessage": "Animation"
|
||
},
|
||
art: {
|
||
"id": "gui.libraryTags.art",
|
||
"defaultMessage": "Art"
|
||
},
|
||
games: {
|
||
"id": "gui.libraryTags.games",
|
||
"defaultMessage": "Games"
|
||
},
|
||
stories: {
|
||
"id": "gui.libraryTags.stories",
|
||
"defaultMessage": "Stories"
|
||
},
|
||
letters: {
|
||
"id": "gui.libraryTags.letters",
|
||
"defaultMessage": "Letters"
|
||
}
|
||
}));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/tutorial-tags.js":
|
||
/*!********************************************!*\
|
||
!*** ./src/lib/libraries/tutorial-tags.js ***!
|
||
\********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tag-messages.js */ "./src/lib/libraries/tag-messages.js");
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = ([{
|
||
tag: 'animation',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].animation
|
||
}, {
|
||
tag: 'art',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].art
|
||
}, {
|
||
tag: 'music',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].music
|
||
}, {
|
||
tag: 'games',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].games
|
||
}, {
|
||
tag: 'stories',
|
||
intlLabel: _tag_messages_js__WEBPACK_IMPORTED_MODULE_0__["default"].stories
|
||
}]);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/tw-async-libraries.js":
|
||
/*!*************************************************!*\
|
||
!*** ./src/lib/libraries/tw-async-libraries.js ***!
|
||
\*************************************************/
|
||
/*! exports provided: getBackdropLibrary, getCostumeLibrary, getSoundLibrary, getSpriteLibrary */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBackdropLibrary", function() { return getBackdropLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCostumeLibrary", function() { return getCostumeLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSoundLibrary", function() { return getSoundLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSpriteLibrary", function() { return getSpriteLibrary; });
|
||
const asyncLibrary = callback => {
|
||
let data = null;
|
||
return () => {
|
||
if (data) return data;
|
||
return callback().then(mod => data = mod.default);
|
||
};
|
||
};
|
||
|
||
const getBackdropLibrary = asyncLibrary(() => __webpack_require__.e(/*! import() | library-backdrops */ "library-backdrops").then(__webpack_require__.t.bind(null, /*! ./backdrops.json */ "./src/lib/libraries/backdrops.json", 3)));
|
||
const getCostumeLibrary = asyncLibrary(() => __webpack_require__.e(/*! import() | library-costumes */ "library-costumes").then(__webpack_require__.t.bind(null, /*! ./costumes.json */ "./src/lib/libraries/costumes.json", 3)));
|
||
const getSoundLibrary = asyncLibrary(() => __webpack_require__.e(/*! import() | library-sounds */ "library-sounds").then(__webpack_require__.t.bind(null, /*! ./sounds.json */ "./src/lib/libraries/sounds.json", 3)));
|
||
const getSpriteLibrary = asyncLibrary(() => __webpack_require__.e(/*! import() | library-sprites */ "library-sprites").then(__webpack_require__.t.bind(null, /*! ./sprites.json */ "./src/lib/libraries/sprites.json", 3)));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/libraries/tw-extension-tags.js":
|
||
/*!************************************************!*\
|
||
!*** ./src/lib/libraries/tw-extension-tags.js ***!
|
||
\************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
// Because there are all brand names, it is unnecessary for them to be translatable.
|
||
/* harmony default export */ __webpack_exports__["default"] = ([{
|
||
tag: 'scratch',
|
||
intlLabel: 'Scratch'
|
||
}, {
|
||
tag: 'tw',
|
||
intlLabel: 'TurboWarp'
|
||
}]);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/locale-utils.js":
|
||
/*!*********************************!*\
|
||
!*** ./src/lib/locale-utils.js ***!
|
||
\*********************************/
|
||
/*! exports provided: wideLocales, isWideLocale */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wideLocales", function() { return wideLocales; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isWideLocale", function() { return isWideLocale; });
|
||
/**
|
||
* @fileoverview
|
||
* Utility functions related to localization specific to the GUI
|
||
*/
|
||
const wideLocales = ['ab', 'ca', 'de', 'el', 'it', 'ja', 'ja-Hira', 'ko', 'hu', 'ru', 'vi'];
|
||
/**
|
||
* Identify the languages where translations are too long to fit in fixed width parts of the gui.
|
||
* @param {string} locale The current locale.
|
||
* @return {bool} true if translations in this language are too long
|
||
*/
|
||
|
||
const isWideLocale = locale => wideLocales.indexOf(locale) !== -1;
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/localization-hoc.jsx":
|
||
/*!**************************************!*\
|
||
!*** ./src/lib/localization-hoc.jsx ***!
|
||
\**************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _connected_intl_provider_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./connected-intl-provider.jsx */ "./src/lib/connected-intl-provider.jsx");
|
||
const _excluded = ["locale", "onSetLanguage"];
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
/*
|
||
* Higher Order Component to provide localiztion state. Creates a nested IntlProvider
|
||
* to handle Gui intl context. The component accepts an onSetLanguage callback that is
|
||
* called when the locale chagnes.
|
||
* @param {React.Component} WrappedComponent - component to provide state for
|
||
* @returns {React.Component} component with intl state provided from redux
|
||
*/
|
||
|
||
const LocalizationHOC = function LocalizationHOC(WrappedComponent) {
|
||
class LocalizationWrapper extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
componentDidUpdate(prevProps) {
|
||
if (prevProps.locale !== this.props.locale) {
|
||
this.props.onSetLanguage(this.props.locale);
|
||
}
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
locale,
|
||
// eslint-disable-line no-unused-vars
|
||
onSetLanguage
|
||
} = _this$props,
|
||
componentProps = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_connected_intl_provider_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(WrappedComponent, componentProps));
|
||
}
|
||
|
||
}
|
||
|
||
LocalizationWrapper.propTypes = {
|
||
locale: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onSetLanguage: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
LocalizationWrapper.defaultProps = {
|
||
onSetLanguage: () => {}
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
locale: state.locales.locale
|
||
});
|
||
|
||
const mapDispatchToProps = () => ({});
|
||
|
||
return Object(react_redux__WEBPACK_IMPORTED_MODULE_2__["connect"])(mapStateToProps, mapDispatchToProps)(LocalizationWrapper);
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (LocalizationHOC);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/log.js":
|
||
/*!************************!*\
|
||
!*** ./src/lib/log.js ***!
|
||
\************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var minilog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! minilog */ "./node_modules/minilog/lib/web/index.js");
|
||
/* harmony import */ var minilog__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(minilog__WEBPACK_IMPORTED_MODULE_0__);
|
||
|
||
minilog__WEBPACK_IMPORTED_MODULE_0___default.a.enable();
|
||
/* harmony default export */ __webpack_exports__["default"] = (minilog__WEBPACK_IMPORTED_MODULE_0___default()('gui'));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/make-toolbox-xml.js":
|
||
/*!*************************************!*\
|
||
!*** ./src/lib/make-toolbox-xml.js ***!
|
||
\*************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tw-lazy-scratch-blocks */ "./src/lib/tw-lazy-scratch-blocks.js");
|
||
|
||
const categorySeparator = '<sep gap="36"/>';
|
||
const blockSeparator = '<sep gap="36"/>'; // At default scale, about 28px
|
||
|
||
const translate = (id, english) => {
|
||
if (_tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_0__["default"].isLoaded()) {
|
||
const ScratchBlocks = _tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_0__["default"].get();
|
||
return ScratchBlocks.ScratchMsgs.translate(id, english);
|
||
}
|
||
|
||
return english;
|
||
};
|
||
/* eslint-disable no-unused-vars */
|
||
|
||
|
||
const motion = function motion(isInitialSetup, isStage, targetId) {
|
||
const stageSelected = translate('MOTION_STAGE_SELECTED', 'Stage selected: no motion blocks');
|
||
return "\n <category name=\"%{BKY_CATEGORY_MOTION}\" id=\"motion\" colour=\"#4C97FF\" secondaryColour=\"#3373CC\">\n ".concat(isStage ? "\n <label text=\"".concat(stageSelected, "\"></label>\n ") : "\n <block type=\"motion_movesteps\">\n <value name=\"STEPS\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">10</field>\n </shadow>\n </value>\n </block>\n <block type=\"motion_turnright\">\n <value name=\"DEGREES\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">15</field>\n </shadow>\n </value>\n </block>\n <block type=\"motion_turnleft\">\n <value name=\"DEGREES\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">15</field>\n </shadow>\n </value>\n </block>\n ".concat(blockSeparator, "\n <block type=\"motion_goto\">\n <value name=\"TO\">\n <shadow type=\"motion_goto_menu\">\n </shadow>\n </value>\n </block>\n <block type=\"motion_gotoxy\">\n <value name=\"X\">\n <shadow id=\"movex\" type=\"math_number\">\n <field name=\"NUM\">0</field>\n </shadow>\n </value>\n <value name=\"Y\">\n <shadow id=\"movey\" type=\"math_number\">\n <field name=\"NUM\">0</field>\n </shadow>\n </value>\n </block>\n <block type=\"motion_glideto\" id=\"motion_glideto\">\n <value name=\"SECS\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">1</field>\n </shadow>\n </value>\n <value name=\"TO\">\n <shadow type=\"motion_glideto_menu\">\n </shadow>\n </value>\n </block>\n <block type=\"motion_glidesecstoxy\">\n <value name=\"SECS\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">1</field>\n </shadow>\n </value>\n <value name=\"X\">\n <shadow id=\"glidex\" type=\"math_number\">\n <field name=\"NUM\">0</field>\n </shadow>\n </value>\n <value name=\"Y\">\n <shadow id=\"glidey\" type=\"math_number\">\n <field name=\"NUM\">0</field>\n </shadow>\n </value>\n </block>\n ").concat(blockSeparator, "\n <block type=\"motion_pointindirection\">\n <value name=\"DIRECTION\">\n <shadow type=\"math_angle\">\n <field name=\"NUM\">90</field>\n </shadow>\n </value>\n </block>\n <block type=\"motion_pointtowards\">\n <value name=\"TOWARDS\">\n <shadow type=\"motion_pointtowards_menu\">\n </shadow>\n </value>\n </block>\n ").concat(blockSeparator, "\n <block type=\"motion_changexby\">\n <value name=\"DX\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">10</field>\n </shadow>\n </value>\n </block>\n <block type=\"motion_setx\">\n <value name=\"X\">\n <shadow id=\"setx\" type=\"math_number\">\n <field name=\"NUM\">0</field>\n </shadow>\n </value>\n </block>\n <block type=\"motion_changeyby\">\n <value name=\"DY\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">10</field>\n </shadow>\n </value>\n </block>\n <block type=\"motion_sety\">\n <value name=\"Y\">\n <shadow id=\"sety\" type=\"math_number\">\n <field name=\"NUM\">0</field>\n </shadow>\n </value>\n </block>\n ").concat(blockSeparator, "\n <block type=\"motion_ifonedgebounce\"/>\n ").concat(blockSeparator, "\n <block type=\"motion_setrotationstyle\"/>\n ").concat(blockSeparator, "\n <block id=\"").concat(targetId, "_xposition\" type=\"motion_xposition\"/>\n <block id=\"").concat(targetId, "_yposition\" type=\"motion_yposition\"/>\n <block id=\"").concat(targetId, "_direction\" type=\"motion_direction\"/>"), "\n ").concat(categorySeparator, "\n </category>\n ");
|
||
};
|
||
|
||
const xmlEscape = function xmlEscape(unsafe) {
|
||
return unsafe.replace(/[<>&'"]/g, c => {
|
||
switch (c) {
|
||
case '<':
|
||
return '<';
|
||
|
||
case '>':
|
||
return '>';
|
||
|
||
case '&':
|
||
return '&';
|
||
|
||
case '\'':
|
||
return ''';
|
||
|
||
case '"':
|
||
return '"';
|
||
}
|
||
});
|
||
};
|
||
|
||
const looks = function looks(isInitialSetup, isStage, targetId, costumeName, backdropName) {
|
||
const hello = translate('LOOKS_HELLO', 'Hello!');
|
||
const hmm = translate('LOOKS_HMM', 'Hmm...');
|
||
return "\n <category name=\"%{BKY_CATEGORY_LOOKS}\" id=\"looks\" colour=\"#9966FF\" secondaryColour=\"#774DCB\">\n ".concat(isStage ? '' : "\n <block type=\"looks_sayforsecs\">\n <value name=\"MESSAGE\">\n <shadow type=\"text\">\n <field name=\"TEXT\">".concat(hello, "</field>\n </shadow>\n </value>\n <value name=\"SECS\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">2</field>\n </shadow>\n </value>\n </block>\n <block type=\"looks_say\">\n <value name=\"MESSAGE\">\n <shadow type=\"text\">\n <field name=\"TEXT\">").concat(hello, "</field>\n </shadow>\n </value>\n </block>\n <block type=\"looks_thinkforsecs\">\n <value name=\"MESSAGE\">\n <shadow type=\"text\">\n <field name=\"TEXT\">").concat(hmm, "</field>\n </shadow>\n </value>\n <value name=\"SECS\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">2</field>\n </shadow>\n </value>\n </block>\n <block type=\"looks_think\">\n <value name=\"MESSAGE\">\n <shadow type=\"text\">\n <field name=\"TEXT\">").concat(hmm, "</field>\n </shadow>\n </value>\n </block>\n ").concat(blockSeparator, "\n "), "\n ").concat(isStage ? "\n <block type=\"looks_switchbackdropto\">\n <value name=\"BACKDROP\">\n <shadow type=\"looks_backdrops\">\n <field name=\"BACKDROP\">".concat(backdropName, "</field>\n </shadow>\n </value>\n </block>\n <block type=\"looks_switchbackdroptoandwait\">\n <value name=\"BACKDROP\">\n <shadow type=\"looks_backdrops\">\n <field name=\"BACKDROP\">").concat(backdropName, "</field>\n </shadow>\n </value>\n </block>\n <block type=\"looks_nextbackdrop\"/>\n ") : "\n <block id=\"".concat(targetId, "_switchcostumeto\" type=\"looks_switchcostumeto\">\n <value name=\"COSTUME\">\n <shadow type=\"looks_costume\">\n <field name=\"COSTUME\">").concat(costumeName, "</field>\n </shadow>\n </value>\n </block>\n <block type=\"looks_nextcostume\"/>\n <block type=\"looks_switchbackdropto\">\n <value name=\"BACKDROP\">\n <shadow type=\"looks_backdrops\">\n <field name=\"BACKDROP\">").concat(backdropName, "</field>\n </shadow>\n </value>\n </block>\n <block type=\"looks_nextbackdrop\"/>\n ").concat(blockSeparator, "\n <block type=\"looks_changesizeby\">\n <value name=\"CHANGE\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">10</field>\n </shadow>\n </value>\n </block>\n <block type=\"looks_setsizeto\">\n <value name=\"SIZE\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">100</field>\n </shadow>\n </value>\n </block>\n "), "\n ").concat(blockSeparator, "\n <block type=\"looks_changeeffectby\">\n <value name=\"CHANGE\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">25</field>\n </shadow>\n </value>\n </block>\n <block type=\"looks_seteffectto\">\n <value name=\"VALUE\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">0</field>\n </shadow>\n </value>\n </block>\n <block type=\"looks_cleargraphiceffects\"/>\n ").concat(blockSeparator, "\n ").concat(isStage ? '' : "\n <block type=\"looks_show\"/>\n <block type=\"looks_hide\"/>\n ".concat(blockSeparator, "\n <block type=\"looks_gotofrontback\"/>\n <block type=\"looks_goforwardbackwardlayers\">\n <value name=\"NUM\">\n <shadow type=\"math_integer\">\n <field name=\"NUM\">1</field>\n </shadow>\n </value>\n </block>\n "), "\n ").concat(isStage ? "\n <block id=\"backdropnumbername\" type=\"looks_backdropnumbername\"/>\n " : "\n <block id=\"".concat(targetId, "_costumenumbername\" type=\"looks_costumenumbername\"/>\n <block id=\"backdropnumbername\" type=\"looks_backdropnumbername\"/>\n <block id=\"").concat(targetId, "_size\" type=\"looks_size\"/>\n "), "\n ").concat(categorySeparator, "\n </category>\n ");
|
||
};
|
||
|
||
const sound = function sound(isInitialSetup, isStage, targetId, soundName) {
|
||
return "\n <category name=\"%{BKY_CATEGORY_SOUND}\" id=\"sound\" colour=\"#D65CD6\" secondaryColour=\"#BD42BD\">\n <block id=\"".concat(targetId, "_sound_playuntildone\" type=\"sound_playuntildone\">\n <value name=\"SOUND_MENU\">\n <shadow type=\"sound_sounds_menu\">\n <field name=\"SOUND_MENU\">").concat(soundName, "</field>\n </shadow>\n </value>\n </block>\n <block id=\"").concat(targetId, "_sound_play\" type=\"sound_play\">\n <value name=\"SOUND_MENU\">\n <shadow type=\"sound_sounds_menu\">\n <field name=\"SOUND_MENU\">").concat(soundName, "</field>\n </shadow>\n </value>\n </block>\n <block type=\"sound_stopallsounds\"/>\n ").concat(blockSeparator, "\n <block type=\"sound_changeeffectby\">\n <value name=\"VALUE\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">10</field>\n </shadow>\n </value>\n </block>\n <block type=\"sound_seteffectto\">\n <value name=\"VALUE\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">100</field>\n </shadow>\n </value>\n </block>\n <block type=\"sound_cleareffects\"/>\n ").concat(blockSeparator, "\n <block type=\"sound_changevolumeby\">\n <value name=\"VOLUME\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">-10</field>\n </shadow>\n </value>\n </block>\n <block type=\"sound_setvolumeto\">\n <value name=\"VOLUME\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">100</field>\n </shadow>\n </value>\n </block>\n <block id=\"").concat(targetId, "_volume\" type=\"sound_volume\"/>\n ").concat(categorySeparator, "\n </category>\n ");
|
||
};
|
||
|
||
const events = function events(isInitialSetup, isStage) {
|
||
return "\n <category name=\"%{BKY_CATEGORY_EVENTS}\" id=\"events\" colour=\"#FFD500\" secondaryColour=\"#CC9900\">\n <block type=\"event_whenflagclicked\"/>\n <block type=\"event_whenkeypressed\">\n </block>\n ".concat(isStage ? "\n <block type=\"event_whenstageclicked\"/>\n " : "\n <block type=\"event_whenthisspriteclicked\"/>\n ", "\n <block type=\"event_whenbackdropswitchesto\">\n </block>\n ").concat(blockSeparator, "\n <block type=\"event_whengreaterthan\">\n <value name=\"VALUE\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">10</field>\n </shadow>\n </value>\n </block>\n ").concat(blockSeparator, "\n <block type=\"event_whenbroadcastreceived\">\n </block>\n <block type=\"event_broadcast\">\n <value name=\"BROADCAST_INPUT\">\n <shadow type=\"event_broadcast_menu\"></shadow>\n </value>\n </block>\n <block type=\"event_broadcastandwait\">\n <value name=\"BROADCAST_INPUT\">\n <shadow type=\"event_broadcast_menu\"></shadow>\n </value>\n </block>\n ").concat(categorySeparator, "\n </category>\n ");
|
||
};
|
||
|
||
const control = function control(isInitialSetup, isStage) {
|
||
return "\n <category name=\"%{BKY_CATEGORY_CONTROL}\" id=\"control\" colour=\"#FFAB19\" secondaryColour=\"#CF8B17\">\n <block type=\"control_wait\">\n <value name=\"DURATION\">\n <shadow type=\"math_positive_number\">\n <field name=\"NUM\">1</field>\n </shadow>\n </value>\n </block>\n ".concat(blockSeparator, "\n <block type=\"control_repeat\">\n <value name=\"TIMES\">\n <shadow type=\"math_whole_number\">\n <field name=\"NUM\">10</field>\n </shadow>\n </value>\n </block>\n <block id=\"forever\" type=\"control_forever\"/>\n ").concat(blockSeparator, "\n <block type=\"control_if\"/>\n <block type=\"control_if_else\"/>\n <block id=\"wait_until\" type=\"control_wait_until\"/>\n <block id=\"repeat_until\" type=\"control_repeat_until\"/>\n <block id=\"while\" type=\"control_while\"/>\n ").concat(blockSeparator, "\n <block type=\"control_stop\"/>\n ").concat(blockSeparator, "\n ").concat(isStage ? "\n <block type=\"control_create_clone_of\">\n <value name=\"CLONE_OPTION\">\n <shadow type=\"control_create_clone_of_menu\"/>\n </value>\n </block>\n " : "\n <block type=\"control_start_as_clone\"/>\n <block type=\"control_create_clone_of\">\n <value name=\"CLONE_OPTION\">\n <shadow type=\"control_create_clone_of_menu\"/>\n </value>\n </block>\n <block type=\"control_delete_this_clone\"/>\n ", "\n ").concat(categorySeparator, "\n </category>\n ");
|
||
};
|
||
|
||
const sensing = function sensing(isInitialSetup, isStage) {
|
||
const name = translate('SENSING_ASK_TEXT', 'What\'s your name?');
|
||
return "\n <category name=\"%{BKY_CATEGORY_SENSING}\" id=\"sensing\" colour=\"#4CBFE6\" secondaryColour=\"#2E8EB8\">\n ".concat(isStage ? '' : "\n <block type=\"sensing_touchingobject\">\n <value name=\"TOUCHINGOBJECTMENU\">\n <shadow type=\"sensing_touchingobjectmenu\"/>\n </value>\n </block>\n <block type=\"sensing_touchingcolor\">\n <value name=\"COLOR\">\n <shadow type=\"colour_picker\"/>\n </value>\n </block>\n <block type=\"sensing_coloristouchingcolor\">\n <value name=\"COLOR\">\n <shadow type=\"colour_picker\"/>\n </value>\n <value name=\"COLOR2\">\n <shadow type=\"colour_picker\"/>\n </value>\n </block>\n <block type=\"sensing_distanceto\">\n <value name=\"DISTANCETOMENU\">\n <shadow type=\"sensing_distancetomenu\"/>\n </value>\n </block>\n ".concat(blockSeparator, "\n "), "\n ").concat(isInitialSetup ? '' : "\n <block id=\"askandwait\" type=\"sensing_askandwait\">\n <value name=\"QUESTION\">\n <shadow type=\"text\">\n <field name=\"TEXT\">".concat(name, "</field>\n </shadow>\n </value>\n </block>\n "), "\n <block id=\"answer\" type=\"sensing_answer\"/>\n ").concat(blockSeparator, "\n <block type=\"sensing_keypressed\">\n <value name=\"KEY_OPTION\">\n <shadow type=\"sensing_keyoptions\"/>\n </value>\n </block>\n <block type=\"sensing_mousedown\"/>\n <block type=\"sensing_mousex\"/>\n <block type=\"sensing_mousey\"/>\n ").concat(isStage ? '' : "\n ".concat(blockSeparator, "\n '<block type=\"sensing_setdragmode\" id=\"sensing_setdragmode\"></block>'+\n ").concat(blockSeparator, "\n "), "\n ").concat(blockSeparator, "\n <block id=\"loudness\" type=\"sensing_loudness\"/>\n ").concat(blockSeparator, "\n <block id=\"timer\" type=\"sensing_timer\"/>\n <block type=\"sensing_resettimer\"/>\n ").concat(blockSeparator, "\n <block id=\"of\" type=\"sensing_of\">\n <value name=\"OBJECT\">\n <shadow id=\"sensing_of_object_menu\" type=\"sensing_of_object_menu\"/>\n </value>\n </block>\n ").concat(blockSeparator, "\n <block id=\"current\" type=\"sensing_current\"/>\n <block type=\"sensing_dayssince2000\"/>\n ").concat(blockSeparator, "\n <block type=\"sensing_username\"/>\n ").concat(categorySeparator, "\n </category>\n ");
|
||
};
|
||
|
||
const operators = function operators(isInitialSetup) {
|
||
const apple = translate('OPERATORS_JOIN_APPLE', 'apple');
|
||
const banana = translate('OPERATORS_JOIN_BANANA', 'banana');
|
||
const letter = translate('OPERATORS_LETTEROF_APPLE', 'a');
|
||
return "\n <category name=\"%{BKY_CATEGORY_OPERATORS}\" id=\"operators\" colour=\"#40BF4A\" secondaryColour=\"#389438\">\n <block type=\"operator_add\">\n <value name=\"NUM1\">\n <shadow type=\"math_number\">\n <field name=\"NUM\"/>\n </shadow>\n </value>\n <value name=\"NUM2\">\n <shadow type=\"math_number\">\n <field name=\"NUM\"/>\n </shadow>\n </value>\n </block>\n <block type=\"operator_subtract\">\n <value name=\"NUM1\">\n <shadow type=\"math_number\">\n <field name=\"NUM\"/>\n </shadow>\n </value>\n <value name=\"NUM2\">\n <shadow type=\"math_number\">\n <field name=\"NUM\"/>\n </shadow>\n </value>\n </block>\n <block type=\"operator_multiply\">\n <value name=\"NUM1\">\n <shadow type=\"math_number\">\n <field name=\"NUM\"/>\n </shadow>\n </value>\n <value name=\"NUM2\">\n <shadow type=\"math_number\">\n <field name=\"NUM\"/>\n </shadow>\n </value>\n </block>\n <block type=\"operator_divide\">\n <value name=\"NUM1\">\n <shadow type=\"math_number\">\n <field name=\"NUM\"/>\n </shadow>\n </value>\n <value name=\"NUM2\">\n <shadow type=\"math_number\">\n <field name=\"NUM\"/>\n </shadow>\n </value>\n </block>\n ".concat(blockSeparator, "\n <block type=\"operator_random\">\n <value name=\"FROM\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">1</field>\n </shadow>\n </value>\n <value name=\"TO\">\n <shadow type=\"math_number\">\n <field name=\"NUM\">10</field>\n </shadow>\n </value>\n </block>\n ").concat(blockSeparator, "\n <block type=\"operator_gt\">\n <value name=\"OPERAND1\">\n <shadow type=\"text\">\n <field name=\"TEXT\"/>\n </shadow>\n </value>\n <value name=\"OPERAND2\">\n <shadow type=\"text\">\n <field name=\"TEXT\">50</field>\n </shadow>\n </value>\n </block>\n <block type=\"operator_lt\">\n <value name=\"OPERAND1\">\n <shadow type=\"text\">\n <field name=\"TEXT\"/>\n </shadow>\n </value>\n <value name=\"OPERAND2\">\n <shadow type=\"text\">\n <field name=\"TEXT\">50</field>\n </shadow>\n </value>\n </block>\n <block type=\"operator_equals\">\n <value name=\"OPERAND1\">\n <shadow type=\"text\">\n <field name=\"TEXT\"/>\n </shadow>\n </value>\n <value name=\"OPERAND2\">\n <shadow type=\"text\">\n <field name=\"TEXT\">50</field>\n </shadow>\n </value>\n </block>\n ").concat(blockSeparator, "\n <block type=\"operator_and\"/>\n <block type=\"operator_or\"/>\n <block type=\"operator_not\"/>\n ").concat(blockSeparator, "\n ").concat(isInitialSetup ? '' : "\n <block type=\"operator_join\">\n <value name=\"STRING1\">\n <shadow type=\"text\">\n <field name=\"TEXT\">".concat(apple, " </field>\n </shadow>\n </value>\n <value name=\"STRING2\">\n <shadow type=\"text\">\n <field name=\"TEXT\">").concat(banana, "</field>\n </shadow>\n </value>\n </block>\n <block type=\"operator_letter_of\">\n <value name=\"LETTER\">\n <shadow type=\"math_whole_number\">\n <field name=\"NUM\">1</field>\n </shadow>\n </value>\n <value name=\"STRING\">\n <shadow type=\"text\">\n <field name=\"TEXT\">").concat(apple, "</field>\n </shadow>\n </value>\n </block>\n <block type=\"operator_length\">\n <value name=\"STRING\">\n <shadow type=\"text\">\n <field name=\"TEXT\">").concat(apple, "</field>\n </shadow>\n </value>\n </block>\n <block type=\"operator_contains\" id=\"operator_contains\">\n <value name=\"STRING1\">\n <shadow type=\"text\">\n <field name=\"TEXT\">").concat(apple, "</field>\n </shadow>\n </value>\n <value name=\"STRING2\">\n <shadow type=\"text\">\n <field name=\"TEXT\">").concat(letter, "</field>\n </shadow>\n </value>\n </block>\n "), "\n ").concat(blockSeparator, "\n <block type=\"operator_mod\">\n <value name=\"NUM1\">\n <shadow type=\"math_number\">\n <field name=\"NUM\"/>\n </shadow>\n </value>\n <value name=\"NUM2\">\n <shadow type=\"math_number\">\n <field name=\"NUM\"/>\n </shadow>\n </value>\n </block>\n <block type=\"operator_round\">\n <value name=\"NUM\">\n <shadow type=\"math_number\">\n <field name=\"NUM\"/>\n </shadow>\n </value>\n </block>\n ").concat(blockSeparator, "\n <block type=\"operator_mathop\">\n <value name=\"NUM\">\n <shadow type=\"math_number\">\n <field name=\"NUM\"/>\n </shadow>\n </value>\n </block>\n ").concat(categorySeparator, "\n </category>\n ");
|
||
};
|
||
|
||
const variables = function variables() {
|
||
return "\n <category\n name=\"%{BKY_CATEGORY_VARIABLES}\"\n id=\"variables\"\n colour=\"#FF8C1A\"\n secondaryColour=\"#DB6E00\"\n custom=\"VARIABLE\">\n </category>\n ";
|
||
};
|
||
|
||
const myBlocks = function myBlocks() {
|
||
return "\n <category\n name=\"%{BKY_CATEGORY_MYBLOCKS}\"\n id=\"myBlocks\"\n colour=\"#FF6680\"\n secondaryColour=\"#FF4D6A\"\n custom=\"PROCEDURE\">\n </category>\n ";
|
||
}; // eslint-disable-next-line max-len
|
||
|
||
|
||
const extraTurboWarpBlocks = "\n<block type=\"argument_reporter_boolean\"><field name=\"VALUE\">is compiled?</field></block>\n<block type=\"argument_reporter_boolean\"><field name=\"VALUE\">is TurboWarp?</field></block>\n";
|
||
/* eslint-enable no-unused-vars */
|
||
|
||
const xmlOpen = '<xml style="display: none">';
|
||
const xmlClose = '</xml>';
|
||
/**
|
||
* @param {!boolean} isInitialSetup - Whether the toolbox is for initial setup. If the mode is "initial setup",
|
||
* blocks with localized default parameters (e.g. ask and wait) should not be loaded. (LLK/scratch-gui#5445)
|
||
* @param {?boolean} isStage - Whether the toolbox is for a stage-type target. This is always set to true
|
||
* when isInitialSetup is true.
|
||
* @param {?string} targetId - The current editing target
|
||
* @param {?Array.<object>} categoriesXML - optional array of `{id,xml}` for categories. This can include both core
|
||
* and other extensions: core extensions will be placed in the normal Scratch order; others will go at the bottom.
|
||
* @property {string} id - the extension / category ID.
|
||
* @property {string} xml - the `<category>...</category>` XML for this extension / category.
|
||
* @param {?string} costumeName - The name of the default selected costume dropdown.
|
||
* @param {?string} backdropName - The name of the default selected backdrop dropdown.
|
||
* @param {?string} soundName - The name of the default selected sound dropdown.
|
||
* @returns {string} - a ScratchBlocks-style XML document for the contents of the toolbox.
|
||
*/
|
||
|
||
const makeToolboxXML = function makeToolboxXML(isInitialSetup, isStage = true, targetId, categoriesXML = [], costumeName = '', backdropName = '', soundName = '') {
|
||
isStage = isInitialSetup || isStage;
|
||
const gap = [categorySeparator];
|
||
costumeName = xmlEscape(costumeName);
|
||
backdropName = xmlEscape(backdropName);
|
||
soundName = xmlEscape(soundName);
|
||
categoriesXML = categoriesXML.slice();
|
||
|
||
const moveCategory = categoryId => {
|
||
const index = categoriesXML.findIndex(categoryInfo => categoryInfo.id === categoryId);
|
||
|
||
if (index >= 0) {
|
||
// remove the category from categoriesXML and return its XML
|
||
const [categoryInfo] = categoriesXML.splice(index, 1);
|
||
return categoryInfo.xml;
|
||
} // return `undefined`
|
||
|
||
};
|
||
|
||
const motionXML = moveCategory('motion') || motion(isInitialSetup, isStage, targetId);
|
||
const looksXML = moveCategory('looks') || looks(isInitialSetup, isStage, targetId, costumeName, backdropName);
|
||
const soundXML = moveCategory('sound') || sound(isInitialSetup, isStage, targetId, soundName);
|
||
const eventsXML = moveCategory('event') || events(isInitialSetup, isStage, targetId);
|
||
const controlXML = moveCategory('control') || control(isInitialSetup, isStage, targetId);
|
||
const sensingXML = moveCategory('sensing') || sensing(isInitialSetup, isStage, targetId);
|
||
const operatorsXML = moveCategory('operators') || operators(isInitialSetup, isStage, targetId);
|
||
const variablesXML = moveCategory('data') || variables(isInitialSetup, isStage, targetId);
|
||
const myBlocksXML = moveCategory('procedures') || myBlocks(isInitialSetup, isStage, targetId); // Always display TurboWarp blocks as the first extension, if it exists,
|
||
// and also add an "is compiled?" block to the top.
|
||
|
||
let turbowarpXML = moveCategory('tw');
|
||
|
||
if (turbowarpXML && !turbowarpXML.includes(extraTurboWarpBlocks)) {
|
||
turbowarpXML = turbowarpXML.replace('<block', "".concat(extraTurboWarpBlocks, "<block"));
|
||
}
|
||
|
||
const everything = [xmlOpen, motionXML, gap, looksXML, gap, soundXML, gap, eventsXML, gap, controlXML, gap, sensingXML, gap, operatorsXML, gap, variablesXML, gap, myBlocksXML, gap];
|
||
|
||
if (turbowarpXML) {
|
||
everything.push(turbowarpXML);
|
||
}
|
||
|
||
for (const extensionCategory of categoriesXML) {
|
||
everything.push(gap, extensionCategory.xml);
|
||
}
|
||
|
||
everything.push(xmlClose);
|
||
return everything.join('\n');
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (makeToolboxXML);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/monitor-adapter.js":
|
||
/*!************************************!*\
|
||
!*** ./src/lib/monitor-adapter.js ***!
|
||
\************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _opcode_labels_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./opcode-labels.js */ "./src/lib/opcode-labels.js");
|
||
|
||
|
||
const isUndefined = a => typeof a === 'undefined';
|
||
/**
|
||
* Convert monitors from VM format to what the GUI needs to render.
|
||
* - Convert opcode to a label and a category
|
||
* @param {string} block.id - The id of the monitor block
|
||
* @param {string} block.spriteName - Present only if the monitor applies only to the sprite
|
||
* with given target ID. The name of the target sprite when the monitor was created
|
||
* @param {string} block.opcode - The opcode of the monitor
|
||
* @param {object} block.params - Extra params to the monitor block
|
||
* @param {string|number|Array} block.value - The monitor value
|
||
* @param {VirtualMachine} block.vm - the VM instance which owns the block
|
||
* @return {object} The adapted monitor with label and category
|
||
*/
|
||
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (function ({
|
||
id,
|
||
spriteName,
|
||
opcode,
|
||
params,
|
||
value,
|
||
vm
|
||
}) {
|
||
// Extension monitors get their labels from the Runtime through `getLabelForOpcode`.
|
||
// Other monitors' labels are hard-coded in `OpcodeLabels`.
|
||
let {
|
||
label,
|
||
category,
|
||
labelFn
|
||
} = vm && vm.runtime.getLabelForOpcode(opcode) || _opcode_labels_js__WEBPACK_IMPORTED_MODULE_0__["default"].getLabel(opcode); // Use labelFn if provided for dynamic labelling (e.g. variables)
|
||
|
||
if (!isUndefined(labelFn)) label = labelFn(params); // Append sprite name for sprite-specific monitors
|
||
|
||
if (spriteName) {
|
||
label = "".concat(spriteName, ": ").concat(label);
|
||
} // If value is a number, round it to six decimal places
|
||
|
||
|
||
if (typeof value === 'number') {
|
||
value = Number(value.toFixed(6));
|
||
} // Turn the value to a string, for handle boolean values
|
||
|
||
|
||
if (typeof value === 'boolean') {
|
||
value = value.toString();
|
||
} // Lists can contain booleans, which should also be turned to strings
|
||
|
||
|
||
if (Array.isArray(value)) {
|
||
value = value.slice();
|
||
|
||
for (let i = 0; i < value.length; i++) {
|
||
const item = value[i];
|
||
|
||
if (typeof item === 'boolean') {
|
||
value[i] = item.toString();
|
||
}
|
||
}
|
||
}
|
||
|
||
return {
|
||
id,
|
||
label,
|
||
category,
|
||
value
|
||
};
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/normalize.css":
|
||
/*!*******************************!*\
|
||
!*** ./src/lib/normalize.css ***!
|
||
\*******************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
var content = __webpack_require__(/*! !../../node_modules/css-loader??ref--5-1!../../node_modules/postcss-loader/src??postcss!./normalize.css */ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/lib/normalize.css");
|
||
|
||
if(typeof content === 'string') content = [[module.i, content, '']];
|
||
|
||
var transform;
|
||
var insertInto;
|
||
|
||
|
||
|
||
var options = {"hmr":true}
|
||
|
||
options.transform = transform
|
||
options.insertInto = undefined;
|
||
|
||
var update = __webpack_require__(/*! ../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
|
||
|
||
if(content.locals) module.exports = content.locals;
|
||
|
||
if(false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/opcode-labels.js":
|
||
/*!**********************************!*\
|
||
!*** ./src/lib/opcode-labels.js ***!
|
||
\**********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["defineMessages"])({
|
||
motion_direction: {
|
||
"id": "gui.opcodeLabels.direction",
|
||
"defaultMessage": "direction"
|
||
},
|
||
motion_xposition: {
|
||
"id": "gui.opcodeLabels.xposition",
|
||
"defaultMessage": "x position"
|
||
},
|
||
motion_yposition: {
|
||
"id": "gui.opcodeLabels.yposition",
|
||
"defaultMessage": "y position"
|
||
},
|
||
// Looks
|
||
looks_size: {
|
||
"id": "gui.opcodeLabels.size",
|
||
"defaultMessage": "size"
|
||
},
|
||
looks_costumename: {
|
||
"id": "gui.opcodeLabels.costumename",
|
||
"defaultMessage": "costume name"
|
||
},
|
||
looks_costumenumber: {
|
||
"id": "gui.opcodeLabels.costumenumber",
|
||
"defaultMessage": "costume number"
|
||
},
|
||
looks_backdropname: {
|
||
"id": "gui.opcodeLabels.backdropname",
|
||
"defaultMessage": "backdrop name"
|
||
},
|
||
looks_backdropnumber: {
|
||
"id": "gui.opcodeLabels.backdropnumber",
|
||
"defaultMessage": "backdrop number"
|
||
},
|
||
// Sound
|
||
sound_volume: {
|
||
"id": "gui.opcodeLabels.volume",
|
||
"defaultMessage": "volume"
|
||
},
|
||
sound_tempo: {
|
||
"id": "gui.opcodeLabels.tempo",
|
||
"defaultMessage": "tempo"
|
||
},
|
||
// Sensing
|
||
sensing_answer: {
|
||
"id": "gui.opcodeLabels.answer",
|
||
"defaultMessage": "answer"
|
||
},
|
||
sensing_mousedown: {
|
||
"id": "tw.opcode.mousedown",
|
||
"defaultMessage": "mouse down?"
|
||
},
|
||
sensing_mousex: {
|
||
"id": "tw.opcode.mousex",
|
||
"defaultMessage": "mouse x"
|
||
},
|
||
sensing_mousey: {
|
||
"id": "tw.opcode.mousey",
|
||
"defaultMessage": "mouse y"
|
||
},
|
||
sensing_loudness: {
|
||
"id": "gui.opcodeLabels.loudness",
|
||
"defaultMessage": "loudness"
|
||
},
|
||
sensing_username: {
|
||
"id": "gui.opcodeLabels.username",
|
||
"defaultMessage": "username"
|
||
},
|
||
sensing_current_year: {
|
||
"id": "gui.opcodeLabels.year",
|
||
"defaultMessage": "year"
|
||
},
|
||
sensing_current_month: {
|
||
"id": "gui.opcodeLabels.month",
|
||
"defaultMessage": "month"
|
||
},
|
||
sensing_current_date: {
|
||
"id": "gui.opcodeLabels.date",
|
||
"defaultMessage": "date"
|
||
},
|
||
sensing_current_dayofweek: {
|
||
"id": "gui.opcodeLabels.dayofweek",
|
||
"defaultMessage": "day of week"
|
||
},
|
||
sensing_current_hour: {
|
||
"id": "gui.opcodeLabels.hour",
|
||
"defaultMessage": "hour"
|
||
},
|
||
sensing_current_minute: {
|
||
"id": "gui.opcodeLabels.minute",
|
||
"defaultMessage": "minute"
|
||
},
|
||
sensing_current_second: {
|
||
"id": "gui.opcodeLabels.second",
|
||
"defaultMessage": "second"
|
||
},
|
||
sensing_timer: {
|
||
"id": "gui.opcodeLabels.timer",
|
||
"defaultMessage": "timer"
|
||
},
|
||
sensing_dayssince2000: {
|
||
"id": "tw.opcode.2000",
|
||
"defaultMessage": "days since 2000"
|
||
}
|
||
});
|
||
|
||
class OpcodeLabels {
|
||
constructor() {
|
||
/**
|
||
* Translation function for labels. By default just return the defaultMessage
|
||
* @private
|
||
* @param {object} message A message object compatible with react-intl formatMessage
|
||
* @return {string} Return the default string initially
|
||
*/
|
||
this._translator = message => message.defaultMessage;
|
||
/**
|
||
* Initial opcode map, with categories defined
|
||
* @private
|
||
*/
|
||
|
||
|
||
this._opcodeMap = {
|
||
// Motion
|
||
motion_direction: {
|
||
category: 'motion'
|
||
},
|
||
motion_xposition: {
|
||
category: 'motion'
|
||
},
|
||
motion_yposition: {
|
||
category: 'motion'
|
||
},
|
||
// Looks
|
||
looks_size: {
|
||
category: 'looks'
|
||
},
|
||
looks_costumenumbername: {
|
||
category: 'looks'
|
||
},
|
||
looks_backdropnumbername: {
|
||
category: 'looks'
|
||
},
|
||
looks_backdropname: {
|
||
category: 'looks'
|
||
},
|
||
// Data
|
||
data_variable: {
|
||
category: 'data'
|
||
},
|
||
data_listcontents: {
|
||
category: 'list'
|
||
},
|
||
// Sound
|
||
sound_volume: {
|
||
category: 'sound'
|
||
},
|
||
sound_tempo: {
|
||
category: 'sound'
|
||
},
|
||
// Sensing
|
||
sensing_answer: {
|
||
category: 'sensing'
|
||
},
|
||
sensing_mousedown: {
|
||
category: 'sensing'
|
||
},
|
||
sensing_mousex: {
|
||
category: 'sensing'
|
||
},
|
||
sensing_mousey: {
|
||
category: 'sensing'
|
||
},
|
||
sensing_loudness: {
|
||
category: 'sensing'
|
||
},
|
||
sensing_username: {
|
||
category: 'sensing'
|
||
},
|
||
sensing_current: {
|
||
category: 'sensing'
|
||
},
|
||
sensing_timer: {
|
||
category: 'sensing'
|
||
},
|
||
sensing_dayssince2000: {
|
||
category: 'sensing'
|
||
}
|
||
}; // Initialize opcodeMap with default strings
|
||
|
||
this._refreshOpcodeMap();
|
||
}
|
||
/**
|
||
* Set the translation function for monitor labels. The function should accept
|
||
* a message object as defined by react-intl defineMessages
|
||
* @param {function} translator the function to use for localization
|
||
*/
|
||
|
||
|
||
setTranslatorFunction(translator) {
|
||
this._translator = translator;
|
||
|
||
this._refreshOpcodeMap();
|
||
}
|
||
/**
|
||
* Internal function to update opcode Map when translation function is defined
|
||
* @private
|
||
*/
|
||
|
||
|
||
_refreshOpcodeMap() {
|
||
// Motion
|
||
this._opcodeMap.motion_direction.labelFn = () => this._translator(messages.motion_direction);
|
||
|
||
this._opcodeMap.motion_xposition.labelFn = () => this._translator(messages.motion_xposition);
|
||
|
||
this._opcodeMap.motion_yposition.labelFn = () => this._translator(messages.motion_yposition); // Looks
|
||
|
||
|
||
this._opcodeMap.looks_size.labelFn = () => this._translator(messages.looks_size);
|
||
|
||
this._opcodeMap.looks_costumenumbername.labelFn = params => {
|
||
if (params.NUMBER_NAME === 'number') {
|
||
return this._translator(messages.looks_costumenumber);
|
||
}
|
||
|
||
return this._translator(messages.looks_costumename);
|
||
};
|
||
|
||
this._opcodeMap.looks_backdropnumbername.labelFn = params => {
|
||
if (params.NUMBER_NAME === 'number') {
|
||
return this._translator(messages.looks_backdropnumber);
|
||
}
|
||
|
||
return this._translator(messages.looks_backdropname);
|
||
};
|
||
|
||
this._opcodeMap.looks_backdropname.labelFn = () => this._translator(messages.looks_backdropname); // Data
|
||
|
||
|
||
this._opcodeMap.data_variable.labelFn = params => params.VARIABLE;
|
||
|
||
this._opcodeMap.data_listcontents.labelFn = params => params.LIST; // Sound
|
||
|
||
|
||
this._opcodeMap.sound_volume.labelFn = () => this._translator(messages.sound_volume);
|
||
|
||
this._opcodeMap.sound_tempo.labelFn = () => this._translator(messages.sound_tempo); // Sensing
|
||
|
||
|
||
this._opcodeMap.sensing_answer.labelFn = () => this._translator(messages.sensing_answer);
|
||
|
||
this._opcodeMap.sensing_mousedown.labelFn = () => this._translator(messages.sensing_mousedown);
|
||
|
||
this._opcodeMap.sensing_mousex.labelFn = () => this._translator(messages.sensing_mousex);
|
||
|
||
this._opcodeMap.sensing_mousey.labelFn = () => this._translator(messages.sensing_mousey);
|
||
|
||
this._opcodeMap.sensing_loudness.labelFn = () => this._translator(messages.sensing_loudness);
|
||
|
||
this._opcodeMap.sensing_username.labelFn = () => this._translator(messages.sensing_username);
|
||
|
||
this._opcodeMap.sensing_current.labelFn = params => {
|
||
switch (params.CURRENTMENU.toLowerCase()) {
|
||
case 'year':
|
||
return this._translator(messages.sensing_current_year);
|
||
|
||
case 'month':
|
||
return this._translator(messages.sensing_current_month);
|
||
|
||
case 'date':
|
||
return this._translator(messages.sensing_current_date);
|
||
|
||
case 'dayofweek':
|
||
return this._translator(messages.sensing_current_dayofweek);
|
||
|
||
case 'hour':
|
||
return this._translator(messages.sensing_current_hour);
|
||
|
||
case 'minute':
|
||
return this._translator(messages.sensing_current_minute);
|
||
|
||
case 'second':
|
||
return this._translator(messages.sensing_current_second);
|
||
}
|
||
};
|
||
|
||
this._opcodeMap.sensing_timer.labelFn = () => this._translator(messages.sensing_timer);
|
||
|
||
this._opcodeMap.sensing_dayssince2000.labelFn = () => this._translator(messages.sensing_dayssince2000);
|
||
}
|
||
/**
|
||
* Return the label for an opcode
|
||
* @param {string} opcode the opcode you want a label for
|
||
* @return {object} object with label and category
|
||
*/
|
||
|
||
|
||
getLabel(opcode) {
|
||
if (opcode in this._opcodeMap) return this._opcodeMap[opcode];
|
||
return {
|
||
category: 'extension',
|
||
label: opcode
|
||
};
|
||
}
|
||
|
||
}
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (new OpcodeLabels());
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/project-fetcher-hoc.jsx":
|
||
/*!*****************************************!*\
|
||
!*** ./src/lib/project-fetcher-hoc.jsx ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ProjectFetcherHOC; });
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_project_changed__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/project-changed */ "./src/reducers/project-changed.js");
|
||
/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/project-state */ "./src/reducers/project-state.js");
|
||
/* harmony import */ var _reducers_editor_tab__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/editor-tab */ "./src/reducers/editor-tab.js");
|
||
/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./log */ "./src/lib/log.js");
|
||
/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./storage */ "./src/lib/storage.js");
|
||
/* harmony import */ var _tw_missing_project__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./tw-missing-project */ "./src/lib/tw-missing-project/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_11__);
|
||
/* harmony import */ var _components_loader_tw_progress_monitor__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../components/loader/tw-progress-monitor */ "./src/components/loader/tw-progress-monitor.js");
|
||
/* harmony import */ var _tw_project_meta_fetcher_hoc_jsx__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./tw-project-meta-fetcher-hoc.jsx */ "./src/lib/tw-project-meta-fetcher-hoc.jsx");
|
||
const _excluded = ["assetHost", "intl", "isLoadingProject", "loadingState", "onActivateTab", "onError", "onFetchedProjectData", "onProjectUnchanged", "projectHost", "projectId", "reduxProjectId", "setProjectId", "isFetchingWithId"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// TW: Temporary hack for project tokens
|
||
|
||
const fetchProjectToken = async projectId => {
|
||
if (projectId === '0') {
|
||
return null;
|
||
} // Parse ?token=abcdef
|
||
|
||
|
||
const searchParams = new URLSearchParams(location.search);
|
||
|
||
if (searchParams.has('token')) {
|
||
return searchParams.get('token');
|
||
} // Parse #1?token=abcdef
|
||
|
||
|
||
const hashParams = new URLSearchParams(location.hash.split('?')[1]);
|
||
|
||
if (hashParams.has('token')) {
|
||
return hashParams.get('token');
|
||
}
|
||
|
||
try {
|
||
const metadata = await Object(_tw_project_meta_fetcher_hoc_jsx__WEBPACK_IMPORTED_MODULE_13__["fetchProjectMeta"])(projectId);
|
||
return metadata.project_token;
|
||
} catch (e) {
|
||
_log__WEBPACK_IMPORTED_MODULE_8__["default"].error(e);
|
||
throw new Error('Cannot access project token. Project is probably unshared. See https://docs.turbowarp.org/unshared-projects');
|
||
}
|
||
};
|
||
/* Higher Order Component to provide behavior for loading projects by id. If
|
||
* there's no id, the default project is loaded.
|
||
* @param {React.Component} WrappedComponent component to receive projectData prop
|
||
* @returns {React.Component} component with project loading behavior
|
||
*/
|
||
|
||
|
||
const ProjectFetcherHOC = function ProjectFetcherHOC(WrappedComponent) {
|
||
class ProjectFetcherComponent extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default()(this, ['fetchProject']);
|
||
_storage__WEBPACK_IMPORTED_MODULE_9__["default"].setProjectHost(props.projectHost);
|
||
_storage__WEBPACK_IMPORTED_MODULE_9__["default"].setProjectToken(props.projectToken);
|
||
_storage__WEBPACK_IMPORTED_MODULE_9__["default"].setAssetHost(props.assetHost);
|
||
_storage__WEBPACK_IMPORTED_MODULE_9__["default"].setTranslatorFunction(props.intl.formatMessage); // props.projectId might be unset, in which case we use our default;
|
||
// or it may be set by an even higher HOC, and passed to us.
|
||
// Either way, we now know what the initial projectId should be, so
|
||
// set it in the redux store.
|
||
|
||
if (props.projectId !== '' && props.projectId !== null && typeof props.projectId !== 'undefined') {
|
||
this.props.setProjectId(props.projectId.toString());
|
||
}
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
if (prevProps.projectHost !== this.props.projectHost) {
|
||
_storage__WEBPACK_IMPORTED_MODULE_9__["default"].setProjectHost(this.props.projectHost);
|
||
}
|
||
|
||
if (prevProps.projectToken !== this.props.projectToken) {
|
||
_storage__WEBPACK_IMPORTED_MODULE_9__["default"].setProjectToken(this.props.projectToken);
|
||
}
|
||
|
||
if (prevProps.assetHost !== this.props.assetHost) {
|
||
_storage__WEBPACK_IMPORTED_MODULE_9__["default"].setAssetHost(this.props.assetHost);
|
||
}
|
||
|
||
if (this.props.isFetchingWithId && !prevProps.isFetchingWithId) {
|
||
this.fetchProject(this.props.reduxProjectId, this.props.loadingState);
|
||
}
|
||
|
||
if (this.props.isShowingProject && !prevProps.isShowingProject) {
|
||
this.props.onProjectUnchanged();
|
||
}
|
||
|
||
if (this.props.isShowingProject && (prevProps.isLoadingProject || prevProps.isCreatingNew)) {
|
||
this.props.onActivateTab(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_7__["BLOCKS_TAB_INDEX"]);
|
||
}
|
||
}
|
||
|
||
fetchProject(projectId, loadingState) {
|
||
// tw: clear and stop the VM before fetching
|
||
// these will also happen later after the project is fetched, but fetching may take a while and
|
||
// the project shouldn't be running while fetching the new project
|
||
this.props.vm.clear();
|
||
this.props.vm.stop();
|
||
let assetPromise; // In case running in node...
|
||
|
||
let projectUrl = typeof URLSearchParams === 'undefined' ? null : new URLSearchParams(location.search).get('project_url');
|
||
|
||
if (projectUrl) {
|
||
if (!projectUrl.startsWith('http:') && !projectUrl.startsWith('https:')) {
|
||
projectUrl = "https://".concat(projectUrl);
|
||
}
|
||
|
||
assetPromise = _components_loader_tw_progress_monitor__WEBPACK_IMPORTED_MODULE_12__["fetchWithProgress"](projectUrl).then(r => {
|
||
if (!r.ok) {
|
||
throw new Error("Request returned status ".concat(r.status));
|
||
}
|
||
|
||
return r.arrayBuffer();
|
||
}).then(buffer => ({
|
||
data: buffer
|
||
}));
|
||
} else {
|
||
// TW: Temporary hack for project tokens
|
||
assetPromise = fetchProjectToken(projectId).then(token => {
|
||
_storage__WEBPACK_IMPORTED_MODULE_9__["default"].setProjectToken(token);
|
||
return _storage__WEBPACK_IMPORTED_MODULE_9__["default"].load(_storage__WEBPACK_IMPORTED_MODULE_9__["default"].AssetType.Project, projectId, _storage__WEBPACK_IMPORTED_MODULE_9__["default"].DataFormat.JSON);
|
||
});
|
||
}
|
||
|
||
return assetPromise.then(projectAsset => {
|
||
// tw: If the project data appears to be HTML, then the result is probably an nginx 404 page,
|
||
// and the "missing project" project should be loaded instead.
|
||
// See: https://projects.scratch.mit.edu/9999999999999999999999
|
||
if (projectAsset && projectAsset.data) {
|
||
const firstChar = projectAsset.data[0];
|
||
|
||
if (firstChar === '<' || firstChar === '<'.charCodeAt(0)) {
|
||
return _storage__WEBPACK_IMPORTED_MODULE_9__["default"].load(_storage__WEBPACK_IMPORTED_MODULE_9__["default"].AssetType.Project, _tw_missing_project__WEBPACK_IMPORTED_MODULE_10__["MISSING_PROJECT_ID"], _storage__WEBPACK_IMPORTED_MODULE_9__["default"].DataFormat.JSON);
|
||
}
|
||
}
|
||
|
||
return projectAsset;
|
||
}).then(projectAsset => {
|
||
if (projectAsset) {
|
||
this.props.onFetchedProjectData(projectAsset.data, loadingState);
|
||
} else {
|
||
// Treat failure to load as an error
|
||
// Throw to be caught by catch later on
|
||
throw new Error('Could not find project');
|
||
}
|
||
}).catch(err => {
|
||
this.props.onError(err);
|
||
_log__WEBPACK_IMPORTED_MODULE_8__["default"].error(err);
|
||
});
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
assetHost,
|
||
intl,
|
||
isLoadingProject: isLoadingProjectProp,
|
||
loadingState,
|
||
onActivateTab,
|
||
onError: onErrorProp,
|
||
onFetchedProjectData: onFetchedProjectDataProp,
|
||
onProjectUnchanged,
|
||
projectHost,
|
||
projectId,
|
||
reduxProjectId,
|
||
setProjectId: setProjectIdProp,
|
||
|
||
/* eslint-enable no-unused-vars */
|
||
isFetchingWithId: isFetchingWithIdProp
|
||
} = _this$props,
|
||
componentProps = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(WrappedComponent, _extends({
|
||
fetchingProject: isFetchingWithIdProp
|
||
}, componentProps));
|
||
}
|
||
|
||
}
|
||
|
||
ProjectFetcherComponent.propTypes = {
|
||
assetHost: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
canSave: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_2__["intlShape"].isRequired,
|
||
isCreatingNew: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isFetchingWithId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isLoadingProject: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isShowingProject: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
loadingState: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(_reducers_project_state__WEBPACK_IMPORTED_MODULE_6__["LoadingStates"]),
|
||
onActivateTab: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onError: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onFetchedProjectData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onProjectUnchanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
projectHost: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
projectToken: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
projectId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number]),
|
||
reduxProjectId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number]),
|
||
setProjectId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_11___default.a)
|
||
};
|
||
ProjectFetcherComponent.defaultProps = {
|
||
assetHost: 'https://assets.scratch.mit.edu',
|
||
projectHost: 'https://projects.scratch.mit.edu'
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
isCreatingNew: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_6__["getIsCreatingNew"])(state.scratchGui.projectState.loadingState),
|
||
isFetchingWithId: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_6__["getIsFetchingWithId"])(state.scratchGui.projectState.loadingState),
|
||
isLoadingProject: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_6__["getIsLoading"])(state.scratchGui.projectState.loadingState),
|
||
isShowingProject: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_6__["getIsShowingProject"])(state.scratchGui.projectState.loadingState),
|
||
loadingState: state.scratchGui.projectState.loadingState,
|
||
reduxProjectId: state.scratchGui.projectState.projectId,
|
||
vm: state.scratchGui.vm
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onActivateTab: tab => dispatch(Object(_reducers_editor_tab__WEBPACK_IMPORTED_MODULE_7__["activateTab"])(tab)),
|
||
onError: error => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_6__["projectError"])(error)),
|
||
onFetchedProjectData: (projectData, loadingState) => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_6__["onFetchedProjectData"])(projectData, loadingState)),
|
||
setProjectId: projectId => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_6__["setProjectId"])(projectId)),
|
||
onProjectUnchanged: () => dispatch(Object(_reducers_project_changed__WEBPACK_IMPORTED_MODULE_5__["setProjectUnchanged"])())
|
||
}); // Allow incoming props to override redux-provided props. Used to mock in tests.
|
||
|
||
|
||
const mergeProps = (stateProps, dispatchProps, ownProps) => Object.assign({}, stateProps, dispatchProps, ownProps);
|
||
|
||
return Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_4__["connect"])(mapStateToProps, mapDispatchToProps, mergeProps)(ProjectFetcherComponent));
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/project-saver-hoc.jsx":
|
||
/*!***************************************!*\
|
||
!*** ./src/lib/project-saver-hoc.jsx ***!
|
||
\***************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ProjectSaverHOC; });
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _lib_collect_metadata__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/collect-metadata */ "./src/lib/collect-metadata.js");
|
||
/* harmony import */ var _lib_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/log */ "./src/lib/log.js");
|
||
/* harmony import */ var _lib_storage__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/storage */ "./src/lib/storage.js");
|
||
/* harmony import */ var _lib_data_uri_to_blob__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../lib/data-uri-to-blob */ "./src/lib/data-uri-to-blob.js");
|
||
/* harmony import */ var _lib_save_project_to_server__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../lib/save-project-to-server */ "./src/lib/save-project-to-server.js");
|
||
/* harmony import */ var _reducers_alerts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../reducers/alerts */ "./src/reducers/alerts.js");
|
||
/* harmony import */ var _reducers_timeout__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../reducers/timeout */ "./src/reducers/timeout.js");
|
||
/* harmony import */ var _reducers_project_changed__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../reducers/project-changed */ "./src/reducers/project-changed.js");
|
||
/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../reducers/project-state */ "./src/reducers/project-state.js");
|
||
const _excluded = ["autoSaveTimeoutId", "autoSaveIntervalSecs", "isCreatingCopy", "isCreatingNew", "projectChanged", "isAnyCreatingNewState", "isLoading", "isManualUpdating", "isRemixing", "isShowingSaveable", "isShowingWithId", "isShowingWithoutId", "isUpdating", "loadingState", "onAutoUpdateProject", "onCreatedProject", "onCreateProject", "onProjectError", "onRemixing", "onSetProjectUnchanged", "onSetProjectThumbnailer", "onSetProjectSaver", "onShowAlert", "onShowCopySuccessAlert", "onShowRemixSuccessAlert", "onShowCreatingCopyAlert", "onShowCreatingRemixAlert", "onShowSaveSuccessAlert", "onShowSavingAlert", "onUpdatedProject", "onUpdateProjectData", "onUpdateProjectThumbnail", "reduxProjectId", "reduxProjectTitle", "setAutoSaveTimeoutId"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/**
|
||
* Higher Order Component to provide behavior for saving projects.
|
||
* @param {React.Component} WrappedComponent the component to add project saving functionality to
|
||
* @returns {React.Component} WrappedComponent with project saving functionality added
|
||
*
|
||
* <ProjectSaverHOC>
|
||
* <WrappedComponent />
|
||
* </ProjectSaverHOC>
|
||
*/
|
||
|
||
const ProjectSaverHOC = function ProjectSaverHOC(WrappedComponent) {
|
||
class ProjectSaverComponent extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['getProjectThumbnail', 'leavePageConfirm', 'tryToAutoSave']);
|
||
}
|
||
|
||
componentWillMount() {
|
||
if (typeof window === 'object') {
|
||
// Note: it might be better to use a listener instead of assigning onbeforeunload;
|
||
// but then it'd be hard to turn this listening off in our tests
|
||
window.onbeforeunload = e => this.leavePageConfirm(e);
|
||
} // Allow the GUI consumer to pass in a function to receive a trigger
|
||
// for triggering thumbnail or whole project saves.
|
||
// These functions are called with null on unmount to prevent stale references.
|
||
|
||
|
||
this.props.onSetProjectThumbnailer(this.getProjectThumbnail);
|
||
this.props.onSetProjectSaver(this.tryToAutoSave);
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
if (!this.props.isAnyCreatingNewState && prevProps.isAnyCreatingNewState) {
|
||
this.reportTelemetryEvent('projectWasCreated');
|
||
}
|
||
|
||
if (!this.props.isLoading && prevProps.isLoading) {
|
||
this.reportTelemetryEvent('projectDidLoad');
|
||
}
|
||
|
||
if (this.props.projectChanged && !prevProps.projectChanged) {
|
||
this.scheduleAutoSave();
|
||
}
|
||
|
||
if (this.props.isUpdating && !prevProps.isUpdating) {
|
||
this.updateProjectToStorage();
|
||
}
|
||
|
||
if (this.props.isCreatingNew && !prevProps.isCreatingNew) {
|
||
this.createNewProjectToStorage();
|
||
}
|
||
|
||
if (this.props.isCreatingCopy && !prevProps.isCreatingCopy) {
|
||
this.createCopyToStorage();
|
||
}
|
||
|
||
if (this.props.isRemixing && !prevProps.isRemixing) {
|
||
this.props.onRemixing(true);
|
||
this.createRemixToStorage();
|
||
} else if (!this.props.isRemixing && prevProps.isRemixing) {
|
||
this.props.onRemixing(false);
|
||
} // see if we should "create" the current project on the server
|
||
//
|
||
// don't try to create or save immediately after trying to create
|
||
|
||
|
||
if (prevProps.isCreatingNew) return; // if we're newly able to create this project, create it!
|
||
|
||
if (this.isShowingCreatable(this.props) && !this.isShowingCreatable(prevProps)) {
|
||
this.props.onCreateProject();
|
||
} // see if we should save/update the current project on the server
|
||
//
|
||
// don't try to save immediately after trying to save
|
||
|
||
|
||
if (prevProps.isUpdating) return; // if we're newly able to save this project, save it!
|
||
|
||
const becameAbleToSave = this.props.canSave && !prevProps.canSave;
|
||
const becameShared = this.props.isShared && !prevProps.isShared;
|
||
|
||
if (this.props.isShowingSaveable && (becameAbleToSave || becameShared)) {
|
||
this.props.onAutoUpdateProject();
|
||
}
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.clearAutoSaveTimeout(); // Cant unset the beforeunload because it might no longer belong to this component
|
||
// i.e. if another of this component has been mounted before this one gets unmounted
|
||
// which happens when going from project to editor view.
|
||
// window.onbeforeunload = undefined; // eslint-disable-line no-undefined
|
||
// Remove project thumbnailer function since the components are unmounting
|
||
|
||
this.props.onSetProjectThumbnailer(null);
|
||
this.props.onSetProjectSaver(null);
|
||
}
|
||
|
||
leavePageConfirm(e) {
|
||
if (this.props.projectChanged) {
|
||
// both methods of returning a value may be necessary for browser compatibility
|
||
(e || window.event).returnValue = true;
|
||
return true;
|
||
}
|
||
|
||
return; // Returning undefined prevents the prompt from coming up
|
||
}
|
||
|
||
clearAutoSaveTimeout() {
|
||
if (this.props.autoSaveTimeoutId !== null) {
|
||
clearTimeout(this.props.autoSaveTimeoutId);
|
||
this.props.setAutoSaveTimeoutId(null);
|
||
}
|
||
}
|
||
|
||
scheduleAutoSave() {
|
||
if (this.props.isShowingSaveable && this.props.autoSaveTimeoutId === null) {
|
||
const timeoutId = setTimeout(this.tryToAutoSave, this.props.autoSaveIntervalSecs * 1000);
|
||
this.props.setAutoSaveTimeoutId(timeoutId);
|
||
}
|
||
}
|
||
|
||
tryToAutoSave() {
|
||
if (this.props.projectChanged && this.props.isShowingSaveable) {
|
||
this.props.onAutoUpdateProject();
|
||
}
|
||
}
|
||
|
||
isShowingCreatable(props) {
|
||
return props.canCreateNew && props.isShowingWithoutId;
|
||
}
|
||
|
||
updateProjectToStorage() {
|
||
this.props.onShowSavingAlert();
|
||
return this.storeProject(this.props.reduxProjectId).then(() => {
|
||
// there's an http response object available here, but we don't need to examine
|
||
// it, because there are no values contained in it that we care about
|
||
this.props.onUpdatedProject(this.props.loadingState);
|
||
this.props.onShowSaveSuccessAlert();
|
||
}).catch(err => {
|
||
// Always show the savingError alert because it gives the
|
||
// user the chance to download or retry the save manually.
|
||
this.props.onShowAlert('savingError');
|
||
this.props.onProjectError(err);
|
||
});
|
||
}
|
||
|
||
createNewProjectToStorage() {
|
||
return this.storeProject(null).then(response => {
|
||
this.props.onCreatedProject(response.id.toString(), this.props.loadingState);
|
||
}).catch(err => {
|
||
this.props.onShowAlert('creatingError');
|
||
this.props.onProjectError(err);
|
||
});
|
||
}
|
||
|
||
createCopyToStorage() {
|
||
this.props.onShowCreatingCopyAlert();
|
||
return this.storeProject(null, {
|
||
originalId: this.props.reduxProjectId,
|
||
isCopy: 1,
|
||
title: this.props.reduxProjectTitle
|
||
}).then(response => {
|
||
this.props.onCreatedProject(response.id.toString(), this.props.loadingState);
|
||
this.props.onShowCopySuccessAlert();
|
||
}).catch(err => {
|
||
this.props.onShowAlert('creatingError');
|
||
this.props.onProjectError(err);
|
||
});
|
||
}
|
||
|
||
createRemixToStorage() {
|
||
this.props.onShowCreatingRemixAlert();
|
||
return this.storeProject(null, {
|
||
originalId: this.props.reduxProjectId,
|
||
isRemix: 1,
|
||
title: this.props.reduxProjectTitle
|
||
}).then(response => {
|
||
this.props.onCreatedProject(response.id.toString(), this.props.loadingState);
|
||
this.props.onShowRemixSuccessAlert();
|
||
}).catch(err => {
|
||
this.props.onShowAlert('creatingError');
|
||
this.props.onProjectError(err);
|
||
});
|
||
}
|
||
/**
|
||
* storeProject:
|
||
* @param {number|string|undefined} projectId - defined value will PUT/update; undefined/null will POST/create
|
||
* @return {Promise} - resolves with json object containing project's existing or new id
|
||
* @param {?object} requestParams - object of params to add to request body
|
||
*/
|
||
|
||
|
||
storeProject(projectId, requestParams) {
|
||
requestParams = requestParams || {};
|
||
this.clearAutoSaveTimeout(); // Serialize VM state now before embarking on
|
||
// the asynchronous journey of storing assets to
|
||
// the server. This ensures that assets don't update
|
||
// while in the process of saving a project (e.g. the
|
||
// serialized project refers to a newer asset than what
|
||
// we just finished saving).
|
||
|
||
const savedVMState = this.props.vm.toJSON();
|
||
return Promise.all(this.props.vm.assets.filter(asset => !asset.clean).map(asset => _lib_storage__WEBPACK_IMPORTED_MODULE_7__["default"].store(asset.assetType, asset.dataFormat, asset.data, asset.assetId).then(response => {
|
||
// Asset servers respond with {status: ok} for successful POSTs
|
||
if (response.status !== 'ok') {
|
||
// Errors include a `code` property, e.g. "Forbidden"
|
||
return Promise.reject(response.code);
|
||
}
|
||
|
||
asset.clean = true;
|
||
}))).then(() => this.props.onUpdateProjectData(projectId, savedVMState, requestParams)).then(response => {
|
||
this.props.onSetProjectUnchanged();
|
||
const id = response.id.toString();
|
||
|
||
if (id && this.props.onUpdateProjectThumbnail) {
|
||
this.storeProjectThumbnail(id);
|
||
}
|
||
|
||
this.reportTelemetryEvent('projectDidSave');
|
||
return response;
|
||
}).catch(err => {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_6__["default"].error(err);
|
||
throw err; // pass the error up the chain
|
||
});
|
||
}
|
||
/**
|
||
* Store a snapshot of the project once it has been saved/created.
|
||
* Needs to happen _after_ save because the project must have an ID.
|
||
* @param {!string} projectId - id of the project, must be defined.
|
||
*/
|
||
|
||
|
||
storeProjectThumbnail(projectId) {
|
||
try {
|
||
this.getProjectThumbnail(dataURI => {
|
||
this.props.onUpdateProjectThumbnail(projectId, Object(_lib_data_uri_to_blob__WEBPACK_IMPORTED_MODULE_8__["default"])(dataURI));
|
||
});
|
||
} catch (e) {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_6__["default"].error('Project thumbnail save error', e); // This is intentionally fire/forget because a failure
|
||
// to save the thumbnail is not vitally important to the user.
|
||
}
|
||
}
|
||
|
||
getProjectThumbnail(callback) {
|
||
this.props.vm.postIOData('video', {
|
||
forceTransparentPreview: true
|
||
});
|
||
this.props.vm.renderer.requestSnapshot(dataURI => {
|
||
this.props.vm.postIOData('video', {
|
||
forceTransparentPreview: false
|
||
});
|
||
callback(dataURI);
|
||
});
|
||
this.props.vm.renderer.draw();
|
||
}
|
||
/**
|
||
* Report a telemetry event.
|
||
* @param {string} event - one of `projectWasCreated`, `projectDidLoad`, `projectDidSave`, `projectWasUploaded`
|
||
*/
|
||
// TODO make a telemetry HOC and move this stuff there
|
||
|
||
|
||
reportTelemetryEvent(event) {
|
||
try {
|
||
if (this.props.onProjectTelemetryEvent) {
|
||
const metadata = Object(_lib_collect_metadata__WEBPACK_IMPORTED_MODULE_5__["default"])(this.props.vm, this.props.reduxProjectTitle, this.props.locale);
|
||
this.props.onProjectTelemetryEvent(event, metadata);
|
||
}
|
||
} catch (e) {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_6__["default"].error('Telemetry error', event, e); // This is intentionally fire/forget because a failure
|
||
// to report telemetry should not block saving
|
||
}
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
autoSaveTimeoutId,
|
||
autoSaveIntervalSecs,
|
||
isCreatingCopy,
|
||
isCreatingNew,
|
||
projectChanged,
|
||
isAnyCreatingNewState,
|
||
isLoading,
|
||
isManualUpdating,
|
||
isRemixing,
|
||
isShowingSaveable,
|
||
isShowingWithId,
|
||
isShowingWithoutId,
|
||
isUpdating,
|
||
loadingState,
|
||
onAutoUpdateProject,
|
||
onCreatedProject,
|
||
onCreateProject,
|
||
onProjectError,
|
||
onRemixing,
|
||
onSetProjectUnchanged,
|
||
onSetProjectThumbnailer,
|
||
onSetProjectSaver,
|
||
onShowAlert,
|
||
onShowCopySuccessAlert,
|
||
onShowRemixSuccessAlert,
|
||
onShowCreatingCopyAlert,
|
||
onShowCreatingRemixAlert,
|
||
onShowSaveSuccessAlert,
|
||
onShowSavingAlert,
|
||
onUpdatedProject,
|
||
onUpdateProjectData,
|
||
onUpdateProjectThumbnail,
|
||
reduxProjectId,
|
||
reduxProjectTitle,
|
||
setAutoSaveTimeoutId: setAutoSaveTimeoutIdProp
|
||
} = _this$props,
|
||
componentProps = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(WrappedComponent, _extends({
|
||
isCreating: isAnyCreatingNewState
|
||
}, componentProps));
|
||
}
|
||
|
||
}
|
||
|
||
ProjectSaverComponent.propTypes = {
|
||
autoSaveIntervalSecs: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number.isRequired,
|
||
autoSaveTimeoutId: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,
|
||
canCreateNew: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
canSave: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isAnyCreatingNewState: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isCreatingCopy: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isCreatingNew: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isLoading: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isManualUpdating: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isRemixing: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isShared: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isShowingSaveable: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isShowingWithId: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isShowingWithoutId: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isUpdating: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
loadingState: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["LoadingStates"]),
|
||
locale: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string.isRequired,
|
||
onAutoUpdateProject: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onCreateProject: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onCreatedProject: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onProjectError: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onProjectTelemetryEvent: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onRemixing: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onSetProjectSaver: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onSetProjectThumbnailer: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onSetProjectUnchanged: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onShowAlert: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onShowCopySuccessAlert: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onShowCreatingCopyAlert: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onShowCreatingRemixAlert: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onShowRemixSuccessAlert: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onShowSaveSuccessAlert: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onShowSavingAlert: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onUpdateProjectData: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
onUpdateProjectThumbnail: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onUpdatedProject: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
projectChanged: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
reduxProjectId: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number]),
|
||
reduxProjectTitle: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,
|
||
setAutoSaveTimeoutId: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a).isRequired
|
||
};
|
||
ProjectSaverComponent.defaultProps = {
|
||
autoSaveIntervalSecs: 120,
|
||
onRemixing: () => {},
|
||
onSetProjectThumbnailer: () => {},
|
||
onSetProjectSaver: () => {},
|
||
onUpdateProjectData: _lib_save_project_to_server__WEBPACK_IMPORTED_MODULE_9__["default"]
|
||
};
|
||
|
||
const mapStateToProps = (state, ownProps) => {
|
||
const loadingState = state.scratchGui.projectState.loadingState;
|
||
const isShowingWithId = Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["getIsShowingWithId"])(loadingState);
|
||
return {
|
||
autoSaveTimeoutId: state.scratchGui.timeout.autoSaveTimeoutId,
|
||
isAnyCreatingNewState: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["getIsAnyCreatingNewState"])(loadingState),
|
||
isLoading: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["getIsLoading"])(loadingState),
|
||
isCreatingCopy: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["getIsCreatingCopy"])(loadingState),
|
||
isCreatingNew: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["getIsCreatingNew"])(loadingState),
|
||
isRemixing: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["getIsRemixing"])(loadingState),
|
||
isShowingSaveable: ownProps.canSave && isShowingWithId,
|
||
isShowingWithId: isShowingWithId,
|
||
isShowingWithoutId: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["getIsShowingWithoutId"])(loadingState),
|
||
isUpdating: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["getIsUpdating"])(loadingState),
|
||
isManualUpdating: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["getIsManualUpdating"])(loadingState),
|
||
loadingState: loadingState,
|
||
locale: state.locales.locale,
|
||
projectChanged: state.scratchGui.projectChanged,
|
||
reduxProjectId: state.scratchGui.projectState.projectId,
|
||
reduxProjectTitle: state.scratchGui.projectTitle,
|
||
vm: state.scratchGui.vm
|
||
};
|
||
};
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onAutoUpdateProject: () => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["autoUpdateProject"])()),
|
||
onCreatedProject: (projectId, loadingState) => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["doneCreatingProject"])(projectId, loadingState)),
|
||
onCreateProject: () => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["createProject"])()),
|
||
onProjectError: error => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["projectError"])(error)),
|
||
onSetProjectUnchanged: () => dispatch(Object(_reducers_project_changed__WEBPACK_IMPORTED_MODULE_12__["setProjectUnchanged"])()),
|
||
onShowAlert: alertType => dispatch(Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_10__["showStandardAlert"])(alertType)),
|
||
onShowCopySuccessAlert: () => Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_10__["showAlertWithTimeout"])(dispatch, 'createCopySuccess'),
|
||
onShowRemixSuccessAlert: () => Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_10__["showAlertWithTimeout"])(dispatch, 'createRemixSuccess'),
|
||
onShowCreatingCopyAlert: () => Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_10__["showAlertWithTimeout"])(dispatch, 'creatingCopy'),
|
||
onShowCreatingRemixAlert: () => Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_10__["showAlertWithTimeout"])(dispatch, 'creatingRemix'),
|
||
onShowSaveSuccessAlert: () => Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_10__["showAlertWithTimeout"])(dispatch, 'saveSuccess'),
|
||
onShowSavingAlert: () => Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_10__["showAlertWithTimeout"])(dispatch, 'saving'),
|
||
onUpdatedProject: loadingState => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_13__["doneUpdatingProject"])(loadingState)),
|
||
setAutoSaveTimeoutId: id => dispatch(Object(_reducers_timeout__WEBPACK_IMPORTED_MODULE_11__["setAutoSaveTimeoutId"])(id))
|
||
}); // Allow incoming props to override redux-provided props. Used to mock in tests.
|
||
|
||
|
||
const mergeProps = (stateProps, dispatchProps, ownProps) => Object.assign({}, stateProps, dispatchProps, ownProps);
|
||
|
||
return Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps, mergeProps)(ProjectSaverComponent);
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/query-parser-hoc.jsx":
|
||
/*!**************************************!*\
|
||
!*** ./src/lib/query-parser-hoc.jsx ***!
|
||
\**************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return QueryParserHOC; });
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var query_string__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! query-string */ "./node_modules/query-string/index.js");
|
||
/* harmony import */ var query_string__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(query_string__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _tutorial_from_url__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tutorial-from-url */ "./src/lib/tutorial-from-url.js");
|
||
/* harmony import */ var _reducers_cards__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/cards */ "./src/reducers/cards.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
const _excluded = ["onOpenTipsLibrary", "onUpdateReduxDeck"];
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/* Higher Order Component to get parameters from the URL query string and initialize redux state
|
||
* @param {React.Component} WrappedComponent: component to render
|
||
* @returns {React.Component} component with query parsing behavior
|
||
*/
|
||
|
||
const QueryParserHOC = function QueryParserHOC(WrappedComponent) {
|
||
class QueryParserComponent extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
const queryParams = query_string__WEBPACK_IMPORTED_MODULE_2___default.a.parse(location.search);
|
||
const tutorialId = Object(_tutorial_from_url__WEBPACK_IMPORTED_MODULE_4__["detectTutorialId"])(queryParams);
|
||
|
||
if (tutorialId) {
|
||
if (tutorialId === 'all') {
|
||
this.openTutorials();
|
||
} else {
|
||
this.setActiveCards(tutorialId);
|
||
}
|
||
}
|
||
}
|
||
|
||
setActiveCards(tutorialId) {
|
||
this.props.onUpdateReduxDeck(tutorialId);
|
||
}
|
||
|
||
openTutorials() {
|
||
this.props.onOpenTipsLibrary();
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
onOpenTipsLibrary,
|
||
// eslint-disable-line no-unused-vars
|
||
onUpdateReduxDeck
|
||
} = _this$props,
|
||
componentProps = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(WrappedComponent, componentProps);
|
||
}
|
||
|
||
}
|
||
|
||
QueryParserComponent.propTypes = {
|
||
onOpenTipsLibrary: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onUpdateReduxDeck: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onOpenTipsLibrary: () => {
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_6__["openTipsLibrary"])());
|
||
},
|
||
onUpdateReduxDeck: tutorialId => {
|
||
dispatch(Object(_reducers_cards__WEBPACK_IMPORTED_MODULE_5__["activateDeck"])(tutorialId));
|
||
}
|
||
});
|
||
|
||
return Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(null, mapDispatchToProps)(QueryParserComponent);
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/randomize-sprite-position.js":
|
||
/*!**********************************************!*\
|
||
!*** ./src/lib/randomize-sprite-position.js ***!
|
||
\**********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
const randomizeSpritePosition = spriteObject => {
|
||
// https://github.com/LLK/scratch-flash/blob/689f3c79a7e8b2e98f5be80056d877f303a8d8ba/src/Scratch.as#L1385
|
||
spriteObject.x = Math.floor(200 * Math.random() - 100);
|
||
spriteObject.y = Math.floor(100 * Math.random() - 50);
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (randomizeSpritePosition);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/save-project-to-server.js":
|
||
/*!*******************************************!*\
|
||
!*** ./src/lib/save-project-to-server.js ***!
|
||
\*******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var query_string__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! query-string */ "./node_modules/query-string/index.js");
|
||
/* harmony import */ var query_string__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(query_string__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var xhr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! xhr */ "./node_modules/xhr/index.js");
|
||
/* harmony import */ var xhr__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(xhr__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _lib_storage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/storage */ "./src/lib/storage.js");
|
||
|
||
|
||
|
||
/**
|
||
* Save a project JSON to the project server.
|
||
* This should eventually live in scratch-www.
|
||
* @param {number} projectId the ID of the project, null if a new project.
|
||
* @param {object} vmState the JSON project representation.
|
||
* @param {object} params the request params.
|
||
* @property {?number} params.originalId the original project ID if a copy/remix.
|
||
* @property {?boolean} params.isCopy a flag indicating if this save is creating a copy.
|
||
* @property {?boolean} params.isRemix a flag indicating if this save is creating a remix.
|
||
* @property {?string} params.title the title of the project.
|
||
* @return {Promise} A promise that resolves when the network request resolves.
|
||
*/
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (function (projectId, vmState, params) {
|
||
const opts = {
|
||
body: vmState,
|
||
// If we set json:true then the body is double-stringified, so don't
|
||
headers: {
|
||
'Content-Type': 'application/json'
|
||
},
|
||
withCredentials: true
|
||
};
|
||
const creatingProject = projectId === null || typeof projectId === 'undefined';
|
||
const queryParams = {};
|
||
if (params.hasOwnProperty('originalId')) queryParams.original_id = params.originalId;
|
||
if (params.hasOwnProperty('isCopy')) queryParams.is_copy = params.isCopy;
|
||
if (params.hasOwnProperty('isRemix')) queryParams.is_remix = params.isRemix;
|
||
if (params.hasOwnProperty('title')) queryParams.title = params.title;
|
||
let qs = query_string__WEBPACK_IMPORTED_MODULE_0___default.a.stringify(queryParams);
|
||
if (qs) qs = "?".concat(qs);
|
||
|
||
if (creatingProject) {
|
||
Object.assign(opts, {
|
||
method: 'post',
|
||
url: "".concat(_lib_storage__WEBPACK_IMPORTED_MODULE_2__["default"].projectHost, "/").concat(qs)
|
||
});
|
||
} else {
|
||
Object.assign(opts, {
|
||
method: 'put',
|
||
url: "".concat(_lib_storage__WEBPACK_IMPORTED_MODULE_2__["default"].projectHost, "/").concat(projectId).concat(qs)
|
||
});
|
||
}
|
||
|
||
return new Promise((resolve, reject) => {
|
||
xhr__WEBPACK_IMPORTED_MODULE_1___default()(opts, (err, response) => {
|
||
if (err) return reject(err);
|
||
if (response.statusCode !== 200) return reject(response.statusCode);
|
||
let body;
|
||
|
||
try {
|
||
// Since we didn't set json: true, we have to parse manually
|
||
body = JSON.parse(response.body);
|
||
} catch (e) {
|
||
return reject(e);
|
||
}
|
||
|
||
body.id = projectId;
|
||
|
||
if (creatingProject) {
|
||
body.id = body['content-name'];
|
||
}
|
||
|
||
resolve(body);
|
||
});
|
||
});
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/sb-file-uploader-hoc.jsx":
|
||
/*!******************************************!*\
|
||
!*** ./src/lib/sb-file-uploader-hoc.jsx ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SBFileUploaderHOC; });
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _lib_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/log */ "./src/lib/log.js");
|
||
/* harmony import */ var _shared_messages__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./shared-messages */ "./src/lib/shared-messages.js");
|
||
/* harmony import */ var _tw_filesystem_api__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tw-filesystem-api */ "./src/lib/tw-filesystem-api.js");
|
||
/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../reducers/tw */ "./src/reducers/tw.js");
|
||
/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../reducers/project-state */ "./src/reducers/project-state.js");
|
||
/* harmony import */ var _reducers_project_title__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../reducers/project-title */ "./src/reducers/project-title.js");
|
||
/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../reducers/modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _reducers_menus__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../reducers/menus */ "./src/reducers/menus.js");
|
||
const _excluded = ["cancelFileUpload", "closeFileMenu", "isLoadingUpload", "isShowingWithoutId", "loadingState", "onLoadingFinished", "onLoadingStarted", "onSetFileHandle", "onSetProjectTitle", "projectChanged", "requestProjectUpload", "userOwnsProject"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
loadError: {
|
||
"id": "tw.loadError",
|
||
"defaultMessage": "Could not load project: {error}"
|
||
}
|
||
});
|
||
/**
|
||
* Higher Order Component to provide behavior for loading local project files into editor.
|
||
* @param {React.Component} WrappedComponent the component to add project file loading functionality to
|
||
* @returns {React.Component} WrappedComponent with project file loading functionality added
|
||
*
|
||
* <SBFileUploaderHOC>
|
||
* <WrappedComponent />
|
||
* </SBFileUploaderHOC>
|
||
*/
|
||
|
||
const SBFileUploaderHOC = function SBFileUploaderHOC(WrappedComponent) {
|
||
class SBFileUploaderComponent extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['createFileObjects', 'getProjectTitleFromFilename', 'handleFinishedLoadingUpload', 'handleStartSelectingFileUpload', 'handleChange', 'onload', 'removeFileObjects']); // tw: We have multiple instances of this HOC alive at a time. This flag fixes issues that arise from that.
|
||
|
||
this.expectingFileUploadFinish = false;
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
if (this.props.isLoadingUpload && !prevProps.isLoadingUpload && this.expectingFileUploadFinish) {
|
||
this.handleFinishedLoadingUpload(); // cue step 5 below
|
||
}
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.removeFileObjects();
|
||
} // step 1: this is where the upload process begins
|
||
|
||
|
||
handleStartSelectingFileUpload() {
|
||
this.expectingFileUploadFinish = true;
|
||
this.createFileObjects(); // go to step 2
|
||
} // step 2: create a FileReader and an <input> element, and issue a
|
||
// pseudo-click to it. That will open the file chooser dialog.
|
||
|
||
|
||
createFileObjects() {
|
||
// redo step 7, in case it got skipped last time and its objects are
|
||
// still in memory
|
||
this.removeFileObjects(); // create fileReader
|
||
|
||
this.fileReader = new FileReader();
|
||
this.fileReader.onload = this.onload; // tw: Use FS API when available
|
||
|
||
if (_tw_filesystem_api__WEBPACK_IMPORTED_MODULE_7__["default"].available()) {
|
||
(async () => {
|
||
try {
|
||
const handle = await _tw_filesystem_api__WEBPACK_IMPORTED_MODULE_7__["default"].showOpenFilePicker();
|
||
const file = await handle.getFile();
|
||
this.handleChange({
|
||
target: {
|
||
files: [file],
|
||
handle: handle
|
||
}
|
||
});
|
||
} catch (err) {
|
||
// If the user aborted it, that's not an error.
|
||
if (err && err.name === 'AbortError') {
|
||
return;
|
||
} // eslint-disable-next-line no-console
|
||
|
||
|
||
console.error(err);
|
||
}
|
||
})();
|
||
} else {
|
||
// create <input> element and add it to DOM
|
||
this.inputElement = document.createElement('input');
|
||
this.inputElement.accept = '.sb,.sb2,.sb3';
|
||
this.inputElement.style = 'display: none;';
|
||
this.inputElement.type = 'file';
|
||
this.inputElement.onchange = this.handleChange; // connects to step 3
|
||
|
||
document.body.appendChild(this.inputElement); // simulate a click to open file chooser dialog
|
||
|
||
this.inputElement.click();
|
||
}
|
||
} // step 3: user has picked a file using the file chooser dialog.
|
||
// We don't actually load the file here, we only decide whether to do so.
|
||
|
||
|
||
handleChange(e) {
|
||
const {
|
||
intl,
|
||
isShowingWithoutId,
|
||
loadingState,
|
||
projectChanged,
|
||
userOwnsProject
|
||
} = this.props;
|
||
const thisFileInput = e.target;
|
||
|
||
if (thisFileInput.files) {
|
||
// Don't attempt to load if no file was selected
|
||
this.fileToUpload = thisFileInput.files[0]; // If user owns the project, or user has changed the project,
|
||
// we must confirm with the user that they really intend to
|
||
// replace it. (If they don't own the project and haven't
|
||
// changed it, no need to confirm.)
|
||
|
||
let uploadAllowed = true;
|
||
|
||
if (userOwnsProject || projectChanged && isShowingWithoutId) {
|
||
uploadAllowed = confirm( // eslint-disable-line no-alert
|
||
intl.formatMessage(_shared_messages__WEBPACK_IMPORTED_MODULE_6__["default"].replaceProjectWarning));
|
||
}
|
||
|
||
if (uploadAllowed) {
|
||
// Don't update file handle until after confirming replace.
|
||
const handle = thisFileInput.handle;
|
||
|
||
if (handle) {
|
||
if (this.fileToUpload.name.endsWith('.sb3')) {
|
||
this.props.onSetFileHandle(handle);
|
||
} else {
|
||
this.props.onSetFileHandle(null);
|
||
}
|
||
} // cues step 4
|
||
|
||
|
||
this.props.requestProjectUpload(loadingState);
|
||
} else {
|
||
// skips ahead to step 7
|
||
this.removeFileObjects();
|
||
}
|
||
|
||
this.props.closeFileMenu();
|
||
}
|
||
} // step 4 is below, in mapDispatchToProps
|
||
// step 5: called from componentDidUpdate when project state shows
|
||
// that project data has finished "uploading" into the browser
|
||
|
||
|
||
handleFinishedLoadingUpload() {
|
||
this.expectingFileUploadFinish = false;
|
||
|
||
if (this.fileToUpload && this.fileReader) {
|
||
// begin to read data from the file. When finished,
|
||
// cues step 6 using the reader's onload callback
|
||
this.fileReader.readAsArrayBuffer(this.fileToUpload);
|
||
} else {
|
||
this.props.cancelFileUpload(this.props.loadingState); // skip ahead to step 7
|
||
|
||
this.removeFileObjects();
|
||
}
|
||
} // used in step 6 below
|
||
|
||
|
||
getProjectTitleFromFilename(fileInputFilename) {
|
||
if (!fileInputFilename) return ''; // only parse title with valid scratch project extensions
|
||
// (.sb, .sb2, and .sb3)
|
||
|
||
const matches = fileInputFilename.match(/^(.*)\.sb[23]?$/);
|
||
if (!matches) return '';
|
||
return matches[1].substring(0, 100); // truncate project title to max 100 chars
|
||
} // step 6: attached as a handler on our FileReader object; called when
|
||
// file upload raw data is available in the reader
|
||
|
||
|
||
onload() {
|
||
if (this.fileReader) {
|
||
this.props.onLoadingStarted();
|
||
const filename = this.fileToUpload && this.fileToUpload.name;
|
||
let loadingSuccess = false; // tw: stop when loading new project
|
||
|
||
this.props.vm.stop();
|
||
this.props.vm.loadProject(this.fileReader.result).then(() => {
|
||
if (filename) {
|
||
const uploadedProjectTitle = this.getProjectTitleFromFilename(filename);
|
||
this.props.onSetProjectTitle(uploadedProjectTitle);
|
||
}
|
||
|
||
this.props.vm.renderer.draw();
|
||
loadingSuccess = true;
|
||
}).catch(error => {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_5__["default"].warn(error); // eslint-disable-next-line no-alert
|
||
|
||
alert(this.props.intl.formatMessage(messages.loadError, {
|
||
error: "".concat(error)
|
||
}));
|
||
}).then(() => {
|
||
this.props.onLoadingFinished(this.props.loadingState, loadingSuccess); // go back to step 7: whether project loading succeeded
|
||
// or failed, reset file objects
|
||
|
||
this.removeFileObjects();
|
||
});
|
||
}
|
||
} // step 7: remove the <input> element from the DOM and clear reader and
|
||
// fileToUpload reference, so those objects can be garbage collected
|
||
|
||
|
||
removeFileObjects() {
|
||
if (this.inputElement) {
|
||
this.inputElement.value = null;
|
||
document.body.removeChild(this.inputElement);
|
||
}
|
||
|
||
this.inputElement = null;
|
||
this.fileReader = null;
|
||
this.fileToUpload = null;
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
cancelFileUpload,
|
||
closeFileMenu: closeFileMenuProp,
|
||
isLoadingUpload,
|
||
isShowingWithoutId,
|
||
loadingState,
|
||
onLoadingFinished,
|
||
onLoadingStarted,
|
||
onSetFileHandle,
|
||
onSetProjectTitle,
|
||
projectChanged,
|
||
requestProjectUpload: requestProjectUploadProp,
|
||
userOwnsProject
|
||
} = _this$props,
|
||
componentProps = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(WrappedComponent, _extends({
|
||
onStartSelectingFileUpload: this.handleStartSelectingFileUpload
|
||
}, componentProps)));
|
||
}
|
||
|
||
}
|
||
|
||
SBFileUploaderComponent.propTypes = {
|
||
canSave: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
cancelFileUpload: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
closeFileMenu: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"].isRequired,
|
||
isLoadingUpload: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isShowingProject: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
isShowingWithoutId: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
loadingState: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_reducers_project_state__WEBPACK_IMPORTED_MODULE_9__["LoadingStates"]),
|
||
onLoadingFinished: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onLoadingStarted: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
onSetProjectTitle: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
projectChanged: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
requestProjectUpload: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
userOwnsProject: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({
|
||
loadProject: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,
|
||
stop: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func
|
||
}),
|
||
onSetFileHandle: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func
|
||
};
|
||
|
||
const mapStateToProps = (state, ownProps) => {
|
||
const loadingState = state.scratchGui.projectState.loadingState;
|
||
const user = state.session && state.session.session && state.session.session.user;
|
||
return {
|
||
isLoadingUpload: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_9__["getIsLoadingUpload"])(loadingState),
|
||
isShowingProject: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_9__["getIsShowingProject"])(loadingState),
|
||
isShowingWithoutId: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_9__["getIsShowingWithoutId"])(loadingState),
|
||
loadingState: loadingState,
|
||
projectChanged: state.scratchGui.projectChanged,
|
||
userOwnsProject: ownProps.authorUsername && user && ownProps.authorUsername === user.username,
|
||
vm: state.scratchGui.vm
|
||
};
|
||
};
|
||
|
||
const mapDispatchToProps = (dispatch, ownProps) => ({
|
||
cancelFileUpload: loadingState => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_9__["onLoadedProject"])(loadingState, false, false)),
|
||
closeFileMenu: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_12__["closeFileMenu"])()),
|
||
// transition project state from loading to regular, and close
|
||
// loading screen and file menu
|
||
onLoadingFinished: (loadingState, success) => {
|
||
dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_9__["onLoadedProject"])(loadingState, ownProps.canSave, success));
|
||
dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_11__["closeLoadingProject"])());
|
||
dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_12__["closeFileMenu"])());
|
||
},
|
||
// show project loading screen
|
||
onLoadingStarted: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_11__["openLoadingProject"])()),
|
||
onSetProjectTitle: title => dispatch(Object(_reducers_project_title__WEBPACK_IMPORTED_MODULE_10__["setProjectTitle"])(title)),
|
||
// step 4: transition the project state so we're ready to handle the new
|
||
// project data. When this is done, the project state transition will be
|
||
// noticed by componentDidUpdate()
|
||
requestProjectUpload: loadingState => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_9__["requestProjectUpload"])(loadingState)),
|
||
onSetFileHandle: fileHandle => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_8__["setFileHandle"])(fileHandle))
|
||
}); // Allow incoming props to override redux-provided props. Used to mock in tests.
|
||
|
||
|
||
const mergeProps = (stateProps, dispatchProps, ownProps) => Object.assign({}, stateProps, dispatchProps, ownProps);
|
||
|
||
return Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_4__["connect"])(mapStateToProps, mapDispatchToProps, mergeProps)(SBFileUploaderComponent));
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/screen-utils.js":
|
||
/*!*********************************!*\
|
||
!*** ./src/lib/screen-utils.js ***!
|
||
\*********************************/
|
||
/*! exports provided: getStageDimensions, getMinWidth, resolveStageSize, stageSizeToTransform */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getStageDimensions", function() { return getStageDimensions; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMinWidth", function() { return getMinWidth; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resolveStageSize", function() { return resolveStageSize; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stageSizeToTransform", function() { return stageSizeToTransform; });
|
||
/* harmony import */ var _lib_layout_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib/layout-constants */ "./src/lib/layout-constants.js");
|
||
|
||
const maxScaleParam = typeof URLSearchParams !== 'undefined' && new URLSearchParams(location.search).get('scale');
|
||
/**
|
||
* @typedef {object} StageDimensions
|
||
* @property {int} height - the height to be used for the stage in the current situation.
|
||
* @property {int} width - the width to be used for the stage in the current situation.
|
||
* @property {number} scale - the scale factor from the stage's default size to its current size.
|
||
* @property {int} heightDefault - the height of the stage in its default (large) size.
|
||
* @property {int} widthDefault - the width of the stage in its default (large) size.
|
||
*/
|
||
|
||
const STAGE_DIMENSION_DEFAULTS = {
|
||
// referencing css/units.css,
|
||
// spacingBorderAdjustment = 2 * $full-screen-top-bottom-margin +
|
||
// 2 * $full-screen-border-width
|
||
fullScreenSpacingBorderAdjustment: 12,
|
||
// referencing css/units.css,
|
||
// menuHeightAdjustment = $stage-menu-height
|
||
menuHeightAdjustment: 44
|
||
};
|
||
/**
|
||
* Resolve the current GUI and browser state to an actual stage size enum value.
|
||
* @param {STAGE_SIZE_MODES} stageSizeMode - the state of the stage size toggle button.
|
||
* @param {boolean} isFullSize - true if the window is large enough for the large stage at its full size.
|
||
* @return {STAGE_DISPLAY_SIZES} - the stage size enum value we should use in this situation.
|
||
*/
|
||
|
||
const resolveStageSize = (stageSizeMode, isFullSize) => {
|
||
if (stageSizeMode === _lib_layout_constants__WEBPACK_IMPORTED_MODULE_0__["STAGE_SIZE_MODES"].small) {
|
||
return _lib_layout_constants__WEBPACK_IMPORTED_MODULE_0__["STAGE_DISPLAY_SIZES"].small;
|
||
}
|
||
|
||
if (isFullSize) {
|
||
return _lib_layout_constants__WEBPACK_IMPORTED_MODULE_0__["STAGE_DISPLAY_SIZES"].large;
|
||
}
|
||
|
||
return _lib_layout_constants__WEBPACK_IMPORTED_MODULE_0__["STAGE_DISPLAY_SIZES"].largeConstrained;
|
||
};
|
||
/**
|
||
* Retrieve info used to determine the actual stage size based on the current GUI and browser state.
|
||
* @param {STAGE_DISPLAY_SIZES} stageSize - the current fully-resolved stage size.
|
||
* @param {{width: number, height: number}} customStageSize Custom stage size
|
||
* @param {boolean} isFullScreen - true if full-screen mode is enabled.
|
||
* @return {StageDimensions} - an object describing the dimensions of the stage.
|
||
*/
|
||
|
||
|
||
const getStageDimensions = (stageSize, customStageSize, isFullScreen) => {
|
||
const stageDimensions = {
|
||
heightDefault: customStageSize.height,
|
||
widthDefault: customStageSize.width,
|
||
height: 0,
|
||
width: 0,
|
||
scale: 0
|
||
};
|
||
|
||
if (isFullScreen) {
|
||
stageDimensions.height = window.innerHeight - STAGE_DIMENSION_DEFAULTS.menuHeightAdjustment - STAGE_DIMENSION_DEFAULTS.fullScreenSpacingBorderAdjustment;
|
||
stageDimensions.width = stageDimensions.height * (customStageSize.width / customStageSize.height);
|
||
const maxWidth = maxScaleParam ? Math.min(window.innerWidth, maxScaleParam * customStageSize.width) : window.innerWidth;
|
||
|
||
if (stageDimensions.width > maxWidth) {
|
||
stageDimensions.width = maxWidth;
|
||
stageDimensions.height = stageDimensions.width * (customStageSize.height / customStageSize.width);
|
||
}
|
||
|
||
stageDimensions.scale = stageDimensions.width / stageDimensions.widthDefault;
|
||
} else {
|
||
stageDimensions.scale = _lib_layout_constants__WEBPACK_IMPORTED_MODULE_0__["STAGE_DISPLAY_SCALES"][stageSize];
|
||
stageDimensions.height = stageDimensions.scale * stageDimensions.heightDefault;
|
||
stageDimensions.width = stageDimensions.scale * stageDimensions.widthDefault;
|
||
} // Round off dimensions to prevent resampling/blurriness
|
||
|
||
|
||
stageDimensions.height = Math.round(stageDimensions.height);
|
||
stageDimensions.width = Math.round(stageDimensions.width);
|
||
return stageDimensions;
|
||
};
|
||
|
||
const getMinWidth = stageSize => _lib_layout_constants__WEBPACK_IMPORTED_MODULE_0__["STAGE_DISPLAY_SCALES"][stageSize] * 480;
|
||
/**
|
||
* Take a pair of sizes for the stage (a target height and width and a default height and width),
|
||
* calculate the ratio between them, and return a CSS transform to scale to that ratio.
|
||
* @param {object} sizeInfo An object containing dimensions of the target and default stage sizes.
|
||
* @param {number} sizeInfo.width The target width
|
||
* @param {number} sizeInfo.height The target height
|
||
* @param {number} sizeInfo.widthDefault The default width
|
||
* @param {number} sizeInfo.heightDefault The default height
|
||
* @returns {object} the CSS transform
|
||
*/
|
||
|
||
|
||
const stageSizeToTransform = ({
|
||
width,
|
||
height,
|
||
widthDefault,
|
||
heightDefault
|
||
}) => {
|
||
const scaleX = width / widthDefault;
|
||
const scaleY = height / heightDefault;
|
||
|
||
if (scaleX === 1 && scaleY === 1) {
|
||
// Do not set a transform if the scale is 1 because
|
||
// it messes up `position: fixed` elements like the context menu.
|
||
return;
|
||
}
|
||
|
||
return {
|
||
transform: "scale(".concat(scaleX, ",").concat(scaleY, ")")
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/shared-messages.js":
|
||
/*!************************************!*\
|
||
!*** ./src/lib/shared-messages.js ***!
|
||
\************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["defineMessages"])({
|
||
backdrop: {
|
||
"id": "gui.sharedMessages.backdrop",
|
||
"defaultMessage": "backdrop{index}"
|
||
},
|
||
costume: {
|
||
"id": "gui.sharedMessages.costume",
|
||
"defaultMessage": "costume{index}"
|
||
},
|
||
sprite: {
|
||
"id": "gui.sharedMessages.sprite",
|
||
"defaultMessage": "Sprite{index}"
|
||
},
|
||
pop: {
|
||
"id": "gui.sharedMessages.pop",
|
||
"defaultMessage": "pop"
|
||
},
|
||
replaceProjectWarning: {
|
||
"id": "gui.sharedMessages.replaceProjectWarning",
|
||
"defaultMessage": "Replace contents of the current project?"
|
||
},
|
||
loadFromComputerTitle: {
|
||
"id": "gui.sharedMessages.loadFromComputerTitle",
|
||
"defaultMessage": "Load from your computer"
|
||
}
|
||
}));
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/sortable-hoc.jsx":
|
||
/*!**********************************!*\
|
||
!*** ./src/lib/sortable-hoc.jsx ***!
|
||
\**********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _drag_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./drag-utils */ "./src/lib/drag-utils.js");
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const SortableHOC = function SortableHOC(WrappedComponent) {
|
||
class SortableWrapper extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['setRef', 'handleAddSortable', 'handleRemoveSortable']);
|
||
this.sortableRefs = [];
|
||
this.boxes = null;
|
||
this.ref = null;
|
||
this.containerBox = null;
|
||
}
|
||
|
||
componentWillReceiveProps(newProps) {
|
||
if (newProps.dragInfo.dragging && !this.props.dragInfo.dragging) {
|
||
// Drag just started, snapshot the sorted bounding boxes for sortables.
|
||
this.boxes = this.sortableRefs.map(el => el && el.getBoundingClientRect());
|
||
this.boxes.sort((a, b) => {
|
||
// Sort top-to-bottom, left-to-right (in LTR) / right-to-left (in RTL).
|
||
if (a.top === b.top) return (a.left - b.left) * (this.props.isRtl ? -1 : 1);
|
||
return a.top - b.top;
|
||
});
|
||
|
||
if (!this.ref) {
|
||
throw new Error('The containerRef must be assigned to the sortable area');
|
||
}
|
||
|
||
this.containerBox = this.ref.getBoundingClientRect();
|
||
} else if (!newProps.dragInfo.dragging && this.props.dragInfo.dragging) {
|
||
const newIndex = this.getMouseOverIndex();
|
||
|
||
if (newIndex !== null) {
|
||
this.props.onDrop(Object.assign({}, this.props.dragInfo, {
|
||
newIndex
|
||
}));
|
||
}
|
||
}
|
||
}
|
||
|
||
handleAddSortable(node) {
|
||
this.sortableRefs.push(node);
|
||
}
|
||
|
||
handleRemoveSortable(node) {
|
||
const index = this.sortableRefs.indexOf(node);
|
||
this.sortableRefs = this.sortableRefs.slice(0, index).concat(this.sortableRefs.slice(index + 1));
|
||
}
|
||
|
||
getOrdering(items, draggingIndex, newIndex) {
|
||
// An "Ordering" is an array of indices, where the position array value corresponds
|
||
// to the position of the item in props.items, and the index of the value
|
||
// is the index at which the item should appear.
|
||
// That is, if props.items is ['a', 'b', 'c', 'd'], and we want the GUI to display
|
||
// ['b', 'c', 'a, 'd'], the value of "ordering" would be [1, 2, 0, 3].
|
||
// This mapping is used because it is easy to translate to flexbox ordering,
|
||
// the `order` property for item N is ordering.indexOf(N).
|
||
// If the user-facing order matches props.items, the ordering is just [0, 1, 2, ...]
|
||
let ordering = Array(this.props.items.length).fill(0).map((_, i) => i);
|
||
|
||
const isNumber = v => typeof v === 'number' && !isNaN(v);
|
||
|
||
if (isNumber(draggingIndex) && isNumber(newIndex)) {
|
||
ordering = ordering.slice(0, draggingIndex).concat(ordering.slice(draggingIndex + 1));
|
||
ordering.splice(newIndex, 0, draggingIndex);
|
||
}
|
||
|
||
return ordering;
|
||
}
|
||
|
||
getMouseOverIndex() {
|
||
// MouseOverIndex is the index that the current drag wants to place the
|
||
// the dragging object. Obviously only exists if there is a drag (i.e. currentOffset).
|
||
// Return null if outside the container, zero if there are no boxes.
|
||
let mouseOverIndex = null;
|
||
|
||
if (this.props.dragInfo.currentOffset) {
|
||
const {
|
||
x,
|
||
y
|
||
} = this.props.dragInfo.currentOffset;
|
||
const {
|
||
top,
|
||
left,
|
||
bottom,
|
||
right
|
||
} = this.containerBox;
|
||
|
||
if (x >= left && x <= right && y >= top && y <= bottom) {
|
||
if (this.boxes.length === 0) {
|
||
mouseOverIndex = 0;
|
||
} else {
|
||
mouseOverIndex = Object(_drag_utils__WEBPACK_IMPORTED_MODULE_4__["indexForPositionOnList"])(this.props.dragInfo.currentOffset, this.boxes, this.props.isRtl);
|
||
}
|
||
}
|
||
}
|
||
|
||
return mouseOverIndex;
|
||
}
|
||
|
||
setRef(el) {
|
||
this.ref = el;
|
||
}
|
||
|
||
render() {
|
||
const {
|
||
dragInfo: {
|
||
index: dragIndex,
|
||
dragType
|
||
},
|
||
items
|
||
} = this.props;
|
||
const mouseOverIndex = this.getMouseOverIndex();
|
||
const ordering = this.getOrdering(items, dragIndex, mouseOverIndex);
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(WrappedComponent, _extends({
|
||
containerRef: this.setRef,
|
||
draggingIndex: dragIndex,
|
||
draggingType: dragType,
|
||
mouseOverIndex: mouseOverIndex,
|
||
ordering: ordering,
|
||
onAddSortable: this.handleAddSortable,
|
||
onRemoveSortable: this.handleRemoveSortable
|
||
}, this.props));
|
||
}
|
||
|
||
}
|
||
|
||
SortableWrapper.propTypes = {
|
||
dragInfo: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
currentOffset: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
x: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
y: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
}),
|
||
dragType: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
dragging: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
index: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
}),
|
||
items: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
url: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired
|
||
})),
|
||
onClose: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onDrop: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
isRtl: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
dragInfo: state.scratchGui.assetDrag,
|
||
isRtl: state.locales.isRtl
|
||
});
|
||
|
||
const mapDispatchToProps = () => ({});
|
||
|
||
return Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(SortableWrapper);
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (SortableHOC);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/storage.js":
|
||
/*!****************************!*\
|
||
!*** ./src/lib/storage.js ***!
|
||
\****************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var scratch_storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! scratch-storage */ "./node_modules/scratch-storage/src/index.js");
|
||
/* harmony import */ var scratch_storage__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(scratch_storage__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _default_project__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./default-project */ "./src/lib/default-project/index.js");
|
||
/* harmony import */ var _tw_missing_project__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tw-missing-project */ "./src/lib/tw-missing-project/index.js");
|
||
|
||
|
||
|
||
/**
|
||
* Wrapper for ScratchStorage which adds default web sources.
|
||
* @todo make this more configurable
|
||
*/
|
||
|
||
class Storage extends scratch_storage__WEBPACK_IMPORTED_MODULE_0___default.a {
|
||
constructor() {
|
||
super();
|
||
this.cacheDefaultProject();
|
||
}
|
||
|
||
addOfficialScratchWebStores() {
|
||
this.addWebStore([this.AssetType.Project], this.getProjectGetConfig.bind(this), this.getProjectCreateConfig.bind(this), this.getProjectUpdateConfig.bind(this));
|
||
this.addWebStore([this.AssetType.ImageVector, this.AssetType.ImageBitmap, this.AssetType.Sound], this.getAssetGetConfig.bind(this), // We set both the create and update configs to the same method because
|
||
// storage assumes it should update if there is an assetId, but the
|
||
// asset store uses the assetId as part of the create URI.
|
||
this.getAssetCreateConfig.bind(this), this.getAssetCreateConfig.bind(this));
|
||
}
|
||
|
||
setProjectHost(projectHost) {
|
||
this.projectHost = projectHost;
|
||
}
|
||
|
||
setProjectToken(projectToken) {
|
||
this.projectToken = projectToken;
|
||
}
|
||
|
||
getProjectGetConfig(projectAsset) {
|
||
const path = "".concat(this.projectHost, "/").concat(projectAsset.assetId);
|
||
const qs = this.projectToken ? "?token=".concat(this.projectToken) : '';
|
||
return path + qs;
|
||
}
|
||
|
||
getProjectCreateConfig() {
|
||
return {
|
||
url: "".concat(this.projectHost, "/"),
|
||
withCredentials: true
|
||
};
|
||
}
|
||
|
||
getProjectUpdateConfig(projectAsset) {
|
||
return {
|
||
url: "".concat(this.projectHost, "/").concat(projectAsset.assetId),
|
||
withCredentials: true
|
||
};
|
||
}
|
||
|
||
setAssetHost(assetHost) {
|
||
this.assetHost = assetHost;
|
||
}
|
||
|
||
getAssetGetConfig(asset) {
|
||
return "".concat(this.assetHost, "/internalapi/asset/").concat(asset.assetId, ".").concat(asset.dataFormat, "/get/");
|
||
}
|
||
|
||
getAssetCreateConfig(asset) {
|
||
return {
|
||
// There is no such thing as updating assets, but storage assumes it
|
||
// should update if there is an assetId, and the asset store uses the
|
||
// assetId as part of the create URI. So, force the method to POST.
|
||
// Then when storage finds this config to use for the "update", still POSTs
|
||
method: 'post',
|
||
url: "".concat(this.assetHost, "/").concat(asset.assetId, ".").concat(asset.dataFormat),
|
||
withCredentials: true
|
||
};
|
||
}
|
||
|
||
setTranslatorFunction(translator) {
|
||
this.translator = translator;
|
||
this.cacheDefaultProject();
|
||
}
|
||
|
||
cacheDefaultProject() {
|
||
const defaultProjectAssets = Object(_default_project__WEBPACK_IMPORTED_MODULE_1__["default"])(this.translator);
|
||
defaultProjectAssets.forEach(asset => this.builtinHelper._store(this.AssetType[asset.assetType], this.DataFormat[asset.dataFormat], asset.data, asset.id));
|
||
const missingProjectAssets = Object(_tw_missing_project__WEBPACK_IMPORTED_MODULE_2__["default"])(this.translator);
|
||
missingProjectAssets.forEach(asset => this.builtinHelper._store(this.AssetType[asset.assetType], this.DataFormat[asset.dataFormat], asset.data, asset.id));
|
||
}
|
||
|
||
}
|
||
|
||
const storage = new Storage();
|
||
/* harmony default export */ __webpack_exports__["default"] = (storage);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/supported-browser.js":
|
||
/*!**************************************!*\
|
||
!*** ./src/lib/supported-browser.js ***!
|
||
\**************************************/
|
||
/*! exports provided: default, recommendedBrowser */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return supportedBrowser; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "recommendedBrowser", function() { return recommendedBrowser; });
|
||
// tw: If the browser can parse the JS we generate, we support it.
|
||
|
||
/**
|
||
* Helper function to determine if the browser is supported at all.
|
||
* @returns {boolean} False if the platform is definitely not supported.
|
||
*/
|
||
const supportedBrowser = () => true;
|
||
/**
|
||
* Helper function to determine if the browser meets the minimum recommended version
|
||
* @returns {boolean} False if the browser isn't a recommended browser, or doesn't
|
||
* meet the minimum version for recommended browsers.
|
||
* NOTE: uses strict_mode==true so that any browser not listed in the minVersions
|
||
* always returns false
|
||
*/
|
||
|
||
|
||
const recommendedBrowser = () => true;
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/throttled-property-hoc.jsx":
|
||
/*!********************************************!*\
|
||
!*** ./src/lib/throttled-property-hoc.jsx ***!
|
||
\********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
|
||
/* Higher Order Component to throttle updates to specific props.
|
||
* Why? Because certain prop updates are expensive, and need to be throttled.
|
||
* This allows renders when other properties change, and will use the last
|
||
* rendered value of a prop for comparison.
|
||
* @param {string} propName the name of the prop to throttle updates from.
|
||
* @param {string} throttleTime the minimum time between updates to that specific property.
|
||
* @returns {function} a function that accepts a component to wrap.
|
||
*/
|
||
|
||
const ThrottledPropertyHOC = function ThrottledPropertyHOC(propName, throttleTime) {
|
||
/**
|
||
* The function to be called with a React component to wrap it.
|
||
* @param {React.Component} WrappedComponent - Component to wrap with throttler.
|
||
* @returns {React.Component} the component wrapped with the throttler.
|
||
*/
|
||
return function (WrappedComponent) {
|
||
class ThrottledPropertyWrapper extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
shouldComponentUpdate(nextProps) {
|
||
for (const property in nextProps) {
|
||
if (property !== propName && this.props[property] !== nextProps[property]) {
|
||
return true; // Always update if another property has changed
|
||
}
|
||
} // If only that prop has changed, allow update to go to render based
|
||
// on _lastRenderedTime and _lastRenderTime are updated in render
|
||
|
||
|
||
if (nextProps[propName] !== this._lastRenderedValue && Date.now() - this._lastRenderTime > throttleTime) {
|
||
return true; // Allow this update to go to render
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
render() {
|
||
this._lastRenderTime = Date.now();
|
||
this._lastRenderedValue = this.props[propName];
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(WrappedComponent, this.props);
|
||
}
|
||
|
||
}
|
||
|
||
return ThrottledPropertyWrapper;
|
||
};
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (ThrottledPropertyHOC);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/titled-hoc.jsx":
|
||
/*!********************************!*\
|
||
!*** ./src/lib/titled-hoc.jsx ***!
|
||
\********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TitledHOC; });
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../reducers/project-state */ "./src/reducers/project-state.js");
|
||
/* harmony import */ var _reducers_project_title__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/project-title */ "./src/reducers/project-title.js");
|
||
const _excluded = ["intl", "isAnyCreatingNewState", "isShowingWithoutId", "onChangedProjectTitle", "onUpdateProjectTitle", "projectTitle", "reduxProjectTitle"];
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["defineMessages"])({
|
||
defaultProjectTitle: {
|
||
"id": "tw.gui.defaultProjectTitle",
|
||
"defaultMessage": "Project"
|
||
}
|
||
});
|
||
/* Higher Order Component to get and set the project title
|
||
* @param {React.Component} WrappedComponent component to receive project title related props
|
||
* @returns {React.Component} component with project loading behavior
|
||
*/
|
||
|
||
const TitledHOC = function TitledHOC(WrappedComponent) {
|
||
class TitledComponent extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
componentDidMount() {
|
||
this.handleReceivedProjectTitle(this.props.projectTitle);
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
if (this.props.projectTitle !== prevProps.projectTitle) {
|
||
this.handleReceivedProjectTitle(this.props.projectTitle);
|
||
} // if project is a new default project, and has loaded,
|
||
|
||
|
||
if (this.props.isShowingWithoutId && prevProps.isAnyCreatingNewState) {
|
||
// reset title to default
|
||
const defaultProjectTitle = this.handleReceivedProjectTitle();
|
||
this.props.onUpdateProjectTitle(defaultProjectTitle, true);
|
||
} // if the projectTitle hasn't changed, but the reduxProjectTitle
|
||
// HAS changed, we need to report that change to the projectTitle's owner
|
||
|
||
|
||
if (this.props.reduxProjectTitle !== prevProps.reduxProjectTitle && this.props.reduxProjectTitle !== this.props.projectTitle) {
|
||
const defaultProjectTitle = this.props.intl.formatMessage(messages.defaultProjectTitle);
|
||
this.props.onUpdateProjectTitle(this.props.reduxProjectTitle, this.props.reduxProjectTitle === defaultProjectTitle);
|
||
}
|
||
}
|
||
|
||
handleReceivedProjectTitle(requestedTitle) {
|
||
let newTitle = requestedTitle;
|
||
let isDefault = false;
|
||
|
||
if (newTitle === null || typeof newTitle === 'undefined') {
|
||
newTitle = this.props.intl.formatMessage(messages.defaultProjectTitle);
|
||
isDefault = true;
|
||
}
|
||
|
||
this.props.onChangedProjectTitle(newTitle, isDefault);
|
||
return newTitle;
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
intl,
|
||
isAnyCreatingNewState,
|
||
isShowingWithoutId,
|
||
onChangedProjectTitle,
|
||
// for children, we replace onUpdateProjectTitle with our own
|
||
onUpdateProjectTitle,
|
||
// we don't pass projectTitle prop to children -- they must use
|
||
// redux value
|
||
projectTitle,
|
||
reduxProjectTitle
|
||
} = _this$props,
|
||
componentProps = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(WrappedComponent, componentProps);
|
||
}
|
||
|
||
}
|
||
|
||
TitledComponent.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_3__["intlShape"],
|
||
isAnyCreatingNewState: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
isShowingWithoutId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,
|
||
onChangedProjectTitle: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
onUpdateProjectTitle: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func,
|
||
projectTitle: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,
|
||
reduxProjectTitle: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string
|
||
};
|
||
TitledComponent.defaultProps = {
|
||
onUpdateProjectTitle: () => {}
|
||
};
|
||
|
||
const mapStateToProps = state => {
|
||
const loadingState = state.scratchGui.projectState.loadingState;
|
||
return {
|
||
isAnyCreatingNewState: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_4__["getIsAnyCreatingNewState"])(loadingState),
|
||
isShowingWithoutId: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_4__["getIsShowingWithoutId"])(loadingState),
|
||
reduxProjectTitle: state.scratchGui.projectTitle
|
||
};
|
||
};
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onChangedProjectTitle: title => dispatch(Object(_reducers_project_title__WEBPACK_IMPORTED_MODULE_5__["setProjectTitle"])(title))
|
||
});
|
||
|
||
return Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_2__["connect"])(mapStateToProps, mapDispatchToProps)(TitledComponent));
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/touch-utils.js":
|
||
/*!********************************!*\
|
||
!*** ./src/lib/touch-utils.js ***!
|
||
\********************************/
|
||
/*! exports provided: getEventXY */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getEventXY", function() { return getEventXY; });
|
||
const getEventXY = e => {
|
||
if (e.touches && e.touches[0]) {
|
||
return {
|
||
x: e.touches[0].clientX,
|
||
y: e.touches[0].clientY
|
||
};
|
||
} else if (e.changedTouches && e.changedTouches[0]) {
|
||
return {
|
||
x: e.changedTouches[0].clientX,
|
||
y: e.changedTouches[0].clientY
|
||
};
|
||
}
|
||
|
||
return {
|
||
x: e.clientX,
|
||
y: e.clientY
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tutorial-from-url.js":
|
||
/*!**************************************!*\
|
||
!*** ./src/lib/tutorial-from-url.js ***!
|
||
\**************************************/
|
||
/*! exports provided: detectTutorialId */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "detectTutorialId", function() { return detectTutorialId; });
|
||
/* harmony import */ var _libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./libraries/decks/index.jsx */ "./src/lib/libraries/decks/index.jsx");
|
||
/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./analytics */ "./src/lib/analytics.js");
|
||
/**
|
||
* @fileoverview
|
||
* Utility function to detect tutorial id from query paramenter on the URL.
|
||
*/
|
||
|
||
|
||
/**
|
||
* Get the tutorial id from the given numerical id (representing the
|
||
* url id of the tutorial).
|
||
* @param {number} urlId The URL Id for the tutorial
|
||
* @returns {string} The string id for the tutorial, or null if the URL ID
|
||
* was not found.
|
||
*/
|
||
|
||
const getDeckIdFromUrlId = urlId => {
|
||
for (const deckId in _libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_0__["default"]) {
|
||
if (_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_0__["default"][deckId].urlId === urlId) {
|
||
_analytics__WEBPACK_IMPORTED_MODULE_1__["default"].event({
|
||
category: 'how-to',
|
||
action: 'load from url',
|
||
label: "".concat(deckId)
|
||
});
|
||
return deckId;
|
||
}
|
||
}
|
||
|
||
return null;
|
||
};
|
||
/**
|
||
* Check if there's a tutorial id provided as a query parameter in the URL.
|
||
* Return the corresponding tutorial id or null if not found.
|
||
* @param {object} queryParams the results of parsing the query string
|
||
* @return {string} The ID of the requested tutorial or null if no tutorial was
|
||
* requested or found.
|
||
*/
|
||
|
||
|
||
const detectTutorialId = queryParams => {
|
||
const tutorialID = Array.isArray(queryParams.tutorial) ? queryParams.tutorial[0] : queryParams.tutorial;
|
||
if (typeof tutorialID === 'undefined') return null;
|
||
if (tutorialID === 'all') return tutorialID;
|
||
return getDeckIdFromUrlId(tutorialID);
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-base64-utils.js":
|
||
/*!************************************!*\
|
||
!*** ./src/lib/tw-base64-utils.js ***!
|
||
\************************************/
|
||
/*! exports provided: base64ToArrayBuffer, arrayBufferToBase64 */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "base64ToArrayBuffer", function() { return base64ToArrayBuffer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "arrayBufferToBase64", function() { return arrayBufferToBase64; });
|
||
const base64ToArrayBuffer = base64 => {
|
||
const binaryString = atob(base64);
|
||
const len = binaryString.length;
|
||
const array = new Uint8Array(len);
|
||
|
||
for (let i = 0; i < len; i++) {
|
||
array[i] = binaryString.charCodeAt(i);
|
||
}
|
||
|
||
return array.buffer;
|
||
};
|
||
const arrayBufferToBase64 = buffer => {
|
||
let binary = '';
|
||
const bytes = new Uint8Array(buffer);
|
||
const len = bytes.byteLength;
|
||
|
||
for (let i = 0; i < len; i++) {
|
||
binary += String.fromCharCode(bytes[i]);
|
||
}
|
||
|
||
return btoa(binary);
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-bytes-utils.js":
|
||
/*!***********************************!*\
|
||
!*** ./src/lib/tw-bytes-utils.js ***!
|
||
\***********************************/
|
||
/*! exports provided: formatBytes */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatBytes", function() { return formatBytes; });
|
||
const formatBytes = bytes => {
|
||
if (bytes < 1000 * 1000) {
|
||
return "".concat((bytes / 1000).toFixed(2), "KB");
|
||
}
|
||
|
||
return "".concat((bytes / 1000 / 1000).toFixed(2), "MB");
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-cloud-limits.js":
|
||
/*!************************************!*\
|
||
!*** ./src/lib/tw-cloud-limits.js ***!
|
||
\************************************/
|
||
/*! exports provided: MAXIMUM_CLOUD_VARIABLES, SCRATCH_MAX_CLOUD_VARIABLES */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAXIMUM_CLOUD_VARIABLES", function() { return MAXIMUM_CLOUD_VARIABLES; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SCRATCH_MAX_CLOUD_VARIABLES", function() { return SCRATCH_MAX_CLOUD_VARIABLES; });
|
||
// The maximum number of cloudv ariables that can be created in this scratch-gui instance.
|
||
const MAXIMUM_CLOUD_VARIABLES = Infinity; // The maximum number of cloud variables that can be created in a vanilla Scratch.
|
||
|
||
const SCRATCH_MAX_CLOUD_VARIABLES = 10;
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-convert-audio-wav.js":
|
||
/*!*****************************************!*\
|
||
!*** ./src/lib/tw-convert-audio-wav.js ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _audio_shared_audio_context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./audio/shared-audio-context */ "./src/lib/audio/shared-audio-context.js");
|
||
/* harmony import */ var wav_encoder__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! wav-encoder */ "./node_modules/wav-encoder/index.js");
|
||
/* harmony import */ var wav_encoder__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(wav_encoder__WEBPACK_IMPORTED_MODULE_1__);
|
||
|
||
|
||
|
||
const convertAudioToWav = fileData => {
|
||
/** @type {AudioContext} */
|
||
const audioContext = new _audio_shared_audio_context__WEBPACK_IMPORTED_MODULE_0__["default"]();
|
||
return audioContext.decodeAudioData(fileData).then(decodedData => {
|
||
const channels = [];
|
||
|
||
for (let i = 0; i < decodedData.numberOfChannels; i++) {
|
||
channels.push(decodedData.getChannelData(i));
|
||
}
|
||
|
||
return wav_encoder__WEBPACK_IMPORTED_MODULE_1___default.a.encode({
|
||
sampleRate: decodedData.sampleRate,
|
||
channelData: channels
|
||
});
|
||
});
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (convertAudioToWav);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-environment-support-prober.js":
|
||
/*!**************************************************!*\
|
||
!*** ./src/lib/tw-environment-support-prober.js ***!
|
||
\**************************************************/
|
||
/*! exports provided: isRendererSupported, canConstructNewFunctions, isAudioContextSupported, isBrowserSupported */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isRendererSupported", function() { return isRendererSupported; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canConstructNewFunctions", function() { return canConstructNewFunctions; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isAudioContextSupported", function() { return isAudioContextSupported; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isBrowserSupported", function() { return isBrowserSupported; });
|
||
/* harmony import */ var scratch_render__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! scratch-render */ "./node_modules/scratch-render/src/index.js");
|
||
/* harmony import */ var scratch_render__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(scratch_render__WEBPACK_IMPORTED_MODULE_0__);
|
||
|
||
let _isRendererSupported = null;
|
||
const isRendererSupported = () => {
|
||
if (_isRendererSupported === null) {
|
||
_isRendererSupported = scratch_render__WEBPACK_IMPORTED_MODULE_0___default.a.isSupported();
|
||
}
|
||
|
||
return _isRendererSupported;
|
||
};
|
||
let _canConstructNewFunctions = null;
|
||
const canConstructNewFunctions = () => {
|
||
if (_canConstructNewFunctions === null) {
|
||
try {
|
||
// This will throw if blocked by CSP
|
||
// eslint-disable-next-line no-new
|
||
new Function('');
|
||
_canConstructNewFunctions = true;
|
||
} catch (e) {
|
||
_canConstructNewFunctions = true;
|
||
}
|
||
}
|
||
|
||
return _canConstructNewFunctions;
|
||
};
|
||
const isAudioContextSupported = () => !!(window.AudioContext || window.webkitAudioContext);
|
||
const isBrowserSupported = () => canConstructNewFunctions() && isAudioContextSupported();
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-filesystem-api.js":
|
||
/*!**************************************!*\
|
||
!*** ./src/lib/tw-filesystem-api.js ***!
|
||
\**************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
const available = () => !!window.showSaveFilePicker;
|
||
|
||
const showSaveFilePicker = fileName => window.showSaveFilePicker({
|
||
suggestedName: fileName,
|
||
types: [{
|
||
description: 'Scratch 3 Project',
|
||
accept: {
|
||
'application/x.scratch.sb3': '.sb3'
|
||
}
|
||
}],
|
||
excludeAcceptAllOption: true
|
||
});
|
||
|
||
const showOpenFilePicker = async () => {
|
||
const [handle] = await window.showOpenFilePicker({
|
||
multiple: false,
|
||
types: [{
|
||
description: 'Scratch Project',
|
||
accept: {
|
||
'application/x.scratch.sb3': ['.sb', '.sb2', '.sb3']
|
||
}
|
||
}]
|
||
});
|
||
return handle;
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = ({
|
||
available,
|
||
showOpenFilePicker,
|
||
showSaveFilePicker
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-fullscreen-api.js":
|
||
/*!**************************************!*\
|
||
!*** ./src/lib/tw-fullscreen-api.js ***!
|
||
\**************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/**
|
||
* Return whether the fullscreen API is available in this environment.
|
||
* @returns {boolean} true if the fullscreen API is available
|
||
*/
|
||
const available = () => document.fullscreenEnabled || document.webkitFullscreenEnabled;
|
||
/**
|
||
* Return whether fullscreen is currently enabled.
|
||
* @returns {boolean} true if in fullscreen
|
||
*/
|
||
|
||
|
||
const enabled = () => {
|
||
if (typeof document.fullscreenElement !== 'undefined') {
|
||
return document.fullscreenElement !== null;
|
||
}
|
||
|
||
if (typeof document.webkitFullscreenElement !== 'undefined') {
|
||
return document.webkitFullscreenElement !== null;
|
||
}
|
||
|
||
return false;
|
||
};
|
||
/**
|
||
* Request entering the document into fullscreen mode.
|
||
*/
|
||
|
||
|
||
const request = () => {
|
||
if (document.body.requestFullscreen) {
|
||
document.body.requestFullscreen();
|
||
} else if (document.body.webkitRequestFullscreen) {
|
||
document.body.webkitRequestFullscreen();
|
||
}
|
||
};
|
||
/**
|
||
* Exit fullscreen mode.
|
||
*/
|
||
|
||
|
||
const exit = () => {
|
||
if (document.exitFullscreen) {
|
||
document.exitFullscreen();
|
||
} else if (document.webkitExitFullscreen) {
|
||
document.webkitExitFullscreen();
|
||
}
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = ({
|
||
available,
|
||
enabled,
|
||
request,
|
||
exit
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-fullscreen-resizer-hoc.jsx":
|
||
/*!***********************************************!*\
|
||
!*** ./src/lib/tw-fullscreen-resizer-hoc.jsx ***!
|
||
\***********************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TWFullScreenResizerHOC; });
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../reducers/tw */ "./src/reducers/tw.js");
|
||
const _excluded = ["onSetDimensions", "isFullScreen"];
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const TWFullScreenResizerHOC = function TWFullScreenResizerHOC(WrappedComponent) {
|
||
class FullScreenResizer extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleResize']);
|
||
}
|
||
|
||
componentDidMount() {
|
||
window.addEventListener('resize', this.handleResize);
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
window.removeEventListener('resize', this.handleResize);
|
||
}
|
||
|
||
handleResize() {
|
||
if (this.props.isFullScreen) {
|
||
this.props.onSetDimensions([window.innerWidth, window.innerHeight]);
|
||
}
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
onSetDimensions,
|
||
isFullScreen
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(WrappedComponent, props);
|
||
}
|
||
|
||
}
|
||
|
||
FullScreenResizer.propTypes = {
|
||
isFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,
|
||
onSetDimensions: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
isFullScreen: state.scratchGui.mode.isFullScreen || state.scratchGui.mode.isEmbedded
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onSetDimensions: dimensions => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_4__["setDimensions"])(dimensions))
|
||
});
|
||
|
||
return Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps)(FullScreenResizer);
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-lazy-scratch-blocks.js":
|
||
/*!*******************************************!*\
|
||
!*** ./src/lib/tw-lazy-scratch-blocks.js ***!
|
||
\*******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
let _ScratchBlocks = null;
|
||
|
||
const isLoaded = () => !!_ScratchBlocks;
|
||
|
||
const get = () => {
|
||
if (!isLoaded()) {
|
||
throw new Error('scratch-blocks is not loaded yet');
|
||
}
|
||
|
||
return _ScratchBlocks;
|
||
};
|
||
|
||
const load = () => {
|
||
if (_ScratchBlocks) {
|
||
return Promise.resolve();
|
||
}
|
||
|
||
return __webpack_require__.e(/*! import() | sb */ "sb").then(__webpack_require__.t.bind(null, /*! scratch-blocks */ "./node_modules/scratch-blocks/shim/vertical.js", 7)).then(m => {
|
||
_ScratchBlocks = m.default;
|
||
return _ScratchBlocks;
|
||
});
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = ({
|
||
get,
|
||
isLoaded,
|
||
load
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-load-scratch-blocks-hoc.jsx":
|
||
/*!************************************************!*\
|
||
!*** ./src/lib/tw-load-scratch-blocks-hoc.jsx ***!
|
||
\************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./log */ "./src/lib/log.js");
|
||
/* harmony import */ var _tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tw-lazy-scratch-blocks */ "./src/lib/tw-lazy-scratch-blocks.js");
|
||
/* harmony import */ var _components_tw_loading_spinner_spinner_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/tw-loading-spinner/spinner.jsx */ "./src/components/tw-loading-spinner/spinner.jsx");
|
||
/* harmony import */ var _components_crash_message_crash_message_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/crash-message/crash-message.jsx */ "./src/components/crash-message/crash-message.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const LoadScratchBlocksHOC = function LoadScratchBlocksHOC(WrappedComponent) {
|
||
class LoadScratchBlocks extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
this.state = {
|
||
loaded: _tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_2__["default"].isLoaded(),
|
||
error: null
|
||
};
|
||
|
||
if (!this.state.loaded) {
|
||
_tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_2__["default"].load().then(() => {
|
||
this.setState({
|
||
loaded: true
|
||
});
|
||
}).catch(e => {
|
||
_log__WEBPACK_IMPORTED_MODULE_1__["default"].error(e);
|
||
this.setState({
|
||
error: e
|
||
});
|
||
});
|
||
}
|
||
}
|
||
|
||
handleReload() {
|
||
location.reload();
|
||
}
|
||
|
||
render() {
|
||
if (this.state.error !== null) {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_crash_message_crash_message_jsx__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
||
errorMessage: "lazy scratch-blocks: ".concat(this.state.error),
|
||
onReload: this.handleReload
|
||
});
|
||
}
|
||
|
||
if (!this.state.loaded) {
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_tw_loading_spinner_spinner_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], null);
|
||
}
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(WrappedComponent, this.props);
|
||
}
|
||
|
||
}
|
||
|
||
return LoadScratchBlocks;
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (LoadScratchBlocksHOC);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-local-backpack-api.js":
|
||
/*!******************************************!*\
|
||
!*** ./src/lib/tw-local-backpack-api.js ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./storage */ "./src/lib/storage.js");
|
||
/* harmony import */ var js_md5__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! js-md5 */ "./node_modules/js-md5/src/md5.js");
|
||
/* harmony import */ var js_md5__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(js_md5__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _backpack_sound_payload__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./backpack/sound-payload */ "./src/lib/backpack/sound-payload.js");
|
||
/* harmony import */ var _tw_base64_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tw-base64-utils */ "./src/lib/tw-base64-utils.js");
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
|
||
|
||
|
||
// Special constants -- do not change without care.
|
||
|
||
const DATABASE_NAME = 'TW_Backpack';
|
||
const DATABASE_VERSION = 1;
|
||
const STORE_NAME = 'backpack';
|
||
|
||
const idbItemToBackpackItem = item => {
|
||
// convert id to string
|
||
item.id = "".concat(item.id);
|
||
|
||
if (item.type === 'sound') {
|
||
// For sounds, use the local thumbnail instead of what was stored in the backpack.
|
||
// The thumbnail was updated and it doesn't make sense for already backpacked sounds to
|
||
// use the old icon instead of the new one.
|
||
item.thumbnailUrl = "data:;base64,".concat(_backpack_sound_payload__WEBPACK_IMPORTED_MODULE_2__["soundThumbnail"]);
|
||
} else {
|
||
// Thumbnail could be any image format. The browser will figure out which format it is.
|
||
item.thumbnailUrl = "data:;base64,".concat(Object(_tw_base64_utils__WEBPACK_IMPORTED_MODULE_3__["arrayBufferToBase64"])(item.thumbnailData));
|
||
}
|
||
|
||
let assetType;
|
||
|
||
if (item.type === 'script') {
|
||
item.bodyUrl = "data:application/json;base64,".concat(Object(_tw_base64_utils__WEBPACK_IMPORTED_MODULE_3__["arrayBufferToBase64"])(item.bodyData));
|
||
} else if (item.type === 'sprite') {
|
||
item.bodyUrl = "data:application/zip;base64,".concat(Object(_tw_base64_utils__WEBPACK_IMPORTED_MODULE_3__["arrayBufferToBase64"])(item.bodyData));
|
||
} else if (item.type === 'costume') {
|
||
if (item.mime === 'image/svg+xml') {
|
||
assetType = _storage__WEBPACK_IMPORTED_MODULE_0__["default"].AssetType.ImageVector;
|
||
} else if (item.mime === 'image/png' || item.mime === 'image/jpeg') {
|
||
assetType = _storage__WEBPACK_IMPORTED_MODULE_0__["default"].AssetType.ImageBitmap;
|
||
}
|
||
} else if (item.type === 'sound') {
|
||
assetType = _storage__WEBPACK_IMPORTED_MODULE_0__["default"].AssetType.Sound;
|
||
}
|
||
|
||
if (assetType) {
|
||
const extension = assetType.runtimeFormat;
|
||
const itemMD5 = item.bodyMD5;
|
||
const md5ext = "".concat(itemMD5, ".").concat(extension);
|
||
item.body = md5ext;
|
||
|
||
_storage__WEBPACK_IMPORTED_MODULE_0__["default"].builtinHelper._store(assetType, extension, new Uint8Array(item.bodyData), itemMD5);
|
||
}
|
||
|
||
return item;
|
||
};
|
||
|
||
let _db;
|
||
|
||
const openDB = () => new Promise((resolve, reject) => {
|
||
if (_db) {
|
||
resolve(_db);
|
||
return;
|
||
}
|
||
|
||
if (!window.indexedDB) {
|
||
reject(new Error('indexedDB is not supported'));
|
||
return;
|
||
}
|
||
|
||
const request = indexedDB.open(DATABASE_NAME, DATABASE_VERSION);
|
||
|
||
request.onupgradeneeded = e => {
|
||
const db = e.target.result;
|
||
db.createObjectStore(STORE_NAME, {
|
||
keyPath: 'id',
|
||
autoIncrement: true
|
||
});
|
||
};
|
||
|
||
request.onsuccess = e => {
|
||
_db = e.target.result;
|
||
resolve(_db);
|
||
};
|
||
|
||
request.onerror = () => {
|
||
reject(new Error("DB error: ".concat(request.error)));
|
||
};
|
||
});
|
||
|
||
const getBackpackContents = async ({
|
||
limit,
|
||
offset
|
||
}) => {
|
||
const db = await openDB();
|
||
return new Promise((resolve, reject) => {
|
||
const transaction = db.transaction(STORE_NAME, 'readonly');
|
||
|
||
transaction.onerror = () => {
|
||
reject(new Error("Transaction error: ".concat(transaction.error)));
|
||
};
|
||
|
||
const store = transaction.objectStore(STORE_NAME);
|
||
const items = [];
|
||
const request = store.openCursor(null, 'prev');
|
||
let first = true;
|
||
|
||
request.onsuccess = e => {
|
||
const cursor = e.target.result;
|
||
|
||
if (first) {
|
||
first = false;
|
||
|
||
if (cursor && offset !== 0) {
|
||
cursor.advance(offset);
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (cursor && items.length < limit) {
|
||
items.push(idbItemToBackpackItem(cursor.value));
|
||
cursor.continue();
|
||
} else {
|
||
resolve(items);
|
||
}
|
||
};
|
||
});
|
||
};
|
||
|
||
const saveBackpackObject = async ({
|
||
type,
|
||
mime,
|
||
name,
|
||
body,
|
||
thumbnail
|
||
}) => {
|
||
const db = await openDB();
|
||
return new Promise((resolve, reject) => {
|
||
const transaction = db.transaction(STORE_NAME, 'readwrite');
|
||
|
||
transaction.onerror = () => {
|
||
reject(new Error("Transaction error: ".concat(transaction.error)));
|
||
};
|
||
|
||
const store = transaction.objectStore(STORE_NAME);
|
||
const bodyData = Object(_tw_base64_utils__WEBPACK_IMPORTED_MODULE_3__["base64ToArrayBuffer"])(body);
|
||
const bodyMD5 = js_md5__WEBPACK_IMPORTED_MODULE_1___default()(bodyData);
|
||
const idbItem = {
|
||
type,
|
||
mime,
|
||
name,
|
||
bodyData,
|
||
bodyMD5,
|
||
thumbnailData: Object(_tw_base64_utils__WEBPACK_IMPORTED_MODULE_3__["base64ToArrayBuffer"])(thumbnail)
|
||
};
|
||
const putRequest = store.put(idbItem);
|
||
|
||
putRequest.onsuccess = () => {
|
||
idbItem.id = putRequest.result;
|
||
resolve(idbItemToBackpackItem(idbItem));
|
||
};
|
||
});
|
||
};
|
||
|
||
const deleteBackpackObject = async ({
|
||
id
|
||
}) => {
|
||
id = +id;
|
||
const db = await openDB();
|
||
return new Promise((resolve, reject) => {
|
||
const transaction = db.transaction(STORE_NAME, 'readwrite');
|
||
|
||
transaction.onerror = () => {
|
||
reject(new Error("Transaction error: ".concat(transaction.error)));
|
||
};
|
||
|
||
const store = transaction.objectStore(STORE_NAME); // Convert string IDs to number IDs
|
||
|
||
const deleteRequest = store.delete(id);
|
||
|
||
deleteRequest.onsuccess = () => {
|
||
resolve();
|
||
};
|
||
});
|
||
};
|
||
|
||
const updateBackpackObject = async ({
|
||
id,
|
||
name
|
||
}) => {
|
||
id = +id;
|
||
const db = await openDB();
|
||
return new Promise((resolve, reject) => {
|
||
const transaction = db.transaction(STORE_NAME, 'readwrite');
|
||
|
||
transaction.onerror = () => {
|
||
reject(new Error("Transaction error: ".concat(transaction.error)));
|
||
};
|
||
|
||
const store = transaction.objectStore(STORE_NAME);
|
||
const getRequest = store.get(id);
|
||
|
||
getRequest.onsuccess = () => {
|
||
const newItem = _objectSpread(_objectSpread({}, getRequest.result), {}, {
|
||
name: name
|
||
});
|
||
|
||
const putRequest = store.put(newItem);
|
||
|
||
putRequest.onsuccess = () => {
|
||
resolve(idbItemToBackpackItem(newItem));
|
||
};
|
||
};
|
||
});
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = ({
|
||
getBackpackContents,
|
||
saveBackpackObject,
|
||
deleteBackpackObject,
|
||
updateBackpackObject
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-missing-project/index.js":
|
||
/*!*********************************************!*\
|
||
!*** ./src/lib/tw-missing-project/index.js ***!
|
||
\*********************************************/
|
||
/*! exports provided: MISSING_PROJECT_ID, default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MISSING_PROJECT_ID", function() { return MISSING_PROJECT_ID; });
|
||
/* harmony import */ var _raw_loader_c17163c6954e9422ac2405de4c9d68c8_svg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! raw-loader!./c17163c6954e9422ac2405de4c9d68c8.svg */ "./node_modules/raw-loader/index.js!./src/lib/tw-missing-project/c17163c6954e9422ac2405de4c9d68c8.svg");
|
||
/* harmony import */ var _raw_loader_c17163c6954e9422ac2405de4c9d68c8_svg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_raw_loader_c17163c6954e9422ac2405de4c9d68c8_svg__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _project_data__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./project-data */ "./src/lib/tw-missing-project/project-data.js");
|
||
/* harmony import */ var _tw_text_encoder__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tw-text-encoder */ "./src/lib/tw-text-encoder.js");
|
||
/* eslint-disable import/no-unresolved */
|
||
|
||
/* eslint-enable import/no-unresolved */
|
||
|
||
|
||
|
||
const MISSING_PROJECT_ID = '__missing__';
|
||
|
||
const missingProject = () => {
|
||
const encoder = new _tw_text_encoder__WEBPACK_IMPORTED_MODULE_2__["TextEncoder"]();
|
||
const projectJson = Object(_project_data__WEBPACK_IMPORTED_MODULE_1__["default"])();
|
||
return [{
|
||
id: MISSING_PROJECT_ID,
|
||
assetType: 'Project',
|
||
dataFormat: 'JSON',
|
||
data: JSON.stringify(projectJson)
|
||
}, {
|
||
id: 'c17163c6954e9422ac2405de4c9d68c8',
|
||
assetType: 'ImageVector',
|
||
dataFormat: 'SVG',
|
||
data: encoder.encode(_raw_loader_c17163c6954e9422ac2405de4c9d68c8_svg__WEBPACK_IMPORTED_MODULE_0___default.a)
|
||
}];
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (missingProject);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-missing-project/project-data.js":
|
||
/*!****************************************************!*\
|
||
!*** ./src/lib/tw-missing-project/project-data.js ***!
|
||
\****************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
const projectData = () => ({
|
||
targets: [{
|
||
isStage: true,
|
||
name: 'Stage',
|
||
variables: {},
|
||
lists: {},
|
||
broadcasts: {},
|
||
blocks: {},
|
||
comments: {},
|
||
currentCostume: 0,
|
||
costumes: [{
|
||
assetId: 'c17163c6954e9422ac2405de4c9d68c8',
|
||
name: '',
|
||
bitmapResolution: 1,
|
||
md5ext: 'c17163c6954e9422ac2405de4c9d68c8.svg',
|
||
dataFormat: 'svg',
|
||
rotationCenterX: 207,
|
||
rotationCenterY: 16
|
||
}],
|
||
sounds: [],
|
||
volume: 100,
|
||
layerOrder: 0
|
||
}],
|
||
monitors: [],
|
||
extensions: [],
|
||
meta: {
|
||
semver: '3.0.0',
|
||
vm: '0.2.0',
|
||
agent: ''
|
||
}
|
||
});
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (projectData);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-navigation-utils.js":
|
||
/*!****************************************!*\
|
||
!*** ./src/lib/tw-navigation-utils.js ***!
|
||
\****************************************/
|
||
/*! exports provided: setProjectId, searchParamsToString, setSearchParams */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setProjectId", function() { return setProjectId; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "searchParamsToString", function() { return searchParamsToString; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSearchParams", function() { return setSearchParams; });
|
||
/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../reducers/project-state */ "./src/reducers/project-state.js");
|
||
|
||
|
||
const setProjectId = (dispatch, projectId) => {
|
||
if (false) {}
|
||
|
||
dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_0__["setProjectId"])(projectId));
|
||
};
|
||
|
||
const searchParamsToString = params => {
|
||
let newSearch = params.toString();
|
||
|
||
if (newSearch.length > 0) {
|
||
// Add leading question mark
|
||
newSearch = "?".concat(newSearch);
|
||
newSearch = newSearch // Remove '=' from empty values
|
||
// eslint-disable-next-line no-div-regex
|
||
.replace(/=(?=$|&)/g, '') // Decode / and : (common in project_url setting)
|
||
.replace(/%2F/g, '/').replace(/%3A/g, ':');
|
||
}
|
||
|
||
return newSearch;
|
||
};
|
||
/**
|
||
* Change URL search params to something else in place
|
||
* @param {URLSearchParams} params New URLSearchParams
|
||
*/
|
||
|
||
|
||
const setSearchParams = params => {
|
||
const newSearch = searchParamsToString(params);
|
||
|
||
if (location.search !== newSearch) {
|
||
history.replaceState(null, null, "".concat(location.pathname).concat(newSearch).concat(location.hash));
|
||
}
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-project-meta-fetcher-hoc.jsx":
|
||
/*!*************************************************!*\
|
||
!*** ./src/lib/tw-project-meta-fetcher-hoc.jsx ***!
|
||
\*************************************************/
|
||
/*! exports provided: fetchProjectMeta, default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchProjectMeta", function() { return fetchProjectMeta; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TWProjectMetaFetcherHOC; });
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./log */ "./src/lib/log.js");
|
||
/* harmony import */ var _reducers_project_title__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../reducers/project-title */ "./src/reducers/project-title.js");
|
||
/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/tw */ "./src/reducers/tw.js");
|
||
const _excluded = ["projectId", "onSetAuthor", "onSetDescription", "onSetProjectTitle"];
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const fetchProjectMeta = async projectId => {
|
||
const urls = ["https://trampoline.turbowarp.org/api/projects/".concat(projectId), "https://trampoline.turbowarp.xyz/api/projects/".concat(projectId)];
|
||
let firstError;
|
||
|
||
for (const url of urls) {
|
||
try {
|
||
const res = await fetch(url);
|
||
const data = await res.json();
|
||
|
||
if (res.ok) {
|
||
return data;
|
||
}
|
||
|
||
if (res.status === 404) {
|
||
throw new Error('Project is probably unshared');
|
||
}
|
||
|
||
throw new Error("Unexpected status code: ".concat(res.status));
|
||
} catch (err) {
|
||
if (!firstError) {
|
||
firstError = err;
|
||
}
|
||
}
|
||
}
|
||
|
||
throw firstError;
|
||
};
|
||
|
||
const getNoIndexTag = () => document.querySelector('meta[name="robots"][content="noindex"]');
|
||
|
||
const setIndexable = indexable => {
|
||
if (indexable) {
|
||
const tag = getNoIndexTag();
|
||
|
||
if (tag) {
|
||
tag.remove();
|
||
}
|
||
} else if (!getNoIndexTag()) {
|
||
const tag = document.createElement('meta');
|
||
tag.name = 'robots';
|
||
tag.content = 'noindex';
|
||
document.head.appendChild(tag);
|
||
}
|
||
};
|
||
|
||
const TWProjectMetaFetcherHOC = function TWProjectMetaFetcherHOC(WrappedComponent) {
|
||
class ProjectMetaFetcherComponent extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
shouldComponentUpdate(nextProps) {
|
||
return this.props.projectId !== nextProps.projectId;
|
||
}
|
||
|
||
componentDidUpdate() {
|
||
// project title resetting is handled in titled-hoc.jsx
|
||
this.props.onSetAuthor('', '');
|
||
this.props.onSetDescription('', '');
|
||
const projectId = this.props.projectId; // Don't try to load metadata for empty projects.
|
||
|
||
if (projectId === '0') {
|
||
return;
|
||
}
|
||
|
||
fetchProjectMeta(projectId).then(data => {
|
||
// If project ID changed, ignore the results.
|
||
if (this.props.projectId !== projectId) {
|
||
return;
|
||
}
|
||
|
||
const title = data.title;
|
||
|
||
if (title) {
|
||
this.props.onSetProjectTitle(title);
|
||
}
|
||
|
||
const authorName = data.author.username;
|
||
const authorThumbnail = "https://trampoline.turbowarp.org/avatars/".concat(data.author.id);
|
||
this.props.onSetAuthor(authorName, authorThumbnail);
|
||
const instructions = data.instructions || '';
|
||
const credits = data.description || '';
|
||
|
||
if (instructions || credits) {
|
||
this.props.onSetDescription(instructions, credits);
|
||
}
|
||
|
||
setIndexable(true);
|
||
}).catch(err => {
|
||
setIndexable(false);
|
||
|
||
if ("".concat(err).includes('unshared')) {
|
||
this.props.onSetDescription('unshared', 'unshared');
|
||
}
|
||
|
||
_log__WEBPACK_IMPORTED_MODULE_3__["default"].warn('cannot fetch project meta', err);
|
||
});
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
projectId,
|
||
onSetAuthor,
|
||
onSetDescription,
|
||
onSetProjectTitle
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(WrappedComponent, props);
|
||
}
|
||
|
||
}
|
||
|
||
ProjectMetaFetcherComponent.propTypes = {
|
||
projectId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
onSetAuthor: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onSetDescription: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onSetProjectTitle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
projectId: state.scratchGui.projectState.projectId
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onSetAuthor: (username, thumbnail) => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_5__["setAuthor"])({
|
||
username,
|
||
thumbnail
|
||
})),
|
||
onSetDescription: (instructions, credits) => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_5__["setDescription"])({
|
||
instructions,
|
||
credits
|
||
})),
|
||
onSetProjectTitle: title => dispatch(Object(_reducers_project_title__WEBPACK_IMPORTED_MODULE_4__["setProjectTitle"])(title))
|
||
});
|
||
|
||
return Object(react_redux__WEBPACK_IMPORTED_MODULE_2__["connect"])(mapStateToProps, mapDispatchToProps)(ProjectMetaFetcherComponent);
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-restore-point-api.js":
|
||
/*!*****************************************!*\
|
||
!*** ./src/lib/tw-restore-point-api.js ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jszip */ "./node_modules/jszip/lib/index.js");
|
||
/* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jszip__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _tw_base64_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tw-base64-utils */ "./src/lib/tw-base64-utils.js");
|
||
|
||
|
||
const TYPE_AUTOMATIC = 0;
|
||
const TYPE_MANUAL = 1;
|
||
/**
|
||
* @typedef {0|1} MetadataType
|
||
*/
|
||
|
||
/**
|
||
* @typedef Metadata
|
||
* @property {string} title
|
||
* @property {number} created Unix seconds
|
||
* @property {Type} type
|
||
* @property {number} projectSize JSON size in bytes
|
||
* @property {number} thumbnailSize Thumbnail size in bytes
|
||
* @property {number} thumbnailWidth
|
||
* @property {number} thumbnailHeight
|
||
* @property {Record<string, number>} assets maps md5exts to size in bytes
|
||
*/
|
||
|
||
const DATABASE_NAME = 'TW_RestorePoints';
|
||
const DATABASE_VERSION = 2;
|
||
const METADATA_STORE = 'meta';
|
||
const PROJECT_STORE = 'projects';
|
||
const ASSET_STORE = 'assets';
|
||
const THUMBNAIL_STORE = 'thumbnails';
|
||
const ALL_STORES = [METADATA_STORE, PROJECT_STORE, ASSET_STORE, THUMBNAIL_STORE];
|
||
const MAX_AUTOMATIC_RESTORE_POINTS = 5;
|
||
/** @type {IDBDatabase|null} */
|
||
|
||
let _cachedDB = null;
|
||
/**
|
||
* @returns {Promise<IDBDatabase>} IDB database with all stores created.
|
||
*/
|
||
|
||
const openDB = () => {
|
||
if (_cachedDB) {
|
||
return Promise.resolve(_cachedDB);
|
||
}
|
||
|
||
if (typeof indexedDB === 'undefined') {
|
||
return Promise.resolve(null);
|
||
}
|
||
|
||
return new Promise((resolve, reject) => {
|
||
const request = indexedDB.open(DATABASE_NAME, DATABASE_VERSION);
|
||
|
||
request.onupgradeneeded = () => {
|
||
const db = request.result;
|
||
db.createObjectStore(METADATA_STORE, {
|
||
autoIncrement: true
|
||
});
|
||
db.createObjectStore(PROJECT_STORE);
|
||
db.createObjectStore(ASSET_STORE);
|
||
db.createObjectStore(THUMBNAIL_STORE);
|
||
};
|
||
|
||
request.onsuccess = () => {
|
||
_cachedDB = request.result;
|
||
resolve(request.result);
|
||
};
|
||
|
||
request.onerror = () => {
|
||
reject(new Error("Could not open database: ".concat(request.error)));
|
||
};
|
||
});
|
||
};
|
||
/**
|
||
* Converts a possibly unknown or corrupted object to a known-good metadata object.
|
||
* @param {Partial<Metadata>} obj Unknown object
|
||
* @returns {Metadata} Metadata object with ID
|
||
*/
|
||
|
||
|
||
const parseMetadata = obj => {
|
||
// Must not throw -- always return the most salvageable object possible.
|
||
if (!obj || typeof obj !== 'object') {
|
||
obj = {};
|
||
}
|
||
|
||
obj.title = typeof obj.title === 'string' ? obj.title : '?';
|
||
obj.created = typeof obj.created === 'number' ? obj.created : 0;
|
||
obj.type = [TYPE_AUTOMATIC, TYPE_MANUAL].includes(obj.type) ? obj.type : 1;
|
||
obj.thumbnailSize = typeof obj.thumbnailSize === 'number' ? obj.thumbnailSize : 0;
|
||
obj.projectSize = typeof obj.projectSize === 'number' ? obj.projectSize : 0;
|
||
obj.thumbnailWidth = typeof obj.thumbnailWidth === 'number' ? obj.thumbnailWidth : 480;
|
||
obj.thumbnailHeight = typeof obj.thumbnailHeight === 'number' ? obj.thumbnailHeight : 360;
|
||
obj.assets = obj.assets && typeof obj.assets === 'object' ? obj.assets : {};
|
||
|
||
for (const [asestId, size] of Object.entries(obj.assets)) {
|
||
if (typeof size !== 'number') {
|
||
delete obj.assets[asestId];
|
||
}
|
||
}
|
||
|
||
return obj;
|
||
};
|
||
/**
|
||
* @param {IDBObjectStore} objectStore IDB object store
|
||
* @param {Set<IDBValidKey>} keysToKeep IDB keys that should continue to exist. Type sensitive.
|
||
* @returns {Promise<void>} Resolves when unused items have been deleted
|
||
*/
|
||
|
||
|
||
const deleteUnknownKeys = (objectStore, keysToKeep) => new Promise(resolve => {
|
||
const keysRequest = objectStore.getAllKeys();
|
||
|
||
keysRequest.onsuccess = async () => {
|
||
const allKeys = keysRequest.result;
|
||
|
||
for (const key of allKeys) {
|
||
if (!keysToKeep.has(key)) {
|
||
await new Promise(innerResolve => {
|
||
const deleteRequest = objectStore.delete(key);
|
||
|
||
deleteRequest.onsuccess = () => {
|
||
innerResolve();
|
||
};
|
||
});
|
||
}
|
||
}
|
||
|
||
resolve();
|
||
};
|
||
});
|
||
/**
|
||
* @param {IDBTransaction} transaction readwrite transaction with access to all stores
|
||
* @returns {Promise<void>} Resolves when data has finished being removed.
|
||
*/
|
||
|
||
|
||
const removeExtraneousData = transaction => new Promise(resolve => {
|
||
const metadataStore = transaction.objectStore(METADATA_STORE);
|
||
const projectStore = transaction.objectStore(PROJECT_STORE);
|
||
const assetStore = transaction.objectStore(ASSET_STORE);
|
||
const thumbnailStore = transaction.objectStore(THUMBNAIL_STORE);
|
||
const requiredProjects = new Set();
|
||
const requiredAssetIDs = new Set();
|
||
const request = metadataStore.openCursor();
|
||
|
||
request.onsuccess = () => {
|
||
const cursor = request.result;
|
||
|
||
if (cursor) {
|
||
requiredProjects.add(cursor.key);
|
||
const metadata = parseMetadata(cursor.value);
|
||
|
||
for (const assetId of Object.keys(metadata.assets)) {
|
||
requiredAssetIDs.add(assetId);
|
||
}
|
||
|
||
cursor.continue();
|
||
} else {
|
||
deleteUnknownKeys(projectStore, requiredProjects).then(() => deleteUnknownKeys(assetStore, requiredAssetIDs)).then(() => deleteUnknownKeys(thumbnailStore, requiredProjects)).then(() => resolve());
|
||
}
|
||
};
|
||
});
|
||
/**
|
||
* @returns {Promise<void>} Resolves when extraneous restore points have been removed.
|
||
*/
|
||
|
||
|
||
const removeExtraneousRestorePoints = () => openDB().then(db => new Promise((resolveTransaction, rejectTransaction) => {
|
||
const transaction = db.transaction(ALL_STORES, 'readwrite');
|
||
|
||
transaction.onerror = () => {
|
||
rejectTransaction(new Error("Transaction error: ".concat(transaction.error)));
|
||
};
|
||
|
||
let automaticCount = 0;
|
||
const metadataStore = transaction.objectStore(METADATA_STORE);
|
||
const getRequest = metadataStore.openCursor(null, 'prev');
|
||
|
||
getRequest.onsuccess = () => {
|
||
const cursor = getRequest.result;
|
||
|
||
if (cursor) {
|
||
const manifest = parseMetadata(cursor.value);
|
||
|
||
if (manifest.type === TYPE_AUTOMATIC) {
|
||
automaticCount++;
|
||
|
||
if (automaticCount > MAX_AUTOMATIC_RESTORE_POINTS) {
|
||
cursor.delete();
|
||
}
|
||
}
|
||
|
||
cursor.continue();
|
||
} else {
|
||
removeExtraneousData(transaction).then(() => resolveTransaction());
|
||
}
|
||
};
|
||
})); // eslint-disable-next-line valid-jsdoc
|
||
|
||
/**
|
||
* @param {VirtualMachine} vm scratch-vm instance
|
||
* @returns {Promise<{type: string; data: ArrayBuffer;}>} Thumbnail data
|
||
*/
|
||
|
||
|
||
const generateThumbnail = vm => new Promise(resolve => {
|
||
// Piggyback off of the next draw if we can, otherwise just force it to render
|
||
const drawTimeout = setTimeout(() => {
|
||
vm.renderer.draw();
|
||
}, 100);
|
||
vm.renderer.requestSnapshot(dataURL => {
|
||
clearTimeout(drawTimeout);
|
||
const index = dataURL.indexOf(',');
|
||
const base64 = dataURL.substring(index + 1);
|
||
const arrayBuffer = Object(_tw_base64_utils__WEBPACK_IMPORTED_MODULE_1__["base64ToArrayBuffer"])(base64);
|
||
const type = 'image/png';
|
||
resolve({
|
||
type,
|
||
data: arrayBuffer
|
||
});
|
||
});
|
||
});
|
||
/**
|
||
* @param {VirtualMachine} vm scratch-vm instance
|
||
* @param {string} title project title
|
||
* @param {MetadataType} type restore point type
|
||
* @returns {Promise<void>} resolves when the restore point is created
|
||
*/
|
||
|
||
|
||
const createRestorePoint = (vm, title, type) => openDB().then(db => new Promise((resolveTransaction, rejectTransaction) => {
|
||
/** @type {Record<string, Uint8Array>} */
|
||
const projectFiles = vm.saveProjectSb3DontZip();
|
||
const jsonData = projectFiles['project.json'];
|
||
const projectAssetIDs = Object.keys(projectFiles).filter(i => i !== 'project.json');
|
||
|
||
if (projectAssetIDs.length === 0) {
|
||
throw new Error('There are no assets in this project');
|
||
}
|
||
|
||
generateThumbnail(vm).then(thumbnailData => {
|
||
const transaction = db.transaction(ALL_STORES, 'readwrite');
|
||
|
||
transaction.onerror = () => {
|
||
rejectTransaction(new Error("Transaction error: ".concat(transaction.error)));
|
||
}; // Will be generated by database
|
||
|
||
/** @type {IDBValidKey} */
|
||
|
||
|
||
let generatedId = null;
|
||
|
||
const writeThumbnail = () => {
|
||
const thumbnailStore = transaction.objectStore(THUMBNAIL_STORE);
|
||
const request = thumbnailStore.add(thumbnailData, generatedId);
|
||
|
||
request.onsuccess = () => {
|
||
resolveTransaction();
|
||
};
|
||
};
|
||
|
||
const writeMissingAssets = async missingAssets => {
|
||
const assetStore = transaction.objectStore(ASSET_STORE);
|
||
|
||
for (const assetId of missingAssets) {
|
||
await new Promise(resolveAsset => {
|
||
// TODO: should we insert arraybuffer or uint8array?
|
||
const assetData = projectFiles[assetId];
|
||
const request = assetStore.add(assetData, assetId);
|
||
|
||
request.onsuccess = () => {
|
||
resolveAsset();
|
||
};
|
||
});
|
||
}
|
||
|
||
writeThumbnail();
|
||
};
|
||
|
||
const checkMissingAssets = () => {
|
||
const assetStore = transaction.objectStore(ASSET_STORE);
|
||
const keyRequest = assetStore.getAllKeys();
|
||
|
||
keyRequest.onsuccess = () => {
|
||
const savedAssets = keyRequest.result;
|
||
const missingAssets = projectAssetIDs.filter(assetId => !savedAssets.includes(assetId));
|
||
writeMissingAssets(missingAssets);
|
||
};
|
||
};
|
||
|
||
const writeProjectJSON = () => {
|
||
const projectStore = transaction.objectStore(PROJECT_STORE);
|
||
const request = projectStore.add(jsonData, generatedId);
|
||
|
||
request.onsuccess = () => {
|
||
checkMissingAssets();
|
||
};
|
||
};
|
||
|
||
const writeMetadata = () => {
|
||
const assetSizeData = {};
|
||
|
||
for (const assetId of projectAssetIDs) {
|
||
const assetData = projectFiles[assetId];
|
||
assetSizeData[assetId] = assetData.byteLength;
|
||
}
|
||
/** @type {Metadata} */
|
||
|
||
|
||
const metadata = {
|
||
title,
|
||
created: Math.round(Date.now() / 1000),
|
||
type,
|
||
projectSize: jsonData.byteLength,
|
||
thumbnailSize: thumbnailData.data.byteLength,
|
||
thumbnailWidth: vm.runtime.stageWidth,
|
||
thumbnailHeight: vm.runtime.stageHeight,
|
||
assets: assetSizeData
|
||
};
|
||
const metadataStore = transaction.objectStore(METADATA_STORE);
|
||
const request = metadataStore.add(metadata);
|
||
|
||
request.onsuccess = () => {
|
||
generatedId = request.result;
|
||
writeProjectJSON();
|
||
};
|
||
};
|
||
|
||
writeMetadata();
|
||
});
|
||
}));
|
||
/**
|
||
* @param {number} id the restore point's ID
|
||
* @returns {Promise<void>} Resovles when the restore point has been deleted.
|
||
*/
|
||
|
||
|
||
const deleteRestorePoint = id => openDB().then(db => new Promise((resolve, reject) => {
|
||
const transaction = db.transaction(ALL_STORES, 'readwrite');
|
||
|
||
transaction.onerror = () => {
|
||
reject(new Error("Transaction error: ".concat(transaction.error)));
|
||
};
|
||
|
||
const metadataStore = transaction.objectStore(METADATA_STORE);
|
||
const request = metadataStore.delete(id);
|
||
|
||
request.onsuccess = () => {
|
||
removeExtraneousData(transaction).then(() => resolve());
|
||
};
|
||
}));
|
||
/**
|
||
* @returns {Promise<void>} Resolves when all data in the database has been deleted.
|
||
*/
|
||
|
||
|
||
const deleteAllRestorePoints = () => openDB().then(db => new Promise((resolveTransaction, rejectTransaction) => {
|
||
const transaction = db.transaction(ALL_STORES, 'readwrite');
|
||
|
||
transaction.onerror = () => {
|
||
rejectTransaction(new Error("Transaction error: ".concat(transaction.error)));
|
||
};
|
||
|
||
const deleteEverything = async () => {
|
||
for (const storeName of ALL_STORES) {
|
||
await new Promise(resolve => {
|
||
const store = transaction.objectStore(storeName);
|
||
const request = store.clear();
|
||
|
||
request.onsuccess = () => {
|
||
resolve();
|
||
};
|
||
});
|
||
}
|
||
|
||
resolveTransaction();
|
||
};
|
||
|
||
deleteEverything();
|
||
}));
|
||
/**
|
||
* @param {VirtualMachine} vm scratch-vm instance
|
||
* @param {number} id the restore point's ID
|
||
* @returns {Promise<ArrayBuffer>} Resolves with sb3 file
|
||
*/
|
||
|
||
|
||
const loadRestorePoint = (vm, id) => openDB().then(db => new Promise((resolveTransaction, rejectTransaction) => {
|
||
const transaction = db.transaction([METADATA_STORE, PROJECT_STORE, ASSET_STORE], 'readonly');
|
||
|
||
transaction.onerror = () => {
|
||
rejectTransaction(new Error("Transaction error: ".concat(transaction.error)));
|
||
};
|
||
|
||
const zip = new jszip__WEBPACK_IMPORTED_MODULE_0___default.a();
|
||
/** @type {Metadata} */
|
||
|
||
let metadata; // TODO: we should be able to use a custom scratch-storage helper to avoid putting the
|
||
// zip in memory.
|
||
|
||
const loadVM = () => {
|
||
resolveTransaction(zip.generateAsync({
|
||
// Don't bother compressing it since it will be immediately decompressed
|
||
type: 'arraybuffer'
|
||
}).then(sb3 => vm.loadProject(sb3)).then(() => {
|
||
setTimeout(() => {
|
||
vm.renderer.draw();
|
||
});
|
||
}));
|
||
};
|
||
|
||
const loadAssets = async () => {
|
||
const assetStore = transaction.objectStore(ASSET_STORE);
|
||
|
||
for (const assetId of Object.keys(metadata.assets)) {
|
||
await new Promise(resolve => {
|
||
const request = assetStore.get(assetId);
|
||
|
||
request.onsuccess = () => {
|
||
const data = request.result;
|
||
zip.file(assetId, data);
|
||
resolve();
|
||
};
|
||
});
|
||
}
|
||
|
||
loadVM();
|
||
};
|
||
|
||
const loadProjectJSON = () => {
|
||
const projectStore = transaction.objectStore(PROJECT_STORE);
|
||
const request = projectStore.get(id);
|
||
|
||
request.onsuccess = () => {
|
||
zip.file('project.json', request.result);
|
||
loadAssets();
|
||
};
|
||
};
|
||
|
||
const loadMetadata = () => {
|
||
const metadataStore = transaction.objectStore(METADATA_STORE);
|
||
const request = metadataStore.get(id);
|
||
|
||
request.onsuccess = () => {
|
||
metadata = parseMetadata(request.result);
|
||
loadProjectJSON();
|
||
};
|
||
};
|
||
|
||
vm.stop();
|
||
loadMetadata();
|
||
})); // eslint-disable-next-line valid-jsdoc
|
||
|
||
/**
|
||
* @returns {Promise<{totalSize: number; restorePoints: Array<Manifest & {id: number}>}>} Restore point information.
|
||
*/
|
||
|
||
|
||
const getAllRestorePoints = () => openDB().then(db => new Promise((resolve, reject) => {
|
||
const transaction = db.transaction([METADATA_STORE], 'readonly');
|
||
|
||
transaction.onerror = () => {
|
||
reject(new Error("Transaction error: ".concat(transaction.error)));
|
||
};
|
||
/** @type {Metadata[]} */
|
||
|
||
|
||
const restorePoints = [];
|
||
/** @type {Set<string>} */
|
||
|
||
const countedAssets = new Set();
|
||
let totalSize = 0;
|
||
const metadataStore = transaction.objectStore(METADATA_STORE);
|
||
const request = metadataStore.openCursor(null, 'prev');
|
||
|
||
request.onsuccess = () => {
|
||
const cursor = request.result;
|
||
|
||
if (cursor) {
|
||
const parsed = parseMetadata(cursor.value);
|
||
parsed.id = cursor.key;
|
||
restorePoints.push(parsed);
|
||
totalSize += parsed.projectSize;
|
||
totalSize += parsed.thumbnailSize;
|
||
|
||
for (const [assetId, assetSize] of Object.entries(parsed.assets)) {
|
||
if (!countedAssets.has(assetId)) {
|
||
countedAssets.add(assetId);
|
||
totalSize += assetSize;
|
||
}
|
||
}
|
||
|
||
cursor.continue();
|
||
} else {
|
||
resolve({
|
||
totalSize,
|
||
restorePoints
|
||
});
|
||
}
|
||
};
|
||
}));
|
||
/**
|
||
* @param {number} id restore point's ID
|
||
* @returns {Promise<string>} The URL to load
|
||
*/
|
||
|
||
|
||
const getThumbnail = id => openDB().then(db => new Promise((resolve, reject) => {
|
||
const transaction = db.transaction([THUMBNAIL_STORE], 'readonly');
|
||
|
||
transaction.onerror = () => {
|
||
reject(new Error("Transaction error: ".concat(transaction.error)));
|
||
};
|
||
|
||
const thumbnailStore = transaction.objectStore(THUMBNAIL_STORE);
|
||
const request = thumbnailStore.get(id);
|
||
|
||
request.onsuccess = () => {
|
||
const thumbnail = request.result;
|
||
|
||
if (!thumbnail) {
|
||
reject(new Error('No thumbnail found'));
|
||
return;
|
||
}
|
||
|
||
const blob = new Blob([thumbnail.data], {
|
||
type: thumbnail.type
|
||
});
|
||
const url = URL.createObjectURL(blob);
|
||
resolve(url);
|
||
};
|
||
}));
|
||
|
||
const deleteLegacyRestorePoint = () => {
|
||
const LEGACY_DATABASE_NAME = 'TW_AutoSave';
|
||
|
||
try {
|
||
if (typeof indexedDB !== 'undefined') {
|
||
const _request = indexedDB.deleteDatabase(LEGACY_DATABASE_NAME); // don't really care what happens to the request at this point
|
||
|
||
}
|
||
} catch (e) {// ignore
|
||
}
|
||
};
|
||
|
||
const DEFAULT_INTERVAL = 1000 * 60 * 5;
|
||
const INTERVAL_STORAGE_KEY = 'tw:restore-point-interval';
|
||
|
||
const readInterval = () => {
|
||
try {
|
||
const stored = localStorage.getItem(INTERVAL_STORAGE_KEY);
|
||
|
||
if (stored) {
|
||
const number = +stored;
|
||
|
||
if (Number.isFinite(number)) {
|
||
return number;
|
||
}
|
||
} // TODO: this is temporary, remove it after enough has passed for people that care to have migrated
|
||
|
||
|
||
const addonSettings = localStorage.getItem('tw:addons');
|
||
|
||
if (addonSettings) {
|
||
const parsedAddonSettings = JSON.parse(addonSettings);
|
||
const addonObject = parsedAddonSettings['tw-disable-restore-points'];
|
||
|
||
if (addonObject && addonObject.enabled) {
|
||
return -1;
|
||
}
|
||
}
|
||
} catch (e) {// ignore
|
||
}
|
||
|
||
return DEFAULT_INTERVAL;
|
||
};
|
||
|
||
const setInterval = interval => {
|
||
try {
|
||
localStorage.setItem(INTERVAL_STORAGE_KEY, interval);
|
||
} catch (err) {// ignore
|
||
}
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = ({
|
||
TYPE_AUTOMATIC,
|
||
TYPE_MANUAL,
|
||
getAllRestorePoints,
|
||
createRestorePoint,
|
||
removeExtraneousRestorePoints,
|
||
deleteRestorePoint,
|
||
deleteAllRestorePoints,
|
||
getThumbnail,
|
||
loadRestorePoint,
|
||
deleteLegacyRestorePoint,
|
||
readInterval,
|
||
setInterval
|
||
});
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-scratch-paint.js":
|
||
/*!*************************************!*\
|
||
!*** ./src/lib/tw-scratch-paint.js ***!
|
||
\*************************************/
|
||
/*! exports provided: default, ScratchPaintReducer */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return PaintEditor; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ScratchPaintReducer", function() { return ScratchPaintReducer; });
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
|
||
let realScratchPaint;
|
||
|
||
const getRealScratchPaint = () => {
|
||
if (!realScratchPaint) {
|
||
realScratchPaint = __webpack_require__(/*! scratch-paint */ "./node_modules/scratch-paint/src/index.js");
|
||
}
|
||
|
||
return realScratchPaint;
|
||
};
|
||
|
||
const PaintEditor = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(getRealScratchPaint().default, props);
|
||
|
||
let hasSetupReducer = false;
|
||
|
||
const ScratchPaintReducer = (state, action) => {
|
||
if (!hasSetupReducer && action.type === 'scratch-gui/navigation/ACTIVATE_TAB' && action.activeTabIndex === 1) {
|
||
hasSetupReducer = true;
|
||
}
|
||
|
||
if (hasSetupReducer) {
|
||
return getRealScratchPaint().ScratchPaintReducer(state, action);
|
||
}
|
||
|
||
return {};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-scratch-render-fonts/Grand9K-Pixel.ttf":
|
||
/*!***********************************************************!*\
|
||
!*** ./src/lib/tw-scratch-render-fonts/Grand9K-Pixel.ttf ***!
|
||
\***********************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/87a3a62c0627e925b92d3ede2f62b04f.ttf";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-scratch-render-fonts/Griffy-Regular.ttf":
|
||
/*!************************************************************!*\
|
||
!*** ./src/lib/tw-scratch-render-fonts/Griffy-Regular.ttf ***!
|
||
\************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/eb64e706eb7a3b324ba50d3279a980b1.ttf";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-scratch-render-fonts/Knewave.ttf":
|
||
/*!*****************************************************!*\
|
||
!*** ./src/lib/tw-scratch-render-fonts/Knewave.ttf ***!
|
||
\*****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/3682b35e452a7f4a5a61167d1632e24a.ttf";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-scratch-render-fonts/NotoSans-Medium.ttf":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/lib/tw-scratch-render-fonts/NotoSans-Medium.ttf ***!
|
||
\*************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/9ec3449723269a806ec6eaba0f8f6cef.ttf";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-scratch-render-fonts/Scratch.ttf":
|
||
/*!*****************************************************!*\
|
||
!*** ./src/lib/tw-scratch-render-fonts/Scratch.ttf ***!
|
||
\*****************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/bbc0dd79717bfa338a199bb26cdd780b.ttf";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-scratch-render-fonts/SourceSerifPro-Regular.otf":
|
||
/*!********************************************************************!*\
|
||
!*** ./src/lib/tw-scratch-render-fonts/SourceSerifPro-Regular.otf ***!
|
||
\********************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/8996930d8e83f63cc3341172205df460.otf";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-scratch-render-fonts/handlee-regular.ttf":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/lib/tw-scratch-render-fonts/handlee-regular.ttf ***!
|
||
\*************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__.p + "static/assets/64bcfe1f13fce38e2ea26280157ff2ce.ttf";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-scratch-render-fonts/index.js":
|
||
/*!**************************************************!*\
|
||
!*** ./src/lib/tw-scratch-render-fonts/index.js ***!
|
||
\**************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* eslint-disable import/no-commonjs */
|
||
const SansSerif = __webpack_require__(/*! ./NotoSans-Medium.ttf */ "./src/lib/tw-scratch-render-fonts/NotoSans-Medium.ttf");
|
||
|
||
const Serif = __webpack_require__(/*! ./SourceSerifPro-Regular.otf */ "./src/lib/tw-scratch-render-fonts/SourceSerifPro-Regular.otf");
|
||
|
||
const Handwriting = __webpack_require__(/*! ./handlee-regular.ttf */ "./src/lib/tw-scratch-render-fonts/handlee-regular.ttf");
|
||
|
||
const Marker = __webpack_require__(/*! ./Knewave.ttf */ "./src/lib/tw-scratch-render-fonts/Knewave.ttf");
|
||
|
||
const Curly = __webpack_require__(/*! ./Griffy-Regular.ttf */ "./src/lib/tw-scratch-render-fonts/Griffy-Regular.ttf");
|
||
|
||
const Pixel = __webpack_require__(/*! ./Grand9K-Pixel.ttf */ "./src/lib/tw-scratch-render-fonts/Grand9K-Pixel.ttf");
|
||
|
||
const Scratch = __webpack_require__(/*! ./Scratch.ttf */ "./src/lib/tw-scratch-render-fonts/Scratch.ttf");
|
||
|
||
const log = __webpack_require__(/*! ../log */ "./src/lib/log.js").default;
|
||
|
||
const fontSource = {
|
||
'Sans Serif': SansSerif,
|
||
'Serif': Serif,
|
||
'Handwriting': Handwriting,
|
||
'Marker': Marker,
|
||
'Curly': Curly,
|
||
'Pixel': Pixel,
|
||
'Scratch': Scratch
|
||
};
|
||
const fontData = {};
|
||
|
||
const fetchFonts = () => {
|
||
const promises = [];
|
||
|
||
for (const fontName of Object.keys(fontSource)) {
|
||
promises.push(fetch(fontSource[fontName]).then(res => {
|
||
if (!res.ok) {
|
||
throw new Error("Cannot load font: ".concat(fontName, " (invalid HTTP response)"));
|
||
}
|
||
|
||
return res.blob();
|
||
}).then(blob => new Promise((resolve, reject) => {
|
||
const fr = new FileReader();
|
||
|
||
fr.onload = () => resolve(fr.result);
|
||
|
||
fr.onerror = () => reject(new Error("Cannot load font: ".concat(fontName, " (could not read)")));
|
||
|
||
fr.readAsDataURL(blob);
|
||
})).then(url => {
|
||
fontData[fontName] = "@font-face{font-family:\"".concat(fontName, "\";src:url(\"").concat(url, "\");}");
|
||
}).catch(err => {
|
||
log.error(err);
|
||
}));
|
||
}
|
||
|
||
return Promise.all(promises);
|
||
};
|
||
|
||
const addFontsToDocument = () => {
|
||
if (document.getElementById('scratch-font-styles')) {
|
||
return;
|
||
}
|
||
|
||
let css = '';
|
||
|
||
for (const fontName of Object.keys(fontSource)) {
|
||
const fontCSS = fontData[fontName];
|
||
|
||
if (fontCSS) {
|
||
css += fontCSS;
|
||
}
|
||
}
|
||
|
||
const documentStyleTag = document.createElement('style');
|
||
documentStyleTag.id = 'scratch-font-styles';
|
||
documentStyleTag.textContent = css;
|
||
document.body.insertBefore(documentStyleTag, document.body.firstChild);
|
||
};
|
||
|
||
const waitForFontsToLoad = () => {
|
||
const promises = [];
|
||
|
||
if (document.fonts && document.fonts.load) {
|
||
for (const fontName in fontData) {
|
||
promises.push(document.fonts.load("12px ".concat(fontName)));
|
||
}
|
||
}
|
||
|
||
return Promise.all(promises);
|
||
};
|
||
|
||
const loadFonts = () => fetchFonts().then(() => {
|
||
addFontsToDocument();
|
||
return waitForFontsToLoad();
|
||
}).catch(err => {
|
||
log.error(err);
|
||
});
|
||
|
||
const getFonts = () => fontData; // We have to use legacy module.exports as some parts of Scratch expect require('scratch-render-font') to be a function
|
||
|
||
|
||
module.exports = getFonts;
|
||
module.exports.loadFonts = loadFonts;
|
||
module.exports.FONTS = fontData;
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-security-manager-constants.js":
|
||
/*!**************************************************!*\
|
||
!*** ./src/lib/tw-security-manager-constants.js ***!
|
||
\**************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
const SecurityModals = {
|
||
LoadExtension: 'LoadExtension',
|
||
Fetch: 'Fetch',
|
||
OpenWindow: 'OpenWindow',
|
||
Redirect: 'Redirect',
|
||
RecordAudio: 'RecordAudio',
|
||
RecordVideo: 'RecordVideo',
|
||
ReadClipboard: 'ReadClipboard',
|
||
Notify: 'Notify',
|
||
Geolocate: 'Geolocate',
|
||
Embed: 'Embed'
|
||
};
|
||
/* harmony default export */ __webpack_exports__["default"] = (SecurityModals);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-state-manager-hoc.jsx":
|
||
/*!******************************************!*\
|
||
!*** ./src/lib/tw-state-manager-hoc.jsx ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TWStateManager; });
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./log */ "./src/lib/log.js");
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/tw */ "./src/reducers/tw.js");
|
||
/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../reducers/project-state */ "./src/reducers/project-state.js");
|
||
/* harmony import */ var _reducers_mode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../reducers/mode */ "./src/reducers/mode.js");
|
||
/* harmony import */ var _tw_username__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./tw-username */ "./src/lib/tw-username.js");
|
||
/* harmony import */ var _tw_navigation_utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./tw-navigation-utils */ "./src/lib/tw-navigation-utils.js");
|
||
/* harmony import */ var _reducers_custom_stage_size__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../reducers/custom-stage-size */ "./src/reducers/custom-stage-size.js");
|
||
const _excluded = ["intl", "customStageSize", "isFullScreen", "isPlayerOnly", "isEmbedded", "projectChanged", "compilerOptions", "runtimeOptions", "highQualityPen", "framerate", "interpolation", "turbo", "onSetIsFullScreen", "onSetIsPlayerOnly", "onSetProjectId", "onSetUsername", "reduxProjectId", "routingStyle", "username", "vm"];
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/* eslint-disable no-alert */
|
||
|
||
const messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_6__["defineMessages"])({
|
||
invalidFPS: {
|
||
"id": "tw.invalidParameters.fps",
|
||
"defaultMessage": "\"fps\" URL parameter is invalid"
|
||
},
|
||
invalidClones: {
|
||
"id": "tw.invalidParameters.clones",
|
||
"defaultMessage": "\"clone\" URL parameter is invalid"
|
||
}
|
||
});
|
||
const USERNAME_KEY = 'tw:username';
|
||
/**
|
||
* The State Manager is responsible for managing persistent state and the URL.
|
||
*/
|
||
|
||
const setLocalStorage = (key, value) => {
|
||
try {
|
||
localStorage.setItem(key, value);
|
||
} catch (e) {// ignore
|
||
}
|
||
};
|
||
|
||
const getLocalStorage = key => {
|
||
try {
|
||
return localStorage.getItem(key);
|
||
} catch (e) {// ignore
|
||
}
|
||
|
||
return null;
|
||
};
|
||
|
||
const readHashProjectId = () => {
|
||
const match = location.hash.match(/#(\d+)/);
|
||
return match === null ? null : match[1];
|
||
};
|
||
|
||
class Router {
|
||
constructor({
|
||
onSetProjectId,
|
||
onSetIsPlayerOnly,
|
||
onSetIsFullScreen
|
||
}) {
|
||
this.onSetProjectId = onSetProjectId;
|
||
this.onSetIsPlayerOnly = onSetIsPlayerOnly;
|
||
this.onSetIsFullScreen = onSetIsFullScreen;
|
||
}
|
||
|
||
onhashchange() {}
|
||
|
||
onpathchange() {}
|
||
|
||
generateURL() {
|
||
return '';
|
||
}
|
||
|
||
}
|
||
|
||
class HashRouter extends Router {
|
||
onhashchange() {
|
||
this.onSetProjectId(readHashProjectId() || _reducers_project_state__WEBPACK_IMPORTED_MODULE_8__["defaultProjectId"]);
|
||
}
|
||
|
||
generateURL({
|
||
projectId
|
||
}) {
|
||
const hashQuery = location.hash.split('?')[1];
|
||
return "".concat(location.pathname).concat(location.search, "#").concat(projectId).concat(hashQuery ? "?".concat(hashQuery) : '');
|
||
}
|
||
|
||
}
|
||
|
||
class FileHashRouter extends HashRouter {
|
||
constructor(callbacks) {
|
||
super(callbacks);
|
||
this.playerPath = location.pathname.substring(0, location.pathname.lastIndexOf('/') + 1);
|
||
this.editorPath = "".concat(this.playerPath, "editor.html");
|
||
this.fullscreenPath = "".concat(this.playerPath, "fullscreen.html");
|
||
}
|
||
|
||
onpathchange() {
|
||
const pathName = location.pathname;
|
||
|
||
if (pathName === this.playerPath) {
|
||
this.onSetIsPlayerOnly(true);
|
||
this.onSetIsFullScreen(false);
|
||
} else if (pathName === this.editorPath) {
|
||
this.onSetIsPlayerOnly(false);
|
||
this.onSetIsFullScreen(false);
|
||
} else if (pathName === this.fullscreenPath) {
|
||
this.onSetIsFullScreen(true);
|
||
}
|
||
}
|
||
|
||
generateURL({
|
||
projectId,
|
||
isPlayerOnly,
|
||
isFullScreen
|
||
}) {
|
||
let newPathname = '';
|
||
let newHash = '';
|
||
|
||
if (projectId !== '0') {
|
||
newHash = projectId;
|
||
}
|
||
|
||
const hashQuery = location.hash.split('?')[1];
|
||
|
||
if (hashQuery) {
|
||
newHash += "?".concat(hashQuery);
|
||
}
|
||
|
||
if (isFullScreen) {
|
||
newPathname = this.fullscreenPath;
|
||
} else if (isPlayerOnly) {
|
||
newPathname = this.playerPath;
|
||
} else {
|
||
newPathname = this.editorPath;
|
||
}
|
||
|
||
return "".concat(newPathname).concat(location.search).concat(newHash ? "#".concat(newHash) : '');
|
||
}
|
||
|
||
}
|
||
|
||
const getCanonicalLinkElement = () => {
|
||
let el = document.querySelector('link[rel=canonical]');
|
||
|
||
if (!el) {
|
||
el = document.createElement('link');
|
||
el.rel = 'canonical';
|
||
document.head.appendChild(el);
|
||
}
|
||
|
||
return el;
|
||
};
|
||
|
||
class WildcardRouter extends Router {
|
||
constructor(callbacks) {
|
||
super(callbacks);
|
||
this.root = "";
|
||
}
|
||
|
||
onhashchange() {
|
||
const hashProjectId = readHashProjectId();
|
||
|
||
if (hashProjectId) {
|
||
const ok = this.onSetProjectId(hashProjectId);
|
||
|
||
if (ok) {
|
||
// Completely remove the hash
|
||
history.replaceState(null, null, "".concat(location.pathname).concat(location.search));
|
||
}
|
||
} else {
|
||
// Do not detect page type here as it is already setup by index.html, editor.html, etc.
|
||
this.parseURL(false);
|
||
}
|
||
}
|
||
|
||
onpathchange() {
|
||
this.parseURL(true);
|
||
}
|
||
|
||
parseURL(detectPageType) {
|
||
const path = location.pathname.substr(this.root.length);
|
||
const parts = path.split('/');
|
||
|
||
const parseProjectId = id => {
|
||
if (id) {
|
||
this.onSetProjectId(id);
|
||
} else {
|
||
this.onSetProjectId(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__["defaultProjectId"]);
|
||
}
|
||
};
|
||
|
||
const parsePageType = type => {
|
||
if (!detectPageType) {
|
||
return;
|
||
}
|
||
|
||
if (type === 'fullscreen') {
|
||
this.onSetIsFullScreen(true);
|
||
} else if (type === 'editor') {
|
||
this.onSetIsPlayerOnly(false);
|
||
this.onSetIsFullScreen(false);
|
||
} else {
|
||
this.onSetIsPlayerOnly(true);
|
||
this.onSetIsFullScreen(false);
|
||
}
|
||
};
|
||
|
||
if (+parts[0] && Number.isFinite(+parts[0])) {
|
||
parseProjectId(parts[0]);
|
||
parsePageType(parts[1]);
|
||
} else {
|
||
this.onSetProjectId(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__["defaultProjectId"]);
|
||
parsePageType(parts[0]);
|
||
}
|
||
}
|
||
|
||
generateURL({
|
||
projectId,
|
||
isPlayerOnly,
|
||
isFullScreen
|
||
}) {
|
||
const parts = [];
|
||
|
||
if (projectId !== '0') {
|
||
parts.push(projectId);
|
||
}
|
||
|
||
if (isFullScreen) {
|
||
parts.push('fullscreen');
|
||
} else if (!isPlayerOnly) {
|
||
parts.push('editor');
|
||
}
|
||
|
||
const path = "".concat(this.root).concat(parts.join('/'));
|
||
const canonical = "".concat(location.origin).concat(this.root).concat(projectId === '0' ? '' : projectId);
|
||
getCanonicalLinkElement().href = canonical;
|
||
return "".concat(path).concat(location.search).concat(location.hash);
|
||
}
|
||
|
||
}
|
||
|
||
const routers = {
|
||
none: Router,
|
||
hash: HashRouter,
|
||
filehash: FileHashRouter,
|
||
wildcard: WildcardRouter
|
||
};
|
||
/**
|
||
* Return the optimal Router for the current environment
|
||
* @param {string} style Routing style name
|
||
* @param {*} callbacks Redux callbacks
|
||
* @returns {Router} The optimal router for the current environment
|
||
*/
|
||
|
||
const createRouter = (style, callbacks) => {
|
||
const supportedStyles = ['none', 'hash']; // FileHashRouter is not supported on non-http(s) protocols.
|
||
|
||
const isHTTP = location.protocol === 'http:' || location.protocol === 'https:';
|
||
|
||
if (isHTTP) {
|
||
supportedStyles.push('filehash');
|
||
} // WildcardRouter is not supported if ROOT is not set.
|
||
|
||
|
||
if (false) {}
|
||
|
||
if (!supportedStyles.includes(style)) {
|
||
_log__WEBPACK_IMPORTED_MODULE_5__["default"].warn("routing style is unknown or not supported: ".concat(style, ", falling back to hash"));
|
||
style = 'hash';
|
||
}
|
||
|
||
if (routers.hasOwnProperty(style)) {
|
||
return new routers[style](callbacks);
|
||
}
|
||
|
||
throw new Error("unknown router: ".concat(style));
|
||
};
|
||
|
||
const TWStateManager = function TWStateManager(WrappedComponent) {
|
||
class StateManagerComponent extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default()(this, ['handleHashChange', 'handlePopState', 'onSetProjectId', 'onSetIsPlayerOnly', 'onSetIsFullScreen']);
|
||
}
|
||
|
||
componentDidMount() {
|
||
const urlParams = new URLSearchParams(location.search);
|
||
|
||
if (urlParams.has('fps')) {
|
||
const fps = +urlParams.get('fps');
|
||
|
||
if (Number.isNaN(fps) || fps < 0) {
|
||
alert(this.props.intl.formatMessage(messages.invalidFPS));
|
||
} else {
|
||
this.props.vm.setFramerate(fps);
|
||
}
|
||
} else if (urlParams.has('60fps')) {
|
||
this.props.vm.setFramerate(60);
|
||
}
|
||
|
||
if (urlParams.has('interpolate')) {
|
||
this.props.vm.setInterpolation(true);
|
||
}
|
||
|
||
if (urlParams.has('username')) {
|
||
const username = urlParams.get('username'); // Do not save username when loaded from URL
|
||
|
||
this.doNotPersistUsername = username;
|
||
this.props.onSetUsername(username);
|
||
} else {
|
||
const persistentUsername = this.props.isEmbedded ? null : getLocalStorage(USERNAME_KEY);
|
||
|
||
if (persistentUsername === null) {
|
||
const randomUsername = Object(_tw_username__WEBPACK_IMPORTED_MODULE_10__["generateRandomUsername"])();
|
||
this.props.onSetUsername(randomUsername);
|
||
|
||
if (this.props.isEmbedded) {
|
||
this.doNotPersistUsername = randomUsername;
|
||
}
|
||
} else {
|
||
this.props.onSetUsername(persistentUsername);
|
||
}
|
||
}
|
||
|
||
if (urlParams.has('hqpen')) {
|
||
this.props.vm.renderer.setUseHighQualityRender(true);
|
||
}
|
||
|
||
if (urlParams.has('turbo')) {
|
||
this.props.vm.setTurboMode(true);
|
||
}
|
||
|
||
if (urlParams.has('stuck') || urlParams.has('warp_timer')) {
|
||
this.props.vm.setCompilerOptions({
|
||
warpTimer: true
|
||
});
|
||
}
|
||
|
||
if (urlParams.has('nocompile')) {
|
||
this.props.vm.setCompilerOptions({
|
||
enabled: false
|
||
});
|
||
}
|
||
|
||
if (urlParams.has('clones')) {
|
||
const clones = +urlParams.get('clones');
|
||
|
||
if (Number.isNaN(clones) || clones < 0) {
|
||
alert(this.props.intl.formatMessage(messages.invalidClones));
|
||
} else {
|
||
this.props.vm.setRuntimeOptions({
|
||
maxClones: clones
|
||
});
|
||
}
|
||
}
|
||
|
||
if (urlParams.has('offscreen')) {
|
||
this.props.vm.setRuntimeOptions({
|
||
fencing: false
|
||
});
|
||
}
|
||
|
||
if (urlParams.has('limitless')) {
|
||
this.props.vm.setRuntimeOptions({
|
||
miscLimits: false
|
||
});
|
||
}
|
||
|
||
for (const extension of urlParams.getAll('extension')) {
|
||
this.props.vm.extensionManager.loadExtensionURL(extension);
|
||
}
|
||
|
||
const routerCallbacks = {
|
||
onSetProjectId: this.onSetProjectId,
|
||
onSetIsPlayerOnly: this.onSetIsPlayerOnly,
|
||
onSetIsFullScreen: this.onSetIsFullScreen
|
||
};
|
||
this.router = createRouter(this.props.routingStyle, routerCallbacks);
|
||
this.router.onhashchange();
|
||
window.addEventListener('hashchange', this.handleHashChange);
|
||
window.addEventListener('popstate', this.handlePopState);
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
if (this.props.username !== prevProps.username && this.props.username !== this.doNotPersistUsername) {
|
||
// TODO: this always restores the current username once at startup, which is unnecessary
|
||
setLocalStorage(USERNAME_KEY, this.props.username);
|
||
}
|
||
|
||
if (this.props.reduxProjectId !== prevProps.reduxProjectId || this.props.isPlayerOnly !== prevProps.isPlayerOnly || this.props.isFullScreen !== prevProps.isFullScreen) {
|
||
const oldPath = "".concat(location.pathname).concat(location.search).concat(location.hash);
|
||
const routerState = {
|
||
projectId: this.props.reduxProjectId,
|
||
isPlayerOnly: this.props.isPlayerOnly,
|
||
isFullScreen: this.props.isFullScreen
|
||
};
|
||
const newPath = this.router.generateURL(routerState);
|
||
|
||
if (newPath && newPath !== oldPath) {
|
||
history.pushState(null, null, newPath);
|
||
}
|
||
}
|
||
|
||
if (this.props.customStageSize !== prevProps.customStageSize || this.props.runtimeOptions !== prevProps.runtimeOptions || this.props.compilerOptions !== prevProps.compilerOptions || this.props.highQualityPen !== prevProps.highQualityPen || this.props.framerate !== prevProps.framerate || this.props.interpolation !== prevProps.interpolation || this.props.turbo !== prevProps.turbo) {
|
||
const searchParams = new URLSearchParams(location.search);
|
||
const runtimeOptions = this.props.runtimeOptions;
|
||
const compilerOptions = this.props.compilerOptions; // Always remove legacy parameter
|
||
|
||
searchParams.delete('60fps');
|
||
const {
|
||
width,
|
||
height
|
||
} = this.props.customStageSize;
|
||
|
||
if (width === _reducers_custom_stage_size__WEBPACK_IMPORTED_MODULE_12__["defaultStageSize"].width && height === _reducers_custom_stage_size__WEBPACK_IMPORTED_MODULE_12__["defaultStageSize"].height) {
|
||
searchParams.delete('size');
|
||
} else {
|
||
searchParams.set('size', "".concat(width, "x").concat(height));
|
||
}
|
||
|
||
if (this.props.framerate === 30) {
|
||
searchParams.delete('fps');
|
||
} else {
|
||
searchParams.set('fps', this.props.framerate);
|
||
}
|
||
|
||
if (this.props.interpolation) {
|
||
searchParams.set('interpolate', '');
|
||
} else {
|
||
searchParams.delete('interpolate');
|
||
}
|
||
|
||
if (this.props.turbo) {
|
||
searchParams.set('turbo', '');
|
||
} else {
|
||
searchParams.delete('turbo');
|
||
}
|
||
|
||
if (this.props.highQualityPen) {
|
||
searchParams.set('hqpen', '');
|
||
} else {
|
||
searchParams.delete('hqpen');
|
||
}
|
||
|
||
if (compilerOptions.enabled) {
|
||
searchParams.delete('nocompile');
|
||
}
|
||
|
||
if (this.props.isPlayerOnly) {
|
||
if (compilerOptions.warpTimer) {
|
||
searchParams.set('stuck', '');
|
||
} else {
|
||
searchParams.delete('stuck');
|
||
}
|
||
} else {// Leave ?stuck as-is when in editor
|
||
}
|
||
|
||
if (runtimeOptions.maxClones === 300) {
|
||
searchParams.delete('clones');
|
||
} else {
|
||
searchParams.set('clones', runtimeOptions.maxClones);
|
||
}
|
||
|
||
if (runtimeOptions.fencing) {
|
||
searchParams.delete('offscreen');
|
||
} else {
|
||
searchParams.set('offscreen', '');
|
||
}
|
||
|
||
if (runtimeOptions.miscLimits) {
|
||
searchParams.delete('limitless');
|
||
} else {
|
||
searchParams.set('limitless', '');
|
||
}
|
||
|
||
Object(_tw_navigation_utils__WEBPACK_IMPORTED_MODULE_11__["setSearchParams"])(searchParams);
|
||
}
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
window.removeEventListener('hashchange', this.handleHashChange);
|
||
window.removeEventListener('popstate', this.handlePopState);
|
||
}
|
||
|
||
handleHashChange() {
|
||
this.router.onhashchange();
|
||
}
|
||
|
||
handlePopState() {
|
||
this.router.onpathchange();
|
||
}
|
||
|
||
onSetProjectId(id) {
|
||
if ("".concat(id) === "".concat(this.props.reduxProjectId)) {
|
||
return true;
|
||
}
|
||
|
||
if (this.props.projectChanged) {
|
||
if (!confirm('Are you sure you want to switch project?')) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
this.props.onSetProjectId(id);
|
||
return true;
|
||
}
|
||
|
||
onSetIsPlayerOnly(isPlayerOnly) {
|
||
this.props.onSetIsPlayerOnly(isPlayerOnly);
|
||
}
|
||
|
||
onSetIsFullScreen(isFullScreen) {
|
||
this.props.onSetIsFullScreen(isFullScreen);
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
intl,
|
||
customStageSize,
|
||
isFullScreen,
|
||
isPlayerOnly,
|
||
isEmbedded,
|
||
projectChanged,
|
||
compilerOptions,
|
||
runtimeOptions,
|
||
highQualityPen,
|
||
framerate,
|
||
interpolation,
|
||
turbo,
|
||
onSetIsFullScreen,
|
||
onSetIsPlayerOnly,
|
||
onSetProjectId,
|
||
onSetUsername,
|
||
reduxProjectId,
|
||
routingStyle,
|
||
username,
|
||
vm
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(WrappedComponent, props);
|
||
}
|
||
|
||
}
|
||
|
||
StateManagerComponent.propTypes = {
|
||
intl: react_intl__WEBPACK_IMPORTED_MODULE_6__["intlShape"],
|
||
customStageSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
width: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
}),
|
||
isFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isPlayerOnly: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isEmbedded: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
projectChanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
projectId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
compilerOptions: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
enabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
warpTimer: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool
|
||
}),
|
||
runtimeOptions: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({
|
||
miscLimits: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
fencing: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
maxClones: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number
|
||
}),
|
||
highQualityPen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
framerate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
|
||
interpolation: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
turbo: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onSetIsFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onSetIsPlayerOnly: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onSetProjectId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onSetUsername: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
reduxProjectId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number]),
|
||
routingStyle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(Object.keys(routers)),
|
||
username: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a)
|
||
};
|
||
StateManagerComponent.defaultProps = {
|
||
routingStyle: "filehash"
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
customStageSize: state.scratchGui.customStageSize,
|
||
isFullScreen: state.scratchGui.mode.isFullScreen,
|
||
isPlayerOnly: state.scratchGui.mode.isPlayerOnly,
|
||
isEmbedded: state.scratchGui.mode.isEmbedded,
|
||
projectChanged: state.scratchGui.projectChanged,
|
||
reduxProjectId: state.scratchGui.projectState.projectId,
|
||
compilerOptions: state.scratchGui.tw.compilerOptions,
|
||
runtimeOptions: state.scratchGui.tw.runtimeOptions,
|
||
highQualityPen: state.scratchGui.tw.highQualityPen,
|
||
framerate: state.scratchGui.tw.framerate,
|
||
interpolation: state.scratchGui.tw.interpolation,
|
||
turbo: state.scratchGui.vmStatus.turbo,
|
||
username: state.scratchGui.tw.username,
|
||
vm: state.scratchGui.vm
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onSetIsFullScreen: isFullScreen => dispatch(Object(_reducers_mode__WEBPACK_IMPORTED_MODULE_9__["setFullScreen"])(isFullScreen)),
|
||
onSetIsPlayerOnly: isPlayerOnly => dispatch(Object(_reducers_mode__WEBPACK_IMPORTED_MODULE_9__["setPlayer"])(isPlayerOnly)),
|
||
onSetProjectId: projectId => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__["setProjectId"])(projectId)),
|
||
onSetUsername: username => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_7__["setUsername"])(username))
|
||
});
|
||
|
||
return Object(react_intl__WEBPACK_IMPORTED_MODULE_6__["injectIntl"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_2__["connect"])(mapStateToProps, mapDispatchToProps)(StateManagerComponent));
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-svg-fixer.js":
|
||
/*!*********************************!*\
|
||
!*** ./src/lib/tw-svg-fixer.js ***!
|
||
\*********************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _tw_text_encoder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tw-text-encoder */ "./src/lib/tw-text-encoder.js");
|
||
|
||
|
||
const fixSVG = fileData => {
|
||
// width="100%" and height="100%" on SVGs can break things
|
||
// Demo: https://scratch.mit.edu/projects/447085841/
|
||
// Based on: https://github.com/ScratchAddons/ScratchAddons/pull/748
|
||
try {
|
||
const bytes = new Uint8Array(fileData);
|
||
const str = new _tw_text_encoder__WEBPACK_IMPORTED_MODULE_0__["TextDecoder"]().decode(bytes);
|
||
const xmlDocument = new DOMParser().parseFromString(str, 'text/xml');
|
||
const svgElement = xmlDocument.children[0];
|
||
|
||
if (svgElement.height.baseVal.valueAsString === '100%' && svgElement.width.baseVal.valueAsString === '100%') {
|
||
svgElement.removeAttribute('height');
|
||
svgElement.removeAttribute('width');
|
||
const fixed = xmlDocument.documentElement.outerHTML;
|
||
return new _tw_text_encoder__WEBPACK_IMPORTED_MODULE_0__["TextEncoder"]().encode(fixed).buffer;
|
||
}
|
||
|
||
return fileData;
|
||
} catch (e) {
|
||
return fileData;
|
||
}
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (fixSVG);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-text-encoder.js":
|
||
/*!************************************!*\
|
||
!*** ./src/lib/tw-text-encoder.js ***!
|
||
\************************************/
|
||
/*! exports provided: TextEncoder, TextDecoder */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextEncoder", function() { return _TextEncoder; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextDecoder", function() { return _TextDecoder; });
|
||
const _TextEncoder = typeof TextEncoder === 'function' ? TextEncoder : class TextEncoder {
|
||
constructor(encoding) {
|
||
if (typeof encoding !== 'undefined' && encoding !== null && encoding !== 'utf-8' && encoding !== 'utf8') {
|
||
throw new Error('Encoding is not supported');
|
||
}
|
||
|
||
this.encoding = 'utf-8';
|
||
}
|
||
|
||
encode(str) {
|
||
if (typeof str !== 'string') {
|
||
throw new TypeError('Argument is not a string');
|
||
}
|
||
|
||
str = unescape(encodeURIComponent(str));
|
||
const arr = new Uint8Array(str.length);
|
||
|
||
for (let i = 0; i < str.length; i++) {
|
||
arr[i] = str.charCodeAt(i);
|
||
}
|
||
|
||
return arr;
|
||
}
|
||
|
||
};
|
||
|
||
const _TextDecoder = typeof TextDecoder === 'function' ? TextDecoder : class TextDecoder {
|
||
constructor(encoding) {
|
||
if (typeof encoding !== 'undefined' && encoding !== null && encoding !== 'utf-8' && encoding !== 'utf8') {
|
||
throw new Error('Encoding is not supported');
|
||
}
|
||
|
||
this.encoding = 'utf-8';
|
||
}
|
||
|
||
decode(view) {
|
||
const array = new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
|
||
let result = '';
|
||
|
||
for (let i = 0; i < array.length; i++) {
|
||
result += String.fromCharCode(array[i]);
|
||
}
|
||
|
||
return decodeURIComponent(escape(result));
|
||
}
|
||
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-translations/generated-translations.json":
|
||
/*!*************************************************************!*\
|
||
!*** ./src/lib/tw-translations/generated-translations.json ***!
|
||
\*************************************************************/
|
||
/*! exports provided: ca, cs, de, es, fr, he, hu, it, ja, ja-hira, ko, lt, nb, nl, pl, pt, pt-br, ro, ru, sl, sr, sv, tr, uk, vi, zh-cn, zh-tw, default */
|
||
/***/ (function(module) {
|
||
|
||
module.exports = JSON.parse("{\"ca\":{\"tw.alerts.creatingRestorePoint\":\"S'està creant un punt de restauració...\",\"tw.alerts.lostPeripheralConnection\":\"S'ha perdut la connexió a {extensionName}.\",\"tw.alerts.savedToDisk\":\"Desat al teu ordinador.\",\"tw.backpack.rename\":\"Nou nom:\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] el botó del ratolí premut?\",\"tw.blocks.lastKeyPressed\":\"última tecla premuda\",\"tw.blocks.mouseButton.middle\":\"(1) mig\",\"tw.blocks.mouseButton.primary\":\"(0) primari\",\"tw.blocks.mouseButton.secondary\":\"(2) secundari\",\"tw.blocks.openDocs\":\"Obre la Documentació\",\"tw.browserModal.desc\":\"Assegura't que fas servir una versió recent de Google Chrome, Mozilla Firefox, Microsoft Edge o Apple Safari.\",\"tw.cantUseCloud\":\"Tot i que pots crear variables al núvol, no funcionaran tret que aquest projecte es carregui a Scratch o es converteixi amb una eina com ara {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"El nom d'usuari no es pot modificar si el projecte s'està executant.\",\"tw.clipboard.danger\":\"Si el vostre porta-retalls conté dades com ara contrasenyes, és possible que el projecte les comparteixi amb altres persones o servidors.\",\"tw.clipboard.permission\":\"L'accés al porta-retalls podria no funcionar en alguns navegadors. Si s'hi permet, es permetran automàticament propers accessos al porta-retalls.\",\"tw.clipboard.title\":\"El projecte vol llegir les dades del vostre porta-retalls.\",\"tw.code\":\"Codi font\",\"tw.confirmIncompatibleExtension\":\"Aquesta extensió és incompatible amb Scratch. Els projectes fets amb ell no es poden penjar al lloc web del Scratch. Segur que vols activar-lo?\",\"tw.customExtension.description\":\"Carregueu extensions personalitzades des d'una adreça URL, fitxers o el codi font en JavaScript.\",\"tw.customExtension.name\":\"Extensió personalitzada\",\"tw.customExtensionModal.file\":\"Fitxer\",\"tw.customExtensionModal.load\":\"Carregar\",\"tw.customExtensionModal.promptFile\":\"Seleccioneu el fitxer JavaScript de l'extensió:\",\"tw.customExtensionModal.promptText\":\"Enganxeu el codi font en JavaScript de l'extensió:\",\"tw.customExtensionModal.promptURL\":\"Introduïu l'adreça URL de l'extensió:\",\"tw.customExtensionModal.title\":\"Carregar una extensió personalitzada\",\"tw.customExtensionModal.trusted\":\"Aquesta extensió es carregarà sense sandbox perquè ve d'una font verificada.\",\"tw.customExtensionModal.unsandboxed\":\"Executar l'extensió sense sandbox\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Carregar les extensions sense el sandbox és perillós i no s'hauria d'activar si no sabeu el què feu.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Les extensions sense \\\"sandbox\\\" poden corrompre el vostre projecte, suprimir les vostres configuracions, obtenir contrasenyes i altres actes perillosos. Els desenvolupadors de {APP_NAME} no es fan responsables dels problemes que se'n poden derivar.\",\"tw.customExtensionModal.untrusted\":\"Les extensions d'URL que no siguin fiables es carregaran sempre amb sandbox per la vostra seguretat.\",\"tw.documentation\":\"Documentació\",\"tw.extensionGallery.name\":\"Galeria d'extensions del TurboWarp\",\"tw.featuredProjectsStudio\":\"Veure l'estudi a Scratch.\",\"tw.feedback\":\"Comentaris i errors interns\",\"tw.feedbackButton\":\"Comentaris del TurboWarp\",\"tw.fetch.title\":\"El projecte vol connectar-se a aquesta pàgina web:\",\"tw.fileInput.none\":\"No s'ha seleccionat cap fitxer.\",\"tw.fileInput.selected\":\"Seleccionat: {name}\",\"tw.footer.credits\":\"Crèdits\",\"tw.footer.disclaimer\":\"TurboWarp no està afiliat a Scratch, al Scratch Team o la Scratch Foundation.\",\"tw.footer.documentation\":\"Documentació\",\"tw.footer.donate\":\"Fes una donació\",\"tw.footer.embed\":\"Incrustació web\",\"tw.footer.parameters\":\"Paràmetres d'URL\",\"tw.gui.crashMessage.description\":\"Ho sentim molt, però sembla que la pàgina s'ha bloquejat. Actualitza la pàgina per tornar-ho a provar.\",\"tw.gui.defaultProjectTitle\":\"Projecte\",\"tw.guiDefaultTitle\":\"Executa projectes del Scratch més ràpid\",\"tw.home.credit\":\"Notes i crèdits\",\"tw.home.description\":\"TurboWarp és un mod del Scratch que compila els projectes al JavaScript per fer-los funcionar molt més ràpid. Prova introduint l'identificador/ID o l'URL del projecte a dalt o triant un projecte destacat a continuació.\",\"tw.home.instructions\":\"Instruccions\",\"tw.input.tooltip\":\"Copia i enganxa un enllaç d'un projecte del Scratch aquí!\",\"tw.interpolationEnabled\":\"Interpolació\",\"tw.invalidParameters.clones\":\"El paràmetre d'URL \\\"clone\\\" no és correcte\",\"tw.invalidParameters.fps\":\"El paràmetre d'URL \\\"fps\\\" no és correcte\",\"tw.loadError\":\"No s'ha pogut carregar el projecte: {error}\",\"tw.loadExtension.embedded\":\"El projecte vol carregar una extensió personalitzada amb aquest codi:\",\"tw.loadExtension.sandboxed\":\"Tot i que el codi s'emmagatzemarà al sandbox, encara podrà tenir accés a informació sobre el vostre dispositiu, com ara la vostra adreça IP i la ubicació general. Assegureu-vos de confiar en l'autor d'aquesta extensió abans de seguir.\",\"tw.loadExtension.unsandboxed\":\"Executar l'extensió sense sandbox\",\"tw.loadExtension.unsandboxedWarning\":\"Carregar extensions sense sandbox és perillós. Poden corrompre el vostre projecte, suprimir les vostres configuracions, obtenir contrasenyes i altres actes perillosos. Els desenvolupadors de {APP_NAME} no es fan responsables dels problemes que se'n poden derivar.\",\"tw.loadExtension.url\":\"El projecte vol carregar una extensió personalitzada a partir d'aquesta URL:\",\"tw.loader.assets.known\":\"Baixant assets ({complete}/{total}) …\",\"tw.loader.assets.unknown\":\"Baixant assets…\",\"tw.loader.data\":\"S'estan baixant les dades del projecte...\",\"tw.loader.generic\":\"S'està carregant el projecte...\",\"tw.menuBar.60off\":\"Desactiva el mode de 60 FPS\",\"tw.menuBar.60on\":\"Activa el mode de 60 FPS\",\"tw.menuBar.advanced\":\"Avançat\",\"tw.menuBar.changeUsername\":\"Canvia el nom d'usuari\",\"tw.menuBar.cloudOff\":\"Desactiva les variables al núvol\",\"tw.menuBar.cloudOn\":\"Activa les variables al núvol\",\"tw.menuBar.cloudUnavailable\":\"Les variables al núvol no estan disponibles\",\"tw.menuBar.cloudUnavailableAlert\":\"No es poden utilitzar variables del núvol, probablement perquè heu obert l'editor.\",\"tw.menuBar.moreSettings\":\"Configuració avançada\",\"tw.menuBar.newFramerate\":\"Nova velocitat de fotogrames:\",\"tw.menuBar.package\":\"Empaquetar projecte\",\"tw.menuBar.reportError1\":\"Alguns scripts no s'han pogut compilar.\",\"tw.menuBar.reportError2\":\"Això és un error. Informeu-ho si us plau.\",\"tw.menuBar.saveAs\":\"Desa com a {file}\",\"tw.menuBar.seeInside\":\"Veure per dins\",\"tw.notify.permission\":\"Si es permet, és possible que es demani que habiliteu les notificacions al vostre navegador i es permetran més notificacions de forma automàtica.\",\"tw.notify.title\":\"El projecte demana mostrar notificacions.\",\"tw.oldDownload\":\"Desa com fitxer separat...\",\"tw.opcode.2000\":\"dies des del 2000\",\"tw.opcode.mousedown\":\"ratolí clicat?\",\"tw.opcode.mousex\":\"ratolí x\",\"tw.opcode.mousey\":\"ratolí y\",\"tw.openAdvanced\":\"Obrir la configuració avançada\",\"tw.openWindow.dangerous\":\"Els desenvolupadors de {APP_NAME} no han revisat aquest lloc web. Pot contenir codi perillós o maliciós.\",\"tw.openWindow.title\":\"El projecte vol obrir una finestra o una pestanya amb l'URL:\",\"tw.paint.alpha\":\"Opacitat\",\"tw.privacy\":\"Política de privacitat\",\"tw.recordAudio.permission\":\"Si es permet, és possible que se us demani que habiliteu l'accés al micròfon des del vostre navegador, i es permetran més accessos al micròfon de forma automàtica.\",\"tw.recordAudio.title\":\"El projecte vol gravar àudio del micròfon. Això pot incloure transcripció de text o dades d'arrel de l'àudio. És possible que el projecte comparteixi l'àudio amb altres persones o servidors.\",\"tw.recordVideo.permission\":\"Si es permet, és possible que se us demani que habiliteu l'accés a la càmera des del vostre navegador, i es permetran més accessos a la càmera de forma automàtica.\",\"tw.recordVideo.title\":\"El projecte vol gravar vídeo des de la càmera. És possible que el projecte comparteixi imatges amb altres persones o servidors.\",\"tw.redirect.dangerous\":\"Els desenvolupadors de {APP_NAME} no han revisat aquest lloc web. Pot contenir codi perillós o maliciós.\",\"tw.redirect.title\":\"El projecte vol reencaminar aquesta pestanya a l'URL:\",\"tw.saveAs\":\"Desa com a...\",\"tw.saveTo\":\"Desa a {file}\",\"tw.scratchUnsafeCloud\":\"Si fass aquesta variable al núvol, el projecte superarà el límit de {number} variables de l'Scratch i algunes variables no funcionaran si penges el projecte a l'Scratch.\",\"tw.securityManager.allow\":\"Permet\",\"tw.securityManager.deny\":\"Denega\",\"tw.securityManager.title\":\"Seguretat de l'Extensió\",\"tw.securityManager.trust\":\"Si s'hi permet, es permetran automàticament més sol·licituds al mateix lloc web.\",\"tw.securityManager.why\":\"Es pot utilitzar per descarregar imatges, so, implementar multijugador, accedir a una API o amb propòsits maliciosos. Això compartirà la vostra adreça IP, la ubicació generalitzada, i altres dades amb el lloc web.\",\"tw.settingsModal.customStageSize\":\"Mida personalitzada de l'escenari:\",\"tw.settingsModal.customStageSizeHelp\":\"Canvia la mida de l'escenari Scratch de 480x360 a una altra mida. Prova 640x360 per fer que l'escenari sigui panoràmic. Molt pocs projectes ho gestionen correctament.\",\"tw.settingsModal.dangerZone\":\"Zona perillosa\",\"tw.settingsModal.disableCompiler\":\"Desactiva el compilador\",\"tw.settingsModal.disableCompilerHelp\":\"Desactiva el compilador del TurboWarp. És possible que vulguis activar-lo mentre edites projectes perquè els scripts s'actualitzin immediatament. En cas contrari, no hauríes d'activar-ho mai.\",\"tw.settingsModal.featured\":\"Destacat\",\"tw.settingsModal.fps\":\"60 FPS (FPS Personalitzats)\",\"tw.settingsModal.fpsHelp\":\"Executa scripts 60 vegades per segon en lloc de 30. La gran majoria dels projectes no executaran correctament amb aquesta funció. Hauríes de provar la interpolació amb el mode 60 FPS desactivat si és el cas.{customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Fes click per utilitzar una velocitat de fotogrames diferent de 30 o 60\",\"tw.settingsModal.help\":\"Feu click per obtenir ajuda\",\"tw.settingsModal.highQualityPen\":\"Llapis d'alta qualitat\",\"tw.settingsModal.highQualityPenHelp\":\"Permet que els projectes amb l'extensiu de llapis es mostrin a resolucions més altes i desactiva alguns arrodoniments de coordenades a l'editor. No tots els projectes es beneficien d'aquesta eina i pot afectar el rendiment.\",\"tw.settingsModal.infiniteClones\":\"Clons infinits\",\"tw.settingsModal.infiniteClonesHelp\":\"Desactiva el límit de 300 clons d'Scratch.\",\"tw.settingsModal.interpolation\":\"Interpolació\",\"tw.settingsModal.interpolationHelp\":\"Fa que els projectes semblin més suaus i fluids interpolant el moviment dels personatges. La interpolació no s'ha d'utilitzar en projectes 3D, traçadors de raigs/raytracers, projectes amb l'extensió de llapis i projectes amb lag, ja que la interpolació farà que funcionin més lent sense que semblin suaus.\",\"tw.settingsModal.largeStageWarning\":\"No es recomana utilitzar una mida d'escenari personalitzada tan gran! En comptes d'això, utilitza una mida inferior amb la mateixa relació d'aspecte i deixa que el mode de pantalla completa l'augmenti perquè coincideixi amb la pantalla de l'usuari.\",\"tw.settingsModal.removeFencing\":\"Eliminar les limitacions de pantalla\",\"tw.settingsModal.removeFencingHelp\":\"Permet que els personatges es moguin fora de la pantalla, siguin tan grans o tan petits com vulguin, i fa que els blocs que es pugin fer click funcionin fora de la pantalla.\",\"tw.settingsModal.removeLimits\":\"Elimina els límits\",\"tw.settingsModal.removeMiscLimits\":\"Treure límits miscel·lanis\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Elimina els límits d'efectes de so i els límits de mida del llapis.\",\"tw.settingsModal.storeProjectOptions\":\"Emmagatzema la configuració al projecte\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Emmagatzema la configuració seleccionada al projecte perquè s'apliquin automàticament quan TurboWarp carregui aquest projecte. El temporitzador Warp i el \\\"Desactiva el compilador\\\" no es desaran.\",\"tw.settingsModal.title\":\"Configuració avançada\",\"tw.settingsModal.warpTimer\":\"Temporitzador Warp\",\"tw.settingsModal.warpTimerHelp\":\"Fa que els scripts comprovin si estan encallars en un bucle llarg o infinit i s'executen a una velocitat de fotogrames baixa en lloc d'enganxar-se fins que s'acabi el bucle. Això corregeix la majoria de crashes, però té un impacte significatiu en el rendiment, de manera que només està activat de manera predeterminada a l'editor.\",\"tw.spriteSelectorItem.rename\":\"renombra\",\"tw.stereo\":\"Estèreo\",\"tw.stereoAlert\":\"Al editar aquest so estèreo és convertirà irreversiblement a mono.\",\"tw.studioview.authorAttribution\":\"fet per {author}\",\"tw.studioview.error\":\"S'ha produït un error al carregar la següent pàgina dels projectes.\",\"tw.studioview.hoverText\":\"{title}, fet per {author}\",\"tw.tooLarge\":\"És probable que aquest so sigui molt pesat per poder carregar-lo a l'Scratch.\",\"tw.twExtension.description\":\"Nous blocs estranys.\",\"tw.twExtension.name\":\"Blocs del TurboWarp\",\"tw.unshared.2\":\"Per a més informació, visita: {link}\",\"tw.unshared.bug\":\"Si realment aquest projecte s'ha compartit, si us plau informeu del error.\",\"tw.unshared.cache\":\"Si el projecte s'ha compartit recentment, aquest avís pot trigar uns minuts en desaparèixer.\",\"tw.unshared2.1\":\"Els projectes sense compartir ja no es poden veure.\",\"tw.usernameModal.help\":\"Aquest valor s'emmagatzemarà a les del vostre explorador. Es pot registrar quan interaccionis amb projectes que contenen variables al núvol.\",\"tw.usernameModal.help2\":\"Els valors que no corresponen a un compte del Scratch vàlid normalment seran rebutjats pel nostre servidor de variables al núvol. Us recomanem que ho deixis tal qual o que el canvïs pel teu nom d'usuari del Scratch.\",\"tw.usernameModal.mustChange\":\"Ho sentim, el servidor de variables al núvol creu que el teu nom d'usuari pot ser insegur. Si us plau, canvia-ho per una altre o {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"reseteja-ho (recomanat)\",\"tw.usernameModal.reset\":\"Restableix\",\"tw.usernameModal.title\":\"Canvia el nom d'usuari\",\"tw.viewFeaturedProjects\":\"Fes click per veure els projectes destacats.\",\"tw.viewOnScratch\":\"Veure a l'Scratch\",\"tw.webglModal.description\":\"Desafortunadament, sembla que el teu explorador o ordinador {webGlLink}. Aquesta tecnologia és necessària perquè aquest lloc web funcioni. Prova d'actualitzar el navegador i els controladors/drivers de gràfics o reinicieu l'ordinador.\"},\"cs\":{\"tw.alerts.creatingRestorePoint\":\"Vytvářím bod obnovení...\",\"tw.alerts.savedToDisk\":\"Uloženo na váš počítač.\",\"tw.backpack.rename\":\"Nové jméno:\",\"tw.blocks.addons\":\"Doplňky\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON]tlačítko myši stisknuto?\",\"tw.blocks.lastKeyPressed\":\"poslední stisknutá klávesa\",\"tw.blocks.mouseButton.middle\":\"(1) střední\",\"tw.blocks.mouseButton.primary\":\"(0) hlavní\",\"tw.blocks.mouseButton.secondary\":\"(2) sekundární\",\"tw.blocks.openDocs\":\"Otevřít dokumentaci\",\"tw.browserModal.desc\":\"Ujistěte se, že používáte nejnovější verzi Google Chrome, Mozilla Firefox, Microsoft Edge nebo Apple Safari.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Jméno nemůže být změněno, když běží projekt.\",\"tw.code\":\"Zdrojový kód\",\"tw.confirmIncompatibleExtension\":\"Toto rozšíření není kompatibilní se Scratchem. Projekty vytvořené s tímto rozšířením nemůžou být nahrány na stránku Scratch. Jste si jisti, že chcete toto rozšíření aktivovat?\",\"tw.customExtension.name\":\"Vlastní rozšíření\",\"tw.customExtensionModal.file\":\"Soubor\",\"tw.featuredProjectsStudio\":\"Zhlédnout studio na Scratchi.\",\"tw.feedback\":\"Zpětná vazba & chyby\",\"tw.feedbackButton\":\"Zpětná vazba TurboWarp\",\"tw.footer.credits\":\"Příspěvky\",\"tw.footer.disclaimer\":\"TurboWarp nemá žádnou souvislost se Scratchem, tým Scratche nebo nadace Scratche.\",\"tw.footer.embed\":\"Vkládání\",\"tw.footer.parameters\":\"Parametry odkazu\",\"tw.fps\":\"{framerate}FPS\",\"tw.gui.defaultProjectTitle\":\"Projekt\",\"tw.guiDefaultTitle\":\"Zrychlit projekty Scratch\",\"tw.home.credit\":\"Poznámky a příspěvky\",\"tw.home.description\":\"TurboWarp je modifikace Scratche, která kompiluje projekty do JavaScriptu, aby byly rychlejší. Zkuste vložit ID projektu, odkaz projektu nebo vyberte jeden z vybraných projektů dole.\",\"tw.home.instructions\":\"Instrukce\",\"tw.input.tooltip\":\"Sem zkopírujte a vložte link projektu Scratch!\",\"tw.interpolationEnabled\":\"Interpolace\",\"tw.invalidParameters.clones\":\"\\\"clone\\\" parametr odkazu je neplatný\",\"tw.invalidParameters.fps\":\"\\\"fps\\\" parametr odkazu je neplatný\",\"tw.loader.assets.known\":\"Stahuji soubory ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Stahuji soubory ...\",\"tw.loader.data\":\"Stahuji data projektu ...\",\"tw.loader.generic\":\"Načítám projekt ...\",\"tw.menuBar.60off\":\"Vypnout režím 60 FPS\",\"tw.menuBar.60on\":\"Zapnout režim 60 FPS\",\"tw.menuBar.addons\":\"Doplňky\",\"tw.menuBar.advanced\":\"Pokročilé\",\"tw.menuBar.changeUsername\":\"Změnit jméno\",\"tw.menuBar.cloudOff\":\"Vypnout cloudové proměnné\",\"tw.menuBar.cloudOn\":\"Zapnout cloudové proměnné\",\"tw.menuBar.cloudUnavailable\":\"Cloudové proměnné nejsou dostupné\",\"tw.menuBar.cloudUnavailableAlert\":\"Nelze použít cloudové proměnné, protože jste pravděpodobně otevřeli editor.\",\"tw.menuBar.compileError\":\"{sprite}:{error}\",\"tw.menuBar.moreSettings\":\"Pokročilé nastavení\",\"tw.menuBar.newFramerate\":\"Nová snímková frekvence:\",\"tw.menuBar.reportError1\":\"Některé skripty se nemohly zkompilovat.\",\"tw.menuBar.reportError2\":\"Toto je chyba, prosíme, nahlaste ji.\",\"tw.menuBar.saveAs\":\"Uložit jako {file}\",\"tw.menuBar.seeInside\":\"Pohlédnout dovnitř\",\"tw.paint.alpha\":\"Průhlednost\",\"tw.privacy\":\"Zásady ochrany osobních údajů\",\"tw.saveAs\":\"Uložit jako...\",\"tw.saveTo\":\"Uložit jako {file}\",\"tw.settingsModal.customStageSize\":\"Vlastní velikost scény\",\"tw.settingsModal.customStageSizeHelp\":\"Změní velikost scény Scratche z 480x360 na něco jiného. Zkuste 640x360, aby se změnilo rozlišení na širokoúhlé. Velmi málo projektů to zvládne.\",\"tw.settingsModal.dangerZone\":\"Zóna nebezpečí\",\"tw.settingsModal.disableCompiler\":\"Deaktivovat kompilátor\",\"tw.settingsModal.disableCompilerHelp\":\"Deaktivuje kompilátor TurboWarp. Možná toto budete chtít aktivovat když upravujete projekty, aby se skripty okamžitě aktualizovaly. Jinak byste neměli toto aktivovat.\",\"tw.settingsModal.featured\":\"Vybrané\",\"tw.settingsModal.fps\":\"60 FPS (Vlastní FPS)\",\"tw.settingsModal.fpsHelp\":\"Spouští skripty 60krát za sekundu místo 30krát za sekundu. Většina projektů nebude fungovat správně s tímto nastavením. Měli byste zkusit interpolaci s deaktivovaným režimem 60 FPS, jestli se toto děje. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Klikněte sem pro použití jiné snímkové frekvence než 30 nebo 60\",\"tw.settingsModal.help\":\"Klikněte sem pro pomoc\",\"tw.settingsModal.highQualityPen\":\"Pero s vysokým rozlišením\",\"tw.settingsModal.highQualityPenHelp\":\"Povolí projekty s perem, aby kreslili na větších rozlišeních a deaktivuje některé zaokrouhlování souřadnic v editoru. Ne všechny projekty mají výhodu v tomto nastavení a může to ovlivnit výkon. \",\"tw.settingsModal.infiniteClones\":\"Nekonečné klony\",\"tw.settingsModal.infiniteClonesHelp\":\"Deaktivuje limit 300 klonů Scratche\",\"tw.settingsModal.interpolation\":\"Interpolace\",\"tw.settingsModal.interpolationHelp\":\"Zrychlí projekty interpolací pohybu postav. Interpolace by se neměla používat na 3D projektech, raytracerech, projekty s perem a zpomalených projektech, protože je interpolace zpomalí bez jejich zrychlení.\",\"tw.settingsModal.largeStageWarning\":\"Používání vlastní obrovské velikosti scény není doporučeno! Místo toho používejte menší velikost se stejnými poměry stran a nechte režim plné obrazovky zvětšit rozlišení, aby se srovnalo s displejem uživatele.\",\"tw.settingsModal.removeFencing\":\"Odstranit hranice\",\"tw.settingsModal.removeLimits\":\"Odstranit limity\",\"tw.settingsModal.removeMiscLimits\":\"Odstranit různé limity\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Odstraní limity zvukových efektů a velikosti pera.\",\"tw.settingsModal.storeProjectOptions\":\"Ukládat nastavení v projektu\",\"tw.settingsModal.title\":\"Pokročilé nastavení\",\"tw.settingsModal.warpTimer\":\"Warp časovač\",\"tw.settingsModal.warpTimerHelp\":\"Skripty zkontrolují, jestli nejsou zaseklé ve dlouhém nebo nekonečném cyklu a poběží na malé snímkové frekvenci místo zaseknutí než se cyklus dokončí. Toto opraví většinu zastavení, ale má velký vliv na výkon, takže toto je jen výchozně aktivované v editoru.\",\"tw.spriteSelectorItem.rename\":\"přejmenovat\",\"tw.studioview.authorAttribution\":\"od {author}\",\"tw.studioview.error\":\"Při načítání další stránky projektů nastala chyba.\",\"tw.studioview.hoverText\":\"{title} od {author}\",\"tw.twExtension.name\":\"Bloky TurboWarp\",\"tw.usernameModal.help\":\"Tato hodnota bude uložena ve vašem prohlížeči. Může být zapsaná, když upravujete projekty které mají cloudové proměnné.\",\"tw.usernameModal.mustChange\":\"Omlouváme se, server cloudových proměň si myslí, že vaše jméno není bezpečné. Prosíme, změňte jméno nebo {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"obnovit (doporučeno)\",\"tw.usernameModal.reset\":\"Obnovit\",\"tw.usernameModal.title\":\"Změnit jméno\",\"tw.viewFeaturedProjects\":\"Klikněte sem pro zhlédnutí vybraných projektů.\",\"tw.viewOnScratch\":\"Zhlédnout projekt na Scratchi\",\"tw.webglModal.description\":\"Bohužel to vypadá, že váš prohlížeč nebo počítač {webGlLink}. Tato technologie je potřebná pro tuto stránku. Zkuste aktualizovat váš prohlížeč a grafické ovladače, nebo restartujte počítač.\"},\"de\":{\"tw.alerts.creatingRestorePoint\":\"Wiederherstellungspunkt wird erstellt...\",\"tw.alerts.lostPeripheralConnection\":\"Verbindung zu {extensionName} verloren.\",\"tw.alerts.restorePointError\":\"Der Wiederherstellpunkt konnte nicht erstellt werden\",\"tw.alerts.restorePointSuccess\":\"Siehe \\\"Datei\\\" für die Wiederherstellpunkte\",\"tw.alerts.savedToDisk\":\"Auf deinem Computer gespeichert.\",\"tw.backpack.rename\":\"Neuer Name:\",\"tw.blocks.PROCEDURES_DOCS\":\"Wie funktioniert \\\"gebe aus\\\"?\",\"tw.blocks.PROCEDURES_RETURN\":\"gebe {v} aus \",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"In Wertblock umwandeln\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"In Stapelblock umwandeln\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] Maustaste gedrückt?\",\"tw.blocks.lastKeyPressed\":\"zuletzt gedrückte Taste\",\"tw.blocks.mouseButton.middle\":\"(1) mittlere\",\"tw.blocks.mouseButton.primary\":\"(0) linke\",\"tw.blocks.mouseButton.secondary\":\"(2) rechte\",\"tw.blocks.openDocs\":\"Dokumentation öffnen\",\"tw.browserModal.desc\":\"Überprüfe, ob du eine neuere Versionvon Google Chrome, Mozilla Firefox, Microsoft Edge oder Apple Safari verwendest.\",\"tw.cantUseCloud\":\"Obwohl du Cloud-Variablen erstellen kannst, werden sie bis zum Hochladen auf Scratch oder auf einem Tool wie dem {packager} nicht funktionieren.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Der Benutzername kann nicht geändert werden, während das Projekt ausgeführt wird.\",\"tw.clipboard.danger\":\"Wenn deine Zwischenablage Sachen wie Passwörter einthält, könnte das Projekt in der Lage sein, sie mit anderen Nutzern oder Servern zu teilen.\",\"tw.clipboard.permission\":\"Der Zugriff auf die Zwischenablage könnte in manchen Browsern nicht funktionieren. Wenn zugelassen, werden zukünftige Zugriffe automatisch zugelassen.\",\"tw.clipboard.title\":\"Das Projekt möchte auf den Inhalt deiner Zwischenablage zugreifen.\",\"tw.code\":\"Quellcode\",\"tw.confirmIncompatibleExtension\":\"Diese Erweiterung ist nicht mit Scratch kompatibel. Projekte, die damit entwickelt werden, können nicht auf die Scratch-Website geladen werden. Bist du sicher, dass du sie aktivieren willst?\",\"tw.customExtension.description\":\"Lade eigene Erweiterungen von URLs, Dateien oder JavaScript-Quellcode.\",\"tw.customExtension.name\":\"Benutzerdefinierte Erweiterung\",\"tw.customExtensionModal.file\":\"Datei\",\"tw.customExtensionModal.load\":\"Laden\",\"tw.customExtensionModal.promptFile\":\"JavaScript-Datei mit der Erweiterung auswählen:\",\"tw.customExtensionModal.promptText\":\"Füge den JavaScript-Quellcode mit der Erweiterung ein:\",\"tw.customExtensionModal.promptURL\":\"URL der Erweiterung eingeben:\",\"tw.customExtensionModal.title\":\"Benutzerdefinierte Erweiterung laden\",\"tw.customExtensionModal.trusted\":\"Diese Erweiterung wird ohne Sandbox geladen, weil sie aus einer vertrauenswürdigen Quelle stammt.\",\"tw.customExtensionModal.unsandboxed\":\"Erweiterung ohne Sandbox ausführen\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Das Laden von Erweiterungen ohne Sandbox ist gefährlich und du solltest es nur tun, wenn du dir sicher bist.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Erweiterungen ohne Sandbox können dein Projekt beschädigen, deine Einstellungen löschen, deine Passwörter phishen und sonstige schlechte Aktivitäten. Die Entwickler von {APP_NAME} sind nicht verantwortlich für jegliche Probleme.\",\"tw.customExtensionModal.untrusted\":\"Erweiterungen von Unvertrauenswürdigen URLs werden zur Sicherheit immer mit der Sandbox geladen.\",\"tw.customReporters.description\":\"Erlaubt es, eigenen Blöcken Werte ausgeben zu lassen und als Wertblöcke zu funktionieren.\",\"tw.customReporters.name\":\"Eigene Wertblöcke\",\"tw.documentation\":\"Dokumentation\",\"tw.extensionGallery.name\":\"TurboWarp-Erweiterungssammlung\",\"tw.featuredProjectsStudio\":\"Studio auf Scratch anzeigen.\",\"tw.feedback\":\"Feedback & Fehler\",\"tw.feedbackButton\":\"Feedback\",\"tw.fetch.title\":\"Das Projekt versucht, sich mit dieser Website zu verbinden:\",\"tw.fileInput.none\":\"Keine Datei ausgewählt\",\"tw.fileInput.selected\":\"Ausgewählt: {name}\",\"tw.fonts.add\":\"Hinzufügen\",\"tw.fonts.custom.file\":\"Wähle eine Schriftartdatei von deinem Computer aus:\",\"tw.fonts.custom.name\":\"Gebe der Schriftart einen Namen:\",\"tw.fonts.custom1\":\"Schriftart von einer Datei hinzufügen\",\"tw.fonts.custom2\":\"Wird normalerweise nicht auf Scratch funktionieren. Erlaubte Formate: {formats}\",\"tw.fonts.delete\":\"Bist du dir sicher, dass du \\\"{font}\\\" löschen willst? Alle Vektorkostüme werden stattdessen die Ersatzschriftart nutzen.\",\"tw.fonts.fallback\":\"Wähle eine Schriftart, die angezeigt werden soll, wenn die Schriftart nicht geladen werden kann oder gelöscht wird:\",\"tw.fonts.list\":\"Installierte Schriftarten:\",\"tw.fonts.none\":\"Es wurden noch keine Schriftarten hinzugefügt.\",\"tw.fonts.readError\":\"Schriftartdatei konnte nicht gelesen werden: {error}\",\"tw.fonts.system\":\"Systemschriftart\",\"tw.fonts.system.name\":\"Tippe den Namen einer Schriftart, die auf deinem Computer installiert ist. Die Schriftart könnte nicht für jeden richtig aussehen.\",\"tw.fonts.system1\":\"Systemschriftart hinzufügen\",\"tw.fonts.system2\":\"Kann auf Scratch funktionieren, wird aber nicht für jeden richtig aussehen\",\"tw.fonts.title\":\"Schriftarten\",\"tw.footer.credits\":\"Danksagungen\",\"tw.footer.disclaimer\":\"TurboWarp ist nicht mit Scratch, dem Scratch-Team oder der Scratch-Stiftung verbunden.\",\"tw.footer.documentation\":\"Dokumentation\",\"tw.footer.donate\":\"Spenden\",\"tw.footer.embed\":\"Einbettung\",\"tw.footer.parameters\":\"URL-Parameter\",\"tw.geolocate.permission\":\"Wenn du das erlaubt hast, könntest du von deinem Browser angefragt werden, Standortzugriff zu erlauben.\",\"tw.geolocate.title\":\"Dieses Projekt will deinen Standort einsehen.\",\"tw.gui.crashMessage.description\":\"Es tut uns leid, anscheinend ist die Seite abgestürzt. Bitte aktualisiere die Seite und versuche es erneut.\",\"tw.gui.defaultProjectTitle\":\"Projekt\",\"tw.guiDefaultTitle\":\"Scratch-Projekte schneller ausführen\",\"tw.home.credit\":\"Anmerkungen und Danksagungen\",\"tw.home.description\":\"TurboWarp ist ein Scratch-Mod, das Projekte in JavaScript kompiliert, um sie sehr schnell auszuführen. Probiere es aus, indem du eine Projekt-ID oder -URL oben eingibst, oder ein vorgestelltes Projekt unten auswählst.\",\"tw.home.instructions\":\"Anleitung\",\"tw.input.tooltip\":\"Kopiere den Link zu einem Scratch-Projekt und füge ihn hier ein!\",\"tw.invalidParameters.clones\":\"URL-Parameter \\\"clone\\\" ist ungültig\",\"tw.invalidParameters.fps\":\"URL-Parameter \\\"fps\\\" ist ungültig\",\"tw.loadError\":\"Fehler beim Laden des Projekts: {error}\",\"tw.loadExtension.embedded\":\"Das Projekt will eine benutzerdefinierte Erweiterung laden, die folgenden Code hat:\",\"tw.loadExtension.sandboxed\":\"Obwohl der Code in der Sandbox ausgeführt wird, wird sie weiterhin Zugang zu Geräteinformationen wie deine IP-Adresse und ungefähre Position haben. Stelle sicher, dass du dem Entwickler dieser Erweiterung vertraust, bevor du fortfährst.\",\"tw.loadExtension.unsandboxed\":\"Erweiterung ohne Sandbox ausführen\",\"tw.loadExtension.unsandboxedWarning\":\"Erweiterungen ohne Sandbox sind gefährlich. Sie können dann dein Projekt beschädigen, deine Einstellungen löschen, deine Passwörter phishen und sonstige schlechte Aktivitäten. Die Entwickler von {APP_NAME} sind nicht verantwortlich für jegliche Probleme.\",\"tw.loadExtension.url\":\"Das Projekt will eine benutzerdefinierte Erweiterung laden, die folgende URL hat:\",\"tw.loader.assets.known\":\"Ressourcen werden heruntergeladen ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Ressourcen werden heruntergeladen ...\",\"tw.loader.data\":\"Projektdaten werden heruntergeladen ...\",\"tw.loader.generic\":\"Projekt wird geladen ...\",\"tw.menuBar.60off\":\"60 FPS-Modus ausschalten\",\"tw.menuBar.60on\":\"60 FPS-Modus einschalten\",\"tw.menuBar.advanced\":\"Erweitert\",\"tw.menuBar.changeUsername\":\"Benutzernamen ändern\",\"tw.menuBar.cloudOff\":\"Cloud-Variablen ausschalten\",\"tw.menuBar.cloudOn\":\"Cloud-Variablen einschalten\",\"tw.menuBar.cloudUnavailable\":\"Cloud-Variablen sind nicht Verfügbar\",\"tw.menuBar.cloudUnavailableAlert\":\"Kann Cloud-Variablen nicht verwenden, wahrscheinlich, weil du den Editor geöffnet hast.\",\"tw.menuBar.moreSettings\":\"Erweitert\",\"tw.menuBar.newFramerate\":\"Neue Framefrequenz:\",\"tw.menuBar.package\":\"Paketisieren\",\"tw.menuBar.reportError1\":\"Manche Skripte konnten nicht kompiliert werden.\",\"tw.menuBar.reportError2\":\"Dies ist ein Fehler. Bitte melde ihn.\",\"tw.menuBar.restorePoints\":\"Wiederherstellpunkte\",\"tw.menuBar.saveAs\":\"Speichern unter {file}\",\"tw.menuBar.seeInside\":\"Schau hinein\",\"tw.notify.permission\":\"Wenn du das erlaubst, könntest du von deinem Browser angefragt werden, Benachrichtigungen einzuschalten. Danach werden Benachrichtigungen automatisch erlaubt sein.\",\"tw.notify.title\":\"Das Projekt möchte Benachrichtigungen anzeigen.\",\"tw.oldDownload\":\"Kopie speichern unter...\",\"tw.opcode.2000\":\"Tage seit 2000\",\"tw.opcode.mousedown\":\"Maustaste gedrückt?\",\"tw.opcode.mousex\":\"Maus-x-Position\",\"tw.opcode.mousey\":\"Maus-y-Position\",\"tw.openAdvanced\":\"Öffne die fortgeschrittenen Einstellungen\",\"tw.openWindow.dangerous\":\"Diese Website wurde nicht von den {APP_NAME}-Entwicklern geprüft. Sie könnte schädlichen oder bösartigen Code enthalten.\",\"tw.openWindow.title\":\"Dieses Projekt möchte ein neues Fenster oder Tab mit dieser URL öffnen:\",\"tw.paint.alpha\":\"Durchsichtigkeit\",\"tw.paint.fonts.more\":\"Mehr Schriftarten hinzufügen...\",\"tw.privacy\":\"Datenschutzerklärung\",\"tw.recordAudio.permission\":\"Wenn zugelassen, könnte eine Anfrage deines Browsers erscheinen, und zukünftige Zugriffe werden automatisch zugelassen.\",\"tw.recordAudio.title\":\"Dieses Projekt will von deinem Mikrofon Audio aufnehmen. Das kann ein Transkript oder rohe Audiodaten beinhalten. Das Projekt könnte das Audio mit anderen Nutzern oder Servern teilen.\",\"tw.recordVideo.permission\":\"Wenn du das erlaubst, könntest du von deinem Browser angefragt werden, Kamerazugriff zu erlauben, und weitere Kamerazugriffe werden automatisch erlaubt werden.\",\"tw.recordVideo.title\":\"Dieses Projekt möchte Video von deiner Kamera aufnehmen. Das Projekt könnte diese Bilder mit anderen Nutzern oder Servern teilen.\",\"tw.redirect.dangerous\":\"Diese Website wurde nicht von den {APP_NAME}-Entwicklern geprüft. Sie könnte schädlichen oder bösartigen Code enthalten.\",\"tw.redirect.title\":\"Das Projekt will von diesem Tab zur URL:\",\"tw.restorePoints.1minute\":\"jede Minute\",\"tw.restorePoints.assets\":\"{n} Resourcen\",\"tw.restorePoints.confirmDelete\":\"Bist du dir sicher, dass du \\\"{projectTitle}\\\" löschen wirst? Dies kann nicht mehr rückgängig gemacht werden. \",\"tw.restorePoints.confirmDeleteAll\":\"Bist du dir sicher, dass du ALLE Wiederherstellpunkte löschen willst? Dies kann nicht mehr rückgängig gemacht weren.\",\"tw.restorePoints.confirmLoad\":\"Du hast ungespeicherte Änderungen. Willst du das momentane Projekt ersetzen?\",\"tw.restorePoints.deleteAll\":\"Alle löschen\",\"tw.restorePoints.description\":\"{APP_NAME}speichert periodisch Wiederherstellpunkte auf deinem Computer, damit dein Projekt wiederhergestellt werden kann, wenn du vergisst, zu speichern. Dies ist als letzter Ausweg für Wiederherstellung gedacht. Dein Computer kann jederzeit diese Wiederherstellpunkte unbemerkt löschen. Verlasse dich NICHT auf dieses Feature.\",\"tw.restorePoints.empty\":\"Keine Wiederherstellpunkte gefunden.\",\"tw.restorePoints.error\":\"Fehler beim Laden des Wiederherstellpunktes: {error}\",\"tw.restorePoints.intervalOption\":\"Wiederherstellpunkte werden {time} erstellt.\",\"tw.restorePoints.loading\":\"Laden...\",\"tw.restorePoints.minutes\":\"alle {n} Minuten \",\"tw.restorePoints.never\":\"nie\",\"tw.restorePoints.off\":\"Wiederherstellpunkte auszuschalten ist gefährlich.\",\"tw.restorePoints.size\":\"Ungefähre Anzahl an genutztem Speicherplatz: {size}\",\"tw.restorePoints.size2\":\"Kostüme oder Klänge, die von mehreren Wiederherstellungspunkten genutzt werden, werden nur einmal gespeichert.\",\"tw.restorePoints.title\":\"Wiederherstellpunkte\",\"tw.saveAs\":\"Speichern unter...\",\"tw.saveTo\":\"Speichern unter {file}\",\"tw.scratchUnsafeCloud\":\"Wenn du diese Cloudvariable erstllst, wird dieses Projekt die maximale Anzahl von {number} Variablen überschreiten, und manche von ihnen werden beim Hochladen auf Scratch nicht funktionieren.\",\"tw.securityManager.allow\":\"Zulassen\",\"tw.securityManager.deny\":\"Verweigern\",\"tw.securityManager.title\":\"Erweiterungssicherheit\",\"tw.securityManager.trust\":\"Wenn es einmal zugelassen wird, werden zukünftige Anfragen zur selben Website automatisch zugelassen.\",\"tw.securityManager.why\":\"Das Projekt könnte dies zum Herunterladen von zusätzlichen Bildern und Klängen, Einbauen von Multiplayerfunktionen, Zugreifen auf eine API, aber auch für bösartige Zwecke benötigen. Es wird deine IP-Adresse, Region und möglicherweise weitere Daten mit der Website teilen.\",\"tw.settingsModal.customStageSize\":\"Benutzerdefinierte Bühnengröße:\",\"tw.settingsModal.customStageSizeHelp\":\"Ändert die Größe der Bühne von 480x360 zu etwas anderem. Versuche 640x360, um die Bühen erweitert zu machen. Sehr wenige Projekte behandlen diese Einstellung richtig.\",\"tw.settingsModal.dangerZone\":\"Gefahrenzone\",\"tw.settingsModal.disableCompiler\":\"Compiler ausschalten\",\"tw.settingsModal.disableCompilerHelp\":\"Deaktiviert den TurboWarp-Compiler. Du möchtest dies vielleicht während dem Bearbeiten von Projekten aktivieren, damit die Skripte sofort aktualisiert werden, ansonsten solltest du dies nicht aktivieren.\",\"tw.settingsModal.featured\":\"Vorgestellt\",\"tw.settingsModal.fps\":\"60 FPS (Benutzerdefinierte FPS)\",\"tw.settingsModal.fpsHelp\":\"Führt Skripte 60 anstatt 30 Mal pro Sekunde aus. Die meisten Projekte werden mit diesem nicht richtig funktionieren. Falls dies der Fall ist, solltest du Interpolation ohne 60 FPS verwenden. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Klicke, um eine andere Framefrequenz als 30 oder 60 zu verwenden\",\"tw.settingsModal.help\":\"Klicke für Hilfe\",\"tw.settingsModal.highQualityPen\":\"Stift mit Hoher Qualität\",\"tw.settingsModal.highQualityPenHelp\":\"Erlaubt Stiftprojekte mit höherer Auflösung zu rendern und deaktiviert manche Koordinatenrundungen im Editor. Nicht alle Projekte haben einen Vorteil von dieser EInstellung, und sie könnte die Leistung beeinflussen.\",\"tw.settingsModal.infiniteClones\":\"Unendliche Klone\",\"tw.settingsModal.infiniteClonesHelp\":\"Deaktiviert Scratch's Limit von 300 Klonen.\",\"tw.settingsModal.interpolationHelp\":\"Macht die Ausführung des Projekts flüssiger, indem es die Bewegungen der Figuren interpoliert. Interpolation sollte nicht auf 3D-Projekten, Raytracern, Stiftprojekten und laggenden Projekten verwendet werden, da die Interpolation sie langsamer ausführen wird.\",\"tw.settingsModal.largeStageWarning\":\"Es wird nicht empfohlen, die Bühne so groß zu machen! Verwende stattdessen eine kleinere Zahl mit der gleichen Ansichtsratio und lass den Vollbildschirm sie größer machen, um sie mit dem Display des Benutzers anzupassen.\",\"tw.settingsModal.removeFencing\":\"Einzäunung entfernen\",\"tw.settingsModal.removeFencingHelp\":\"Lässt zu, dass sich Figuren über den Bildschirm hinaus bewegen, so groß oder so klein werden, wie sie wollen und macht die Erkennung von Berührungen zwischen Figuren außerhalb des Bildschirms möglich.\",\"tw.settingsModal.removeLimits\":\"Limits enfernen\",\"tw.settingsModal.removeMiscLimits\":\"Verschiedene Begrenzungen entfernen\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Entfernt Begrenzungen bei Klangeffekten und bei der Stiftgröße.\",\"tw.settingsModal.storeProjectOptions\":\"Einstellungen im Projekt speichern\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Speichert die ausgewählten Einstellungen im Projekt, damit sie beim Laden in TurboWarp automatisch angewendet werden. Der Compiler und der Warp Timer werden nicht gespeichert.\",\"tw.settingsModal.title\":\"Erweiterte Einstellungen\",\"tw.settingsModal.warpTimerHelp\":\"Überprüft, ob Skripte in einer langen oder endlosen Schleife feststecken, und führt sie mit einer niedrigeren Framefrequenz aus, anstatt sie auf das Ende der Schleife warten zu zu lassen. was die meisten Abstürze verbessert aber einen bedeutenden Einfluss auf die Leistung hat, deshalb ist es standardmäßig außerhalb des Editors deaktiviert.\",\"tw.spriteSelectorItem.rename\":\"umbenennnen\",\"tw.stereoAlert\":\"Dieses Stereogeräusch zu ändern wird es zu Mono umwandeln, ohne dass man es wieder zurückumwandeln kann.\",\"tw.studioview.authorAttribution\":\"von {author}\",\"tw.studioview.error\":\"Es gab einen Fehler beim Laden der nächsten Seite von Projekten.\",\"tw.studioview.hoverText\":\"{title} von {author}\",\"tw.tooLarge\":\"Dieses Geräusch könnte zu groß sein, um es auf Scratch hochzuladen.\",\"tw.twExtension.description\":\"Seltsame neue Blöcke.\",\"tw.twExtension.name\":\"TurboWarp-Blöcke\",\"tw.unshared.2\":\"Mehr Informationen unter: {link}\",\"tw.unshared.bug\":\"Falls das Projekt eigentlich veröffentlicht ist, bitte melde den Fehler.\",\"tw.unshared.cache\":\"Falls das Projekt erst vor Kurzem veröffentlicht wurde, wird diese Nachricht möglicherweise einige Minuten lang erscheinen.\",\"tw.unshared2.1\":\"Nicht veröffentlichte Projekte sind nicht mehr sichtbar\",\"tw.usernameModal.help\":\"Dieser Wert wird in deinem Browserspeicher gespeichert. Er könnte geloggt werden, wenn du mit Projekten, die Cloudvariablen enthalten, interagierst.\",\"tw.usernameModal.help2\":\"Werte, die nicht mit einem gültigen Scratch-Konto entsprechen, werden normalerweise vom Cloudserver abgelehnt. Es ist empfohlen, diesen Wert so zu lassen, wie er ist, oder ihn auf deinen Scratch-Benutzernamen zu setzen.\",\"tw.usernameModal.mustChange\":\"Es tut uns Leid, der Cloudvariablenserver denkt, dass dein Benutzername unsicher sein könnte. Bitte ändere ihn oder {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"setze ihn zurück (empfohlen)\",\"tw.usernameModal.new\":\"Neuer Benutzername:\",\"tw.usernameModal.reset\":\"Zurücksetzen\",\"tw.usernameModal.title\":\"Benutzernamen ändern\",\"tw.viewFeaturedProjects\":\"Klicke, um vorgestellte Projekte anzusehen.\",\"tw.viewOnScratch\":\"Projekt auf Scratch anzeigen\",\"tw.webglModal.description\":\"Leider sieht es aus, als würde dein Computer oder Browser {webGlLink}. Diese Technologie ist erforderlich, damit diese Seite funktioniert. Versuche, deinen Browser und deine Grafiktreiber zu aktualisieren, oder deinen Computer neu zu starten.\"},\"es\":{\"tw.alerts.creatingRestorePoint\":\"Creando punto de restauración...\",\"tw.alerts.lostPeripheralConnection\":\"Se perdió la conexión con {extensionName}.\",\"tw.alerts.restorePointError\":\"No se pudo crear el punto de restauración\",\"tw.alerts.restorePointSuccess\":\"Acceder a puntos de restauración en \\\"Archivo\\\"\",\"tw.alerts.savedToDisk\":\"Guardado a tu computadora.\",\"tw.backpack.rename\":\"Nuevo nombre:\",\"tw.blocks.PROCEDURES_DOCS\":\"Cómo usar devolver\",\"tw.blocks.PROCEDURES_RETURN\":\"devolver {v}\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"Cambiar A Reportero\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"Cambiar A Declaración\",\"tw.blocks.buttonIsDown\":\"¿botón del ratón [MOUSE_BUTTON] presionado?\",\"tw.blocks.lastKeyPressed\":\"última tecla presionada\",\"tw.blocks.mouseButton.middle\":\"(1) central\",\"tw.blocks.mouseButton.primary\":\"(0) primario\",\"tw.blocks.mouseButton.secondary\":\"(2) secundario\",\"tw.blocks.openDocs\":\"Abrir Documentación\",\"tw.browserModal.desc\":\"Asegúrese de que esté usando una versión reciente de Google Chrome, Mozilla Firefox, Microsoft Edge o Apple Safari.\",\"tw.cantUseCloud\":\"Aunque puedes crear variables en la nube, no fucionarán a menos que este proyecto se suba a Scratch o se convierta usando una herramienta como el {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"El nombre de usuario no puede ser cambiado mientras el proyecto se está ejecutando.\",\"tw.clipboard.danger\":\"Si su portapapeles tiene cosas como contraseñas, el proyecto podría compartirlas con otros usuarios o servidores.\",\"tw.clipboard.permission\":\"El acceso a el portapapeles podría no funcionaren algunos navegadores. Si se permite, las próximas lecturas del portapapeles se permitirán automáticamente.\",\"tw.clipboard.title\":\"El proyecto quiere leer los datos de su portapapeles.\",\"tw.code\":\"Código Fuente\",\"tw.confirmIncompatibleExtension\":\"Esta extensión es incompatible con Scratch. Proyectos hechos con ella no podrán ser subidos al sitio web de Scratch. ¿Está seguro de que quiere activarla?\",\"tw.customExtension.description\":\"Cargar extensiones personalizadas desde URLs, archivos o código fuente JavaScript.\",\"tw.customExtension.name\":\"Extensión Personalizada\",\"tw.customExtensionModal.file\":\"Archivo\",\"tw.customExtensionModal.load\":\"Cargar\",\"tw.customExtensionModal.promptFile\":\"Seleccionar archivo JavaScript de la extensión:\",\"tw.customExtensionModal.promptText\":\"Pegar código fuente JavaScript de la extensión:\",\"tw.customExtensionModal.promptURL\":\"Ingresar URL de la extensión:\",\"tw.customExtensionModal.text\":\"Texto\",\"tw.customExtensionModal.title\":\"Cargar Extensión Personalizada\",\"tw.customExtensionModal.trusted\":\"Esta extensión será cargada sin el sandbox porque es de una fuente confiada.\",\"tw.customExtensionModal.unsandboxed\":\"Ejecutar extensión sin sandbox\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Cargar extensiones sin el sandbox es peligroso y no debería habilitarlo si no sabe lo que está haciendo.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Extensiones sin sandbox pueden corromper su proyecto, eliminar sus ajustes, pescar sus contraseñas, y otras cosas malas. Los desarrolladores de {APP_NAME} no son responsables por ningún problema resultante.\",\"tw.customExtensionModal.untrusted\":\"Extensiones de URLs no confiadas siempre serán cargadas con sandbox por seguridad.\",\"tw.customReporters.description\":\"Permitir a bloques personalizados devolver resultados y ser usados como entradas.\",\"tw.customReporters.name\":\"Reporteros Personalizados\",\"tw.documentation\":\"Documentación\",\"tw.extensionGallery.name\":\"Galería de Extensiones de TurboWarp\",\"tw.featuredProjectsStudio\":\"Ver estudio en Scratch\",\"tw.feedback\":\"Comentarios y Bugs\",\"tw.feedbackButton\":\"Enviar comentarios (feedback)\",\"tw.fetch.title\":\"El proyecto quiere conectarse al sitio web:\",\"tw.fileInput.none\":\"No se seleccionó ningún archivo.\",\"tw.fileInput.selected\":\"Seleccionado: {name}\",\"tw.fonts.add\":\"Agregar\",\"tw.fonts.custom.file\":\"Selecciona una fuente tipográfica de tu computador:\",\"tw.fonts.custom.name\":\"Dale un nombre a la fuente:\",\"tw.fonts.custom1\":\"Agrega fuente de un archivo\",\"tw.fonts.custom2\":\"Usualmente no funcionará en Scratch. Formatos soportados: {formats}\",\"tw.fonts.delete\":\"¿Estás seguro que quieres borrar \\\"{font}\\\"? Cualquier disfraz vector usará la fuente de reemplazo en vez.\",\"tw.fonts.fallback\":\"Elige una fuente alternativa que se utilizará si la fuente no se carga o se elimina:\",\"tw.fonts.list\":\"Fuentes instaladas:\",\"tw.fonts.none\":\"Sin fuentes añadidas aún.\",\"tw.fonts.readError\":\"Fallo en leer fuente tipográfica: {error}\",\"tw.fonts.system\":\"Fuente del sistema\",\"tw.fonts.system.name\":\"Escribe el nombre de cualquier fuente en tu computador. La fuente puede no aparecer correctamente para todos.\",\"tw.fonts.system1\":\"Agregar una fuente del sistema\",\"tw.fonts.system2\":\"Podría funcionar en Scratch, pero no aparecerá correctamente para todos.\",\"tw.fonts.title\":\"Fuentes\",\"tw.footer.credits\":\"Créditos\",\"tw.footer.disclaimer\":\"TurboWarp no está afiliado con Scratch, el Equipo de Scratch o la Scratch Foundation.\",\"tw.footer.documentation\":\"Documentación\",\"tw.footer.donate\":\"Donar\",\"tw.footer.embed\":\"Incrustado\",\"tw.footer.parameters\":\"Parámetros de URL\",\"tw.geolocate.permission\":\"Si se permite, puede que su navegador le pida acceso a su ubicación.\",\"tw.geolocate.title\":\"El proyecto quiere saber su ubicación.\",\"tw.gui.crashMessage.description\":\"Lo lamentamos mucho, pero parece que la página dejó de funcionar. Por favor actualice la página para intentar de nuevo.\",\"tw.gui.defaultProjectTitle\":\"Proyecto\",\"tw.guiDefaultTitle\":\"Ejecute proyectos de Scratch más rápido\",\"tw.home.credit\":\"Notas y Créditos\",\"tw.home.description\":\"TurboWarp es un mod de Scratch que compila los proyectos a JavaScript para hacerlos ejecutar muy rápido. Pruébelo insertando un ID o URL de proyecto debajo o elija un proyecto destacado debajo.\",\"tw.home.instructions\":\"Instrucciones\",\"tw.input.tooltip\":\"¡Copie y pegue un enlace a un proyecto de Scratch aquí!\",\"tw.interpolationEnabled\":\"Interpolación\",\"tw.invalidParameters.clones\":\"Parámetro de URL «clone» es inválido\",\"tw.invalidParameters.fps\":\"Parámetro de URL «fps» es inválido\",\"tw.loadError\":\"No se ha podido cargar el proyecto: {error}\",\"tw.loadExtension.embedded\":\"El proyecto quiere cargar una extensión personalizada con el código:\",\"tw.loadExtension.sandboxed\":\"A pesar de que el código tenga sandbox, tendrá acceso a la información de su dispositivo como su IP y su ubicación general. Asegúrese de confiar el autor de esta extensión antes de continuar.\",\"tw.loadExtension.unsandboxed\":\"Ejecutar extensión sin sandbox\",\"tw.loadExtension.unsandboxedWarning\":\"Cargar extensiones sin sandbox es peligroso. Será capaz de corromper su proyecto, eliminar sus ajustes, pescar sus contraseñas, y otras cosas malas. Los desarrolladores de {APP_NAME} no son responsables de ningún problema resultante.\",\"tw.loadExtension.url\":\"El proyecto quiere cargar una extensión personalizada de la URL:\",\"tw.loader.assets.known\":\"Descargando assets ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Descargando assets ...\",\"tw.loader.data\":\"Descargando información del proyecto...\",\"tw.loader.generic\":\"Cargando proyecto ...\",\"tw.menuBar.60off\":\"Desactivar modo 60 FPS\",\"tw.menuBar.60on\":\"Activar modo 60 FPS\",\"tw.menuBar.advanced\":\"Avanzado\",\"tw.menuBar.changeUsername\":\"Cambiar Nombre de Usuario\",\"tw.menuBar.cloudOff\":\"Desactivar Variables en la Nube\",\"tw.menuBar.cloudOn\":\"Activar Variables en la Nube\",\"tw.menuBar.cloudUnavailable\":\"Variables en la Nube no Disponibles\",\"tw.menuBar.cloudUnavailableAlert\":\"No se pueden usar variables en la nube, probablemente porque abriste el editor.\",\"tw.menuBar.moreSettings\":\"Ajustes Avanzados\",\"tw.menuBar.newFramerate\":\"Nuevo FPS:\",\"tw.menuBar.package\":\"Convertir proyecto\",\"tw.menuBar.reportError1\":\"Algunos scripts no pudieron ser compilados\",\"tw.menuBar.reportError2\":\"Esto es un bug. Por favor repórtelo.\",\"tw.menuBar.restorePoints\":\"Puntos de restauración\",\"tw.menuBar.saveAs\":\"Guardar como {file}\",\"tw.menuBar.seeInside\":\"Ver dentro\",\"tw.notify.permission\":\"Si se permite, puede que su navegador le pida habilitar notificaciones, y próximas notificaciones serán permitidas automáticamente.\",\"tw.notify.title\":\"El proyecto quiere mostrar notificaciones.\",\"tw.oldDownload\":\"Guardar a archivo separado...\",\"tw.opcode.2000\":\"días desde el 2000\",\"tw.opcode.mousedown\":\"¿ratón presionado?\",\"tw.opcode.mousex\":\"posición x del ratón\",\"tw.opcode.mousey\":\"posición y del ratón\",\"tw.openAdvanced\":\"Abrir opciones avanzadas\",\"tw.openWindow.dangerous\":\"Este sitio web no ha sido revisado por los desarrolladores de {APP_NAME}. Podría contener código peligroso o malicioso.\",\"tw.openWindow.title\":\"Este proyecto quiere abrir una nueva ventana o pestaña con la URL:\",\"tw.paint.alpha\":\"Opacidad\",\"tw.paint.fonts.more\":\"Agregar más fuentes...\",\"tw.privacy\":\"Política de Privacidad\",\"tw.recordAudio.permission\":\"Si se permite, puede que su navegador le pida acceso al micrófono, y los próximos accesos al micrófono se permitirán automáticamente.\",\"tw.recordAudio.title\":\"El proyecto quiere grabar audio de su micrófono. Esto podría incluir un transcriptor a texto o datos de audio sin procesar. El proyecto podría compartir el audio con otros usuarios o servidores.\",\"tw.recordVideo.permission\":\"Si se permite, puede que su navegador le pida acceso a su cámara, y los próximos accesos a la cámara se permitirán autiomáticamente.\",\"tw.recordVideo.title\":\"El proyecto quiere grabar video de su cámara. El proyecto podría compartir imágenes con otros usuarios o servidores.\",\"tw.redirect.dangerous\":\"Este sitio web no ha sido revisado por los desarrolladores de {APP_NAME}. Podría contener código peligroso o malicioso.\",\"tw.redirect.title\":\"El proyecto quiere trasladar esta pestaña a la URL:\",\"tw.restorePoints.1minute\":\"cada minuto\",\"tw.restorePoints.confirmDelete\":\"¿Está seguro de que quiere eliminar \\\"{projectTitle}\\\"? Esto no se puede deshacer.\",\"tw.restorePoints.confirmDeleteAll\":\"¿Está seguro de que desea eliminar TODOS los puntos de restauración? Esto no se puede deshacer.\",\"tw.restorePoints.confirmLoad\":\"Tiene cambios sin guardar. ¿Remplazar el proyecto existente?\",\"tw.restorePoints.deleteAll\":\"Eliminar Todos\",\"tw.restorePoints.description\":\"{APP_NAME} Guarda periódicamente puntos de guardado en su computadora para ayudarlo a recuperar su proyecto olvida guardarlo. Esto es guardado como una última oportunidad de recuperación. Su computadora podría silenciosamente eliminar estos puntos de guardado en cualquier momento. NO confíe en esta función.\",\"tw.restorePoints.empty\":\"No se encontraron puntos de recuperación.\",\"tw.restorePoints.error\":\"Error al cargar punto de recuperación: {error}\",\"tw.restorePoints.intervalOption\":\"Los puntos de recuperación son creados {time}.\",\"tw.restorePoints.loading\":\"Cargando...\",\"tw.restorePoints.minutes\":\"cada {n} minutos\",\"tw.restorePoints.never\":\"nunca\",\"tw.restorePoints.off\":\"Deshabilitar puntos de recuperación es peligroso.\",\"tw.restorePoints.size\":\"Estimación del almacenamiento usado: {size}\",\"tw.restorePoints.size2\":\"Los disfraces y sonidos usados por múltiples puntos de recuperación son solo almacenados una vez.\",\"tw.restorePoints.title\":\"Puntos de Restauración\",\"tw.saveAs\":\"Guardar como...\",\"tw.saveTo\":\"Guardar a {file}\",\"tw.scratchUnsafeCloud\":\"Si hace esto una variable en la nube, el proyecto exederá el límite de Scratch de {number} variables y algunas variables no funcionarán si sube el proyecto a Scratch.\",\"tw.securityManager.allow\":\"Permitir\",\"tw.securityManager.deny\":\"Denegar\",\"tw.securityManager.title\":\"Seguridad de la Extensión\",\"tw.securityManager.trust\":\"Si se permite, las próximas consultas al mismo sitio web serán automáticamente permitidas.\",\"tw.securityManager.why\":\"Esto podría ser usado para descargar imágenes o sonidos, implementar multijugador, acceder a una API, o con intenciones maliciosas. Esto compartirá tu dirección de IP, ubicación general, y probablemente otra información con el sitio web.\",\"tw.settingsModal.customStageSize\":\"Tamaño Personalizado del Escenario:\",\"tw.settingsModal.customStageSizeHelp\":\"Cambia el tamaño del escenario de Scratch de 480x360 a algo diferente. Pruebe 640x360 para hacer el escenario más ancho. Muy pocos proyectos manejarán esto adecuadamente.\",\"tw.settingsModal.dangerZone\":\"Zona Peligrosa\",\"tw.settingsModal.disableCompiler\":\"Desactivar Compilador\",\"tw.settingsModal.disableCompilerHelp\":\"Desactiva el compilador de TurboWarp. Puede que quiera activar esto mientras edita proyectos para que sus scripts se actualicen inmediatamente. Si ese no es el caso, no debería activar esto nunca.\",\"tw.settingsModal.featured\":\"Destacado\",\"tw.settingsModal.fps\":\"60 FPS (FPS Personalizado)\",\"tw.settingsModal.fpsHelp\":\"Ejecuta scripts 60 veces por segundo en vez de 30. La mayoría de los proyectos no funcionarán correctamente con esto activado. Debería probar Interpolación con modo 60 FPS desactivado si ese es el caso. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Haga click para usar un framerate diferente a 30 o 60\",\"tw.settingsModal.help\":\"Haga click para ayuda\",\"tw.settingsModal.highQualityPen\":\"Lápiz de Alta Calidad\",\"tw.settingsModal.highQualityPenHelp\":\"Permite a los proyectos que usen la extensión del Lápiz renderizar en una mayor resolución y desactiva el redondeo de coordenadas dentro del editor. No todos los proyectos se ven beneficiados de esta configuración, pues puede afectar negativamente el rendimiento. \",\"tw.settingsModal.infiniteClones\":\"Clones Infinitos\",\"tw.settingsModal.infiniteClonesHelp\":\"Desactiva el límite de 300 clones de Scratch.\",\"tw.settingsModal.interpolation\":\"Interpolación\",\"tw.settingsModal.interpolationHelp\":\"Hace que los movimientos dentro de los proyectos se vean más suaves al interpolar los cambios de posición de los objetos. No es recomendable utilizar el ajuste de interpolación en proyectos 3D o proyectos que utilicen la extensión del Lápiz u otros proyectos que sean de bajo rendimiento, ya que esta función lo ralentizará aún más.\",\"tw.settingsModal.largeStageWarning\":\"Usar un tamaño personalizado del escenario tan grande no es recomendado. En cambio, use un tamaño más pequeño con la misma relación de aspecto y permita que el modo pantalla completa agrande el escenario para cubrir toda la pantalla del usuario.\",\"tw.settingsModal.removeFencing\":\"Quitar Fencing\",\"tw.settingsModal.removeFencingHelp\":\"Permite a los objetos moverse afuera de la pantalla o hacerse tan grandes o chicos como deseen y hace funcionar los bloques \\\"tocando\\\" fuera de la pantalla.\",\"tw.settingsModal.removeLimits\":\"Quitar Límites\",\"tw.settingsModal.removeMiscLimits\":\"Quitar Límites Varios\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Elimina los límites de sonido y de tamaño del lápiz.\",\"tw.settingsModal.storeProjectOptions\":\"Guardar ajustes en proyecto\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Guarda los ajustes seleccionados en el proyecto para que sean aplicados automáticamente cuando TurboWarp carga este proyecto. Warp Timer y desactivar compilador no serán guardados.\",\"tw.settingsModal.title\":\"Ajustes Avanzados\",\"tw.settingsModal.warpTimerHelp\":\"Hace que los scripts revisen si están atascados en un bucle infinito y si es así, hace que vayan a una menor tasa de refresco hasta que el bucle termine, logrando evitar la mayoría de colapsos por este tipo de errores. Este ajuste tiene un impacto negativo significante en el rendimiento, por lo que solo está habilitado por defecto en el editor.\",\"tw.spriteSelectorItem.rename\":\"renombrar\",\"tw.stereo\":\"Estéreo\",\"tw.stereoAlert\":\"Editar este sonido estéreo lo convertirá irreversiblemente en mono.\",\"tw.studioview.authorAttribution\":\"por {author}\",\"tw.studioview.error\":\"Ocurrió un error cargando la siguiente página de proyectos.\",\"tw.studioview.hoverText\":\"{title} por {author}\",\"tw.tooLarge\":\"Este sonido podría ser demasiado grande como para cargarlo en Scratch.\",\"tw.twExtension.description\":\"Nuevos bloques extraños.\",\"tw.twExtension.name\":\"Bloques TurboWarp\",\"tw.unshared.2\":\"Para más información, visite: {link}\",\"tw.unshared.bug\":\"Si el proyecto está realmente compartido, por favor reporte un error.\",\"tw.unshared.cache\":\"Si el proyecto se a compartido recientemente, este mensaje podría aparecer incorrectamente por algunos minutos.\",\"tw.unshared2.1\":\"Los proyectos no compartidos ya no son visibles\",\"tw.usernameModal.help\":\"Este valor será guardado en el almacenamiento de su navegador. Es posible que sea usado cuando interactúe con proyectos que contengan variables en la nube.\",\"tw.usernameModal.help2\":\"Valores que no corresponden a una cuenta de Scratch válida típicamente serán rechazadas por el servidor de variables en la nube. Se le recomienda dejarlo como está o cambiarlo a su nombre de usuario de Scratch.\",\"tw.usernameModal.mustChange\":\"Lo sentimos, el servidor de variables en la nube piensa que tu nombre de usuario puede ser inseguro. Por favor cámbielo a otra cosa o {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"resetéelo (recomendado)\",\"tw.usernameModal.new\":\"Nuevo nombre de usuario:\",\"tw.usernameModal.reset\":\"Reiniciar\",\"tw.usernameModal.title\":\"Cambiar Nombre de Usuario\",\"tw.viewFeaturedProjects\":\"Clickee para ver proyectos destacados.\",\"tw.viewOnScratch\":\"Ver proyecto en Scratch\",\"tw.webglModal.description\":\"Desafortunadamente parece que tu navegador o computadora {webGlLink}. Esta tecnología se necesita para que funcione este sitio. Intente actualizar su navegador y drivers gráficos o reinicie su computadora.\"},\"fr\":{\"tw.alerts.creatingRestorePoint\":\"Création d'un point de restauration…\",\"tw.alerts.lostPeripheralConnection\":\"Le périphérique {extensionName} vient d’être déconnecté.\",\"tw.alerts.savedToDisk\":\"Enregistré sur votre ordinateur.\",\"tw.backpack.rename\":\"Nouveau nom :\",\"tw.blocks.buttonIsDown\":\"bouton [MOUSE_BUTTON] de la souris pressé ?\",\"tw.blocks.lastKeyPressed\":\"dernière touche pressée\",\"tw.blocks.mouseButton.middle\":\"(1) milieu\",\"tw.blocks.mouseButton.primary\":\"(0) primaire\",\"tw.blocks.mouseButton.secondary\":\"(2) secondaire\",\"tw.blocks.openDocs\":\"Ouvrir la documentation\",\"tw.browserModal.desc\":\"Vérifiez que vous utilisez une version récente de Google Chrome, Mozilla Firefox, Micorsoft Edge ou Apple Safari.\",\"tw.cantUseCloud\":\"Bien que vous puissiez créer des variables cloud, elles ne fonctionneront que si ce projet est téléchargé sur Scratch ou converti à l'aide d'un outil comme le{packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Le nom d'utilisateur ne peut pas être modifié pendant l'exécution du projet.\",\"tw.code\":\"Code source\",\"tw.confirmIncompatibleExtension\":\"Cette extension est incompatible avec Scratch. Les projets réalisés avec lui ne peuvent pas être téléchargés sur le site Web de Scratch. Voulez-vous vraiment l'activer ?\",\"tw.customExtension.name\":\"Extension customisée\",\"tw.customExtensionModal.file\":\"Fichier\",\"tw.featuredProjectsStudio\":\"Voir le studio sur scratch.\",\"tw.feedback\":\"retour et signalement de bugues\",\"tw.feedbackButton\":\"Retours sur TurboWarp\",\"tw.footer.credits\":\"Crédits\",\"tw.footer.disclaimer\":\"TurboWarp n'est pas affilié à Scratch, à l'équipe Scratch ou à la Fondation Scratch.\",\"tw.footer.donate\":\"Faire un don\",\"tw.footer.embed\":\"Intégrer\",\"tw.footer.parameters\":\"Paramères URL\",\"tw.gui.crashMessage.description\":\"Nous sommes vraiment désolés, mais il semble que TurboWarp a crashé. Veuillez actualiser la page pour réessayer.\",\"tw.gui.defaultProjectTitle\":\"Projet\",\"tw.guiDefaultTitle\":\"Exécute les projets Scratch plus rapidement\",\"tw.home.credit\":\"Notes et Crédits\",\"tw.home.description\":\"TurboWarp est un Scratch mod qui compile les projets en JavaScript pour qu'ils soient éxécutés plus rapidement. Pour l'essayer, Entrez une URL ou l'ID d'un projet ci-dessus ou choisissez l'un des projets sélectionné.\",\"tw.input.tooltip\":\"Copie et colle le lien d'un projet Scratch ici !\",\"tw.invalidParameters.clones\":\"Le paramètre d'URL \\\"clone\\\" n'est pas valide.\",\"tw.invalidParameters.fps\":\"Le paramètre d'URL \\\"fps\\\" n'est pas valide.\",\"tw.loadError\":\"Impossible de charger le projet : {error}\",\"tw.loader.assets.known\":\"Téléchargement des assets ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Téléchargement des assets ...\",\"tw.loader.data\":\"Téléchargement des données du projet …\",\"tw.loader.generic\":\"Lecture du projet ...\",\"tw.menuBar.60off\":\"Désactiver le mode 60 FPS\",\"tw.menuBar.60on\":\"Activer le mode 60 FPS\",\"tw.menuBar.advanced\":\"Avancé\",\"tw.menuBar.changeUsername\":\"Changer le nom d'utilisateur\",\"tw.menuBar.cloudOff\":\"Désactiver les variables cloud\",\"tw.menuBar.cloudOn\":\"Activer les variables cloud\",\"tw.menuBar.cloudUnavailable\":\"Les variables cloud ne sont pas disponibles\",\"tw.menuBar.cloudUnavailableAlert\":\"Impossible d'utiliser les variables cloud, probablement parce que vous avez ouvert l'éditeur.\",\"tw.menuBar.compileError\":\"{sprite} : {error}\",\"tw.menuBar.moreSettings\":\"Paramètres Avancés\",\"tw.menuBar.newFramerate\":\"Nouveau ratio d'images par seconde :\",\"tw.menuBar.package\":\"Empaqueter le projet\",\"tw.menuBar.reportError1\":\"Certains scripts ne peuvent pas être compilés.\",\"tw.menuBar.reportError2\":\"Ceci est un bug. Merci de le signaler.\",\"tw.menuBar.saveAs\":\"Enregistrer sous {file}\",\"tw.menuBar.seeInside\":\"Voir à l'intérieur\",\"tw.oldDownload\":\"Enregistrer dans un fichier séparé...\",\"tw.opcode.2000\":\"jours depuis 2000\",\"tw.opcode.mousedown\":\"clic gauche?\",\"tw.opcode.mousex\":\"souris x\",\"tw.opcode.mousey\":\"souris y\",\"tw.openAdvanced\":\"Ouvrir les paramètres avancés\",\"tw.paint.alpha\":\"Opacité\",\"tw.privacy\":\"Politique de Confidentialité\",\"tw.saveAs\":\"Enregistrer sous...\",\"tw.saveTo\":\"Sauvegarder sous {file}\",\"tw.scratchUnsafeCloud\":\"Si vous créez cette variable cloud, le projet dépassera la limite de Scratch de {number} variables, et certaines variables ne fonctionneront pas si vous téléchargez le projet dans Scratch.\",\"tw.settingsModal.customStageSize\":\"Taille de la scène personnalisé :\",\"tw.settingsModal.customStageSizeHelp\":\"Change la taille de la scène Scratch de 480x360 à autre chose. Essayez 640x360 pour rendre la scène grand écran. Très peu de projets gèrent cela correctement.\",\"tw.settingsModal.dangerZone\":\"Zone de danger\",\"tw.settingsModal.disableCompiler\":\"Désactiver le compilateur\",\"tw.settingsModal.disableCompilerHelp\":\"Désactive le compilateur de TurboWarp. Utile si vous souhaitez modifier votre programme pendant que ce dernier est en train de tourner. Autrement, éviter d'activer cette option.\",\"tw.settingsModal.featured\":\"En vedette\",\"tw.settingsModal.fps\":\"60 FPS (personnalisé)\",\"tw.settingsModal.fpsHelp\":\"Exécute les scripts 60 fois par seconde au lieu de 30. La plupart des projets ne fonctionneront pas correctement si cette option est activée. Vous devriez essayer l'interpolation avec le mode 60 FPS désactivé si tel est le cas.{customFramerate}\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Clique pour utiliser un autre ratio d'images par seconde (FPS) que 30 ou 60\",\"tw.settingsModal.help\":\"Clique pour obtenir de l'aide\",\"tw.settingsModal.highQualityPen\":\"Stylo de haute qualité\",\"tw.settingsModal.highQualityPenHelp\":\"Permet aux projets utilisant le stylo d'utiliser une plus grande résolution et permet de désactiver certains arrondis dans les coordonnées de l'éditeur. Tout le projet ne bénéfie pas de ce paramètre et il peut impacter la performance.\",\"tw.settingsModal.infiniteClones\":\"Clones Infinis\",\"tw.settingsModal.infiniteClonesHelp\":\"Désactive la limite de 300 clones de Scratch\",\"tw.settingsModal.interpolationHelp\":\"Rend les projets plus fluides en interpolant le mouvement du sprite. L'interpolation ne doit pas être utilisée sur les projets 3D, les lanceurs de rayons, les projets de stylet et les projets décalés, car l'interpolation les ralentira sans les rendre plus lisses.\",\"tw.settingsModal.largeStageWarning\":\"Utiliser une taille de scène personnalisée plus large n'est pas recommandé. Utilisez plutôt cette option pour une taille plus petite et avec le même ration longueur/largeur pour que le projet soit facilement utilisable par n'importe quel utilisateur.\",\"tw.settingsModal.removeFencing\":\"Supprimer les limites\",\"tw.settingsModal.removeFencingHelp\":\"Permet aux sprites de se déplacer hors de l'écran, de devenir aussi grands ou aussi petits qu'ils le souhaitent et de faire fonctionner les blocs tactiles hors de l'écran.\",\"tw.settingsModal.removeLimits\":\"Supprimer les limites\",\"tw.settingsModal.removeMiscLimits\":\"Supprimer diverses limites\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Supprime les limites des effets sonores ou celles de la taille du stylo.\",\"tw.settingsModal.storeProjectOptions\":\"Sauvegarder les paramètres du projet.\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Stocke les paramètres sélectionnés dans le projet afin qu'ils soient automatiquement appliqués lorsque TurboWarp charge ce projet. Le temporisateur Warp et le compilateur désactivé ne seront pas enregistrés.\",\"tw.settingsModal.title\":\"Paramètres Avancés\",\"tw.settingsModal.warpTimer\":\"Vérificateur de boucles infinies.\",\"tw.settingsModal.warpTimerHelp\":\"Vérifie si les scripts sont bloqués dans des boucles infinies, et le cas échéant, fait tourner le programme a une vitesse très réduite pour empêcher le logiciel de crasher. Cela peut cependant fortement impacter les performances du programme.\",\"tw.spriteSelectorItem.rename\":\"renommer\",\"tw.stereo\":\"Stéréo\",\"tw.stereoAlert\":\"L'édition de ce son stéréo le convertira irréversiblement en mono.\",\"tw.studioview.authorAttribution\":\"Fait par {author}\",\"tw.studioview.error\":\"Il y a eu une erreur dans le chargement de la page suivante des projets\",\"tw.studioview.hoverText\":\"{title} fait par {author}\",\"tw.tooLarge\":\"Ce son peut être trop volumineux pour être chargé dans Scratch.\",\"tw.twExtension.name\":\"Blocs TurboWarp\",\"tw.unshared.2\":\"Pour plus d'informations, visitez : {link}\",\"tw.unshared.cache\":\"Si le projet a été partagé récemment, ce message peut s'afficher de manière incorrecte pendant quelques minutes.\",\"tw.usernameModal.help\":\"Cette valeur sera stockée dans la mémoire de votre navigateur. Il peut être consigné lorsque vous interagissez avec des projets contenant des variables cloud.\",\"tw.usernameModal.help2\":\"Les valeurs qui ne correspondent pas à un compte Scratch valide seront généralement rejetées par le serveur de variables cloud. Nous vous recommandons de le laisser tel quel ou de le remplacer par votre nom d'utilisateur Scratch.\",\"tw.usernameModal.mustChange\":\"Désolé, le serveur de variables cloud pense que votre nom d'utilisateur n'est peut-être pas sûr. Veuillez le changer pour autre chose ou{resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"réinitialiser (recommandé)\",\"tw.usernameModal.reset\":\"Réinitialiser\",\"tw.usernameModal.title\":\"Changer votre nom d'utilisateur\",\"tw.viewFeaturedProjects\":\"Cliquez pour voir les projets sélectionnés.\",\"tw.viewOnScratch\":\"Voir le projet sur Scratch\",\"tw.webglModal.description\":\"Malheureusement, cela ressemble à votre navigateur ou à votre ordinateur{webGlLink}. Cette technologie est nécessaire au fonctionnement de ce site. Essayez de mettre à jour votre navigateur et vos pilotes graphiques ou de redémarrer votre ordinateur.\"},\"he\":{\"tw.alerts.creatingRestorePoint\":\"ביצוע נקודת שחזור קוד\",\"tw.alerts.savedToDisk\":\"הקובץ נשמר בהתקן שלך.\",\"tw.blocks.addons\":\"הרחבות\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON]לחצן העכבר נלחץ?\",\"tw.blocks.lastKeyPressed\":\"מקש אחרון שנלחץ על המקלדת\",\"tw.blocks.mouseButton.middle\":\"(1) במרכז\",\"tw.blocks.mouseButton.primary\":\"(0)נורמלי\",\"tw.blocks.mouseButton.secondary\":\"(2) שני\",\"tw.changeUsername.cannotChangeWhileRunning\":\"אינך יכול לשנות את שם המשתמש שלך כאשר פרויקט הקוד פועל.\",\"tw.code\":\"קוד קוד פתוח\",\"tw.featuredProjectsStudio\":\"הצג את הסטודיו על קידוד שריטות\",\"tw.feedback\":\"הצעות ושגיאות\",\"tw.feedbackButton\":\"תנו הצעות\",\"tw.gui.crashMessage.description\":\"אנו מתנצלים; נראה שהדף קרס. אנא רענן דף זה כדי לנסות שוב.\",\"tw.gui.defaultProjectTitle\":\"פרויקט קידוד\",\"tw.home.credit\":\"מידע וייחוסים\",\"tw.home.description\":\"TurboWarp מבוסס על Scratch, אבל הוא מרכיב פרויקטי קוד ל-JavaScript כדי לגרום להם לרוץ ממש מהר. נסה זאת על ידי הזנת מזהה פרויקט או כתובת אתר למעלה או באמצעות פרויקט קוד מוצג למטה.\",\"tw.home.instructions\":\"איך להישתמש\",\"tw.invalidParameters.clones\":\"פרמטר כתובת האתר \\\"כפול\\\" אינו חוקי\",\"tw.invalidParameters.fps\":\"פרמטר כתובת האתר \\\"מסגרות לשנייה\\\" אינו חוקי\",\"tw.loader.assets.known\":\"הורדה של נכסים({complete}/{total})...\",\"tw.loader.assets.unknown\":\"הורדה של נכסים\",\"tw.loader.data\":\"מוריד נתונים...\",\"tw.loader.generic\":\"טוען קוד...\",\"tw.menuBar.60off\":\"כבה את מצב \\\"מסגרות גבוהות לשנייה\\\".\",\"tw.menuBar.60on\":\"הפעל את מצב \\\"פריימים גבוהים לשניה\\\".\",\"tw.menuBar.addons\":\"הרחבות\",\"tw.menuBar.changeUsername\":\"לשנות את שם המשתמש\",\"tw.menuBar.cloudOff\":\"כבה את משתני השרת\",\"tw.menuBar.cloudOn\":\"אפשר משתני שרת\",\"tw.menuBar.cloudUnavailable\":\"משתני שרת אינם זמינים\",\"tw.menuBar.cloudUnavailableAlert\":\"משתני שרת אינם זמינים. אתה כנראה משתמש בעורך הקוד.\",\"tw.menuBar.compileError\":\"{sprite}:{error}\",\"tw.menuBar.newFramerate\":\"קצב חדש של מסגרות לשנייה:\",\"tw.menuBar.reportError1\":\"לא ניתן היה להרכיב חלק מהקוד.\",\"tw.menuBar.reportError2\":\"יש שגיאה. אנא צור איתי קשר בנושא.\",\"tw.menuBar.saveAs\":\"הורד בשם{file}\",\"tw.menuBar.seeInside\":\"עיין בקוד המקור\",\"tw.privacy\":\"מדיניות הפרטיות\",\"tw.studioview.authorAttribution\":\"על ידי{author}\",\"tw.studioview.error\":\"לא ניתן היה לטעון את העמוד הבא של פרויקטי קוד.\",\"tw.studioview.hoverText\":\"{title}נוצר על ידי{author}\",\"tw.usernameModal.reset\":\"אִתחוּל\",\"tw.usernameModal.title\":\"לשנות את שם המשתמש\",\"tw.viewFeaturedProjects\":\"לחץ על כפתור זה כדי להציג פרויקטי קוד נבחרים.\",\"tw.webglModal.description\":\"לרוע המזל, נראה כי דפדפן האינטרנט או המחשב שלך{webGlLink} . טכנולוגיה זו נדרשת כדי שהאתר הזה יפעל כהלכה. נסה לעדכן את דפדפן האינטרנט או מנהלי ההתקן הגרפיים שלך; או הפעל מחדש את המחשב שלך.\"},\"hu\":{\"tw.alerts.creatingRestorePoint\":\"Helyreállítási pont készítése...\",\"tw.alerts.savedToDisk\":\"Mentve a számítógépre.\",\"tw.backpack.rename\":\"Új név:\",\"tw.blocks.addons\":\"Kiegészítők\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] egérbillentyű lenyomva?\",\"tw.blocks.lastKeyPressed\":\"utolsó lenyomott billentyű\",\"tw.blocks.mouseButton.middle\":\"(1) középső\",\"tw.blocks.mouseButton.primary\":\"(0) elsődleges\",\"tw.blocks.mouseButton.secondary\":\"(2) másodlagos\",\"tw.blocks.openDocs\":\"Dokumentáció megnyitása\",\"tw.browserModal.desc\":\"Győződj meg róla, hogy egy friss verzióját használod a Google Chrome-nak, Mozilla Firefoxnak, Microsoft Edge-nek vagy Apple Safarinak.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"A felhasználónév nem változtatható meg a projekt futása alatt.\",\"tw.code\":\"Forráskód\",\"tw.confirmIncompatibleExtension\":\"Ez a kiegészítés nem kompatibilis a Scratchhel. Ezzel készített projekteket nem lehet feltölteni a Scratch weboldalára. Biztos, hogy mégis engedélyezni szeretnéd őket?\",\"tw.customExtension.name\":\"Egyéni Kiegészítő\",\"tw.customExtensionModal.file\":\"Fájl\",\"tw.featuredProjectsStudio\":\"Műhely megtekintése a Scratchen.\",\"tw.feedback\":\"Visszajelzés és Hibák\",\"tw.feedbackButton\":\"Visszajelzés a TurboWarpról\",\"tw.footer.credits\":\"Stáblista\",\"tw.footer.disclaimer\":\"A TurboWarp nem tagja, vagy leányvállalata a Scratchnek, a Scratch Csapatnak vagy a Scratch Alapítványnak.\",\"tw.footer.embed\":\"Beágyazás\",\"tw.footer.parameters\":\"URL Paraméterek\",\"tw.gui.crashMessage.description\":\"Nagyon sajnáljuk, de úgy tűnik, hogy a projekt összeomlott. Kérjük frissítsd az oldalt, és próbáld újra.\",\"tw.gui.defaultProjectTitle\":\"Projekt\",\"tw.guiDefaultTitle\":\"Scratch projektek futtatása gyorsabban\",\"tw.home.credit\":\"Megjegyzések és stáblista\",\"tw.home.description\":\"A TurboWarp egy Scratch-modifikáció, ami átfordítja a projekteket JavaScriptbe, így igazán gyorsan lefuttatva őket. Próbálja ki egy projekt azonosítójával (ID), vagy URL-jével a fenti mezőbe beillesztve, illetve egy kiemelt projekt választásával lentről.\",\"tw.home.instructions\":\"Utasítások\",\"tw.input.tooltip\":\"Másolj, majd illessz be Scratch-projekt linkeket ide!\",\"tw.interpolationEnabled\":\"Interpoláció\",\"tw.invalidParameters.clones\":\"A \\\"clone\\\" URL paraméter érvénytelen\",\"tw.invalidParameters.fps\":\"Az \\\"fps\\\" URL paraméter nem érvényes\",\"tw.loader.assets.known\":\"Tartozékok letöltése ({complete}/{total}) …\",\"tw.loader.assets.unknown\":\"Eszközök betöltése ...\",\"tw.loader.data\":\"Projektadatok letöltése ...\",\"tw.loader.generic\":\"Projekt betöltése ...\",\"tw.menuBar.60off\":\"A 60 FPS mód kikapcsolása\",\"tw.menuBar.60on\":\"60 FPS Mód bekapcsolása\",\"tw.menuBar.addons\":\"Kiegészítők\",\"tw.menuBar.advanced\":\"Haladó\",\"tw.menuBar.changeUsername\":\"Felhasználónév Megváltoztatása\",\"tw.menuBar.cloudOff\":\"Megosztott változók kikapcsolása\",\"tw.menuBar.cloudOn\":\"Megosztott Változók engedélyezése\",\"tw.menuBar.cloudUnavailable\":\"Nem érhetőek el a Megosztott Változók\",\"tw.menuBar.cloudUnavailableAlert\":\"Nem használhatóak a megosztott változók, legvalószínűbben azért, mert megnyitottad a szerkesztőt.\",\"tw.menuBar.moreSettings\":\"Haladó Beállítások\",\"tw.menuBar.newFramerate\":\"Új képkockaarány:\",\"tw.menuBar.reportError1\":\"Néhány szkriptet nem sikerült lefordítani.\",\"tw.menuBar.reportError2\":\"Ez egy hiba. Kérjük jelentsd.\",\"tw.menuBar.saveAs\":\"Mentés {file}-ként\",\"tw.menuBar.seeInside\":\"Megnézem belülről\",\"tw.paint.alpha\":\"Áttetszőség\",\"tw.privacy\":\"Adatvédelmi Irányelvek\",\"tw.settingsModal.customStageSize\":\"Egyedi Színpadméret:\",\"tw.settingsModal.customStageSizeHelp\":\"Megváltoztatja a méretét a Scratch színpadnak 480×360-ról valami másra. Próbálja ki a 640×360-t, hogy a színpad képernyő méretű legyen. Csak nagyon kevés projekt kezeli ezt megfelelően.\",\"tw.settingsModal.dangerZone\":\"Veszélyzóna\",\"tw.settingsModal.disableCompiler\":\"Fordítóprogram kikapcsolása\",\"tw.settingsModal.disableCompilerHelp\":\"Letiltja a TurboWarp fordítóprogramját. Projektek szerkesztése közben elképzelhető, hogy szüksége lehet rá a szkriptek azonnali frissítése végett. Egyéb helyzetekben sose kapcsolja be ezt!\",\"tw.settingsModal.featured\":\"Kiemelt\",\"tw.settingsModal.fps\":\"60 FPS (Egyéni FPS)\",\"tw.settingsModal.fpsHelp\":\"Az utasításokat 30 helyett 60-szor futtatja le másodpercenként. A legtöbb projekt nem fog megfelelően működni ezzel. Ki kell próbálnod az Interpolációt 60 FPS nélkül, ha ez a helyzet. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Kattintson 30, vagy 60-tól eltérő képkockaarány használatához\",\"tw.settingsModal.help\":\"Kattintson segítségért\",\"tw.settingsModal.highQualityPen\":\"Magas Minőségű Toll\",\"tw.settingsModal.highQualityPenHelp\":\"Lehetővé teszi a tollal készített projekteket, hogy magasabb felbontásban fussanak, valamint letilt bizonyos koordinátakerekítést is a szerkesztőben. Nem minden projektnek előnyös ez a beállítás, valamint lehet, hogy a teljesítményre is hatással van.\",\"tw.settingsModal.infiniteClones\":\"Végtelen másolatszám\",\"tw.settingsModal.infiniteClonesHelp\":\"Letiltja a Scratch 300-as másolatkorlátját\",\"tw.settingsModal.interpolation\":\"Interpoláció\",\"tw.settingsModal.interpolationHelp\":\"Simábban jeleníti meg a projekteket azáltal, hogy interpolálja a szereplők mozgását. Az interpolációt nem szabad 3D projektekre, \\\"raytracer\\\"-ekre, tollat használó projektekre és laggolós projektekre alkalmazni, hiszen az interpoláció csak lassabbá fogja tenni a lefuttatásukat, viszont a megjelenésükön nem fog igazítani.\",\"tw.settingsModal.largeStageWarning\":\"Egyéni színpadméret használatánál nem ajánlott ilyen nagyot alkalmazni. Helyette használj egy kisebb méretet, de megegyező aránnyal, és bízd rá a teljes képernyőre, hogy felnagyítsa a felhasználó lejátszójának méretéhez.\",\"tw.settingsModal.removeFencing\":\"Lekerítés eltávolítása\",\"tw.settingsModal.removeFencingHelp\":\"Lehetővé teszi a szereplőket, hogy a színpadon kívülre menjenek, olyan nagyok, vagy kicsik legyenek, amilyenek csak akarnak, valamint az érzékelős blokkokat is működőképessé teszi színpadon kívül is.\",\"tw.settingsModal.removeLimits\":\"Korlátok eltávolítása\",\"tw.settingsModal.removeMiscLimits\":\"Egyéb Korlátok Eltávolítása\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Eltávolítja a hangeffekt limiteket, és a tollméret korlátozottságait.\",\"tw.settingsModal.storeProjectOptions\":\"Beállítások eltárolása a projektben.\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Eltárolja a kiválasztott beállításokat a projektben, így azonnal alkalmazhatja a TurboWarp őket betöltésnél. A Warp Időzítő és a Fordítóprogram Kikapcsolása nem lesz elmentve.\",\"tw.settingsModal.title\":\"Haladó Beállítások\",\"tw.settingsModal.warpTimer\":\"Warp Időzítő\",\"tw.settingsModal.warpTimerHelp\":\"Leellenőrzi a szkripteket, hogy nem-e ragadtak bele egy hosszú- vagy végtelen-ciklusba, és alacsony képkockaarányban futtatja őket, ahelyett hogy leragadjanak, amíg a ciklus véget ér. Ez tehát megjavítja a legtöbb összeomlást, de cserébe van egy jelentős teljesítménybehatása is, így csak a szerkesztőben van automatikusan bekapcsolva.\",\"tw.spriteSelectorItem.rename\":\"átnevezés\",\"tw.studioview.authorAttribution\":\"{author} által\",\"tw.studioview.error\":\"Hiba történt a projektek következő oldalának betöltése közben.\",\"tw.studioview.hoverText\":\"{title}, {author} által\",\"tw.twExtension.name\":\"TurboWarp Blokkok\",\"tw.usernameModal.help\":\"Ez az érték a böngésződ tárában fog eltárolódni. Lehet, hogy naplózva lesz amikor olyan projektekkel lépsz kapcsolatba, amik tartalmaznak megosztott változókat.\",\"tw.usernameModal.help2\":\"Olyan értékeket, amik nem egyeznek meg egy érvényes Scratch fiókkal sem, a megosztott változók szervere elutasít jellemzően. Azt javasoljuk, hogy hagyd, ahogy van, vagy állítsd a Scratch felhasználónevedre.\",\"tw.usernameModal.mustChange\":\"Bocsánat, a megosztott változók szervere szerint a felhasználóneved nem lehet föltétlenül biztonságos. Kérjük változtasd meg valami másra, vagy {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"állítsd vissza (ajánlott)\",\"tw.usernameModal.reset\":\"Visszaállítás\",\"tw.usernameModal.title\":\"Felhasználónév Megváltoztatása\",\"tw.viewFeaturedProjects\":\"Egy kattintás a kiemelt projektek megtekintéséhez.\",\"tw.viewOnScratch\":\"Projekt megtekintése a Scratchen.\",\"tw.webglModal.description\":\"Sajnos úgy tűnik, hogy a böngészője vagy számítógépe {webGlLink}. Ez a technológia szükséges ezenaz oldal lefutásához.\"},\"it\":{\"tw.alerts.creatingRestorePoint\":\"Creazione di un punto di ripristino...\",\"tw.alerts.lostPeripheralConnection\":\"Persa la connessione a {extensionName}.\",\"tw.alerts.restorePointError\":\"Impossibile creare il punto di ripristino\",\"tw.alerts.restorePointSuccess\":\"Puoi accedere ai punti di ripristino nel menu \\\"File\\\"\",\"tw.alerts.savedToDisk\":\"Salvato sul computer.\",\"tw.backpack.rename\":\"Nuovo nome:\",\"tw.blocks.PROCEDURES_DOCS\":\"Come usare il blocco Risultato\",\"tw.blocks.PROCEDURES_RETURN\":\"risultato {v}\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"Trasforma in Monitor\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"Trasforma in Comando\",\"tw.blocks.addons\":\"Addon\",\"tw.blocks.buttonIsDown\":\"pulsante [MOUSE_BUTTON] del mouse premuto\",\"tw.blocks.lastKeyPressed\":\"ultimo tasto premuto\",\"tw.blocks.mouseButton.middle\":\"(1) centrale\",\"tw.blocks.mouseButton.primary\":\"(0) primario\",\"tw.blocks.mouseButton.secondary\":\"(2) secondario\",\"tw.blocks.openDocs\":\"Apri Documentazione\",\"tw.browserModal.desc\":\"Assicurati di usare una versione recente di Google Chrome, Mozilla Firefox, Microsoft Edge o Apple Safari.\",\"tw.cantUseCloud\":\"Sebbene tu possa creare variabili cloud, queste funzioneranno solo quando il progetto sarà stato caricato sul sito di Scratch o sarà stato convertito usando un tool come {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Non è possibile cambiare lo username mentre il progetto è in esecuzione.\",\"tw.clipboard.danger\":\"Se i tuoi appunti contengono delle password, il progetto può condividerle con altri utenti o altri server.\",\"tw.clipboard.permission\":\"L'accesso agli appunti potrebbe non funzionare in alcuni browser. Se consentito, accessi futuri agli appunti verranno conserntiti automaticamente.\",\"tw.clipboard.title\":\"Il progetto vuole leggere dei dati dai tuoi appunti.\",\"tw.code\":\"Codice Sorgente\",\"tw.confirmIncompatibleExtension\":\"Questa estensione non è compatibile con Scratch. I progetti che vengono creati con essa non possono essere caricati sul sito di Scratch. Sei sicuro di volerla attivare?\",\"tw.createdBy\":\"Creato da:\",\"tw.customExtension.description\":\"Carica estensioni personalizzate da URL, file o codice Javascript.\",\"tw.customExtension.name\":\"Estensioni Personalizzate\",\"tw.customExtensionModal.load\":\"Carica\",\"tw.customExtensionModal.promptFile\":\"Seleziona il file Javascript dell'estensione:\",\"tw.customExtensionModal.promptText\":\"Incolla il codice JavaScript dell'estensione:\",\"tw.customExtensionModal.promptURL\":\"Inserisci la URL dell'estensione:\",\"tw.customExtensionModal.text\":\"Testo\",\"tw.customExtensionModal.title\":\"Carica Estensione Personalizzata\",\"tw.customExtensionModal.trusted\":\"L'estensione verrà caricata senza sandbox in quanto proviene da una fonte affidabile.\",\"tw.customExtensionModal.unsandboxed\":\"Esegui l'estensione senza sandbox\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Caricare le estensioni senza sandbox è rischioso, non dovresti abilitarlo se non sai esattamente cosa stai facendo.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Le estensioni eseguite senza sandbox possono corrompere il tuo progetto, cancellare le tue impostazioni, rubare le tue password e fare altre cose malevole. Gli sviluppatori di {APP_NAME} non si ritengono responsabili per qualunque problema dovesse verificarsi.\",\"tw.customExtensionModal.untrusted\":\"Le estensioni da URL non affidabili saranno sempre caricate con una sandbox per ragioni di sicurezza.\",\"tw.customReporters.description\":\"Permette ai blocchi personalizzati di restituire un valore e di essere usati come monitor.\",\"tw.customReporters.name\":\"Monitor Personalizzati\",\"tw.documentation\":\"Documentazione\",\"tw.embed.persistent\":\"Nel caso l'inserimento venga consentito, futuri tentativi di inserimento di contenuti provenienti dallo stesso sito saranno automaticamente consentiti.\",\"tw.embed.risks\":\"Anche se il contenuto sarà inserito in una sandbox, avrà comunque accesso alle informazioni sul tuo dispotivo come il tuo indirizzo IP e la tua posizione.\",\"tw.embed.title1\":\"Il progetto sta cercando di inserire del contenuto HTML sopra allo Stage:\",\"tw.embed.title2\":\"Il progetto sta cercando di inserire contenuto remoto sopra allo Stage:\",\"tw.extensionGallery.error\":\"Errore nel caricamento della galleria delle estensioni. Visita extensions.turbowarp.org per ulteriori informazioni sulle estensioni.\",\"tw.extensionGallery.loading\":\"Caricamento galleria estensioni in corso...\",\"tw.extensionGallery.more\":\"Ulteriori informazioni sulle estensioni disponibili a extensions.turbowarp.org.\",\"tw.extensionGallery.name\":\"Galleria delle Estensioni di TurboWarp\",\"tw.favorite\":\"Preferito\",\"tw.featuredProjectsStudio\":\"Vai alla galleria sul sito di Scratch.\",\"tw.feedback\":\"Feedback & Bug\",\"tw.feedbackButton\":\"Feedback per TurboWarp\",\"tw.fetch.title\":\"Il progetto vuole collegarsi al sito:\",\"tw.fileInput.none\":\"Nessun file selezionato.\",\"tw.fileInput.selected\":\"Selezionato: {name}\",\"tw.fonts.add\":\"Aggiungi\",\"tw.fonts.custom.file\":\"Seleziona un file di caratteri dal tuo computer:\",\"tw.fonts.custom.name\":\"Dai un nome la carattere:\",\"tw.fonts.custom1\":\"Aggiungi carattere da un file\",\"tw.fonts.custom2\":\"Di solito non funziona in Scratch. Formati supportati: {formats}.\",\"tw.fonts.delete\":\"Sei sicuro di voler cancellare \\\"{font}\\\"? Tutti i costumi vettoriali che lo usano useranno al suo posto il carattere sostitutivo.\",\"tw.fonts.fallback\":\"Scegli un carattere sostitutivo da usare se il carattere non può essere caricato o se viene cancellato:\",\"tw.fonts.list\":\"Caratteri installati:\",\"tw.fonts.none\":\"Ancora nessun carattere aggiunto.\",\"tw.fonts.readError\":\"Errore nella lettura del file di caratteri: {error}\",\"tw.fonts.system\":\"Carattere di sistema\",\"tw.fonts.system.name\":\"Inserisci il nome di un carattere presente nel tuo computer. Il carattere potrebbe non apparire a tutti in modo corretto.\",\"tw.fonts.system1\":\"Aggiungi un carattere di sistema\",\"tw.fonts.system2\":\"Potrebbe funzionare in Scratch, ma potrebbe non apparire per tutti in modo corretto.\",\"tw.fonts.title\":\"Caratteri\",\"tw.footer.credits\":\"Crediti\",\"tw.footer.disclaimer\":\"TurboWarp non è affiliato a Scratch, allo Scratch Team o alla Scratch Foundation.\",\"tw.footer.documentation\":\"Documentazione\",\"tw.footer.donate\":\"Dona\",\"tw.footer.embed\":\"Inclusione\",\"tw.footer.parameters\":\"Parametri URL\",\"tw.geolocate.permission\":\"Se consentito, il tuo browser potrebbe chiederti di consentire l'accesso alla localizzazione.\",\"tw.geolocate.title\":\"Il progetto vuole conoscere la tua posizione.\",\"tw.gui.crashMessage.description\":\"Ci dispiace, sembra che la pagina abbia avuto un arresto anomalo. Aggiorna la pagina per riprovare.\",\"tw.gui.defaultProjectTitle\":\"Progetto\",\"tw.guiDefaultTitle\":\"Esegue i progetti Scratch più velocemente\",\"tw.home.credit\":\"Note e Crediti\",\"tw.home.description\":\"TurboWarp è una Modifica di Scratch che compila i progetti in JavaScript per renderli molto più veloci. Provalo, inserisci qui sopra un ID di un progetto o una URL o scegli uno dei progetti in primo piano che trovi qui sotto.\",\"tw.home.instructions\":\"Istruzioni\",\"tw.input.tooltip\":\"Copia e incolla il link di un progetto Scratch qui!\",\"tw.interpolationEnabled\":\"Interpolazione\",\"tw.invalidParameters.clones\":\"Il parametro URL \\\"clone\\\" non è valido\",\"tw.invalidParameters.fps\":\"Il parametro URL \\\"fps\\\" non è valido\",\"tw.loadError\":\"Errore nel caricamento del progetto: {error}\",\"tw.loadExtension.embedded\":\"Il progetto vuole caricare una estensione personalizzata con il seguente codice:\",\"tw.loadExtension.sandboxed\":\"Anche se il codice è eseguito in una sandbox, l'estensione avrà comunque accesso a informazioni sul tuo dispositivo come ad esempio il tuo indirizzo IP e la tua localizzazione. Assicurati di fidarti dell'autore dell'estensione prima di continuare.\",\"tw.loadExtension.unsandboxed\":\"Esegui l'estensione senza sandbox\",\"tw.loadExtension.unsandboxedWarning\":\"Le estensioni eseguite senza sandbox possono corrompere il tuo progetto, cancellare le tue impostazioni, rubare le tue password e fare altre cose malevole. Gli sviluppatori di {APP_NAME} non si ritengono responsabili per qualunque problema dovesse verificarsi.\",\"tw.loadExtension.url\":\"Il progetto vuole caricare una estensione personalizzata dall'URL:\",\"tw.loader.assets.known\":\"Scaricamento risorse in corso ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Scaricamento risorse in corso ...\",\"tw.loader.data\":\"Scaricamento dati del progetto in corso...\",\"tw.loader.generic\":\"Caricamento del progetto in corso …\",\"tw.menuBar.60off\":\"Disabilita modalità 60 FPS\",\"tw.menuBar.60on\":\"Abilita modalità 60 FPS\",\"tw.menuBar.addons\":\"Addon\",\"tw.menuBar.advanced\":\"Impostazioni Avanzate\",\"tw.menuBar.changeUsername\":\"Cambia Username\",\"tw.menuBar.cloudOff\":\"Disabilita Variabili Cloud\",\"tw.menuBar.cloudOn\":\"Abilita Variabili Cloud\",\"tw.menuBar.cloudUnavailable\":\"Le Variabili Cloud non sono Disponibili\",\"tw.menuBar.cloudUnavailableAlert\":\"Impossibile usare le variabili cloud, probabilmente perché è stato aperto l'editor.\",\"tw.menuBar.cloudUnavailableDesktop\":\"Non è possibile usare le variabili cloud nell'app desktop.\",\"tw.menuBar.moreSettings\":\"Impostazioni Avanzate\",\"tw.menuBar.newFramerate\":\"Nuovo framerate:\",\"tw.menuBar.newWindow\":\"Nuova finestra\",\"tw.menuBar.package\":\"Crea pacchetto\",\"tw.menuBar.reportError1\":\"Non è stato possibile compilare tutti gli script.\",\"tw.menuBar.reportError2\":\"Si è verificato un problema. Ti invitiamo a segnalarlo.\",\"tw.menuBar.restorePoints\":\"Punti di ripristino\",\"tw.menuBar.saveAs\":\"Salva come {file}\",\"tw.menuBar.seeInside\":\"Guarda dentro\",\"tw.notify.permission\":\"Se viene consentito, il tuo browser potrebbe chiederti se vuoi consentire le notifiche e le future notifiche saranno consentite automaticamente.\",\"tw.notify.title\":\"Il progetto vuole mostrare delle notifiche.\",\"tw.oldDownload\":\"Salve in un file separato...\",\"tw.opcode.2000\":\"giorni dal 2000\",\"tw.opcode.mousedown\":\"pulsante del mouse premuto\",\"tw.opcode.mousex\":\"x del mouse\",\"tw.opcode.mousey\":\"y del mouse\",\"tw.openAdvanced\":\"Apri impostazioni avanzate\",\"tw.openWindow.dangerous\":\"Questo sito web non è stato recensito dagli sviluppatori di {APP_NAME}. Può contenere codice pericoloso o dannoso.\",\"tw.openWindow.title\":\"Il progetto richiede di aprire in una nuova finestra o scheda l'URL:\",\"tw.paint.alpha\":\"Opacità\",\"tw.paint.fonts.more\":\"Aggiungi caratteri...\",\"tw.privacy\":\"Politica della Privacy\",\"tw.recordAudio.permission\":\"Se viene consentito, il tuo browser potrebbe chiederti se vuoi consentire l'accesso al micrfono e i futuri accessi al microfono saranno consentiti automaticamente.\",\"tw.recordAudio.title\":\"Il progetto vuole registrare l'audio del microfono. L'audio includerà una trascrizione testuale o dati audio grezzi. Il progetto potrebbe condividere l'audio con altri utenti o altri server.\",\"tw.recordVideo.permission\":\"Se viene consentito, il tuo browser potrebbe chiederti se vuoi consentire l'accesso alla webcam e i futuri accessi alla webcam saranno consentiti automaticamente.\",\"tw.recordVideo.title\":\"Il progetto vuole registrare il video della tua webcam. Il progetto potrebbe condividere immagini con altri utenti o altri server.\",\"tw.redirect.dangerous\":\"Questo sito web non è stato recensito dagli sviluppatori di {APP_NAME}. Può contenere codice pericoloso o dannoso.\",\"tw.redirect.title\":\"Il progetto richiede di aprire in questa scheda l'URL:\",\"tw.restorePoints.1minute\":\"ogni minuto\",\"tw.restorePoints.assets\":\"{n} risorse\",\"tw.restorePoints.confirmDelete\":\"Sei sicuro di voler cancellare \\\"{projectTitle}\\\"? Questa operazione non potrà essere annullata.\",\"tw.restorePoints.confirmDeleteAll\":\"Sei sicuro di voler cancellare TUTTI i punti di ripristino? Questa operazione non potrà annullata.\",\"tw.restorePoints.confirmLoad\":\"Ci sono modifiche non salvate. Rimpiazzare il progetto corrente?\",\"tw.restorePoints.deleteAll\":\"Rimuovi Tutto\",\"tw.restorePoints.description\":\"{APP_NAME} salva periodicamente dei punti di ripristino sul computer per aiutarti a recuperare il progetto se dimentichi di salvare. Questo sistema fornisce un ultima risorsa per poter recuperare il tuo progetto. il tuo computer potrebbe rimuovere senza preavviso questi punti di interruzione. NON fare affidamento su questa possibilità.\",\"tw.restorePoints.empty\":\"Nessun punto di ripristino trovato.\",\"tw.restorePoints.error\":\"Errore nel caricamento del punto di ripristino: {error}\",\"tw.restorePoints.intervalOption\":\"I punti di ripristino vengono creati {time}.\",\"tw.restorePoints.loading\":\"Caricamento...\",\"tw.restorePoints.minutes\":\"ogni {n} minuti\",\"tw.restorePoints.never\":\"mai\",\"tw.restorePoints.off\":\"Disabilitare i punti di ripristino è rischioso.\",\"tw.restorePoints.size\":\"Spazio di archiviazione usato: {size}\",\"tw.restorePoints.size2\":\"Costumi e suoni usati da più punti di ripristino vengono archiviati una sola volta.\",\"tw.restorePoints.title\":\"Ripristina Punti di Ripristino\",\"tw.sample\":\"Progetto di esempio\",\"tw.saveAs\":\"Salva come...\",\"tw.saveTo\":\"Salva come {file}\",\"tw.scratchUnsafeCloud\":\"Se crei questa variabile cloud, il progetto supererà il limite massimo di {number} variabili previsto da Scratch e alcune variabili non funzioneranno se caricerai il progetto sul sito di Scratch.\",\"tw.securityManager.allow\":\"Consenti\",\"tw.securityManager.deny\":\"Nega\",\"tw.securityManager.title\":\"Sicurezza Estensione\",\"tw.securityManager.trust\":\"Se si dà il permesso, richieste future allo stesso sito web verranno permesse automaticamente.\",\"tw.securityManager.why\":\"Potrebbe venire utilizzato per scraicare immagini e suoni, implementare funzionalità multiplayer, accedere ad una API, oppure per scopi dannosi. Condividerà con il sito il tuo indirizzo IP, la tua area geografica e potenzialmente anche altri dati.\",\"tw.settingsModal.customStageSize\":\"Dimensioni Stage Personalizzate:\",\"tw.settingsModal.customStageSizeHelp\":\"Cambia la dimensione dello stage di Scratch da 480x360 a un altro valore. Prova 640x360 per rendere lo stage widescreen. Pochi progetti potranno gestire questa proprietà.\",\"tw.settingsModal.dangerZone\":\"Zona Pericolosa\",\"tw.settingsModal.disableCompiler\":\"Disabilita Compilatore\",\"tw.settingsModal.disableCompilerHelp\":\"Disabilita il compilatore di TurboWarp. E' un'opzione utile soltanto quando si modificano i progetti, in modo che gli script si aggiornino immediatamente. Si sconsiglia di usare questa opzione in altri casi.\",\"tw.settingsModal.featured\":\"In Evidenza\",\"tw.settingsModal.fps\":\"60 FPS (FPS personalizzato)\",\"tw.settingsModal.fpsHelp\":\"Esegue gli script 60 volte al secondo invece di 30. Alcuni progetti potrebbero non funzionare correttamente con questa impostazione abilitata. In questo caso puoi provare ad abilitare l'interpolazione senza abilitare la modalità 60 FPS. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Clicca qui per usare un framerate diverso da 30 o 60\",\"tw.settingsModal.help\":\"Clicca per aiuto\",\"tw.settingsModal.highQualityPen\":\"Penna Alta Qualità\",\"tw.settingsModal.highQualityPenHelp\":\"Permette ai progetti di essere visualizzati ad una risoluzione maggiore e disabilita l'arrotondamento delle coordinate fatto dall'editor. Non tutti i progetti si giovano di questa impostazione che può avere impatto sulla performance del progetto.\",\"tw.settingsModal.infiniteClones\":\"Cloni Infiniti\",\"tw.settingsModal.infiniteClonesHelp\":\"Disabilita il limite di Scratch di 300 cloni.\",\"tw.settingsModal.interpolation\":\"Interpolazione\",\"tw.settingsModal.interpolationHelp\":\"Fa apparire i progetti più fluidi interpolando il movimento degli sprite. L'interpolazione non dovrebbe essere usata nei progetti 3D, nei raytracer, nei progetti basati sull'uso della penna e nei progetti che laggano in quanto l'interpolazione li farebbe eseguire più lentamente senza farli apparire più fluidi.\",\"tw.settingsModal.largeStageWarning\":\"L'uso di uno stage personalizzato così grande non è raccomandato! Ti suggeriamo di usare una dimensione inferiore con le stesse proporzioni e usare poi il fullscreen per portarlo alle dimensioni dello schermo dell'utente.\",\"tw.settingsModal.removeFencing\":\"Rimozione Recinto\",\"tw.settingsModal.removeFencingHelp\":\"Permette agli sprite di muoversi completamente fuori dallo Stage e di diventare grandi o piccoli quando si desidera e permette ai blocchi sensori che verificano il contatto di funzionare anche quando gli sprite sono completamente fuori dallo Stage.\",\"tw.settingsModal.removeLimits\":\"Rimozione Limiti\",\"tw.settingsModal.removeMiscLimits\":\"Rimozione Limiti Vari\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Rimuove i limiti agli effetti sonori e alla dimensione della penna.\",\"tw.settingsModal.storeProjectOptions\":\"Memorizza le impostazioni nel progetto\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Memorizza nel progetto le impostazioni selezionate in modo che siano applicate automaticamente quando il progetto viene caricato in TurboWarp. Il warp timer e la disabilitazione del compilatore non verranno memorizzati.\",\"tw.settingsModal.title\":\"Impostazioni Avanzate\",\"tw.settingsModal.warpTimerHelp\":\"Permette ai progetti di verificare se sono bloccati in un loop molto lungo o infinito e di essere quindi eseguiti ad un framerate più basso invece di apparire bloccati fino a che il loop non termina. Questa opzione risolve molte cause di blocco ma ha un impatto significativo sulla performance, quindi è abilitata come impostazione predeterminata solo all'interno dell'editor.\",\"tw.spriteSelectorItem.rename\":\"rinomina\",\"tw.stereoAlert\":\"Modificando questo suono stereo verrà convertito in modo in maniera irreversibile. \",\"tw.studioview.authorAttribution\":\"di {author}\",\"tw.studioview.error\":\"Si è verificato un errore nel caricamento della pagina di progetti successiva.\",\"tw.studioview.hoverText\":\"{title} di {author}\",\"tw.tooLarge\":\"Questo suono potrebbe essere troppo pesante per essere caricato su Scratch.\",\"tw.twExtension.description\":\"Nuovi blocchi strani.\",\"tw.twExtension.name\":\"Blocchi TurboWarp\",\"tw.unfavorite\":\"Non preferito\",\"tw.unshared.2\":\"Per ulteriori informazioni vai a {link}\",\"tw.unshared.bug\":\"Se sei certo che questo progetto è condiviso, segnala il problema.\",\"tw.unshared.cache\":\"Se il progetto è stato condiviso di recente questo messaggio può apparire erroneamente per alcuni minuti.\",\"tw.unshared2.1\":\"I progetti non condivisi non sono più visibili.\",\"tw.usernameModal.help\":\"Questo valore verrà archiviato nello spazio di archiviazione del tuo browser. Potrebbe essere loggato quando interagisci con progetti che usano le variabili cloud.\",\"tw.usernameModal.help2\":\"Valori che non corrispondono ad un account Scratch valido saranno di solito rifiutati dal server delle variabili cloud. Raccomandiamo di lasciarli così come sono o cambiandolo nel tuo username Scratch.\",\"tw.usernameModal.mustChange\":\"Il server delle variabili cloud pensa che il tuo username possa non essere sicuro. Ti preghiamo di cambiarlo con qualcos'altro o di {resetIt}\",\"tw.usernameModal.mustChange.resetIt\":\"resettarlo (raccomandato)\",\"tw.usernameModal.new\":\"Nuovo username:\",\"tw.usernameModal.reset\":\"Resetta\",\"tw.usernameModal.title\":\"Cambia Username\",\"tw.viewFeaturedProjects\":\"Clicca per vedere i progetti in primo piano.\",\"tw.viewOnScratch\":\"Mostra il progetto nel sito di Scratch\",\"tw.webglModal.description\":\"Sembra che il tuo browser o il tuo computer non siano compatibili con {webGlLink}. Questa tecnologia è necessaria per poter usare questo sito. Prova ad aggiornare il tuo browser e i tuoi driver video o a riavviare il tuo computer.\"},\"ja\":{\"tw.alerts.creatingRestorePoint\":\"復元しています…\",\"tw.alerts.lostPeripheralConnection\":\"{extensionName}との接続が切れました。\",\"tw.alerts.savedToDisk\":\"コンピューターに保存する\",\"tw.backpack.rename\":\"新しい名前:\",\"tw.blocks.PROCEDURES_DOCS\":\"~を返すの使い方\",\"tw.blocks.PROCEDURES_RETURN\":\"{v}を返す\",\"tw.blocks.addons\":\"アドオン\",\"tw.blocks.buttonIsDown\":\"マウスの[MOUSE_BUTTON]が押された\",\"tw.blocks.lastKeyPressed\":\"最後に押されたキー\",\"tw.blocks.mouseButton.middle\":\"(1) ホイール\",\"tw.blocks.mouseButton.primary\":\"(0) 左ボタン\",\"tw.blocks.mouseButton.secondary\":\"(2) 右ボタン\",\"tw.blocks.openDocs\":\"ドキュメントを開く\",\"tw.browserModal.desc\":\"Google Chrome、Mozilla Firefox、Microsoft Edge、Apple Safari が最新バージョンであることを確認してください。\",\"tw.cantUseCloud\":\"クラウド変数を作成することはできますが、このプロジェクトをScratchにアップロードするか、{packager}などのツールを使用しないと、動作しません。\",\"tw.changeUsername.cannotChangeWhileRunning\":\"ユーザー名をプロジェクトの実行中に変えることはできません。\",\"tw.clipboard.permission\":\"クリップボードへのアクセスは、ブラウザによって動作しない場合があります。許可されているなら、クリップボードの読み込みは自動で許可されます。\",\"tw.clipboard.title\":\"プロジェクトがクリップボードからデータを読み込もうとしています。\",\"tw.code\":\"ソースコード\",\"tw.confirmIncompatibleExtension\":\"この拡張機能はScratchとの互換性がありません。これを使って作ったプロジェクトは、Scratchのウェブサイトにアップロードできません。本当に使いますか?\",\"tw.customExtension.description\":\"URL、ファイル、JavaScriptのソースコードからカスタム拡張機能を読み込みます。\",\"tw.customExtension.name\":\"カスタム拡張機能\",\"tw.customExtensionModal.file\":\"ファイル\",\"tw.customExtensionModal.load\":\"読み込む\",\"tw.customExtensionModal.promptFile\":\"拡張機能のJavaScriptファイルを選択する: \",\"tw.customExtensionModal.promptText\":\"拡張機能のJavaScriptのソースコードをペーストする:\",\"tw.customExtensionModal.promptURL\":\"拡張機能のURLを入力: \",\"tw.customExtensionModal.text\":\"テキスト\",\"tw.customExtensionModal.title\":\"カスタム拡張機能を読み込む\",\"tw.customExtensionModal.trusted\":\"この拡張機能は信頼できるソースからのものであるため、サンドボックスなしで読み込みます。\",\"tw.customExtensionModal.unsandboxed\":\"サンドボックスなしで拡張機能を実行する\",\"tw.customExtensionModal.unsandboxedWarning1\":\"サンドボックスなしで拡張機能を読み込むのは危険です。よく分からない場合は無効にしてください。\",\"tw.customExtensionModal.unsandboxedWarning2\":\"サンドボックス化していない拡張機能は、プロジェクトを破損させたり、設定を削除したり、パスワードをフィッシングしたり、その他の悪いことをする可能性があります。{APP_NAME}の開発者は、この拡張機能によって生じるいかなる問題にも責任を負いません。\",\"tw.customExtensionModal.untrusted\":\"信頼できないURLからの拡張機能は、セキュリティのため常にサンドボックスで読み込みます。\",\"tw.documentation\":\"ドキュメント\",\"tw.extensionGallery.name\":\"TurboWarpの拡張機能集\",\"tw.featuredProjectsStudio\":\"Scratchのスタジオで見る\",\"tw.feedback\":\"フィードバックとバグ\",\"tw.feedbackButton\":\"TurboWarpへのフィードバック\",\"tw.fileInput.none\":\"選択されたファイルはありません。\",\"tw.fileInput.selected\":\"選択中: {name}\",\"tw.fonts.add\":\"追加する\",\"tw.fonts.custom.name\":\"フォントの名前をつける:\",\"tw.fonts.readError\":\"フォントのファイルを読み込めませんでした: {error}\",\"tw.fonts.title\":\"フォント\",\"tw.footer.credits\":\"クレジット\",\"tw.footer.disclaimer\":\"TurboWarpはScratch、Scratch Team、Scratch財団と提携していません。\",\"tw.footer.documentation\":\"ドキュメント\",\"tw.footer.donate\":\"寄付する\",\"tw.footer.embed\":\"埋め込みコード\",\"tw.footer.parameters\":\"URLパラメーター\",\"tw.gui.crashMessage.description\":\"申し訳ありませんが、ページがクラッシュしたようです。ページを再読み込みしてもう一度やり直してみてください。\",\"tw.gui.defaultProjectTitle\":\"プロジェクト\",\"tw.guiDefaultTitle\":\"Scratchのプロジェクトを速く動かす\",\"tw.home.credit\":\"メモとクレジット\",\"tw.home.description\":\"TurboWarpは、プロジェクトをJavaScriptにコンパイルして、高速に実行させることのできるScratchのMODです。上記のプロジェクトIDまたはURLを入力するか、以下の注目のプロジェクトの中から選択して試してみてください。\",\"tw.home.instructions\":\"使い方\",\"tw.input.tooltip\":\"ScratchのプロジェクトのURLをコピー&ペーストして見ることができます\",\"tw.interpolationEnabled\":\"補完機能\",\"tw.invalidParameters.clones\":\"「クローン」のURLパラメーターが無効です\",\"tw.invalidParameters.fps\":\"「FPS」のURLパラメーターが無効です\",\"tw.loadError\":\"プロジェクトを読み込めませんでした: {error}\",\"tw.loadExtension.unsandboxed\":\"サンドボックスなしで拡張機能を実行する\",\"tw.loadExtension.unsandboxedWarning\":\"サンドボックスなしで拡張機能を読み込むことは危険です。プロジェクトを破壊したり、設定を削除したり、パスワードを盗まれたり、その他の悪いことができるようになります。{APP_NAME}の開発者は、これによって生じるいかなる問題にも責任を負いません。\",\"tw.loader.assets.known\":\"プロジェクトをダウンロード中 ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"ダウンロード中…\",\"tw.loader.data\":\"プロジェクトのデータをダウンロード中…\",\"tw.loader.generic\":\"プロジェクトを読み込み中…\",\"tw.menuBar.60off\":\"60FPSモードを解除する\",\"tw.menuBar.60on\":\"60FPSモードにする\",\"tw.menuBar.addons\":\"アドオン\",\"tw.menuBar.advanced\":\"高度な設定\",\"tw.menuBar.changeUsername\":\"ユーザー名を変える\",\"tw.menuBar.cloudOff\":\"クラウド変数を無効にする\",\"tw.menuBar.cloudOn\":\"クラウド変数を有効にする\",\"tw.menuBar.cloudUnavailable\":\"クラウド変数は使用できません\",\"tw.menuBar.cloudUnavailableAlert\":\"中を見たのでクラウド変数を使用できません。\",\"tw.menuBar.moreSettings\":\"高度な設定\",\"tw.menuBar.newFramerate\":\"新しいフレームレート:\",\"tw.menuBar.package\":\"プロジェクトをパッケージ化する\",\"tw.menuBar.reportError1\":\"コンパイルされていないスクリプトがあります。\",\"tw.menuBar.reportError2\":\"これは不具合です。報告してください。\",\"tw.menuBar.restorePoints\":\"復元ポイント\",\"tw.menuBar.saveAs\":\"{file}として保存する\",\"tw.menuBar.seeInside\":\"中を見る\",\"tw.mono\":\"モノラル録音\",\"tw.oldDownload\":\"別ファイルで保存する...\",\"tw.opcode.2000\":\"2000年からの日数\",\"tw.opcode.mousedown\":\"マウスが押された\",\"tw.opcode.mousex\":\"マウス x\",\"tw.opcode.mousey\":\"マウス y\",\"tw.openAdvanced\":\"高度な設定を開く\",\"tw.openWindow.dangerous\":\"このウェブサイトは{APP_NAME}開発者による審査を受けていません。危険または悪意のあるコードが含まれている可能性があります。\",\"tw.paint.alpha\":\"透明度\",\"tw.paint.fonts.more\":\"フォントを追加する…\",\"tw.privacy\":\"プライバシーポリシー\",\"tw.redirect.dangerous\":\"このウェブサイトは{APP_NAME}開発者による審査を受けていません。危険または悪意のあるコードが含まれている可能性があります。\",\"tw.restorePoints.1minute\":\"1分ごと\",\"tw.restorePoints.assets\":\"{n}個のアセット\",\"tw.restorePoints.deleteAll\":\"全て消去する\",\"tw.restorePoints.empty\":\"復元ポイントはありません。\",\"tw.restorePoints.intervalOption\":\"{time}に復元ポイントを作る\",\"tw.restorePoints.loading\":\"読み込み中…\",\"tw.restorePoints.minutes\":\"{n}分ごと\",\"tw.restorePoints.off\":\"復元ポイントを無効にするのは危険です。\",\"tw.restorePoints.title\":\"復元ポイント\",\"tw.saveAs\":\"…として保存する\",\"tw.saveTo\":\"{file}に保存する\",\"tw.scratchUnsafeCloud\":\"このクラウド変数を作ると、{number}変数のScratchの上限を超えます。Scratchにこのプロジェクトをアップロードしたとき、一部の変数が機能しなくなります。\",\"tw.securityManager.allow\":\"許可\",\"tw.securityManager.deny\":\"拒否\",\"tw.settingsModal.customStageSize\":\"ステージの大きさを変える:\",\"tw.settingsModal.customStageSizeHelp\":\"ステージのサイズを480x360から他のサイズに変更します。ステージをワイドスクリーンにするには、640x360をお試しください。これを適切に処理できるプロジェクトはほとんどありません。\",\"tw.settingsModal.dangerZone\":\"危険区域\",\"tw.settingsModal.disableCompiler\":\"コンパイラを無効にする\",\"tw.settingsModal.disableCompilerHelp\":\"TurboWarpコンパイラを無効にします。プロジェクトの編集中にこれを有効にすると、スクリプトがすぐに更新されるようになります。必要ない場合は無効にしてください。\",\"tw.settingsModal.featured\":\"おすすめ\",\"tw.settingsModal.fps\":\"60 FPS (カスタム FPS)\",\"tw.settingsModal.fpsHelp\":\"スクリプトの実行回数を30回/秒から60回/秒に変更します。この機能を有効にすると、ほとんどのプロジェクトが正常に動作しなくなります。そのような場合には、60FPSモードを無効にして補間機能を試してみてください。{customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"30または60以外のFPSを設定する\",\"tw.settingsModal.help\":\"クリックしてヘルプ\",\"tw.settingsModal.highQualityPen\":\"ペンできれいに描画する\",\"tw.settingsModal.highQualityPenHelp\":\"ペンのプロジェクトをより高い解像度でレンダリングする代わりに、エディタでのの座標丸めを一部無効にします。全てのプロジェクトでこの設定が有効とはいえず、パフォーマンスに影響を与えることがあります。\",\"tw.settingsModal.infiniteClones\":\"クローンの制限を解除\",\"tw.settingsModal.infiniteClonesHelp\":\"Scratchの、クローンが300個までしか作れない制限を解除します。\",\"tw.settingsModal.interpolation\":\"補完機能\",\"tw.settingsModal.interpolationHelp\":\"スプライトの動きを補間することで、プロジェクトをより滑らかに見せます。この機能は、3Dのプロジェクト、レイトレーサー、ペンを使ったプロジェクトや、重いプロジェクトには使用しないでください。スムーズではなくなり、動作が遅くなります。\",\"tw.settingsModal.largeStageWarning\":\"ステージのサイズを大きくすることはおすすめできません。その代わり、同じアスペクト比の小さなサイズを使用し、フルスクリーンにすることでお使いのディスプレイの大きさに合わせてください。\",\"tw.settingsModal.removeFencing\":\"動く範囲と大きさの制限を解除する\",\"tw.settingsModal.removeFencingHelp\":\"スプライトを画面の外へ移動させたり、好きなだけ大きさを変えたり、触れたブロックを画面外で作動させたりすることができます。\",\"tw.settingsModal.removeLimits\":\"制限を解除する\",\"tw.settingsModal.removeMiscLimits\":\"その他の制限を解除\",\"tw.settingsModal.removeMiscLimitsHelp\":\"効果音の制限とペンの大きさの制限を解除する\",\"tw.settingsModal.storeProjectOptions\":\"高度な設定を保存する\",\"tw.settingsModal.storeProjectOptionsHelp\":\"選択した設定をプロジェクトに保存し、TurboWarpがこのプロジェクトを読み込んだときに自動的に適用されるようにします。Warpタイマーとコンパイラの無効は保存されません。\",\"tw.settingsModal.title\":\"高度な設定\",\"tw.settingsModal.warpTimer\":\"Warpタイマー\",\"tw.settingsModal.warpTimerHelp\":\"スクリプトが長いループや無限ループに陥っているかどうかをチェックし、ループが終了するまで動けないのを避け、低いフレームレートで実行するようにします。これにより、ほとんどのクラッシュが修正されます。しかし、パフォーマンスへの影響が大きいため、デフォルトではエディタでのみ有効になっています。\",\"tw.spriteSelectorItem.rename\":\"名前を変える\",\"tw.stereo\":\"ステレオ録音\",\"tw.stereoAlert\":\"このステレオサウンドを編集すると、不可逆的にモノラルに変換されます。\",\"tw.studioview.error\":\"プロジェクトを次のページで読み込む際にエラーが発生しました。\",\"tw.tooLarge\":\"この音は大きすぎてスクラッチにアップロードできないかもしれません。\",\"tw.twExtension.description\":\"不思議な新しいブロック\",\"tw.twExtension.name\":\"TurboWarpのブロック\",\"tw.unshared.2\":\"詳しくはこちらをご覧ください: {link}\",\"tw.unshared.bug\":\"このプロジェクトが共有済みにも関わらず読み込めない場合は不具合報告をお願いします。\",\"tw.unshared.cache\":\"プロジェクトが最近共有された場合、このメッセージは数分間誤って表示される可能性があります。\",\"tw.unshared2.1\":\"非共有のプロジェクトは表示されません。\",\"tw.usernameModal.help\":\"この名前は、ブラウザのストレージに保存されます。クラウド変数を含むプロジェクトを見る際に記録されることがあります。\",\"tw.usernameModal.help2\":\"有効なScratchのアカウント名に対応していないと、通常はクラウド変数サーバに拒否されます。そのままにしておくか、Scratchのユーザー名に変えることをおすすめします。\",\"tw.usernameModal.mustChange\":\"申し訳ありません、あなたのユーザー名が安全でない可能性があります。他のユーザー名に変更するか、{resetIt}をしてください。\",\"tw.usernameModal.mustChange.resetIt\":\"リセット(おすすめ)\",\"tw.usernameModal.reset\":\"リセット\",\"tw.usernameModal.title\":\"ユーザー名を変える\",\"tw.viewFeaturedProjects\":\"クリックしてプロジェクトの特集を見る。\",\"tw.viewOnScratch\":\"Scratchでプロジェクトを見る\",\"tw.webglModal.description\":\"残念ながら、お使いのブラウザやコンピュータは{webGlLink}のようです。このサイトを実行するには、操作が必要です。お使いのブラウザやグラフィックドライバをアップデートするか、コンピュータを再起動してみてください。\"},\"ja-hira\":{\"tw.alerts.creatingRestorePoint\":\"ふくげんしています…\",\"tw.alerts.savedToDisk\":\"コンピューターに保存(ほぞん)する\",\"tw.backpack.rename\":\"あたらしいなまえ : \",\"tw.blocks.addons\":\"アドオン\",\"tw.blocks.buttonIsDown\":\"マウスの[MOUSE_BUTTON]がおされた\",\"tw.blocks.lastKeyPressed\":\"さいごにおされたキー\",\"tw.blocks.mouseButton.middle\":\"(1)ホイール\",\"tw.blocks.mouseButton.primary\":\"(0)ひだりボタン\",\"tw.blocks.mouseButton.secondary\":\"(2)みぎボタン\",\"tw.blocks.openDocs\":\"ドキュメントをひらく\",\"tw.browserModal.desc\":\"Google Chrome、Mozilla Firefox、Microsoft Edge、Apple Safari が最新(さいしん)バージョンであることを確認(かくにん)してください。\",\"tw.changeUsername.cannotChangeWhileRunning\":\"ユーザーめいはプロジェクトを実行中(じっこうちゅう)にかえることはできません。\",\"tw.code\":\"ソースコード\",\"tw.customExtension.name\":\"カスタムかくちょうきのう\",\"tw.customExtensionModal.file\":\"ファイル\",\"tw.featuredProjectsStudio\":\"Scratchのスタジオでみる。\",\"tw.feedback\":\"フィードバックとバグ\",\"tw.feedbackButton\":\"TurboWarpへのフィードバック\",\"tw.footer.credits\":\"クレジット\",\"tw.footer.disclaimer\":\"TurboWarpはScratch、Scratch Team、Scratch財団(ざいだん)と提携(ていけい)していません。\",\"tw.footer.donate\":\"きふをする\",\"tw.footer.embed\":\"うめこみコード\",\"tw.footer.parameters\":\"URLパラメーター\",\"tw.gui.crashMessage.description\":\"もうしわけありませんが、ページがクラッシュしたようです。ページをもういちどよみこんでください。\",\"tw.gui.defaultProjectTitle\":\"プロジェクト\",\"tw.guiDefaultTitle\":\"Scratchのプロジェクトをはやくうごかす\",\"tw.home.credit\":\"メモとクレジット\",\"tw.home.description\":\"TurboWarpはScratchのMODで、はやくうごかすためにプロジェクトをJavaScriptにコンパイルしたものです。プロジェクトのIDやURLを入力(にゅうりょく)するか、したのプロジェクトの特集(とくしゅう)からえらんでみてください。\",\"tw.home.instructions\":\"つかいかた\",\"tw.input.tooltip\":\"ScratchのプロジェクトのURLをコピー&ペーストしてみることができます\",\"tw.interpolationEnabled\":\"ほかんきのう\",\"tw.invalidParameters.clones\":\"「クローン」のURLパラメーターが無効(むこう)です\",\"tw.invalidParameters.fps\":\"「FPS」のURLパラメーターが無効(むこう)です\",\"tw.loader.assets.known\":\"{total}つのうち{complete}つダウンロードをかんりょう…\",\"tw.loader.assets.unknown\":\"ダウンロードちゅう…\",\"tw.loader.data\":\"プロジェクトのデータをダウンロードちゅう…\",\"tw.loader.generic\":\"プロジェクトをよみこみちゅう…\",\"tw.menuBar.60off\":\"60FPSモードをかいじょする\",\"tw.menuBar.60on\":\"60FPSモードにする\",\"tw.menuBar.addons\":\"アドオン\",\"tw.menuBar.advanced\":\"こうどなせってい\",\"tw.menuBar.changeUsername\":\"ユーザーめいをかえる\",\"tw.menuBar.cloudOff\":\"クラウドへんすうをむこうにする\",\"tw.menuBar.cloudOn\":\"クラウドへんすうをゆうこうにする\",\"tw.menuBar.cloudUnavailable\":\"クラウドへんすうはつかえません\",\"tw.menuBar.moreSettings\":\"こうどなせってい\",\"tw.menuBar.newFramerate\":\"あたらしいフレームレート:\",\"tw.menuBar.package\":\"プロジェクトをパッケージにする\",\"tw.menuBar.reportError1\":\"コンパイルされていないスクリプトがあります。\",\"tw.menuBar.reportError2\":\"これはバグです。ほうこくしてください。\",\"tw.menuBar.saveAs\":\"{file}としてほぞんする\",\"tw.menuBar.seeInside\":\"なかをみる\",\"tw.mono\":\"モノラル\",\"tw.oldDownload\":\"べつのファイルでほぞんする...\",\"tw.opcode.mousex\":\"マウス x\",\"tw.opcode.mousey\":\"マウス y\",\"tw.paint.alpha\":\"とうめいど\",\"tw.privacy\":\"プライバシーポリシー\",\"tw.saveAs\":\"…としてほぞんする\",\"tw.saveTo\":\"{file}にほぞんする\",\"tw.settingsModal.customStageSize\":\"ステージのおおきさをかえる:\",\"tw.settingsModal.dangerZone\":\"危険区域(きけんくいき)\",\"tw.settingsModal.disableCompiler\":\"コンパイラをつかわない\",\"tw.settingsModal.disableCompilerHelp\":\"TurboWarpコンパイラを無効(むこう)にします。プロジェクトの編集中(へんしゅうちゅう)にこれを有効(ゆうこう)にすると、スクリプトがすぐに更新(こうしん)されるようになります。必要(ひつよう)ない場合(ばあい)は無効(むこう)にしてください。\",\"tw.settingsModal.featured\":\"おすすめ\",\"tw.settingsModal.fps\":\"60 FPS (カスタム FPS)\",\"tw.settingsModal.fpsHelp\":\"通常(つうじょう)FPSが30のところ、60でスクリプトをうごかします。この機能(きのう)を有効(ゆうこう)にすると、ほとんどのプロジェクトがただしく動作(どうさ)しません。そのような場合(ばあい)は、この機能(きのう)を無効(むこう)にして「ほかんきのう」をためしてください。{customFramerate}\",\"tw.settingsModal.fpsHelp.customFramerate\":\"クリックして30または60いがいのFPSにせっていする\",\"tw.settingsModal.help\":\"クリックしてヘルプ\",\"tw.settingsModal.highQualityPen\":\"ペンできれいにびょうがする\",\"tw.settingsModal.highQualityPenHelp\":\"ペンのプロジェクトをよりたかい解像度(かいぞうど)でレンダリングするかわりに、エディタでのの座標(ざひょう)まるめを一部無効(いちぶむこう)にします。すべてのプロジェクトでこの設定(せってい)が有効(ゆうこう)とはいえず、パフォーマンスに影響(えいきょう)をあたえることがあります。\",\"tw.settingsModal.infiniteClones\":\"クローンの制限(せいげん)を解除(かいじょ)\",\"tw.settingsModal.infiniteClonesHelp\":\"Scratchの、クローンが300こまでしかつくれない制限(せいげん)を解除(かいじょ)します。\",\"tw.settingsModal.interpolation\":\"ほかんきのう\",\"tw.settingsModal.interpolationHelp\":\"スプライトのうごきを補間(ほかん)することで、プロジェクトをよりなめらかにします。このきのうは、3Dのプロジェクト、レイトレーサー、ペンをつかったプロジェクトや、おもいプロジェクトにはつかわないでください。うごきがおそくなります。\",\"tw.settingsModal.removeFencing\":\"うごく範囲(はんい)とおおきさの制限(せいげん)を解除(かいじょ)する\",\"tw.settingsModal.removeFencingHelp\":\"スプライトを画面(がめん)の外(そと)へ移動(いどう)させたり、すきなだけおおきさをかえたり、ふれたブロックを画面外(がめんがい)でうごかしたりすることができます。\",\"tw.settingsModal.removeLimits\":\"せいげんをなくす\",\"tw.settingsModal.removeMiscLimits\":\"そのほかのせいげんをなくす\",\"tw.settingsModal.removeMiscLimitsHelp\":\"効果音(こうかおん)の制限(せいげん)とペンのおおきさの制限(せいげん)を解除(かいじょ)する\",\"tw.settingsModal.storeProjectOptions\":\"こうどなせっていをほぞんする\",\"tw.settingsModal.title\":\"こうどなせってい\",\"tw.settingsModal.warpTimer\":\"Warpタイマー\",\"tw.settingsModal.warpTimerHelp\":\"スクリプトがながいループや無限(むげん)ループにおちいっているかどうかをチェックし、ループが終了(しゅうりょう)するまでうごけないのをさけ、ひくいフレームレートで実行(じっこう)するようにします。これにより、ほとんどのクラッシュが修正(しゅうせい)されます。しかし、パフォーマンスへの影響(えいきょう)がおおきいため、デフォルトではエディタでのみ有効(ゆうこう)になっています。\",\"tw.spriteSelectorItem.rename\":\"なまえをかえる\",\"tw.stereo\":\"ステレオ\",\"tw.studioview.error\":\"プロジェクトをつぎのページでよみこむときにエラーが発生(はっせい)しました。\",\"tw.twExtension.description\":\"ふしぎなあたらしいブロック\",\"tw.twExtension.name\":\"TurboWarpのブロック\",\"tw.usernameModal.mustChange\":\"もうしわけありません、あなたのユーザーめいが安全(あんぜん)でない可能性(かのうせい)があります。ほかのユーザーめいに変更(へんこう)するか、{resetIt}をしてください。\",\"tw.usernameModal.mustChange.resetIt\":\"リセット(おすすめ)\",\"tw.usernameModal.reset\":\"リセット\",\"tw.usernameModal.title\":\"ユーザーめいをかえる\",\"tw.viewFeaturedProjects\":\"クリックしてプロジェクトの特集(とくしゅう)をみる。\",\"tw.viewOnScratch\":\"Scratchでプロジェクトをみる\"},\"ko\":{\"tw.alerts.creatingRestorePoint\":\"복원 지점 생성 중...\",\"tw.alerts.lostPeripheralConnection\":\"{extensionName} 확장 기능과 연결이 끊어졌습니다.\",\"tw.alerts.restorePointError\":\"복원 지점을 생성할 수 없습니다.\",\"tw.alerts.savedToDisk\":\"컴퓨터에 저장되었습니다.\",\"tw.backpack.rename\":\"새로운 이름:\",\"tw.blocks.PROCEDURES_RETURN\":\"{v} 반환하기\",\"tw.blocks.addons\":\"애드온\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON]마우스 버튼이 눌렸는가?\",\"tw.blocks.lastKeyPressed\":\"마지막으로 눌린 키\",\"tw.blocks.mouseButton.middle\":\"(1) 가운데\",\"tw.blocks.mouseButton.primary\":\"(0) 왼쪽\",\"tw.blocks.mouseButton.secondary\":\"(2) 오른쪽\",\"tw.blocks.openDocs\":\"문서 열기\",\"tw.browserModal.desc\":\"최신 버전의 크롬, Mozilla Firefox, Microsoft Edge 또는 Apple Safari를 사용하고 있는지 확인하세요.\",\"tw.cantUseCloud\":\"클라우드 변수를 생성할 수는 있으나, 해당 프로젝트가 Scratch에 업로드 되거나 {packager}같은 툴을 사용해 변환되지 않는 한 클라우드 변수는 작동하지 않습니다.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"'사용자 이름'은 프로젝트가 실행되는 동안 변경될 수 없습니다.\",\"tw.clipboard.danger\":\"클립보드에 비밀번호와 같은 민감한 정보가 포함되어 있을 경우, 프로젝트에 의해 해당 정보가 다른 사용자 또는 서버와 공유될 수 있습니다.\",\"tw.clipboard.permission\":\"몇몇 브라우저에서는 클립보드에 접근이 불가능할 수 있습니다. 권한을 허용할 경우, 추가적인 클립보드 읽기 요청이 자동으로 허용됩니다.\",\"tw.clipboard.title\":\"프로젝트가 클립보드의 데이터 읽기 권한을 요청합니다.\",\"tw.code\":\"소스코드\",\"tw.confirmIncompatibleExtension\":\"이 확장 기능은 스크래치와 호환되지 않습니다.\\n해당 확장 기능을 활성화할 경우 프로젝트가 스크래치 웹사이트에 업로드되지 않을 수 있습니다. 계속하시겠습니까?\",\"tw.createdBy\":\"제작자 : \",\"tw.customExtension.description\":\"사용자 지정 확장 기능을 URL, 파일 또는 자바스크립트 소스코드를 통해 불러옵니다.\",\"tw.customExtension.name\":\"사용자 지정 확장 기능\",\"tw.customExtensionModal.file\":\"파일\",\"tw.customExtensionModal.load\":\"불러오기\",\"tw.customExtensionModal.promptFile\":\"확장 기능의 자바스크립트 파일을 선택하세요 : \",\"tw.customExtensionModal.promptText\":\"확장 기능의 자바스크립트 소스코드를 붙여넣기 하세요 : \",\"tw.customExtensionModal.promptURL\":\"확장 기능의 URL을 입력하세요 : \",\"tw.customExtensionModal.text\":\"텍스트\",\"tw.customExtensionModal.title\":\"사용자 지정 확장 기능 불러오기\",\"tw.customExtensionModal.trusted\":\"해당 확장 기능은 신뢰할 수 있는 공급원으로부터 제공되기 때문에 샌드박스되지 않은 상태로 로딩됩니다.\",\"tw.customExtensionModal.unsandboxed\":\"확장 기능을 샌드박스 하지 않고 실행\",\"tw.customExtensionModal.unsandboxedWarning1\":\"확장 기능을 샌드박스 하지 않고 불러오는 것은 위험하며, 해당 확장 기능이 활성화되지 않을 수 있습니다.\\n본인이 무엇을 하고 있는지 모를 경우 해당 작업을 중단하세요.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"샌드박스되지 않은 확장 기능은 사용자 설정을 삭제하거나, 비밀번호를 훔쳐 가는 등의 악의적인 행동으로 프로젝트를 망칠 수 있습니다.\\n{APP_NAME}의 개발자는 해당 문제로 인해 야기되는 결과에 어떤 책임도 지지 않습니다.\",\"tw.customExtensionModal.untrusted\":\"신뢰할 수 없는 URL로부터 제공되는 확장 기능은 보안을 위해 항상 샌드박스 처리됩니다.\",\"tw.documentation\":\"문서\",\"tw.extensionGallery.error\":\"확장 기능 갤러리를 불러오는 중 문제가 발생했습니다. extensions.turbowarp.org 에서 더 많은 확장 기능을 찾아보세요.\",\"tw.extensionGallery.loading\":\"확장 기능 갤러리를 불러오는 중...\",\"tw.extensionGallery.more\":\"extensions.turbowarp.org 에서 확장 기능에 대해 자세히 알아보기\",\"tw.extensionGallery.name\":\"터보워프 확장 기능 갤러리\",\"tw.featuredProjectsStudio\":\"스크래치 스튜디오에서 특집 프로젝트 목록 보기\",\"tw.feedback\":\"문의 및 오류 신고\",\"tw.feedbackButton\":\"문의하기\",\"tw.fetch.title\":\"프로젝트가 웹사이트 연결을 요청합니다 : \",\"tw.fileInput.none\":\"선택된 파일 없음\",\"tw.fileInput.selected\":\"선택된 파일 : {name}\",\"tw.fonts.add\":\"추가\",\"tw.fonts.custom.file\":\"컴퓨터에서 글꼴 파일 선택 : \",\"tw.fonts.custom.name\":\"글꼴 이름 지정 : \",\"tw.fonts.custom1\":\"파일에서 글꼴 추가\",\"tw.fonts.custom2\":\"일반적으로 스크래치에서 작동하지 않을 것입니다. 지원되는 글꼴 : {formats}\",\"tw.fonts.delete\":\"정말로 \\\"{font}\\\" 폰트를 삭제하시겠습니까? 해당 폰트를 사용하는 모든 벡터 그래픽이 대체 글꼴로 변경됩니다.\",\"tw.fonts.fallback\":\"글꼴이 삭제되었거나 불러오는 데 실패했을 경우 사용할 대체 글꼴을 선택하세요.\",\"tw.fonts.list\":\"설치된 글꼴 : \",\"tw.fonts.none\":\"추가된 글꼴 없음\",\"tw.fonts.readError\":\"글꼴 파일 읽기에 실패했습니다 : {error}\",\"tw.fonts.system\":\"시스템 글꼴\",\"tw.fonts.system1\":\"시스템 글꼴 추가\",\"tw.fonts.system2\":\"스크래치에서 작동할 수 있으나, 모든 사용자에게 올바르게 나타나지 않을 수 있습니다.\",\"tw.fonts.title\":\"글꼴\",\"tw.footer.credits\":\"크레딧\",\"tw.footer.disclaimer\":\"TurboWarp는 스크래치, 스크래치 팀, 스크래치 재단에 소속되어 있지 않습니다.\",\"tw.footer.documentation\":\"문서\",\"tw.footer.donate\":\"기부\",\"tw.footer.embed\":\"임베딩\",\"tw.footer.parameters\":\"URL 파라미터\",\"tw.geolocate.title\":\"프로젝트가 사용자의 위치 정보에 접근할 수 있는 권한을 요청합니다.\",\"tw.gui.crashMessage.description\":\"페이지에 충돌이 발생했습니다.\\n페이지를 새로고침한 후에 다시 시도해 주세요.\",\"tw.gui.defaultProjectTitle\":\"프로젝트\",\"tw.guiDefaultTitle\":\"스크래치 프로젝트를 더 빠르게 실행하기\",\"tw.home.credit\":\"주의사항 및 크레딧\",\"tw.home.description\":\"TurboWarp는 스크래치 프로젝트를 JavaScript로 컴파일하여 매우 빠르게 실행할 수 있도록 해주는 스크래치 모드입니다. \\n프로젝트 ID 또는 프로젝트 URL을 붙여넣거나, 아래의 특집 프로젝트를 선택해서 실행해 보세요.\",\"tw.home.instructions\":\"소개\",\"tw.input.tooltip\":\"스크래치 프로젝트 주소를 복사한 후 여기에 붙여넣기 하세요!\",\"tw.interpolationEnabled\":\"보간법 활성화\",\"tw.invalidParameters.clones\":\"\\\"clone\\\" URL 파라미터가 유효하지 않습니다\",\"tw.invalidParameters.fps\":\"\\\"fps\\\" URL 파라미터가 유효하지 않습니다\",\"tw.loadError\":\"프로젝트를 불러올 수 없습니다.\\n오류 코드 : {error}\",\"tw.loadExtension.embedded\":\"프로젝트가 코드를 포함한 사용자 지정 확장 기능을 요구합니다 : \",\"tw.loadExtension.sandboxed\":\"코드가 샌드박스 되더라도, 여전히 IP 주소나 위치 정보 같은 사용자 기기 정보에 접근할 수 있습니다.\\n계속하기 전에 해당 확장 기능의 제작자를 신뢰할 수 있는지 확인하세요.\",\"tw.loadExtension.unsandboxed\":\"확장 기능을 샌드박스 하지 않고 실행\",\"tw.loadExtension.unsandboxedWarning\":\"샌드박스 없이 확장 기능을 불러오는 것은 위험합니다. 해당 확장 기능이 사용자 설정을 삭제하거나, 비밀번호를 훔쳐 가는 등의 악의적인 행동으로 프로젝트를 망칠 수 있습니다.\\n{APP_NAME}의 개발자는 해당 문제로 인해 야기되는 결과에 어떤 책임도 지지 않습니다.\",\"tw.loadExtension.url\":\"프로젝트가 URL로부터 사용자 지정 확장 기능을 요구합니다 : \",\"tw.loader.assets.known\":\"정보를 내려받는 중입니다({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"정보를 내려받는 중입니다...\",\"tw.loader.data\":\"프로젝트 자료를 내려받는 중입니다...\",\"tw.loader.generic\":\"프로젝트를 불러오는 중입니다...\",\"tw.menuBar.60off\":\"60 FPS 모드 비활성화\",\"tw.menuBar.60on\":\"60 FPS 모드 활성화\",\"tw.menuBar.addons\":\"애드온\",\"tw.menuBar.advanced\":\"고급 설정\",\"tw.menuBar.changeUsername\":\"사용자 이름 변경하기\",\"tw.menuBar.cloudOff\":\"클라우드 변수 비활성화\",\"tw.menuBar.cloudOn\":\"클라우드 변수 활성화\",\"tw.menuBar.cloudUnavailable\":\"클라우드 변수를 이용할 수 없습니다\",\"tw.menuBar.cloudUnavailableAlert\":\"에디터를 열었기 때문에 클라우드 변수를 사용할 수 없습니다.\",\"tw.menuBar.cloudUnavailableDesktop\":\"데스크톱 앱에서는 클라우드 변수를 사용할 수 없습니다.\",\"tw.menuBar.moreSettings\":\"고급 설정\",\"tw.menuBar.newFramerate\":\"사용할 FPS:\",\"tw.menuBar.newWindow\":\"새 창 열기\",\"tw.menuBar.package\":\"프로젝트 패키징\",\"tw.menuBar.reportError1\":\"일부 스크립트를 컴파일 할 수 없습니다.\",\"tw.menuBar.reportError2\":\"오류가 발생했습니다. 해당 오류를 보고해주실 것을 부탁드립니다.\",\"tw.menuBar.restorePoints\":\"복원 지점\",\"tw.menuBar.saveAs\":\"{file}로 저장하기\",\"tw.menuBar.seeInside\":\"스크립트 보기\",\"tw.mono\":\"모노\",\"tw.notify.permission\":\"해당 권한을 허용할 경우, 브라우저에서 알림 표시 허용 여부를 묻는 알림 창이 나타날 수 있으며, 추가적인 알림 표시 요청이 자동으로 허용됩니다.\",\"tw.notify.title\":\"프로젝트가 알림 표시 권한을 요청합니다.\",\"tw.oldDownload\":\"다른 파일로 저장\",\"tw.opcode.2000\":\"2000년 이후 경과 날짜\",\"tw.opcode.mousedown\":\"마우스가 눌렸는가?\",\"tw.opcode.mousex\":\"마우스 x좌표\",\"tw.opcode.mousey\":\"마우스 y좌표\",\"tw.openAdvanced\":\"고급 설정 열기\",\"tw.openWindow.dangerous\":\"해당 웹사이트는 {APP_NAME}의 개발자에 의해 보고된 웹사이트가 아니며, 위험하거나 악의적인 코드를 포함하고 있을 수 있습니다.\",\"tw.openWindow.title\":\"프로젝트가 다음 URL을 새 창이나 탭에서 열 것을 요청합니다 : \",\"tw.paint.alpha\":\"불투명도\",\"tw.paint.fonts.more\":\"글꼴 추가...\",\"tw.privacy\":\"개인정보 보호 정책\",\"tw.recordAudio.permission\":\"해당 권한을 허용할 경우, 브라우저에서 마이크 접근 허용 여부를 묻는 알림 창이 나타날 수 있으며, 추가적인 마이크 접근 요청이 자동으로 허용됩니다.\",\"tw.recordAudio.title\":\"프로젝트가 사용자의 마이크를 통해 오디오를 녹음할 수 있는 권한을 요청합니다. 여기에는 텍스트 변환 음성이나 원본 오디오 데이터가 포함됩니다.\\n녹음된 오디오는 프로젝트에 의해 다른 사용자 또는 서버와 공유될 수 있습니다.\",\"tw.recordVideo.permission\":\"해당 권한을 허용할 경우, 브라우저에서 카메라 접근 허용 여부를 묻는 알림 창이 나타날 수 있으며, 추가적인 카메라 접근 요청이 자동으로 허용됩니다.\",\"tw.recordVideo.title\":\"프로젝트가 사용자의 카메라를 통해 비디오를 녹화할 수 있는 권한을 요청합니다.\\n녹화된 데이터는 프로젝트에 의해 다른 사용자 또는 서버와 공유될 수 있습니다.\",\"tw.redirect.dangerous\":\"해당 웹사이트는 {APP_NAME}의 개발자에 의해 보고된 웹사이트가 아니며, 위험하거나 악의적인 코드를 포함하고 있을 수 있습니다.\",\"tw.redirect.title\":\"프로젝트가 해당 탭을 다음 URL로 전환하기를 요청합니다 : \",\"tw.restorePoints.1minute\":\"1분\",\"tw.restorePoints.confirmDelete\":\"정말로 \\\"{projectTitle}\\\" 프로젝트를 삭제하시겠습니까?\\n이 작업은 되돌릴 수 없습니다.\",\"tw.restorePoints.confirmDeleteAll\":\"정말로 모든 복원 지점을 삭제하시겠습니까?\\n이 작업은 되돌릴 수 없습니다.\",\"tw.restorePoints.confirmLoad\":\"저장되지 않은 변경 사항이 있습니다. 현재 프로젝트에 덮어쓰기 하시겠습니까?\",\"tw.restorePoints.deleteAll\":\"모든 복원 지점 삭제하기\",\"tw.restorePoints.empty\":\"복원 지점을 찾을 수 없습니다.\",\"tw.restorePoints.error\":\"복원 지점을 불러오는 중 문제가 발생했습니다 : {error}\",\"tw.restorePoints.intervalOption\":\"복원 지점이 {time} 간격으로 생성됩니다.\",\"tw.restorePoints.loading\":\"불러오는 중...\",\"tw.restorePoints.minutes\":\"{n}분\",\"tw.restorePoints.never\":\"없음\",\"tw.restorePoints.off\":\"복원 지점을 비활성화하는 것은 위험합니다.\",\"tw.restorePoints.size\":\"예상 저장 공간 사용량 : {size}\",\"tw.restorePoints.size2\":\"다중 복원 지점에서 사용되는 모양 및 소리 리소스는 한 번만 저장되어 공간을 절약합니다.\",\"tw.restorePoints.title\":\"복원 지점\",\"tw.saveAs\":\"다른 이름으로 저장\",\"tw.saveTo\":\"{file}로 저장\",\"tw.scratchUnsafeCloud\":\"만약 이 클라우드 변수를 생성할 경우, 해당 프로젝트는 최대 {number}개로 제한되어 있는 클라우드 변수 갯수의 상한선을 초과하게 됩니다.\\n이 경우에 해당 프로젝트가 Scratch에 업로드 되었을 때, 일부 변수가 정상적으로 작동하지 않을 수 있습니다.\",\"tw.securityManager.allow\":\"허용\",\"tw.securityManager.deny\":\"거부\",\"tw.securityManager.title\":\"확장 기능 보안\",\"tw.securityManager.trust\":\"해당 권한을 허용할 경우, 현재 웹사이트에서의 추가적인 요청이 자동으로 허용됩니다.\",\"tw.securityManager.why\":\"해당 권한은 이미지 또는 소리 파일 다운로드, 멀티플레이어 구현, API 액세스를 위해 사용될 수 있지만 타인에 의해 악용될 수도 있습니다. 이 권한을 허용하게 되면 내 컴퓨터의 IP 주소, 위치 정보 및 기타 정보를 공유하게 됩니다.\",\"tw.settingsModal.customStageSize\":\"사용자 지정 무대 크기\",\"tw.settingsModal.customStageSizeHelp\":\"무대 크기를 480x360이 아닌 다른 크기로 바꿉니다.\\n넓은 화면을 원하는 경우 640x360를 시도해 보세요. 일부 프로젝트는 올바르게 작동할 수 있습니다.\",\"tw.settingsModal.dangerZone\":\"위험한 기능\",\"tw.settingsModal.disableCompiler\":\"컴파일러 비활성화\",\"tw.settingsModal.disableCompilerHelp\":\"컴파일러를 비활성화합니다.\\n프로젝트를 편집하는 동안 스크립트가 즉시 업데이트되도록 하려면 컴파일러를 비활성화해도 됩니다. 이 경우가 아니라면 컴파일러를 비활성화하지 마세요.\",\"tw.settingsModal.featured\":\"추천 기능\",\"tw.settingsModal.fps\":\"60 FPS (또는 사용자 지정 FPS) 활성화\",\"tw.settingsModal.fpsHelp\":\"스크립트를 초당 30회로 실행하는 대신 초당 60회 실행합니다. 대부분의 프로젝트는 이 기능이 활성화된 상태에서 제대로 작동하지 않으며, 이 같은 경우에는 60 FPS모드 대신 보간법을 사용해야 합니다. {customFramerate}\",\"tw.settingsModal.fpsHelp.customFramerate\":\"30 또는 60 이외의 프레임률을 사용하려면 클릭합니다.\",\"tw.settingsModal.help\":\"클릭하여 도움말 열기\",\"tw.settingsModal.highQualityPen\":\"고품질 펜 활성화\",\"tw.settingsModal.highQualityPenHelp\":\"펜 프로젝트가 더 높은 해상도에서 렌더링될 수 있도록 해주며, 에디터에서 적용되는 일부 좌표 반올림을 비활성화합니다. 이 옵션은 모든 프로젝트에 도움이 되지는 않으며 성능에 영향을 미칠 수 있습니다.\",\"tw.settingsModal.infiniteClones\":\"무제한 복제본 활성화\",\"tw.settingsModal.infiniteClonesHelp\":\"스크래치의 300개 복제본 제한을 비활성화합니다.\",\"tw.settingsModal.interpolation\":\"보간법 활성화\",\"tw.settingsModal.interpolationHelp\":\"스프라이트의 움직임을 보간해 프로젝트의 동작을 더 부드럽게 만듭니다. 보간법은 3D 프로젝트, 레이트레이서, 펜 프로젝트, 렉이 걸리는 프로젝트 등에서 사용할 경우 오히려 프로젝트를 더 느려지게 만들 수 있습니다.\",\"tw.settingsModal.largeStageWarning\":\"사용자 지정 무대의 크기가 너무 큽니다!\\n더 작은 크기의 동일한 화면비를 가진 사용자 지정 무대를 설정하고, 풀스크린 모드로 전환하여 화면이 자동으로 업스케일되도록 하는 것을 권장합니다.\",\"tw.settingsModal.removeFencing\":\"무대 밖 동작 활성화\",\"tw.settingsModal.removeFencingHelp\":\"스프라이트가 화면 밖으로 나갈 수 있도록 하거나, 스프라이트가 원하는 만큼 커지거나 작아질 수 있도록 하거나, 충돌 감지 블록이 화면 밖에서도 작동할 수 있도록 합니다.\",\"tw.settingsModal.removeLimits\":\"제한 풀기\",\"tw.settingsModal.removeMiscLimits\":\"기타 제한 비활성화\",\"tw.settingsModal.removeMiscLimitsHelp\":\"이미지 효과 제한과 펜 굵기 제한을 제거합니다.\",\"tw.settingsModal.storeProjectOptions\":\"프로젝트에 고급 설정 저장하기\",\"tw.settingsModal.storeProjectOptionsHelp\":\"TurboWarp가 이 프로젝트를 불러올 때 현재 설정이 자동으로 적용되도록 고급 설정을 프로젝트에 저장합니다.\\n<워프 타이머 활성화>와 <컴파일러 비활성화>는 저장되지 않습니다.\",\"tw.settingsModal.title\":\"고급 설정\",\"tw.settingsModal.warpTimer\":\"워프 타이머 활성화\",\"tw.settingsModal.warpTimerHelp\":\"스크립트가 긴 반복문 또는 무한 반복문에 갇힌 경우, 반복문이 끝날 때까지 코드가 멈춰 있지 않고 낮은 프레임에서 실행되고 있는지 확인합니다.\\n이 기능은 대부분의 충돌을 막을 수 있지만 성능을 확연히 저하시킵니다. 따라서 해당 기능은 편집기에서만 활성화됩니다.\",\"tw.spriteSelectorItem.rename\":\"이름 재설정하기\",\"tw.stereo\":\"스테레오\",\"tw.stereoAlert\":\"해당 스테레오 음원을 수정하면 자동으로 모노 음원으로 변환되며 이 작업은 되돌릴 수 없습니다.\",\"tw.studioview.authorAttribution\":\"제작자 : {author}\",\"tw.studioview.error\":\"프로젝트의 다음 페이지를 불러오는 도중 오류가 발생했습니다.\",\"tw.studioview.hoverText\":\"{author}의 \\\"{title}\\\"\",\"tw.tooLarge\":\"해당 음원은 파일 용량이 너무 커서 Scratch에 업로드가 불가능할 수 있습니다.\",\"tw.twExtension.description\":\"이상하고 새로운 블록들입니다.\",\"tw.twExtension.name\":\"TurboWarp 추가 블럭\",\"tw.unshared.2\":\"추가 정보를 원하시면, 다음 링크로 접속해 주세요. {link}\",\"tw.unshared.bug\":\"만약 해당 프로젝트가 실제로 공유된 프로젝트인 경우, 오류 신고를 해주실 것을 부탁드립니다.\",\"tw.unshared.cache\":\"만약 최근에 공유된 프로젝트일 경우, 이 메시지는 몇 분간 잘못 표시될 수 있습니다.\",\"tw.unshared2.1\":\"공유되지 않은 프로젝트는 더 이상 볼 수 없습니다.\",\"tw.usernameModal.help\":\"이 값은 브라우저의 저장소에 저장됩니다. 클라우드 변수를 포함하는 프로젝트와 상호 작용할 때 기록될 수 있습니다.\",\"tw.usernameModal.help2\":\"유효한 Scratch 계정에 대응하지 않는 사용자 이름은 클라우드 변수 서버에 의해 거부됩니다. 그대로 남기거나 당신의 Scratch 사용자 이름으로 변경하는 것을 추천합니다.\",\"tw.usernameModal.mustChange\":\"클라우드 변수 서버가 당신의 사용자 이름이 안전하지 않다고 생각합니다. 다른 것으로 변경하거나 {resetIt} 해 주세요.\",\"tw.usernameModal.mustChange.resetIt\":\"초기화하기 (권장됨)\",\"tw.usernameModal.new\":\"새 사용자 이름:\",\"tw.usernameModal.reset\":\"초기화하기\",\"tw.usernameModal.title\":\"사용자 이름 변경하기\",\"tw.viewFeaturedProjects\":\"여기를 클릭하여 특집 프로젝트를 볼 수 있습니다.\",\"tw.viewOnScratch\":\"프로젝트 스크래치에서 보기\",\"tw.webglModal.description\":\"당신의 브라우저나 컴퓨터가 {webGlLink}. 이 기술은 TurboWarp를 실행하기 위해 필요합니다. 당신의 브라우저와 그래픽 드라이버를 업데이트하거나 컴퓨터를 재시작하세요.\"},\"lt\":{\"tw.alerts.creatingRestorePoint\":\"Atkuriamas atkūrimo taškas...\",\"tw.alerts.lostPeripheralConnection\":\"Prarastas {extensionName} ryšys.\",\"tw.alerts.savedToDisk\":\"Išsaugota į jūsų kompiuterį.\",\"tw.backpack.rename\":\"Naujas vardas:\",\"tw.blocks.addons\":\"Įskiepiai\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] pelės mygtukas spusteltas?\",\"tw.blocks.lastKeyPressed\":\"paskutinis paspaustas mygtukas\",\"tw.blocks.mouseButton.middle\":\"(1) vidurys\",\"tw.blocks.mouseButton.primary\":\"(0) pagrindinis\",\"tw.blocks.mouseButton.secondary\":\"(2) antrasis\",\"tw.blocks.openDocs\":\"Atidaryti Dokumentacijas\",\"tw.browserModal.desc\":\"Įsitikinkite kad naudojate naujausią Google Chrome, Mozilla Firefox, Microsoft Edge, ar Apple Safari.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Naudotojo vardas negali būti pakeistas kol projektas yra paleistas.\",\"tw.code\":\"Šaltinio kodas\",\"tw.confirmIncompatibleExtension\":\"Šis papildinys nėra suderinamas su Scratch. Projektai sukurti su šiuo papildiniu negali būti įkelti į Scratch svetainę. Ar jūs tikri kad norite jį įjungti?\",\"tw.customExtension.name\":\"Pasirinktinis papildinys\",\"tw.customExtensionModal.file\":\"Failas\",\"tw.featuredProjectsStudio\":\"Peržiurėti studiją per Scratch.\",\"tw.feedback\":\"Atsiliepimai ir Klaidos\",\"tw.feedbackButton\":\"TurboWarp atsiliepimas\",\"tw.footer.credits\":\"Padėkos\",\"tw.footer.disclaimer\":\"TurboWarp nėra susietas su Scratch, the Scratch Team ar su the Scratch Foundation.\",\"tw.footer.donate\":\"Paaukoti\",\"tw.footer.embed\":\"Įterpimas\",\"tw.footer.parameters\":\"URL Parametrai\",\"tw.gui.crashMessage.description\":\"Labai atsiprašome, bet atrodo, kad puslapis užstrigo. Prašome perkrauti puslapį ir pabandyti dar kartą.\",\"tw.gui.defaultProjectTitle\":\"Projektas\",\"tw.guiDefaultTitle\":\"Paleisk Scratch projektus greičiau\",\"tw.home.credit\":\"Pastabos ir Padėkos\",\"tw.home.description\":\"TurboWarp yra Scratch modifikacija, kuria projektai kompiliuojami į JavaScript, kad veiktų labai greitai. Išbandykite tai įvesdami projekto ID arba URL viršuje arba pasirinkdami rekomenduojamą projektą apačioje.\",\"tw.home.instructions\":\"Instrukcijos\",\"tw.input.tooltip\":\"Nukopijuokite ir įklijuokite Scratch projekto nuorodą čia!\",\"tw.interpolationEnabled\":\"Interpoliacija\",\"tw.invalidParameters.clones\":\"\\\"klono\\\" URL parametras yra neteisingas\",\"tw.invalidParameters.fps\":\"\\\"fps\\\" URL parametras yra neteisingas\",\"tw.loadError\":\"Nepavyksta įkelti projekto: {error}\",\"tw.loader.assets.known\":\"atsisiunčiami duomenys ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Duomenys įdiegiami.\",\"tw.loader.data\":\"Projekto duomenys atsisiunčia...\",\"tw.loader.generic\":\"Projektas kraunamas...\",\"tw.menuBar.60off\":\"Išjungti 60 FPS režimą\",\"tw.menuBar.60on\":\"Įjungti 60 FPS režimą\",\"tw.menuBar.addons\":\"Įskiepiai\",\"tw.menuBar.advanced\":\"Išplėstiniai\",\"tw.menuBar.changeUsername\":\"Pakeisti Naudotojo vardą\",\"tw.menuBar.cloudOff\":\"Išjungti Debesies kintamuosius\",\"tw.menuBar.cloudOn\":\"Įjungti debesies kintamuosius\",\"tw.menuBar.cloudUnavailable\":\"Debesies kintamieji nepasiekiami\",\"tw.menuBar.cloudUnavailableAlert\":\"Negalite naudotis debesies kintamaisiais, tikriausia kad jūs įjungėte redaguotoją.\",\"tw.menuBar.moreSettings\":\"Išplėstiniai nustatymai\",\"tw.menuBar.newFramerate\":\"Naujas kadrų per sekundę greitis:\",\"tw.menuBar.package\":\"Supakuoti projektą\",\"tw.menuBar.reportError1\":\"Kai kurie veikėjai negali būti sukompiliuoti.\",\"tw.menuBar.reportError2\":\"Tai klaida. Prašau mums apie ją reportuoti.\",\"tw.menuBar.saveAs\":\"Išsaugoti kaip {file}\",\"tw.menuBar.seeInside\":\"Peržiurėti vidų\",\"tw.oldDownload\":\"Išsaugoti į atskirą failą...\",\"tw.paint.alpha\":\"Nepermatomumas\",\"tw.privacy\":\"Privatumo politika\",\"tw.saveAs\":\"Išsaugoti kaip...\",\"tw.saveTo\":\"Išsaugoti į {file}\",\"tw.settingsModal.customStageSize\":\"Pasirinktinis Scenos dydis:\",\"tw.settingsModal.customStageSizeHelp\":\"Pakeičia Scratch scenos dydį iš 480x360 į kitą. Išbandykite 640x360, kad scena būtų plačiaekranė. Tik nedaugelis projektų su tuo susidoros tinkamai.\",\"tw.settingsModal.dangerZone\":\"Pavojinga zona\",\"tw.settingsModal.disableCompiler\":\"Išjungti kompiliatorių\",\"tw.settingsModal.disableCompilerHelp\":\"Išjungia TurboWarp kompiliatorių. Redaguodami projektus galite norėti įjungti šią funkciją, kad scenarijai būtų nedelsiant atnaujinami. Priešingu atveju niekada neturėtumėte įjungti šios funkcijos.\",\"tw.settingsModal.featured\":\"Rekomenduojama\",\"tw.settingsModal.fps\":\"60 FPS (Pasirinktiniai FPS)\",\"tw.settingsModal.fpsHelp\":\"Paleidžia kodus 60 kadrų per sekundę greičiu užuot paleidus 30. Daugiausia projektų neveiks su šiuo nustatymu įjungtu. Pabandykite Interpoliaciją su 60 FPS režimu išjungtu jei tai priežastis. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Spustelėkite kito nei 30 ar 60 kadrų per sekundę nustatymui\",\"tw.settingsModal.help\":\"Spustėlkite dėl pagalbos\",\"tw.settingsModal.highQualityPen\":\"Aukštos kokybės pieštukas\",\"tw.settingsModal.highQualityPenHelp\":\"Leidžia pieštuko projektams veikti didesne skiriamąja geba ir išjungia kai kurių koordinačių apvalinimą redaktoriuje. Šis nustatymas nėra naudingas visiems projektams ir gali turėti įtakos našumui.\",\"tw.settingsModal.infiniteClones\":\"Begaliniai Klonai\",\"tw.settingsModal.infiniteClonesHelp\":\"Panaikina Scratch 300 klonų limitą.\",\"tw.settingsModal.interpolation\":\"Interpoliacija\",\"tw.settingsModal.interpolationHelp\":\"Projektai atrodo sklandžiau, nes interpoliuojamas personažų udėjimas. Interpoliacija neturėtų būti naudojama 3D projektuose, \\\"Raytracer\\\" projektuose, piešimo projektuose ir stringančiuose projektuose, nes dėl interpoliacijos jie veiks lėčiau, bet neatrodys sklandžiau.\",\"tw.settingsModal.largeStageWarning\":\"Nerekomenduojama naudoti tokio dydžio pasirinktinio scenos dydžio! Vietoj to naudokite mažesnį dydį su tuo pačiu kraštinių santykiu ir leiskite viso ekrano režimui padidinti jo mastelį, kad jis atitiktų naudotojo ekraną.\",\"tw.settingsModal.removeFencing\":\"Panaikinti scenos aptvarus\",\"tw.settingsModal.removeFencingHelp\":\"Suteikia galimybę personažams judėti už ekrano ribų, tapti tokiais dideliais arba mažais, kokiais jie nori, ir leidžia liesti blokus už ekrano ribų.\",\"tw.settingsModal.removeLimits\":\"Pašalinti limitus\",\"tw.settingsModal.removeMiscLimits\":\"Pašalinti įvairius limitus.\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Pašalina garso efektų limitus bei pieštuko dydžio limitus.\",\"tw.settingsModal.storeProjectOptions\":\"Išsaugoti nustatymus projekte.\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Įrašo pasirinktus nustatymus į projektą, kad jie būtų automatiškai taikomi, kai TurboWarp įkelia šį projektą. \\\"Nukreipimo laikmatis\\\" ir \\\"išjungti kompiliatorių\\\" nebus išsaugoti.\",\"tw.settingsModal.title\":\"Išplėstiniai nustatymai\",\"tw.settingsModal.warpTimer\":\"Nukreipimo laikmatis\",\"tw.settingsModal.warpTimerHelp\":\"Kodai tikrina, ar jie nėra įstrigę ilgoje arba begalinėje kilpoje, ir veikia nedideliu kadrų dažniu, užuot įstrigę, kol kilpa baigsis. Tai išsprendžia daugumą gedimų, tačiau turi didelį poveikį našumui, todėl pagal numatytuosius nustatymus ši funkcija įjungta tik redaktoriuje.\",\"tw.spriteSelectorItem.rename\":\"pervardinti\",\"tw.studioview.authorAttribution\":\"Sukurta {author}\",\"tw.studioview.error\":\"Kraunant kitą projektų puslapį įvyko klaida.\",\"tw.studioview.hoverText\":\"{title} sukurta {author}\",\"tw.twExtension.name\":\"TurboWarp Blokai\",\"tw.unshared.2\":\"Dėl daugiau informacijos, aplankykite: {link}\",\"tw.usernameModal.help\":\"Ši vertė bus išsaugota jūsų naršyklės saugykloje. Ji turėtų būti prijungta kai naudojates projektais kurie turi debesies kintamuosius.\",\"tw.usernameModal.help2\":\"Vertes, kurios neatitinka galiojančios Scratch paskyros, debesies kintamųjų serveris paprastai atmeta. Rekomenduojame palikti jį tokį, koks yra, arba pakeisti į Scratch naudotojo vardą.\",\"tw.usernameModal.mustChange\":\"Atsiprašome, bet debesies kintamųjų serveris mano kad jūsų naudotojo vardas gali būti nesaugus. Prašome jį pakeisti arba {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"Iš naujo nustatyti jį (rekomenduojama)\",\"tw.usernameModal.reset\":\"nustatyti iš naujo\",\"tw.usernameModal.title\":\"Pakeisti Naudotojo vardą\",\"tw.viewFeaturedProjects\":\"Spustelkite kad pažiurėtumėte rekomenduojamus projektus.\",\"tw.viewOnScratch\":\"Peržiurėti projektą per Scratch\",\"tw.webglModal.description\":\"Deja, atrodo, kad jūsų naršyklė arba kompiuteris nepalaiko {webGlLink}. Ši technologija reikalinga, kad ši svetainė veiktų. Pabandykite atnaujinti naršyklę ir grafikos tvarkykles arba iš naujo paleiskite kompiuterį.\"},\"nb\":{\"tw.alerts.savedToDisk\":\"Lagret på datamaskinet.\",\"tw.backpack.rename\":\"Nytt navn:\",\"tw.blocks.addons\":\"Utvidelser\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] mus knappen ned?\",\"tw.blocks.lastKeyPressed\":\"sist tast trykket\",\"tw.blocks.mouseButton.middle\":\"(1) mellom\",\"tw.blocks.mouseButton.primary\":\"(0) primær\",\"tw.blocks.mouseButton.secondary\":\"(2) sekundær\",\"tw.blocks.openDocs\":\"Åpne dokumentasjon\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Brukernavn kan ikke byttes mens prosjektet er på.\",\"tw.code\":\"Kildekode\",\"tw.featuredProjectsStudio\":\"Se galeriet på Scratch.\",\"tw.feedback\":\"Tilbakemelding & feil\",\"tw.feedbackButton\":\"TurboWarp tillbakemelding\",\"tw.footer.disclaimer\":\"TurboWarp er ikke tilknyttet Scratch, Scratch Team eller Scratch Foundation.\",\"tw.footer.parameters\":\"URL-parametere\",\"tw.gui.defaultProjectTitle\":\"Prosjekt\",\"tw.guiDefaultTitle\":\"Kjør Scratch prosjekter raskere\",\"tw.home.credit\":\"Merknader og bidragsytere\",\"tw.home.description\":\"TurboWarp er en Scratch-mod som samler prosjekter til JavaScript for å få dem til å kjøre veldig raskt. Prøv det ved å legge inn en prosjekt-ID eller URL ovenfor eller velge et utvalgt prosjekt nedenfor.\",\"tw.home.instructions\":\"Hvordan bruke prosjektet\",\"tw.interpolationEnabled\":\"Interpolasjon\",\"tw.invalidParameters.clones\":\"\\\"klon\\\" Url-parameteren er ugyldig\",\"tw.invalidParameters.fps\":\"\\\"fps\\\" Url-parameteren er ugyldig\",\"tw.loader.assets.known\":\"Laster ned eiendeler ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Laster ned eiendeler ...\",\"tw.loader.data\":\"Laster ned prosjektdata ...\",\"tw.loader.generic\":\"Laster prosjekt ...\",\"tw.menuBar.60off\":\"Slå av 60 FPS Modus\",\"tw.menuBar.60on\":\"Slå på 60 FPS Modus\",\"tw.menuBar.addons\":\"Utvidelser\",\"tw.menuBar.advanced\":\"Avansert\",\"tw.menuBar.changeUsername\":\"Bytt Brukernavn\",\"tw.menuBar.cloudOff\":\"Slå av nett-variabler\",\"tw.menuBar.cloudOn\":\"Slå på nett-variabler\",\"tw.menuBar.cloudUnavailable\":\"Nett-variabler er ikke tilgjengelig\",\"tw.menuBar.cloudUnavailableAlert\":\"Kan ikke bruke nett-variabler, det er kanskje fordi du åpnet redigerer\",\"tw.menuBar.compileError\":\"{sprite}:{error}\",\"tw.menuBar.moreSettings\":\"Avansert innstillinger\",\"tw.menuBar.newFramerate\":\"Nytt bildefrekvens:\",\"tw.menuBar.reportError1\":\"Noen skripter kunne ikke kompileres.\",\"tw.menuBar.reportError2\":\"Dette er en feil. Vennligst meld det.\",\"tw.menuBar.saveAs\":\"Lagre som {file}\",\"tw.menuBar.seeInside\":\"Se inni\",\"tw.paint.alpha\":\"Opasitet\",\"tw.privacy\":\"Personvernregler\",\"tw.settingsModal.customStageSize\":\"Bytt scene størrelse:\",\"tw.settingsModal.dangerZone\":\"Faresone\",\"tw.settingsModal.featured\":\"Anbefalt\",\"tw.settingsModal.fps\":\"60 FPS (tilpassede fps)\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Klikk her til å velge mellom 30 eller 60 FPS\",\"tw.settingsModal.help\":\"Klikk her for hjelp\",\"tw.settingsModal.highQualityPen\":\"Høy kvalitet penn \",\"tw.settingsModal.infiniteClones\":\"Uendelige kloner\",\"tw.settingsModal.infiniteClonesHelp\":\"Den slår av Scratchs 300 klon grense\",\"tw.settingsModal.interpolation\":\"Interpolasjon\",\"tw.settingsModal.removeLimits\":\"Fjern grenser\",\"tw.settingsModal.title\":\"Avansert innstillinger\",\"tw.spriteSelectorItem.rename\":\"endre navn\",\"tw.studioview.authorAttribution\":\"fra {author}\",\"tw.studioview.error\":\"Det oppsto en feil under innlasting av neste side av prosjekter.\",\"tw.studioview.hoverText\":\"{title} fra {author}\",\"tw.twExtension.name\":\"TurboWarp Klosser\",\"tw.usernameModal.mustChange\":\"Beklager, Nett-variabel server tror at brukernavnet din er usikre. Bytt brukernavnet eller {resetIt}\",\"tw.usernameModal.mustChange.resetIt\":\"nullstille det (anbefales)\",\"tw.usernameModal.reset\":\"Nullstille\",\"tw.usernameModal.title\":\"Bytt Brukernavn\",\"tw.viewFeaturedProjects\":\"Klikk til å se anbefalte prosjekter.\",\"tw.viewOnScratch\":\"Se prosjektet på Scratch\"},\"nl\":{\"tw.alerts.creatingRestorePoint\":\"Herstelpunt aan het maken...\",\"tw.alerts.lostPeripheralConnection\":\"Verbinding verloren met {extensionName}.\",\"tw.alerts.restorePointError\":\"Kon herstelpunt niet maken\",\"tw.alerts.restorePointSuccess\":\"Krijg toegang tot herstelpunten in \\\"Bestand\\\"\",\"tw.alerts.savedToDisk\":\"Opgeslagen op je computer.\",\"tw.backpack.rename\":\"Nieuwe naam:\",\"tw.blocks.PROCEDURES_DOCS\":\"Hoe gebruik ik retourneer?\",\"tw.blocks.PROCEDURES_RETURN\":\"retourneer {v}\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"Veranderen naar Waardeblok\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"Veranderen naar Statement\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON]muisknop ingedrukt?\",\"tw.blocks.lastKeyPressed\":\"laatst ingedrukte toets\",\"tw.blocks.mouseButton.middle\":\"(1) midden\",\"tw.blocks.mouseButton.primary\":\"(0) primair\",\"tw.blocks.mouseButton.secondary\":\"(2) secundair\",\"tw.blocks.openDocs\":\"Documentatie Openen\",\"tw.browserModal.desc\":\"Gebruik een recente versie van Google Chrome, Mozilla Firefox, Microsoft Edge, of Apple Safari\",\"tw.cantUseCloud\":\"Hoewel je cloudvariabelen kunt maken, zullen ze niet werken behalve als dit project is geüpload naar Scratch of geconverteerd d.m.v. een tool zoals de {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Gebruikersnaam kan niet worden veranderd terwijl het project bezig is.\",\"tw.clipboard.danger\":\"Als je dingen zoals wachtwoorden in je klembord hebt, kan het project deze informatie delen met andere gebruikers of servers.\",\"tw.clipboard.permission\":\"Klembordtoegang werkt niet in alle browsers. Indien toegestaan worden toekomstige pogingen om toegang te krijgen tot het klembord automatisch toegestaan.\",\"tw.clipboard.title\":\"Het project wilt toegang krijgen tot je klembord.\",\"tw.code\":\"Broncode\",\"tw.confirmIncompatibleExtension\":\"Deze extensie is incompatibel met Scratch. Projecten die het gebruiken kunnen niet worden geüpload naar de Scratch-website. Weet je zeker dat je het in wilt schakelen?\",\"tw.createdBy\":\"Gemaakt door:\",\"tw.customExtension.description\":\"Aangepaste extensies laden van URL's, bestanden of JavaScript-broncode.\",\"tw.customExtension.name\":\"Aangepaste Extensie\",\"tw.customExtensionModal.file\":\"Bestand\",\"tw.customExtensionModal.load\":\"Laden\",\"tw.customExtensionModal.promptFile\":\"Selecteer het JavaScript-bestand van de extensie:\",\"tw.customExtensionModal.promptText\":\"Plak de JavaScript-broncode van de extensie:\",\"tw.customExtensionModal.promptURL\":\"Voer de URL van de extensie in:\",\"tw.customExtensionModal.text\":\"Tekst\",\"tw.customExtensionModal.title\":\"Aangepaste Extensie Laden\",\"tw.customExtensionModal.trusted\":\"Deze extensie wordt zonder sandbox geladen omdat het afkomstig is van een vertrouwde bron.\",\"tw.customExtensionModal.unsandboxed\":\"Extensie uitvoeren zonder sandbox\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Extensies laden zonder sandbox is gevaarlijk en moet alleen worden gedaan als je weet wat je doet.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Niet-gesandboxede extensies kunnen je project beschadigen, je instellingen verwijderen, wachtwoorden phishen, en andere slechte zaken. De {APP_NAME}-ontwikkelaars zijn niet verantwoordelijk voor enige resulterende problemen.\",\"tw.customExtensionModal.untrusted\":\"Voor veiligheidsredenen worden extensies van niet-vertrouwde URL's altijd geladen met de sandbox.\",\"tw.customReporters.description\":\"Geef Mijn Blokken de mogelijkheid om waarden te hebben en te worden gebruikt als invoer.\",\"tw.customReporters.name\":\"Aangepaste Waardeblokken\",\"tw.documentation\":\"Documentatie\",\"tw.embed.persistent\":\"Indien toegestaan worden toekomstige invoegingen naar dezelfde website automatisch toegestaan.\",\"tw.embed.risks\":\"Hoewel de embed wordt gesandboxed, heeft het nog wel toegang tot informatie over je apparaat, zoals je IP-adres en algemene locatie.\",\"tw.embed.title1\":\"Het project wilt HTML-inhoud invoegen op het speelveld:\",\"tw.embed.title2\":\"Het project wilt inhoud op afstand invoegen op het speelveld:\",\"tw.extensionGallery.error\":\"Kon extensiegalerij niet laden. Ga naar extensions.turbowarp.org om meer extensies te vinden.\",\"tw.extensionGallery.loading\":\"Bezig met extensiegalerij laden...\",\"tw.extensionGallery.more\":\"Ga naar extensions.turbowarp.org om meer te weten te komen over extensies.\",\"tw.extensionGallery.name\":\"TurboWarp Extensiegalerij\",\"tw.favorite\":\"Favoriet Maken\",\"tw.featuredProjectsStudio\":\"Deze studio op Scratch laten zien.\",\"tw.feedbackButton\":\"TurboWarp-Feedback\",\"tw.fetch.title\":\"Het project wilt verbinding maken met de website:\",\"tw.fileInput.none\":\"Geen bestand geselecteerd.\",\"tw.fileInput.selected\":\"Geselecteerd: {name}\",\"tw.fonts.add\":\"Toevoegen\",\"tw.fonts.custom.file\":\"Selecteer een lettertypebestand van je computer:\",\"tw.fonts.custom.name\":\"Geef het lettertype een naam:\",\"tw.fonts.custom1\":\"Lettertype toevoegen uit een bestand\",\"tw.fonts.custom2\":\"Werkt meestal niet in Scratch. Ondersteunde formaten: {formats}\",\"tw.fonts.delete\":\"Weet je zeker dat je \\\"{font}\\\" wilt verwijderen? Elk vector-uiterlijk zal het terugvallettertype gebruiken.\",\"tw.fonts.fallback\":\"Kies een terugvallettertype als het lettertype niet kan worden geladen of is verwijderd:\",\"tw.fonts.list\":\"Geïnstalleerde lettertypen:\",\"tw.fonts.none\":\"Nog geen lettertypen toegevoegd.\",\"tw.fonts.readError\":\"Kon lettertypebestand niet lezen: {error}\",\"tw.fonts.system\":\"Systeemlettertype\",\"tw.fonts.system.name\":\"Typ de naam van elk lettertype die in je computer is ingebouwd. Het lettertype wordt misschien niet voor iedereen correct weergegeven.\",\"tw.fonts.system1\":\"Een systeemlettertype toevoegen\",\"tw.fonts.system2\":\"Kan werken in Scratch, maar wordt misschien niet voor iedereen correct weergegeven.\",\"tw.fonts.title\":\"Lettertypen\",\"tw.footer.disclaimer\":\"TurboWarp is niet aangesloten bij Scratch, het Scratch-Team, of de Scratch-organisatie.\",\"tw.footer.documentation\":\"Documentatie\",\"tw.footer.donate\":\"Doneren\",\"tw.footer.embed\":\"Invoeging\",\"tw.footer.parameters\":\"URL-Parameters\",\"tw.geolocate.permission\":\"Indien toegestaan kan je door je browser worden gevraagd om toegang tot je locatie toe te staan.\",\"tw.geolocate.title\":\"Het project wilt toegang tot je locatie.\",\"tw.gui.crashMessage.description\":\"Het spijt ons, maar het lijkt erop dat de pagina is gecrasht. Ververs je pagina om het opnieuw te proberen.\",\"tw.guiDefaultTitle\":\"Speel Scratch-projecten sneller af\",\"tw.home.credit\":\"Opmerkingen en credits\",\"tw.home.description\":\"TurboWarp is een Scratch-modificatie die projecten compileert naar JavaScript om ze heel snel te laten werken. Probeer het door hierboven een project-ID of URL in te voeren of hieronder een uitgelicht project te kiezen.\",\"tw.home.instructions\":\"Instructies\",\"tw.input.tooltip\":\"Kopieer en plak hier een link naar een Scratch-project!\",\"tw.interpolationEnabled\":\"Interpolatie\",\"tw.invalidParameters.clones\":\"\\\"clone\\\" URL parameter is ongeldig\",\"tw.invalidParameters.fps\":\"\\\"fps\\\" URL parameter is ongeldig\",\"tw.loadError\":\"Kon project niet laden: {error}\",\"tw.loadExtension.embedded\":\"Het project wilt een aangepaste extensie laden met de code:\",\"tw.loadExtension.sandboxed\":\"Hoewel de code wordt gesandboxed heeft het nog steeds toegang tot informatie van je apparaat, zoals je IP-adres en algemene locatie. Ga alleen verder als je de maker van deze extensie vertrouwt.\",\"tw.loadExtension.unsandboxed\":\"Extensie uitvoeren zonder sandbox\",\"tw.loadExtension.unsandboxedWarning\":\"Extensies laden zonder sandbox is gevaarlijk. De extensie kan je project beschadigen, je instellingen verwijderen, wachtwoorden phishen, en andere slechte zaken. De {APP_NAME}-ontwikkelaars zijn niet verantwoordelijk voor enige resulterende problemen.\",\"tw.loadExtension.url\":\"Het project wilt een aangepaste extensie laden van de URL:\",\"tw.loader.assets.known\":\"Onderdelen aan het downloaden ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Onderdelen aan het downloaden …\",\"tw.loader.data\":\"Projectgegevens aan het downloaden …\",\"tw.loader.generic\":\"Project aan het laden ...\",\"tw.menuBar.60off\":\"60 FPS-Modus Uitzetten\",\"tw.menuBar.60on\":\"60 FPS-Modus Aanzetten\",\"tw.menuBar.advanced\":\"Geavanceerd\",\"tw.menuBar.changeUsername\":\"Gebruikersnaam Veranderen\",\"tw.menuBar.cloudOff\":\"Cloudvariabelen Uitschakelen\",\"tw.menuBar.cloudOn\":\"Cloudvariabelen Inschakelen\",\"tw.menuBar.cloudUnavailable\":\"Cloudvariabelen zijn niet Beschikbaar\",\"tw.menuBar.cloudUnavailableAlert\":\"Kan geen cloudvariabelen gebruiken, waarschijnlijk omdat je de editor hebt geopend.\",\"tw.menuBar.cloudUnavailableDesktop\":\"Cloudvariabelen zijn niet beschikbaar in de desktop app.\",\"tw.menuBar.moreSettings\":\"Geavanceerde Instellingen\",\"tw.menuBar.newFramerate\":\"Nieuwe framerate:\",\"tw.menuBar.newWindow\":\"Nieuw venster\",\"tw.menuBar.package\":\"Project packagen\",\"tw.menuBar.reportError1\":\"Sommige scripts konden niet worden gecompileerd.\",\"tw.menuBar.reportError2\":\"Dit is een bug. Rapporteer het alsjeblieft.\",\"tw.menuBar.restorePoints\":\"Herstelpunten\",\"tw.menuBar.saveAs\":\"Opslaan als {file}\",\"tw.menuBar.seeInside\":\"Bekijk van binnen\",\"tw.notify.permission\":\"Indien toegestaan kan je door je browser worden gevraagd om notificaties in te schakelen, en toekomstige notificaties worden automatisch toegestaan.\",\"tw.notify.title\":\"Het project wilt notificaties weergeven.\",\"tw.oldDownload\":\"Opslaan naar apart bestand...\",\"tw.opcode.2000\":\"dagen sinds 2000\",\"tw.opcode.mousedown\":\"muis ingedrukt?\",\"tw.opcode.mousex\":\"muis x\",\"tw.opcode.mousey\":\"muis y\",\"tw.openAdvanced\":\"Geavanceerde instellingen openen\",\"tw.openWindow.dangerous\":\"Deze website is niet beoordeeld door de {APP_NAME}-ontwikkelaars. Het kan gevaarlijke of kwaadaardige code bevatten.\",\"tw.openWindow.title\":\"Het project wil een nieuw venster of tabblad openen met de URL:\",\"tw.paint.alpha\":\"Doorzichtigheid\",\"tw.paint.fonts.more\":\"Meer lettertypen toevoegen...\",\"tw.privacy\":\"Privacybeleid\",\"tw.recordAudio.permission\":\"Indien toegestaan kan je door je browser worden gevraagd om microfoontoegang in te schakelen, en toekomstige microfoontoegang wordt automatisch toegestaan.\",\"tw.recordAudio.title\":\"Het project wilt audio van je microfoon opnemen. Dit kan een tekst-transcript of ruwe audiogegevens inhouden. Het project kan audio delen met andere gebruikers of servers.\",\"tw.recordVideo.permission\":\"Indien toegestaan kan je door je browser worden gevraagd om cameratoegang in te schakelen, en toekomstige cameratoegang wordt automatisch toegestaan.\",\"tw.recordVideo.title\":\"Het project wilt video van je camera opnemen. Het project kan afbeeldingen delen met andere gebruikers of servers.\",\"tw.redirect.dangerous\":\"Deze website is niet beoordeeld door de {APP_NAME}-ontwikkelaars. Het kan gevaarlijke of kwaadaardige code bevatten.\",\"tw.redirect.title\":\"Het project wil dit tabblad doorsturen naar de URL:\",\"tw.restorePoints.1minute\":\"elke minuut\",\"tw.restorePoints.assets\":\"{n} onderdelen\",\"tw.restorePoints.confirmDelete\":\"Weet je zeker dat je \\\"{projectTitle}\\\" wilt verwijderen? Dit kan niet ongedaan worden gemaakt.\",\"tw.restorePoints.confirmDeleteAll\":\"Weet je zeker dat je ALLE herstelpunten wilt verwijderen? Dit kan niet ongedaan worden gemaakt.\",\"tw.restorePoints.confirmLoad\":\"Je hebt niet-opgeslagen wijzigingen. Wil je het bestaand project vervangen?\",\"tw.restorePoints.deleteAll\":\"Alles Verwijderen\",\"tw.restorePoints.description\":\"{APP_NAME} slaat af en toe herstelpunten op je computer op zodat je je project terug kan halen als je bent vergeten op te slaan. Dit is bedoeld als een laatste redmiddel voor herstel. Je computer kan deze herstelpunten op elk moment verwijderen. Hang NIET af van deze functie.\",\"tw.restorePoints.empty\":\"Geen herstelpunten gevonden.\",\"tw.restorePoints.error\":\"Er is een fout opgetreden bij het laden van herstelpunt: {error}\",\"tw.restorePoints.intervalOption\":\"Herstelpunten worden {time} gemaakt.\",\"tw.restorePoints.loading\":\"Bezig met laden...\",\"tw.restorePoints.minutes\":\"elke {n} minuten\",\"tw.restorePoints.never\":\"nooit\",\"tw.restorePoints.off\":\"Herstelpunten uitschakelen is gevaarlijk.\",\"tw.restorePoints.size\":\"Geschatte gebruikte opslagruimte: {size}\",\"tw.restorePoints.size2\":\"Uiterlijken en geluiden die gebruikt worden door hestelpunten worden maar één keer opgeslagen.\",\"tw.restorePoints.title\":\"Herstelpunten\",\"tw.sample\":\"Voorbeeldproject\",\"tw.saveAs\":\"Opslaan als...\",\"tw.saveTo\":\"Opslaan in {file}\",\"tw.scratchUnsafeCloud\":\"Als je deze cloudvariabele maakt, zal het project het limiet van {number} variabelen overschrijden, en sommige variabelen zullen niet goed werken als je het project uploadt naar Scratch.\",\"tw.securityManager.allow\":\"Toestaan\",\"tw.securityManager.deny\":\"Weigeren\",\"tw.securityManager.title\":\"Extensiebeveiliging\",\"tw.securityManager.trust\":\"Indien toegestaan worden toekomstige verzoeken naar dezelfde website automatisch toegestaan.\",\"tw.securityManager.why\":\"Dit kan gebruikt worden om afbeeldingen of geluiden te downloaden, multiplayer mogelijk te maken, toegang te krijgen tot een API, of misschien voor kwaadaardige bedoelingen. Dit zal je IP-adres, algemene locatie en mogelijk overige gegevens delen met de website.\",\"tw.settingsModal.customStageSize\":\"Aangepaste Speelveldgrootte:\",\"tw.settingsModal.customStageSizeHelp\":\"Verandert de grootte van het Scratch-speelveld van 480x360 naar iets anders. Probeer 640x360 voor een breed beeld. Dit werkt goed met maar heel weinig projecten.\",\"tw.settingsModal.dangerZone\":\"Gevarenzone\",\"tw.settingsModal.disableCompiler\":\"Compiler Uitschakelen\",\"tw.settingsModal.disableCompilerHelp\":\"Schakelt de TurboWarp-compiler uit. Je zou dit aan willen zetten tijdens het bewerken van projecten zodat scripts gelijk updaten. Anders zou je dit nooit aan moeten zetten.\",\"tw.settingsModal.featured\":\"Uitgelicht\",\"tw.settingsModal.fps\":\"60 FPS (Aangepaste FPS)\",\"tw.settingsModal.fpsHelp\":\"Voert scripts 60 keer per seconde uit in plaats van 30. De meeste projecten zullen niet goed werken met deze instelling. Probeer Interpolatie zonder 60 FPS als dit het geval is. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Klik voor een andere framerate dan 30 of 60\",\"tw.settingsModal.help\":\"Klik voor hulp\",\"tw.settingsModal.highQualityPen\":\"Hoge Kwaliteit-Pen\",\"tw.settingsModal.highQualityPenHelp\":\"Tekent projecten met de pen in hogere resoluties en verbetert de pen in de editor. Niet alle projecten hebben voordeel van deze instelling en het kan prestaties verslechteren.\",\"tw.settingsModal.infiniteClones\":\"Oneindig Veel Klonen\",\"tw.settingsModal.infiniteClonesHelp\":\"Schakelt het 300-klonenlimiet van Scratch uit.\",\"tw.settingsModal.interpolation\":\"Interpolatie\",\"tw.settingsModal.interpolationHelp\":\"Laat projecten er gladder uitzien door spritebewegingen te interpoleren. Interpolatie zou niet moeten worden gebruikt in 3D-projecten, raytracers, penprojecten, en trage projecten, omdat interpolatie ze juist trager maakt.\",\"tw.settingsModal.largeStageWarning\":\"Het gebruiken van een speelveld van deze grootte is niet aangeraden! Gebruik in plaats daarvan een kleinere grootte met dezelfde beeldverhouding en laat het volledig scherm-modus het vergroten om het op de weergave van de gebruiker af te stemmen.\",\"tw.settingsModal.removeFencing\":\"Waardelimieten Weghalen\",\"tw.settingsModal.removeFencingHelp\":\"Geeft sprites de mogelijkheid om van het scherm af bewegen, zo groot of klein te worden als ze maar willen, en laat blokken voor aanrakingen zelfs buiten het scherm werken.\",\"tw.settingsModal.removeLimits\":\"Limieten Weghalen\",\"tw.settingsModal.removeMiscLimits\":\"Diverse Limieten Weghalen\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Haalt geluidseffectlimieten en pengroottelimieten weg.\",\"tw.settingsModal.storeProjectOptions\":\"Instellingen opslaan in project\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Slaat de geselecteerde instellingen op in het project zodat ze automatisch zullen worden toegepast wanneer TurboWarp dit project laadt. Warp-stopwatch en compiler uitschakelen worden niet opgeslagen.\",\"tw.settingsModal.title\":\"Geavanceerde Instellingen\",\"tw.settingsModal.warpTimer\":\"Warp-Stopwatch\",\"tw.settingsModal.warpTimerHelp\":\"Controleert of scripts vastzitten in een lange of oneindige lus en voor een lage framerate zorgen in plaats van vastzitten tot de lus eindigt. Dit lost de meeste crashes op maar heeft een grote invloed op prestaties, dus het is alleen standaard ingeschakeld in de editor.\",\"tw.spriteSelectorItem.rename\":\"hernoemen\",\"tw.stereoAlert\":\"Het bewerken van dit stereogeluid zal het onomkeerbaar veranderen naar mono.\",\"tw.studioview.authorAttribution\":\"door {author}\",\"tw.studioview.error\":\"Er is een fout opgetreden tijdens het laden van de volgende pagina van projecten.\",\"tw.studioview.hoverText\":\"{title} door {author}\",\"tw.tooLarge\":\"Dit geluidsbestand is mogelijk te groot om te uploaden naar Scratch.\",\"tw.twExtension.description\":\"Gekke nieuwe blokken.\",\"tw.twExtension.name\":\"TurboWarp-Blokken\",\"tw.unfavorite\":\"Niet Favoriet Maken\",\"tw.unshared.2\":\"Voor meer informatie, bezoek: {link}\",\"tw.unshared.bug\":\"Als dit project wel gedeeld is, maak dan een bugmelding.\",\"tw.unshared.cache\":\"Als dit project recentelijk is gedeeld, kan het zijn dat dit bericht een paar minuten lang verkeerd wordt weergegeven.\",\"tw.unshared2.1\":\"Niet-gedeelde projecten zijn niet meer zichtbaar.\",\"tw.usernameModal.help\":\"Deze waarde wordt opgeslagen in de opslag van je browser. Het kan worden gelogd wanneer je iets doet met projecten met cloudvariabelen.\",\"tw.usernameModal.help2\":\"Waarden die niet corresponderen met een geldig Scratch-account worden normaal geweigerd door de cloudvariabelenserver. We raden je aan het zo te laten of het te veranderen naar je Scratch-gebruikersnaam.\",\"tw.usernameModal.mustChange\":\"Het spijt ons, maar de cloudvariabelenserver vermoedt dat je gebruikersnaam onveilig is. Verander het alsjeblieft naar iets anders of {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"reset het (aanbevolen)\",\"tw.usernameModal.new\":\"Nieuwe gebruikersnaam:\",\"tw.usernameModal.reset\":\"Resetten\",\"tw.usernameModal.title\":\"Gebruikersnaam Veranderen\",\"tw.viewFeaturedProjects\":\"Klik om uitgelichte projecten te zien.\",\"tw.viewOnScratch\":\"Dit project op Scratch laten zien\",\"tw.webglModal.description\":\"Het ziet er helaas uit dat je browser of computer {webGlLink}. Deze technologie is vereist voor deze site om goed te werken. Probeer je browser en grafische stuurprogramma's te updaten of start je computer opnieuw op.\"},\"pl\":{\"tw.alerts.creatingRestorePoint\":\"Tworzenie punktu przywracania…\",\"tw.alerts.lostPeripheralConnection\":\"Utracono połączenie do {extensionName}.\",\"tw.alerts.savedToDisk\":\"Zapisano na twoim komputerze.\",\"tw.backpack.rename\":\"Nowa nazwa:\",\"tw.blocks.addons\":\"Dodatki\",\"tw.blocks.buttonIsDown\":\"kliknięto [MOUSE_BUTTON] przycisk myszy?\",\"tw.blocks.lastKeyPressed\":\"ostatnio naciśnięty przycisk\",\"tw.blocks.mouseButton.middle\":\"(1) środkowy\",\"tw.blocks.mouseButton.primary\":\"(0) podstawowy\",\"tw.blocks.mouseButton.secondary\":\"(2) dodatkowy\",\"tw.blocks.openDocs\":\"Otwórz Dokumentację\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Nazwa użytkownika nie może zostać zmieniona, kiedy projekt jest uruchomiony\",\"tw.code\":\"Kod Źródłowy\",\"tw.customExtension.name\":\"Niestandardowe Rozszerzenie\",\"tw.customExtensionModal.file\":\"Plik\",\"tw.customExtensionModal.title\":\"Załaduj Niestandardowe Rozszerzenie\",\"tw.documentation\":\"Dokumentacja\",\"tw.extensionGallery.name\":\"Galeria Rozszerzeń TurboWarp\",\"tw.featuredProjectsStudio\":\"Zobacz studio w Scratchu.\",\"tw.feedback\":\"Opinie i Błędy\",\"tw.feedbackButton\":\"Opinia o TurboWarp\",\"tw.fetch.title\":\"Projekt chce połączyć się z:\",\"tw.fileInput.none\":\"Nie wybrano żadnego pliku.\",\"tw.fileInput.selected\":\"Wybrano: {name}\",\"tw.footer.credits\":\"Podziękowania\",\"tw.footer.disclaimer\":\"TurboWarp nie jest powiązany ze Scratch, Scratch Team, ani Scratch Foundation.\",\"tw.footer.documentation\":\"Dokumentacja\",\"tw.footer.donate\":\"Wesprzyj\",\"tw.footer.embed\":\"Osadzanie\",\"tw.footer.parameters\":\"Parametry URL\",\"tw.gui.defaultProjectTitle\":\"Projekt\",\"tw.guiDefaultTitle\":\"Uruchamiaj projekty Scratch szybciej\",\"tw.home.credit\":\"Notatki i Podziękowania\",\"tw.home.description\":\"TurboWarp to modyfikacja Scratcha która kompiluje projekty do JavaScript żeby chodziły bardzo szybko. Wypróbuj tą funkcje wprowadzając ID projektu lub jego URL powyżej lub wybierając polecany projekt poniżej.\",\"tw.home.instructions\":\"Instrukcje\",\"tw.input.tooltip\":\"Skopiuj i wklej link do projektu Scratcha tutaj!\",\"tw.interpolationEnabled\":\"Interpolacja\",\"tw.invalidParameters.clones\":\"Parametr URL \\\"clone\\\" jest nieprawidłowy\",\"tw.invalidParameters.fps\":\"Parametr URL \\\"fps\\\" jest nieprawidłowy\",\"tw.loadError\":\"Nie udało się załadować projektu: {error}\",\"tw.loader.assets.known\":\"Pobieranie zasobów ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Pobieranie zasobów ...\",\"tw.loader.data\":\"Pobieranie danych projektu ...\",\"tw.loader.generic\":\"Ładowanie projektu ...\",\"tw.menuBar.60off\":\"Wyłącz tryb 60 FPS\",\"tw.menuBar.60on\":\"Włącz tryb 60 FPS\",\"tw.menuBar.addons\":\"Dodatki\",\"tw.menuBar.advanced\":\"Zaawansowane\",\"tw.menuBar.changeUsername\":\"Zmień Nazwę Użytkownika\",\"tw.menuBar.cloudOff\":\"Wyłącz Zmienne W Chmurze\",\"tw.menuBar.cloudOn\":\"Włącz Zmienne W Chmurze\",\"tw.menuBar.cloudUnavailable\":\"Zmienne W Chmurze nie są Dostępne\",\"tw.menuBar.cloudUnavailableAlert\":\"Nie można użyć zmiennych w chmurze, najprawdopodobniej dlatego, że masz włączony edytor.\",\"tw.menuBar.moreSettings\":\"Zaawansowane Ustawienia\",\"tw.menuBar.newFramerate\":\"Nowa liczba klatek na sekundę:\",\"tw.menuBar.reportError1\":\"Nie można skompilować niektórych skryptów.\",\"tw.menuBar.reportError2\":\"To jest błąd. Proszę zgłoś to.\",\"tw.menuBar.saveAs\":\"Zapisz jako {file}\",\"tw.menuBar.seeInside\":\"Zajrzyj do środka\",\"tw.oldDownload\":\"Zapisz do osobnego pliku...\",\"tw.opcode.2000\":\"dni od 2000\",\"tw.opcode.mousedown\":\"kliknięto myszką?\",\"tw.opcode.mousex\":\"x myszy\",\"tw.opcode.mousey\":\"y myszy\",\"tw.openAdvanced\":\"Otwórz zaawansowane ustawienia\",\"tw.openWindow.dangerous\":\"Ta strona nie została zweryfikowana przez twórców {APP_NAME}. Może zawierać niebezpieczny lub złośliwy kod.\",\"tw.openWindow.title\":\"Projekt chce otworzyć nowe okno lub kartę z URL:\",\"tw.paint.alpha\":\"Nieprzezroczystość\",\"tw.privacy\":\"Polityka Prywatności\",\"tw.redirect.dangerous\":\"Ta strona nie została zweryfikowana przez twórców {APP_NAME}. Może zawierać niebezpieczny lub złośliwy kod.\",\"tw.redirect.title\":\"Projekt chce przejść na tej karcie do URL:\",\"tw.saveAs\":\"Zapisz jako...\",\"tw.saveTo\":\"Zapisz do {file}\",\"tw.securityManager.allow\":\"Zezwól\",\"tw.securityManager.title\":\"Bezpieczeństwo Rozszerzeń\",\"tw.settingsModal.customStageSize\":\"Niestandardowy Rozmiar Sceny:\",\"tw.settingsModal.customStageSizeHelp\":\"Zmienia wielkość ekranu używanego w Scratchu z 480x360 do jakiejś innej wielkości. Spróbuj 640x360 żeby zrobić ekran szerszy. Bardzo niewiele projektów poradzi sobie z tym prawidłowo.\",\"tw.settingsModal.dangerZone\":\"Niebezpieczna Strefa\",\"tw.settingsModal.disableCompiler\":\"Wyłącz Kompilator\",\"tw.settingsModal.featured\":\"Wyróżnione\",\"tw.settingsModal.fps\":\"60 FPS (Niestandardowe FPS)\",\"tw.settingsModal.fpsHelp\":\"Uruchamia skrypty 60 razy na sekundę, zamiast 30. Większość projektów nie będzie działać poprawnie z tą opcją włączoną. W takim przypadku spróbuj Interpolację z wyłączonym trybem 60 FPS. {customFramerate}\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Kliknij, aby ustawić liczbę klatek na sekundę inną niż 30 lub 60.\",\"tw.settingsModal.help\":\"Kliknij po pomoc\",\"tw.settingsModal.highQualityPen\":\"Wysokiej Jakości Pióro\",\"tw.settingsModal.highQualityPenHelp\":\"Umożliwia renderowanie pisaka z wyższą rozdzielczością, oraz wyłącza zaokrąglanie współrzędnych dla pisaka (większa dokładność). Nie wszystkie projekty pozytywnie skorzystają z tego ustawienia i może ono negatywnie wpłynąć na wydajność.\",\"tw.settingsModal.infiniteClones\":\"Nieskończone Klony\",\"tw.settingsModal.infiniteClonesHelp\":\"Wyłącza domyślny limit 300 klonów.\",\"tw.settingsModal.interpolation\":\"Interpolacja\",\"tw.settingsModal.removeFencing\":\"Usuń Ograniczenia\",\"tw.settingsModal.removeFencingHelp\":\"Pozwala duszkom poruszać się i wykrywać kolizję poza sceną oraz mieć dowolny rozmiar.\",\"tw.settingsModal.removeLimits\":\"Usuń Limity\",\"tw.settingsModal.removeMiscLimits\":\"Usuń Różne Limity\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Usuwa limity efektów dźwiękowych i rozmiaru pisaka.\",\"tw.settingsModal.storeProjectOptions\":\"Przechowaj ustawienia w projekcie\",\"tw.settingsModal.title\":\"Zaawansowane Ustawienia\",\"tw.settingsModal.warpTimer\":\"Warp Stoper\",\"tw.spriteSelectorItem.rename\":\"zmień nazwę\",\"tw.stereoAlert\":\"Edytowanie tego dźwięku stereo bezpowrotnie konwertuje go do mono.\",\"tw.studioview.authorAttribution\":\"przez {author}\",\"tw.studioview.error\":\"Wystąpił błąd przy ładowaniu następnej strony projektów.\",\"tw.studioview.hoverText\":\"{title} autorstwa {author}\",\"tw.tooLarge\":\"Ten dźwięk może być zbyt duży, aby wczytać go do Scratch.\",\"tw.twExtension.description\":\"Dziwne nowe bloki.\",\"tw.twExtension.name\":\"Bloki TurboWarp\",\"tw.unshared2.1\":\"Nieudostępnione projekty nie są już widoczne.\",\"tw.usernameModal.mustChange.resetIt\":\"zresetuj to (zalecane)\",\"tw.usernameModal.reset\":\"Resetuj\",\"tw.usernameModal.title\":\"Zmień Nazwę Użytkownika\",\"tw.viewFeaturedProjects\":\"Kliknij, aby zobaczyć polecane projekty.\",\"tw.viewOnScratch\":\"Zobacz projekt w Scratchu\"},\"pt\":{\"tw.alerts.creatingRestorePoint\":\"Criando ponto de restauração...\",\"tw.alerts.savedToDisk\":\"Salvo no seu computador.\",\"tw.backpack.rename\":\"Novo nome:\",\"tw.blocks.buttonIsDown\":\"botão [MOUSE_BUTTON] do mouse pressionado?\",\"tw.blocks.lastKeyPressed\":\"última tecla pressionada\",\"tw.blocks.mouseButton.middle\":\"(1) do meio\",\"tw.blocks.mouseButton.primary\":\"(0) primário\",\"tw.blocks.mouseButton.secondary\":\"(2) secundário\",\"tw.blocks.openDocs\":\"Abrir Documentação\",\"tw.browserModal.desc\":\"Veja se você está usando uma versão recente do Google Chrome, Mozilla Firefox, Microsoft Edge ou Apple Safari.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"O nome de usuário não pode ser alterado enquanto o projeto está em execução.\",\"tw.code\":\"Código-fonte\",\"tw.confirmIncompatibleExtension\":\"Essa extensão não é compatível com o Scratch. Projetos feitos com ela não funcionarão se você fizer upload no site do Scratch. Tem certeza que quer ativá-la?\",\"tw.customExtension.name\":\"Extensão Customizada\",\"tw.customExtensionModal.file\":\"Arquivo\",\"tw.featuredProjectsStudio\":\"Ver estúdio no Scratch.\",\"tw.feedback\":\"Feedback e bugs\",\"tw.feedbackButton\":\"Feedback do TurboWarp\",\"tw.footer.credits\":\"Créditos\",\"tw.footer.disclaimer\":\"O TurboWarp não tem afiliação com o Scratch, a Equipe do Scratch ou a Fundação Scratch.\",\"tw.footer.embed\":\"Incorporação\",\"tw.footer.parameters\":\"Parâmetros de URL\",\"tw.gui.defaultProjectTitle\":\"Projeto\",\"tw.guiDefaultTitle\":\"Rode projetos do Scratch mais rapidamente\",\"tw.home.credit\":\"Notas e Créditos\",\"tw.home.description\":\"TurboWarp é um mod do Scratch que compila projetos para JavaScript para os executar mais rapidamente. Experimente colocando um ID ou URL de projeto acima ou escolhendo um dos projetos em destaque abaixo.\",\"tw.home.instructions\":\"Instruções\",\"tw.input.tooltip\":\"Copie e cole um link de um projeto no Scratch aqui!\",\"tw.interpolationEnabled\":\"Interpolação\",\"tw.invalidParameters.clones\":\"parâmetro de URL \\\"clone\\\" é inválido\",\"tw.invalidParameters.fps\":\"parâmetro de URL \\\"fps\\\" é inválido\",\"tw.loader.assets.known\":\"Baixando recursos ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Baixando recursos ...\",\"tw.loader.data\":\"Baixando dados do projeto ...\",\"tw.loader.generic\":\"Carregando projeto …\",\"tw.menuBar.60off\":\"Desativar modo 60 FPS\",\"tw.menuBar.60on\":\"Ativar modo 60 FPS\",\"tw.menuBar.advanced\":\"Avançado\",\"tw.menuBar.changeUsername\":\"Mudar nome de usuário\",\"tw.menuBar.cloudOff\":\"Desativar variáveis na nuvem\",\"tw.menuBar.cloudOn\":\"Ativar variáveis na nuvem\",\"tw.menuBar.cloudUnavailable\":\"Variáveis na nuvem não estão disponíveis\",\"tw.menuBar.cloudUnavailableAlert\":\"Não pôde usar variáveis na nuvem, provavelmente porque você abriu o editor.\",\"tw.menuBar.moreSettings\":\"Configurações Avançadas\",\"tw.menuBar.newFramerate\":\"Novo FPS:\",\"tw.menuBar.reportError1\":\"Alguns scripts não puderam ser compilados.\",\"tw.menuBar.reportError2\":\"Isso é um bug. Por favor, reporte-o.\",\"tw.menuBar.saveAs\":\"Salvar como {file}\",\"tw.menuBar.seeInside\":\"Ver interior\",\"tw.oldDownload\":\"Salvar como arquivo separado...\",\"tw.paint.alpha\":\"Opacidade\",\"tw.privacy\":\"Política de Privacidade\",\"tw.saveAs\":\"Salvar como...\",\"tw.saveTo\":\"Salvar como {file}\",\"tw.settingsModal.customStageSize\":\"Tamanho Customizado do Palco:\",\"tw.settingsModal.customStageSizeHelp\":\"Muda o tamanho do palco do Scratch de 480x360 para outro valor. Tente 640x360 para deixar o palco em widescreen. Quase nenhum projeto irá funcionar direito com essa opção.\",\"tw.settingsModal.dangerZone\":\"Zona de Perigo\",\"tw.settingsModal.disableCompiler\":\"Desativar Compilador\",\"tw.settingsModal.disableCompilerHelp\":\"Desativa o compilador do TurboWarp. Você pode ativar isso enquanto estiver editando projetos para fazer os scripts serem atualizados imediatamente. Em qualquer outra hipótese, deixe esta opção desativada.\",\"tw.settingsModal.featured\":\"Em destaque\",\"tw.settingsModal.fps\":\"60 FPS (FPS customizado)\",\"tw.settingsModal.fpsHelp\":\"Roda scripts 60 vezes por segundo ao invés de 30. A maioria dos projetos não vão funcionar adequadamente com isso ativado. Se esse for o caso, você pode tentar usar Interpolação e desligar o modo 60 FPS. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Clique para escolher FPS além de 30 ou 60\",\"tw.settingsModal.help\":\"Ajuda\",\"tw.settingsModal.highQualityPen\":\"Caneta de Alta Qualidade\",\"tw.settingsModal.highQualityPenHelp\":\"Permite que projetos renderizem a caneta em uma qualidade melhor e reduz arredondamento de coordenadas no editor. Nem todo projeto se beneficia dessa opção, e ela pode piorar a performance.\",\"tw.settingsModal.infiniteClones\":\"Clones Infinitos\",\"tw.settingsModal.infiniteClonesHelp\":\"Desativa o limite de 300 clones do Scratch.\",\"tw.settingsModal.interpolation\":\"Interpolação\",\"tw.settingsModal.interpolationHelp\":\"Faz projetos parecerem rodar em framerates mais altas interpolando o movimento de atores. Interpolação não deve ser usada em projetos 3D, raytracers, projetos que usam caneta e projetos lagados porque a interpolação só vai fazer eles rodarem mais devagar sem deixá-los mais suaves.\",\"tw.settingsModal.largeStageWarning\":\"Não é recomendado usar um tamanho de palco tão grande! Ao invés disso, use um tamanho menor com a mesma proporção e o modo tela cheia irá aumentar o palco para preencher a tela do usuário.\",\"tw.settingsModal.removeFencing\":\"Remover Borda\",\"tw.settingsModal.removeFencingHelp\":\"Deixa atores andarem para fora da tela, ficarem grandes ou pequenos sem limitação de tamanho e permite que os blocos \\\"tocando\\\" funcionem fora dos limites do palco.\",\"tw.settingsModal.removeLimits\":\"Remover Limites\",\"tw.settingsModal.removeMiscLimits\":\"Remover Outros Limites\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Remove os limites de efeitos de som e tamanho da caneta.\",\"tw.settingsModal.storeProjectOptions\":\"Salvar configurações no projeto\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Salva suas configurações no projeto e automaticamente os aplica quando você abrir o projeto no TurboWarp. \\\"Warp timer\\\" e \\\"desativar compilador\\\" não serão salvos.\",\"tw.settingsModal.title\":\"Configurações Avançadas\",\"tw.settingsModal.warpTimerHelp\":\"Faz scripts detectarem se estão presos em um loop longo ou infinito e roda a uma framerate baixa ao invés de travar até o loop terminar. Isso conserta a maioria dos crashes mas prejudica muito a performance, então não está ativado por padrão fora do editor.\",\"tw.spriteSelectorItem.rename\":\"renomear\",\"tw.studioview.authorAttribution\":\"por {author}\",\"tw.studioview.error\":\"Erro ao carregar a próxima página de projetos.\",\"tw.studioview.hoverText\":\"{title} por {author}\",\"tw.twExtension.name\":\"Blocos do TurboWarp\",\"tw.usernameModal.help\":\"Esse valor será guardado no armazenamento do seu navegador. Projetos que contenham variáveis na nuvem podem querer registrá-lo.\",\"tw.usernameModal.help2\":\"Valores que não correspondem a uma conta válida no Scratch normalmente serão rejeitados pelo servidor de variáveis na nuvem. Recomendamos que você deixe este valor como está ou mude-o para o seu nome de usuário do Scratch.\",\"tw.usernameModal.mustChange\":\"Desculpe, o servidor de variáveis na nuvem acha que o seu nome de usuário pode ser inapropriado. Por favor, mude para outra coisa ou {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"resete-o (recomendado)\",\"tw.usernameModal.new\":\"Novo nome de usuário:\",\"tw.usernameModal.reset\":\"Redefinir\",\"tw.usernameModal.title\":\"Mudar nome de usuário\",\"tw.viewFeaturedProjects\":\"Clique para ver projetos em destaque.\",\"tw.viewOnScratch\":\"Ver projeto no Scratch\",\"tw.webglModal.description\":\"Infelizmente parece que o seu navegador ou computador {webGlLink}. Essa tecnologia é necessária para o site funcionar. Tente atualizar o seu navegador e drivers gráficos ou reiniciar o seu computador.\"},\"pt-br\":{\"tw.alerts.creatingRestorePoint\":\"Criando ponto de restauração...\",\"tw.alerts.lostPeripheralConnection\":\"Conexão com {extensionName} foi perdida.\",\"tw.alerts.savedToDisk\":\"Salvo no seu computador.\",\"tw.backpack.rename\":\"Novo nome:\",\"tw.blocks.buttonIsDown\":\"botão [MOUSE_BUTTON] do mouse pressionado?\",\"tw.blocks.lastKeyPressed\":\"última tecla pressionada\",\"tw.blocks.mouseButton.middle\":\"(1) do meio\",\"tw.blocks.mouseButton.primary\":\"(0) primário\",\"tw.blocks.mouseButton.secondary\":\"(2) secundário\",\"tw.blocks.openDocs\":\"Abrir Documentação\",\"tw.browserModal.desc\":\"Veja se você está usando uma versão recente do Google Chrome, Mozilla Firefox, Microsoft Edge ou Apple Safari.\",\"tw.cantUseCloud\":\"Embora você possa criar variáveis de nuvem, elas não funcionarão a menos que este projeto seja publicado no Scratch ou convertido usando uma ferramenta como o {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"O nome de usuário não pode ser alterado enquanto o projeto está em execução.\",\"tw.code\":\"Código-fonte\",\"tw.confirmIncompatibleExtension\":\"Essa extensão não é compatível com o Scratch. Projetos feitos com ela não funcionarão se você fizer upload no site do Scratch. Tem certeza que quer ativá-la?\",\"tw.customExtension.name\":\"Extensão Customizada\",\"tw.customExtensionModal.file\":\"Arquivo\",\"tw.customExtensionModal.load\":\"Carregar\",\"tw.customExtensionModal.title\":\"Carregar Extensão Customizada\",\"tw.documentation\":\"Documentação\",\"tw.extensionGallery.name\":\"Galeria de Extensões do TurboWarp\",\"tw.featuredProjectsStudio\":\"Ver estúdio no Scratch.\",\"tw.feedback\":\"Feedback e bugs\",\"tw.feedbackButton\":\"Feedback do TurboWarp\",\"tw.fetch.title\":\"Este projeto quer se conectar ao site: \",\"tw.fileInput.none\":\"Nenhum arquivo selecionado.\",\"tw.fileInput.selected\":\"Selecionado: {name}\",\"tw.footer.credits\":\"Créditos\",\"tw.footer.disclaimer\":\"O TurboWarp não tem afiliação com o Scratch, a Equipe do Scratch ou a Fundação Scratch.\",\"tw.footer.documentation\":\"Documentação\",\"tw.footer.donate\":\"Doar\",\"tw.footer.embed\":\"Incorporação\",\"tw.footer.parameters\":\"Parâmetros de URL\",\"tw.gui.crashMessage.description\":\"Lamentamos, mas parece que a página parou de funcionar. Por favor, renicie-a para tentar novamente.\",\"tw.gui.defaultProjectTitle\":\"Projeto\",\"tw.guiDefaultTitle\":\"Rode projetos do Scratch mais rapidamente\",\"tw.home.credit\":\"Notas e Créditos\",\"tw.home.description\":\"TurboWarp é um mod do Scratch que compila projetos para JavaScript para os executar mais rapidamente. Experimente colocando um ID ou URL de projeto acima ou escolhendo um dos projetos em destaque abaixo.\",\"tw.home.instructions\":\"Instruções\",\"tw.input.tooltip\":\"Copie e cole um link de um projeto no Scratch aqui!\",\"tw.interpolationEnabled\":\"Interpolação\",\"tw.invalidParameters.clones\":\"parâmetro de URL \\\"clone\\\" é inválido\",\"tw.invalidParameters.fps\":\"parâmetro de URL \\\"fps\\\" é inválido\",\"tw.loadError\":\"Erro ao carregar arquivo do projeto: {error}\",\"tw.loader.assets.known\":\"Baixando recursos ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Baixando recursos ...\",\"tw.loader.data\":\"Baixando dados do projeto ...\",\"tw.loader.generic\":\"Carregando projeto …\",\"tw.menuBar.60off\":\"Desativar modo 60 FPS\",\"tw.menuBar.60on\":\"Ativar modo 60 FPS\",\"tw.menuBar.advanced\":\"Avançado\",\"tw.menuBar.changeUsername\":\"Mudar nome de usuário\",\"tw.menuBar.cloudOff\":\"Desativar variáveis na nuvem\",\"tw.menuBar.cloudOn\":\"Ativar variáveis na nuvem\",\"tw.menuBar.cloudUnavailable\":\"Variáveis na nuvem não estão disponíveis\",\"tw.menuBar.cloudUnavailableAlert\":\"Não pôde usar variáveis na nuvem, provavelmente porque você abriu o editor.\",\"tw.menuBar.moreSettings\":\"Configurações Avançadas\",\"tw.menuBar.newFramerate\":\"Novo FPS:\",\"tw.menuBar.package\":\"Exportar projeto\",\"tw.menuBar.reportError1\":\"Alguns scripts não puderam ser compilados.\",\"tw.menuBar.reportError2\":\"Isso é um bug. Por favor, reporte-o.\",\"tw.menuBar.saveAs\":\"Salvar como {file}\",\"tw.menuBar.seeInside\":\"Ver interior\",\"tw.mono\":\"Monodirecional\",\"tw.oldDownload\":\"Salvar como arquivo separado...\",\"tw.opcode.2000\":\"dias desde 2000\",\"tw.opcode.mousedown\":\"mouse pressionado?\",\"tw.opcode.mousex\":\"x do mouse\",\"tw.opcode.mousey\":\"y do mouse\",\"tw.openAdvanced\":\"Abrir configurações avançadas\",\"tw.openWindow.dangerous\":\"Este site não foi revisado pelos desenvolvedores do {APP_NAME}. Pode conter códigos perigosos ou maliciosos.\",\"tw.openWindow.title\":\"Este projeto quer abrir uma nova janela ou aba para acessar a seguinte URL:\",\"tw.paint.alpha\":\"Opacidade\",\"tw.privacy\":\"Política de Privacidade\",\"tw.redirect.dangerous\":\"Este site não foi revisado pelos desenvolvedores do {APP_NAME}. Pode conter códigos perigosos ou maliciosos.\",\"tw.redirect.title\":\"O projeto deseja navegar nesta guia para o URL:\",\"tw.restorePoints.loading\":\"Carregando.\",\"tw.saveAs\":\"Salvar como...\",\"tw.saveTo\":\"Salvar como {file}\",\"tw.scratchUnsafeCloud\":\"Se você criar essa variável de nuvem, o projeto excederá o limite de {number} variáveis do Scratch e algumas variáveis não funcionarão se você enviar o projeto para o Scratch.\",\"tw.securityManager.allow\":\"Permitir\",\"tw.securityManager.deny\":\"Negar\",\"tw.securityManager.title\":\"Segurança de Extensão\",\"tw.securityManager.why\":\"Isso pode ser usado para baixar imagens ou sons, implementar mecânicas de multiplayer, acessar uma API ou para fins maliciosos. Isso compartilhará seu endereço IP, localização geral e possivelmente outros dados com o site.\",\"tw.settingsModal.customStageSize\":\"Tamanho Customizado do Palco:\",\"tw.settingsModal.customStageSizeHelp\":\"Muda o tamanho do palco do Scratch de 480x360 para outro valor. Tente 640x360 para deixar o palco em widescreen. Quase nenhum projeto irá funcionar direito com essa opção.\",\"tw.settingsModal.dangerZone\":\"Zona de Perigo\",\"tw.settingsModal.disableCompiler\":\"Desativar compilador\",\"tw.settingsModal.disableCompilerHelp\":\"Desabilita o compilador do TurboWarp. Você pode ligar isso enquanto estiver editando projetos para fazer os scripts serem atualizados imediatamente. Em qualquer outra hipótese, deixe esta opção desativada.\",\"tw.settingsModal.featured\":\"Em destaque\",\"tw.settingsModal.fps\":\"60 FPS (FPS customizado)\",\"tw.settingsModal.fpsHelp\":\"Roda scripts 60 vezes por segundo ao invés de 30. A maioria dos projetos não vão funcionar adequadamente com isso ativado. Se esse for o caso, você pode tentar usar Interpolação e desligar o modo 60 FPS. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Clique para escolher FPS além de 30 ou 60\",\"tw.settingsModal.help\":\"Ajuda\",\"tw.settingsModal.highQualityPen\":\"Caneta de Alta Qualidade\",\"tw.settingsModal.highQualityPenHelp\":\"Permite que projetos renderizem a caneta em uma qualidade melhor e reduz arredondamento de coordenadas no editor. Nem todo projeto se beneficia dessa opção, e ela pode piorar a performance.\",\"tw.settingsModal.infiniteClones\":\"Clones Infinitos\",\"tw.settingsModal.infiniteClonesHelp\":\"Desativa o limite de 300 clones do Scratch.\",\"tw.settingsModal.interpolation\":\"Interpolação\",\"tw.settingsModal.interpolationHelp\":\"Faz projetos parecerem rodar em framerates mais altas interpolando o movimento de atores. Interpolação não deve ser usada em projetos 3D, raytracers, projetos que usam caneta e projetos lagados porque a interpolação só vai fazer eles rodarem mais devagar sem deixá-los mais suaves.\",\"tw.settingsModal.largeStageWarning\":\"Não é recomendado usar um tamanho de palco tão grande! Ao invés disso, use um tamanho menor com a mesma proporção e o modo tela cheia irá aumentar o palco para preencher a tela do usuário.\",\"tw.settingsModal.removeFencing\":\"Remover Borda\",\"tw.settingsModal.removeFencingHelp\":\"Deixa atores andarem para fora da tela, ficarem grandes ou pequenos sem limitação de tamanho e permite que os blocos \\\"tocando\\\" funcionem fora dos limites do palco.\",\"tw.settingsModal.removeLimits\":\"Remover Limites\",\"tw.settingsModal.removeMiscLimits\":\"Remover Outros Limites\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Remove os limites de efeitos de som e tamanho da caneta.\",\"tw.settingsModal.storeProjectOptions\":\"Salvar configurações no projeto\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Salva suas configurações no projeto e automaticamente os aplica quando você abrir o projeto no TurboWarp. \\\"Warp timer\\\" e \\\"desativar compilador\\\" não serão salvos.\",\"tw.settingsModal.title\":\"Configurações Avançadas\",\"tw.settingsModal.warpTimerHelp\":\"Faz scripts detectarem se estão presos em um loop longo ou infinito e roda a uma framerate baixa ao invés de travar até o loop terminar. Isso conserta a maioria dos crashes mas prejudica muito a performance, então não está ativado por padrão fora do editor.\",\"tw.spriteSelectorItem.rename\":\"renomear\",\"tw.stereo\":\"Estéreo\",\"tw.stereoAlert\":\"Editar este som estéreo irá convertê-lo irreversivelmente em mono.\",\"tw.studioview.authorAttribution\":\"por {author}\",\"tw.studioview.error\":\"Erro ao carregar a próxima página de projetos.\",\"tw.studioview.hoverText\":\"{title} por {author}\",\"tw.tooLarge\":\"Esse som excede os limites de tamanho de sons do Scratch.\",\"tw.twExtension.description\":\"Novos blocos estranhos.\",\"tw.twExtension.name\":\"Blocos do TurboWarp\",\"tw.unshared.2\":\"Para mais informações, visite: {link}\",\"tw.unshared.bug\":\"Se este projeto estiver compartilhado, por favor denuncie o bug.\",\"tw.unshared.cache\":\"Se o projeto foi compartilhado recentemente, esta mensagem pode aparecer indevidamente por alguns minutos.\",\"tw.unshared2.1\":\"Projetos descompartilhados não são mais acessíveis.\",\"tw.usernameModal.help\":\"Esse valor será guardado no armazenamento do seu navegador. Projetos que contenham variáveis na nuvem podem querer registrá-lo.\",\"tw.usernameModal.help2\":\"Valores que não correspondem a uma conta válida no Scratch normalmente serão rejeitados pelo servidor de variáveis na nuvem. Recomendamos que você deixe este valor como está ou mude-o para o seu nome de usuário do Scratch.\",\"tw.usernameModal.mustChange\":\"Desculpe, o servidor de variáveis na nuvem acha que o seu nome de usuário possa ser inapropriado. Por favor, mude para outra coisa ou {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"resete-o (recomendado)\",\"tw.usernameModal.reset\":\"Redefinir\",\"tw.usernameModal.title\":\"Mudar nome de usuário\",\"tw.viewFeaturedProjects\":\"Clique para ver projetos em destaque.\",\"tw.viewOnScratch\":\"Ver projeto no Scratch\",\"tw.webglModal.description\":\"Infelizmente parece que o seu navegador ou computador {webGlLink}. Essa tecnologia é necessária para o site funcionar. Tente atualizar o seu navegador e drivers gráficos ou reiniciar o seu computador.\"},\"ro\":{\"tw.alerts.creatingRestorePoint\":\"Se creează punctul de recuperare…\",\"tw.alerts.savedToDisk\":\"Salvat pe calculatorul tău.\",\"tw.blocks.addons\":\"Extensii\",\"tw.blocks.buttonIsDown\":\"butonul mouse-ului [MOUSE_BUTTON] apăsat?\",\"tw.blocks.lastKeyPressed\":\"ultima tastă apăsată\",\"tw.blocks.mouseButton.middle\":\"(1) mijloc\",\"tw.blocks.mouseButton.primary\":\"(0) principal\",\"tw.blocks.mouseButton.secondary\":\"(2) secundar\",\"tw.blocks.openDocs\":\"Deschide Documentarea\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Numele de utilizator nu poate fi schimbat cât timp proiectul rulează.\",\"tw.code\":\"Cod sursă\",\"tw.featuredProjectsStudio\":\"Vezi atilierul pe Scratch.\",\"tw.feedback\":\"Sugestii și Erori\",\"tw.feedbackButton\":\"Spune-ți Părerea despre TurboWarp\",\"tw.footer.credits\":\"Credite\",\"tw.footer.disclaimer\":\"TurboWarp nu este conectat cu Scratch, Echipa Scratch, sau Fundația Scratch.\",\"tw.footer.embed\":\"Încorporare\",\"tw.footer.parameters\":\"Parametri URL\",\"tw.fps\":\"{framerate} Cadre Pe Secundă\",\"tw.gui.defaultProjectTitle\":\"Proiect\",\"tw.guiDefaultTitle\":\"Rulează proiecte Scratch mai rapid\",\"tw.home.credit\":\"Observații și Credite\",\"tw.home.description\":\"TurboWarp este un modul pentru Scratch care care compilează (transpune) proiectele în JavaScript pentru a le rula foarte rapid. Încearcă-l prin scrierea ID-ului sau URL-ului unui proiect în caseta de mai sus sau alege unul dintre proiectele recomandate de mai jos.\",\"tw.home.instructions\":\"Instrucțiuni\",\"tw.invalidParameters.clones\":\"parametrul URL „clone” este invalid\",\"tw.invalidParameters.fps\":\"parametrul URL „fps” este invalid\",\"tw.loader.generic\":\"Se încarcă proiectul …\",\"tw.menuBar.60off\":\"Oprește modul de 60 Cadre Pe Secundă (FPS)\",\"tw.menuBar.60on\":\"Pornește modul de 60 Cadre Pe Secundă (FPS)\",\"tw.menuBar.addons\":\"Extensii\",\"tw.menuBar.advanced\":\"Avansat\",\"tw.menuBar.changeUsername\":\"Schimbă Utilizatorul\",\"tw.menuBar.cloudOff\":\"Oprește Variabilele Cloud\",\"tw.menuBar.cloudOn\":\"Pornește Variabilele Cloud\",\"tw.menuBar.cloudUnavailable\":\"Variabilele Cloud nu sunt valabile\",\"tw.menuBar.cloudUnavailableAlert\":\"Nu se pot folosi variabilele cloud, cel mai probabil deoarece ai deschis editorul.\",\"tw.menuBar.newFramerate\":\"Cadre Pe Secundă:\",\"tw.menuBar.reportError1\":\"Unele script-uri nu au putut fi compilate (transpuse)\",\"tw.menuBar.reportError2\":\"Aceasta este o eroare. Vă rugăm s-o raportați.\",\"tw.menuBar.saveAs\":\"Salvează ca {file}\",\"tw.menuBar.seeInside\":\"Vezi în interior\",\"tw.privacy\":\"Politica de Confidențialitate\",\"tw.settingsModal.disableCompiler\":\"Oprește Compilerul\",\"tw.studioview.authorAttribution\":\"de {author}\",\"tw.studioview.error\":\"A apărut o eroare la încărcarea paginii urmatoare cu proiecte.\",\"tw.studioview.hoverText\":\"{title} de {author}\",\"tw.twExtension.name\":\"Blocuri TurboWarp\",\"tw.usernameModal.new\":\"Nume de utilizator nou:\",\"tw.usernameModal.reset\":\"Resetează\",\"tw.usernameModal.title\":\"Schimbă Utilizatorul\",\"tw.viewFeaturedProjects\":\"Vezi proiectele recomandate (dați click).\",\"tw.webglModal.description\":\"Din păcate se pare că browserul sau calculatorul tău {webGlLink}. Această tehnologie trebuie să existe ca acest site să ruleze. Încearcă să-ți actualizezi browserul și discurile de grafici sau repornește-ți calculatorul.\"},\"ru\":{\"tw.alerts.creatingRestorePoint\":\"Создание точки восстановления...\",\"tw.alerts.lostPeripheralConnection\":\"Потеря соединения с {extensionName}.\",\"tw.alerts.savedToDisk\":\"Сохранено на ваш компьютер.\",\"tw.backpack.rename\":\"Новое имя:\",\"tw.blocks.addons\":\"Аддоны\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] кнопка мыши нажата?\",\"tw.blocks.lastKeyPressed\":\"последняя нажатая клавиша\",\"tw.blocks.mouseButton.middle\":\"(1) средняя\",\"tw.blocks.mouseButton.primary\":\"(0) основная\",\"tw.blocks.mouseButton.secondary\":\"(2) дополнительная\",\"tw.blocks.openDocs\":\"Открыть документацию\",\"tw.browserModal.desc\":\"Убедитесь, что Вы используете последнюю версию Google Chrome, Mozilla Firefox, Microsoft Edge или Apple Safari.\",\"tw.cantUseCloud\":\"Хотя вы можете создавать облачные переменные, они не будут работать до тех пор, пока проект не будет загружен в Scratch или преобразован с помощью такого инструмента, как {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Имя пользователя не может быть изменено, пока проект запущен.\",\"tw.code\":\"Исходный код\",\"tw.confirmIncompatibleExtension\":\"Это дополнение не совместимо со Scratch. Проекты, которые используют это дополнение, не могут быть опубликованы на сайт Scratch. Вы уверены, что хотите включить это дополнение?\",\"tw.customExtension.name\":\"Пользовательское дополнение\",\"tw.customExtensionModal.file\":\"Файл\",\"tw.featuredProjectsStudio\":\"Посмотреть студию на Scratch.\",\"tw.feedback\":\"Обратная связь и ошибки\",\"tw.feedbackButton\":\"Обратная связь\",\"tw.footer.credits\":\"Благодарности\",\"tw.footer.disclaimer\":\"TurboWarp не связан с Scratch, Командой Scratch или Фондом Scratch .\",\"tw.footer.donate\":\"Пожертвование\",\"tw.footer.embed\":\"Встраивание\",\"tw.footer.parameters\":\"Параметры URL\",\"tw.gui.crashMessage.description\":\"Нам очень жаль, но похоже, что страница дала сбой. Пожалуйста, обновите страницу, чтобы повторить попытку.\",\"tw.gui.defaultProjectTitle\":\"Проект\",\"tw.guiDefaultTitle\":\"Запускайте проекты Scratch быстрее\",\"tw.home.credit\":\"Примечания и благодарности\",\"tw.home.description\":\"TurboWarp - это мод Scratch, который компилирует проекты в JavaScript, чтобы они работали быстрее. Попробуйте ввести ссылку на проект выше или выберете из избранных проектов ниже.\",\"tw.home.instructions\":\"Инструкции\",\"tw.input.tooltip\":\"Скопируйте ссылку на проект Scratch и вставьте её сюда!\",\"tw.interpolationEnabled\":\"Интерполяция\",\"tw.invalidParameters.clones\":\"Параметр \\\"clone\\\" в URL некорректен\",\"tw.invalidParameters.fps\":\"Параметр \\\"fps\\\" в URL некорректен\",\"tw.loadError\":\"Не удалось загрузить проект: {error}\",\"tw.loader.assets.known\":\"Скачивание ресурсов ({complete} / {total}) ...\",\"tw.loader.assets.unknown\":\"Скачивание ресурсов …\",\"tw.loader.data\":\"Загрузка данных проекта ...\",\"tw.loader.generic\":\"Загрузка проекта ...\",\"tw.menuBar.60off\":\"Выключить режим 60 FPS\",\"tw.menuBar.60on\":\"Включить режим 60 FPS\",\"tw.menuBar.addons\":\"Аддоны\",\"tw.menuBar.advanced\":\"Дополнительно\",\"tw.menuBar.changeUsername\":\"Изменить имя пользователя\",\"tw.menuBar.cloudOff\":\"Отключить облачные переменные\",\"tw.menuBar.cloudOn\":\"Включить облачные переменные\",\"tw.menuBar.cloudUnavailable\":\"Облачные переменные недоступны\",\"tw.menuBar.cloudUnavailableAlert\":\"Невозможно использовать облачные переменные, скорее всего, потому, что вы открыли редактор.\",\"tw.menuBar.moreSettings\":\"Расширенные настройки\",\"tw.menuBar.newFramerate\":\"Новая частота кадров:\",\"tw.menuBar.package\":\"Упаковать проект\",\"tw.menuBar.reportError1\":\"Некоторые скрипты не могут быть скомпилированы.\",\"tw.menuBar.reportError2\":\"Это ошибка. Пожалуйста, сообщите о ней.\",\"tw.menuBar.saveAs\":\"Сохранить как {file}\",\"tw.menuBar.seeInside\":\"Войти внутрь проекта\",\"tw.mono\":\"Моно\",\"tw.oldDownload\":\"Сохранить в отдельный файл...\",\"tw.opcode.2000\":\"дней с 2000 года\",\"tw.opcode.mousedown\":\"мышка нажата?\",\"tw.opcode.mousex\":\"мышка по x\",\"tw.opcode.mousey\":\"мышка по y\",\"tw.openAdvanced\":\"Открыть дополнительные настройки\",\"tw.paint.alpha\":\"Непрозрачность\",\"tw.privacy\":\"Политика конфиденциальности\",\"tw.saveAs\":\"Сохранить как...\",\"tw.saveTo\":\"Сохранить в {file}\",\"tw.scratchUnsafeCloud\":\"Если вы сделаете эту облачную переменную, проект превысит лимит Scratch в {number} переменных, и некоторые переменные не будут работать, если вы загрузите проект в Scratch.\",\"tw.settingsModal.customStageSize\":\"Пользовательский размер сцены:\",\"tw.settingsModal.customStageSizeHelp\":\"Изменяет размер сцены из 480х360 на что-то другое. Попробуйте использовать 640х360, чтобы сделать сцену широкоэкранной. Лишь некоторые проекты будут работать правильно с этой настройкой.\",\"tw.settingsModal.dangerZone\":\"Опасная зона\",\"tw.settingsModal.disableCompiler\":\"Отключить компилятор\",\"tw.settingsModal.disableCompilerHelp\":\"Отключает компилятор TurboWarp. Рекомендуется включать эту настройку, когда вы редактируете проект, чтобы скрипты обновлялись моментально. В других случаях, не включайте эту настройку.\",\"tw.settingsModal.featured\":\"Избранное\",\"tw.settingsModal.fps\":\"60 FPS (Пользовательские FPS)\",\"tw.settingsModal.fpsHelp\":\"Выполняет скрипты 60 раз в секунду вместо 30. Большинство проектов не будут работать должным образом, если этот параметр включен. Если это так, вам следует попробовать интерполяцию с отключенным режимом 60 FPS. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Нажмите, чтобы использовать частоту кадров другую, чем 30 или 60\",\"tw.settingsModal.help\":\"Нажмите для справки\",\"tw.settingsModal.highQualityPen\":\"Перо в высоком качестве\",\"tw.settingsModal.highQualityPenHelp\":\"Позволяет выполнять рендеринг проектов пера с более высоким разрешением и отключает некоторое округление координат в редакторе. Этот параметр полезен не для всех проектов, и это может повлиять на производительность.\",\"tw.settingsModal.infiniteClones\":\"Бесконечные клоны\",\"tw.settingsModal.infiniteClonesHelp\":\"Отключает ограничение Scratch в 300 клонов.\",\"tw.settingsModal.interpolation\":\"Интерполяция\",\"tw.settingsModal.interpolationHelp\":\"Делает, чтобы проекты производились более плавно, интерполируя движение спрайтов. Не используйте интерполяцию в 3D проектах, проектах с трассировкой лучей, проектах, выполненных пером и медленных проектах, интерполяция сделает их медленнее и не сделает их более плавными.\",\"tw.settingsModal.largeStageWarning\":\"Использовать настолько большой пользовательский размер сцены не рекомендуется! Лучше, используйте сцену меньшего размера, но с таким же соотношением сторон изображения и дайте полноэкранному режиму увеличить сцену так, чтобы она могла подойти по размерам к дисплею пользователя.\",\"tw.settingsModal.removeFencing\":\"Убрать рамку\",\"tw.settingsModal.removeFencingHelp\":\"Позволяет спрайтам выходить за рамки сцены, становится настолько большими или маленькими, насколько они захотят, и делает, чтобы блоки касания работали за рамками сцены.\",\"tw.settingsModal.removeLimits\":\"Убрать ограничения\",\"tw.settingsModal.removeMiscLimits\":\"Удалить Разные Ограничения\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Убирает лимиты звуков и размера пера.\",\"tw.settingsModal.storeProjectOptions\":\"Сохранить настройки проекта\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Сохранение выбранных настроек в проекте, чтобы они автоматически применялись при загрузке этого проекта TurboWarp'ом. Warp-таймер и отключение компилятора не будут сохранены.\",\"tw.settingsModal.title\":\"Расширенные настройки\",\"tw.settingsModal.warpTimer\":\"Warp таймер\",\"tw.settingsModal.warpTimerHelp\":\"Проверяет, какие скрипты застряли в долгом или бесконечном цикле и понижает частоту кадров, вместо того, чтобы он застыл пока цикл не завершится. Исправляет большую часть критических ошибок, но это негативно отражается на скорости проекта, поэтому он включается по умолчанию только в редакторе.\",\"tw.spriteSelectorItem.rename\":\"переименовать\",\"tw.stereo\":\"Стерео\",\"tw.stereoAlert\":\"Редактирование этого стерео звука необратимо преобразует его в моно звук.\",\"tw.studioview.authorAttribution\":\"от {author}\",\"tw.studioview.error\":\"Произошла ошибка во время загрузки следующей страницы проектов.\",\"tw.studioview.hoverText\":\"{title} от {author}\",\"tw.tooLarge\":\"Этот звук может быть слишком большим для загрузки в Scratch.\",\"tw.twExtension.name\":\"Блоки TurboWarp\",\"tw.unshared.2\":\"Для получения большей информации посетите этот сайт: {link}\",\"tw.unshared.cache\":\"Если проект был опубликован недавно, то это сообщение может ложно отображаться в течение нескольких минут.\",\"tw.usernameModal.help\":\"Это значение будет сохранено в данных вашего браузера. Оно будет использоваться, когда вы используете проекты, в которых есть облачные переменные.\",\"tw.usernameModal.help2\":\"Значения, которые не соответствуют настоящим именам пользователя будут заблокированными сервером облачных переменных. Мы рекомендуем оставлять это значение, которым оно есть или изменять его на своё имя пользователя в Scratch.\",\"tw.usernameModal.mustChange\":\"Извините, сервер облачных переменных считает, что ваше имя пользователя может быть небезопасным. Измените имя пользователя на другое или {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"сбросьте его (рекомендуется)\",\"tw.usernameModal.reset\":\"Сбросить\",\"tw.usernameModal.title\":\"Изменить имя пользователя\",\"tw.viewFeaturedProjects\":\"Нажмите, чтобы посмотреть избранные проекты.\",\"tw.viewOnScratch\":\"Посмотреть проект на Scratch\",\"tw.webglModal.description\":\"Похоже, ваш компьютер или браузер {webGlLink}. Эта технология нужна для работы TurboWarp. Попробуйте обновить драйвера и ваш браузер или перезагрузить компьютер.\"},\"sl\":{\"tw.alerts.creatingRestorePoint\":\"Ustvarjanje obnovitvene različice...\",\"tw.alerts.savedToDisk\":\"Shranjeno na računalnik.\",\"tw.backpack.rename\":\"Novo ime:\",\"tw.blocks.addons\":\"Dodatki\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] miškina tipka pritisnjena?\",\"tw.blocks.lastKeyPressed\":\"zadnja pritisnjena tipka\",\"tw.blocks.mouseButton.middle\":\"(1) srenja\",\"tw.blocks.mouseButton.primary\":\"(0) glavna\",\"tw.blocks.mouseButton.secondary\":\"(2) sekundarna\",\"tw.blocks.openDocs\":\"Odpri dokumentacijo\",\"tw.browserModal.desc\":\"Prepričajte se, da uporabljate sodobno različico brskalnika Google Chrome, Mozilla Firefox, Microsoft Edge ali Apple Safari.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Uporabniškega imena ni mogoče spremeniti med izvajanjem projekta.\",\"tw.code\":\"Izvirna koda\",\"tw.confirmIncompatibleExtension\":\"Ta razširitev ni združljiva s Scratchem. Projektov, narejenih z njo, ni mogoče naložiti na Scratchevo spletno stran. Ste prepričani, da jo želite vključiti?\",\"tw.customExtension.name\":\"Razširitev po meri\",\"tw.customExtensionModal.file\":\"Datoteka\",\"tw.featuredProjectsStudio\":\"Ogled studia na Scratchu.\",\"tw.feedback\":\"Povratne informacije in napake\",\"tw.feedbackButton\":\"Povratne informacije za TurboWarp\",\"tw.footer.credits\":\"Zasluge\",\"tw.footer.disclaimer\":\"TurboWarp ni povezan s Scratchem, skupino Scratch ali fundacijo Scratch.\",\"tw.footer.donate\":\"Prispevaj\",\"tw.footer.embed\":\"Vgraditev\",\"tw.footer.parameters\":\"URL parametri\",\"tw.gui.crashMessage.description\":\"Žal je videti, da je na tej strani prišlo do napake. Prosimo, da znova naložite stran, če želite poskusiti znova.\",\"tw.gui.defaultProjectTitle\":\"Projekt\",\"tw.guiDefaultTitle\":\"Izvedite Scratcheve projekte hitreje\",\"tw.home.credit\":\"Opombe in zasluge\",\"tw.home.description\":\"TurboWarp je spremenjena različica Scratcha, ki prevede projekte v JavaScript, da delujejo zelo hitro. Preizkusite ga tako, da zgoraj vnesete ID ali URL projekta ali pa spodaj izberete enega od izpostavljenih projektov.\",\"tw.home.instructions\":\"Navodila\",\"tw.input.tooltip\":\"Prilepite povezavo na Scratchev projekt sem!\",\"tw.interpolationEnabled\":\"Interpolacija\",\"tw.invalidParameters.clones\":\"Parameter \\\"clone\\\" v URL-ju ni veljaven\",\"tw.invalidParameters.fps\":\"Parameter \\\"fps\\\" v URL-ju ni veljaven\",\"tw.loadError\":\"Nalaganje projekta ni uspelo:{error}\",\"tw.loader.assets.known\":\"Nalaganje projekta ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Nalaganje projekta ...\",\"tw.loader.data\":\"Nalaganje podatkov projekta ...\",\"tw.loader.generic\":\"Nalaganje projekta ...\",\"tw.menuBar.60off\":\"Izključi 60 FPS način\",\"tw.menuBar.60on\":\"Vključi 60 FPS način\",\"tw.menuBar.addons\":\"Dodatki\",\"tw.menuBar.advanced\":\"Napredno\",\"tw.menuBar.changeUsername\":\"Spremeni uporabniško ime\",\"tw.menuBar.cloudOff\":\"Onemogoči spremenljivke v oblaku\",\"tw.menuBar.cloudOn\":\"Omogoči spremenljivke v oblaku\",\"tw.menuBar.cloudUnavailable\":\"Spremenljivke v oblaku niso na voljo\",\"tw.menuBar.cloudUnavailableAlert\":\"Ni mogoče uporabiti spremenljivk v oblaku, verjetno zato, ker ste odprli urejevalnik\",\"tw.menuBar.moreSettings\":\"Napredne nastavitve\",\"tw.menuBar.newFramerate\":\"Nov FPS:\",\"tw.menuBar.reportError1\":\"Nekaterih skript ni bilo mogoče prevesti.\",\"tw.menuBar.reportError2\":\"To je napaka. Prosimo, da jo prijavite.\",\"tw.menuBar.saveAs\":\"Shrani kot {file}\",\"tw.menuBar.seeInside\":\"Poglej v\",\"tw.oldDownload\":\"Shrani v ločeno datoteko...\",\"tw.openAdvanced\":\"Odpri napredne nastavitve\",\"tw.paint.alpha\":\"Neprosojnost\",\"tw.privacy\":\"Politika zasebnosti\",\"tw.saveAs\":\"Shrani kot...\",\"tw.saveTo\":\"Shrani v {file}\",\"tw.scratchUnsafeCloud\":\"Če naredite to spremenljivko v oblaku, bo projekt prekoračil Scratchevo omejitev {number} spremenljivk. Nekatere spremenljivke ne bodo delovale, če projekt naložite v Scratch.\",\"tw.settingsModal.customStageSize\":\"Velikost odra po meri:\",\"tw.settingsModal.customStageSizeHelp\":\"Spremeni velikost Scratchevega odra iz običajne 480x360. Poskusite 640x360 za širokozaslonski prikaz. Samo zelo redki projekti se pravilno prilagodijo tej nastavitvi.\",\"tw.settingsModal.dangerZone\":\"Nevarno območje\",\"tw.settingsModal.disableCompiler\":\"Onemogoči prevajalnik\",\"tw.settingsModal.disableCompilerHelp\":\"Izključi TurboWarpov prevajalnik. Morda boste to potrebovali med urejanjem projektov, da se skripte takoj posodobijo. Sicer je bolje, da te možnosti ne vključite.\",\"tw.settingsModal.featured\":\"Izpostavljeno\",\"tw.settingsModal.fps\":\"60 FPS (FPS po meri)\",\"tw.settingsModal.fpsHelp\":\"Izvede skripte 60-krat na sekundo namesto 30-krat. Večina projektov ne deluje pravilno, če je ta nastavitev omogočena. V tem primeru preizkusite interpolacijo namesto 60 FPS načina. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Kliknite, da uporabite hitrost, ki ni 30 ali 60 FPS\",\"tw.settingsModal.help\":\"Kliknite za pomoč\",\"tw.settingsModal.highQualityPen\":\"Visoka ločljivost svinčnika\",\"tw.settingsModal.highQualityPenHelp\":\"Poveča ločljivost projektov, ki uporabljajo razširitev Svinčnik, in odstrani zaokroževanje koordinat v urejevalniku. Ta nastavitev ni primerna za vse projekte in lahko vpliva na hitrost delovanja.\",\"tw.settingsModal.infiniteClones\":\"Neskončno klonov\",\"tw.settingsModal.infiniteClonesHelp\":\"Odstrani Scratchevo omejitev 300 klonov.\",\"tw.settingsModal.interpolation\":\"Interpolacija\",\"tw.settingsModal.interpolationHelp\":\"S pomočjo interpolacije naredi gibanje figur bolj tekoče. Interpolacije ne uporabljajte za 3D projekte, projekte, ki uporabljajo svinčnik in počasne projekte. Zaradi interpolacije delovali počasneje, ne da bi izgledali bolje.\",\"tw.settingsModal.largeStageWarning\":\"Uporaba tako velikega odra ni priporočena! Namesto tega nastavite manjšo velikost z istim razmerjem stranic, saj jo bo celozaslonski način povečal, da jo prilagodi uporabnikovemu zaslonu.\",\"tw.settingsModal.removeFencing\":\"Odstrani omejitve premikanja figur\",\"tw.settingsModal.removeFencingHelp\":\"Omogoči figuram, da se premaknejo ven iz odra in postanejo poljubno velike ali majhne ter omogoči uporabo blokov za zaznavanje dotikanja zunaj odra.\",\"tw.settingsModal.removeLimits\":\"Odstrani omejitve\",\"tw.settingsModal.removeMiscLimits\":\"Odstrani razne omejitve\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Odstrani omejitve zvočnih učinkov in velikosti svinčnika.\",\"tw.settingsModal.storeProjectOptions\":\"Shrani nastavitve v projektu\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Shrani izbrane nastavitve v projektu. TurboWarp jih bo uporabil, ko naslednjič naloži ta projekt. Warp timer in onemogočen prevajalnik ne bosta shranjena.\",\"tw.settingsModal.title\":\"Napredne nastavitve\",\"tw.settingsModal.warpTimerHelp\":\"Preveri, če pride do dolge ali neskončne zanke, in v tem primeru zmanjša hitrost osveževanja zaslona, namesto da bi skripto zamrznil. To pogosto prepreči sesutje, vendar vpliva na hitrost projekta, zato običajno ni vključeno zunaj urejevalnika.\",\"tw.spriteSelectorItem.rename\":\"preimenuj\",\"tw.studioview.authorAttribution\":\"{author}\",\"tw.studioview.error\":\"Pri nalaganju naslednje strani projektov je prišlo do napake.\",\"tw.studioview.hoverText\":\"{title} avtorja {author}\",\"tw.twExtension.name\":\"TurboWarpovi bloki\",\"tw.unshared.2\":\"Za več informacij obiščite: {link}\",\"tw.usernameModal.help\":\"Ta vrednost bo shranjena v vašem brskalniku. Morda bo zapisana med uporabo projektov, ki vsebujejo spremenljivke v oblaku.\",\"tw.usernameModal.help2\":\"Vrednosti, ki se ne ujemajo z obstoječim računom na Scratchu, bo strežnik za spremenljivke v oblaku običajno zavrnil. Priporočamo, da te nastavitve ne spreminjate ali pa uporabite svoje uporabniško ime na Scratchu.\",\"tw.usernameModal.mustChange\":\"Strežnik za spremenljivke v oblaku misli, da vaše uporabniško ime morda ni varno. Prosimo, daga spremenite ali {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"ga ponastavite (priporočeno)\",\"tw.usernameModal.reset\":\"Ponastavi\",\"tw.usernameModal.title\":\"Spremeni uporabniško ime\",\"tw.viewFeaturedProjects\":\"Kliknite za ogled izpostavljenih projektov.\",\"tw.viewOnScratch\":\"Ogled projekta na Scratchu\",\"tw.webglModal.description\":\"Žal je videti, da vaš brskalnik ali računalnik ne podpira {webGlLink}. Ta stran potrebuje to tehnologijo za delovanje. Poskusite posodobiti svoj brskalnik in gonilnike ali znova zagnati svoj računalnik.\"},\"sr\":{\"tw.alerts.creatingRestorePoint\":\"Прављење тачке враћања...\",\"tw.alerts.savedToDisk\":\"Сачувано на вашем компјутеру.\",\"tw.backpack.rename\":\"Ново име:\",\"tw.blocks.addons\":\"Додаци\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] миш притиснут?\",\"tw.blocks.lastKeyPressed\":\"последњи притиснут тастер\",\"tw.blocks.mouseButton.middle\":\"(1) средњи\",\"tw.blocks.mouseButton.primary\":\"(0) примарни\",\"tw.blocks.mouseButton.secondary\":\"(2) секундарни\",\"tw.blocks.openDocs\":\"Отвори документацију\",\"tw.browserModal.desc\":\"Проверите да ли користите најновију верзију Google Chrome, Mozilla Firefox, Microsoft Edge или Apple Safari прегледача.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Корисничко име се не може мењати док пројекат ради.\",\"tw.code\":\"Изворни код\",\"tw.confirmIncompatibleExtension\":\"Ово проширење није компатибилно са Scratch-ом. Пројекти са њим се не могу отпремити на Scratch сајт. Да ли сте сигурни да желите да га укључите?\",\"tw.customExtension.name\":\"Прилагођена проширења\",\"tw.featuredProjectsStudio\":\"Погледај студио на Scratch-у.\",\"tw.feedback\":\"Повратне информације и грешке\",\"tw.feedbackButton\":\"Повратне информације\",\"tw.footer.credits\":\"Заслуге\",\"tw.footer.disclaimer\":\"TurboWarp није повезан са Scratch-ом, Scratch тимом, или Scratch фондацијом.\",\"tw.footer.embed\":\"Уграђивање\",\"tw.footer.parameters\":\"URL параметри\",\"tw.gui.defaultProjectTitle\":\"Пројекат\",\"tw.guiDefaultTitle\":\"Убрзајте Scratch пројекте\",\"tw.home.credit\":\"Белешке и заслуге\",\"tw.home.description\":\"TurboWarp је Scratch мод који преводи пројекте у JavaScript и тако их убрзава. Испробајте га уносом пројектовог ID-а или URL-а у поље изнад или одабиром једног од истакнутог пројекта испод.\",\"tw.home.instructions\":\"Упутства\",\"tw.input.tooltip\":\"Прекопирај линк Scratch пројекта овде!\",\"tw.interpolationEnabled\":\"Интерполација\",\"tw.invalidParameters.clones\":\"\\\"clone\\\" URL параметар није валидан\",\"tw.invalidParameters.fps\":\"\\\"fps\\\" URL параметар није валидан\",\"tw.loadError\":\"Пројекат се није могао учитати: {error}\",\"tw.loader.assets.known\":\"Преузимање ресурса ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Преузимање ресурса ...\",\"tw.loader.data\":\"Преузимање података пројекта ...\",\"tw.loader.generic\":\"Учитавање пројекта ...\",\"tw.menuBar.60off\":\"Искључи опцију 60 FPS\",\"tw.menuBar.60on\":\"Укључи опцију 60 FPS\",\"tw.menuBar.addons\":\"Додаци\",\"tw.menuBar.advanced\":\"Напредно\",\"tw.menuBar.changeUsername\":\"Промени корисничко име\",\"tw.menuBar.cloudOff\":\"Онемогући променљиве у облаку\",\"tw.menuBar.cloudOn\":\"Омогући променљиве у облаку\",\"tw.menuBar.cloudUnavailable\":\"Променљиве у облаку нису доступне\",\"tw.menuBar.cloudUnavailableAlert\":\"Променљиве у облаку се не могу користити, вероватно зато што сте у едитору.\",\"tw.menuBar.moreSettings\":\"Напредна подешавања\",\"tw.menuBar.newFramerate\":\"Нови FPS:\",\"tw.menuBar.reportError1\":\"Део кода се није могао превести.\",\"tw.menuBar.reportError2\":\"Ово је грешка. Молимо Вас да је пријавите.\",\"tw.menuBar.saveAs\":\"Сачувај као {file}\",\"tw.menuBar.seeInside\":\"Погледај изнутра\",\"tw.oldDownload\":\"Сачувај у посебну датотеку...\",\"tw.paint.alpha\":\"Непровидност\",\"tw.privacy\":\"Политика приватности\",\"tw.saveAs\":\"Сачувај као...\",\"tw.saveTo\":\"Сачувај у {file}\",\"tw.settingsModal.customStageSize\":\"Прилагођена величина позорнице:\",\"tw.settingsModal.customStageSizeHelp\":\"Мења величину Scratch-ове позорнице са 480x360 на нешто друго. Пробајте 640x360 да би позорница постала широки екран. Мало пројеката ће ово подржати.\",\"tw.settingsModal.dangerZone\":\"Опасно\",\"tw.settingsModal.disableCompiler\":\"Онемогући преводилац кода\",\"tw.settingsModal.disableCompilerHelp\":\"Онемогућава TurboWarp-ов преводилац кода. Ово можете да укључите док програмирате тако да се код не ажурира одмах. У другим случајевима, ово подешавање не треба укључивати.\",\"tw.settingsModal.featured\":\"Истакнуто\",\"tw.settingsModal.fps\":\"60 FPS (Прилагођен FPS)\",\"tw.settingsModal.fpsHelp\":\"Покреће код 60 пута у секунди уместо 30. Многи пројекти неће исправно радити са овим подешавањем. Уместо тога онда искористите Интерполацију уместо опције 60 FPS. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Кликните за FPS који није 30 или 60\",\"tw.settingsModal.help\":\"Кликни за помоћ\",\"tw.settingsModal.highQualityPen\":\"Оловка високог квалитета\",\"tw.settingsModal.highQualityPenHelp\":\"Црта пројекте са оловком у већој резолуцији и онемогућава заокругљивање координата у едитору. Ово подешавање није најбоље за неке пројекте и може утицати на перформансе.\",\"tw.settingsModal.infiniteClones\":\"Бесконачно умножака\",\"tw.settingsModal.infiniteClonesHelp\":\"Онемогућава Scratch-ову границу од 300 умножака\",\"tw.settingsModal.interpolation\":\"Интерполација\",\"tw.settingsModal.interpolationHelp\":\"Чини да пројекти изгледају брже помоћу интерполације кретања ликова. Интерполација се не треба користити за 3D пројекте, пројекте са оловком и пројекте који лагују јер ће радити спорије, а да не изгледају брже.\",\"tw.settingsModal.largeStageWarning\":\"Коришћење оволике величине позорнице није препоручљиво! Уместо тога, користите мање величине са истим односом ширине и висине, а онда укључите приказ преко целог екрана да све повећа тако да се поклапа са корисниковим приказом.\",\"tw.settingsModal.removeFencing\":\"Уклони границе\",\"tw.settingsModal.removeFencingHelp\":\"Дозвољава ликовима да се крећу ван граница екрана, да им величина не буде ограничена, и чини да \\\"додирује ли\\\" блокови раде ван екрана.\",\"tw.settingsModal.removeLimits\":\"Уклони граничне вредности\",\"tw.settingsModal.removeMiscLimits\":\"Уклони различите максималне вредности\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Уклања граничне вредности за звучне ефекте и величину оловке.\",\"tw.settingsModal.storeProjectOptions\":\"Складишти подешавања у пројекту\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Складишти одабрана подешавања у пројекту тако да се аутоматски примене када TurboWarp учита пројекат. Warp тајмер и онемогућавање преводиоца кода се неће сачувати.\",\"tw.settingsModal.title\":\"Напредна подешавања\",\"tw.settingsModal.warpTimer\":\"Warp тајмер\",\"tw.settingsModal.warpTimerHelp\":\"Чини да код проверава да ли је заглављен у дугачкој или бескрајној петљи и смањује квалитет уместо заглављивања док се петља не заврши. Поправља већину кварова, али има значајан утицај на перформансе, па је подразумевано укључен само у едитору.\",\"tw.spriteSelectorItem.rename\":\"преименуј\",\"tw.studioview.authorAttribution\":\"од {author}\",\"tw.studioview.error\":\"Десила се грешка у учитавању следеће странице пројеката.\",\"tw.studioview.hoverText\":\"{title} од {author}\",\"tw.twExtension.name\":\"TurboWarp блокови\",\"tw.usernameModal.help\":\"Ова вредност ће бити сачувана у меморији вашег прегледача. Може се сама учитати када користите пројекте са променљивама у облику.\",\"tw.usernameModal.help2\":\"Вредности које не одговарају валидном Scratch налогу ће бити одбијене од стране сервера променљивих у облаку. Препоручујемо да га оставите како јесте или га промените у своје Scratch корисничко име.\",\"tw.usernameModal.mustChange\":\"Извињавамо се, али сервер променљивих у облаку мисли да је Ваше корисничко име можда небезбедно. Молимо Вас да га промените или {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"ресејтујте га (препоручено)\",\"tw.usernameModal.reset\":\"Ресетуј\",\"tw.usernameModal.title\":\"Промени корисничко име\",\"tw.viewFeaturedProjects\":\"Кликни да видиш истакнуте пројекте\",\"tw.viewOnScratch\":\"Погледај пројекат на Scratch-у\",\"tw.webglModal.description\":\"Нажалост, изгледа да Ваш прегледач или компјутер {webGlLink}. Ова технологија је неопходна сајту да исправно ради. Пробајте да ажурирате прегледач и графичке драјвере или рестартујте компјутер.\"},\"sv\":{\"tw.alerts.creatingRestorePoint\":\"Skapar återställningspunkt...\",\"tw.alerts.lostPeripheralConnection\":\"Förlorade anslutningen till {extensionName}.\",\"tw.alerts.savedToDisk\":\"Sparad på datorn.\",\"tw.backpack.rename\":\"Nytt namn: \",\"tw.blocks.addons\":\"Tillägg\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON]Musknappen nere?\",\"tw.blocks.lastKeyPressed\":\"Sista tangenten nertryckt \",\"tw.blocks.mouseButton.middle\":\"(1) mitten\",\"tw.blocks.mouseButton.primary\":\"(0) primär\",\"tw.blocks.mouseButton.secondary\":\"(2) andra\",\"tw.blocks.openDocs\":\"Öppna dokumentation\",\"tw.browserModal.desc\":\"Titta om du använder den nyaste versionen av Google Chrome, Mozilla Firefox, Microsoft Edge eller Appel Safari.\",\"tw.cantUseCloud\":\"Även om du kan skapa molnvariabler så kommer de inte att funka om du inte kommer att ladda upp projektet till Scratch eller att använda ett verktyg som {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Användarnamn kan inte ändras när projektet är igång.\",\"tw.clipboard.danger\":\"Om ditt urklipp har saker som lösenord, kan projektet dela de med andra servrar.\",\"tw.clipboard.permission\":\"Tillgång till urklipp kan kanske inte fungera i alla webbläsare. Om tillåtet, senare läsningar från urklippen kommer att vara automatiskt tillåtna.\",\"tw.clipboard.title\":\"Projektet vill läsa data från ditt urklipp.\",\"tw.code\":\"Källkod\",\"tw.confirmIncompatibleExtension\":\"Detta tillägg är inkompatibelt med Scratch. Projekt skapade med det kan inte bli uppladdade till Scratch-webbplatsen. Är du säker att aktivera det?\",\"tw.customExtension.description\":\"Ladda in anpassade tillägg från URL:s, filer, eller JavaScript källkod.\",\"tw.customExtension.name\":\"Anpassatt tillägg\",\"tw.customExtensionModal.file\":\"Fil\",\"tw.customExtensionModal.load\":\"Ladda in\",\"tw.customExtensionModal.promptFile\":\"Välj tilläggets JavaScript fil:\",\"tw.customExtensionModal.promptText\":\"Klistra in tilläggets JavaScript källkod:\",\"tw.customExtensionModal.promptURL\":\"Ange tilläggets URL:\",\"tw.customExtensionModal.title\":\"Ladda in ett anpassat tillägg\",\"tw.customExtensionModal.trusted\":\"Tillägget kan vara laddat in utan sandboxen eftersom den är från en betrodd källa.\",\"tw.customExtensionModal.unsandboxed\":\"Kör tillägget utan sandlådan\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Att ladda in anpassade utan sandboxen är farligt och ska inte vara aktiverat om du inte vet vad du gör.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Osandlådade tillägg kan förstöra ditt projekt, ta bort dina inställningar, nätfiska för lösenord, och andra dåliga saker. Utvecklarna för {APP_NAME} är inte ansvariga för resulterade problem.\",\"tw.customExtensionModal.untrusted\":\"Tillägg från opålitliga URL:s kommer alltid att vara laddade in med sandboxen för säkerhet.\",\"tw.documentation\":\"Dokumentation\",\"tw.extensionGallery.name\":\"Turbowarp tilläggsgalleri\",\"tw.featuredProjectsStudio\":\"Se studion på Scratch.\",\"tw.feedback\":\"Respons & buggar\",\"tw.fetch.title\":\"Projektet vill koppa sig till webbsidan: \",\"tw.fileInput.none\":\"Ingen fil vald.\",\"tw.fileInput.selected\":\"Vald: {name}\",\"tw.fonts.add\":\"Lägg till\",\"tw.fonts.custom.name\":\"Ge teckensnittet ett namn:\",\"tw.fonts.title\":\"Teckensnitt\",\"tw.footer.credits\":\"Krediter\",\"tw.footer.disclaimer\":\"TurboWarp är inte ansluten med Scratch, Scratch teamet eller Scratchstiftelsen.\",\"tw.footer.documentation\":\"Dokumentation\",\"tw.footer.donate\":\"Donera\",\"tw.footer.embed\":\"Inbäddning\",\"tw.footer.parameters\":\"URL Parametrar\",\"tw.gui.crashMessage.description\":\"Vi är ledsna men det ser ut som sidan har krashat. Ladda om sidan för att försöka igen.\",\"tw.gui.defaultProjectTitle\":\"Projekt\",\"tw.guiDefaultTitle\":\"Kör scratchprojekt snabbare\",\"tw.home.credit\":\"Anteckningar och kerditer\",\"tw.home.description\":\"TurboWarp är en modifikation som kompilerar project till JavaScript så att de körs väldigt fort. Testa med att skriva in projekt ID eller URL över eller att välja utvalda projekt nedan.\",\"tw.home.instructions\":\"Instruktioner\",\"tw.input.tooltip\":\"Kopiera och klistra in en Scratch länk här!\",\"tw.invalidParameters.clones\":\"\\\"klon\\\" URL är ogiltig\",\"tw.invalidParameters.fps\":\"\\\"fps\\\" URL parameter är ogiltig\",\"tw.loadError\":\"Kunde inte ladda in projekt: {error}\",\"tw.loadExtension.embedded\":\"Projektet vill att ladda in ett anpassat tillägg med koden:\",\"tw.loadExtension.sandboxed\":\"Medan koden kommer att bli sandboxad, kommer det att ha tillgång till information om din enhet som till exempel din IP adress och din position. Kontrollera att du litar på författaren av detta tillägg innan du fortsätter.\",\"tw.loadExtension.unsandboxed\":\"Kör tillägget utan sanboxen\",\"tw.loadExtension.unsandboxedWarning\":\"Att ladda tillägg utan sandboxen är farligt. Det kommer at kunna förstöra ditt projekt, ta bort dina inställningar, nätfiska för lösenord, och andra dåliga saker. Utvecklarna för {APP_NAME} är inte ansvariga för resulterade problem.\",\"tw.loadExtension.url\":\"Projektet vill ladda in ett anpassad tillägg från denna URL:\",\"tw.loader.assets.known\":\"Hämtar tillgångar ({complete}/{total})...\",\"tw.loader.assets.unknown\":\"Hämtar tillgångar...\",\"tw.loader.data\":\"Hämtar projektdata...\",\"tw.loader.generic\":\"Laddar projekt...\",\"tw.menuBar.60off\":\"Avaktivera 60 FPS\",\"tw.menuBar.60on\":\"Aktivera 60 FPS\",\"tw.menuBar.addons\":\"Tillägg\",\"tw.menuBar.advanced\":\"Avancerat\",\"tw.menuBar.changeUsername\":\"Ändra användarnamn\",\"tw.menuBar.cloudOff\":\"Avaktivera molnvariabler\",\"tw.menuBar.cloudOn\":\"Aktivera molnvariabler\",\"tw.menuBar.cloudUnavailable\":\"Molnvariabler är inte tillgängliga\",\"tw.menuBar.cloudUnavailableAlert\":\"Kan inte använda molnvariabler, mest troligt att du öppnade editorn.\",\"tw.menuBar.compileError\":\"{sprite}:{error}\",\"tw.menuBar.moreSettings\":\"Avancerade inställningar\",\"tw.menuBar.newFramerate\":\"Ny upplösningshastighet:\",\"tw.menuBar.package\":\"Packa projektet\",\"tw.menuBar.reportError1\":\"Några skript kunde inte kompileras\",\"tw.menuBar.reportError2\":\"Detta är en bugg. Snälla rapportera buggen. \",\"tw.menuBar.restorePoints\":\"Återställspunkter\",\"tw.menuBar.saveAs\":\"Spara som {file}\",\"tw.menuBar.seeInside\":\"Se inuti\",\"tw.notify.permission\":\"Om tillåtet, kommer du kanske att bli frågad om att tillåta notifikationer av din webbläsare, och senare notifikationer kommer att bli automatiskt tillåtna. \",\"tw.notify.title\":\"Projektet vill visa notifikationer.\",\"tw.oldDownload\":\"Spara till separat fil...\",\"tw.opcode.2000\":\"dagar från år 2000\",\"tw.opcode.mousedown\":\"Musknapp nedtryckt?\",\"tw.opcode.mousex\":\"mus x\",\"tw.opcode.mousey\":\"mus y\",\"tw.openAdvanced\":\"Öppna avancerade inställningar\",\"tw.openWindow.dangerous\":\"Denna webbsida har inte granskats av utvecklarna {APP_NAME} . Den kan innehålla farlig eller skadlig kod.\",\"tw.openWindow.title\":\"Projektet vill öppna ett fönster eller en flik med länken: \",\"tw.paint.alpha\":\"Opacitet\",\"tw.paint.fonts.more\":\"Lägg till fler font...\",\"tw.privacy\":\"Integritetspolicy\",\"tw.recordAudio.permission\":\"Om tillåtet, kommer du kanske att bli frågad om att tillåta tillgång till mikrofonen från din webbläsare, och senare tillgång till mikrofonen kommer att bli automatiskt tillåtet.\",\"tw.recordAudio.title\":\"Projektet vill spela in ljud från din mikrofon. Detta kan inkludera ett textutskrift eller rå ljud. Projektet kan dela ljudet med andra personer eller servrar.\",\"tw.recordVideo.permission\":\"Om tillåtet, kommer du kanske att bli frågad av din webbläsare att få tillgång till din kamera, och senare tillgång till kameran kommer att bli automatiskt tillåtet.\",\"tw.recordVideo.title\":\"Projektet vill spela in video från din kamera. Projektet kan dela bilder med andra användare eller servrar.\",\"tw.redirect.dangerous\":\"Denna webbsida har inte granskats av utvecklarna {APP_NAME} . Den kan innehålla farlig eller skadlig kod.\",\"tw.redirect.title\":\"Projektet will navigera dig till denna webbsida:\",\"tw.restorePoints.deleteAll\":\"Radera allt\",\"tw.restorePoints.description\":\"{APP_NAME} sparar återställspunkter med jämna mellanrum på don dator för att hjälpa återställa projekt om du glömde spara. Detta är avsett som sista utvägen för återhämtning. Din dator kan ta bart återställningspunkterna när som helts. Bero INTE på denna funktion.\",\"tw.restorePoints.error\":\"Ett fel uppstod under laddningen av återställningspunkten: {error}\",\"tw.restorePoints.loading\":\"Laddar...\",\"tw.restorePoints.title\":\"Återställspunkter\",\"tw.saveAs\":\"Spara som...\",\"tw.saveTo\":\"Spara till {file}\",\"tw.scratchUnsafeCloud\":\"Om du gör denna molnvariabel så kommer projektet att överskrida Scratchs gräns av {number} variabler och några variabler kommer inte fungera om du kommer ladda upp projektet till Scratch.\",\"tw.securityManager.allow\":\"Tillåt\",\"tw.securityManager.deny\":\"Avvisa\",\"tw.securityManager.title\":\"Tilläggssäkerhet\",\"tw.securityManager.trust\":\"Om tillåtet, senare förfrågor till samma websida kommer att automatiskt vara tillåtna.\",\"tw.securityManager.why\":\"Detta kan vara använt till att ladda ned bilder eller ljud, implementera multiplayer, få tillgång till API, eller för skadliga syften. Detta kommer att dela din IP adress, allmän plats, och kanske annan data med websidan.\",\"tw.settingsModal.customStageSize\":\"Anpassad scenstorlek:\",\"tw.settingsModal.customStageSizeHelp\":\"Ändrar storleken av Scratch scenen från 480x360 till något annat. Prova 640x360 för att göra scenen widescreen. Väldigt få projekt funkar rätt med detta\",\"tw.settingsModal.dangerZone\":\"Farliga zonen\",\"tw.settingsModal.disableCompiler\":\"Avaktivera kompilatorn\",\"tw.settingsModal.disableCompilerHelp\":\"Avaktiverar TurboWarps kompilator. Du kanske vill att aktivera detta när du vill ändra koden så att skripterna uppdateras momentalt, annars så ska du aldrig aktivera detta.\",\"tw.settingsModal.featured\":\"Utvalda\",\"tw.settingsModal.fps\":\"60 FPS (Anpassat FPS)\",\"tw.settingsModal.fpsHelp\":\"Kör skripter 60 gånger i sekunden istället för 30. De flesta projekt kommer inte att funka rätt med detta aktiverat. Do kan prova interpolation med 60 FPS läget avaktiverat om så är fallet. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Klicka för att använda en hastighet förutom 30 och 60 FPS\",\"tw.settingsModal.help\":\"Klicka för hjälp\",\"tw.settingsModal.highQualityPen\":\"Högkvalitativ penna\",\"tw.settingsModal.highQualityPenHelp\":\"Tillåter att projekt med penna kan rendera med högre kvalité och tar bort några koordinat avrundning i editorn. Inte alla projekt drar nytta av den här inställningen och det kan påverka prestandan.\",\"tw.settingsModal.infiniteClones\":\"Oändliga kloner\",\"tw.settingsModal.infiniteClonesHelp\":\"Avaktiverar Scratch's 300 klongräns.\",\"tw.settingsModal.interpolationHelp\":\"Får projekt att se jämnare ut genom att interpolera sprite-rörelser. Interpolering bör inte användas på 3D-projekt, raytracers, pennprojekt och långsamma projekt eftersom interpolering kommer att göra att de går långsammare utan att få dem att se jämnare ut.\",\"tw.settingsModal.largeStageWarning\":\"Att använda en scenstorlek som detta är inte rekomenderat! Istället, använd en mindre storlek med samma sidförhållande och låt fullskärmen att uppskala den så att storleken matchar datorns skärm.\",\"tw.settingsModal.removeFencing\":\"Ta bort scengränser\",\"tw.settingsModal.removeFencingHelp\":\"Tillåter sprites att flytta utanför skärmen, bli så stora eller så små som de vill, och gör att beröringsblock fungerar utanför skärmen.\",\"tw.settingsModal.removeLimits\":\"Ta bort limitationerna\",\"tw.settingsModal.removeMiscLimits\":\"Ta bort diverse gränser\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Tar bort ljud limitationer och gränser för pennstorlek\",\"tw.settingsModal.storeProjectOptions\":\"Spara inställningarna i projektet\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Sparar de valda inställningarna i projektet så de kommer bli automatiskt tillämpas när TurboWarp laddar projektet. Warp timer och avaktivera kompilatorn kommer inte vara sparade.\",\"tw.settingsModal.title\":\"Avancerade inställningar\",\"tw.settingsModal.warpTimerHelp\":\"Ser till så att skript är inte fasta i en lång eller oändlig loop och gör så att de körs på låg hastighet istället för att fastna tills loopen blir klar. Detta fixar de flesta kraschar men har en betydande prestationspåverkan så det är bara aktiverat i editorn som standard.\",\"tw.spriteSelectorItem.rename\":\"Döp om\",\"tw.stereoAlert\":\"Om du redigerar detta stereoljud konverteras det oåterkalleligt till mono.\",\"tw.studioview.authorAttribution\":\"av {author}\",\"tw.studioview.error\":\"Det uppstod ett fel när nästa sida med projekt skulle laddas.\",\"tw.studioview.hoverText\":\"{title} av {author}\",\"tw.tooLarge\":\"Detta ljud kommer att kanske vara för stort för att ladda upp till Scratch.\",\"tw.twExtension.description\":\"Konstiga nya block.\",\"tw.twExtension.name\":\"TurboWarps block\",\"tw.unshared.2\":\"För mer information se: {link}\",\"tw.unshared.bug\":\"Om detta projektet är delat, rapportera en bugg.\",\"tw.unshared.cache\":\"Om projektet var delat nyligen så kan detta meddelandet vara ogiltigt i några minuter.\",\"tw.unshared2.1\":\"Odelade projekt är inte tillgängliga längre.\",\"tw.usernameModal.help\":\"Detta värde kommer att lagras i din webbläsares lagring. Det kan loggas när du interagerar med projekt som innehåller molnvariabler.\",\"tw.usernameModal.help2\":\"Värden som inte korresponderar till ett valt Scratch konto kommer vanligtvis att avvisas av molnvariabelservern. Vi rekomenderar att lämna det så som det är eller att ändra det till ditt Scratch användarnamn\",\"tw.usernameModal.mustChange\":\"Förlåt, men det ser ut som om att servern tänker att ditt användarnamn är osäkert. Ändra det till något annat eller {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"Återställa (Rekomenderat)\",\"tw.usernameModal.reset\":\"Starta om\",\"tw.usernameModal.title\":\"Ändra användarnamn\",\"tw.viewFeaturedProjects\":\"Klicka för att se utvalda projekt\",\"tw.viewOnScratch\":\"Se projektet på Scratch\",\"tw.webglModal.description\":\"Olyckligtvis ser det ut som om din webbläsare eller dator {webGlLink}. Denna sidan kräver denna teknologin för att sidan ska fungera. Försök att uppdatera din webbläsare och grafikdrivrutiner eller starta om din dator.\"},\"tr\":{\"tw.alerts.creatingRestorePoint\":\"Yükleme noktası yapılıyor\",\"tw.alerts.savedToDisk\":\"Bilgisayarına kaydedilmiştir.\",\"tw.backpack.rename\":\"Yeni kullanıcı adı:\",\"tw.blocks.addons\":\"Eklentiler\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] fare düğmesi basılımı?\",\"tw.blocks.lastKeyPressed\":\"basılan son tuş\",\"tw.blocks.mouseButton.middle\":\"(1) orta\",\"tw.blocks.mouseButton.primary\":\"(0) birincil\",\"tw.blocks.mouseButton.secondary\":\"(2) ikincil\",\"tw.blocks.openDocs\":\"Belgeyi Aç\",\"tw.browserModal.desc\":\"Lütfen Google Chrome, Mozilla Firefox, Microsoft Edge veya Apple Safari'nin yeni bir sürümünü kullandığınızdan emin olun.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Proje çalışırken kullanıcı adı değiştirilemez.\",\"tw.code\":\"Kaynak Kodu\",\"tw.confirmIncompatibleExtension\":\"Bu eklenti Scratch ile kullanamılınıyor. Bununla yapılan projeler Scratch web sitesine yüklenemez. Etkinleştirmek istediğinizden emin misiniz?\",\"tw.customExtension.name\":\"Görenek Eklenti\",\"tw.customExtensionModal.file\":\"Dosya\",\"tw.featuredProjectsStudio\":\"Stüdyoyu Scratch'te görüntüleyin.\",\"tw.feedback\":\"Geribildirim ve Hatalar\",\"tw.feedbackButton\":\"Turbowarp geribildirim\",\"tw.footer.credits\":\"Krediler\",\"tw.footer.disclaimer\":\"TurboWarp, Scratch, Scratch Takım veya Scratch Vakıfı ile bağlantılı değildir.\",\"tw.footer.embed\":\"Gömmek\",\"tw.footer.parameters\":\" URL parametreler\",\"tw.gui.defaultProjectTitle\":\"Proje\",\"tw.guiDefaultTitle\":\"Scratch Projeleri daha hızlı yapın\",\"tw.home.credit\":\"Notlar ve Krediler\",\"tw.home.description\":\"TurboWarp, projeleri çok hızlı çalıştırmaları için JavaScript'e derleyen bir Scratch modudur. Yukarıda bir proje ID yada URL girerek yada özel projeleri şeçerek ile deneyin.\",\"tw.home.instructions\":\"Kurallar\",\"tw.input.tooltip\":\"Bir Scratch proje linki buraya kopyala ve yapıştır!\",\"tw.interpolationEnabled\":\"Enterpolasyon\",\"tw.invalidParameters.clones\":\"\\\"klon\\\" URL parametresi geçersizdir\",\"tw.invalidParameters.fps\":\"\\\"fps\\\" URL parametresi geçersizdir\",\"tw.loadError\":\"Bu projeyi yükleyemiyoruz: {error}\",\"tw.loader.assets.known\":\"Varlıklar indiriliyor ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Varlıklar indiriliyor ...\",\"tw.loader.data\":\"Proje verileri indiriliyor ...\",\"tw.loader.generic\":\"Proje yükleniyor ...\",\"tw.menuBar.60off\":\"60 FPS modunu kapat\",\"tw.menuBar.60on\":\"60 FPS modunu aç\",\"tw.menuBar.addons\":\"Eklentiler\",\"tw.menuBar.advanced\":\"Gelişmiş\",\"tw.menuBar.changeUsername\":\"Adını değiştir\",\"tw.menuBar.cloudOff\":\"Bulut değişkenleri kapat\",\"tw.menuBar.cloudOn\":\"Bulut değişkenleri aç\",\"tw.menuBar.cloudUnavailable\":\"Bulut Değişkenleri bulamıyoruz\",\"tw.menuBar.cloudUnavailableAlert\":\"Bulut değişkenleri kullanamıyoruz, büyük ihtimalle editörü açtığınız için.\",\"tw.menuBar.moreSettings\":\"Gelişmiş Ayarlar\",\"tw.menuBar.newFramerate\":\"Yeni karehızı:\",\"tw.menuBar.reportError1\":\"Bazı komut dosyaları derlenemedi.\",\"tw.menuBar.reportError2\":\"Bu bir hatadır. Lütfen bildirin.\",\"tw.menuBar.saveAs\":\"{file} olarak kaydet\",\"tw.menuBar.seeInside\":\"İçeri bak\",\"tw.oldDownload\":\"Farklı dosyaya kaydet...\",\"tw.paint.alpha\":\"Saydamlık\",\"tw.privacy\":\"Gizillik Politikası\",\"tw.saveAs\":\"Farklı kaydet...\",\"tw.saveTo\":\"{file} dosyasına kaydet\",\"tw.settingsModal.customStageSize\":\"Özel Sahne Büyüklüğü:\",\"tw.settingsModal.customStageSizeHelp\":\"Scratch'in büyüklüğünü 480x360'den başka büyüklüğe değiştiriyor. Eğer geniş ekran istiyorsanız, 640x360yi deneyin. Sadece bir kaç projeler bunu düzgün bir şekilde halledebilir.\",\"tw.settingsModal.dangerZone\":\"Tehlikeli yer\",\"tw.settingsModal.disableCompiler\":\"Derlemeyi kapat\",\"tw.settingsModal.disableCompilerHelp\":\"Turbowarp Derleyiciyi devre dışı bırakır. Blokları hemen güncellenmesi için projeleri düzenlerken bunu etkinleştirmek isteyebilirsiniz, aksi takdirde bunu etkinleştirmemelisiniz.\",\"tw.settingsModal.featured\":\"Özellikli\",\"tw.settingsModal.fps\":\"60 FPS (Özel FPS)\",\"tw.settingsModal.fpsHelp\":\"Blokarı 30FPS yerinde 60FPS ile çalıştırır. Çoğu projeler bu mod ile 30FPS gibi çalışamaz. Bu durumda Enterpolasyonu 60 FPS modu devre dışı bırakarak denemelisiniz. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"30FPS yada 60FPS'den başka kare hızı ile çalıştırmak istiyorsan bunu tıkla.\",\"tw.settingsModal.help\":\"Yardım için buraya tıkla\",\"tw.settingsModal.highQualityPen\":\"Yüksek kalite kalem\",\"tw.settingsModal.highQualityPenHelp\":\"Yüksek Kaliteli Kalem, kalem projelerinin daha yüksek kalitede görüntülemekte sağlar. ve oluşturucudaki bazı yuvarlamaları da görünmemesini sağlar. Bu ayardan tüm projelere bir advantaj veremiyor ve performansı etkileyebilir.\",\"tw.settingsModal.infiniteClones\":\"Sonsuz klonlar\",\"tw.settingsModal.infiniteClonesHelp\":\"Scratch'in 300 klon limiti çıkarıyor.\",\"tw.settingsModal.interpolation\":\"Enterpolasyon\",\"tw.settingsModal.interpolationHelp\":\"Enterpolasyon, hareketli grafik hareketini interpolasyon yaparak, projenin davranışını değiştirmeden daha yüksek kare hızlarında çalışıyormuş gibi görünmesini sağlayan deneysel bir özelliktir. Eğer bir projeyi 60 FPS'de çalıştırdıysanız ve çok hızlı çalıştığını fark ettiyseniz, İnterpolasyon bunu çözer. Enterpolasyon 3B projelerde, raytracer ve kalem projelerde kullanmayın çünkü projeleri yavaşlatır ve daha pürüzsüz yapmaz.\",\"tw.settingsModal.largeStageWarning\":\"Bu büyüklükte özel bir sahne boyutu kullanılması önerilmez! Bunun yerine, aynı en boy oranına sahip daha düşük bir boyut kullanın ve tam ekran modunun kullanıcının ekranına uyacak şekilde yükseltmesine izin verin.\",\"tw.settingsModal.removeFencing\":\"Eskirimi çıkart\",\"tw.settingsModal.removeFencingHelp\":\"Kuklaları ekran dışı yerler gitmeyi izin verir ve kuklaların istediği kadar büyük yada küçük olmasını izin verir, ve dokunma blokları ekran dışında kullanılabilir.\",\"tw.settingsModal.removeLimits\":\"Limitleri çıkart\",\"tw.settingsModal.removeMiscLimits\":\"Çeşitli Limitleri Kaldır\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Ses efekti limitleri gibi projeleri bozmaması olmayan çeşitli limitleri kaldırır.\",\"tw.settingsModal.storeProjectOptions\":\"Proje ayarlarını kaydet\",\"tw.settingsModal.storeProjectOptionsHelp\":\"TurboWarp bu projeyi yüklediğinde, ayarların otomatik olarak uygulanması için seçilmiş ayarları projede kaydeder. Warp zamanlayıcısı ve derleyiciyi devre dışı bırakma ayarları kaydedilmeyecektir.\",\"tw.settingsModal.title\":\"Gelişmiş Ayarlar\",\"tw.settingsModal.warpTimer\":\"Warp zamanlayıcı\",\"tw.settingsModal.warpTimerHelp\":\"Warp zamanlayıcı bloklara uzun veya sonsuz bir döngüde takılıp kalmadıklarını kontrol etmesini sağlar ve çok yavaş bir karehızında yürütüyor, ve bu da çoğu çökmeyi düzeltir. Bunun çok büyük bir performans etkisi vardır, bu nedenle editörün dışında varsayılan olarak etkinleştirilmez.\",\"tw.spriteSelectorItem.rename\":\"yeniden adlandır\",\"tw.studioview.authorAttribution\":\"{author} tarafından\",\"tw.studioview.error\":\"Sonraki proje sayfası yüklenirken hata oluştu.\",\"tw.studioview.hoverText\":\"{title} tarafından {author}\",\"tw.twExtension.name\":\"Turbowarp Bloklar\",\"tw.usernameModal.help\":\"Bu kullanıcı adı web tarayıcının çerezlerinde olacak. Bulut değişkenleri olan projelerle etkileşim kurduğunuzda kaydedilebilir.\",\"tw.usernameModal.help2\":\"Geçerli bir Scratch hesabına karşılık gelen değerler genellikle bulut değişken sunucusu tarafından reddedilirecek. Olduğu gibi ybırakmanızı vea Scratch kullanıcı adınızı değiştirmenizi öneririz.\",\"tw.usernameModal.mustChange\":\"Üzgünüz, bulut değişken sunucusu kullanıcı adınızın güvensiz olabileceğini düşünüyor. Lütfen başka bir şeyle değiştirin yada {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"sıfırlayın (önerildi)\",\"tw.usernameModal.new\":\"Yeni kullanıcı adı:\",\"tw.usernameModal.reset\":\"Sıfırla\",\"tw.usernameModal.title\":\"Adını değiştir\",\"tw.viewFeaturedProjects\":\"Özellikli projeleri görmek için buraya tıklayınız.\",\"tw.viewOnScratch\":\"Projeyi Scratch'te görüntüleyin.\",\"tw.webglModal.description\":\"Ne yazık ki senin web tarayıcının yada bilgisayarın {webGlLink}. Bu sitenin çalışması için bu teknolojiye ihtiyaç vardır. Web tarayıcını ve grafik sürücülerini güncelle yada bilgisayarını yeniden başlatmayı deneyin.\"},\"uk\":{\"tw.alerts.creatingRestorePoint\":\"Створення точки відновлення...\",\"tw.alerts.lostPeripheralConnection\":\"Втрачено зв'язок з {extensionName}\",\"tw.alerts.savedToDisk\":\"Збережено на ваш комп'ютер.\",\"tw.backpack.rename\":\"Нова назва:\",\"tw.blocks.addons\":\"Доповнення\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] кнопку миші натиснуто?\",\"tw.blocks.lastKeyPressed\":\"остання клавіша натиснута\",\"tw.blocks.mouseButton.middle\":\"(1) середня\",\"tw.blocks.mouseButton.primary\":\"(0) основна\",\"tw.blocks.mouseButton.secondary\":\"(2) додаткова\",\"tw.blocks.openDocs\":\"Відкрити документацію\",\"tw.browserModal.desc\":\"Переконайтеся, що ви використовуєте останню версію Google Chrome, Mozilla Firefox, Microsoft Edge, або Apple Safari.\",\"tw.cantUseCloud\":\"Хоча ви можете створювати хмарні змінні, вони не будуть працювати до тих пір, доки проект не буде завантажений на Scratch, або упакований за допомогою {packager}\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Неможливо змінити ім'я користувача поки проект працює.\",\"tw.code\":\"Вихідний код\",\"tw.confirmIncompatibleExtension\":\"Це розшрення несумісне зі Scratch. Проекти, створені за допомогою цього розширення, неможливо завантажити на Scratch. Ви дійсно хочете увімкнути це?\",\"tw.customExtension.name\":\"Користувальницьке розширення\",\"tw.customExtensionModal.file\":\"Файл\",\"tw.featuredProjectsStudio\":\"Переглянути студію на Scratch.\",\"tw.feedback\":\"Зв'язок з розробником та помилки\",\"tw.feedbackButton\":\"Зворотній звязок\",\"tw.footer.credits\":\"Подяки\",\"tw.footer.disclaimer\":\"TurboWarp ніяк не пов'язаний із Scratch, Командою Scratch або Фондом Scratch.\",\"tw.footer.donate\":\"Пожертвувати\",\"tw.footer.embed\":\"Вбудовування\",\"tw.footer.parameters\":\"Параметри URL\",\"tw.fps\":\"{framerate}Кадрів у секунду\",\"tw.gui.crashMessage.description\":\"Нам дуже шкода, але схоже що сторінка дала збій. Будь ласка, оновіть сторінку, щоб повторити спробу.\",\"tw.gui.defaultProjectTitle\":\"Проєкт\",\"tw.guiDefaultTitle\":\"Запускайте проекти Scratch швидше\",\"tw.home.credit\":\"Замітки та Подяки\",\"tw.home.description\":\"TurboWarp - це модифікація Scratch, що компілює проекти в JavaScript, щоб вони працювали швидше. Спробуйте ввести URL або ID проекту вище або виберіть з обраних проектів нище.\",\"tw.home.instructions\":\"Інструкції\",\"tw.input.tooltip\":\"Скопіюйте та вставте URL адресу Scratch проекту сюди!\",\"tw.interpolationEnabled\":\"Інтерполяція\",\"tw.invalidParameters.clones\":\"Параметр \\\"clone\\\" в URL некоректний\",\"tw.invalidParameters.fps\":\"Параметр \\\"fps\\\" в URL некоректний\",\"tw.loadError\":\"Не вийшло завантажити проект: {error}\",\"tw.loader.assets.known\":\"Завантаження ресурсів ({complete}/{total}) ...\",\"tw.loader.assets.unknown\":\"Завантаження ресурсів...\",\"tw.loader.data\":\"Завантаження даних проєкту...\",\"tw.loader.generic\":\"Завантаження проєкту...\",\"tw.menuBar.60off\":\"Вимкнути режим 60 FPS\",\"tw.menuBar.60on\":\"Увімкнути режим 60 FPS\",\"tw.menuBar.addons\":\"Доповнення\",\"tw.menuBar.advanced\":\"Додатково\",\"tw.menuBar.changeUsername\":\"Змінити ім'я користувача\",\"tw.menuBar.cloudOff\":\"Вимкнути хмарні змінні\",\"tw.menuBar.cloudOn\":\"Увімкнути хмарні змінні\",\"tw.menuBar.cloudUnavailable\":\"Хмарні змінні недоступні\",\"tw.menuBar.cloudUnavailableAlert\":\"Не вдається використати хмарні змінні, швидше за все, тому що ви відкрили редактор.\",\"tw.menuBar.moreSettings\":\"Налаштування Доповнень\",\"tw.menuBar.newFramerate\":\"Нова частота кадрів:\",\"tw.menuBar.package\":\"Упакувати проект\",\"tw.menuBar.reportError1\":\"Деякі скрипти не можуть бути скомпільовані.\",\"tw.menuBar.reportError2\":\"Це помилка. Будь-ласка, повідомте нам про це.\",\"tw.menuBar.saveAs\":\"Зберегти як {file}\",\"tw.menuBar.seeInside\":\"Переглянути код\",\"tw.mono\":\"Моно\",\"tw.oldDownload\":\"Зберегти як окремий файл...\",\"tw.opcode.2000\":\"днів від 2000 року\",\"tw.openAdvanced\":\"Відкрити налаштування доповнень\",\"tw.openWindow.title\":\"Даний проект хоче відкрити нове вікно, або вкладку за посиланням:\",\"tw.paint.alpha\":\"Непрозорість\",\"tw.privacy\":\"Політика Конфіденсійності\",\"tw.saveAs\":\"Зберегти як...\",\"tw.saveTo\":\"Зберегти як {file}\",\"tw.scratchUnsafeCloud\":\"Якщо ви створите цю хмарну змінну, проект перевищить ліміт Scratch в {number} змінних, тому деякі змінні не працюватимуть, якщо завантажии проект на Scratch.\",\"tw.securityManager.allow\":\"Дозволити\",\"tw.settingsModal.customStageSize\":\"Користувальницький розмір сцени:\",\"tw.settingsModal.customStageSizeHelp\":\"Змінює розмір сцени з 480x360 на щось інше. Спробуйте використати 640x360, щоб зробити сцену широкоекранною. Тільки деякі проекти будуть працювати правильно з цим налаштуванням.\",\"tw.settingsModal.dangerZone\":\"Небезпечна зона\",\"tw.settingsModal.disableCompiler\":\"Вимкнути компілятор\",\"tw.settingsModal.disableCompilerHelp\":\"Вимикає компілятор TurboWarp. Рекомендуємо вмикати це налаштування коли ви редактуєте проект, щоб скрипти оновлювалися моментально. В інших випадках не вмикайте це.\",\"tw.settingsModal.featured\":\"Обране\",\"tw.settingsModal.fps\":\"60 FPS (Користувальницькі FPS)\",\"tw.settingsModal.fpsHelp\":\"Виконує скрипти 60 раз в секунду замість 30. Більшість проектів не будуть працювати належним чином, коли цей параметр увімкнено. Якщо це так, спробуйте інтерполяцію з вимкненим режимом 60 FPS.{customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Натисніть, щоб використати іншу частоту кадрів, ніж 30 або 60\",\"tw.settingsModal.help\":\"Натисніть, щоб побачити подробиці\",\"tw.settingsModal.highQualityPen\":\"Перо високої якості\",\"tw.settingsModal.highQualityPenHelp\":\"Дозволяє виконувати візуалізацію пера з більш високою якістю, також вимикає деякі округлення координат в редакторі. Цей параметр корисний не для всіх проектів, і може вплинути на продуктивність.\",\"tw.settingsModal.infiniteClones\":\"Безмежна кількість клонів\",\"tw.settingsModal.infiniteClonesHelp\":\"Вимикає ліміт Scratch на 300 клонів.\",\"tw.settingsModal.interpolation\":\"Інтерполяція\",\"tw.settingsModal.interpolationHelp\":\"Інтерполює рухи спрайтів, роблячи проект більш плавним. Не використовуйте інтерполяцію в 3D проектах, проектах з трассуванням променів, проектах на основі пера та повільних проектах, оскільки інтерполяція не зробить їх більш плавними, і навіть негативно вплине на їх швидкість.\",\"tw.settingsModal.largeStageWarning\":\"Використовувати настільки великий розмір сцени не рекомендується! Краще використовуйте сцену меншого розміру, але з таким самим співвідношенням сторін і дайте повноекранному режиму збільшити сцену так, щоб вона могла підійти по розміру до дисплею користувача.\",\"tw.settingsModal.removeFencing\":\"Прибрати рамку\",\"tw.settingsModal.removeFencingHelp\":\"Дозволяє спрайтам виходити за межі сцени, ставати настільки великими або маленькими, наскільки вони захочуть, та робить так, щоб блоки доторкань працювали за межами сцени.\",\"tw.settingsModal.removeLimits\":\"Прибрати обмеження\",\"tw.settingsModal.removeMiscLimits\":\"Прибрати різні обмеження\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Прибирає обмеження звукових еффектів та розміру пера.\",\"tw.settingsModal.storeProjectOptions\":\"Зберегти налаштування у проєкті\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Зберігає вибрані налаштування в проекті щоб вони автоматично застосовувалися, коли проект відкривається TurboWarp'ом. Warp Таймер і відключення компілятора не буде збережено. \",\"tw.settingsModal.title\":\"Розширені Налаштування\",\"tw.settingsModal.warpTimer\":\"Warp Таймер\",\"tw.settingsModal.warpTimerHelp\":\"Перевіряє, які скрипти застрягли в довгому, або безкінечному циклі та знижує часоту кадрів, замість того щоб він застиг, доки цикл не завершиться. Це виправляє велику частину критичних помилок, але це негативно впливає на швидкість проекту, тому за умовчанням цей параметр увімкнений тільки в редакторі.\",\"tw.spriteSelectorItem.rename\":\"перейменувати\",\"tw.stereo\":\"Стерео\",\"tw.stereoAlert\":\"Редактування цого стерео звуку приведе до його конвертування в моно.\",\"tw.studioview.authorAttribution\":\"від {author}\",\"tw.studioview.error\":\"При завантаженні наступної сторінки проектів сталася помилка.\",\"tw.studioview.hoverText\":\"{title} від {author}\",\"tw.tooLarge\":\"Цей звук занадто великий для експорту в Scratch.\",\"tw.twExtension.name\":\"Блоки TurboWarp \",\"tw.unshared.2\":\"Перейдіть на {link}, щоб отримати більше інформації\",\"tw.unshared.bug\":\"Якщо насправді цей проект опубліковано, повідомте нам про помилку.\",\"tw.usernameModal.help\":\"Це значення буде зберігатися в пам'яті вашого браузера. Воно буде використовуватися, коли ви взаємодієте з проектами, що містять хмарні змінні.\",\"tw.usernameModal.help2\":\"Значення, які не відповідають дійсному обліковому запису Scratch, зазвичай відхиляються сервером хмарних змінних. Ми рекомендуємо залишити його як є або змінити його на своє ім'я користувача в Scratch.\",\"tw.usernameModal.mustChange\":\"Вибачте, сервер хмарних змінних вважає, що ваше ім'я користувача неприйнятне, Будь-ласка змініть ім'я користувача на щось інше або на {resetIt}\",\"tw.usernameModal.mustChange.resetIt\":\"скинути його (рекомендовано)\",\"tw.usernameModal.reset\":\"Скинути\",\"tw.usernameModal.title\":\"Змінити ім'я користувача\",\"tw.viewFeaturedProjects\":\"Натисніть щоб переглянути обрані проекти.\",\"tw.viewOnScratch\":\"Проглянути проєкт на Scratch\",\"tw.webglModal.description\":\"На жаль, ваш браузер або ком'пютер {webGlLink}. Ця технологія необхідна для роботи цього сайту. Спробуйте обновити браузер і драйвера або перезавантажте комп'ютер.\"},\"vi\":{\"tw.alerts.creatingRestorePoint\":\"Đang tạo điiểm khôi phục\",\"tw.alerts.lostPeripheralConnection\":\"Mất kết nối từ {extensionName}\",\"tw.alerts.savedToDisk\":\"Đã lưu vời máy tính bạn.\",\"tw.backpack.rename\":\"Tên mới:\",\"tw.blocks.openDocs\":\"Mở tài liệu\",\"tw.browserModal.desc\":\"Đảm bảo bạn đang sử dụng Google Chrome, Mozilla Firefox, Microsoft Edge, hoặc Apple Safari phiên bản mới nhất.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Tên người dùng không thể đổi khi dự án đang chạy.\",\"tw.feedbackButton\":\"Phản hồi TurboWarp\",\"tw.fps\":\"{framerate}FPS\",\"tw.gui.crashMessage.description\":\"Chúng tôi xin lỗi, nhưng hình như trang có vấn đề. Xin vui lòng tải lại trang của bạn để thử lại.\",\"tw.home.credit\":\"Ghi chú và Tín dụng\",\"tw.home.instructions\":\"Hướng đẫn\",\"tw.input.tooltip\":\"Sao chép và đán một đường dẫn dự án Scratch vào đây!\",\"tw.loader.data\":\"Đang tải dữ liệu dự án...\",\"tw.loader.generic\":\"Đang tải dự án...\",\"tw.menuBar.60off\":\"Tắt chế độ 60 FPS\",\"tw.menuBar.60on\":\"Bật chế độ 60 FPS\",\"tw.menuBar.advanced\":\"Nâng cao\",\"tw.menuBar.changeUsername\":\"Đổi tên người dùng\",\"tw.menuBar.cloudOff\":\"Vô hiệu hóa biến đám mây\",\"tw.menuBar.cloudOn\":\"Kích hoạt biến đám mây\",\"tw.menuBar.cloudUnavailable\":\"Biến đám mây không có sẵn\",\"tw.menuBar.cloudUnavailableAlert\":\"Không thể dùng biến đám mây, hầu như vì bạn mở phần chỉnh sửa\",\"tw.menuBar.moreSettings\":\"Cài đặt nâng cao\",\"tw.menuBar.newFramerate\":\"Tỷ lệ mới:\",\"tw.menuBar.package\":\"Đóng gói dự án\",\"tw.menuBar.reportError1\":\"Một số khối lệnh không thể biên dịch\",\"tw.menuBar.reportError2\":\"Đây là một lỗi. Xin vui lòng báo cáo.\",\"tw.menuBar.saveAs\":\"Lưu thành {file}\",\"tw.menuBar.seeInside\":\"Xem bên trong\",\"tw.oldDownload\":\"Lưu để tách tệp tin...\",\"tw.saveAs\":\"Lưu thành...\",\"tw.saveTo\":\"Lưu về {file}\",\"tw.settingsModal.customStageSize\":\"Cỡ sân khấu tùy chỉnh:\",\"tw.settingsModal.dangerZone\":\"Vùng nguy hiểm\",\"tw.settingsModal.disableCompiler\":\"Vô hiệu hóa biên dịch\",\"tw.settingsModal.featured\":\"Đặc sắc\",\"tw.settingsModal.fps\":\"60 FPS (FPS tủy chỉnh)\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Bấm để dùng một tỷ lệ khung hình từ 30 hoặc 60\",\"tw.settingsModal.help\":\"Bấm để hỗ trợ\",\"tw.settingsModal.highQualityPen\":\"Bút chất lượng Cao\",\"tw.settingsModal.infiniteClones\":\"Bản sao vô hạn\",\"tw.settingsModal.infiniteClonesHelp\":\"Vô hiệu hóa giới hạn 300 bản sao của Scratch\",\"tw.settingsModal.removeLimits\":\"Xóa giới hạn\",\"tw.settingsModal.removeMiscLimits\":\"Xóa các giới hạn khác\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Xóa giới hạn hiệu ứng âm thanh và cỡ bút.\",\"tw.settingsModal.storeProjectOptions\":\"Lưu trữ cài đặt trong dự án\",\"tw.settingsModal.title\":\"Cài đặt nâng cao\",\"tw.spriteSelectorItem.rename\":\"đổi tên thành\",\"tw.studioview.authorAttribution\":\"bởi {author}\",\"tw.studioview.error\":\"Hình như có một lỗi tải trang tiếp theo của dự án\",\"tw.studioview.hoverText\":\"{title} bởi {author}\",\"tw.twExtension.name\":\"Khối TurboWarp\",\"tw.usernameModal.mustChange.resetIt\":\"cài lại (khuyến nghị)\",\"tw.usernameModal.reset\":\"Cài đặt lại\",\"tw.usernameModal.title\":\"Đổi tên người dùng\",\"tw.viewFeaturedProjects\":\"Bấm để xem dự án đặc sắc\",\"tw.viewOnScratch\":\"Xem dự án trên Scratch\"},\"zh-cn\":{\"tw.alerts.creatingRestorePoint\":\"新建还原点中...\",\"tw.alerts.lostPeripheralConnection\":\"与 {extensionName} 的连接中断了。\",\"tw.alerts.restorePointError\":\"无法创建还原点\",\"tw.alerts.restorePointSuccess\":\"可在“文件”菜单中访问还原点\",\"tw.alerts.savedToDisk\":\"已保存至您的计算机。\",\"tw.backpack.rename\":\"新名称:\",\"tw.blocks.PROCEDURES_DOCS\":\"如何使用返回值\",\"tw.blocks.PROCEDURES_RETURN\":\"返回 {v}\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"转为返回值\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"转为流程块\",\"tw.blocks.addons\":\"插件\",\"tw.blocks.buttonIsDown\":\"鼠标[MOUSE_BUTTON]键按下?\",\"tw.blocks.lastKeyPressed\":\"最后按下的键\",\"tw.blocks.mouseButton.middle\":\"(1)中键\",\"tw.blocks.mouseButton.primary\":\"(0)左键\",\"tw.blocks.mouseButton.secondary\":\"(2)右键\",\"tw.blocks.openDocs\":\"打开文档\",\"tw.browserModal.desc\":\"确保你使用的是最新版本的 Google Chrome、Mozilla Firefox、Microsoft Edge 或 Apple Safari。\",\"tw.cantUseCloud\":\"你创建的云变量仅在被上传到有云变量功能的网站或使用 {packager} 等工具转换时生效。\",\"tw.changeUsername.cannotChangeWhileRunning\":\"作品运行时无法更改用户名。\",\"tw.clipboard.danger\":\"如果你的剪贴板包含像密码之类的内容,该项目可能会共享这些给其他用户或服务器。\",\"tw.clipboard.permission\":\"在一些浏览器,剪贴板可能不允许被访问。如果允许,将自动允许进一步读取剪贴板。\",\"tw.clipboard.title\":\"该项目想要获取你剪贴板的数据。\",\"tw.code\":\"源代码\",\"tw.confirmIncompatibleExtension\":\"此扩展与 Scratch 不兼容。 用它制作的作品不能上传到 Scratch 网站。 您确定要启用它吗?\",\"tw.createdBy\":\"作者:\",\"tw.customExtension.description\":\"从URL网址、文件或JavaScript源代码加载自定义扩展。\",\"tw.customExtension.name\":\"自定义扩展\",\"tw.customExtensionModal.file\":\"文件\",\"tw.customExtensionModal.load\":\"加载\",\"tw.customExtensionModal.promptFile\":\"选择扩展的 JavaScript 文件:\",\"tw.customExtensionModal.promptText\":\"粘贴扩展的 JavaScript 源代码:\",\"tw.customExtensionModal.promptURL\":\"输入扩展的URL:\",\"tw.customExtensionModal.text\":\"文本\",\"tw.customExtensionModal.title\":\"加载自定义扩展\",\"tw.customExtensionModal.trusted\":\"此扩展将不会运行在沙盒中,因为其来自可信任的来源。\",\"tw.customExtensionModal.unsandboxed\":\"不使用沙盒运行扩展\",\"tw.customExtensionModal.unsandboxedWarning1\":\"在没有沙盒的情况下加载扩展是危险的,如果你不知道自己在做什么,就不应该启用它。\",\"tw.customExtensionModal.unsandboxedWarning2\":\"未被沙盒隔离的扩展可能会使你的项目报错,删除你的设置,盗取你的密码,或造成其他严重后果。{APP_NAME}开发人员不对由此产生的任何问题负责。\",\"tw.customExtensionModal.untrusted\":\"为了保障安全,加载来自不信任的URL网址的扩展将总是运行在沙盒中。\",\"tw.customReporters.description\":\"允许自制积木提供返回值。\",\"tw.customReporters.name\":\"自定义返回值\",\"tw.documentation\":\"文档\",\"tw.embed.persistent\":\"如果允许,将自动允许后续同一站点的嵌入内容。\",\"tw.embed.risks\":\"即使嵌入内容在沙盒中运行,它仍能访问像IP地址或大概位置等设备信息。\",\"tw.embed.title1\":\"此项目想要在舞台上嵌入 HTML 内容\",\"tw.embed.title2\":\"此项目想要在舞台上嵌入远程内容\",\"tw.extensionGallery.error\":\"加载扩展库时出错。 访问 extensions.turbowarp.org 以查找更多扩展。\",\"tw.extensionGallery.loading\":\"正在加载扩展库……\",\"tw.extensionGallery.more\":\"要了解有关扩展的更多信息,请访问 extensions.turbowarp.org\",\"tw.extensionGallery.name\":\"TurboWarp 扩展库\",\"tw.favorite\":\"收藏\",\"tw.featuredProjectsStudio\":\"在 Scratch 上查看工作室\",\"tw.feedback\":\"反馈与漏洞提交\",\"tw.feedbackButton\":\"TurboWarp 反馈\",\"tw.fetch.title\":\"此项目想要连接该网站:\",\"tw.fileInput.none\":\"未选择文件。\",\"tw.fileInput.selected\":\"选择:{name}\",\"tw.fonts.add\":\"添加\",\"tw.fonts.custom.file\":\"从你的电脑中选择一个字体文件\",\"tw.fonts.custom.name\":\"给字体命名:\",\"tw.fonts.custom1\":\"从文件添加字体\",\"tw.fonts.custom2\":\"通常在 Scratch 中不起作用。支持的格式包括:{formats}\",\"tw.fonts.delete\":\"您确定要删除“{font}”吗?所有矢量造型的该字体将使用备用字体代替。\",\"tw.fonts.fallback\":\"选择字体加载失败或被删除时的备用字体:\",\"tw.fonts.list\":\"已安装字体:\",\"tw.fonts.none\":\"尚未添加字体。\",\"tw.fonts.readError\":\"读取字体文件失败:{error}\",\"tw.fonts.system\":\"系统字体\",\"tw.fonts.system.name\":\"输入电脑中的字体名称。这个字体可能无法对所有人正确显示。\",\"tw.fonts.system1\":\"添加系统字体\",\"tw.fonts.system2\":\"可能可以在 Scratch 中运行,但不一定所有人都能正确显示。\",\"tw.fonts.title\":\"字体\",\"tw.footer.credits\":\"鸣谢\",\"tw.footer.disclaimer\":\"TurboWarp 不属于 Scratch、Scratch 团队或 Scratch 基金会。\",\"tw.footer.documentation\":\"文档\",\"tw.footer.donate\":\"捐赠\",\"tw.footer.embed\":\"将作品嵌入到网站\",\"tw.footer.parameters\":\"网址参数\",\"tw.fps\":\"{framerate} 帧\",\"tw.geolocate.permission\":\"如果允许,浏览器可能会提示您允许位置访问\",\"tw.geolocate.title\":\"项目希望知道您的位置\",\"tw.gui.crashMessage.description\":\"我们很抱歉,但页面似乎已崩溃。请刷新页面以重试。\",\"tw.gui.defaultProjectTitle\":\"作品\",\"tw.guiDefaultTitle\":\"加速运行 Scratch 作品\",\"tw.home.credit\":\"备注与鸣谢\",\"tw.home.description\":\"TurboWarp 是一款 Scratch 的修改版,它可以将作品编译成 JavaScript,使其运行速度非常快。试试在上面输入一个 Scratch 官网的作品 ID 或网页链接,或者在下面选择一个特色作品。\",\"tw.home.instructions\":\"操作说明\",\"tw.input.tooltip\":\"在这里粘贴一个 Scratch 作品的链接!\",\"tw.interpolationEnabled\":\"补帧\",\"tw.invalidParameters.clones\":\"克隆体参数不合法\",\"tw.invalidParameters.fps\":\"“fps” URL 参数不合法\",\"tw.loadError\":\"不能加载作品:{error}\",\"tw.loadExtension.embedded\":\"该项目希望通过以下代码加载一个自定义扩展:\",\"tw.loadExtension.sandboxed\":\"即使代码在沙盒中运行,它仍能访问像IP地址或大概位置等设备信息。请在继续使用扩展前确保你信任此作者。\",\"tw.loadExtension.unsandboxed\":\"不使用沙盒运行扩展\",\"tw.loadExtension.unsandboxedWarning\":\"不使用沙盒加载未知的扩展是十分危险的。这可能使你的项目报错,删除你的设置,盗取你的密码,或造成其他严重后果。{APP_NAME}开发人员不对由此产生的任何问题负责。\",\"tw.loadExtension.url\":\"该项目想通过此URL网址加载一个自定义扩展:\",\"tw.loader.assets.known\":\"下载素材中(第 {complete} 个,共 {total} 个)...\",\"tw.loader.assets.unknown\":\"下载素材中...\",\"tw.loader.data\":\"下载作品数据中...\",\"tw.loader.generic\":\"加载作品中...\",\"tw.menuBar.60off\":\"关闭 60 帧模式\",\"tw.menuBar.60on\":\"打开 60 帧模式\",\"tw.menuBar.addons\":\"插件\",\"tw.menuBar.advanced\":\"高级\",\"tw.menuBar.changeUsername\":\"更改用户名\",\"tw.menuBar.cloudOff\":\"禁用云变量\",\"tw.menuBar.cloudOn\":\"启用云变量\",\"tw.menuBar.cloudUnavailable\":\"云变量不可用\",\"tw.menuBar.cloudUnavailableAlert\":\"无法使用云变量,可能因为切换到编辑器模式了。\",\"tw.menuBar.cloudUnavailableDesktop\":\"桌面版应用无法使用云变量\",\"tw.menuBar.compileError\":\"{sprite}:{error}\",\"tw.menuBar.moreSettings\":\"高级设置\",\"tw.menuBar.newFramerate\":\"帧率:\",\"tw.menuBar.newWindow\":\"新窗口\",\"tw.menuBar.package\":\"打包作品\",\"tw.menuBar.reportError1\":\"一些脚本不能被编译。\",\"tw.menuBar.reportError2\":\"这是一个漏洞,请将它报告给开发团队。 \",\"tw.menuBar.restorePoints\":\"还原点\",\"tw.menuBar.saveAs\":\"另存为 {file}\",\"tw.menuBar.seeInside\":\"转到源代码\",\"tw.mono\":\"单声道\",\"tw.notify.permission\":\"如果允许,浏览器可能会提醒你启用通知,并自动允许进一步的通知。\",\"tw.notify.title\":\"该项目希望显示通知。\",\"tw.oldDownload\":\"保存到文件\",\"tw.opcode.2000\":\"自从2000年的天数\",\"tw.opcode.mousedown\":\"鼠标被按下?\",\"tw.opcode.mousex\":\"鼠标x坐标\",\"tw.opcode.mousey\":\"鼠标y坐标\",\"tw.openAdvanced\":\"高级设置\",\"tw.openWindow.dangerous\":\"该网站未被{APP_NAME}开发人员审核。它可能包含危险或恶意的代码。\",\"tw.openWindow.title\":\"该项目希望通过此URL网址打开新的窗口或标签页:\",\"tw.paint.alpha\":\"不透明度\",\"tw.paint.fonts.more\":\"添加更多字体……\",\"tw.privacy\":\"隐私政策\",\"tw.recordAudio.permission\":\"如果允许,浏览器可能会提醒你启用麦克风,并自动允许进一步的访问麦克风。\",\"tw.recordAudio.title\":\"该项目想通过你的麦克风录入音频。这可能包含文字记录或原始音频。该项目可能会共享这些音频给其他用户或服务器。\",\"tw.recordVideo.permission\":\"如果允许,浏览器可能会提醒你启用摄像头,并自动允许进一步的访问摄像头。\",\"tw.recordVideo.title\":\"该项目想从你的摄像头录制视频。该项目可以与其他用户或服务器共享图像。\",\"tw.redirect.dangerous\":\"该网站未被{APP_NAME}开发人员审核。它可能包含危险或恶意的代码。\",\"tw.redirect.title\":\"该项目想跳转至此URL网址: \",\"tw.restorePoints.1minute\":\"每分钟\",\"tw.restorePoints.assets\":\"{n} 个素材\",\"tw.restorePoints.confirmDelete\":\"您确定要删除\\\"{projectTitle}\\\"吗?这将无法恢复\",\"tw.restorePoints.confirmDeleteAll\":\"您确定要删除所有还原点吗?这将无法恢复\",\"tw.restorePoints.confirmLoad\":\"您有未保存的更改。替换现有项目?\",\"tw.restorePoints.deleteAll\":\"删除全部\",\"tw.restorePoints.description\":\"{APP_NAME} 会定期在计算机上保存还原点,以便在忘记保存时帮助恢复项目。这是恢复的最后手段。您的计算机可能会随时悄悄删除这些还原点。请勿依赖此功能。\",\"tw.restorePoints.empty\":\"未找到还原点\",\"tw.restorePoints.error\":\"加载还原点时出错:{error}\",\"tw.restorePoints.intervalOption\":\"{time}创建还原点\",\"tw.restorePoints.loading\":\"加载中……\",\"tw.restorePoints.minutes\":\"每 {n} 分钟\",\"tw.restorePoints.never\":\"永不\",\"tw.restorePoints.off\":\"禁用还原点很危险\",\"tw.restorePoints.size\":\"预计占用空间: {size}\",\"tw.restorePoints.size2\":\"多个还原点使用的造型或声音只存储一次。\",\"tw.restorePoints.title\":\"还原点\",\"tw.sample\":\"示例作品\",\"tw.saveAs\":\"另存为\",\"tw.saveTo\":\"保存到 {file}\",\"tw.scratchUnsafeCloud\":\"如果你创建这个云变量,作品就会超过 Scratch 的 {number} 个变量的限制,如果你把作品上传到 Scratch,有些变量就不能正常工作。\",\"tw.securityManager.allow\":\"允许\",\"tw.securityManager.deny\":\"拒绝\",\"tw.securityManager.title\":\"扩展安全警告\",\"tw.securityManager.trust\":\"如果允许,将自动允许后续对同一站点的请求。\",\"tw.securityManager.why\":\"这将会被用来下载图片或音频,实现多人游戏,访问API,再或者用于恶意目的。这将与网站分享你的IP地址、大概位置和其它可能的数据。\",\"tw.settingsModal.customStageSize\":\"自定义舞台大小:\",\"tw.settingsModal.customStageSizeHelp\":\"改变 Scratch 的屏幕大小,原大小为 480x360。例如,将分辨率改为 640x360 可实现宽屏作品。但是很少有大佬能做出适合修改尺寸后能正常运行的作品。\",\"tw.settingsModal.dangerZone\":\"危险功能\",\"tw.settingsModal.disableCompiler\":\"不使用编译\",\"tw.settingsModal.disableCompilerHelp\":\"禁用 TurboWarp 编译器。该选项适合在编辑作品实时更新时使用,否则请勿启用。\",\"tw.settingsModal.featured\":\"特色\",\"tw.settingsModal.fps\":\"60 帧(自定义帧率)\",\"tw.settingsModal.fpsHelp\":\"每秒运行脚本 60 次,而不是 30 次。启用此选项后,大多数作品将无法正常工作。如果是这种情况,您应该尝试在禁用 60 帧模式的情况下使用补帧。{customFramerate}。\",\"tw.settingsModal.fpsHelp.customFramerate\":\"点击设置 30 或 60 以外的帧率\",\"tw.settingsModal.help\":\"点击查看帮助\",\"tw.settingsModal.highQualityPen\":\"高清画笔\",\"tw.settingsModal.highQualityPenHelp\":\"允许有画笔的作品以更高的分辨率渲染,并且避免编辑器中的一些坐标精度丢失。该功能可能会影响运行性能,且不是所有作品都适合该功能。\",\"tw.settingsModal.infiniteClones\":\"无限克隆\",\"tw.settingsModal.infiniteClonesHelp\":\"取消 Scratch 的 300 个克隆体限制。\",\"tw.settingsModal.interpolation\":\"补帧\",\"tw.settingsModal.interpolationHelp\":\"通过在角色的运动中插入帧使角色运动看起来更平滑。此功能不应该在 3D、光线追踪、纯画笔作品等运算量大的作品中使用。这会使它们运行得更慢而没有明显的平滑效果。\",\"tw.settingsModal.largeStageWarning\":\"我们不推荐使用自定义舞台大小!请使用具有相同长宽比的较低尺寸,并让用户开启全屏模式将其放大以匹配显示器来代替它。\",\"tw.settingsModal.removeFencing\":\"角色可穿过边缘\",\"tw.settingsModal.removeFencingHelp\":\"允许角色移到屏幕之外,根据需要变大或变小,并使触摸块在屏幕外有效。\",\"tw.settingsModal.removeLimits\":\"移除限制\",\"tw.settingsModal.removeMiscLimits\":\"移除其他限制\",\"tw.settingsModal.removeMiscLimitsHelp\":\"取消音效范围限制和画笔大小限制。\",\"tw.settingsModal.storeProjectOptions\":\"在作品中保留设置\",\"tw.settingsModal.storeProjectOptionsHelp\":\"在作品文件中储存已选择的设置,它们会在 TurboWarp 加载作品文件时自动被应用。循环计时器和不使用编译不会被保存。\",\"tw.settingsModal.title\":\"高级设置\",\"tw.settingsModal.warpTimer\":\"循环计时器\",\"tw.settingsModal.warpTimerHelp\":\"让脚本检查它们是否卡在长循环或无限循环中,并以低帧率运行,从而阻止它们卡在循环中。这会解决大多数崩溃,但对性能有很大影响,所以它只在编辑器中默认启用。\",\"tw.spriteSelectorItem.rename\":\"重命名\",\"tw.stereo\":\"双声道\",\"tw.stereoAlert\":\"编辑多声道音频会将音频转换成单声道!\",\"tw.studioview.authorAttribution\":\"作者:{author}\",\"tw.studioview.error\":\"加载下一页作品出错。\",\"tw.studioview.hoverText\":\"{title} 作者:{author}\",\"tw.tooLarge\":\"这个音频文件太大了,无法上传到 Scratch。\",\"tw.twExtension.description\":\"奇怪的块。与 Scratch 不兼容。\",\"tw.twExtension.name\":\"TurboWarp 积木\",\"tw.unfavorite\":\"取消收藏\",\"tw.unshared.2\":\"详见 {link}\",\"tw.unshared.bug\":\"如果该作品实际上是被分享的,请报告错误。\",\"tw.unshared.cache\":\"如果该项目是最近共享的,几分钟内可能会出现一些错误。\",\"tw.unshared2.1\":\"未共享的项目不可见。\",\"tw.usernameModal.help\":\"此变量将存储在浏览器中。当您与包含云变量的作品交互时,它可能会被记录。\",\"tw.usernameModal.help2\":\"与有效的 Scratch 帐户不对应的值通常会被云变量服务器拒绝。我们建议保持原样或将其更改为您的 Scratch 用户名。\",\"tw.usernameModal.mustChange\":\"抱歉,云变量服务器认为您的用户名可能不合适。请把它改成别的或 {resetIt}。\",\"tw.usernameModal.mustChange.resetIt\":\"重置(推荐)\",\"tw.usernameModal.new\":\"用户名:\",\"tw.usernameModal.reset\":\"重置\",\"tw.usernameModal.title\":\"更改用户名\",\"tw.viewFeaturedProjects\":\"点击以查看特色作品。\",\"tw.viewOnScratch\":\"在 Scratch 网站上查看作品\",\"tw.webglModal.description\":\"很抱歉,您的浏览器或电脑可能缺少 {webGlLink}。运行此网站需要此技术。请尝试更新浏览器和图形驱动程序或重启电脑。\"},\"zh-tw\":{\"tw.backpack.rename\":\"新名稱:\",\"tw.blocks.addons\":\"擴充功能\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] 被按下?\",\"tw.blocks.lastKeyPressed\":\"上一次按下的按鍵\",\"tw.blocks.mouseButton.middle\":\"(1)中鍵\",\"tw.blocks.mouseButton.primary\":\"(0)左鍵\",\"tw.blocks.mouseButton.secondary\":\"(2)右鍵\",\"tw.blocks.openDocs\":\"開啟文檔\",\"tw.browserModal.desc\":\"請確保你使用的是最新版本的 Chrome、Firefox、Edge 或 Safari。\",\"tw.code\":\"原始碼\",\"tw.customExtensionModal.file\":\"檔案\",\"tw.featuredProjectsStudio\":\"在 Scratch 查看該創作坊\",\"tw.feedback\":\"回報建議及錯誤\",\"tw.feedbackButton\":\"TurboWarp 回饋\",\"tw.footer.credits\":\"感謝\",\"tw.footer.disclaimer\":\"TurboWarp 並不隸屬於 Scratch、Scratch 團隊或 Scratch 基金會。\",\"tw.footer.embed\":\"嵌入\",\"tw.footer.parameters\":\"網址參數\",\"tw.guiDefaultTitle\":\"使 Scratch 專案跑得更快\",\"tw.home.credit\":\"備註與謝誌\",\"tw.home.instructions\":\"操作說明\",\"tw.input.tooltip\":\"把 Scratch 專案連結貼在這裡!\",\"tw.interpolationEnabled\":\"運動補償\",\"tw.invalidParameters.clones\":\"無效的「分身」網址參數\",\"tw.invalidParameters.fps\":\"無效的「影格率」網址參數\",\"tw.loadError\":\"不能夠加載作品:{error}\",\"tw.loader.assets.known\":\"下載素材中({complete}/{total})……\",\"tw.loader.assets.unknown\":\"下載素材中……\",\"tw.loader.data\":\"下載專案資料中……\",\"tw.loader.generic\":\"載入專案中……\",\"tw.menuBar.60off\":\"關閉 60 FPS模式\",\"tw.menuBar.60on\":\"開啟 60 FPS模式\",\"tw.menuBar.addons\":\"擴充功能\",\"tw.menuBar.advanced\":\"進階\",\"tw.menuBar.changeUsername\":\"更改用戶名稱\",\"tw.menuBar.cloudOff\":\"禁用雲端變數\",\"tw.menuBar.cloudOn\":\"啟用雲端變數\",\"tw.menuBar.cloudUnavailable\":\"雲端變數不可用\",\"tw.menuBar.compileError\":\"{sprite}:{error}\",\"tw.menuBar.moreSettings\":\"進階設定\",\"tw.menuBar.reportError1\":\"某些程式可能沒被編譯。\",\"tw.menuBar.reportError2\":\"這是個錯誤,請回報。\",\"tw.menuBar.saveAs\":\"儲存為 {file}\",\"tw.menuBar.seeInside\":\"切換到程式頁面\",\"tw.oldDownload\":\"存儲為獨立文件…\",\"tw.paint.alpha\":\"不透明度\",\"tw.privacy\":\"隱私權政策\",\"tw.saveAs\":\"另存為…\",\"tw.saveTo\":\"存儲為{file}\",\"tw.settingsModal.customStageSize\":\"自訂舞臺大小:\",\"tw.settingsModal.customStageSizeHelp\":\"更改 Scratch 的舞臺大小。你可以試試 640×360,比例會變成 16:9。僅有極少數的專案能在更改後正常運行。\",\"tw.settingsModal.dangerZone\":\"危險\",\"tw.settingsModal.disableCompiler\":\"停用編譯器\",\"tw.settingsModal.disableCompilerHelp\":\"停用 TurboWarp 編譯器。請不要勾選此選項,除你欲使程式立即更新。\",\"tw.settingsModal.featured\":\"精選\",\"tw.settingsModal.fps\":\"60 FPS(自訂影格率)\",\"tw.settingsModal.fpsHelp\":\"程式運行速度從每秒 30 次改為每秒 60 次,大多數專案都會無法正常運行,你應該試試運動補償。{customFramerate}。\",\"tw.settingsModal.fpsHelp.customFramerate\":\"使用30或60以外的其他影格率\",\"tw.settingsModal.help\":\"點擊查看幫助\",\"tw.settingsModal.highQualityPen\":\"高品質畫筆\",\"tw.settingsModal.highQualityPenHelp\":\"使畫筆精度提高,並在編輯器中關閉坐標四捨五入。不是所有專案都適合,且可能影響性能。\",\"tw.settingsModal.infiniteClones\":\"無限分身\",\"tw.settingsModal.infiniteClonesHelp\":\"移除 300 分身限制。\",\"tw.settingsModal.interpolation\":\"運動補償\",\"tw.settingsModal.interpolationHelp\":\"在角色移動中進行運動補償以提升流暢度。你不該在 3D 專案、光線追蹤專案、畫筆專案或運算量大的專案啟用它,不僅效果低下,還會影響效能。\",\"tw.settingsModal.largeStageWarning\":\"不建議把舞臺調得這麼大!你應當使用同比例但較小的舞臺並讓用戶以全螢幕運行。\",\"tw.settingsModal.removeFencing\":\"移除屏障\",\"tw.settingsModal.removeLimits\":\"移除限制\",\"tw.settingsModal.removeMiscLimits\":\"移除各類限制\",\"tw.settingsModal.removeMiscLimitsHelp\":\"移除音效效果限制及畫筆大小限制。\",\"tw.settingsModal.storeProjectOptions\":\"將設定存至專案內\",\"tw.settingsModal.title\":\"進階設定\",\"tw.settingsModal.warpTimer\":\"防卡死\",\"tw.settingsModal.warpTimerHelp\":\"程式卡在迴圈裡時會以低幀率運行,以防止卡死。這可以防止崩潰,但會影響性能,僅在編輯器預設啟用。\",\"tw.spriteSelectorItem.rename\":\"重新命名\",\"tw.studioview.authorAttribution\":\"作者:{author}\",\"tw.studioview.hoverText\":\"{title},作者:{author}\",\"tw.twExtension.name\":\"TurboWarp積木塊\",\"tw.usernameModal.reset\":\"重設\",\"tw.usernameModal.title\":\"更改用戶名稱\",\"tw.viewFeaturedProjects\":\"瀏覽精選專案\",\"tw.viewOnScratch\":\"在 Scratch 查看該作品\"}}");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-translations/index.js":
|
||
/*!******************************************!*\
|
||
!*** ./src/lib/tw-translations/index.js ***!
|
||
\******************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _generated_translations_json__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./generated-translations.json */ "./src/lib/tw-translations/generated-translations.json");
|
||
var _generated_translations_json__WEBPACK_IMPORTED_MODULE_0___namespace = /*#__PURE__*/__webpack_require__.t(/*! ./generated-translations.json */ "./src/lib/tw-translations/generated-translations.json", 1);
|
||
|
||
|
||
const addAdditionalTranslations = editorMessages => {
|
||
for (const locale of Object.keys(editorMessages)) {
|
||
const toMixIn = _generated_translations_json__WEBPACK_IMPORTED_MODULE_0__[locale.toLowerCase()];
|
||
|
||
if (toMixIn) {
|
||
Object.assign(editorMessages[locale], toMixIn);
|
||
}
|
||
} // We reuse our `es` translations for `es-419` instead of maintaining separate translations.
|
||
|
||
|
||
Object.assign(editorMessages['es-419'], _generated_translations_json__WEBPACK_IMPORTED_MODULE_0__.es);
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (addAdditionalTranslations);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/tw-username.js":
|
||
/*!********************************!*\
|
||
!*** ./src/lib/tw-username.js ***!
|
||
\********************************/
|
||
/*! exports provided: generateRandomUsername */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "generateRandomUsername", function() { return generateRandomUsername; });
|
||
const generateRandomUsername = () => {
|
||
const DIGITS = 4;
|
||
const randomNumber = Math.round(Math.random() * 10 ** DIGITS);
|
||
const randomId = randomNumber.toString().padStart(DIGITS, '0');
|
||
const randomUsername = "player".concat(randomId);
|
||
return randomUsername;
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/variable-utils.js":
|
||
/*!***********************************!*\
|
||
!*** ./src/lib/variable-utils.js ***!
|
||
\***********************************/
|
||
/*! exports provided: getVariable, getVariableValue, setVariableValue */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getVariable", function() { return getVariable; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getVariableValue", function() { return getVariableValue; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setVariableValue", function() { return setVariableValue; });
|
||
// Utility functions for updating variables in the VM
|
||
// TODO (VM#1145) these should be moved to top-level VM API
|
||
const getVariable = (vm, targetId, variableId) => {
|
||
const target = targetId ? vm.runtime.getTargetById(targetId) : vm.runtime.getTargetForStage();
|
||
return target.variables[variableId];
|
||
};
|
||
|
||
const getVariableValue = (vm, targetId, variableId) => {
|
||
const variable = getVariable(vm, targetId, variableId); // If array, return a new copy for mutating, ensuring that updates stay immutable.
|
||
|
||
if (variable.value instanceof Array) return variable.value.slice();
|
||
return variable.value;
|
||
};
|
||
|
||
const setVariableValue = (vm, targetId, variableId, value) => {
|
||
const variable = getVariable(vm, targetId, variableId);
|
||
variable.value = value;
|
||
|
||
if (variable.isCloud) {
|
||
vm.runtime.ioDevices.cloud.requestUpdateVariable(variable.name, variable.value);
|
||
}
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/video/camera.js":
|
||
/*!*********************************!*\
|
||
!*** ./src/lib/video/camera.js ***!
|
||
\*********************************/
|
||
/*! exports provided: requestVideoStream, requestDisableVideo */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "requestVideoStream", function() { return requestVideoStream; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "requestDisableVideo", function() { return requestDisableVideo; });
|
||
/* harmony import */ var get_user_media_promise__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! get-user-media-promise */ "./node_modules/get-user-media-promise/lib/get-user-media-promise.js");
|
||
/* harmony import */ var get_user_media_promise__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(get_user_media_promise__WEBPACK_IMPORTED_MODULE_0__);
|
||
// Single Setup For All Video Streams used by the GUI
|
||
// While VideoProvider uses a private _singleSetup
|
||
// property to ensure that each instance of a VideoProvider
|
||
// use the same setup, this ensures that all instances
|
||
// of VideoProviders use a single stream. This way, closing a camera modal
|
||
// does not affect the video on the stage, and a program running and disabling
|
||
// video on the stage will not affect the camera modal's video.
|
||
|
||
const requestStack = [];
|
||
|
||
const requestVideoStream = videoDesc => {
|
||
let streamPromise;
|
||
|
||
if (requestStack.length === 0) {
|
||
streamPromise = get_user_media_promise__WEBPACK_IMPORTED_MODULE_0___default()({
|
||
audio: false,
|
||
video: videoDesc
|
||
});
|
||
requestStack.push(streamPromise);
|
||
} else if (requestStack.length > 0) {
|
||
streamPromise = requestStack[0];
|
||
requestStack.push(true);
|
||
}
|
||
|
||
return streamPromise;
|
||
};
|
||
|
||
const requestDisableVideo = () => {
|
||
requestStack.pop();
|
||
if (requestStack.length > 0) return false;
|
||
return true;
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/video/video-provider.js":
|
||
/*!*****************************************!*\
|
||
!*** ./src/lib/video/video-provider.js ***!
|
||
\*****************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _camera_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./camera.js */ "./src/lib/video/camera.js");
|
||
/* harmony import */ var _log_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../log.js */ "./src/lib/log.js");
|
||
|
||
|
||
/**
|
||
* Video Manager for video extensions.
|
||
*/
|
||
|
||
class VideoProvider {
|
||
constructor() {
|
||
/**
|
||
* Default value for mirrored frames.
|
||
* @type boolean
|
||
*/
|
||
this.mirror = true;
|
||
/**
|
||
* Cache frames for this many ms.
|
||
* @type number
|
||
*/
|
||
|
||
this._frameCacheTimeout = 16;
|
||
/**
|
||
* DOM Video element
|
||
* @private
|
||
*/
|
||
|
||
this._video = null;
|
||
/**
|
||
* Usermedia stream track
|
||
* @private
|
||
*/
|
||
|
||
this._track = null;
|
||
/**
|
||
* Stores some canvas/frame data per resolution/mirror states
|
||
*/
|
||
|
||
this._workspace = [];
|
||
}
|
||
|
||
static get FORMAT_IMAGE_DATA() {
|
||
return 'image-data';
|
||
}
|
||
|
||
static get FORMAT_CANVAS() {
|
||
return 'canvas';
|
||
}
|
||
/**
|
||
* Dimensions the video stream is analyzed at after its rendered to the
|
||
* sample canvas.
|
||
* @type {Array.<number>}
|
||
*/
|
||
|
||
|
||
static get DIMENSIONS() {
|
||
return [480, 360];
|
||
}
|
||
/**
|
||
* Order preview drawable is inserted at in the renderer.
|
||
* @type {number}
|
||
*/
|
||
|
||
|
||
static get ORDER() {
|
||
return 1;
|
||
}
|
||
/**
|
||
* Get the HTML video element containing the stream
|
||
*/
|
||
|
||
|
||
get video() {
|
||
return this._video;
|
||
}
|
||
/**
|
||
* Request video be enabled. Sets up video, creates video skin and enables preview.
|
||
*
|
||
* @return {Promise.<Video>} resolves a promise to this video provider when video is ready.
|
||
*/
|
||
|
||
|
||
enableVideo() {
|
||
this.enabled = true;
|
||
return this._setupVideo();
|
||
}
|
||
/**
|
||
* Disable video stream (turn video off)
|
||
*/
|
||
|
||
|
||
disableVideo() {
|
||
this.enabled = false; // If we have begun a setup process, call _teardown after it completes
|
||
|
||
if (this._singleSetup) {
|
||
this._singleSetup.then(this._teardown.bind(this)).catch(err => this.onError(err));
|
||
}
|
||
}
|
||
/**
|
||
* async part of disableVideo
|
||
* @private
|
||
*/
|
||
|
||
|
||
_teardown() {
|
||
// we might be asked to re-enable before _teardown is called, just ignore it.
|
||
if (this.enabled === false) {
|
||
const disableTrack = Object(_camera_js__WEBPACK_IMPORTED_MODULE_0__["requestDisableVideo"])();
|
||
this._singleSetup = null; // by clearing refs to video and track, we should lose our hold over the camera
|
||
|
||
this._video = null;
|
||
|
||
if (this._track && disableTrack) {
|
||
this._track.stop();
|
||
}
|
||
|
||
this._track = null;
|
||
}
|
||
}
|
||
/**
|
||
* Return frame data from the video feed in a specified dimensions, format, and mirroring.
|
||
*
|
||
* @param {object} frameInfo A descriptor of the frame you would like to receive.
|
||
* @param {Array.<number>} frameInfo.dimensions [width, height] array of numbers. Defaults to [480,360]
|
||
* @param {boolean} frameInfo.mirror If you specificly want a mirror/non-mirror frame, defaults to true
|
||
* @param {string} frameInfo.format Requested video format, available formats are 'image-data' and 'canvas'.
|
||
* @param {number} frameInfo.cacheTimeout Will reuse previous image data if the time since capture is less than
|
||
* the cacheTimeout. Defaults to 16ms.
|
||
*
|
||
* @return {ArrayBuffer|Canvas|string|null} Frame data in requested format, null when errors.
|
||
*/
|
||
|
||
|
||
getFrame({
|
||
dimensions = VideoProvider.DIMENSIONS,
|
||
mirror = this.mirror,
|
||
format = VideoProvider.FORMAT_IMAGE_DATA,
|
||
cacheTimeout = this._frameCacheTimeout
|
||
}) {
|
||
if (!this.videoReady) {
|
||
return null;
|
||
}
|
||
|
||
const [width, height] = dimensions;
|
||
|
||
const workspace = this._getWorkspace({
|
||
dimensions,
|
||
mirror: Boolean(mirror)
|
||
});
|
||
|
||
const {
|
||
videoWidth,
|
||
videoHeight
|
||
} = this._video;
|
||
const {
|
||
canvas,
|
||
context,
|
||
lastUpdate,
|
||
cacheData
|
||
} = workspace;
|
||
const now = Date.now(); // if the canvas hasn't been updated...
|
||
|
||
if (lastUpdate + cacheTimeout < now) {
|
||
if (mirror) {
|
||
context.scale(-1, 1);
|
||
context.translate(width * -1, 0);
|
||
}
|
||
|
||
context.drawImage(this._video, // source x, y, width, height
|
||
0, 0, videoWidth, videoHeight, // dest x, y, width, height
|
||
0, 0, width, height); // context.resetTransform() doesn't work on Edge but the following should
|
||
|
||
context.setTransform(1, 0, 0, 1, 0, 0);
|
||
workspace.lastUpdate = now;
|
||
} // each data type has it's own data cache, but the canvas is the same
|
||
|
||
|
||
if (!cacheData[format]) {
|
||
cacheData[format] = {
|
||
lastUpdate: 0
|
||
};
|
||
}
|
||
|
||
const formatCache = cacheData[format];
|
||
|
||
if (formatCache.lastUpdate + cacheTimeout < now) {
|
||
if (format === VideoProvider.FORMAT_IMAGE_DATA) {
|
||
formatCache.lastData = context.getImageData(0, 0, width, height);
|
||
} else if (format === VideoProvider.FORMAT_CANVAS) {
|
||
// this will never change
|
||
formatCache.lastUpdate = Infinity;
|
||
formatCache.lastData = canvas;
|
||
} else {
|
||
_log_js__WEBPACK_IMPORTED_MODULE_1__["default"].error("video io error - unimplemented format ".concat(format)); // cache the null result forever, don't log about it again..
|
||
|
||
formatCache.lastUpdate = Infinity;
|
||
formatCache.lastData = null;
|
||
} // rather than set to now, this data is as stale as it's canvas is
|
||
|
||
|
||
formatCache.lastUpdate = Math.max(workspace.lastUpdate, formatCache.lastUpdate);
|
||
}
|
||
|
||
return formatCache.lastData;
|
||
}
|
||
/**
|
||
* Method called when an error happens. Default implementation is just to log error.
|
||
*
|
||
* @abstract
|
||
* @param {Error} error An error object from getUserMedia or other source of error.
|
||
*/
|
||
|
||
|
||
onError(error) {
|
||
_log_js__WEBPACK_IMPORTED_MODULE_1__["default"].error('Unhandled video io device error', error);
|
||
}
|
||
/**
|
||
* Create a video stream.
|
||
* @private
|
||
* @return {Promise} When video has been received, rejected if video is not received
|
||
*/
|
||
|
||
|
||
_setupVideo() {
|
||
// We cache the result of this setup so that we can only ever have a single
|
||
// video/getUserMedia request happen at a time.
|
||
if (this._singleSetup) {
|
||
return this._singleSetup;
|
||
}
|
||
|
||
this._singleSetup = Object(_camera_js__WEBPACK_IMPORTED_MODULE_0__["requestVideoStream"])({
|
||
width: {
|
||
min: 480,
|
||
ideal: 640
|
||
},
|
||
height: {
|
||
min: 360,
|
||
ideal: 480
|
||
}
|
||
}).then(stream => {
|
||
this._video = document.createElement('video'); // Use the new srcObject API, falling back to createObjectURL
|
||
|
||
try {
|
||
this._video.srcObject = stream;
|
||
} catch (error) {
|
||
this._video.src = window.URL.createObjectURL(stream);
|
||
} // Hint to the stream that it should load. A standard way to do this
|
||
// is add the video tag to the DOM. Since this extension wants to
|
||
// hide the video tag and instead render a sample of the stream into
|
||
// the webgl rendered Scratch canvas, another hint like this one is
|
||
// needed.
|
||
|
||
|
||
this._video.play(); // Needed for Safari/Firefox, Chrome auto-plays.
|
||
|
||
|
||
this._track = stream.getTracks()[0];
|
||
return this;
|
||
}).catch(error => {
|
||
this._singleSetup = null;
|
||
this.onError(error);
|
||
});
|
||
return this._singleSetup;
|
||
}
|
||
|
||
get videoReady() {
|
||
if (!this.enabled) {
|
||
return false;
|
||
}
|
||
|
||
if (!this._video) {
|
||
return false;
|
||
}
|
||
|
||
if (!this._track) {
|
||
return false;
|
||
}
|
||
|
||
const {
|
||
videoWidth,
|
||
videoHeight
|
||
} = this._video;
|
||
|
||
if (typeof videoWidth !== 'number' || typeof videoHeight !== 'number') {
|
||
return false;
|
||
}
|
||
|
||
if (videoWidth === 0 || videoHeight === 0) {
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
/**
|
||
* get an internal workspace for canvas/context/caches
|
||
* this uses some document stuff to create a canvas and what not, probably needs abstraction
|
||
* into the renderer layer?
|
||
* @private
|
||
* @return {object} A workspace for canvas/data storage. Internal format not documented intentionally
|
||
*/
|
||
|
||
|
||
_getWorkspace({
|
||
dimensions,
|
||
mirror
|
||
}) {
|
||
let workspace = this._workspace.find(space => space.dimensions.join('-') === dimensions.join('-') && space.mirror === mirror);
|
||
|
||
if (!workspace) {
|
||
workspace = {
|
||
dimensions,
|
||
mirror,
|
||
canvas: document.createElement('canvas'),
|
||
lastUpdate: 0,
|
||
cacheData: {}
|
||
};
|
||
workspace.canvas.width = dimensions[0];
|
||
workspace.canvas.height = dimensions[1];
|
||
workspace.context = workspace.canvas.getContext('2d');
|
||
|
||
this._workspace.push(workspace);
|
||
}
|
||
|
||
return workspace;
|
||
}
|
||
|
||
}
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (VideoProvider);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/vm-listener-hoc.jsx":
|
||
/*!*************************************!*\
|
||
!*** ./src/lib/vm-listener-hoc.jsx ***!
|
||
\*************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_3__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var _reducers_targets__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/targets */ "./src/reducers/targets.js");
|
||
/* harmony import */ var _reducers_block_drag__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/block-drag */ "./src/reducers/block-drag.js");
|
||
/* harmony import */ var _reducers_monitors__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/monitors */ "./src/reducers/monitors.js");
|
||
/* harmony import */ var _reducers_project_changed__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../reducers/project-changed */ "./src/reducers/project-changed.js");
|
||
/* harmony import */ var _reducers_vm_status__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../reducers/vm-status */ "./src/reducers/vm-status.js");
|
||
/* harmony import */ var _reducers_alerts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../reducers/alerts */ "./src/reducers/alerts.js");
|
||
/* harmony import */ var _reducers_mic_indicator__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../reducers/mic-indicator */ "./src/reducers/mic-indicator.js");
|
||
/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../reducers/tw */ "./src/reducers/tw.js");
|
||
/* harmony import */ var _reducers_custom_stage_size__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../reducers/custom-stage-size */ "./src/reducers/custom-stage-size.js");
|
||
const _excluded = ["attachKeyboardEvents", "projectChanged", "shouldUpdateTargets", "shouldUpdateProjectChanged", "onBlockDragUpdate", "onGreenFlag", "onKeyDown", "onKeyUp", "onMicListeningUpdate", "onMonitorsUpdate", "onTargetsUpdate", "onProjectChanged", "onProjectRunStart", "onProjectRunStop", "onProjectSaved", "onRuntimeStarted", "onRuntimeStopped", "onTurboModeOff", "onTurboModeOn", "hasCloudVariables", "onHasCloudVariablesChanged", "onFramerateChanged", "onInterpolationChanged", "onCompilerOptionsChanged", "onRuntimeOptionsChanged", "onStageSizeChanged", "onCompileError", "onClearCompileErrors", "onShowExtensionAlert"];
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
let compileErrorCounter = 0;
|
||
/*
|
||
* Higher Order Component to manage events emitted by the VM
|
||
* @param {React.Component} WrappedComponent component to manage VM events for
|
||
* @returns {React.Component} connected component with vm events bound to redux
|
||
*/
|
||
|
||
const vmListenerHOC = function vmListenerHOC(WrappedComponent) {
|
||
class VMListener extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleKeyDown', 'handleKeyUp', 'handleProjectChanged', 'handleTargetsUpdate', 'handleCloudDataUpdate', 'handleCompileError']); // We have to start listening to the vm here rather than in
|
||
// componentDidMount because the HOC mounts the wrapped component,
|
||
// so the HOC componentDidMount triggers after the wrapped component
|
||
// mounts.
|
||
// If the wrapped component uses the vm in componentDidMount, then
|
||
// we need to start listening before mounting the wrapped component.
|
||
|
||
this.props.vm.on('targetsUpdate', this.handleTargetsUpdate);
|
||
this.props.vm.on('MONITORS_UPDATE', this.props.onMonitorsUpdate);
|
||
this.props.vm.on('BLOCK_DRAG_UPDATE', this.props.onBlockDragUpdate);
|
||
this.props.vm.on('TURBO_MODE_ON', this.props.onTurboModeOn);
|
||
this.props.vm.on('TURBO_MODE_OFF', this.props.onTurboModeOff);
|
||
this.props.vm.on('PROJECT_RUN_START', this.props.onProjectRunStart);
|
||
this.props.vm.on('PROJECT_RUN_STOP', this.props.onProjectRunStop);
|
||
this.props.vm.on('PROJECT_CHANGED', this.handleProjectChanged);
|
||
this.props.vm.on('RUNTIME_STARTED', this.props.onRuntimeStarted);
|
||
this.props.vm.on('RUNTIME_STOPPED', this.props.onRuntimeStopped);
|
||
this.props.vm.on('PROJECT_START', this.props.onGreenFlag);
|
||
this.props.vm.on('PERIPHERAL_CONNECTION_LOST_ERROR', this.props.onShowExtensionAlert);
|
||
this.props.vm.on('MIC_LISTENING', this.props.onMicListeningUpdate);
|
||
this.props.vm.on('MIC_LISTENING', this.props.onMicListeningUpdate); // tw: add handlers for our events
|
||
|
||
this.props.vm.on('HAS_CLOUD_DATA_UPDATE', this.handleCloudDataUpdate);
|
||
this.props.vm.on('COMPILER_OPTIONS_CHANGED', this.props.onCompilerOptionsChanged);
|
||
this.props.vm.on('RUNTIME_OPTIONS_CHANGED', this.props.onRuntimeOptionsChanged);
|
||
this.props.vm.on('FRAMERATE_CHANGED', this.props.onFramerateChanged);
|
||
this.props.vm.on('INTERPOLATION_CHANGED', this.props.onInterpolationChanged);
|
||
this.props.vm.on('COMPILE_ERROR', this.handleCompileError);
|
||
this.props.vm.on('RUNTIME_STARTED', this.props.onClearCompileErrors);
|
||
this.props.vm.on('STAGE_SIZE_CHANGED', this.props.onStageSizeChanged);
|
||
}
|
||
|
||
componentDidMount() {
|
||
if (this.props.attachKeyboardEvents) {
|
||
document.addEventListener('keydown', this.handleKeyDown);
|
||
document.addEventListener('keyup', this.handleKeyUp);
|
||
}
|
||
|
||
this.props.vm.postIOData('userData', {
|
||
username: this.props.username
|
||
});
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
if (prevProps.username !== this.props.username) {
|
||
this.props.vm.postIOData('userData', {
|
||
username: this.props.username
|
||
});
|
||
} // Re-request a targets update when the shouldUpdateTargets state changes to true
|
||
// i.e. when the editor transitions out of fullscreen/player only modes
|
||
|
||
|
||
if (this.props.shouldUpdateTargets && !prevProps.shouldUpdateTargets) {
|
||
this.props.vm.emitTargetsUpdate(false
|
||
/* Emit the event, but do not trigger project change */
|
||
);
|
||
}
|
||
}
|
||
|
||
componentWillUnmount() {
|
||
this.props.vm.removeListener('PERIPHERAL_CONNECTION_LOST_ERROR', this.props.onShowExtensionAlert);
|
||
|
||
if (this.props.attachKeyboardEvents) {
|
||
document.removeEventListener('keydown', this.handleKeyDown);
|
||
document.removeEventListener('keyup', this.handleKeyUp);
|
||
}
|
||
}
|
||
|
||
handleCloudDataUpdate(hasCloudVariables) {
|
||
if (this.props.hasCloudVariables !== hasCloudVariables) {
|
||
this.props.onHasCloudVariablesChanged(hasCloudVariables);
|
||
}
|
||
} // tw: handling for compile errors
|
||
|
||
|
||
handleCompileError(target, error) {
|
||
const errorMessage = "".concat(error); // Ignore certain types of known errors
|
||
// TODO: fix the root cause of all of these
|
||
|
||
if (errorMessage.includes('edge-activated hat')) {
|
||
return;
|
||
} // Ignore intentonal errors
|
||
|
||
|
||
if (errorMessage.includes('Script explicitly disables compilation')) {
|
||
return;
|
||
}
|
||
|
||
this.props.onCompileError({
|
||
sprite: target.getName(),
|
||
error: errorMessage,
|
||
id: compileErrorCounter++
|
||
});
|
||
}
|
||
|
||
handleProjectChanged() {
|
||
if (this.props.shouldUpdateProjectChanged && !this.props.projectChanged) {
|
||
this.props.onProjectChanged();
|
||
}
|
||
}
|
||
|
||
handleTargetsUpdate(data) {
|
||
if (this.props.shouldUpdateTargets) {
|
||
this.props.onTargetsUpdate(data);
|
||
}
|
||
}
|
||
|
||
handleKeyDown(e) {
|
||
// Don't capture keys intended for Blockly inputs.
|
||
if (e.target !== document && e.target !== document.body) return;
|
||
const key = !e.key || e.key === 'Dead' ? e.keyCode : e.key;
|
||
this.props.vm.postIOData('keyboard', {
|
||
key: key,
|
||
keyCode: e.keyCode,
|
||
isDown: true
|
||
}); // Prevent space/arrow key from scrolling the page.
|
||
|
||
if (e.keyCode === 32 || e.keyCode >= 37 && e.keyCode <= 40) {
|
||
// 37, 38, 39, 40 are arrows
|
||
e.preventDefault();
|
||
} // tw: prevent backspace from going back
|
||
|
||
|
||
if (e.keyCode === 8) {
|
||
e.preventDefault();
|
||
} // tw: prevent ' and / from opening quick find in Firefox
|
||
|
||
|
||
if (e.keyCode === 222 || e.keyCode === 191) {
|
||
e.preventDefault();
|
||
}
|
||
}
|
||
|
||
handleKeyUp(e) {
|
||
// Always capture up events,
|
||
// even those that have switched to other targets.
|
||
const key = !e.key || e.key === 'Dead' ? e.keyCode : e.key;
|
||
this.props.vm.postIOData('keyboard', {
|
||
key: key,
|
||
keyCode: e.keyCode,
|
||
isDown: false
|
||
}); // E.g., prevent scroll.
|
||
|
||
if (e.target !== document && e.target !== document.body) {
|
||
e.preventDefault();
|
||
}
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
attachKeyboardEvents,
|
||
projectChanged,
|
||
shouldUpdateTargets,
|
||
shouldUpdateProjectChanged,
|
||
onBlockDragUpdate,
|
||
onGreenFlag,
|
||
onKeyDown,
|
||
onKeyUp,
|
||
onMicListeningUpdate,
|
||
onMonitorsUpdate,
|
||
onTargetsUpdate,
|
||
onProjectChanged,
|
||
onProjectRunStart,
|
||
onProjectRunStop,
|
||
onProjectSaved,
|
||
onRuntimeStarted,
|
||
onRuntimeStopped,
|
||
onTurboModeOff,
|
||
onTurboModeOn,
|
||
hasCloudVariables,
|
||
onHasCloudVariablesChanged,
|
||
onFramerateChanged,
|
||
onInterpolationChanged,
|
||
onCompilerOptionsChanged,
|
||
onRuntimeOptionsChanged,
|
||
onStageSizeChanged,
|
||
onCompileError,
|
||
onClearCompileErrors,
|
||
onShowExtensionAlert
|
||
} = _this$props,
|
||
props = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(WrappedComponent, props);
|
||
}
|
||
|
||
}
|
||
|
||
VMListener.propTypes = {
|
||
attachKeyboardEvents: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onBlockDragUpdate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onGreenFlag: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onKeyUp: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onMicListeningUpdate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onMonitorsUpdate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onProjectChanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onProjectRunStart: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onProjectRunStop: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onProjectSaved: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onRuntimeStarted: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onRuntimeStopped: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onShowExtensionAlert: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onTargetsUpdate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onTurboModeOff: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onTurboModeOn: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
hasCloudVariables: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
onHasCloudVariablesChanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onFramerateChanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onInterpolationChanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onCompilerOptionsChanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onRuntimeOptionsChanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,
|
||
onStageSizeChanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onCompileError: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onClearCompileErrors: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
projectChanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
shouldUpdateTargets: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
shouldUpdateProjectChanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
username: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_3___default.a).isRequired
|
||
};
|
||
VMListener.defaultProps = {
|
||
attachKeyboardEvents: true,
|
||
onGreenFlag: () => ({})
|
||
};
|
||
|
||
const mapStateToProps = state => ({
|
||
hasCloudVariables: state.scratchGui.tw.hasCloudVariables,
|
||
projectChanged: state.scratchGui.projectChanged,
|
||
// Do not emit target or project updates in fullscreen or player only mode
|
||
// or when recording sounds (it leads to garbled recordings on low-power machines)
|
||
shouldUpdateTargets: !state.scratchGui.mode.isFullScreen && !state.scratchGui.mode.isPlayerOnly && !state.scratchGui.modals.soundRecorder,
|
||
// Do not update the projectChanged state in fullscreen or player only mode
|
||
shouldUpdateProjectChanged: !state.scratchGui.mode.isFullScreen && !state.scratchGui.mode.isPlayerOnly,
|
||
vm: state.scratchGui.vm,
|
||
username: state.session && state.session.session && state.session.session.user ? state.session.session.user.username : state.scratchGui.tw ? state.scratchGui.tw.username : ''
|
||
});
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onTargetsUpdate: data => {
|
||
dispatch(Object(_reducers_targets__WEBPACK_IMPORTED_MODULE_5__["updateTargets"])(data.targetList, data.editingTarget));
|
||
},
|
||
onMonitorsUpdate: monitorList => {
|
||
dispatch(Object(_reducers_monitors__WEBPACK_IMPORTED_MODULE_7__["updateMonitors"])(monitorList));
|
||
},
|
||
onBlockDragUpdate: areBlocksOverGui => {
|
||
dispatch(Object(_reducers_block_drag__WEBPACK_IMPORTED_MODULE_6__["updateBlockDrag"])(areBlocksOverGui));
|
||
},
|
||
onProjectRunStart: () => dispatch(Object(_reducers_vm_status__WEBPACK_IMPORTED_MODULE_9__["setRunningState"])(true)),
|
||
onProjectRunStop: () => dispatch(Object(_reducers_vm_status__WEBPACK_IMPORTED_MODULE_9__["setRunningState"])(false)),
|
||
onProjectChanged: () => dispatch(Object(_reducers_project_changed__WEBPACK_IMPORTED_MODULE_8__["setProjectChanged"])()),
|
||
onProjectSaved: () => dispatch(Object(_reducers_project_changed__WEBPACK_IMPORTED_MODULE_8__["setProjectUnchanged"])()),
|
||
onRuntimeStarted: () => dispatch(Object(_reducers_vm_status__WEBPACK_IMPORTED_MODULE_9__["setStartedState"])(true)),
|
||
onRuntimeStopped: () => dispatch(Object(_reducers_vm_status__WEBPACK_IMPORTED_MODULE_9__["setStartedState"])(false)),
|
||
onTurboModeOn: () => dispatch(Object(_reducers_vm_status__WEBPACK_IMPORTED_MODULE_9__["setTurboState"])(true)),
|
||
onTurboModeOff: () => dispatch(Object(_reducers_vm_status__WEBPACK_IMPORTED_MODULE_9__["setTurboState"])(false)),
|
||
onHasCloudVariablesChanged: hasCloudVariables => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_12__["setHasCloudVariables"])(hasCloudVariables)),
|
||
onFramerateChanged: framerate => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_12__["setFramerateState"])(framerate)),
|
||
onInterpolationChanged: interpolation => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_12__["setInterpolationState"])(interpolation)),
|
||
onCompilerOptionsChanged: options => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_12__["setCompilerOptionsState"])(options)),
|
||
onRuntimeOptionsChanged: options => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_12__["setRuntimeOptionsState"])(options)),
|
||
onStageSizeChanged: (width, height) => dispatch(Object(_reducers_custom_stage_size__WEBPACK_IMPORTED_MODULE_13__["setCustomStageSize"])(width, height)),
|
||
onCompileError: errors => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_12__["addCompileError"])(errors)),
|
||
onClearCompileErrors: () => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_12__["clearCompileErrors"])()),
|
||
onShowExtensionAlert: data => {
|
||
dispatch(Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_10__["showExtensionAlert"])(data));
|
||
},
|
||
onMicListeningUpdate: listening => {
|
||
dispatch(Object(_reducers_mic_indicator__WEBPACK_IMPORTED_MODULE_11__["updateMicIndicator"])(listening));
|
||
}
|
||
});
|
||
|
||
return Object(react_redux__WEBPACK_IMPORTED_MODULE_4__["connect"])(mapStateToProps, mapDispatchToProps)(VMListener);
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (vmListenerHOC);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/lib/vm-manager-hoc.jsx":
|
||
/*!************************************!*\
|
||
!*** ./src/lib/vm-manager-hoc.jsx ***!
|
||
\************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash.bindall */ "./node_modules/lodash.bindall/index.js");
|
||
/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
||
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);
|
||
/* harmony import */ var scratch_audio__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! scratch-audio */ "./node_modules/scratch-audio/src/index.js");
|
||
/* harmony import */ var scratch_audio__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(scratch_audio__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _reducers_project_changed__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../reducers/project-changed */ "./src/reducers/project-changed.js");
|
||
/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../reducers/project-state */ "./src/reducers/project-state.js");
|
||
const _excluded = ["fontsLoaded", "loadingState", "locale", "messages", "isStarted", "onError", "onLoadedProject", "onSetProjectUnchanged", "projectData", "isLoadingWithId", "vm"];
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/*
|
||
* Higher Order Component to manage events emitted by the VM
|
||
* @param {React.Component} WrappedComponent component to manage VM events for
|
||
* @returns {React.Component} connected component with vm events bound to redux
|
||
*/
|
||
|
||
const vmManagerHOC = function vmManagerHOC(WrappedComponent) {
|
||
class VMManager extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['loadProject']);
|
||
}
|
||
|
||
componentDidMount() {
|
||
if (!this.props.vm.initialized) {
|
||
window.vm = this.props.vm;
|
||
this.audioEngine = new scratch_audio__WEBPACK_IMPORTED_MODULE_5___default.a();
|
||
this.props.vm.attachAudioEngine(this.audioEngine);
|
||
this.props.vm.initialized = true;
|
||
this.props.vm.setLocale(this.props.locale, this.props.messages);
|
||
}
|
||
|
||
if (!this.props.isPlayerOnly && !this.props.isStarted) {
|
||
this.props.vm.start();
|
||
}
|
||
}
|
||
|
||
componentDidUpdate(prevProps) {
|
||
// if project is in loading state, AND fonts are loaded,
|
||
// and they weren't both that way until now... load project!
|
||
if (this.props.isLoadingWithId && this.props.fontsLoaded && (!prevProps.isLoadingWithId || !prevProps.fontsLoaded)) {
|
||
this.loadProject();
|
||
} // Start the VM if entering editor mode with an unstarted vm
|
||
|
||
|
||
if (!this.props.isPlayerOnly && !this.props.isStarted) {
|
||
this.props.vm.start();
|
||
}
|
||
}
|
||
|
||
loadProject() {
|
||
// tw: stop when loading new project
|
||
this.props.vm.stop();
|
||
return this.props.vm.loadProject(this.props.projectData).then(() => {
|
||
this.props.onLoadedProject(this.props.loadingState, this.props.canSave); // Wrap in a setTimeout because skin loading in
|
||
// the renderer can be async.
|
||
|
||
setTimeout(() => this.props.onSetProjectUnchanged()); // If the vm is not running, call draw on the renderer manually
|
||
// This draws the state of the loaded project with no blocks running
|
||
// which closely matches the 2.0 behavior, except for monitors–
|
||
// 2.0 runs monitors and shows updates (e.g. timer monitor)
|
||
// before the VM starts running other hat blocks.
|
||
|
||
if (!this.props.isStarted) {
|
||
// Wrap in a setTimeout because skin loading in
|
||
// the renderer can be async.
|
||
setTimeout(() => this.props.vm.renderer.draw());
|
||
}
|
||
}).catch(e => {
|
||
this.props.onError(e);
|
||
});
|
||
}
|
||
|
||
render() {
|
||
const _this$props = this.props,
|
||
{
|
||
/* eslint-disable no-unused-vars */
|
||
fontsLoaded,
|
||
loadingState,
|
||
locale,
|
||
messages,
|
||
isStarted,
|
||
onError: onErrorProp,
|
||
onLoadedProject: onLoadedProjectProp,
|
||
onSetProjectUnchanged,
|
||
projectData,
|
||
|
||
/* eslint-enable no-unused-vars */
|
||
isLoadingWithId: isLoadingWithIdProp,
|
||
vm
|
||
} = _this$props,
|
||
componentProps = _objectWithoutProperties(_this$props, _excluded);
|
||
|
||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(WrappedComponent, _extends({
|
||
isLoading: isLoadingWithIdProp,
|
||
vm: vm
|
||
}, componentProps));
|
||
}
|
||
|
||
}
|
||
|
||
VMManager.propTypes = {
|
||
canSave: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
cloudHost: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
fontsLoaded: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isLoadingWithId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isPlayerOnly: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
isStarted: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
|
||
loadingState: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(_reducers_project_state__WEBPACK_IMPORTED_MODULE_7__["LoadingStates"]),
|
||
locale: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
messages: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.objectOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),
|
||
onError: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onLoadedProject: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
onSetProjectUnchanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
|
||
projectData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string]),
|
||
projectId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number]),
|
||
username: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
|
||
vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a).isRequired
|
||
};
|
||
|
||
const mapStateToProps = state => {
|
||
const loadingState = state.scratchGui.projectState.loadingState;
|
||
return {
|
||
fontsLoaded: state.scratchGui.fontsLoaded,
|
||
isLoadingWithId: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_7__["getIsLoadingWithId"])(loadingState),
|
||
locale: state.locales.locale,
|
||
messages: state.locales.messages,
|
||
projectData: state.scratchGui.projectState.projectData,
|
||
projectId: state.scratchGui.projectState.projectId,
|
||
loadingState: loadingState,
|
||
isPlayerOnly: state.scratchGui.mode.isPlayerOnly,
|
||
isStarted: state.scratchGui.vmStatus.started
|
||
};
|
||
};
|
||
|
||
const mapDispatchToProps = dispatch => ({
|
||
onError: error => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_7__["projectError"])(error)),
|
||
onLoadedProject: (loadingState, canSave) => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_7__["onLoadedProject"])(loadingState, canSave, true)),
|
||
onSetProjectUnchanged: () => dispatch(Object(_reducers_project_changed__WEBPACK_IMPORTED_MODULE_6__["setProjectUnchanged"])())
|
||
}); // Allow incoming props to override redux-provided props. Used to mock in tests.
|
||
|
||
|
||
const mergeProps = (stateProps, dispatchProps, ownProps) => Object.assign({}, stateProps, dispatchProps, ownProps);
|
||
|
||
return Object(react_redux__WEBPACK_IMPORTED_MODULE_3__["connect"])(mapStateToProps, mapDispatchToProps, mergeProps)(VMManager);
|
||
};
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (vmManagerHOC);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/playground/app-target.js":
|
||
/*!**************************************!*\
|
||
!*** ./src/playground/app-target.js ***!
|
||
\**************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
const appTarget = document.getElementById('app'); // Remove everything from the target to fix macOS Safari "Save Page As",
|
||
|
||
while (appTarget.firstChild) {
|
||
appTarget.removeChild(appTarget.firstChild);
|
||
}
|
||
|
||
document.body.classList.add('tw-loaded');
|
||
/* harmony default export */ __webpack_exports__["default"] = (appTarget);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/playground/import-first.js":
|
||
/*!****************************************!*\
|
||
!*** ./src/playground/import-first.js ***!
|
||
\****************************************/
|
||
/*! no exports provided */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _public_path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./public-path */ "./src/playground/public-path.js");
|
||
/* harmony import */ var _public_path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_public_path__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _lib_normalize_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/normalize.css */ "./src/lib/normalize.css");
|
||
/* harmony import */ var _lib_normalize_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lib_normalize_css__WEBPACK_IMPORTED_MODULE_1__);
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/playground/public-path.js":
|
||
/*!***************************************!*\
|
||
!*** ./src/playground/public-path.js ***!
|
||
\***************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* eslint-disable */
|
||
if (false) {}
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/playground/render-gui.jsx":
|
||
/*!***************************************!*\
|
||
!*** ./src/playground/render-gui.jsx ***!
|
||
\***************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _containers_gui_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../containers/gui.jsx */ "./src/containers/gui.jsx");
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
|
||
|
||
const searchParams = new URLSearchParams(location.search);
|
||
const cloudHost = searchParams.get('cloud_host') || 'wss://clouddata.turbowarp.org';
|
||
|
||
const RenderGUI = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_containers_gui_jsx__WEBPACK_IMPORTED_MODULE_1__["default"], _extends({
|
||
cloudHost: cloudHost,
|
||
canSave: false,
|
||
basePath: "",
|
||
canEditTitle: true,
|
||
enableCommunity: true
|
||
}, props));
|
||
|
||
/* harmony default export */ __webpack_exports__["default"] = (RenderGUI);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/alerts.js":
|
||
/*!********************************!*\
|
||
!*** ./src/reducers/alerts.js ***!
|
||
\********************************/
|
||
/*! exports provided: default, alertsInitialState, closeAlert, closeAlertWithId, filterInlineAlerts, filterPopupAlerts, showAlertWithTimeout, showExtensionAlert, showStandardAlert */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "alertsInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeAlert", function() { return closeAlert; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeAlertWithId", function() { return closeAlertWithId; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "filterInlineAlerts", function() { return filterInlineAlerts; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "filterPopupAlerts", function() { return filterPopupAlerts; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "showAlertWithTimeout", function() { return showAlertWithTimeout; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "showExtensionAlert", function() { return showExtensionAlert; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "showStandardAlert", function() { return showStandardAlert; });
|
||
/* harmony import */ var _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib/alerts/index.jsx */ "./src/lib/alerts/index.jsx");
|
||
/* harmony import */ var _lib_libraries_extensions_index_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/libraries/extensions/index.jsx */ "./src/lib/libraries/extensions/index.jsx");
|
||
|
||
|
||
const SHOW_ALERT = 'scratch-gui/alerts/SHOW_ALERT';
|
||
const SHOW_EXTENSION_ALERT = 'scratch-gui/alerts/SHOW_EXTENSION_ALERT';
|
||
const CLOSE_ALERT = 'scratch-gui/alerts/CLOSE_ALERT';
|
||
const CLOSE_ALERTS_WITH_ID = 'scratch-gui/alerts/CLOSE_ALERTS_WITH_ID';
|
||
const CLOSE_ALERT_WITH_ID = 'scratch-gui/alerts/CLOSE_ALERT_WITH_ID';
|
||
/**
|
||
* Initial state of alerts reducer
|
||
*
|
||
* {bool} visible - whether the alerts are visible
|
||
* {array} alertsList - list of alerts, each with properties:
|
||
* * alertType (required): one of AlertTypes
|
||
* * closeButton (optional): bool indicating that we should show close button
|
||
* * content (optional): react element (a <FormattedMessage />)
|
||
* * extentionId (optional): id string that identifies the extension
|
||
* * iconURL (optional): string
|
||
* * level (required): string, one of AlertLevels
|
||
* * message (optional): string
|
||
* * showReconnect (optional): bool
|
||
*/
|
||
|
||
const initialState = {
|
||
visible: true,
|
||
alertsList: []
|
||
};
|
||
|
||
const filterPopupAlerts = alertsList => alertsList.filter(curAlert => curAlert.alertType === _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__["AlertTypes"].STANDARD || curAlert.alertType === _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__["AlertTypes"].EXTENSION);
|
||
|
||
const filterInlineAlerts = alertsList => alertsList.filter(curAlert => curAlert.alertType === _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__["AlertTypes"].INLINE);
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case SHOW_ALERT:
|
||
{
|
||
// intended to show standard and inline alerts, but not extensions
|
||
const alertId = action.alertId;
|
||
|
||
if (alertId) {
|
||
const newAlert = {
|
||
alertId: alertId,
|
||
level: _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__["AlertLevels"].WARN // default level
|
||
|
||
};
|
||
const alertData = _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__["default"].find(thisAlertData => thisAlertData.alertId === alertId);
|
||
|
||
if (alertData) {
|
||
const newList = state.alertsList.filter(curAlert => !alertData.clearList || alertData.clearList.indexOf(curAlert.alertId) === -1);
|
||
|
||
if (action.data && action.data.message) {
|
||
newAlert.message = action.data.message;
|
||
}
|
||
|
||
newAlert.alertType = alertData.alertType || _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__["AlertTypes"].STANDARD;
|
||
newAlert.closeButton = alertData.closeButton;
|
||
newAlert.content = alertData.content;
|
||
newAlert.iconURL = alertData.iconURL;
|
||
newAlert.iconSpinner = alertData.iconSpinner;
|
||
newAlert.level = alertData.level;
|
||
newAlert.showDownload = alertData.showDownload;
|
||
newAlert.showSaveNow = alertData.showSaveNow;
|
||
newList.push(newAlert);
|
||
return Object.assign({}, state, {
|
||
alertsList: newList
|
||
});
|
||
}
|
||
}
|
||
|
||
return state; // if alert not found, show nothing
|
||
}
|
||
|
||
case SHOW_EXTENSION_ALERT:
|
||
{
|
||
const extensionId = action.data.extensionId;
|
||
|
||
if (extensionId) {
|
||
const extension = _lib_libraries_extensions_index_jsx__WEBPACK_IMPORTED_MODULE_1__["default"].find(ext => ext.extensionId === extensionId);
|
||
|
||
if (extension) {
|
||
const newList = state.alertsList.slice();
|
||
const newAlert = {
|
||
alertType: _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__["AlertTypes"].EXTENSION,
|
||
closeButton: true,
|
||
extensionId: extensionId,
|
||
extensionName: extension.name,
|
||
iconURL: extension.connectionSmallIconURL,
|
||
level: _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__["AlertLevels"].WARN,
|
||
showReconnect: true
|
||
};
|
||
newList.push(newAlert);
|
||
return Object.assign({}, state, {
|
||
alertsList: newList
|
||
});
|
||
}
|
||
}
|
||
|
||
return state; // if alert not found, show nothing
|
||
}
|
||
|
||
case CLOSE_ALERT_WITH_ID:
|
||
case CLOSE_ALERT:
|
||
{
|
||
if (action.alertId) {
|
||
action.index = state.alertsList.findIndex(a => a.alertId === action.alertId);
|
||
if (action.index === -1) return state;
|
||
}
|
||
|
||
const newList = state.alertsList.slice();
|
||
newList.splice(action.index, 1);
|
||
return Object.assign({}, state, {
|
||
alertsList: newList
|
||
});
|
||
}
|
||
|
||
case CLOSE_ALERTS_WITH_ID:
|
||
{
|
||
return Object.assign({}, state, {
|
||
alertsList: state.alertsList.filter(curAlert => curAlert.alertId !== action.alertId)
|
||
});
|
||
}
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
/**
|
||
* Action creator to close an alert with the given index.
|
||
*
|
||
* @param {object} index - the index of the alert to close.
|
||
* @return {object} - an object to be passed to the reducer.
|
||
*/
|
||
|
||
|
||
const closeAlert = function closeAlert(index) {
|
||
return {
|
||
type: CLOSE_ALERT,
|
||
index
|
||
};
|
||
};
|
||
/**
|
||
* Action creator to close all alerts with a given ID.
|
||
*
|
||
* @param {string} alertId - id string of the alert to close
|
||
* @return {object} - an object to be passed to the reducer.
|
||
*/
|
||
|
||
|
||
const closeAlertsWithId = function closeAlertsWithId(alertId) {
|
||
return {
|
||
type: CLOSE_ALERTS_WITH_ID,
|
||
alertId
|
||
};
|
||
};
|
||
/**
|
||
* Action creator to close a single alert with a given ID.
|
||
*
|
||
* @param {string} alertId - id string of the alert to close
|
||
* @return {object} - an object to be passed to the reducer.
|
||
*/
|
||
|
||
|
||
const closeAlertWithId = function closeAlertWithId(alertId) {
|
||
return {
|
||
type: CLOSE_ALERT_WITH_ID,
|
||
alertId
|
||
};
|
||
};
|
||
/**
|
||
* Action creator to show an alert with the given alertId.
|
||
*
|
||
* @param {string} alertId - id string of the alert to show
|
||
* @return {object} - an object to be passed to the reducer.
|
||
*/
|
||
|
||
|
||
const showStandardAlert = function showStandardAlert(alertId) {
|
||
return {
|
||
type: SHOW_ALERT,
|
||
alertId
|
||
};
|
||
};
|
||
/**
|
||
* Action creator to show an alert with the given input data.
|
||
*
|
||
* @param {object} data - data for the alert
|
||
* @param {string} data.message - message for the alert
|
||
* @param {string} data.extensionId - extension ID for the alert
|
||
* @return {object} - an object to be passed to the reducer.
|
||
*/
|
||
|
||
|
||
const showExtensionAlert = function showExtensionAlert(data) {
|
||
return {
|
||
type: SHOW_EXTENSION_ALERT,
|
||
data
|
||
};
|
||
};
|
||
/**
|
||
* Function to dispatch showing an alert, with optional
|
||
* timeout to make it close/go away.
|
||
*
|
||
* @param {object} dispatch - dispatch function
|
||
* @param {string} alertId - the ID of the alert
|
||
*/
|
||
|
||
|
||
const showAlertWithTimeout = function showAlertWithTimeout(dispatch, alertId) {
|
||
const alertData = _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__["default"].find(thisAlertData => thisAlertData.alertId === alertId);
|
||
|
||
if (alertData) {
|
||
dispatch(showStandardAlert(alertId));
|
||
|
||
if (alertData.maxDisplaySecs) {
|
||
setTimeout(() => {
|
||
dispatch(closeAlertsWithId(alertId));
|
||
}, alertData.maxDisplaySecs * 1000);
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/asset-drag.js":
|
||
/*!************************************!*\
|
||
!*** ./src/reducers/asset-drag.js ***!
|
||
\************************************/
|
||
/*! exports provided: default, assetDragInitialState, updateAssetDrag */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "assetDragInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAssetDrag", function() { return updateAssetDrag; });
|
||
const DRAG_UPDATE = 'scratch-gui/asset-drag/DRAG_UPDATE';
|
||
const initialState = {
|
||
dragging: false,
|
||
currentOffset: null,
|
||
img: null
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case DRAG_UPDATE:
|
||
return Object.assign({}, state, action.state);
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const updateAssetDrag = function updateAssetDrag(state) {
|
||
return {
|
||
type: DRAG_UPDATE,
|
||
state: state
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/block-drag.js":
|
||
/*!************************************!*\
|
||
!*** ./src/reducers/block-drag.js ***!
|
||
\************************************/
|
||
/*! exports provided: default, blockDragInitialState, updateBlockDrag */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "blockDragInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateBlockDrag", function() { return updateBlockDrag; });
|
||
const BLOCK_DRAG_UPDATE = 'scratch-gui/block-drag/BLOCK_DRAG_UPDATE';
|
||
const initialState = false;
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case BLOCK_DRAG_UPDATE:
|
||
return action.areBlocksOverGui;
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const updateBlockDrag = function updateBlockDrag(areBlocksOverGui) {
|
||
return {
|
||
type: BLOCK_DRAG_UPDATE,
|
||
areBlocksOverGui: areBlocksOverGui,
|
||
meta: {
|
||
throttle: 30
|
||
}
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/cards.js":
|
||
/*!*******************************!*\
|
||
!*** ./src/reducers/cards.js ***!
|
||
\*******************************/
|
||
/*! exports provided: default, cardsInitialState, activateDeck, viewCards, closeCards, shrinkExpandCards, nextStep, prevStep, dragCard, startDrag, endDrag */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cardsInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "activateDeck", function() { return activateDeck; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "viewCards", function() { return viewCards; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeCards", function() { return closeCards; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shrinkExpandCards", function() { return shrinkExpandCards; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nextStep", function() { return nextStep; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prevStep", function() { return prevStep; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dragCard", function() { return dragCard; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "startDrag", function() { return startDrag; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "endDrag", function() { return endDrag; });
|
||
/* harmony import */ var _lib_analytics__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib/analytics */ "./src/lib/analytics.js");
|
||
/* harmony import */ var _lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/libraries/decks/index.jsx */ "./src/lib/libraries/decks/index.jsx");
|
||
|
||
|
||
const CLOSE_CARDS = 'scratch-gui/cards/CLOSE_CARDS';
|
||
const SHRINK_EXPAND_CARDS = 'scratch-gui/cards/SHRINK_EXPAND_CARDS';
|
||
const VIEW_CARDS = 'scratch-gui/cards/VIEW_CARDS';
|
||
const ACTIVATE_DECK = 'scratch-gui/cards/ACTIVATE_DECK';
|
||
const NEXT_STEP = 'scratch-gui/cards/NEXT_STEP';
|
||
const PREV_STEP = 'scratch-gui/cards/PREV_STEP';
|
||
const DRAG_CARD = 'scratch-gui/cards/DRAG_CARD';
|
||
const START_DRAG = 'scratch-gui/cards/START_DRAG';
|
||
const END_DRAG = 'scratch-gui/cards/END_DRAG';
|
||
const initialState = {
|
||
visible: false,
|
||
content: _lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_1__["default"],
|
||
activeDeckId: null,
|
||
step: 0,
|
||
x: 0,
|
||
y: 0,
|
||
expanded: true,
|
||
dragging: false
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case CLOSE_CARDS:
|
||
return Object.assign({}, state, {
|
||
visible: false
|
||
});
|
||
|
||
case SHRINK_EXPAND_CARDS:
|
||
return Object.assign({}, state, {
|
||
expanded: !state.expanded
|
||
});
|
||
|
||
case VIEW_CARDS:
|
||
return Object.assign({}, state, {
|
||
visible: true
|
||
});
|
||
|
||
case ACTIVATE_DECK:
|
||
return Object.assign({}, state, {
|
||
activeDeckId: action.activeDeckId,
|
||
step: 0,
|
||
x: 0,
|
||
y: 0,
|
||
expanded: true,
|
||
visible: true
|
||
});
|
||
|
||
case NEXT_STEP:
|
||
if (state.activeDeckId !== null) {
|
||
_lib_analytics__WEBPACK_IMPORTED_MODULE_0__["default"].event({
|
||
category: 'how-to',
|
||
action: 'next step',
|
||
label: "".concat(state.activeDeckId, " - ").concat(state.step)
|
||
});
|
||
return Object.assign({}, state, {
|
||
step: state.step + 1
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case PREV_STEP:
|
||
if (state.activeDeckId !== null) {
|
||
if (state.step > 0) {
|
||
return Object.assign({}, state, {
|
||
step: state.step - 1
|
||
});
|
||
}
|
||
}
|
||
|
||
return state;
|
||
|
||
case DRAG_CARD:
|
||
return Object.assign({}, state, {
|
||
x: action.x,
|
||
y: action.y
|
||
});
|
||
|
||
case START_DRAG:
|
||
return Object.assign({}, state, {
|
||
dragging: true
|
||
});
|
||
|
||
case END_DRAG:
|
||
return Object.assign({}, state, {
|
||
dragging: false
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const activateDeck = function activateDeck(activeDeckId) {
|
||
return {
|
||
type: ACTIVATE_DECK,
|
||
activeDeckId
|
||
};
|
||
};
|
||
|
||
const viewCards = function viewCards() {
|
||
return {
|
||
type: VIEW_CARDS
|
||
};
|
||
};
|
||
|
||
const closeCards = function closeCards() {
|
||
return {
|
||
type: CLOSE_CARDS
|
||
};
|
||
};
|
||
|
||
const shrinkExpandCards = function shrinkExpandCards() {
|
||
return {
|
||
type: SHRINK_EXPAND_CARDS
|
||
};
|
||
};
|
||
|
||
const nextStep = function nextStep() {
|
||
return {
|
||
type: NEXT_STEP
|
||
};
|
||
};
|
||
|
||
const prevStep = function prevStep() {
|
||
return {
|
||
type: PREV_STEP
|
||
};
|
||
};
|
||
|
||
const dragCard = function dragCard(x, y) {
|
||
return {
|
||
type: DRAG_CARD,
|
||
x,
|
||
y
|
||
};
|
||
};
|
||
|
||
const startDrag = function startDrag() {
|
||
return {
|
||
type: START_DRAG
|
||
};
|
||
};
|
||
|
||
const endDrag = function endDrag() {
|
||
return {
|
||
type: END_DRAG
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/color-picker.js":
|
||
/*!**************************************!*\
|
||
!*** ./src/reducers/color-picker.js ***!
|
||
\**************************************/
|
||
/*! exports provided: default, colorPickerInitialState, activateColorPicker, deactivateColorPicker, setCallback */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "colorPickerInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "activateColorPicker", function() { return activateColorPicker; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "deactivateColorPicker", function() { return deactivateColorPicker; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setCallback", function() { return setCallback; });
|
||
const ACTIVATE_COLOR_PICKER = 'scratch-gui/color-picker/ACTIVATE_COLOR_PICKER';
|
||
const DEACTIVATE_COLOR_PICKER = 'scratch-gui/color-picker/DEACTIVATE_COLOR_PICKER';
|
||
const SET_CALLBACK = 'scratch-gui/color-picker/SET_CALLBACK';
|
||
const initialState = {
|
||
active: false,
|
||
callback: () => {
|
||
throw new Error('Color picker callback not initialized');
|
||
}
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case ACTIVATE_COLOR_PICKER:
|
||
return Object.assign({}, state, {
|
||
active: true,
|
||
callback: action.callback
|
||
});
|
||
|
||
case DEACTIVATE_COLOR_PICKER:
|
||
// Can be called without a string to deactivate without setting color
|
||
// i.e. when clicking on the modal background
|
||
if (typeof action.color === 'string') {
|
||
state.callback(action.color);
|
||
}
|
||
|
||
return Object.assign({}, state, {
|
||
active: false
|
||
});
|
||
|
||
case SET_CALLBACK:
|
||
return Object.assign({}, state, {
|
||
callback: action.callback
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const activateColorPicker = callback => ({
|
||
type: ACTIVATE_COLOR_PICKER,
|
||
callback: callback
|
||
});
|
||
|
||
const deactivateColorPicker = color => ({
|
||
type: DEACTIVATE_COLOR_PICKER,
|
||
color: color
|
||
});
|
||
|
||
const setCallback = callback => ({
|
||
type: SET_CALLBACK,
|
||
callback: callback
|
||
});
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/connection-modal.js":
|
||
/*!******************************************!*\
|
||
!*** ./src/reducers/connection-modal.js ***!
|
||
\******************************************/
|
||
/*! exports provided: default, connectionModalInitialState, setConnectionModalExtensionId */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "connectionModalInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConnectionModalExtensionId", function() { return setConnectionModalExtensionId; });
|
||
const SET_ID = 'scratch-gui/connection-modal/setId';
|
||
const initialState = {
|
||
extensionId: null
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case SET_ID:
|
||
return Object.assign({}, state, {
|
||
extensionId: action.extensionId
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const setConnectionModalExtensionId = function setConnectionModalExtensionId(extensionId) {
|
||
return {
|
||
type: SET_ID,
|
||
extensionId: extensionId
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/custom-procedures.js":
|
||
/*!*******************************************!*\
|
||
!*** ./src/reducers/custom-procedures.js ***!
|
||
\*******************************************/
|
||
/*! exports provided: default, customProceduresInitialState, activateCustomProcedures, deactivateCustomProcedures */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "customProceduresInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "activateCustomProcedures", function() { return activateCustomProcedures; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "deactivateCustomProcedures", function() { return deactivateCustomProcedures; });
|
||
const ACTIVATE_CUSTOM_PROCEDURES = 'scratch-gui/custom-procedures/ACTIVATE_CUSTOM_PROCEDURES';
|
||
const DEACTIVATE_CUSTOM_PROCEDURES = 'scratch-gui/custom-procedures/DEACTIVATE_CUSTOM_PROCEDURES';
|
||
const SET_CALLBACK = 'scratch-gui/custom-procedures/SET_CALLBACK';
|
||
const initialState = {
|
||
active: false,
|
||
mutator: null,
|
||
callback: null
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case ACTIVATE_CUSTOM_PROCEDURES:
|
||
return Object.assign({}, state, {
|
||
active: true,
|
||
mutator: action.mutator,
|
||
callback: action.callback
|
||
});
|
||
|
||
case DEACTIVATE_CUSTOM_PROCEDURES:
|
||
// Can be called without a mutator to deactivate without new procedure
|
||
// i.e. when clicking on the modal background
|
||
if (action.mutator) {
|
||
state.callback(action.mutator);
|
||
}
|
||
|
||
return Object.assign({}, state, {
|
||
active: false,
|
||
mutator: null,
|
||
callback: null
|
||
});
|
||
|
||
case SET_CALLBACK:
|
||
return Object.assign({}, state, {
|
||
callback: action.callback
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
/**
|
||
* Action creator to open the custom procedures modal.
|
||
* @param {!Element} mutator The XML node of the mutator for the procedure.
|
||
* @param {!function(!Element)} callback The function to call when done editing procedure.
|
||
* Expect the callback to be a function that takes a new XML mutator node.
|
||
* @returns {object} An action object with type ACTIVATE_CUSTOM_PROCEDURES.
|
||
*/
|
||
|
||
|
||
const activateCustomProcedures = (mutator, callback) => ({
|
||
type: ACTIVATE_CUSTOM_PROCEDURES,
|
||
mutator: mutator,
|
||
callback: callback
|
||
});
|
||
/**
|
||
* Action creator to close the custom procedures modal.
|
||
* @param {?Element} mutator The new mutator, or null if the callback should not be called.
|
||
* @returns {object} An action object with type ACTIVATE_CUSTOM_PROCEDURES.
|
||
*/
|
||
|
||
|
||
const deactivateCustomProcedures = mutator => ({
|
||
type: DEACTIVATE_CUSTOM_PROCEDURES,
|
||
mutator: mutator
|
||
});
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/custom-stage-size.js":
|
||
/*!*******************************************!*\
|
||
!*** ./src/reducers/custom-stage-size.js ***!
|
||
\*******************************************/
|
||
/*! exports provided: default, customStageSizeInitialState, defaultStageSize, setCustomStageSize */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "customStageSizeInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultStageSize", function() { return defaultStageSize; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setCustomStageSize", function() { return setCustomStageSize; });
|
||
const SET_CUSTOM_STAGE_SIZE = 'tw/custom-stage-size/SET';
|
||
|
||
const getDimensions = () => {
|
||
// Running in node.js
|
||
if (typeof URLSearchParams === 'undefined') {
|
||
return null;
|
||
}
|
||
|
||
const urlParameters = new URLSearchParams(location.search);
|
||
const dimensionsQuery = urlParameters.get('size');
|
||
|
||
if (dimensionsQuery === null) {
|
||
return null;
|
||
}
|
||
|
||
const match = dimensionsQuery.match(/^(\d+)[^\d]+(\d+)$/);
|
||
|
||
if (!match) {
|
||
// eslint-disable-next-line no-alert
|
||
alert('Could not parse custom stage size');
|
||
return null;
|
||
}
|
||
|
||
const [_, widthText, heightText] = match;
|
||
|
||
if (!widthText || !heightText) {
|
||
return null;
|
||
}
|
||
|
||
const width = Math.max(0, Math.min(4096, +widthText));
|
||
const height = Math.max(0, Math.min(4096, +heightText));
|
||
return {
|
||
width,
|
||
height
|
||
};
|
||
};
|
||
|
||
const defaultStageSize = {
|
||
width: 480,
|
||
height: 360
|
||
};
|
||
const initialState = getDimensions() || defaultStageSize;
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case SET_CUSTOM_STAGE_SIZE:
|
||
return Object.assign({}, state, {
|
||
width: action.width,
|
||
height: action.height
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const setCustomStageSize = function setCustomStageSize(width, height) {
|
||
return {
|
||
type: SET_CUSTOM_STAGE_SIZE,
|
||
width,
|
||
height
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/editor-tab.js":
|
||
/*!************************************!*\
|
||
!*** ./src/reducers/editor-tab.js ***!
|
||
\************************************/
|
||
/*! exports provided: default, editorTabInitialState, activateTab, BLOCKS_TAB_INDEX, COSTUMES_TAB_INDEX, SOUNDS_TAB_INDEX */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "editorTabInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "activateTab", function() { return activateTab; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BLOCKS_TAB_INDEX", function() { return BLOCKS_TAB_INDEX; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "COSTUMES_TAB_INDEX", function() { return COSTUMES_TAB_INDEX; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SOUNDS_TAB_INDEX", function() { return SOUNDS_TAB_INDEX; });
|
||
const ACTIVATE_TAB = 'scratch-gui/navigation/ACTIVATE_TAB'; // Constants use numbers to make it easier to work with react-tabs
|
||
|
||
const BLOCKS_TAB_INDEX = 0;
|
||
const COSTUMES_TAB_INDEX = 1;
|
||
const SOUNDS_TAB_INDEX = 2;
|
||
const initialState = {
|
||
activeTabIndex: BLOCKS_TAB_INDEX
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case ACTIVATE_TAB:
|
||
return Object.assign({}, state, {
|
||
activeTabIndex: action.activeTabIndex
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const activateTab = function activateTab(tab) {
|
||
return {
|
||
type: ACTIVATE_TAB,
|
||
activeTabIndex: tab
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/fonts-loaded.js":
|
||
/*!**************************************!*\
|
||
!*** ./src/reducers/fonts-loaded.js ***!
|
||
\**************************************/
|
||
/*! exports provided: default, fontsLoadedInitialState, setFontsLoaded */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fontsLoadedInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setFontsLoaded", function() { return setFontsLoaded; });
|
||
const SET_FONTS_LOADED = 'fontsLoaded/SET_FONTS_LOADED';
|
||
const initialState = false;
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case SET_FONTS_LOADED:
|
||
return action.loaded;
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const setFontsLoaded = () => ({
|
||
type: SET_FONTS_LOADED,
|
||
loaded: true
|
||
});
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/gui.js":
|
||
/*!*****************************!*\
|
||
!*** ./src/reducers/gui.js ***!
|
||
\*****************************/
|
||
/*! exports provided: default, guiInitialState, guiMiddleware, initEmbedded, initFullScreen, initPlayer, initTelemetryModal, initTutorialCard */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return guiReducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "guiInitialState", function() { return guiInitialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "guiMiddleware", function() { return guiMiddleware; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initEmbedded", function() { return initEmbedded; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initFullScreen", function() { return initFullScreen; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initPlayer", function() { return initPlayer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initTelemetryModal", function() { return initTelemetryModal; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initTutorialCard", function() { return initTutorialCard; });
|
||
/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! redux */ "./node_modules/redux/es/index.js");
|
||
/* harmony import */ var _alerts__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./alerts */ "./src/reducers/alerts.js");
|
||
/* harmony import */ var _asset_drag__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./asset-drag */ "./src/reducers/asset-drag.js");
|
||
/* harmony import */ var _cards__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./cards */ "./src/reducers/cards.js");
|
||
/* harmony import */ var _color_picker__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./color-picker */ "./src/reducers/color-picker.js");
|
||
/* harmony import */ var _connection_modal__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./connection-modal */ "./src/reducers/connection-modal.js");
|
||
/* harmony import */ var _custom_procedures__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./custom-procedures */ "./src/reducers/custom-procedures.js");
|
||
/* harmony import */ var _block_drag__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./block-drag */ "./src/reducers/block-drag.js");
|
||
/* harmony import */ var _editor_tab__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./editor-tab */ "./src/reducers/editor-tab.js");
|
||
/* harmony import */ var _hovered_target__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./hovered-target */ "./src/reducers/hovered-target.js");
|
||
/* harmony import */ var _menus__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./menus */ "./src/reducers/menus.js");
|
||
/* harmony import */ var _mic_indicator__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./mic-indicator */ "./src/reducers/mic-indicator.js");
|
||
/* harmony import */ var _modals__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./modals */ "./src/reducers/modals.js");
|
||
/* harmony import */ var _mode__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./mode */ "./src/reducers/mode.js");
|
||
/* harmony import */ var _monitors__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./monitors */ "./src/reducers/monitors.js");
|
||
/* harmony import */ var _monitor_layout__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./monitor-layout */ "./src/reducers/monitor-layout.js");
|
||
/* harmony import */ var _project_changed__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./project-changed */ "./src/reducers/project-changed.js");
|
||
/* harmony import */ var _project_state__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./project-state */ "./src/reducers/project-state.js");
|
||
/* harmony import */ var _project_title__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./project-title */ "./src/reducers/project-title.js");
|
||
/* harmony import */ var _fonts_loaded__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./fonts-loaded */ "./src/reducers/fonts-loaded.js");
|
||
/* harmony import */ var _restore_deletion__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./restore-deletion */ "./src/reducers/restore-deletion.js");
|
||
/* harmony import */ var _stage_size__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./stage-size */ "./src/reducers/stage-size.js");
|
||
/* harmony import */ var _targets__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./targets */ "./src/reducers/targets.js");
|
||
/* harmony import */ var _timeout__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./timeout */ "./src/reducers/timeout.js");
|
||
/* harmony import */ var _toolbox__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./toolbox */ "./src/reducers/toolbox.js");
|
||
/* harmony import */ var _tw__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./tw */ "./src/reducers/tw.js");
|
||
/* harmony import */ var _custom_stage_size__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./custom-stage-size */ "./src/reducers/custom-stage-size.js");
|
||
/* harmony import */ var _vm__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./vm */ "./src/reducers/vm.js");
|
||
/* harmony import */ var _vm_status__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./vm-status */ "./src/reducers/vm-status.js");
|
||
/* harmony import */ var _workspace_metrics__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./workspace-metrics */ "./src/reducers/workspace-metrics.js");
|
||
/* harmony import */ var redux_throttle__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! redux-throttle */ "./node_modules/redux-throttle/build/index.js");
|
||
/* harmony import */ var redux_throttle__WEBPACK_IMPORTED_MODULE_30___default = /*#__PURE__*/__webpack_require__.n(redux_throttle__WEBPACK_IMPORTED_MODULE_30__);
|
||
/* harmony import */ var _lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../lib/libraries/decks/index.jsx */ "./src/lib/libraries/decks/index.jsx");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const guiMiddleware = Object(redux__WEBPACK_IMPORTED_MODULE_0__["compose"])(Object(redux__WEBPACK_IMPORTED_MODULE_0__["applyMiddleware"])(redux_throttle__WEBPACK_IMPORTED_MODULE_30___default()(300, {
|
||
leading: true,
|
||
trailing: true
|
||
})));
|
||
const guiInitialState = {
|
||
alerts: _alerts__WEBPACK_IMPORTED_MODULE_1__["alertsInitialState"],
|
||
assetDrag: _asset_drag__WEBPACK_IMPORTED_MODULE_2__["assetDragInitialState"],
|
||
blockDrag: _block_drag__WEBPACK_IMPORTED_MODULE_7__["blockDragInitialState"],
|
||
cards: _cards__WEBPACK_IMPORTED_MODULE_3__["cardsInitialState"],
|
||
colorPicker: _color_picker__WEBPACK_IMPORTED_MODULE_4__["colorPickerInitialState"],
|
||
connectionModal: _connection_modal__WEBPACK_IMPORTED_MODULE_5__["connectionModalInitialState"],
|
||
customStageSize: _custom_stage_size__WEBPACK_IMPORTED_MODULE_26__["customStageSizeInitialState"],
|
||
customProcedures: _custom_procedures__WEBPACK_IMPORTED_MODULE_6__["customProceduresInitialState"],
|
||
editorTab: _editor_tab__WEBPACK_IMPORTED_MODULE_8__["editorTabInitialState"],
|
||
mode: _mode__WEBPACK_IMPORTED_MODULE_13__["modeInitialState"],
|
||
hoveredTarget: _hovered_target__WEBPACK_IMPORTED_MODULE_9__["hoveredTargetInitialState"],
|
||
stageSize: _stage_size__WEBPACK_IMPORTED_MODULE_21__["stageSizeInitialState"],
|
||
menus: _menus__WEBPACK_IMPORTED_MODULE_10__["menuInitialState"],
|
||
micIndicator: _mic_indicator__WEBPACK_IMPORTED_MODULE_11__["micIndicatorInitialState"],
|
||
modals: _modals__WEBPACK_IMPORTED_MODULE_12__["modalsInitialState"],
|
||
monitors: _monitors__WEBPACK_IMPORTED_MODULE_14__["monitorsInitialState"],
|
||
monitorLayout: _monitor_layout__WEBPACK_IMPORTED_MODULE_15__["monitorLayoutInitialState"],
|
||
projectChanged: _project_changed__WEBPACK_IMPORTED_MODULE_16__["projectChangedInitialState"],
|
||
projectState: _project_state__WEBPACK_IMPORTED_MODULE_17__["projectStateInitialState"],
|
||
projectTitle: _project_title__WEBPACK_IMPORTED_MODULE_18__["projectTitleInitialState"],
|
||
fontsLoaded: _fonts_loaded__WEBPACK_IMPORTED_MODULE_19__["fontsLoadedInitialState"],
|
||
restoreDeletion: _restore_deletion__WEBPACK_IMPORTED_MODULE_20__["restoreDeletionInitialState"],
|
||
targets: _targets__WEBPACK_IMPORTED_MODULE_22__["targetsInitialState"],
|
||
timeout: _timeout__WEBPACK_IMPORTED_MODULE_23__["timeoutInitialState"],
|
||
toolbox: _toolbox__WEBPACK_IMPORTED_MODULE_24__["toolboxInitialState"],
|
||
tw: _tw__WEBPACK_IMPORTED_MODULE_25__["twInitialState"],
|
||
vm: _vm__WEBPACK_IMPORTED_MODULE_27__["vmInitialState"],
|
||
vmStatus: _vm_status__WEBPACK_IMPORTED_MODULE_28__["vmStatusInitialState"],
|
||
workspaceMetrics: _workspace_metrics__WEBPACK_IMPORTED_MODULE_29__["workspaceMetricsInitialState"]
|
||
};
|
||
|
||
const initPlayer = function initPlayer(currentState) {
|
||
return Object.assign({}, currentState, {
|
||
mode: {
|
||
isEmbedded: false,
|
||
isFullScreen: currentState.mode.isFullScreen,
|
||
isPlayerOnly: true,
|
||
// When initializing in player mode, make sure to reset
|
||
// hasEverEnteredEditorMode
|
||
hasEverEnteredEditor: false
|
||
}
|
||
});
|
||
};
|
||
|
||
const initFullScreen = function initFullScreen(currentState) {
|
||
return Object.assign({}, currentState, {
|
||
mode: {
|
||
isEmbedded: false,
|
||
isFullScreen: true,
|
||
isPlayerOnly: currentState.mode.isPlayerOnly,
|
||
hasEverEnteredEditor: currentState.mode.hasEverEnteredEditor
|
||
}
|
||
});
|
||
};
|
||
|
||
const initEmbedded = function initEmbedded(currentState) {
|
||
return Object.assign({}, currentState, {
|
||
mode: {
|
||
isEmbedded: true,
|
||
// tw: embed does not need isFullScreen anymore
|
||
isFullScreen: false,
|
||
isPlayerOnly: true,
|
||
hasEverEnteredEditor: false
|
||
}
|
||
});
|
||
};
|
||
|
||
const initTutorialCard = function initTutorialCard(currentState, deckId) {
|
||
return Object.assign({}, currentState, {
|
||
cards: {
|
||
visible: true,
|
||
content: _lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_31__["default"],
|
||
activeDeckId: deckId,
|
||
expanded: true,
|
||
step: 0,
|
||
x: 0,
|
||
y: 0,
|
||
dragging: false
|
||
}
|
||
});
|
||
};
|
||
|
||
const initTelemetryModal = function initTelemetryModal(currentState) {
|
||
return Object.assign({}, currentState, {
|
||
modals: {
|
||
telemetryModal: true // this key must match `MODAL_TELEMETRY` in modals.js
|
||
|
||
}
|
||
});
|
||
};
|
||
|
||
const guiReducer = Object(redux__WEBPACK_IMPORTED_MODULE_0__["combineReducers"])({
|
||
alerts: _alerts__WEBPACK_IMPORTED_MODULE_1__["default"],
|
||
assetDrag: _asset_drag__WEBPACK_IMPORTED_MODULE_2__["default"],
|
||
blockDrag: _block_drag__WEBPACK_IMPORTED_MODULE_7__["default"],
|
||
cards: _cards__WEBPACK_IMPORTED_MODULE_3__["default"],
|
||
colorPicker: _color_picker__WEBPACK_IMPORTED_MODULE_4__["default"],
|
||
connectionModal: _connection_modal__WEBPACK_IMPORTED_MODULE_5__["default"],
|
||
customStageSize: _custom_stage_size__WEBPACK_IMPORTED_MODULE_26__["default"],
|
||
customProcedures: _custom_procedures__WEBPACK_IMPORTED_MODULE_6__["default"],
|
||
editorTab: _editor_tab__WEBPACK_IMPORTED_MODULE_8__["default"],
|
||
mode: _mode__WEBPACK_IMPORTED_MODULE_13__["default"],
|
||
hoveredTarget: _hovered_target__WEBPACK_IMPORTED_MODULE_9__["default"],
|
||
stageSize: _stage_size__WEBPACK_IMPORTED_MODULE_21__["default"],
|
||
menus: _menus__WEBPACK_IMPORTED_MODULE_10__["default"],
|
||
micIndicator: _mic_indicator__WEBPACK_IMPORTED_MODULE_11__["default"],
|
||
modals: _modals__WEBPACK_IMPORTED_MODULE_12__["default"],
|
||
monitors: _monitors__WEBPACK_IMPORTED_MODULE_14__["default"],
|
||
monitorLayout: _monitor_layout__WEBPACK_IMPORTED_MODULE_15__["default"],
|
||
projectChanged: _project_changed__WEBPACK_IMPORTED_MODULE_16__["default"],
|
||
projectState: _project_state__WEBPACK_IMPORTED_MODULE_17__["default"],
|
||
projectTitle: _project_title__WEBPACK_IMPORTED_MODULE_18__["default"],
|
||
fontsLoaded: _fonts_loaded__WEBPACK_IMPORTED_MODULE_19__["default"],
|
||
restoreDeletion: _restore_deletion__WEBPACK_IMPORTED_MODULE_20__["default"],
|
||
targets: _targets__WEBPACK_IMPORTED_MODULE_22__["default"],
|
||
timeout: _timeout__WEBPACK_IMPORTED_MODULE_23__["default"],
|
||
toolbox: _toolbox__WEBPACK_IMPORTED_MODULE_24__["default"],
|
||
tw: _tw__WEBPACK_IMPORTED_MODULE_25__["default"],
|
||
vm: _vm__WEBPACK_IMPORTED_MODULE_27__["default"],
|
||
vmStatus: _vm_status__WEBPACK_IMPORTED_MODULE_28__["default"],
|
||
workspaceMetrics: _workspace_metrics__WEBPACK_IMPORTED_MODULE_29__["default"]
|
||
});
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/hovered-target.js":
|
||
/*!****************************************!*\
|
||
!*** ./src/reducers/hovered-target.js ***!
|
||
\****************************************/
|
||
/*! exports provided: default, hoveredTargetInitialState, setHoveredSprite, setReceivedBlocks */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hoveredTargetInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setHoveredSprite", function() { return setHoveredSprite; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setReceivedBlocks", function() { return setReceivedBlocks; });
|
||
const SET_HOVERED_SPRITE = 'scratch-gui/hovered-target/SET_HOVERED_SPRITE';
|
||
const SET_RECEIVED_BLOCKS = 'scratch-gui/hovered-target/SET_RECEIVED_BLOCKS';
|
||
const initialState = {
|
||
sprite: null,
|
||
receivedBlocks: false
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case SET_HOVERED_SPRITE:
|
||
return {
|
||
sprite: action.spriteId,
|
||
receivedBlocks: false
|
||
};
|
||
|
||
case SET_RECEIVED_BLOCKS:
|
||
return {
|
||
sprite: state.sprite,
|
||
receivedBlocks: action.receivedBlocks
|
||
};
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const setHoveredSprite = function setHoveredSprite(spriteId) {
|
||
return {
|
||
type: SET_HOVERED_SPRITE,
|
||
spriteId: spriteId,
|
||
meta: {
|
||
throttle: 30
|
||
}
|
||
};
|
||
};
|
||
|
||
const setReceivedBlocks = function setReceivedBlocks(receivedBlocks) {
|
||
return {
|
||
type: SET_RECEIVED_BLOCKS,
|
||
receivedBlocks: receivedBlocks
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/locales.js":
|
||
/*!*********************************!*\
|
||
!*** ./src/reducers/locales.js ***!
|
||
\*********************************/
|
||
/*! exports provided: default, localesInitialState, initLocale, selectLocale, setLocales */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "localesInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initLocale", function() { return initLocale; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "selectLocale", function() { return selectLocale; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setLocales", function() { return setLocales; });
|
||
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-intl */ "./node_modules/react-intl/lib/index.es.js");
|
||
/* harmony import */ var _turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @turbowarp/scratch-l10n */ "./node_modules/@turbowarp/scratch-l10n/src/index.js");
|
||
/* harmony import */ var _turbowarp_scratch_l10n_locales_editor_msgs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @turbowarp/scratch-l10n/locales/editor-msgs */ "./node_modules/@turbowarp/scratch-l10n/locales/editor-msgs.js");
|
||
/* harmony import */ var _lib_tw_translations_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/tw-translations/index.js */ "./src/lib/tw-translations/index.js");
|
||
/* harmony import */ var _lib_detect_locale_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/detect-locale.js */ "./src/lib/detect-locale.js");
|
||
|
||
|
||
|
||
|
||
|
||
Object(_lib_tw_translations_index_js__WEBPACK_IMPORTED_MODULE_3__["default"])(_turbowarp_scratch_l10n_locales_editor_msgs__WEBPACK_IMPORTED_MODULE_2__["default"]);
|
||
Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["addLocaleData"])(_turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_1__["localeData"]);
|
||
const UPDATE_LOCALES = 'scratch-gui/locales/UPDATE_LOCALES';
|
||
const SELECT_LOCALE = 'scratch-gui/locales/SELECT_LOCALE';
|
||
const initialState = {
|
||
isRtl: false,
|
||
locale: 'en',
|
||
messagesByLocale: _turbowarp_scratch_l10n_locales_editor_msgs__WEBPACK_IMPORTED_MODULE_2__["default"],
|
||
messages: _turbowarp_scratch_l10n_locales_editor_msgs__WEBPACK_IMPORTED_MODULE_2__["default"].en
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case SELECT_LOCALE:
|
||
return Object.assign({}, state, {
|
||
isRtl: Object(_turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_1__["isRtl"])(action.locale),
|
||
locale: action.locale,
|
||
messagesByLocale: state.messagesByLocale,
|
||
messages: state.messagesByLocale[action.locale]
|
||
});
|
||
|
||
case UPDATE_LOCALES:
|
||
return Object.assign({}, state, {
|
||
isRtl: state.isRtl,
|
||
locale: state.locale,
|
||
messagesByLocale: action.messagesByLocale,
|
||
messages: action.messagesByLocale[state.locale]
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const selectLocale = function selectLocale(locale) {
|
||
// tw: store language in localStorage
|
||
try {
|
||
localStorage.setItem(_lib_detect_locale_js__WEBPACK_IMPORTED_MODULE_4__["LANGUAGE_KEY"], locale);
|
||
} catch (e) {
|
||
/* ignore */
|
||
}
|
||
|
||
return {
|
||
type: SELECT_LOCALE,
|
||
locale: locale
|
||
};
|
||
};
|
||
|
||
const setLocales = function setLocales(localesMessages) {
|
||
return {
|
||
type: UPDATE_LOCALES,
|
||
messagesByLocale: localesMessages
|
||
};
|
||
};
|
||
|
||
const initLocale = function initLocale(currentState, locale) {
|
||
if (currentState.messagesByLocale.hasOwnProperty(locale)) {
|
||
return Object.assign({}, currentState, {
|
||
isRtl: Object(_turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_1__["isRtl"])(locale),
|
||
locale: locale,
|
||
messagesByLocale: currentState.messagesByLocale,
|
||
messages: currentState.messagesByLocale[locale]
|
||
});
|
||
} // don't change locale if it's not in the current messages
|
||
|
||
|
||
return currentState;
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/menus.js":
|
||
/*!*******************************!*\
|
||
!*** ./src/reducers/menus.js ***!
|
||
\*******************************/
|
||
/*! exports provided: default, menuInitialState, openAboutMenu, closeAboutMenu, aboutMenuOpen, openAccountMenu, closeAccountMenu, accountMenuOpen, openFileMenu, closeFileMenu, fileMenuOpen, openEditMenu, closeEditMenu, editMenuOpen, openLanguageMenu, closeLanguageMenu, languageMenuOpen, openLoginMenu, closeLoginMenu, loginMenuOpen, openErrorsMenu, closeErrorsMenu, errorsMenuOpen */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "menuInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openAboutMenu", function() { return openAboutMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeAboutMenu", function() { return closeAboutMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aboutMenuOpen", function() { return aboutMenuOpen; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openAccountMenu", function() { return openAccountMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeAccountMenu", function() { return closeAccountMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "accountMenuOpen", function() { return accountMenuOpen; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openFileMenu", function() { return openFileMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeFileMenu", function() { return closeFileMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fileMenuOpen", function() { return fileMenuOpen; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openEditMenu", function() { return openEditMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeEditMenu", function() { return closeEditMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "editMenuOpen", function() { return editMenuOpen; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openLanguageMenu", function() { return openLanguageMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeLanguageMenu", function() { return closeLanguageMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "languageMenuOpen", function() { return languageMenuOpen; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openLoginMenu", function() { return openLoginMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeLoginMenu", function() { return closeLoginMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loginMenuOpen", function() { return loginMenuOpen; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openErrorsMenu", function() { return openErrorsMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeErrorsMenu", function() { return closeErrorsMenu; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "errorsMenuOpen", function() { return errorsMenuOpen; });
|
||
const OPEN_MENU = 'scratch-gui/menus/OPEN_MENU';
|
||
const CLOSE_MENU = 'scratch-gui/menus/CLOSE_MENU';
|
||
const MENU_ABOUT = 'aboutMenu';
|
||
const MENU_ACCOUNT = 'accountMenu';
|
||
const MENU_FILE = 'fileMenu';
|
||
const MENU_EDIT = 'editMenu';
|
||
const MENU_LANGUAGE = 'languageMenu';
|
||
const MENU_LOGIN = 'loginMenu';
|
||
const MENU_ERRORS = 'errorMenu';
|
||
const initialState = {
|
||
[MENU_ABOUT]: false,
|
||
[MENU_ACCOUNT]: false,
|
||
[MENU_FILE]: false,
|
||
[MENU_EDIT]: false,
|
||
[MENU_LANGUAGE]: false,
|
||
[MENU_LOGIN]: false,
|
||
[MENU_ERRORS]: false
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case OPEN_MENU:
|
||
return Object.assign({}, state, {
|
||
[action.menu]: true
|
||
});
|
||
|
||
case CLOSE_MENU:
|
||
return Object.assign({}, state, {
|
||
[action.menu]: false
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const openMenu = menu => ({
|
||
type: OPEN_MENU,
|
||
menu: menu
|
||
});
|
||
|
||
const closeMenu = menu => ({
|
||
type: CLOSE_MENU,
|
||
menu: menu
|
||
});
|
||
|
||
const openAboutMenu = () => openMenu(MENU_ABOUT);
|
||
|
||
const closeAboutMenu = () => closeMenu(MENU_ABOUT);
|
||
|
||
const aboutMenuOpen = state => state.scratchGui.menus[MENU_ABOUT];
|
||
|
||
const openAccountMenu = () => openMenu(MENU_ACCOUNT);
|
||
|
||
const closeAccountMenu = () => closeMenu(MENU_ACCOUNT);
|
||
|
||
const accountMenuOpen = state => state.scratchGui.menus[MENU_ACCOUNT];
|
||
|
||
const openFileMenu = () => openMenu(MENU_FILE);
|
||
|
||
const closeFileMenu = () => closeMenu(MENU_FILE);
|
||
|
||
const fileMenuOpen = state => state.scratchGui.menus[MENU_FILE];
|
||
|
||
const openEditMenu = () => openMenu(MENU_EDIT);
|
||
|
||
const closeEditMenu = () => closeMenu(MENU_EDIT);
|
||
|
||
const editMenuOpen = state => state.scratchGui.menus[MENU_EDIT];
|
||
|
||
const openLanguageMenu = () => openMenu(MENU_LANGUAGE);
|
||
|
||
const closeLanguageMenu = () => closeMenu(MENU_LANGUAGE);
|
||
|
||
const languageMenuOpen = state => state.scratchGui.menus[MENU_LANGUAGE];
|
||
|
||
const openLoginMenu = () => openMenu(MENU_LOGIN);
|
||
|
||
const closeLoginMenu = () => closeMenu(MENU_LOGIN);
|
||
|
||
const loginMenuOpen = state => state.scratchGui.menus[MENU_LOGIN];
|
||
|
||
const openErrorsMenu = () => openMenu(MENU_ERRORS);
|
||
|
||
const closeErrorsMenu = () => closeMenu(MENU_ERRORS);
|
||
|
||
const errorsMenuOpen = state => state.scratchGui.menus[MENU_ERRORS];
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/mic-indicator.js":
|
||
/*!***************************************!*\
|
||
!*** ./src/reducers/mic-indicator.js ***!
|
||
\***************************************/
|
||
/*! exports provided: default, micIndicatorInitialState, updateMicIndicator */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "micIndicatorInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateMicIndicator", function() { return updateMicIndicator; });
|
||
const UPDATE = 'scratch-gui/mic-indicator/UPDATE';
|
||
const initialState = false;
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case UPDATE:
|
||
return action.visible;
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const updateMicIndicator = function updateMicIndicator(visible) {
|
||
return {
|
||
type: UPDATE,
|
||
visible: visible
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/modals.js":
|
||
/*!********************************!*\
|
||
!*** ./src/reducers/modals.js ***!
|
||
\********************************/
|
||
/*! exports provided: default, modalsInitialState, openBackdropLibrary, openCostumeLibrary, openExtensionLibrary, openLoadingProject, openSoundLibrary, openSpriteLibrary, openSoundRecorder, openTelemetryModal, openTipsLibrary, openConnectionModal, openUsernameModal, openSettingsModal, openCustomExtensionModal, openRestorePointModal, openFontsModal, closeBackdropLibrary, closeCostumeLibrary, closeExtensionLibrary, closeLoadingProject, closeSpriteLibrary, closeSoundLibrary, closeSoundRecorder, closeTelemetryModal, closeTipsLibrary, closeConnectionModal, closeUsernameModal, closeSettingsModal, closeCustomExtensionModal, closeRestorePointModal, closeFontsModal */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "modalsInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openBackdropLibrary", function() { return openBackdropLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openCostumeLibrary", function() { return openCostumeLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openExtensionLibrary", function() { return openExtensionLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openLoadingProject", function() { return openLoadingProject; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openSoundLibrary", function() { return openSoundLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openSpriteLibrary", function() { return openSpriteLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openSoundRecorder", function() { return openSoundRecorder; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openTelemetryModal", function() { return openTelemetryModal; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openTipsLibrary", function() { return openTipsLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openConnectionModal", function() { return openConnectionModal; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openUsernameModal", function() { return openUsernameModal; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openSettingsModal", function() { return openSettingsModal; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openCustomExtensionModal", function() { return openCustomExtensionModal; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openRestorePointModal", function() { return openRestorePointModal; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "openFontsModal", function() { return openFontsModal; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeBackdropLibrary", function() { return closeBackdropLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeCostumeLibrary", function() { return closeCostumeLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeExtensionLibrary", function() { return closeExtensionLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeLoadingProject", function() { return closeLoadingProject; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeSpriteLibrary", function() { return closeSpriteLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeSoundLibrary", function() { return closeSoundLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeSoundRecorder", function() { return closeSoundRecorder; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeTelemetryModal", function() { return closeTelemetryModal; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeTipsLibrary", function() { return closeTipsLibrary; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeConnectionModal", function() { return closeConnectionModal; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeUsernameModal", function() { return closeUsernameModal; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeSettingsModal", function() { return closeSettingsModal; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeCustomExtensionModal", function() { return closeCustomExtensionModal; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeRestorePointModal", function() { return closeRestorePointModal; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "closeFontsModal", function() { return closeFontsModal; });
|
||
const OPEN_MODAL = 'scratch-gui/modals/OPEN_MODAL';
|
||
const CLOSE_MODAL = 'scratch-gui/modals/CLOSE_MODAL';
|
||
const MODAL_BACKDROP_LIBRARY = 'backdropLibrary';
|
||
const MODAL_COSTUME_LIBRARY = 'costumeLibrary';
|
||
const MODAL_EXTENSION_LIBRARY = 'extensionLibrary';
|
||
const MODAL_LOADING_PROJECT = 'loadingProject';
|
||
const MODAL_TELEMETRY = 'telemetryModal';
|
||
const MODAL_SOUND_LIBRARY = 'soundLibrary';
|
||
const MODAL_SPRITE_LIBRARY = 'spriteLibrary';
|
||
const MODAL_SOUND_RECORDER = 'soundRecorder';
|
||
const MODAL_CONNECTION = 'connectionModal';
|
||
const MODAL_TIPS_LIBRARY = 'tipsLibrary';
|
||
const MODAL_USERNAME = 'usernameModal';
|
||
const MODAL_SETTINGS = 'settingsModal';
|
||
const MODAL_CUSTOM_EXTENSION = 'customExtensionModal';
|
||
const MODAL_RESTORE_POINTS = 'restorePointModal';
|
||
const MODAL_FONTS = 'fontsModal';
|
||
const initialState = {
|
||
[MODAL_BACKDROP_LIBRARY]: false,
|
||
[MODAL_COSTUME_LIBRARY]: false,
|
||
[MODAL_EXTENSION_LIBRARY]: false,
|
||
[MODAL_LOADING_PROJECT]: false,
|
||
[MODAL_TELEMETRY]: false,
|
||
[MODAL_SOUND_LIBRARY]: false,
|
||
[MODAL_SPRITE_LIBRARY]: false,
|
||
[MODAL_SOUND_RECORDER]: false,
|
||
[MODAL_CONNECTION]: false,
|
||
[MODAL_TIPS_LIBRARY]: false,
|
||
[MODAL_USERNAME]: false,
|
||
[MODAL_SETTINGS]: false,
|
||
[MODAL_CUSTOM_EXTENSION]: false,
|
||
[MODAL_RESTORE_POINTS]: false,
|
||
[MODAL_FONTS]: false
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case OPEN_MODAL:
|
||
return Object.assign({}, state, {
|
||
[action.modal]: true
|
||
});
|
||
|
||
case CLOSE_MODAL:
|
||
return Object.assign({}, state, {
|
||
[action.modal]: false
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const openModal = function openModal(modal) {
|
||
return {
|
||
type: OPEN_MODAL,
|
||
modal: modal
|
||
};
|
||
};
|
||
|
||
const closeModal = function closeModal(modal) {
|
||
return {
|
||
type: CLOSE_MODAL,
|
||
modal: modal
|
||
};
|
||
};
|
||
|
||
const openBackdropLibrary = function openBackdropLibrary() {
|
||
return openModal(MODAL_BACKDROP_LIBRARY);
|
||
};
|
||
|
||
const openCostumeLibrary = function openCostumeLibrary() {
|
||
return openModal(MODAL_COSTUME_LIBRARY);
|
||
};
|
||
|
||
const openExtensionLibrary = function openExtensionLibrary() {
|
||
return openModal(MODAL_EXTENSION_LIBRARY);
|
||
};
|
||
|
||
const openLoadingProject = function openLoadingProject() {
|
||
return openModal(MODAL_LOADING_PROJECT);
|
||
};
|
||
|
||
const openTelemetryModal = function openTelemetryModal() {
|
||
return openModal(MODAL_TELEMETRY);
|
||
};
|
||
|
||
const openSoundLibrary = function openSoundLibrary() {
|
||
return openModal(MODAL_SOUND_LIBRARY);
|
||
};
|
||
|
||
const openSpriteLibrary = function openSpriteLibrary() {
|
||
return openModal(MODAL_SPRITE_LIBRARY);
|
||
};
|
||
|
||
const openSoundRecorder = function openSoundRecorder() {
|
||
return openModal(MODAL_SOUND_RECORDER);
|
||
};
|
||
|
||
const openConnectionModal = function openConnectionModal() {
|
||
return openModal(MODAL_CONNECTION);
|
||
};
|
||
|
||
const openTipsLibrary = function openTipsLibrary() {
|
||
return openModal(MODAL_TIPS_LIBRARY);
|
||
};
|
||
|
||
const openUsernameModal = function openUsernameModal() {
|
||
return openModal(MODAL_USERNAME);
|
||
};
|
||
|
||
const openSettingsModal = function openSettingsModal() {
|
||
return openModal(MODAL_SETTINGS);
|
||
};
|
||
|
||
const openCustomExtensionModal = function openCustomExtensionModal() {
|
||
return openModal(MODAL_CUSTOM_EXTENSION);
|
||
};
|
||
|
||
const openRestorePointModal = function openRestorePointModal() {
|
||
return openModal(MODAL_RESTORE_POINTS);
|
||
};
|
||
|
||
const openFontsModal = function openFontsModal() {
|
||
return openModal(MODAL_FONTS);
|
||
};
|
||
|
||
const closeBackdropLibrary = function closeBackdropLibrary() {
|
||
return closeModal(MODAL_BACKDROP_LIBRARY);
|
||
};
|
||
|
||
const closeCostumeLibrary = function closeCostumeLibrary() {
|
||
return closeModal(MODAL_COSTUME_LIBRARY);
|
||
};
|
||
|
||
const closeExtensionLibrary = function closeExtensionLibrary() {
|
||
return closeModal(MODAL_EXTENSION_LIBRARY);
|
||
};
|
||
|
||
const closeLoadingProject = function closeLoadingProject() {
|
||
return closeModal(MODAL_LOADING_PROJECT);
|
||
};
|
||
|
||
const closeTelemetryModal = function closeTelemetryModal() {
|
||
return closeModal(MODAL_TELEMETRY);
|
||
};
|
||
|
||
const closeSpriteLibrary = function closeSpriteLibrary() {
|
||
return closeModal(MODAL_SPRITE_LIBRARY);
|
||
};
|
||
|
||
const closeSoundLibrary = function closeSoundLibrary() {
|
||
return closeModal(MODAL_SOUND_LIBRARY);
|
||
};
|
||
|
||
const closeSoundRecorder = function closeSoundRecorder() {
|
||
return closeModal(MODAL_SOUND_RECORDER);
|
||
};
|
||
|
||
const closeTipsLibrary = function closeTipsLibrary() {
|
||
return closeModal(MODAL_TIPS_LIBRARY);
|
||
};
|
||
|
||
const closeConnectionModal = function closeConnectionModal() {
|
||
return closeModal(MODAL_CONNECTION);
|
||
};
|
||
|
||
const closeUsernameModal = function closeUsernameModal() {
|
||
return closeModal(MODAL_USERNAME);
|
||
};
|
||
|
||
const closeSettingsModal = function closeSettingsModal() {
|
||
return closeModal(MODAL_SETTINGS);
|
||
};
|
||
|
||
const closeCustomExtensionModal = function closeCustomExtensionModal() {
|
||
return closeModal(MODAL_CUSTOM_EXTENSION);
|
||
};
|
||
|
||
const closeRestorePointModal = function closeRestorePointModal() {
|
||
return closeModal(MODAL_RESTORE_POINTS);
|
||
};
|
||
|
||
const closeFontsModal = function closeFontsModal() {
|
||
return closeModal(MODAL_FONTS);
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/mode.js":
|
||
/*!******************************!*\
|
||
!*** ./src/reducers/mode.js ***!
|
||
\******************************/
|
||
/*! exports provided: default, modeInitialState, setFullScreen, setPlayer */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "modeInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setFullScreen", function() { return setFullScreen; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setPlayer", function() { return setPlayer; });
|
||
const SET_FULL_SCREEN = 'scratch-gui/mode/SET_FULL_SCREEN';
|
||
const SET_PLAYER = 'scratch-gui/mode/SET_PLAYER';
|
||
const initialState = {
|
||
isEmbedded: false,
|
||
isFullScreen: false,
|
||
isPlayerOnly: false,
|
||
hasEverEnteredEditor: true
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case SET_FULL_SCREEN:
|
||
return Object.assign({}, state, {
|
||
isFullScreen: action.isFullScreen
|
||
});
|
||
|
||
case SET_PLAYER:
|
||
return Object.assign({}, state, {
|
||
isPlayerOnly: action.isPlayerOnly,
|
||
hasEverEnteredEditor: state.hasEverEnteredEditor || !action.isPlayerOnly
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const setFullScreen = function setFullScreen(isFullScreen) {
|
||
return {
|
||
type: SET_FULL_SCREEN,
|
||
isFullScreen: isFullScreen
|
||
};
|
||
};
|
||
|
||
const setPlayer = function setPlayer(isPlayerOnly) {
|
||
return {
|
||
type: SET_PLAYER,
|
||
isPlayerOnly: isPlayerOnly
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/monitor-layout.js":
|
||
/*!****************************************!*\
|
||
!*** ./src/reducers/monitor-layout.js ***!
|
||
\****************************************/
|
||
/*! exports provided: default, monitorLayoutInitialState, addMonitorRect, getInitialPosition, moveMonitorRect, resizeMonitorRect, removeMonitorRect, resetMonitorLayout, PADDING, SCREEN_HEIGHT, SCREEN_WIDTH */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "monitorLayoutInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addMonitorRect", function() { return addMonitorRect; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getInitialPosition", function() { return getInitialPosition; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "moveMonitorRect", function() { return moveMonitorRect; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resizeMonitorRect", function() { return resizeMonitorRect; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeMonitorRect", function() { return removeMonitorRect; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resetMonitorLayout", function() { return resetMonitorLayout; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PADDING", function() { return PADDING; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SCREEN_HEIGHT", function() { return SCREEN_HEIGHT; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SCREEN_WIDTH", function() { return SCREEN_WIDTH; });
|
||
/* harmony import */ var _lib_log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib/log */ "./src/lib/log.js");
|
||
|
||
const ADD_MONITOR_RECT = 'scratch-gui/monitors/ADD_MONITOR_RECT';
|
||
const MOVE_MONITOR_RECT = 'scratch-gui/monitors/MOVE_MONITOR_RECT';
|
||
const RESIZE_MONITOR_RECT = 'scratch-gui/monitors/RESIZE_MONITOR_RECT';
|
||
const REMOVE_MONITOR_RECT = 'scratch-gui/monitors/REMOVE_MONITOR_RECT';
|
||
const RESET_MONITOR_LAYOUT = 'scratch-gui/monitors/RESET_MONITOR_LAYOUT';
|
||
const initialState = {
|
||
monitors: {},
|
||
savedMonitorPositions: {}
|
||
}; // Verify that the rectangle formed by the 2 points is well-formed
|
||
|
||
const _verifyRect = function _verifyRect(upperStart, lowerEnd) {
|
||
if (isNaN(upperStart.x) || isNaN(upperStart.y) || isNaN(lowerEnd.x) || isNaN(lowerEnd.y)) {
|
||
return false;
|
||
}
|
||
|
||
if (!(upperStart.x < lowerEnd.x)) {
|
||
return false;
|
||
}
|
||
|
||
if (!(upperStart.y < lowerEnd.y)) {
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
};
|
||
|
||
const _addMonitorRect = function _addMonitorRect(state, action) {
|
||
if (state.monitors.hasOwnProperty(action.monitorId)) {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_0__["default"].error("Can't add monitor, monitor with id ".concat(action.monitorId, " already exists."));
|
||
return state;
|
||
}
|
||
|
||
if (!_verifyRect(action.upperStart, action.lowerEnd)) {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_0__["default"].error("Monitor rectangle not formatted correctly");
|
||
return state;
|
||
}
|
||
|
||
return {
|
||
monitors: Object.assign({}, state.monitors, {
|
||
[action.monitorId]: {
|
||
upperStart: action.upperStart,
|
||
lowerEnd: action.lowerEnd
|
||
}
|
||
}),
|
||
savedMonitorPositions: action.savePosition ? Object.assign({}, state.savedMonitorPositions, {
|
||
[action.monitorId]: {
|
||
x: action.upperStart.x,
|
||
y: action.upperStart.y
|
||
}
|
||
}) : state.savedMonitorPositions
|
||
};
|
||
};
|
||
|
||
const _moveMonitorRect = function _moveMonitorRect(state, action) {
|
||
if (!state.monitors.hasOwnProperty(action.monitorId)) {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_0__["default"].error("Can't move monitor, monitor with id ".concat(action.monitorId, " does not exist."));
|
||
return state;
|
||
}
|
||
|
||
if (isNaN(action.newX) || isNaN(action.newY)) {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_0__["default"].error("Monitor rectangle not formatted correctly");
|
||
return state;
|
||
}
|
||
|
||
const oldMonitor = state.monitors[action.monitorId];
|
||
|
||
if (oldMonitor.upperStart.x === action.newX && oldMonitor.upperStart.y === action.newY) {
|
||
// Hasn't moved
|
||
return state;
|
||
}
|
||
|
||
const monitorWidth = oldMonitor.lowerEnd.x - oldMonitor.upperStart.x;
|
||
const monitorHeight = oldMonitor.lowerEnd.y - oldMonitor.upperStart.y;
|
||
return {
|
||
monitors: Object.assign({}, state.monitors, {
|
||
[action.monitorId]: {
|
||
upperStart: {
|
||
x: action.newX,
|
||
y: action.newY
|
||
},
|
||
lowerEnd: {
|
||
x: action.newX + monitorWidth,
|
||
y: action.newY + monitorHeight
|
||
}
|
||
}
|
||
}),
|
||
// User generated position is saved
|
||
savedMonitorPositions: Object.assign({}, state.savedMonitorPositions, {
|
||
[action.monitorId]: {
|
||
x: action.newX,
|
||
y: action.newY
|
||
}
|
||
})
|
||
};
|
||
};
|
||
|
||
const _resizeMonitorRect = function _resizeMonitorRect(state, action) {
|
||
if (!state.monitors.hasOwnProperty(action.monitorId)) {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_0__["default"].error("Can't resize monitor, monitor with id ".concat(action.monitorId, " does not exist."));
|
||
return state;
|
||
}
|
||
|
||
if (isNaN(action.newWidth) || isNaN(action.newHeight) || action.newWidth <= 0 || action.newHeight <= 0) {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_0__["default"].error("Monitor rectangle not formatted correctly");
|
||
return state;
|
||
}
|
||
|
||
const oldMonitor = state.monitors[action.monitorId];
|
||
const newMonitor = {
|
||
upperStart: oldMonitor.upperStart,
|
||
lowerEnd: {
|
||
x: oldMonitor.upperStart.x + action.newWidth,
|
||
y: oldMonitor.upperStart.y + action.newHeight
|
||
}
|
||
};
|
||
|
||
if (newMonitor.lowerEnd.x === oldMonitor.lowerEnd.x && newMonitor.lowerEnd.y === oldMonitor.lowerEnd.y) {
|
||
// no change
|
||
return state;
|
||
}
|
||
|
||
return {
|
||
monitors: Object.assign({}, state.monitors, {
|
||
[action.monitorId]: newMonitor
|
||
}),
|
||
savedMonitorPositions: state.savedMonitorPositions
|
||
};
|
||
};
|
||
|
||
const _removeMonitorRect = function _removeMonitorRect(state, action) {
|
||
if (!state.monitors.hasOwnProperty(action.monitorId)) {
|
||
_lib_log__WEBPACK_IMPORTED_MODULE_0__["default"].error("Can't remove monitor, monitor with id ".concat(action.monitorId, " does not exist."));
|
||
return state;
|
||
}
|
||
|
||
const newMonitors = Object.assign({}, state.monitors);
|
||
delete newMonitors[action.monitorId];
|
||
return {
|
||
monitors: newMonitors,
|
||
savedMonitorPositions: state.savedMonitorPositions
|
||
};
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case ADD_MONITOR_RECT:
|
||
return _addMonitorRect(state, action);
|
||
|
||
case MOVE_MONITOR_RECT:
|
||
return _moveMonitorRect(state, action);
|
||
|
||
case RESIZE_MONITOR_RECT:
|
||
return _resizeMonitorRect(state, action);
|
||
|
||
case REMOVE_MONITOR_RECT:
|
||
return _removeMonitorRect(state, action);
|
||
|
||
case RESET_MONITOR_LAYOUT:
|
||
return initialState;
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
}; // Init position --------------------------
|
||
|
||
|
||
const PADDING = 5; // @todo fix these numbers when we fix https://github.com/LLK/scratch-gui/issues/980
|
||
|
||
const SCREEN_WIDTH = 400;
|
||
const SCREEN_HEIGHT = 300;
|
||
const SCREEN_EDGE_BUFFER = 40;
|
||
|
||
const _rectsIntersect = function _rectsIntersect(rect1, rect2) {
|
||
// If one rectangle is on left side of other
|
||
if (rect1.upperStart.x >= rect2.lowerEnd.x || rect2.upperStart.x >= rect1.lowerEnd.x) return false; // If one rectangle is above other
|
||
|
||
if (rect1.upperStart.y >= rect2.lowerEnd.y || rect2.upperStart.y >= rect1.lowerEnd.y) return false;
|
||
return true;
|
||
}; // We need to place a monitor with the given width and height. Return a rect defining where it should be placed.
|
||
|
||
|
||
const getInitialPosition = function getInitialPosition(state, monitorId, eltWidth, eltHeight) {
|
||
// If this monitor was purposefully moved to a certain position before, put it back in that position
|
||
if (state.savedMonitorPositions.hasOwnProperty(monitorId)) {
|
||
const saved = state.savedMonitorPositions[monitorId];
|
||
return {
|
||
upperStart: saved,
|
||
lowerEnd: {
|
||
x: saved.x + eltWidth,
|
||
y: saved.y + eltHeight
|
||
}
|
||
};
|
||
} // Try all starting positions for the new monitor to find one that doesn't intersect others
|
||
|
||
|
||
const endXs = [0];
|
||
const endYs = [0];
|
||
let lastX = null;
|
||
let lastY = null;
|
||
|
||
for (const monitor in state.monitors) {
|
||
let x = state.monitors[monitor].lowerEnd.x;
|
||
x = Math.ceil(x / 50) * 50; // Try to choose a sensible "tab width" so more monitors line up
|
||
|
||
endXs.push(x);
|
||
endYs.push(Math.ceil(state.monitors[monitor].lowerEnd.y));
|
||
}
|
||
|
||
endXs.sort((a, b) => a - b);
|
||
endYs.sort((a, b) => a - b); // We'll use plan B if the monitor doesn't fit anywhere (too long or tall)
|
||
|
||
let planB = null;
|
||
|
||
for (const x of endXs) {
|
||
if (x === lastX) {
|
||
continue;
|
||
}
|
||
|
||
lastX = x;
|
||
|
||
outer: for (const y of endYs) {
|
||
if (y === lastY) {
|
||
continue;
|
||
}
|
||
|
||
lastY = y;
|
||
const monitorRect = {
|
||
upperStart: {
|
||
x: x + PADDING,
|
||
y: y + PADDING
|
||
},
|
||
lowerEnd: {
|
||
x: x + PADDING + eltWidth,
|
||
y: y + PADDING + eltHeight
|
||
}
|
||
}; // Intersection testing rect that includes padding
|
||
|
||
const rect = {
|
||
upperStart: {
|
||
x,
|
||
y
|
||
},
|
||
lowerEnd: {
|
||
x: x + eltWidth + 2 * PADDING,
|
||
y: y + eltHeight + 2 * PADDING
|
||
}
|
||
};
|
||
|
||
for (const monitor in state.monitors) {
|
||
if (_rectsIntersect(state.monitors[monitor], rect)) {
|
||
continue outer;
|
||
}
|
||
} // If the rect overlaps the ends of the screen
|
||
|
||
|
||
if (rect.lowerEnd.x > SCREEN_WIDTH || rect.lowerEnd.y > SCREEN_HEIGHT) {
|
||
// If rect is not too close to completely off screen, set it as plan B
|
||
if (!planB && !(rect.upperStart.x + SCREEN_EDGE_BUFFER > SCREEN_WIDTH || rect.upperStart.y + SCREEN_EDGE_BUFFER > SCREEN_HEIGHT)) {
|
||
planB = monitorRect;
|
||
}
|
||
|
||
continue;
|
||
}
|
||
|
||
return monitorRect;
|
||
}
|
||
} // If the monitor is too long to fit anywhere, put it in the leftmost spot available
|
||
// that intersects the right or bottom edge and isn't too close to the edge.
|
||
|
||
|
||
if (planB) {
|
||
return planB;
|
||
} // If plan B fails and there's nowhere reasonable to put it, plan C is to place the monitor randomly
|
||
|
||
|
||
const randX = Math.ceil(Math.random() * (SCREEN_WIDTH / 2));
|
||
const randY = Math.ceil(Math.random() * (SCREEN_HEIGHT - SCREEN_EDGE_BUFFER));
|
||
return {
|
||
upperStart: {
|
||
x: randX,
|
||
y: randY
|
||
},
|
||
lowerEnd: {
|
||
x: randX + eltWidth,
|
||
y: randY + eltHeight
|
||
}
|
||
};
|
||
}; // Action creators ------------------------
|
||
|
||
/**
|
||
* @param {!string} monitorId Id to add
|
||
* @param {!object} upperStart upper point defining the rectangle
|
||
* @param {!number} upperStart.x X of top point that defines the monitor location
|
||
* @param {!number} upperStart.y Y of top point that defines the monitor location
|
||
* @param {!object} lowerEnd lower point defining the rectangle
|
||
* @param {!number} lowerEnd.x X of bottom point that defines the monitor location
|
||
* @param {!number} lowerEnd.y Y of bottom point that defines the monitor location
|
||
* @param {?boolean} savePosition True if the placement should be saved when adding the monitor
|
||
* @returns {object} action to add a new monitor at the location
|
||
*/
|
||
|
||
|
||
const addMonitorRect = function addMonitorRect(monitorId, upperStart, lowerEnd, savePosition) {
|
||
return {
|
||
type: ADD_MONITOR_RECT,
|
||
monitorId: monitorId,
|
||
upperStart: upperStart,
|
||
lowerEnd: lowerEnd,
|
||
savePosition: savePosition
|
||
};
|
||
};
|
||
/**
|
||
* @param {!string} monitorId Id for monitor to move
|
||
* @param {!number} newX X of top point that defines the monitor location
|
||
* @param {!number} newY Y of top point that defines the monitor location
|
||
* @returns {object} action to move an existing monitor to the location
|
||
*/
|
||
|
||
|
||
const moveMonitorRect = function moveMonitorRect(monitorId, newX, newY) {
|
||
return {
|
||
type: MOVE_MONITOR_RECT,
|
||
monitorId: monitorId,
|
||
newX: newX,
|
||
newY: newY
|
||
};
|
||
};
|
||
/**
|
||
* @param {!string} monitorId Id for monitor to resize
|
||
* @param {!number} newWidth Width to set monitor to
|
||
* @param {!number} newHeight Height to set monitor to
|
||
* @returns {object} action to resize an existing monitor to the given dimensions
|
||
*/
|
||
|
||
|
||
const resizeMonitorRect = function resizeMonitorRect(monitorId, newWidth, newHeight) {
|
||
return {
|
||
type: RESIZE_MONITOR_RECT,
|
||
monitorId: monitorId,
|
||
newWidth: newWidth,
|
||
newHeight: newHeight
|
||
};
|
||
};
|
||
/**
|
||
* @param {!string} monitorId Id for monitor to remove
|
||
* @returns {object} action to remove an existing monitor
|
||
*/
|
||
|
||
|
||
const removeMonitorRect = function removeMonitorRect(monitorId) {
|
||
return {
|
||
type: REMOVE_MONITOR_RECT,
|
||
monitorId: monitorId
|
||
};
|
||
};
|
||
|
||
const resetMonitorLayout = function resetMonitorLayout() {
|
||
return {
|
||
type: RESET_MONITOR_LAYOUT
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/monitors.js":
|
||
/*!**********************************!*\
|
||
!*** ./src/reducers/monitors.js ***!
|
||
\**********************************/
|
||
/*! exports provided: default, monitorsInitialState, updateMonitors */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "monitorsInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateMonitors", function() { return updateMonitors; });
|
||
/* harmony import */ var immutable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! immutable */ "./node_modules/immutable/dist/immutable.js");
|
||
/* harmony import */ var immutable__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(immutable__WEBPACK_IMPORTED_MODULE_0__);
|
||
const UPDATE_MONITORS = 'scratch-gui/monitors/UPDATE_MONITORS';
|
||
|
||
const initialState = Object(immutable__WEBPACK_IMPORTED_MODULE_0__["OrderedMap"])();
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case UPDATE_MONITORS:
|
||
return action.monitors;
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const updateMonitors = function updateMonitors(monitors) {
|
||
return {
|
||
type: UPDATE_MONITORS,
|
||
monitors: monitors
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/project-changed.js":
|
||
/*!*****************************************!*\
|
||
!*** ./src/reducers/project-changed.js ***!
|
||
\*****************************************/
|
||
/*! exports provided: default, projectChangedInitialState, setProjectChanged, setProjectUnchanged */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "projectChangedInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setProjectChanged", function() { return setProjectChanged; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setProjectUnchanged", function() { return setProjectUnchanged; });
|
||
const SET_PROJECT_CHANGED = 'scratch-gui/project-changed/SET_PROJECT_CHANGED';
|
||
const initialState = false;
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case SET_PROJECT_CHANGED:
|
||
return action.changed;
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const setProjectChanged = () => ({
|
||
type: SET_PROJECT_CHANGED,
|
||
changed: true
|
||
});
|
||
|
||
const setProjectUnchanged = () => ({
|
||
type: SET_PROJECT_CHANGED,
|
||
changed: false
|
||
});
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/project-state.js":
|
||
/*!***************************************!*\
|
||
!*** ./src/reducers/project-state.js ***!
|
||
\***************************************/
|
||
/*! exports provided: default, projectStateInitialState, LoadingState, LoadingStates, autoUpdateProject, createProject, defaultProjectId, doneCreatingProject, doneUpdatingProject, getIsAnyCreatingNewState, getIsCreatingCopy, getIsCreatingNew, getIsError, getIsFetchingWithId, getIsFetchingWithoutId, getIsLoading, getIsLoadingWithId, getIsLoadingUpload, getIsManualUpdating, getIsRemixing, getIsShowingProject, getIsShowingWithId, getIsShowingWithoutId, getIsUpdating, manualUpdateProject, onFetchedProjectData, onLoadedProject, projectError, remixProject, requestNewProject, requestProjectUpload, saveProjectAsCopy, setProjectId */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "projectStateInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoadingState", function() { return LoadingState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoadingStates", function() { return LoadingStates; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "autoUpdateProject", function() { return autoUpdateProject; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createProject", function() { return createProject; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultProjectId", function() { return defaultProjectId; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "doneCreatingProject", function() { return doneCreatingProject; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "doneUpdatingProject", function() { return doneUpdatingProject; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsAnyCreatingNewState", function() { return getIsAnyCreatingNewState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsCreatingCopy", function() { return getIsCreatingCopy; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsCreatingNew", function() { return getIsCreatingNew; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsError", function() { return getIsError; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsFetchingWithId", function() { return getIsFetchingWithId; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsFetchingWithoutId", function() { return getIsFetchingWithoutId; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsLoading", function() { return getIsLoading; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsLoadingWithId", function() { return getIsLoadingWithId; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsLoadingUpload", function() { return getIsLoadingUpload; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsManualUpdating", function() { return getIsManualUpdating; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsRemixing", function() { return getIsRemixing; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsShowingProject", function() { return getIsShowingProject; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsShowingWithId", function() { return getIsShowingWithId; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsShowingWithoutId", function() { return getIsShowingWithoutId; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIsUpdating", function() { return getIsUpdating; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "manualUpdateProject", function() { return manualUpdateProject; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onFetchedProjectData", function() { return onFetchedProjectData; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onLoadedProject", function() { return onLoadedProject; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "projectError", function() { return projectError; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "remixProject", function() { return remixProject; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "requestNewProject", function() { return requestNewProject; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "requestProjectUpload", function() { return requestProjectUpload; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveProjectAsCopy", function() { return saveProjectAsCopy; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setProjectId", function() { return setProjectId; });
|
||
/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! keymirror */ "./node_modules/keymirror/index.js");
|
||
/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(keymirror__WEBPACK_IMPORTED_MODULE_0__);
|
||
|
||
const DONE_CREATING_COPY = 'scratch-gui/project-state/DONE_CREATING_COPY';
|
||
const DONE_CREATING_NEW = 'scratch-gui/project-state/DONE_CREATING_NEW';
|
||
const DONE_FETCHING_DEFAULT = 'scratch-gui/project-state/DONE_FETCHING_DEFAULT';
|
||
const DONE_FETCHING_WITH_ID = 'scratch-gui/project-state/DONE_FETCHING_WITH_ID';
|
||
const DONE_LOADING_VM_TO_SAVE = 'scratch-gui/project-state/DONE_LOADING_VM_TO_SAVE';
|
||
const DONE_LOADING_VM_WITH_ID = 'scratch-gui/project-state/DONE_LOADING_VM_WITH_ID';
|
||
const DONE_LOADING_VM_WITHOUT_ID = 'scratch-gui/project-state/DONE_LOADING_VM_WITHOUT_ID';
|
||
const DONE_REMIXING = 'scratch-gui/project-state/DONE_REMIXING';
|
||
const DONE_UPDATING = 'scratch-gui/project-state/DONE_UPDATING';
|
||
const DONE_UPDATING_BEFORE_COPY = 'scratch-gui/project-state/DONE_UPDATING_BEFORE_COPY';
|
||
const DONE_UPDATING_BEFORE_NEW = 'scratch-gui/project-state/DONE_UPDATING_BEFORE_NEW';
|
||
const RETURN_TO_SHOWING = 'scratch-gui/project-state/RETURN_TO_SHOWING';
|
||
const SET_PROJECT_ID = 'scratch-gui/project-state/SET_PROJECT_ID';
|
||
const START_AUTO_UPDATING = 'scratch-gui/project-state/START_AUTO_UPDATING';
|
||
const START_CREATING_NEW = 'scratch-gui/project-state/START_CREATING_NEW';
|
||
const START_ERROR = 'scratch-gui/project-state/START_ERROR';
|
||
const START_FETCHING_NEW = 'scratch-gui/project-state/START_FETCHING_NEW';
|
||
const START_LOADING_VM_FILE_UPLOAD = 'scratch-gui/project-state/START_LOADING_VM_FILE_UPLOAD';
|
||
const START_MANUAL_UPDATING = 'scratch-gui/project-state/START_MANUAL_UPDATING';
|
||
const START_REMIXING = 'scratch-gui/project-state/START_REMIXING';
|
||
const START_UPDATING_BEFORE_CREATING_COPY = 'scratch-gui/project-state/START_UPDATING_BEFORE_CREATING_COPY';
|
||
const START_UPDATING_BEFORE_CREATING_NEW = 'scratch-gui/project-state/START_UPDATING_BEFORE_CREATING_NEW';
|
||
const defaultProjectId = '0'; // hardcoded id of default project
|
||
|
||
const LoadingState = keymirror__WEBPACK_IMPORTED_MODULE_0___default()({
|
||
NOT_LOADED: null,
|
||
ERROR: null,
|
||
AUTO_UPDATING: null,
|
||
CREATING_COPY: null,
|
||
CREATING_NEW: null,
|
||
FETCHING_NEW_DEFAULT: null,
|
||
FETCHING_WITH_ID: null,
|
||
LOADING_VM_FILE_UPLOAD: null,
|
||
LOADING_VM_NEW_DEFAULT: null,
|
||
LOADING_VM_WITH_ID: null,
|
||
MANUAL_UPDATING: null,
|
||
REMIXING: null,
|
||
SHOWING_WITH_ID: null,
|
||
SHOWING_WITHOUT_ID: null,
|
||
UPDATING_BEFORE_COPY: null,
|
||
UPDATING_BEFORE_NEW: null
|
||
});
|
||
const LoadingStates = Object.keys(LoadingState);
|
||
|
||
const getIsFetchingWithoutId = loadingState => // LOADING_VM_FILE_UPLOAD is an honorary fetch, since there is no fetching step for file uploads
|
||
loadingState === LoadingState.LOADING_VM_FILE_UPLOAD || loadingState === LoadingState.FETCHING_NEW_DEFAULT;
|
||
|
||
const getIsFetchingWithId = loadingState => loadingState === LoadingState.FETCHING_WITH_ID || loadingState === LoadingState.FETCHING_NEW_DEFAULT;
|
||
|
||
const getIsLoadingWithId = loadingState => loadingState === LoadingState.LOADING_VM_WITH_ID || loadingState === LoadingState.LOADING_VM_NEW_DEFAULT;
|
||
|
||
const getIsLoading = loadingState => loadingState === LoadingState.LOADING_VM_FILE_UPLOAD || loadingState === LoadingState.LOADING_VM_WITH_ID || loadingState === LoadingState.LOADING_VM_NEW_DEFAULT;
|
||
|
||
const getIsLoadingUpload = loadingState => loadingState === LoadingState.LOADING_VM_FILE_UPLOAD;
|
||
|
||
const getIsCreatingNew = loadingState => loadingState === LoadingState.CREATING_NEW;
|
||
|
||
const getIsAnyCreatingNewState = loadingState => loadingState === LoadingState.FETCHING_NEW_DEFAULT || loadingState === LoadingState.LOADING_VM_NEW_DEFAULT || loadingState === LoadingState.CREATING_NEW;
|
||
|
||
const getIsCreatingCopy = loadingState => loadingState === LoadingState.CREATING_COPY;
|
||
|
||
const getIsManualUpdating = loadingState => loadingState === LoadingState.MANUAL_UPDATING;
|
||
|
||
const getIsRemixing = loadingState => loadingState === LoadingState.REMIXING;
|
||
|
||
const getIsUpdating = loadingState => loadingState === LoadingState.AUTO_UPDATING || loadingState === LoadingState.MANUAL_UPDATING || loadingState === LoadingState.UPDATING_BEFORE_COPY || loadingState === LoadingState.UPDATING_BEFORE_NEW;
|
||
|
||
const getIsShowingProject = loadingState => loadingState === LoadingState.SHOWING_WITH_ID || loadingState === LoadingState.SHOWING_WITHOUT_ID;
|
||
|
||
const getIsShowingWithId = loadingState => loadingState === LoadingState.SHOWING_WITH_ID;
|
||
|
||
const getIsShowingWithoutId = loadingState => loadingState === LoadingState.SHOWING_WITHOUT_ID;
|
||
|
||
const getIsError = loadingState => loadingState === LoadingState.ERROR;
|
||
|
||
const initialState = {
|
||
error: null,
|
||
projectData: null,
|
||
projectId: null,
|
||
loadingState: LoadingState.NOT_LOADED
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case DONE_CREATING_NEW:
|
||
// We need to set project id since we just created new project on the server.
|
||
// No need to load, we should have data already in vm.
|
||
if (state.loadingState === LoadingState.CREATING_NEW) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.SHOWING_WITH_ID,
|
||
projectId: action.projectId
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case DONE_FETCHING_WITH_ID:
|
||
if (state.loadingState === LoadingState.FETCHING_WITH_ID) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.LOADING_VM_WITH_ID,
|
||
projectData: action.projectData
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case DONE_FETCHING_DEFAULT:
|
||
if (state.loadingState === LoadingState.FETCHING_NEW_DEFAULT) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.LOADING_VM_NEW_DEFAULT,
|
||
projectData: action.projectData
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case DONE_LOADING_VM_WITHOUT_ID:
|
||
if (state.loadingState === LoadingState.LOADING_VM_FILE_UPLOAD || state.loadingState === LoadingState.LOADING_VM_NEW_DEFAULT) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.SHOWING_WITHOUT_ID,
|
||
projectId: defaultProjectId
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case DONE_LOADING_VM_WITH_ID:
|
||
if (state.loadingState === LoadingState.LOADING_VM_WITH_ID) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.SHOWING_WITH_ID
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case DONE_LOADING_VM_TO_SAVE:
|
||
if (state.loadingState === LoadingState.LOADING_VM_FILE_UPLOAD) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.AUTO_UPDATING
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case DONE_REMIXING:
|
||
// We need to set project id since we just created new project on the server.
|
||
// No need to load, we should have data already in vm.
|
||
if (state.loadingState === LoadingState.REMIXING) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.SHOWING_WITH_ID,
|
||
projectId: action.projectId
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case DONE_CREATING_COPY:
|
||
// We need to set project id since we just created new project on the server.
|
||
// No need to load, we should have data already in vm.
|
||
if (state.loadingState === LoadingState.CREATING_COPY) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.SHOWING_WITH_ID,
|
||
projectId: action.projectId
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case DONE_UPDATING:
|
||
if (state.loadingState === LoadingState.AUTO_UPDATING || state.loadingState === LoadingState.MANUAL_UPDATING) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.SHOWING_WITH_ID
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case DONE_UPDATING_BEFORE_COPY:
|
||
if (state.loadingState === LoadingState.UPDATING_BEFORE_COPY) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.CREATING_COPY
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case DONE_UPDATING_BEFORE_NEW:
|
||
if (state.loadingState === LoadingState.UPDATING_BEFORE_NEW) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.FETCHING_NEW_DEFAULT,
|
||
projectId: defaultProjectId
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case RETURN_TO_SHOWING:
|
||
if (state.projectId === null || state.projectId === defaultProjectId) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.SHOWING_WITHOUT_ID,
|
||
projectId: defaultProjectId
|
||
});
|
||
}
|
||
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.SHOWING_WITH_ID
|
||
});
|
||
|
||
case SET_PROJECT_ID:
|
||
// if the projectId hasn't actually changed do nothing
|
||
if (state.projectId === action.projectId) {
|
||
return state;
|
||
} // if we were already showing a project, and a different projectId is set, only fetch that project if
|
||
// projectId has changed. This prevents re-fetching projects unnecessarily.
|
||
|
||
|
||
if (state.loadingState === LoadingState.SHOWING_WITH_ID) {
|
||
// if setting the default project id, specifically fetch that project
|
||
if (action.projectId === defaultProjectId || action.projectId === null) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.FETCHING_NEW_DEFAULT,
|
||
projectId: defaultProjectId
|
||
});
|
||
}
|
||
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.FETCHING_WITH_ID,
|
||
projectId: action.projectId
|
||
});
|
||
} else if (state.loadingState === LoadingState.SHOWING_WITHOUT_ID) {
|
||
// if we were showing a project already, don't transition to default project.
|
||
if (action.projectId !== defaultProjectId && action.projectId !== null) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.FETCHING_WITH_ID,
|
||
projectId: action.projectId
|
||
});
|
||
}
|
||
} else {
|
||
// allow any other states to transition to fetching project
|
||
// if setting the default project id, specifically fetch that project
|
||
if (action.projectId === defaultProjectId || action.projectId === null) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.FETCHING_NEW_DEFAULT,
|
||
projectId: defaultProjectId
|
||
});
|
||
}
|
||
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.FETCHING_WITH_ID,
|
||
projectId: action.projectId
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case START_AUTO_UPDATING:
|
||
if (state.loadingState === LoadingState.SHOWING_WITH_ID) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.AUTO_UPDATING
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case START_CREATING_NEW:
|
||
if (state.loadingState === LoadingState.SHOWING_WITHOUT_ID) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.CREATING_NEW
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case START_FETCHING_NEW:
|
||
if ([LoadingState.SHOWING_WITH_ID, LoadingState.SHOWING_WITHOUT_ID].includes(state.loadingState)) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.FETCHING_NEW_DEFAULT,
|
||
projectId: defaultProjectId
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case START_LOADING_VM_FILE_UPLOAD:
|
||
if ([LoadingState.NOT_LOADED, LoadingState.SHOWING_WITH_ID, LoadingState.SHOWING_WITHOUT_ID].includes(state.loadingState)) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.LOADING_VM_FILE_UPLOAD
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case START_MANUAL_UPDATING:
|
||
if (state.loadingState === LoadingState.SHOWING_WITH_ID) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.MANUAL_UPDATING
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case START_REMIXING:
|
||
if (state.loadingState === LoadingState.SHOWING_WITH_ID) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.REMIXING
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case START_UPDATING_BEFORE_CREATING_COPY:
|
||
if (state.loadingState === LoadingState.SHOWING_WITH_ID) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.UPDATING_BEFORE_COPY
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case START_UPDATING_BEFORE_CREATING_NEW:
|
||
if (state.loadingState === LoadingState.SHOWING_WITH_ID) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.UPDATING_BEFORE_NEW
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
case START_ERROR:
|
||
// fatal errors: there's no correct editor state for us to show
|
||
if ([LoadingState.FETCHING_NEW_DEFAULT, LoadingState.FETCHING_WITH_ID, LoadingState.LOADING_VM_NEW_DEFAULT, LoadingState.LOADING_VM_WITH_ID].includes(state.loadingState)) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.ERROR,
|
||
error: action.error
|
||
});
|
||
} // non-fatal errors: can keep showing editor state fine
|
||
|
||
|
||
if ([LoadingState.AUTO_UPDATING, LoadingState.CREATING_COPY, LoadingState.MANUAL_UPDATING, LoadingState.REMIXING, LoadingState.UPDATING_BEFORE_COPY, LoadingState.UPDATING_BEFORE_NEW].includes(state.loadingState)) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.SHOWING_WITH_ID,
|
||
error: action.error
|
||
});
|
||
} // non-fatal error; state to show depends on whether project we're showing
|
||
// has an id or not
|
||
|
||
|
||
if (state.loadingState === LoadingState.CREATING_NEW) {
|
||
if (state.projectId === defaultProjectId || state.projectId === null) {
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.SHOWING_WITHOUT_ID,
|
||
error: action.error
|
||
});
|
||
}
|
||
|
||
return Object.assign({}, state, {
|
||
loadingState: LoadingState.SHOWING_WITH_ID,
|
||
error: action.error
|
||
});
|
||
}
|
||
|
||
return state;
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const createProject = () => ({
|
||
type: START_CREATING_NEW
|
||
});
|
||
|
||
const doneCreatingProject = (id, loadingState) => {
|
||
switch (loadingState) {
|
||
case LoadingState.CREATING_NEW:
|
||
return {
|
||
type: DONE_CREATING_NEW,
|
||
projectId: id
|
||
};
|
||
|
||
case LoadingState.CREATING_COPY:
|
||
return {
|
||
type: DONE_CREATING_COPY,
|
||
projectId: id
|
||
};
|
||
|
||
case LoadingState.REMIXING:
|
||
return {
|
||
type: DONE_REMIXING,
|
||
projectId: id
|
||
};
|
||
|
||
default:
|
||
break;
|
||
}
|
||
};
|
||
|
||
const onFetchedProjectData = (projectData, loadingState) => {
|
||
switch (loadingState) {
|
||
case LoadingState.FETCHING_WITH_ID:
|
||
return {
|
||
type: DONE_FETCHING_WITH_ID,
|
||
projectData: projectData
|
||
};
|
||
|
||
case LoadingState.FETCHING_NEW_DEFAULT:
|
||
return {
|
||
type: DONE_FETCHING_DEFAULT,
|
||
projectData: projectData
|
||
};
|
||
|
||
default:
|
||
break;
|
||
}
|
||
};
|
||
|
||
const onLoadedProject = (loadingState, canSave, success) => {
|
||
switch (loadingState) {
|
||
case LoadingState.LOADING_VM_WITH_ID:
|
||
if (success) {
|
||
return {
|
||
type: DONE_LOADING_VM_WITH_ID
|
||
};
|
||
} // failed to load project; just keep showing current project
|
||
|
||
|
||
return {
|
||
type: RETURN_TO_SHOWING
|
||
};
|
||
|
||
case LoadingState.LOADING_VM_FILE_UPLOAD:
|
||
if (success) {
|
||
if (canSave) {
|
||
return {
|
||
type: DONE_LOADING_VM_TO_SAVE
|
||
};
|
||
}
|
||
|
||
return {
|
||
type: DONE_LOADING_VM_WITHOUT_ID
|
||
};
|
||
} // failed to load project; just keep showing current project
|
||
|
||
|
||
return {
|
||
type: RETURN_TO_SHOWING
|
||
};
|
||
|
||
case LoadingState.LOADING_VM_NEW_DEFAULT:
|
||
if (success) {
|
||
return {
|
||
type: DONE_LOADING_VM_WITHOUT_ID
|
||
};
|
||
} // failed to load default project; show error
|
||
|
||
|
||
return {
|
||
type: START_ERROR
|
||
};
|
||
|
||
default:
|
||
return;
|
||
}
|
||
};
|
||
|
||
const doneUpdatingProject = loadingState => {
|
||
switch (loadingState) {
|
||
case LoadingState.AUTO_UPDATING:
|
||
case LoadingState.MANUAL_UPDATING:
|
||
return {
|
||
type: DONE_UPDATING
|
||
};
|
||
|
||
case LoadingState.UPDATING_BEFORE_COPY:
|
||
return {
|
||
type: DONE_UPDATING_BEFORE_COPY
|
||
};
|
||
|
||
case LoadingState.UPDATING_BEFORE_NEW:
|
||
return {
|
||
type: DONE_UPDATING_BEFORE_NEW
|
||
};
|
||
|
||
default:
|
||
break;
|
||
}
|
||
};
|
||
|
||
const projectError = error => ({
|
||
type: START_ERROR,
|
||
error: error
|
||
});
|
||
|
||
const setProjectId = id => ({
|
||
type: SET_PROJECT_ID,
|
||
projectId: id
|
||
});
|
||
|
||
const requestNewProject = needSave => {
|
||
if (needSave) return {
|
||
type: START_UPDATING_BEFORE_CREATING_NEW
|
||
};
|
||
return {
|
||
type: START_FETCHING_NEW
|
||
};
|
||
};
|
||
|
||
const requestProjectUpload = loadingState => {
|
||
switch (loadingState) {
|
||
case LoadingState.NOT_LOADED:
|
||
case LoadingState.SHOWING_WITH_ID:
|
||
case LoadingState.SHOWING_WITHOUT_ID:
|
||
return {
|
||
type: START_LOADING_VM_FILE_UPLOAD
|
||
};
|
||
|
||
default:
|
||
break;
|
||
}
|
||
};
|
||
|
||
const autoUpdateProject = () => ({
|
||
type: START_AUTO_UPDATING
|
||
});
|
||
|
||
const manualUpdateProject = () => ({
|
||
type: START_MANUAL_UPDATING
|
||
});
|
||
|
||
const saveProjectAsCopy = () => ({
|
||
type: START_UPDATING_BEFORE_CREATING_COPY
|
||
});
|
||
|
||
const remixProject = () => ({
|
||
type: START_REMIXING
|
||
});
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/project-title.js":
|
||
/*!***************************************!*\
|
||
!*** ./src/reducers/project-title.js ***!
|
||
\***************************************/
|
||
/*! exports provided: default, projectTitleInitialState, setProjectTitle */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "projectTitleInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setProjectTitle", function() { return setProjectTitle; });
|
||
const SET_PROJECT_TITLE = 'projectTitle/SET_PROJECT_TITLE'; // we are initializing to a blank string instead of an actual title,
|
||
// because it would be hard to localize here
|
||
|
||
const initialState = '';
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case SET_PROJECT_TITLE:
|
||
return action.title;
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const setProjectTitle = title => ({
|
||
type: SET_PROJECT_TITLE,
|
||
title: title
|
||
});
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/restore-deletion.js":
|
||
/*!******************************************!*\
|
||
!*** ./src/reducers/restore-deletion.js ***!
|
||
\******************************************/
|
||
/*! exports provided: default, restoreDeletionInitialState, setRestore */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "restoreDeletionInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setRestore", function() { return setRestore; });
|
||
const RESTORE_UPDATE = 'scratch-gui/restore-deletion/RESTORE_UPDATE';
|
||
const initialState = {
|
||
restoreFun: null,
|
||
deletedItem: ''
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case RESTORE_UPDATE:
|
||
return Object.assign({}, state, action.state);
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const setRestore = function setRestore(state) {
|
||
return {
|
||
type: RESTORE_UPDATE,
|
||
state: {
|
||
restoreFun: state.restoreFun,
|
||
deletedItem: state.deletedItem
|
||
}
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/stage-size.js":
|
||
/*!************************************!*\
|
||
!*** ./src/reducers/stage-size.js ***!
|
||
\************************************/
|
||
/*! exports provided: default, stageSizeInitialState, setStageSize */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stageSizeInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setStageSize", function() { return setStageSize; });
|
||
/* harmony import */ var _lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib/layout-constants.js */ "./src/lib/layout-constants.js");
|
||
|
||
const SET_STAGE_SIZE = 'scratch-gui/StageSize/SET_STAGE_SIZE';
|
||
const initialState = {
|
||
stageSize: _lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_0__["STAGE_DISPLAY_SIZES"].large
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case SET_STAGE_SIZE:
|
||
return {
|
||
stageSize: action.stageSize
|
||
};
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const setStageSize = function setStageSize(stageSize) {
|
||
return {
|
||
type: SET_STAGE_SIZE,
|
||
stageSize: stageSize
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/targets.js":
|
||
/*!*********************************!*\
|
||
!*** ./src/reducers/targets.js ***!
|
||
\*********************************/
|
||
/*! exports provided: default, targetsInitialState, updateTargets, highlightTarget */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "targetsInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateTargets", function() { return updateTargets; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "highlightTarget", function() { return highlightTarget; });
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
const UPDATE_TARGET_LIST = 'scratch-gui/targets/UPDATE_TARGET_LIST';
|
||
const HIGHLIGHT_TARGET = 'scratch-gui/targets/HIGHLIGHT_TARGET';
|
||
const initialState = {
|
||
sprites: {},
|
||
stage: {},
|
||
highlightedTargetId: null,
|
||
highlightedTargetTime: null
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case UPDATE_TARGET_LIST:
|
||
return Object.assign({}, state, {
|
||
sprites: action.targets.filter(target => !target.isStage).reduce((targets, target, listId) => Object.assign(targets, {
|
||
[target.id]: _objectSpread({
|
||
order: listId
|
||
}, target)
|
||
}), {}),
|
||
stage: action.targets.filter(target => target.isStage)[0] || {},
|
||
editingTarget: action.editingTarget
|
||
});
|
||
|
||
case HIGHLIGHT_TARGET:
|
||
return Object.assign({}, state, {
|
||
highlightedTargetId: action.targetId,
|
||
highlightedTargetTime: action.updateTime
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const updateTargets = function updateTargets(targetList, editingTarget) {
|
||
return {
|
||
type: UPDATE_TARGET_LIST,
|
||
targets: targetList,
|
||
editingTarget: editingTarget
|
||
};
|
||
};
|
||
|
||
const highlightTarget = function highlightTarget(targetId) {
|
||
return {
|
||
type: HIGHLIGHT_TARGET,
|
||
targetId: targetId,
|
||
updateTime: Date.now()
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/timeout.js":
|
||
/*!*********************************!*\
|
||
!*** ./src/reducers/timeout.js ***!
|
||
\*********************************/
|
||
/*! exports provided: default, timeoutInitialState, setAutoSaveTimeoutId */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeoutInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAutoSaveTimeoutId", function() { return setAutoSaveTimeoutId; });
|
||
const SET_AUTOSAVE_TIMEOUT_ID = 'timeout/SET_AUTOSAVE_TIMEOUT_ID';
|
||
const initialState = {
|
||
autoSaveTimeoutId: null
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case SET_AUTOSAVE_TIMEOUT_ID:
|
||
return Object.assign({}, state, {
|
||
autoSaveTimeoutId: action.id
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const setAutoSaveTimeoutId = id => ({
|
||
type: SET_AUTOSAVE_TIMEOUT_ID,
|
||
id
|
||
});
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/toolbox.js":
|
||
/*!*********************************!*\
|
||
!*** ./src/reducers/toolbox.js ***!
|
||
\*********************************/
|
||
/*! exports provided: default, toolboxInitialState, updateToolbox */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toolboxInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateToolbox", function() { return updateToolbox; });
|
||
/* harmony import */ var _lib_make_toolbox_xml__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib/make-toolbox-xml */ "./src/lib/make-toolbox-xml.js");
|
||
const UPDATE_TOOLBOX = 'scratch-gui/toolbox/UPDATE_TOOLBOX';
|
||
|
||
const initialState = {
|
||
toolboxXML: Object(_lib_make_toolbox_xml__WEBPACK_IMPORTED_MODULE_0__["default"])(true)
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case UPDATE_TOOLBOX:
|
||
return Object.assign({}, state, {
|
||
toolboxXML: action.toolboxXML
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const updateToolbox = function updateToolbox(toolboxXML) {
|
||
return {
|
||
type: UPDATE_TOOLBOX,
|
||
toolboxXML: toolboxXML
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/tw.js":
|
||
/*!****************************!*\
|
||
!*** ./src/reducers/tw.js ***!
|
||
\****************************/
|
||
/*! exports provided: initialState, default, twInitialState, setFramerateState, setInterpolationState, setCompilerOptionsState, setRuntimeOptionsState, setUsername, setCloud, setHighQualityPenState, setIsWindowFullScreen, setDimensions, setAuthor, setDescription, addCompileError, clearCompileErrors, setFileHandle, setUsernameInvalid, setHasCloudVariables, setCloudHost */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "twInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setFramerateState", function() { return setFramerateState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setInterpolationState", function() { return setInterpolationState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setCompilerOptionsState", function() { return setCompilerOptionsState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setRuntimeOptionsState", function() { return setRuntimeOptionsState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setUsername", function() { return setUsername; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setCloud", function() { return setCloud; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setHighQualityPenState", function() { return setHighQualityPenState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setIsWindowFullScreen", function() { return setIsWindowFullScreen; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setDimensions", function() { return setDimensions; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAuthor", function() { return setAuthor; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setDescription", function() { return setDescription; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addCompileError", function() { return addCompileError; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearCompileErrors", function() { return clearCompileErrors; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setFileHandle", function() { return setFileHandle; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setUsernameInvalid", function() { return setUsernameInvalid; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setHasCloudVariables", function() { return setHasCloudVariables; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setCloudHost", function() { return setCloudHost; });
|
||
const SET_FRAMERATE = 'tw/SET_FRAMERATE';
|
||
const SET_INTERPOLATION = 'tw/SET_INTERPOLATION';
|
||
const SET_COMPILER_OPTIONS = 'tw/SET_COMPILER_OPTIONS';
|
||
const SET_RUNTIME_OPTIONS = 'tw/SET_RUNTIME_OPTIONS';
|
||
const SET_USERNAME = 'tw/SET_USERNAME';
|
||
const SET_CLOUD = 'tw/SET_CLOUD';
|
||
const SET_HIGH_QUALITY_PEN = 'tw/SET_HIGH_QUALITY_PEN';
|
||
const SET_WINDOW_FULLSCREEN = 'tw/SET_WINDOW_FULLSCREEN';
|
||
const SET_DIMENSIONS = 'tw/SET_DIMENSIONS';
|
||
const SET_AUTHOR = 'tw/SET_AUTHOR';
|
||
const SET_DESCRIPTION = 'tw/SET_DESCRIPTION';
|
||
const ADD_COMPILE_ERROR = 'tw/ADD_COMPILE_ERROR';
|
||
const CLEAR_COMPILE_ERRORS = 'tw/CLEAR_COMPILE_ERRORS';
|
||
const SET_FILE_HANDLE = 'tw/SET_FILE_HANDLE';
|
||
const SET_USERNAME_INVALID = 'tw/SET_USERNAME_INVALID';
|
||
const SET_HAS_CLOUD_VARIABLES = 'tw/SET_HAS_CLOUD_VARIABLES';
|
||
const SET_CLOUD_HOST = 'tw/SET_CLOUD_HOST';
|
||
const initialState = {
|
||
framerate: 30,
|
||
interpolation: false,
|
||
cloud: true,
|
||
username: '',
|
||
highQualityPen: false,
|
||
compilerOptions: {
|
||
enabled: true,
|
||
warpTimer: false
|
||
},
|
||
runtimeOptions: {
|
||
maxClones: 300,
|
||
miscLimits: true,
|
||
fencing: true
|
||
},
|
||
isWindowFullScreen: false,
|
||
dimensions: [0, 0],
|
||
author: {
|
||
username: '',
|
||
thumbnail: ''
|
||
},
|
||
description: {
|
||
instructions: '',
|
||
credits: ''
|
||
},
|
||
compileErrors: [],
|
||
fileHandle: null,
|
||
usernameInvalid: false,
|
||
hasCloudVariables: false,
|
||
cloudHost: ''
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case SET_FRAMERATE:
|
||
return Object.assign({}, state, {
|
||
framerate: action.framerate
|
||
});
|
||
|
||
case SET_INTERPOLATION:
|
||
return Object.assign({}, state, {
|
||
interpolation: action.interpolation
|
||
});
|
||
|
||
case SET_COMPILER_OPTIONS:
|
||
return Object.assign({}, state, {
|
||
compilerOptions: action.compilerOptions
|
||
});
|
||
|
||
case SET_RUNTIME_OPTIONS:
|
||
return Object.assign({}, state, {
|
||
runtimeOptions: action.runtimeOptions
|
||
});
|
||
|
||
case SET_USERNAME:
|
||
return Object.assign({}, state, {
|
||
username: action.username
|
||
});
|
||
|
||
case SET_CLOUD:
|
||
return Object.assign({}, state, {
|
||
cloud: action.cloud
|
||
});
|
||
|
||
case SET_HIGH_QUALITY_PEN:
|
||
return Object.assign({}, state, {
|
||
highQualityPen: action.highQualityPen
|
||
});
|
||
|
||
case SET_WINDOW_FULLSCREEN:
|
||
return Object.assign({}, state, {
|
||
isWindowFullScreen: action.isWindowFullScreen
|
||
});
|
||
|
||
case SET_DIMENSIONS:
|
||
return Object.assign({}, state, {
|
||
dimensions: action.dimensions
|
||
});
|
||
|
||
case SET_AUTHOR:
|
||
return Object.assign({}, state, {
|
||
author: action.author
|
||
});
|
||
|
||
case SET_DESCRIPTION:
|
||
return Object.assign({}, state, {
|
||
description: action.description
|
||
});
|
||
|
||
case ADD_COMPILE_ERROR:
|
||
return Object.assign({}, state, {
|
||
compileErrors: [action.error, ...state.compileErrors.slice(0, 4)]
|
||
});
|
||
|
||
case CLEAR_COMPILE_ERRORS:
|
||
return Object.assign({}, state, {
|
||
compileErrors: []
|
||
});
|
||
|
||
case SET_FILE_HANDLE:
|
||
return Object.assign({}, state, {
|
||
fileHandle: action.fileHandle
|
||
});
|
||
|
||
case SET_USERNAME_INVALID:
|
||
return Object.assign({}, state, {
|
||
usernameInvalid: action.usernameInvalid
|
||
});
|
||
|
||
case SET_HAS_CLOUD_VARIABLES:
|
||
return Object.assign({}, state, {
|
||
hasCloudVariables: action.hasCloudVariables
|
||
});
|
||
|
||
case SET_CLOUD_HOST:
|
||
return Object.assign({}, state, {
|
||
cloudHost: action.cloudHost
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const setFramerateState = function setFramerateState(framerate) {
|
||
return {
|
||
type: SET_FRAMERATE,
|
||
framerate: framerate
|
||
};
|
||
};
|
||
|
||
const setInterpolationState = function setInterpolationState(interpolation) {
|
||
return {
|
||
type: SET_INTERPOLATION,
|
||
interpolation: interpolation
|
||
};
|
||
};
|
||
|
||
const setCompilerOptionsState = function setCompilerOptionsState(compilerOptions) {
|
||
return {
|
||
type: SET_COMPILER_OPTIONS,
|
||
compilerOptions: compilerOptions
|
||
};
|
||
};
|
||
|
||
const setRuntimeOptionsState = function setRuntimeOptionsState(runtimeOptions) {
|
||
return {
|
||
type: SET_RUNTIME_OPTIONS,
|
||
runtimeOptions: runtimeOptions
|
||
};
|
||
};
|
||
|
||
const setUsername = function setUsername(username) {
|
||
return {
|
||
type: SET_USERNAME,
|
||
username: username
|
||
};
|
||
};
|
||
|
||
const setCloud = function setCloud(cloud) {
|
||
return {
|
||
type: SET_CLOUD,
|
||
cloud: cloud
|
||
};
|
||
};
|
||
|
||
const setHighQualityPenState = function setHighQualityPenState(highQualityPen) {
|
||
return {
|
||
type: SET_HIGH_QUALITY_PEN,
|
||
highQualityPen: highQualityPen
|
||
};
|
||
};
|
||
|
||
const setIsWindowFullScreen = function setIsWindowFullScreen(isWindowFullScreen) {
|
||
return {
|
||
type: SET_WINDOW_FULLSCREEN,
|
||
isWindowFullScreen: isWindowFullScreen
|
||
};
|
||
};
|
||
|
||
const setDimensions = function setDimensions(dimensions) {
|
||
return {
|
||
type: SET_DIMENSIONS,
|
||
dimensions: dimensions
|
||
};
|
||
};
|
||
|
||
const setAuthor = function setAuthor(author) {
|
||
return {
|
||
type: SET_AUTHOR,
|
||
author: author
|
||
};
|
||
};
|
||
|
||
const setDescription = function setDescription(description) {
|
||
return {
|
||
type: SET_DESCRIPTION,
|
||
description: description
|
||
};
|
||
};
|
||
|
||
const addCompileError = function addCompileError(error) {
|
||
return {
|
||
type: ADD_COMPILE_ERROR,
|
||
error: error
|
||
};
|
||
};
|
||
|
||
const clearCompileErrors = function clearCompileErrors() {
|
||
return {
|
||
type: CLEAR_COMPILE_ERRORS
|
||
};
|
||
};
|
||
|
||
const setFileHandle = function setFileHandle(fileHandle) {
|
||
return {
|
||
type: SET_FILE_HANDLE,
|
||
fileHandle: fileHandle
|
||
};
|
||
};
|
||
|
||
const setUsernameInvalid = function setUsernameInvalid(usernameInvalid) {
|
||
return {
|
||
type: SET_USERNAME_INVALID,
|
||
usernameInvalid: usernameInvalid
|
||
};
|
||
};
|
||
|
||
const setHasCloudVariables = function setHasCloudVariables(hasCloudVariables) {
|
||
return {
|
||
type: SET_HAS_CLOUD_VARIABLES,
|
||
hasCloudVariables: hasCloudVariables
|
||
};
|
||
};
|
||
|
||
const setCloudHost = function setCloudHost(cloudHost) {
|
||
return {
|
||
type: SET_CLOUD_HOST,
|
||
cloudHost
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/vm-status.js":
|
||
/*!***********************************!*\
|
||
!*** ./src/reducers/vm-status.js ***!
|
||
\***********************************/
|
||
/*! exports provided: default, vmStatusInitialState, setRunningState, setStartedState, setTurboState */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "vmStatusInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setRunningState", function() { return setRunningState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setStartedState", function() { return setStartedState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTurboState", function() { return setTurboState; });
|
||
const SET_RUNNING_STATE = 'scratch-gui/vm-status/SET_RUNNING_STATE';
|
||
const SET_TURBO_STATE = 'scratch-gui/vm-status/SET_TURBO_STATE';
|
||
const SET_STARTED_STATE = 'scratch-gui/vm-status/SET_STARTED_STATE';
|
||
const initialState = {
|
||
running: false,
|
||
started: false,
|
||
turbo: false
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case SET_STARTED_STATE:
|
||
return Object.assign({}, state, {
|
||
started: action.started
|
||
});
|
||
|
||
case SET_RUNNING_STATE:
|
||
return Object.assign({}, state, {
|
||
running: action.running
|
||
});
|
||
|
||
case SET_TURBO_STATE:
|
||
return Object.assign({}, state, {
|
||
turbo: action.turbo
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const setStartedState = function setStartedState(started) {
|
||
return {
|
||
type: SET_STARTED_STATE,
|
||
started: started
|
||
};
|
||
};
|
||
|
||
const setRunningState = function setRunningState(running) {
|
||
return {
|
||
type: SET_RUNNING_STATE,
|
||
running: running
|
||
};
|
||
};
|
||
|
||
const setTurboState = function setTurboState(turbo) {
|
||
return {
|
||
type: SET_TURBO_STATE,
|
||
turbo: turbo
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/vm.js":
|
||
/*!****************************!*\
|
||
!*** ./src/reducers/vm.js ***!
|
||
\****************************/
|
||
/*! exports provided: default, vmInitialState, setVM */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "vmInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setVM", function() { return setVM; });
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! scratch-vm */ "./node_modules/scratch-vm/src/index.js");
|
||
/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _lib_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/storage */ "./src/lib/storage.js");
|
||
/* harmony import */ var _lib_tw_cloud_limits__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/tw-cloud-limits */ "./src/lib/tw-cloud-limits.js");
|
||
|
||
|
||
|
||
const SET_VM = 'scratch-gui/vm/SET_VM';
|
||
const defaultVM = new scratch_vm__WEBPACK_IMPORTED_MODULE_0___default.a();
|
||
defaultVM.setCompatibilityMode(true);
|
||
defaultVM.runtime.cloudOptions.limit = _lib_tw_cloud_limits__WEBPACK_IMPORTED_MODULE_2__["MAXIMUM_CLOUD_VARIABLES"];
|
||
defaultVM.attachStorage(_lib_storage__WEBPACK_IMPORTED_MODULE_1__["default"]);
|
||
const initialState = defaultVM;
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case SET_VM:
|
||
return action.vm;
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const setVM = function setVM(vm) {
|
||
return {
|
||
type: SET_VM,
|
||
vm: vm
|
||
};
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/reducers/workspace-metrics.js":
|
||
/*!*******************************************!*\
|
||
!*** ./src/reducers/workspace-metrics.js ***!
|
||
\*******************************************/
|
||
/*! exports provided: default, workspaceMetricsInitialState, updateMetrics */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reducer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "workspaceMetricsInitialState", function() { return initialState; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateMetrics", function() { return updateMetrics; });
|
||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
const UPDATE_METRICS = 'scratch-gui/workspace-metrics/UPDATE_METRICS';
|
||
const initialState = {
|
||
targets: {}
|
||
};
|
||
|
||
const reducer = function reducer(state, action) {
|
||
if (typeof state === 'undefined') state = initialState;
|
||
|
||
switch (action.type) {
|
||
case UPDATE_METRICS:
|
||
return Object.assign({}, state, {
|
||
targets: Object.assign({}, state.targets, {
|
||
[action.targetID]: {
|
||
scrollX: action.scrollX,
|
||
scrollY: action.scrollY,
|
||
scale: action.scale
|
||
}
|
||
})
|
||
});
|
||
|
||
default:
|
||
return state;
|
||
}
|
||
};
|
||
|
||
const updateMetrics = function updateMetrics(metrics) {
|
||
return _objectSpread({
|
||
type: UPDATE_METRICS
|
||
}, metrics);
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
|
||
/***/ 0:
|
||
/*!*****************************************!*\
|
||
!*** ../locale-data/index.js (ignored) ***!
|
||
\*****************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
/* (ignored) */
|
||
|
||
/***/ }),
|
||
|
||
/***/ 1:
|
||
/*!*******************************!*\
|
||
!*** ./lib/locales (ignored) ***!
|
||
\*******************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
/* (ignored) */
|
||
|
||
/***/ }),
|
||
|
||
/***/ 2:
|
||
/*!*******************************!*\
|
||
!*** ./lib/locales (ignored) ***!
|
||
\*******************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
/* (ignored) */
|
||
|
||
/***/ }),
|
||
|
||
/***/ 3:
|
||
/*!**********************!*\
|
||
!*** util (ignored) ***!
|
||
\**********************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
/* (ignored) */
|
||
|
||
/***/ }),
|
||
|
||
/***/ 4:
|
||
/*!**********************!*\
|
||
!*** util (ignored) ***!
|
||
\**********************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
/* (ignored) */
|
||
|
||
/***/ }),
|
||
|
||
/***/ 5:
|
||
/*!*********************************!*\
|
||
!*** readable-stream (ignored) ***!
|
||
\*********************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
/* (ignored) */
|
||
|
||
/***/ }),
|
||
|
||
/***/ 6:
|
||
/*!********************************!*\
|
||
!*** ./node/self.js (ignored) ***!
|
||
\********************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
/* (ignored) */
|
||
|
||
/***/ }),
|
||
|
||
/***/ 7:
|
||
/*!**********************************!*\
|
||
!*** ./node/extend.js (ignored) ***!
|
||
\**********************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
/* (ignored) */
|
||
|
||
/***/ })
|
||
|
||
}]);
|
||
//# sourceMappingURL=editor~embed~fullscreen~player.js.map |