gwchq-textjam 0.2.28 → 0.2.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -68191,7 +68191,7 @@ module.exports = {
68191
68191
 
68192
68192
  /***/ }),
68193
68193
 
68194
- /***/ 39644:
68194
+ /***/ 33037:
68195
68195
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
68196
68196
 
68197
68197
  // ESM COMPAT FLAG
@@ -68202,6 +68202,7 @@ __webpack_require__.d(__webpack_exports__, {
68202
68202
  enigmaWhlUrl: () => (/* reexport */ py_enigma_0_1_py3_none_anyurl_namespaceObject),
68203
68203
  p5WhlUrl: () => (/* reexport */ p5_0_0_1_py3_none_anyurl_namespaceObject),
68204
68204
  pygalUrl: () => (/* reexport */ pygalurl_namespaceObject),
68205
+ pyodideStdinSwUrl: () => (/* reexport */ pyodide_stdin_swurl_namespaceObject),
68205
68206
  turtleWhlUrl: () => (/* reexport */ turtle_0_0_1_py3_none_anyurl_namespaceObject)
68206
68207
  });
68207
68208
 
@@ -68213,6 +68214,8 @@ const turtle_0_0_1_py3_none_anyurl_namespaceObject = __webpack_require__.p + "as
68213
68214
  const p5_0_0_1_py3_none_anyurl_namespaceObject = __webpack_require__.p + "assets/p5-0.0.1-py3-none-any94083ec22b4dfbbd6318.whl";
68214
68215
  ;// ./src/assets/editor/pyodide/packages/py_enigma-0.1-py3-none-any.whl?url
68215
68216
  const py_enigma_0_1_py3_none_anyurl_namespaceObject = __webpack_require__.p + "assets/py_enigma-0.1-py3-none-any77b539746537424950f6.whl";
68217
+ ;// ./src/assets/editor/pyodide/pyodide-stdin-sw.js?url
68218
+ const pyodide_stdin_swurl_namespaceObject = __webpack_require__.p + "assets/pyodide-stdin-sw.js";
68216
68219
  ;// ./src/assets/editor/index.js
68217
68220
  // These ?url imports MUST be treated as asset/resource by webpack
68218
68221
 
@@ -68221,9 +68224,10 @@ const py_enigma_0_1_py3_none_anyurl_namespaceObject = __webpack_require__.p + "a
68221
68224
 
68222
68225
 
68223
68226
 
68227
+
68224
68228
  /***/ }),
68225
68229
 
68226
- /***/ 60232:
68230
+ /***/ 79428:
68227
68231
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
68228
68232
 
68229
68233
  // ESM COMPAT FLAG
@@ -68337,7 +68341,7 @@ var Button = props => {
68337
68341
 
68338
68342
  /***/ }),
68339
68343
 
68340
- /***/ 11086:
68344
+ /***/ 74215:
68341
68345
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
68342
68346
 
68343
68347
  __webpack_require__.r(__webpack_exports__);
@@ -68351,7 +68355,7 @@ __webpack_require__.r(__webpack_exports__);
68351
68355
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(14062);
68352
68356
  /* harmony import */ var react_tabs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(39243);
68353
68357
  /* harmony import */ var _redux_EditorSlice__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(68512);
68354
- /* harmony import */ var _assets_stylesheets_DraggableTabs_scss__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1098);
68358
+ /* harmony import */ var _assets_stylesheets_DraggableTabs_scss__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(44221);
68355
68359
  /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(74848);
68356
68360
 
68357
68361
 
@@ -68419,7 +68423,7 @@ DraggableTab.tabsRole = "Tab";
68419
68423
 
68420
68424
  /***/ }),
68421
68425
 
68422
- /***/ 19446:
68426
+ /***/ 48339:
68423
68427
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
68424
68428
 
68425
68429
  __webpack_require__.r(__webpack_exports__);
@@ -68431,7 +68435,7 @@ __webpack_require__.r(__webpack_exports__);
68431
68435
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51649);
68432
68436
  /* harmony import */ var _hello_pangea_dnd__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(98850);
68433
68437
  /* harmony import */ var react_tabs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(39243);
68434
- /* harmony import */ var _assets_stylesheets_DraggableTabs_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1098);
68438
+ /* harmony import */ var _assets_stylesheets_DraggableTabs_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(44221);
68435
68439
  /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(74848);
68436
68440
 
68437
68441
 
@@ -68472,7 +68476,7 @@ DroppableTabList.tabsRole = "TabList";
68472
68476
 
68473
68477
  /***/ }),
68474
68478
 
68475
- /***/ 1777:
68479
+ /***/ 82467:
68476
68480
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
68477
68481
 
68478
68482
  // ESM COMPAT FLAG
@@ -101798,7 +101802,7 @@ var editorLightTheme = EditorView.theme({
101798
101802
  dark: false
101799
101803
  });
101800
101804
  // EXTERNAL MODULE: ./src/utils/settings.js
101801
- var utils_settings = __webpack_require__(3798);
101805
+ var utils_settings = __webpack_require__(62161);
101802
101806
  // EXTERNAL MODULE: ./src/redux/stores/index.ts
101803
101807
  var stores = __webpack_require__(32132);
101804
101808
  // EXTERNAL MODULE: ./src/components/AssetPreview/index.tsx
@@ -101960,7 +101964,7 @@ var EditorPanel = _ref => {
101960
101964
 
101961
101965
  /***/ }),
101962
101966
 
101963
- /***/ 69118:
101967
+ /***/ 26665:
101964
101968
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
101965
101969
 
101966
101970
  // ESM COMPAT FLAG
@@ -101993,7 +101997,7 @@ var Sidebar_default = /*#__PURE__*/__webpack_require__.n(Sidebar);
101993
101997
  var EditorInput = __webpack_require__(99692);
101994
101998
  var EditorInput_default = /*#__PURE__*/__webpack_require__.n(EditorInput);
101995
101999
  // EXTERNAL MODULE: ./src/utils/ResizableWithHandle.js + 3 modules
101996
- var ResizableWithHandle = __webpack_require__(95488);
102000
+ var ResizableWithHandle = __webpack_require__(51535);
101997
102001
  ;// ./src/utils/containerQueries.js
101998
102002
  var projContainer = {
101999
102003
  "width-larger-than-720": {
@@ -102085,7 +102089,7 @@ var Project = props => {
102085
102089
 
102086
102090
  /***/ }),
102087
102091
 
102088
- /***/ 23363:
102092
+ /***/ 46590:
102089
102093
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
102090
102094
 
102091
102095
  __webpack_require__.r(__webpack_exports__);
@@ -102125,7 +102129,7 @@ var ExternalFiles = () => {
102125
102129
 
102126
102130
  /***/ }),
102127
102131
 
102128
- /***/ 19190:
102132
+ /***/ 83617:
102129
102133
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
102130
102134
 
102131
102135
  __webpack_require__.r(__webpack_exports__);
@@ -102133,13 +102137,13 @@ __webpack_require__.r(__webpack_exports__);
102133
102137
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
102134
102138
  /* harmony export */ });
102135
102139
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51649);
102136
- /* harmony import */ var _utils_ResizableWithHandle__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(95488);
102140
+ /* harmony import */ var _utils_ResizableWithHandle__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(51535);
102137
102141
  /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(46942);
102138
102142
  /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);
102139
- /* harmony import */ var _utils_mediaQueryBreakpoints__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(81923);
102143
+ /* harmony import */ var _utils_mediaQueryBreakpoints__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(22554);
102140
102144
  /* harmony import */ var react_responsive__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(17988);
102141
102145
  /* harmony import */ var react_responsive__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_responsive__WEBPACK_IMPORTED_MODULE_4__);
102142
- /* harmony import */ var _styles_module_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(50239);
102146
+ /* harmony import */ var _styles_module_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(21852);
102143
102147
  /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(74848);
102144
102148
 
102145
102149
 
@@ -102197,7 +102201,7 @@ var SidebarPanel = props => {
102197
102201
 
102198
102202
  /***/ }),
102199
102203
 
102200
- /***/ 94738:
102204
+ /***/ 97933:
102201
102205
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
102202
102206
 
102203
102207
  __webpack_require__.r(__webpack_exports__);
@@ -102207,9 +102211,9 @@ __webpack_require__.r(__webpack_exports__);
102207
102211
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51649);
102208
102212
  /* harmony import */ var react_modal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(20312);
102209
102213
  /* harmony import */ var react_modal__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_modal__WEBPACK_IMPORTED_MODULE_1__);
102210
- /* harmony import */ var _Button_Button__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(60232);
102211
- /* harmony import */ var _styles_module_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(41809);
102212
- /* harmony import */ var _utils_CloseIcon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(66298);
102214
+ /* harmony import */ var _Button_Button__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(79428);
102215
+ /* harmony import */ var _styles_module_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27924);
102216
+ /* harmony import */ var _utils_CloseIcon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(61193);
102213
102217
  /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(74848);
102214
102218
 
102215
102219
 
@@ -102285,7 +102289,7 @@ var BaseModal = _ref => {
102285
102289
 
102286
102290
  /***/ }),
102287
102291
 
102288
- /***/ 94778:
102292
+ /***/ 56724:
102289
102293
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
102290
102294
 
102291
102295
  // ESM COMPAT FLAG
@@ -102299,9 +102303,9 @@ __webpack_require__.d(__webpack_exports__, {
102299
102303
  // EXTERNAL MODULE: external "react-redux"
102300
102304
  var external_react_redux_ = __webpack_require__(14062);
102301
102305
  // EXTERNAL MODULE: ./src/components/Modals/BaseModal/BaseModal.jsx
102302
- var BaseModal = __webpack_require__(94738);
102306
+ var BaseModal = __webpack_require__(97933);
102303
102307
  // EXTERNAL MODULE: ./src/components/Button/Button.jsx + 1 modules
102304
- var Button = __webpack_require__(60232);
102308
+ var Button = __webpack_require__(79428);
102305
102309
  // EXTERNAL MODULE: ./src/components/shared/SvgIcon/index.tsx
102306
102310
  var SvgIcon = __webpack_require__(82917);
102307
102311
  // EXTERNAL MODULE: ./src/assets/icons/alertTriangle.svg
@@ -102316,7 +102320,7 @@ var stores = __webpack_require__(32132);
102316
102320
  // extracted by mini-css-extract-plugin
102317
102321
  /* harmony default export */ const styles_module = ({"grey-rpi-grey-15":"#d5d7dc","grey-rpi-grey-40":"#9497a4","grey-rpi-grey-5":"#f1f2f3","grey-rpi-grey-70":"#4a4d59","grey-rpf-white":"#fff","content":"styles-module__content--Xo0FC","body":"styles-module__body--t9rtp","buttonsContainer":"styles-module__buttonsContainer--JGhSm","headerText":"styles-module__headerText--pmvJm","headerIcon":"styles-module__headerIcon--3TJZO","description":"styles-module__description--uzzI+"});
102318
102322
  // EXTERNAL MODULE: ./src/components/Modals/BaseModal/styles.module.scss
102319
- var BaseModal_styles_module = __webpack_require__(41809);
102323
+ var BaseModal_styles_module = __webpack_require__(27924);
102320
102324
  // EXTERNAL MODULE: ./node_modules/react/jsx-runtime.js
102321
102325
  var jsx_runtime = __webpack_require__(74848);
102322
102326
  ;// ./src/components/Modals/DraftUnsavedChangesModal/DraftUnsavedChangesModal.js
@@ -102381,7 +102385,7 @@ var DraftUnsavedChangesModal = () => {
102381
102385
 
102382
102386
  /***/ }),
102383
102387
 
102384
- /***/ 95049:
102388
+ /***/ 15382:
102385
102389
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
102386
102390
 
102387
102391
  // ESM COMPAT FLAG
@@ -102402,7 +102406,7 @@ var external_react_redux_ = __webpack_require__(14062);
102402
102406
  // EXTERNAL MODULE: ./node_modules/react-i18next/dist/es/index.js + 17 modules
102403
102407
  var es = __webpack_require__(56576);
102404
102408
  // EXTERNAL MODULE: ./src/components/Button/Button.jsx + 1 modules
102405
- var Button = __webpack_require__(60232);
102409
+ var Button = __webpack_require__(79428);
102406
102410
  // EXTERNAL MODULE: ./src/redux/EditorSlice.ts
102407
102411
  var EditorSlice = __webpack_require__(68512);
102408
102412
  ;// ./src/assets/stylesheets/Modal.scss
@@ -102476,7 +102480,7 @@ var ErrorModal = _ref => {
102476
102480
 
102477
102481
  /***/ }),
102478
102482
 
102479
- /***/ 45829:
102483
+ /***/ 14472:
102480
102484
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
102481
102485
 
102482
102486
  // ESM COMPAT FLAG
@@ -102491,7 +102495,7 @@ __webpack_require__.d(__webpack_exports__, {
102491
102495
  // extracted by mini-css-extract-plugin
102492
102496
  /* harmony default export */ const styles_module = ({"grey-rpi-grey-15":"#d5d7dc","grey-rpi-grey-40":"#9497a4","grey-rpi-grey-5":"#f1f2f3","grey-rpi-grey-70":"#4a4d59","grey-rpf-white":"#fff","content":"styles-module__content--5mqMd","body":"styles-module__body--FT2ak","buttonsContainer":"styles-module__buttonsContainer--LsIFl","headerText":"styles-module__headerText--7Ob34","headerIcon":"styles-module__headerIcon--u9yrl","description":"styles-module__description--IvKuo"});
102493
102497
  // EXTERNAL MODULE: ./src/components/Modals/BaseModal/styles.module.scss
102494
- var BaseModal_styles_module = __webpack_require__(41809);
102498
+ var BaseModal_styles_module = __webpack_require__(27924);
102495
102499
  // EXTERNAL MODULE: ./src/redux/EditorSlice.ts
102496
102500
  var EditorSlice = __webpack_require__(68512);
102497
102501
  // EXTERNAL MODULE: ./src/redux/types.ts
@@ -102499,9 +102503,9 @@ var types = __webpack_require__(92932);
102499
102503
  // EXTERNAL MODULE: external "react-redux"
102500
102504
  var external_react_redux_ = __webpack_require__(14062);
102501
102505
  // EXTERNAL MODULE: ./src/components/Modals/BaseModal/BaseModal.jsx
102502
- var BaseModal = __webpack_require__(94738);
102506
+ var BaseModal = __webpack_require__(97933);
102503
102507
  // EXTERNAL MODULE: ./src/components/Button/Button.jsx + 1 modules
102504
- var Button = __webpack_require__(60232);
102508
+ var Button = __webpack_require__(79428);
102505
102509
  // EXTERNAL MODULE: ./src/components/shared/SvgIcon/index.tsx
102506
102510
  var SvgIcon = __webpack_require__(82917);
102507
102511
  // EXTERNAL MODULE: ./src/assets/icons/remix.svg
@@ -102567,7 +102571,7 @@ var RemixProjectModal = () => {
102567
102571
 
102568
102572
  /***/ }),
102569
102573
 
102570
- /***/ 3985:
102574
+ /***/ 15406:
102571
102575
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
102572
102576
 
102573
102577
  // ESM COMPAT FLAG
@@ -102584,7 +102588,7 @@ var external_react_ = __webpack_require__(51649);
102584
102588
  // extracted by mini-css-extract-plugin
102585
102589
  /* harmony default export */ const styles_module = ({"grey-rpi-grey-15":"#d5d7dc","grey-rpi-grey-40":"#9497a4","grey-rpi-grey-5":"#f1f2f3","grey-rpi-grey-70":"#4a4d59","grey-rpf-white":"#fff","content":"styles-module__content--uVl64","headerContainer":"styles-module__headerContainer--FPLYl","headerIcon":"styles-module__headerIcon--VUrhy","headerText":"styles-module__headerText--F+NA0","containerBox":"styles-module__containerBox--Dezow","buttonsContainer":"styles-module__buttonsContainer--pnT1Q"});
102586
102590
  // EXTERNAL MODULE: ./src/components/Modals/BaseModal/styles.module.scss
102587
- var BaseModal_styles_module = __webpack_require__(41809);
102591
+ var BaseModal_styles_module = __webpack_require__(27924);
102588
102592
  // EXTERNAL MODULE: ./src/redux/EditorSlice.ts
102589
102593
  var EditorSlice = __webpack_require__(68512);
102590
102594
  // EXTERNAL MODULE: ./src/redux/types.ts
@@ -102592,7 +102596,7 @@ var types = __webpack_require__(92932);
102592
102596
  // EXTERNAL MODULE: external "react-redux"
102593
102597
  var external_react_redux_ = __webpack_require__(14062);
102594
102598
  // EXTERNAL MODULE: ./src/components/Modals/BaseModal/BaseModal.jsx
102595
- var BaseModal = __webpack_require__(94738);
102599
+ var BaseModal = __webpack_require__(97933);
102596
102600
  ;// ./src/assets/icons/remove.svg
102597
102601
  var _path;
102598
102602
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
@@ -102610,7 +102614,7 @@ function SvgRemove(props) {
102610
102614
  }
102611
102615
  /* harmony default export */ const remove = (SvgRemove);
102612
102616
  // EXTERNAL MODULE: ./src/components/Button/Button.jsx + 1 modules
102613
- var Button = __webpack_require__(60232);
102617
+ var Button = __webpack_require__(79428);
102614
102618
  // EXTERNAL MODULE: ./src/components/shared/SvgIcon/index.tsx
102615
102619
  var SvgIcon = __webpack_require__(82917);
102616
102620
  // EXTERNAL MODULE: ./src/redux/stores/index.ts
@@ -102681,7 +102685,7 @@ var RemoveItemModal = () => {
102681
102685
 
102682
102686
  /***/ }),
102683
102687
 
102684
- /***/ 66536:
102688
+ /***/ 23765:
102685
102689
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
102686
102690
 
102687
102691
  // ESM COMPAT FLAG
@@ -102698,7 +102702,7 @@ var external_react_ = __webpack_require__(51649);
102698
102702
  // extracted by mini-css-extract-plugin
102699
102703
  /* harmony default export */ const styles_module = ({"grey-rpi-grey-15":"#d5d7dc","grey-rpi-grey-40":"#9497a4","grey-rpi-grey-5":"#f1f2f3","grey-rpi-grey-70":"#4a4d59","grey-rpf-white":"#fff","content":"styles-module__content--UhJMG","modalContentHeader":"styles-module__modalContentHeader--YPWsb","headerText":"styles-module__headerText--89Clx","containerBox":"styles-module__containerBox--WUoyb","messageContainer":"styles-module__messageContainer--WzXV7","messageIcon":"styles-module__messageIcon--a6yn-","messageContent":"styles-module__messageContent--CYn9o","buttonsContainer":"styles-module__buttonsContainer--1toXb"});
102700
102704
  // EXTERNAL MODULE: ./src/components/Modals/BaseModal/styles.module.scss
102701
- var BaseModal_styles_module = __webpack_require__(41809);
102705
+ var BaseModal_styles_module = __webpack_require__(27924);
102702
102706
  // EXTERNAL MODULE: ./src/redux/EditorSlice.ts
102703
102707
  var EditorSlice = __webpack_require__(68512);
102704
102708
  // EXTERNAL MODULE: ./src/redux/types.ts
@@ -102706,13 +102710,13 @@ var types = __webpack_require__(92932);
102706
102710
  // EXTERNAL MODULE: external "react-redux"
102707
102711
  var external_react_redux_ = __webpack_require__(14062);
102708
102712
  // EXTERNAL MODULE: ./src/components/Modals/BaseModal/BaseModal.jsx
102709
- var BaseModal = __webpack_require__(94738);
102713
+ var BaseModal = __webpack_require__(97933);
102710
102714
  // EXTERNAL MODULE: ./src/assets/icons/alert.svg
102711
102715
  var icons_alert = __webpack_require__(11367);
102712
102716
  // EXTERNAL MODULE: ./src/assets/icons/flag.svg
102713
102717
  var flag = __webpack_require__(91953);
102714
102718
  // EXTERNAL MODULE: ./src/components/Button/Button.jsx + 1 modules
102715
- var Button = __webpack_require__(60232);
102719
+ var Button = __webpack_require__(79428);
102716
102720
  // EXTERNAL MODULE: ./src/assets/icons/close.svg
102717
102721
  var icons_close = __webpack_require__(80181);
102718
102722
  // EXTERNAL MODULE: ./src/components/shared/SvgIcon/index.tsx
@@ -102785,7 +102789,7 @@ var SaveProjectReminderModal = () => {
102785
102789
 
102786
102790
  /***/ }),
102787
102791
 
102788
- /***/ 58052:
102792
+ /***/ 38876:
102789
102793
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
102790
102794
 
102791
102795
  // ESM COMPAT FLAG
@@ -102802,7 +102806,7 @@ var external_react_ = __webpack_require__(51649);
102802
102806
  // extracted by mini-css-extract-plugin
102803
102807
  /* harmony default export */ const styles_module = ({"grey-rpi-grey-15":"#d5d7dc","grey-rpi-grey-40":"#9497a4","grey-rpi-grey-5":"#f1f2f3","grey-rpi-grey-70":"#4a4d59","grey-rpf-white":"#fff","content":"styles-module__content--khecF","headerIcon":"styles-module__headerIcon--fnE18","headerText":"styles-module__headerText--ua6h6","copyButton":"styles-module__copyButton--jEsq1","tabContainer":"styles-module__tabContainer--Xb4IP","tabButton":"styles-module__tabButton--4BrBv","tabButtonActive":"styles-module__tabButtonActive--CdxX8","containerBox":"styles-module__containerBox--rwoTV","linkContainer":"styles-module__linkContainer--XPt-Q","linkText":"styles-module__linkText--3vzcO"});
102804
102808
  // EXTERNAL MODULE: ./src/components/Modals/BaseModal/styles.module.scss
102805
- var BaseModal_styles_module = __webpack_require__(41809);
102809
+ var BaseModal_styles_module = __webpack_require__(27924);
102806
102810
  // EXTERNAL MODULE: ./src/redux/EditorSlice.ts
102807
102811
  var EditorSlice = __webpack_require__(68512);
102808
102812
  // EXTERNAL MODULE: ./src/redux/types.ts
@@ -102810,13 +102814,13 @@ var types = __webpack_require__(92932);
102810
102814
  // EXTERNAL MODULE: external "react-redux"
102811
102815
  var external_react_redux_ = __webpack_require__(14062);
102812
102816
  // EXTERNAL MODULE: ./src/components/Modals/BaseModal/BaseModal.jsx
102813
- var BaseModal = __webpack_require__(94738);
102817
+ var BaseModal = __webpack_require__(97933);
102814
102818
  // EXTERNAL MODULE: ./src/assets/icons/link.svg
102815
102819
  var icons_link = __webpack_require__(19351);
102816
102820
  // EXTERNAL MODULE: ./src/assets/icons/close.svg
102817
102821
  var icons_close = __webpack_require__(80181);
102818
102822
  // EXTERNAL MODULE: ./src/components/Button/Button.jsx + 1 modules
102819
- var Button = __webpack_require__(60232);
102823
+ var Button = __webpack_require__(79428);
102820
102824
  // EXTERNAL MODULE: ./src/components/shared/SvgIcon/index.tsx
102821
102825
  var SvgIcon = __webpack_require__(82917);
102822
102826
  // EXTERNAL MODULE: ./src/assets/icons/flag.svg
@@ -102923,7 +102927,7 @@ var ShareProjectModal = () => {
102923
102927
 
102924
102928
  /***/ }),
102925
102929
 
102926
- /***/ 16893:
102930
+ /***/ 66156:
102927
102931
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
102928
102932
 
102929
102933
  // ESM COMPAT FLAG
@@ -102940,7 +102944,7 @@ var external_react_ = __webpack_require__(51649);
102940
102944
  // extracted by mini-css-extract-plugin
102941
102945
  /* harmony default export */ const styles_module = ({"grey-rpi-grey-15":"#d5d7dc","grey-rpi-grey-40":"#9497a4","grey-rpi-grey-5":"#f1f2f3","grey-rpi-grey-70":"#4a4d59","grey-rpf-white":"#fff","content":"styles-module__content--pEmxZ","headerIcon":"styles-module__headerIcon--mzjrS","headerText":"styles-module__headerText--pt2r0","containerBox":"styles-module__containerBox--r5zsA","buttonsContainer":"styles-module__buttonsContainer--I3Coy"});
102942
102946
  // EXTERNAL MODULE: ./src/components/Modals/BaseModal/styles.module.scss
102943
- var BaseModal_styles_module = __webpack_require__(41809);
102947
+ var BaseModal_styles_module = __webpack_require__(27924);
102944
102948
  // EXTERNAL MODULE: ./src/redux/EditorSlice.ts
102945
102949
  var EditorSlice = __webpack_require__(68512);
102946
102950
  // EXTERNAL MODULE: ./src/redux/types.ts
@@ -102948,11 +102952,11 @@ var types = __webpack_require__(92932);
102948
102952
  // EXTERNAL MODULE: external "react-redux"
102949
102953
  var external_react_redux_ = __webpack_require__(14062);
102950
102954
  // EXTERNAL MODULE: ./src/components/Modals/BaseModal/BaseModal.jsx
102951
- var BaseModal = __webpack_require__(94738);
102955
+ var BaseModal = __webpack_require__(97933);
102952
102956
  // EXTERNAL MODULE: ./src/assets/icons/alertTriangle.svg
102953
102957
  var alertTriangle = __webpack_require__(30103);
102954
102958
  // EXTERNAL MODULE: ./src/components/Button/Button.jsx + 1 modules
102955
- var Button = __webpack_require__(60232);
102959
+ var Button = __webpack_require__(79428);
102956
102960
  // EXTERNAL MODULE: ./src/components/shared/SvgIcon/index.tsx
102957
102961
  var SvgIcon = __webpack_require__(82917);
102958
102962
  // EXTERNAL MODULE: ./node_modules/react/jsx-runtime.js
@@ -103004,7 +103008,7 @@ var UploadSizeLimitModal = () => {
103004
103008
 
103005
103009
  /***/ }),
103006
103010
 
103007
- /***/ 23559:
103011
+ /***/ 73658:
103008
103012
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
103009
103013
 
103010
103014
  __webpack_require__.r(__webpack_exports__);
@@ -103017,7 +103021,7 @@ __webpack_require__.r(__webpack_exports__);
103017
103021
  /* harmony import */ var _redux_EditorSlice__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(68512);
103018
103022
  /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(46942);
103019
103023
  /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
103020
- /* harmony import */ var _styles_module_scss__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(32026);
103024
+ /* harmony import */ var _styles_module_scss__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(29881);
103021
103025
  /* harmony import */ var _hooks_useHover__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(78556);
103022
103026
  /* harmony import */ var components_Tooltip_Tooltip__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(26982);
103023
103027
  /* harmony import */ var components_Tooltip_Tooltip__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(components_Tooltip_Tooltip__WEBPACK_IMPORTED_MODULE_8__);
@@ -103156,7 +103160,7 @@ var ProjectName = _ref => {
103156
103160
 
103157
103161
  /***/ }),
103158
103162
 
103159
- /***/ 78176:
103163
+ /***/ 57715:
103160
103164
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
103161
103165
 
103162
103166
  __webpack_require__.r(__webpack_exports__);
@@ -103164,8 +103168,8 @@ __webpack_require__.r(__webpack_exports__);
103164
103168
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
103165
103169
  /* harmony export */ });
103166
103170
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51649);
103167
- /* harmony import */ var _RunnerControls__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(15590);
103168
- /* harmony import */ var _styles_module_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26413);
103171
+ /* harmony import */ var _RunnerControls__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(80263);
103172
+ /* harmony import */ var _styles_module_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(67534);
103169
103173
  /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(74848);
103170
103174
 
103171
103175
 
@@ -103186,7 +103190,7 @@ var RunBar = _ref => {
103186
103190
 
103187
103191
  /***/ }),
103188
103192
 
103189
- /***/ 15590:
103193
+ /***/ 80263:
103190
103194
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
103191
103195
 
103192
103196
  // ESM COMPAT FLAG
@@ -103204,7 +103208,7 @@ var objectSpread2 = __webpack_require__(89379);
103204
103208
  // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js + 1 modules
103205
103209
  var objectWithoutProperties = __webpack_require__(53986);
103206
103210
  // EXTERNAL MODULE: ./src/components/Button/Button.jsx + 1 modules
103207
- var Button = __webpack_require__(60232);
103211
+ var Button = __webpack_require__(79428);
103208
103212
  // EXTERNAL MODULE: external "react-redux"
103209
103213
  var external_react_redux_ = __webpack_require__(14062);
103210
103214
  // EXTERNAL MODULE: ./src/redux/EditorSlice.ts
@@ -103244,7 +103248,7 @@ var RunButton = _ref => {
103244
103248
  var classnames = __webpack_require__(46942);
103245
103249
  var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);
103246
103250
  // EXTERNAL MODULE: ./src/components/RunButton/styles.module.scss
103247
- var styles_module = __webpack_require__(26413);
103251
+ var styles_module = __webpack_require__(67534);
103248
103252
  // EXTERNAL MODULE: ./src/components/SpinnerDotted/SpinnerDotted.tsx
103249
103253
  var SpinnerDotted = __webpack_require__(79458);
103250
103254
  ;// ./src/components/RunButton/StopButton.jsx
@@ -103371,7 +103375,7 @@ var RunnerControls = () => {
103371
103375
 
103372
103376
  /***/ }),
103373
103377
 
103374
- /***/ 50468:
103378
+ /***/ 88814:
103375
103379
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
103376
103380
 
103377
103381
  // ESM COMPAT FLAG
@@ -103418,7 +103422,7 @@ var external_react_redux_ = __webpack_require__(14062);
103418
103422
  // EXTERNAL MODULE: ./src/assets/icons/save.svg
103419
103423
  var save = __webpack_require__(48060);
103420
103424
  // EXTERNAL MODULE: ./src/components/Button/Button.jsx + 1 modules
103421
- var Button = __webpack_require__(60232);
103425
+ var Button = __webpack_require__(79428);
103422
103426
  // EXTERNAL MODULE: ./src/redux/EditorSlice.ts
103423
103427
  var EditorSlice = __webpack_require__(68512);
103424
103428
  // EXTERNAL MODULE: ./src/redux/types.ts
@@ -103502,7 +103506,7 @@ var SaveButton = props => {
103502
103506
 
103503
103507
  /***/ }),
103504
103508
 
103505
- /***/ 30272:
103509
+ /***/ 53841:
103506
103510
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
103507
103511
 
103508
103512
  __webpack_require__.r(__webpack_exports__);
@@ -103539,7 +103543,7 @@ var themeUpdatedEvent = detail => webComponentCustomEvent("editor-themeUpdated",
103539
103543
 
103540
103544
  /***/ }),
103541
103545
 
103542
- /***/ 72788:
103546
+ /***/ 41527:
103543
103547
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
103544
103548
 
103545
103549
  // ESM COMPAT FLAG
@@ -106200,7 +106204,7 @@ instance.use(es.initReactI18next)
106200
106204
 
106201
106205
  /***/ }),
106202
106206
 
106203
- /***/ 66298:
106207
+ /***/ 61193:
106204
106208
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
106205
106209
 
106206
106210
  __webpack_require__.r(__webpack_exports__);
@@ -106235,7 +106239,7 @@ var CloseIcon = props => {
106235
106239
 
106236
106240
  /***/ }),
106237
106241
 
106238
- /***/ 98748:
106242
+ /***/ 29441:
106239
106243
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
106240
106244
 
106241
106245
  __webpack_require__.r(__webpack_exports__);
@@ -106254,7 +106258,7 @@ var defaultMZCriteria = {
106254
106258
 
106255
106259
  /***/ }),
106256
106260
 
106257
- /***/ 95488:
106261
+ /***/ 51535:
106258
106262
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
106259
106263
 
106260
106264
  // ESM COMPAT FLAG
@@ -107224,7 +107228,7 @@ var ResizableWithHandle = props => {
107224
107228
 
107225
107229
  /***/ }),
107226
107230
 
107227
- /***/ 81923:
107231
+ /***/ 22554:
107228
107232
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
107229
107233
 
107230
107234
  __webpack_require__.r(__webpack_exports__);
@@ -107237,7 +107241,7 @@ var MOBILE_MEDIA_QUERY = "(max-width: ".concat(MOBILE_BREAKPOINT, ")");
107237
107241
 
107238
107242
  /***/ }),
107239
107243
 
107240
- /***/ 3798:
107244
+ /***/ 62161:
107241
107245
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
107242
107246
 
107243
107247
  __webpack_require__.r(__webpack_exports__);
@@ -142800,7 +142804,7 @@ function populateMaps (extensions, types) {
142800
142804
 
142801
142805
  /***/ }),
142802
142806
 
142803
- /***/ 8426:
142807
+ /***/ 31323:
142804
142808
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142805
142809
 
142806
142810
  __webpack_require__.r(__webpack_exports__);
@@ -142809,7 +142813,7 @@ __webpack_require__.r(__webpack_exports__);
142809
142813
 
142810
142814
  /***/ }),
142811
142815
 
142812
- /***/ 87383:
142816
+ /***/ 63724:
142813
142817
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142814
142818
 
142815
142819
  __webpack_require__.r(__webpack_exports__);
@@ -142821,7 +142825,7 @@ __webpack_require__.r(__webpack_exports__);
142821
142825
 
142822
142826
  /***/ }),
142823
142827
 
142824
- /***/ 50271:
142828
+ /***/ 44502:
142825
142829
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142826
142830
 
142827
142831
  __webpack_require__.r(__webpack_exports__);
@@ -142833,7 +142837,7 @@ __webpack_require__.r(__webpack_exports__);
142833
142837
 
142834
142838
  /***/ }),
142835
142839
 
142836
- /***/ 91271:
142840
+ /***/ 71244:
142837
142841
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142838
142842
 
142839
142843
  __webpack_require__.r(__webpack_exports__);
@@ -142845,7 +142849,7 @@ __webpack_require__.r(__webpack_exports__);
142845
142849
 
142846
142850
  /***/ }),
142847
142851
 
142848
- /***/ 57283:
142852
+ /***/ 39412:
142849
142853
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142850
142854
 
142851
142855
  __webpack_require__.r(__webpack_exports__);
@@ -142857,7 +142861,7 @@ __webpack_require__.r(__webpack_exports__);
142857
142861
 
142858
142862
  /***/ }),
142859
142863
 
142860
- /***/ 46259:
142864
+ /***/ 12914:
142861
142865
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142862
142866
 
142863
142867
  __webpack_require__.r(__webpack_exports__);
@@ -142869,7 +142873,7 @@ __webpack_require__.r(__webpack_exports__);
142869
142873
 
142870
142874
  /***/ }),
142871
142875
 
142872
- /***/ 20140:
142876
+ /***/ 87295:
142873
142877
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142874
142878
 
142875
142879
  __webpack_require__.r(__webpack_exports__);
@@ -142881,7 +142885,7 @@ __webpack_require__.r(__webpack_exports__);
142881
142885
 
142882
142886
  /***/ }),
142883
142887
 
142884
- /***/ 29707:
142888
+ /***/ 28076:
142885
142889
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142886
142890
 
142887
142891
  __webpack_require__.r(__webpack_exports__);
@@ -142893,7 +142897,7 @@ __webpack_require__.r(__webpack_exports__);
142893
142897
 
142894
142898
  /***/ }),
142895
142899
 
142896
- /***/ 12102:
142900
+ /***/ 51191:
142897
142901
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142898
142902
 
142899
142903
  __webpack_require__.r(__webpack_exports__);
@@ -142905,7 +142909,7 @@ __webpack_require__.r(__webpack_exports__);
142905
142909
 
142906
142910
  /***/ }),
142907
142911
 
142908
- /***/ 81055:
142912
+ /***/ 52160:
142909
142913
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142910
142914
 
142911
142915
  __webpack_require__.r(__webpack_exports__);
@@ -142917,7 +142921,7 @@ __webpack_require__.r(__webpack_exports__);
142917
142921
 
142918
142922
  /***/ }),
142919
142923
 
142920
- /***/ 68233:
142924
+ /***/ 10614:
142921
142925
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142922
142926
 
142923
142927
  __webpack_require__.r(__webpack_exports__);
@@ -142929,7 +142933,7 @@ __webpack_require__.r(__webpack_exports__);
142929
142933
 
142930
142934
  /***/ }),
142931
142935
 
142932
- /***/ 79473:
142936
+ /***/ 10556:
142933
142937
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142934
142938
 
142935
142939
  __webpack_require__.r(__webpack_exports__);
@@ -142941,7 +142945,7 @@ __webpack_require__.r(__webpack_exports__);
142941
142945
 
142942
142946
  /***/ }),
142943
142947
 
142944
- /***/ 50239:
142948
+ /***/ 21852:
142945
142949
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142946
142950
 
142947
142951
  __webpack_require__.r(__webpack_exports__);
@@ -142953,7 +142957,7 @@ __webpack_require__.r(__webpack_exports__);
142953
142957
 
142954
142958
  /***/ }),
142955
142959
 
142956
- /***/ 15744:
142960
+ /***/ 62857:
142957
142961
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142958
142962
 
142959
142963
  __webpack_require__.r(__webpack_exports__);
@@ -142965,7 +142969,7 @@ __webpack_require__.r(__webpack_exports__);
142965
142969
 
142966
142970
  /***/ }),
142967
142971
 
142968
- /***/ 41809:
142972
+ /***/ 27924:
142969
142973
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142970
142974
 
142971
142975
  __webpack_require__.r(__webpack_exports__);
@@ -142977,7 +142981,7 @@ __webpack_require__.r(__webpack_exports__);
142977
142981
 
142978
142982
  /***/ }),
142979
142983
 
142980
- /***/ 49871:
142984
+ /***/ 29642:
142981
142985
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142982
142986
 
142983
142987
  __webpack_require__.r(__webpack_exports__);
@@ -142989,7 +142993,7 @@ __webpack_require__.r(__webpack_exports__);
142989
142993
 
142990
142994
  /***/ }),
142991
142995
 
142992
- /***/ 79730:
142996
+ /***/ 6631:
142993
142997
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
142994
142998
 
142995
142999
  __webpack_require__.r(__webpack_exports__);
@@ -143001,7 +143005,7 @@ __webpack_require__.r(__webpack_exports__);
143001
143005
 
143002
143006
  /***/ }),
143003
143007
 
143004
- /***/ 79354:
143008
+ /***/ 38653:
143005
143009
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143006
143010
 
143007
143011
  __webpack_require__.r(__webpack_exports__);
@@ -143013,7 +143017,7 @@ __webpack_require__.r(__webpack_exports__);
143013
143017
 
143014
143018
  /***/ }),
143015
143019
 
143016
- /***/ 19436:
143020
+ /***/ 88525:
143017
143021
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143018
143022
 
143019
143023
  __webpack_require__.r(__webpack_exports__);
@@ -143025,7 +143029,7 @@ __webpack_require__.r(__webpack_exports__);
143025
143029
 
143026
143030
  /***/ }),
143027
143031
 
143028
- /***/ 32026:
143032
+ /***/ 29881:
143029
143033
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143030
143034
 
143031
143035
  __webpack_require__.r(__webpack_exports__);
@@ -143037,7 +143041,7 @@ __webpack_require__.r(__webpack_exports__);
143037
143041
 
143038
143042
  /***/ }),
143039
143043
 
143040
- /***/ 26413:
143044
+ /***/ 67534:
143041
143045
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143042
143046
 
143043
143047
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
@@ -143048,7 +143052,7 @@ __webpack_require__.r(__webpack_exports__);
143048
143052
 
143049
143053
  /***/ }),
143050
143054
 
143051
- /***/ 99855:
143055
+ /***/ 68776:
143052
143056
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143053
143057
 
143054
143058
  __webpack_require__.r(__webpack_exports__);
@@ -143060,7 +143064,7 @@ __webpack_require__.r(__webpack_exports__);
143060
143064
 
143061
143065
  /***/ }),
143062
143066
 
143063
- /***/ 2109:
143067
+ /***/ 73386:
143064
143068
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143065
143069
 
143066
143070
  __webpack_require__.r(__webpack_exports__);
@@ -143072,7 +143076,7 @@ __webpack_require__.r(__webpack_exports__);
143072
143076
 
143073
143077
  /***/ }),
143074
143078
 
143075
- /***/ 99265:
143079
+ /***/ 91156:
143076
143080
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143077
143081
 
143078
143082
  __webpack_require__.r(__webpack_exports__);
@@ -143084,7 +143088,7 @@ __webpack_require__.r(__webpack_exports__);
143084
143088
 
143085
143089
  /***/ }),
143086
143090
 
143087
- /***/ 92867:
143091
+ /***/ 27112:
143088
143092
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143089
143093
 
143090
143094
  __webpack_require__.r(__webpack_exports__);
@@ -143096,7 +143100,7 @@ __webpack_require__.r(__webpack_exports__);
143096
143100
 
143097
143101
  /***/ }),
143098
143102
 
143099
- /***/ 64383:
143103
+ /***/ 28188:
143100
143104
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143101
143105
 
143102
143106
  __webpack_require__.r(__webpack_exports__);
@@ -143108,7 +143112,7 @@ __webpack_require__.r(__webpack_exports__);
143108
143112
 
143109
143113
  /***/ }),
143110
143114
 
143111
- /***/ 63534:
143115
+ /***/ 93105:
143112
143116
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143113
143117
 
143114
143118
  __webpack_require__.r(__webpack_exports__);
@@ -143120,7 +143124,7 @@ __webpack_require__.r(__webpack_exports__);
143120
143124
 
143121
143125
  /***/ }),
143122
143126
 
143123
- /***/ 50879:
143127
+ /***/ 36974:
143124
143128
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143125
143129
 
143126
143130
  __webpack_require__.r(__webpack_exports__);
@@ -143132,7 +143136,7 @@ __webpack_require__.r(__webpack_exports__);
143132
143136
 
143133
143137
  /***/ }),
143134
143138
 
143135
- /***/ 1098:
143139
+ /***/ 44221:
143136
143140
  /***/ (() => {
143137
143141
 
143138
143142
  // extracted by mini-css-extract-plugin
@@ -143140,7 +143144,7 @@ __webpack_require__.r(__webpack_exports__);
143140
143144
 
143141
143145
  /***/ }),
143142
143146
 
143143
- /***/ 99782:
143147
+ /***/ 7703:
143144
143148
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143145
143149
 
143146
143150
  __webpack_require__.r(__webpack_exports__);
@@ -143149,7 +143153,7 @@ __webpack_require__.r(__webpack_exports__);
143149
143153
 
143150
143154
  /***/ }),
143151
143155
 
143152
- /***/ 22984:
143156
+ /***/ 75765:
143153
143157
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143154
143158
 
143155
143159
  __webpack_require__.r(__webpack_exports__);
@@ -143158,7 +143162,7 @@ __webpack_require__.r(__webpack_exports__);
143158
143162
 
143159
143163
  /***/ }),
143160
143164
 
143161
- /***/ 32433:
143165
+ /***/ 41882:
143162
143166
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143163
143167
 
143164
143168
  __webpack_require__.r(__webpack_exports__);
@@ -228020,7 +228024,7 @@ function registerTraceModule(_module) {
228020
228024
 
228021
228025
  // add maplibre-gl CSS here to avoid console warning on instantiation
228022
228026
  if(bpmName === 'map') {
228023
- __webpack_require__(8426);
228027
+ __webpack_require__(31323);
228024
228028
  }
228025
228029
 
228026
228030
  // if `plotly-geo-assets.js` is not included,
@@ -368723,7 +368727,7 @@ const stores_1 = __webpack_require__(32132);
368723
368727
  const react_redux_1 = __webpack_require__(14062);
368724
368728
  const react_router_dom_1 = __webpack_require__(92648);
368725
368729
  const AuthContext_1 = __webpack_require__(55471);
368726
- __webpack_require__(72788);
368730
+ __webpack_require__(41527);
368727
368731
  const editorListener_1 = __webpack_require__(41824);
368728
368732
  const Loading_1 = __importDefault(__webpack_require__(34466));
368729
368733
  const LeaveGuardController_1 = __webpack_require__(65240);
@@ -368872,9 +368876,9 @@ const jsx_runtime_1 = __webpack_require__(74848);
368872
368876
  const react_1 = __webpack_require__(51649);
368873
368877
  const classnames_1 = __importDefault(__webpack_require__(46942));
368874
368878
  const history_svg_1 = __importDefault(__webpack_require__(93113));
368875
- const Button_1 = __importDefault(__webpack_require__(60232));
368879
+ const Button_1 = __importDefault(__webpack_require__(79428));
368876
368880
  const stores_1 = __webpack_require__(32132);
368877
- const styles_module_scss_1 = __importDefault(__webpack_require__(87383));
368881
+ const styles_module_scss_1 = __importDefault(__webpack_require__(63724));
368878
368882
  const SvgIcon_1 = __webpack_require__(82917);
368879
368883
  const CommitHistoryMenu_1 = __webpack_require__(46175);
368880
368884
  const Tooltip_1 = __importDefault(__webpack_require__(26982));
@@ -368910,7 +368914,7 @@ const jsx_runtime_1 = __webpack_require__(74848);
368910
368914
  const SvgIcon_1 = __webpack_require__(82917);
368911
368915
  const Text_1 = __webpack_require__(82803);
368912
368916
  const history_svg_1 = __importDefault(__webpack_require__(93113));
368913
- const styles_module_scss_1 = __importDefault(__webpack_require__(87383));
368917
+ const styles_module_scss_1 = __importDefault(__webpack_require__(63724));
368914
368918
  const CommitHoverElement = () => {
368915
368919
  return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.commitHoverElement, children: [(0, jsx_runtime_1.jsx)(SvgIcon_1.SvgIcon, { SvgElement: history_svg_1.default, size: 18 }), (0, jsx_runtime_1.jsx)(Text_1.Text, { size: 10, weight: "medium", children: "Restore" })] }));
368916
368920
  };
@@ -368933,7 +368937,7 @@ const js_convert_case_1 = __webpack_require__(61647);
368933
368937
  const download_svg_1 = __importDefault(__webpack_require__(63279));
368934
368938
  const stores_1 = __webpack_require__(32132);
368935
368939
  const SvgIcon_1 = __webpack_require__(82917);
368936
- const Button_1 = __importDefault(__webpack_require__(60232));
368940
+ const Button_1 = __importDefault(__webpack_require__(79428));
368937
368941
  const createProjectArchive_1 = __webpack_require__(46514);
368938
368942
  const DownloadButton = (props) => {
368939
368943
  const project = (0, stores_1.useAppSelector)((state) => state.editor.project);
@@ -368996,16 +369000,16 @@ const react_redux_1 = __webpack_require__(14062);
368996
369000
  const react_tabs_1 = __webpack_require__(39243);
368997
369001
  const react_responsive_1 = __webpack_require__(17988);
368998
369002
  const EditorSlice_1 = __webpack_require__(68512);
368999
- const Button_1 = __importDefault(__webpack_require__(60232));
369000
- const EditorPanel_1 = __importDefault(__webpack_require__(1777));
369001
- const DraggableTab_1 = __importDefault(__webpack_require__(11086));
369002
- const DroppableTabList_1 = __importDefault(__webpack_require__(19446));
369003
- const RunnerControls_1 = __importDefault(__webpack_require__(15590));
369004
- const mediaQueryBreakpoints_1 = __webpack_require__(81923);
369005
- const CloseIcon_1 = __importDefault(__webpack_require__(66298));
369003
+ const Button_1 = __importDefault(__webpack_require__(79428));
369004
+ const EditorPanel_1 = __importDefault(__webpack_require__(82467));
369005
+ const DraggableTab_1 = __importDefault(__webpack_require__(74215));
369006
+ const DroppableTabList_1 = __importDefault(__webpack_require__(48339));
369007
+ const RunnerControls_1 = __importDefault(__webpack_require__(80263));
369008
+ const mediaQueryBreakpoints_1 = __webpack_require__(22554);
369009
+ const CloseIcon_1 = __importDefault(__webpack_require__(61193));
369006
369010
  const FileIcon_1 = __importDefault(__webpack_require__(94028));
369007
369011
  const readonly_svg_1 = __importDefault(__webpack_require__(19297));
369008
- const styles_module_scss_1 = __importDefault(__webpack_require__(50271));
369012
+ const styles_module_scss_1 = __importDefault(__webpack_require__(44502));
369009
369013
  const stores_1 = __webpack_require__(32132);
369010
369014
  const ProjectTypes_1 = __webpack_require__(27130);
369011
369015
  const projectHelpers_1 = __webpack_require__(2610);
@@ -369146,7 +369150,7 @@ exports.ErrorDetails = void 0;
369146
369150
  const jsx_runtime_1 = __webpack_require__(74848);
369147
369151
  const SvgIcon_1 = __webpack_require__(82917);
369148
369152
  const alert_svg_1 = __importDefault(__webpack_require__(11367));
369149
- const styles_module_scss_1 = __importDefault(__webpack_require__(91271));
369153
+ const styles_module_scss_1 = __importDefault(__webpack_require__(71244));
369150
369154
  const Text_1 = __webpack_require__(82803);
369151
369155
  const stores_1 = __webpack_require__(32132);
369152
369156
  const Errors_1 = __webpack_require__(20339);
@@ -369173,7 +369177,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
369173
369177
  Object.defineProperty(exports, "__esModule", ({ value: true }));
369174
369178
  const jsx_runtime_1 = __webpack_require__(74848);
369175
369179
  const stores_1 = __webpack_require__(32132);
369176
- const styles_module_scss_1 = __importDefault(__webpack_require__(91271));
369180
+ const styles_module_scss_1 = __importDefault(__webpack_require__(71244));
369177
369181
  const react_1 = __webpack_require__(51649);
369178
369182
  const ErrorDetails_1 = __webpack_require__(80335);
369179
369183
  const ErrorMessage = () => {
@@ -369205,7 +369209,7 @@ exports.NotFoundPage = void 0;
369205
369209
  const jsx_runtime_1 = __webpack_require__(74848);
369206
369210
  const not_found_code_svg_1 = __importDefault(__webpack_require__(15552));
369207
369211
  const not_found_svg_1 = __importDefault(__webpack_require__(95436));
369208
- const styles_module_scss_1 = __importDefault(__webpack_require__(91271));
369212
+ const styles_module_scss_1 = __importDefault(__webpack_require__(71244));
369209
369213
  const ErrorDetails_1 = __webpack_require__(80335);
369210
369214
  const NotFoundPage = () => {
369211
369215
  return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.notFoundContainer, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.notFoundText, children: [(0, jsx_runtime_1.jsx)(not_found_code_svg_1.default, {}), (0, jsx_runtime_1.jsx)(not_found_svg_1.default, {})] }), (0, jsx_runtime_1.jsx)(ErrorDetails_1.ErrorDetails, {})] }));
@@ -369224,9 +369228,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
369224
369228
  };
369225
369229
  Object.defineProperty(exports, "__esModule", ({ value: true }));
369226
369230
  const jsx_runtime_1 = __webpack_require__(74848);
369227
- const ExternalFiles_1 = __importDefault(__webpack_require__(23363));
369231
+ const ExternalFiles_1 = __importDefault(__webpack_require__(46590));
369228
369232
  const RunnerFactory_1 = __importDefault(__webpack_require__(78329));
369229
- const styles_module_scss_1 = __importDefault(__webpack_require__(57283));
369233
+ const styles_module_scss_1 = __importDefault(__webpack_require__(39412));
369230
369234
  const stores_1 = __webpack_require__(32132);
369231
369235
  const Output = ({ packageApiUrl }) => {
369232
369236
  const project = (0, stores_1.useAppSelector)((state) => state.editor.project);
@@ -369247,7 +369251,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
369247
369251
  Object.defineProperty(exports, "__esModule", ({ value: true }));
369248
369252
  const jsx_runtime_1 = __webpack_require__(74848);
369249
369253
  const classnames_1 = __importDefault(__webpack_require__(46942));
369250
- const styles_module_scss_1 = __importDefault(__webpack_require__(46259));
369254
+ const styles_module_scss_1 = __importDefault(__webpack_require__(12914));
369251
369255
  const LogRenderer_1 = __importDefault(__webpack_require__(67278));
369252
369256
  const SvgIcon_1 = __webpack_require__(82917);
369253
369257
  const alert_svg_1 = __importDefault(__webpack_require__(11367));
@@ -369289,14 +369293,14 @@ const SvgIcon_1 = __webpack_require__(82917);
369289
369293
  const console_svg_1 = __importDefault(__webpack_require__(20602));
369290
369294
  const preview_svg_1 = __importDefault(__webpack_require__(80417));
369291
369295
  const OutputTabPanel_1 = __webpack_require__(25931);
369292
- const styles_module_scss_1 = __importDefault(__webpack_require__(46259));
369296
+ const styles_module_scss_1 = __importDefault(__webpack_require__(12914));
369293
369297
  const helpers_1 = __webpack_require__(1108);
369294
369298
  const fileParsers_1 = __webpack_require__(26683);
369295
369299
  const scripts_1 = __webpack_require__(57621);
369296
369300
  const Errors_1 = __webpack_require__(20339);
369297
369301
  const NotFoundPage_1 = __webpack_require__(87931);
369298
369302
  const HtmlConsole_1 = __importDefault(__webpack_require__(55339));
369299
- const ResizableWithHandle_1 = __importDefault(__webpack_require__(95488));
369303
+ const ResizableWithHandle_1 = __importDefault(__webpack_require__(51535));
369300
369304
  const BROADCAST_CHANNEL = "html_runner_channel";
369301
369305
  var BroadcastMessageType;
369302
369306
  (function (BroadcastMessageType) {
@@ -369524,7 +369528,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
369524
369528
  };
369525
369529
  Object.defineProperty(exports, "__esModule", ({ value: true }));
369526
369530
  const jsx_runtime_1 = __webpack_require__(74848);
369527
- const styles_module_scss_1 = __importDefault(__webpack_require__(46259));
369531
+ const styles_module_scss_1 = __importDefault(__webpack_require__(12914));
369528
369532
  var SerializedNodeType;
369529
369533
  (function (SerializedNodeType) {
369530
369534
  SerializedNodeType["String"] = "string";
@@ -370142,7 +370146,7 @@ const classnames_1 = __importDefault(__webpack_require__(46942));
370142
370146
  const react_tabs_1 = __webpack_require__(39243);
370143
370147
  const Text_1 = __webpack_require__(82803);
370144
370148
  const SvgIcon_1 = __webpack_require__(82917);
370145
- const styles_module_scss_1 = __importDefault(__webpack_require__(46259));
370149
+ const styles_module_scss_1 = __importDefault(__webpack_require__(12914));
370146
370150
  const stores_1 = __webpack_require__(32132);
370147
370151
  const OutputTabPanel = ({ title, icon: Icon, readOnly, children, outputWrapperClassName, extraTabContent, tabPanelClassName, }) => {
370148
370152
  const outputOnly = (0, stores_1.useAppSelector)((state) => state.editor.isOutputOnly);
@@ -370160,6 +370164,152 @@ exports.OutputTabPanel = OutputTabPanel;
370160
370164
  /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
370161
370165
 
370162
370166
 
370167
+ var __importDefault = (this && this.__importDefault) || function (mod) {
370168
+ return (mod && mod.__esModule) ? mod : { "default": mod };
370169
+ };
370170
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
370171
+ const jsx_runtime_1 = __webpack_require__(74848);
370172
+ const classnames_1 = __importDefault(__webpack_require__(46942));
370173
+ const styles_module_scss_1 = __importDefault(__webpack_require__(12914));
370174
+ const ErrorMessage_1 = __importDefault(__webpack_require__(74364));
370175
+ const VisualOutputPane_1 = __importDefault(__webpack_require__(39626));
370176
+ const stores_1 = __webpack_require__(32132);
370177
+ const OutputTabPanel_1 = __webpack_require__(25931);
370178
+ const console_svg_1 = __importDefault(__webpack_require__(20602));
370179
+ const preview_svg_1 = __importDefault(__webpack_require__(80417));
370180
+ const ResizableWithHandle_1 = __importDefault(__webpack_require__(51535));
370181
+ const usePyodideRunner_1 = __webpack_require__(65587);
370182
+ const consoleInput_1 = __webpack_require__(35660);
370183
+ /**
370184
+ * Pyodide-powered Python runner.
370185
+ *
370186
+ * All worker plumbing — Pyodide Web Worker lifecycle, stdin Service Worker
370187
+ * registration, message dispatching, run/stop orchestration — lives in
370188
+ * `usePyodideRunner` and its sub-hooks. This component is purely a thin
370189
+ * shell that wires the returned state into the layout.
370190
+ */
370191
+ const PyodideRunner = ({ active, packageApiUrl, }) => {
370192
+ const readOnly = (0, stores_1.useAppSelector)((state) => state.editor.readOnly);
370193
+ const { output, visuals, setVisuals, workerInitialized } = (0, usePyodideRunner_1.usePyodideRunner)({
370194
+ active,
370195
+ packageApiUrl,
370196
+ });
370197
+ if (!workerInitialized && active) {
370198
+ console.warn("PyodideWorker is not initialized");
370199
+ return null;
370200
+ }
370201
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.pythonrunnerContainer, styles_module_scss_1.default.pyodiderunner, active && styles_module_scss_1.default.active), children: [(0, jsx_runtime_1.jsxs)(OutputTabPanel_1.OutputTabPanel, { title: "Terminal", icon: console_svg_1.default, readOnly: readOnly, children: [(0, jsx_runtime_1.jsx)(ErrorMessage_1.default, {}), (0, jsx_runtime_1.jsx)("pre", { className: styles_module_scss_1.default.console, onClick: consoleInput_1.shiftFocusToInput, ref: output })] }), (0, jsx_runtime_1.jsx)(ResizableWithHandle_1.default, { "data-testid": "proj-console-container", handleDirection: "top", defaultHeight: "50%", className: styles_module_scss_1.default.resizeContainer, handleClassName: styles_module_scss_1.default.resizeHandleContainer, children: (0, jsx_runtime_1.jsx)(OutputTabPanel_1.OutputTabPanel, { title: "Visual output", icon: preview_svg_1.default, readOnly: readOnly, children: (0, jsx_runtime_1.jsx)(VisualOutputPane_1.default, { visuals: visuals, setVisuals: setVisuals }) }) })] }));
370202
+ };
370203
+ exports["default"] = PyodideRunner;
370204
+
370205
+
370206
+ /***/ }),
370207
+
370208
+ /***/ 39626:
370209
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
370210
+
370211
+
370212
+ var __importDefault = (this && this.__importDefault) || function (mod) {
370213
+ return (mod && mod.__esModule) ? mod : { "default": mod };
370214
+ };
370215
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
370216
+ const jsx_runtime_1 = __webpack_require__(74848);
370217
+ const react_1 = __webpack_require__(51649);
370218
+ const highcharts_1 = __importDefault(__webpack_require__(14783));
370219
+ const plotly_js_1 = __importDefault(__webpack_require__(28850));
370220
+ const styles_module_scss_1 = __importDefault(__webpack_require__(12914));
370221
+ const VisualOutputPane = ({ visuals, setVisuals }) => {
370222
+ const output = (0, react_1.useRef)(null);
370223
+ const showVisual = (0, react_1.useCallback)((visual, output) => {
370224
+ switch (visual.origin) {
370225
+ case "pygal":
370226
+ const chartContent = {
370227
+ ...visual.content,
370228
+ chart: {
370229
+ ...visual.content.chart,
370230
+ events: {
370231
+ ...visual.content.chart.events,
370232
+ load: function () {
370233
+ this.renderTo.style.overflow = "visible";
370234
+ },
370235
+ },
370236
+ },
370237
+ tooltip: {
370238
+ ...visual.content.tooltip,
370239
+ formatter: visual.content.chart.type === "pie"
370240
+ ? function () {
370241
+ return this.key + ": " + this.y;
370242
+ }
370243
+ : null,
370244
+ },
370245
+ };
370246
+ highcharts_1.default.chart(output.current, chartContent);
370247
+ break;
370248
+ case "turtle":
370249
+ output.current.innerHTML = elementFromProps(visual.content).outerHTML;
370250
+ break;
370251
+ case "matplotlib":
370252
+ // convert visual.content from Uint8Array to jpg
370253
+ const img = document.createElement("img");
370254
+ img.style = "max-width: 100%; max-height: 100%;";
370255
+ img.src = `data:image/jpg;base64,${window.btoa(String.fromCharCode(...new Uint8Array(visual.content)))}`;
370256
+ output.current.innerHTML = img.outerHTML;
370257
+ break;
370258
+ case "plotly":
370259
+ const plotlyJson = visual.content;
370260
+ // Parse the JSON
370261
+ const figure = JSON.parse(plotlyJson);
370262
+ // Render using Plotly.js
370263
+ plotly_js_1.default.newPlot(output.current, figure.data, figure.layout);
370264
+ break;
370265
+ default:
370266
+ throw new Error(`Unsupported origin: ${visual.origin}`);
370267
+ }
370268
+ visual.showing = true;
370269
+ return visual;
370270
+ }, []);
370271
+ const showVisuals = (0, react_1.useCallback)((visuals, output) => visuals.map((v) => (v.showing ? v : showVisual(v, output))), [showVisual]);
370272
+ (0, react_1.useEffect)(() => {
370273
+ if (visuals.length === 0 && output.current) {
370274
+ if (output.current) {
370275
+ output.current.innerHTML = "";
370276
+ }
370277
+ }
370278
+ else if (visuals.some((v) => !v.showing)) {
370279
+ setVisuals((visuals) => showVisuals(visuals, output));
370280
+ }
370281
+ }, [visuals, setVisuals, showVisuals]);
370282
+ return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.visualOutput, children: (0, jsx_runtime_1.jsx)("div", { ref: output, className: styles_module_scss_1.default.pythonGraphic }) }));
370283
+ };
370284
+ const elementFromProps = (map) => {
370285
+ const tag = map.get("tag");
370286
+ if (!tag) {
370287
+ return document.createTextNode(map.get("text"));
370288
+ }
370289
+ const node = document.createElement(tag);
370290
+ for (const [key, value] of map.get("props")) {
370291
+ node.setAttribute(key, value);
370292
+ }
370293
+ for (const childProps of map.get("children")) {
370294
+ node.appendChild(elementFromProps(childProps));
370295
+ }
370296
+ return node;
370297
+ };
370298
+ exports["default"] = VisualOutputPane;
370299
+
370300
+
370301
+ /***/ }),
370302
+
370303
+ /***/ 85799:
370304
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
370305
+
370306
+
370307
+ /**
370308
+ * Webpack-resolved URLs for the Pyodide worker and the stdin Service Worker.
370309
+ *
370310
+ * Isolated from `./constants.ts` so the pure-constants module can be loaded
370311
+ * by tests without needing webpack to handle the `?url` query suffix.
370312
+ */
370163
370313
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
370164
370314
  if (k2 === undefined) k2 = k;
370165
370315
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -370197,147 +370347,170 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
370197
370347
  return (mod && mod.__esModule) ? mod : { "default": mod };
370198
370348
  };
370199
370349
  Object.defineProperty(exports, "__esModule", ({ value: true }));
370200
- const jsx_runtime_1 = __webpack_require__(74848);
370201
- /* eslint-disable react-hooks/exhaustive-deps */
370202
- const react_1 = __webpack_require__(51649);
370203
- const react_redux_1 = __webpack_require__(14062);
370204
- const classnames_1 = __importDefault(__webpack_require__(46942));
370205
- const styles_module_scss_1 = __importDefault(__webpack_require__(46259));
370206
- const EditorSlice_1 = __webpack_require__(68512);
370207
- const ErrorMessage_1 = __importDefault(__webpack_require__(74364));
370208
- const VisualOutputPane_1 = __importDefault(__webpack_require__(39626));
370209
- const pyodideAssets = __importStar(__webpack_require__(39644));
370350
+ exports.pyodideAssets = exports.PYODIDE_STDIN_SW_URL = exports.PYODIDE_WORKER_URL = void 0;
370351
+ const pyodideAssets = __importStar(__webpack_require__(33037));
370352
+ exports.pyodideAssets = pyodideAssets;
370210
370353
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
370211
370354
  // @ts-ignore
370212
370355
  const PyodideWorker_url_1 = __importDefault(__webpack_require__(24427));
370356
+ exports.PYODIDE_WORKER_URL = new URL(PyodideWorker_url_1.default, window.origin).href;
370357
+ exports.PYODIDE_STDIN_SW_URL = new URL(pyodideAssets.pyodideStdinSwUrl, window.origin).href;
370358
+
370359
+
370360
+ /***/ }),
370361
+
370362
+ /***/ 90804:
370363
+ /***/ ((__unused_webpack_module, exports) => {
370364
+
370365
+
370366
+ /**
370367
+ * Pure constants for the Pyodide runner. Kept free of webpack-specific
370368
+ * `?url` imports so the file can be required from a plain Jest environment.
370369
+ *
370370
+ * Resolved asset/worker URLs live in `./assetUrls.ts`.
370371
+ */
370372
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
370373
+ exports.SERVICE_WORKER_PROBE_TIMEOUT_MS = exports.SERVICE_WORKER_CONTROL_WAIT_MS = exports.PYODIDE_TAB_ID_STORAGE_KEY = exports.PYODIDE_STDIN_ENDPOINT = exports.PYTHON_ENTRY_FILE_PATH = void 0;
370374
+ exports.PYTHON_ENTRY_FILE_PATH = "/main.py";
370375
+ exports.PYODIDE_STDIN_ENDPOINT = "/pyodide-stdin";
370376
+ exports.PYODIDE_TAB_ID_STORAGE_KEY = "pyodide-stdin-tab-id";
370377
+ exports.SERVICE_WORKER_CONTROL_WAIT_MS = 2500;
370378
+ exports.SERVICE_WORKER_PROBE_TIMEOUT_MS = 1500;
370379
+
370380
+
370381
+ /***/ }),
370382
+
370383
+ /***/ 65587:
370384
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
370385
+
370386
+
370387
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
370388
+ exports.usePyodideRunner = void 0;
370389
+ /* eslint-disable react-hooks/exhaustive-deps */
370390
+ const react_1 = __webpack_require__(51649);
370391
+ const react_redux_1 = __webpack_require__(14062);
370213
370392
  const stores_1 = __webpack_require__(32132);
370214
- const EditorTypes_1 = __webpack_require__(42108);
370215
- const OutputTabPanel_1 = __webpack_require__(25931);
370216
- const console_svg_1 = __importDefault(__webpack_require__(20602));
370217
- const preview_svg_1 = __importDefault(__webpack_require__(80417));
370218
- const ProjectTypes_1 = __webpack_require__(27130);
370219
- const projectHelpers_1 = __webpack_require__(2610);
370393
+ const EditorSlice_1 = __webpack_require__(68512);
370220
370394
  const Errors_1 = __webpack_require__(20339);
370395
+ const ProjectTypes_1 = __webpack_require__(27130);
370396
+ const EditorTypes_1 = __webpack_require__(42108);
370397
+ const constants_1 = __webpack_require__(90804);
370398
+ const assetUrls_1 = __webpack_require__(85799);
370221
370399
  const helpers_1 = __webpack_require__(55717);
370222
- const ResizableWithHandle_1 = __importDefault(__webpack_require__(95488));
370223
- const PYTHON_ENTRY_FILE_PATH = "/main.py";
370224
- const url = new URL(PyodideWorker_url_1.default, window.origin).href;
370225
- const PyodideRunner = ({ active, packageApiUrl, }) => {
370226
- const [pyodideWorker, setPyodideWorker] = (0, react_1.useState)(null);
370227
- const interruptBuffer = (0, react_1.useRef)(null);
370228
- const stdinBuffer = (0, react_1.useRef)(null);
370229
- const stdinClosed = (0, react_1.useRef)(false);
370230
- const workerReady = (0, react_1.useRef)(false);
370400
+ const consoleInput_1 = __webpack_require__(35660);
370401
+ const consoleOutput_1 = __webpack_require__(98131);
370402
+ const fileWrite_1 = __webpack_require__(45230);
370403
+ const serviceWorker_1 = __webpack_require__(58158);
370404
+ const stdinFallbackMessages_1 = __webpack_require__(94879);
370405
+ const tabId_1 = __webpack_require__(95369);
370406
+ const usePyodideWorker_1 = __webpack_require__(93895);
370407
+ const useStdinServiceWorker_1 = __webpack_require__(86357);
370408
+ /**
370409
+ * Top-level coordinator for the Pyodide runner.
370410
+ *
370411
+ * It composes the two lifecycle hooks (Pyodide worker + stdin Service Worker)
370412
+ * and owns the cross-cutting state — buffers shared with the worker, the
370413
+ * current run id, the active input request, and the per-tab id used by the
370414
+ * stdin fallback. It also defines the message handlers the worker fires
370415
+ * back, and the run/stop callbacks driven by Redux.
370416
+ *
370417
+ * The React component itself stays free of any worker plumbing — it just
370418
+ * consumes the values returned here to drive its JSX.
370419
+ */
370420
+ const usePyodideRunner = ({ active, packageApiUrl, }) => {
370421
+ const dispatch = (0, react_redux_1.useDispatch)();
370422
+ // -------------------------------------------------------------------------
370423
+ // Redux selectors
370424
+ // -------------------------------------------------------------------------
370231
370425
  const loadedRunner = (0, stores_1.useAppSelector)((state) => state.editor.loadedRunner);
370232
370426
  const project = (0, stores_1.useAppSelector)((s) => s.editor.project);
370427
+ const codeRunTriggered = (0, stores_1.useAppSelector)((s) => s.editor.codeRunTriggered);
370428
+ const codeRunStopped = (0, stores_1.useAppSelector)((s) => s.editor.codeRunStopped);
370233
370429
  const projectComponents = project.components || [];
370234
370430
  const projectCode = (0, react_1.useMemo)(() => projectComponents.filter((component) => component.type === ProjectTypes_1.ProjectComponentType.FILE), [projectComponents]);
370235
370431
  const userModuleNames = (0, react_1.useMemo)(() => (0, helpers_1.getPythonUserModuleNames)(projectCode), [projectCode]);
370236
- const codeRunTriggered = (0, stores_1.useAppSelector)((s) => s.editor.codeRunTriggered);
370237
- const codeRunStopped = (0, stores_1.useAppSelector)((s) => s.editor.codeRunStopped);
370238
- const readOnly = (0, stores_1.useAppSelector)((state) => state.editor.readOnly);
370432
+ // -------------------------------------------------------------------------
370433
+ // Long-lived refs shared across handlers
370434
+ // -------------------------------------------------------------------------
370435
+ /** Pointer into the SharedArrayBuffer used for stdin (sab strategy). */
370436
+ const stdinBuffer = (0, react_1.useRef)(null);
370437
+ /** Pointer into the SharedArrayBuffer used for SIGINT. */
370438
+ const interruptBuffer = (0, react_1.useRef)(null);
370439
+ /** True once the worker reports it's ready to run code. */
370440
+ const workerReady = (0, react_1.useRef)(false);
370441
+ /** Latched when the user signals EOF; persists for the rest of the run. */
370442
+ const stdinClosed = (0, react_1.useRef)(false);
370443
+ /** Which stdin strategy the worker negotiated: "sab" | "jspi" | "sync-xhr" | "unavailable". */
370444
+ const stdinStrategy = (0, react_1.useRef)("sab");
370445
+ /** Identifier of the currently-running Python execution. */
370446
+ const runId = (0, react_1.useRef)(null);
370447
+ /** Stable id used by the stdin SW to route input requests to this tab. */
370448
+ const tabIdRef = (0, react_1.useRef)((0, tabId_1.getOrCreateTabId)());
370449
+ /** The SW-fallback input request that's currently waiting on the user. */
370450
+ const activeInputRequest = (0, react_1.useRef)(null);
370451
+ // -------------------------------------------------------------------------
370452
+ // Component-managed state
370453
+ // -------------------------------------------------------------------------
370239
370454
  const output = (0, react_1.useRef)(null);
370240
- const dispatch = (0, react_redux_1.useDispatch)();
370241
370455
  const [visuals, setVisuals] = (0, react_1.useState)([]);
370242
- const createWorker = (0, react_1.useCallback)(() => {
370243
- const worker = new Worker(url);
370244
- worker.onmessage = ({ data }) => {
370245
- switch (data.method) {
370246
- case "handleLoading":
370247
- handleLoading();
370248
- break;
370249
- case "handleLoaded":
370250
- handleLoaded(data.stdinBuffer, data.interruptBuffer);
370251
- break;
370252
- case "handleInput":
370253
- handleInput(worker);
370254
- break;
370255
- case "handleOutput":
370256
- handleOutput(data.stream, data.content);
370257
- break;
370258
- case "handleError":
370259
- handleError(data.file, data.line, data.mistake, data.type, data.info);
370260
- break;
370261
- case "handleFileWrite":
370262
- handleFileWrite(data.filename, data.content, data.mode);
370263
- break;
370264
- case "handleVisual":
370265
- handleVisual(data.origin, data.content);
370266
- break;
370267
- default:
370268
- throw new Error(`Unsupported method: ${data.method}`);
370269
- }
370270
- };
370271
- worker.onerror = (error) => {
370272
- console.error("Error in PyodideWorker:", error);
370273
- };
370274
- return worker;
370456
+ // -------------------------------------------------------------------------
370457
+ // Local helpers
370458
+ // -------------------------------------------------------------------------
370459
+ const disableInput = (0, react_1.useCallback)(() => {
370460
+ (0, consoleInput_1.disableInputElement)();
370461
+ activeInputRequest.current = null;
370275
370462
  }, []);
370276
- const destroyAndRecreateWorker = (0, react_1.useCallback)(() => {
370277
- if (pyodideWorker) {
370278
- console.log("Destroying and recreating Pyodide worker");
370279
- pyodideWorker.terminate();
370280
- }
370281
- workerReady.current = false;
370282
- interruptBuffer.current = null;
370283
- stdinBuffer.current = null;
370284
- stdinClosed.current = false;
370285
- disableInput();
370286
- const newWorker = createWorker();
370287
- setPyodideWorker(newWorker);
370288
- }, [pyodideWorker, url]);
370289
- (0, react_1.useEffect)(() => {
370290
- if (pyodideWorker)
370291
- return;
370292
- if (!active)
370293
- return;
370294
- const worker = createWorker();
370295
- setPyodideWorker(worker);
370296
- }, [active, pyodideWorker]);
370297
- (0, react_1.useEffect)(() => {
370298
- destroyAndRecreateWorker();
370299
- }, [project.identifier]);
370300
- (0, react_1.useEffect)(() => {
370301
- if (!pyodideWorker)
370302
- return;
370303
- pyodideWorker.postMessage({
370304
- method: "init",
370305
- assets: pyodideAssets,
370306
- packageApiUrl,
370307
- });
370308
- return () => {
370309
- pyodideWorker.terminate();
370310
- };
370311
- }, [pyodideWorker]);
370312
- (0, react_1.useEffect)(() => {
370313
- if (codeRunTriggered && active && output.current) {
370314
- handleRun();
370315
- }
370316
- }, [codeRunTriggered, output.current]);
370317
- (0, react_1.useEffect)(() => {
370318
- if (codeRunStopped && active) {
370319
- handleStop();
370320
- }
370321
- }, [codeRunStopped]);
370322
- const handleLoading = () => {
370323
- return;
370324
- };
370325
- const handleLoaded = (stdin, interrupt) => {
370463
+ // -------------------------------------------------------------------------
370464
+ // Worker-message handlers (forwarded to usePyodideWorker via handleMessage)
370465
+ // -------------------------------------------------------------------------
370466
+ const handleLoading = (0, react_1.useCallback)(() => {
370467
+ // No-op; kept for symmetry with the worker protocol.
370468
+ }, []);
370469
+ const handleLoaded = (0, react_1.useCallback)((stdin, interrupt, strategy = "sab") => {
370326
370470
  stdinBuffer.current = stdin;
370327
370471
  interruptBuffer.current = interrupt;
370328
370472
  workerReady.current = true;
370473
+ runId.current = null;
370474
+ activeInputRequest.current = null;
370475
+ stdinStrategy.current = strategy;
370329
370476
  if (loadedRunner !== EditorTypes_1.RunnerType.PYODIDE) {
370330
370477
  dispatch((0, EditorSlice_1.setLoadedRunner)(EditorTypes_1.RunnerType.PYODIDE));
370331
370478
  }
370332
370479
  dispatch((0, EditorSlice_1.codeRunHandled)());
370333
370480
  disableInput();
370334
- };
370335
- const handleInput = async (workerOverride) => {
370336
- const targetWorker = workerOverride ?? pyodideWorker;
370481
+ if (strategy === "unavailable") {
370482
+ dispatch((0, EditorSlice_1.setError)({
370483
+ type: Errors_1.ErrorType.RUNTIME_ERROR,
370484
+ message: "Python input() is unavailable in this browser context. Activate the stdin Service Worker and reload the page.",
370485
+ }));
370486
+ }
370487
+ }, [dispatch, disableInput, loadedRunner]);
370488
+ const handleInput = (0, react_1.useCallback)(async (workerOverride, swRunId, swRequestId) => {
370489
+ const targetWorker = workerOverride ?? null;
370490
+ const isServiceWorkerRequest = Boolean(swRunId && swRequestId);
370491
+ const postStdinFallbackResponse = (value) => (0, serviceWorker_1.postMessageToStdinServiceWorker)((0, stdinFallbackMessages_1.buildStdinFallbackResponse)({
370492
+ clientId: tabIdRef.current,
370493
+ // swRunId / swRequestId are non-empty when isServiceWorkerRequest.
370494
+ runId: swRunId,
370495
+ requestId: swRequestId,
370496
+ value,
370497
+ }));
370498
+ const postStdinFallbackEof = () => (0, serviceWorker_1.postMessageToStdinServiceWorker)((0, stdinFallbackMessages_1.buildStdinFallbackEof)({
370499
+ clientId: tabIdRef.current,
370500
+ runId: swRunId,
370501
+ requestId: swRequestId,
370502
+ }));
370503
+ // If the user already pressed Ctrl+D earlier in this run, immediately
370504
+ // return EOF without prompting again. Under sync-XHR this must be an
370505
+ // explicit EOF (HTTP 204) — sending a CANCEL would surface in user code
370506
+ // as KeyboardInterrupt instead of EOFError.
370337
370507
  if (stdinClosed.current) {
370338
370508
  if (stdinBuffer.current) {
370339
370509
  stdinBuffer.current[0] = -1;
370340
370510
  }
370511
+ else if (isServiceWorkerRequest) {
370512
+ postStdinFallbackEof();
370513
+ }
370341
370514
  else {
370342
370515
  targetWorker?.postMessage({
370343
370516
  method: "stdinResponse",
@@ -370347,17 +370520,31 @@ const PyodideRunner = ({ active, packageApiUrl, }) => {
370347
370520
  return;
370348
370521
  }
370349
370522
  const outputPane = output.current;
370350
- outputPane?.appendChild(inputSpan());
370351
- const element = getInputElement();
370352
- const { content, ctrlD } = await getInputContent(element);
370523
+ outputPane?.appendChild((0, consoleInput_1.inputSpan)());
370524
+ const element = (0, consoleInput_1.getInputElement)();
370525
+ if (!element) {
370526
+ return;
370527
+ }
370528
+ const { content, ctrlD } = await (0, consoleInput_1.getInputContent)(element);
370353
370529
  if (stdinBuffer.current) {
370354
370530
  const encoder = new TextEncoder();
370355
- const bytes = encoder.encode(content + "\n");
370531
+ const bytes = encoder.encode((content ?? "") + "\n");
370356
370532
  const previousLength = stdinBuffer.current[0] ?? 0;
370357
370533
  stdinBuffer.current.set(bytes, previousLength);
370358
370534
  const currentLength = previousLength + bytes.length;
370359
370535
  stdinBuffer.current[0] = currentLength;
370360
370536
  }
370537
+ else if (isServiceWorkerRequest) {
370538
+ if (ctrlD) {
370539
+ // First-time Ctrl+D: signal EOF (HTTP 204), not cancel (HTTP 499).
370540
+ // Cancel would terminate the whole run with KeyboardInterrupt;
370541
+ // EOF lets user code catch EOFError and keep going.
370542
+ postStdinFallbackEof();
370543
+ }
370544
+ else {
370545
+ postStdinFallbackResponse(content !== undefined ? content : "");
370546
+ }
370547
+ }
370361
370548
  else {
370362
370549
  targetWorker?.postMessage({
370363
370550
  method: "stdinResponse",
@@ -370365,21 +370552,18 @@ const PyodideRunner = ({ active, packageApiUrl, }) => {
370365
370552
  ctrlD,
370366
370553
  });
370367
370554
  }
370368
- if (ctrlD) {
370369
- stdinClosed.current = true; // Don't accept any more stdin this run.
370555
+ if (isServiceWorkerRequest) {
370556
+ activeInputRequest.current = null;
370370
370557
  }
370371
- };
370372
- const handleOutput = (stream, content) => {
370373
- const node = output.current;
370374
- const div = document.createElement("span");
370375
- div.className = (0, classnames_1.default)(styles_module_scss_1.default.pythonConsoleLine, stream === "stderr" && styles_module_scss_1.default["stderr"], stream === "stdout" && styles_module_scss_1.default["stdout"]);
370376
- div.innerHTML = new Option(content || " ").innerHTML + "\n";
370377
- if (node) {
370378
- node.appendChild(div);
370379
- node.scrollTop = node.scrollHeight;
370558
+ if (ctrlD) {
370559
+ // Don't accept any more stdin this run.
370560
+ stdinClosed.current = true;
370380
370561
  }
370381
- };
370382
- const handleError = (file, line, mistake, type, info) => {
370562
+ }, []);
370563
+ const handleOutput = (0, react_1.useCallback)((stream, content) => {
370564
+ (0, consoleOutput_1.appendConsoleLine)(output.current, stream, content);
370565
+ }, []);
370566
+ const handleError = (0, react_1.useCallback)((file, line, mistake, type, info) => {
370383
370567
  let errorMessage;
370384
370568
  if (type === "KeyboardInterrupt") {
370385
370569
  errorMessage = "Execution interrupted";
@@ -370397,62 +370581,139 @@ const PyodideRunner = ({ active, packageApiUrl, }) => {
370397
370581
  message: errorMessage,
370398
370582
  }));
370399
370583
  disableInput();
370400
- };
370401
- const handleFileWrite = (filePath, content, mode) => {
370402
- const componentToUpdate = projectCode.find((item) => item.path === filePath);
370403
- let updatedContent;
370404
- if (mode === "w" || mode === "x") {
370405
- updatedContent = content;
370584
+ }, [dispatch, disableInput]);
370585
+ const handleFileWrite = (0, react_1.useCallback)((filePath, content, mode) => {
370586
+ (0, fileWrite_1.applyPyodideFileWrite)({
370587
+ dispatch,
370588
+ projectComponents,
370589
+ projectCode,
370590
+ filePath,
370591
+ content,
370592
+ mode,
370593
+ });
370594
+ }, [dispatch, projectComponents, projectCode]);
370595
+ const handleVisual = (0, react_1.useCallback)((origin, content) => {
370596
+ setVisuals((array) => [...array, { origin, content }]);
370597
+ }, []);
370598
+ // -------------------------------------------------------------------------
370599
+ // Worker lifecycle
370600
+ // -------------------------------------------------------------------------
370601
+ const handleBeforeRecreate = (0, react_1.useCallback)(() => {
370602
+ workerReady.current = false;
370603
+ interruptBuffer.current = null;
370604
+ stdinBuffer.current = null;
370605
+ stdinClosed.current = false;
370606
+ disableInput();
370607
+ }, [disableInput]);
370608
+ const handleMessage = (0, react_1.useCallback)((data, w) => {
370609
+ switch (data.method) {
370610
+ case "handleLoading":
370611
+ handleLoading();
370612
+ break;
370613
+ case "handleLoaded":
370614
+ handleLoaded(data.stdinBuffer, data.interruptBuffer, data.stdinStrategy);
370615
+ break;
370616
+ case "handleInput":
370617
+ handleInput(w);
370618
+ break;
370619
+ case "handleOutput":
370620
+ handleOutput(data.stream, data.content);
370621
+ break;
370622
+ case "handleError":
370623
+ handleError(data.file, data.line, data.mistake, data.type, data.info);
370624
+ break;
370625
+ case "handleFileWrite":
370626
+ handleFileWrite(data.filename, data.content, data.mode);
370627
+ break;
370628
+ case "handleVisual":
370629
+ handleVisual(data.origin, data.content);
370630
+ break;
370631
+ default:
370632
+ throw new Error(`Unsupported method: ${data.method}`);
370406
370633
  }
370407
- else if (mode === "a") {
370408
- updatedContent =
370409
- (componentToUpdate ? componentToUpdate.content : "") + content;
370634
+ }, [
370635
+ handleLoading,
370636
+ handleLoaded,
370637
+ handleInput,
370638
+ handleOutput,
370639
+ handleError,
370640
+ handleFileWrite,
370641
+ handleVisual,
370642
+ ]);
370643
+ const { worker: pyodideWorker, recreateWorker } = (0, usePyodideWorker_1.usePyodideWorker)({
370644
+ active,
370645
+ projectIdentifier: project.identifier,
370646
+ onMessage: handleMessage,
370647
+ onBeforeRecreate: handleBeforeRecreate,
370648
+ });
370649
+ // -------------------------------------------------------------------------
370650
+ // Stdin Service Worker
370651
+ // -------------------------------------------------------------------------
370652
+ const handleStdinRequest = (0, react_1.useCallback)((request) => {
370653
+ if (request.runId !== runId.current) {
370654
+ return;
370655
+ }
370656
+ activeInputRequest.current = {
370657
+ runId: request.runId,
370658
+ requestId: request.requestId,
370659
+ };
370660
+ handleInput(undefined, request.runId, request.requestId);
370661
+ }, [handleInput]);
370662
+ const handleControllerChange = (0, react_1.useCallback)(() => {
370663
+ // If we already had a working stdin strategy (sab / sync-xhr), there's
370664
+ // no need to reset the runtime — the SW just rotated. We only force a
370665
+ // recreate when we previously couldn't get any stdin path at all.
370666
+ if (stdinStrategy.current !== "unavailable") {
370667
+ return;
370668
+ }
370669
+ recreateWorker();
370670
+ }, [recreateWorker]);
370671
+ const { ensureInputServiceWorker, registerStdinClient } = (0, useStdinServiceWorker_1.useStdinServiceWorker)({
370672
+ active,
370673
+ tabIdRef,
370674
+ onStdinRequest: handleStdinRequest,
370675
+ onControllerChange: handleControllerChange,
370676
+ });
370677
+ // -------------------------------------------------------------------------
370678
+ // Run / stop orchestration
370679
+ // -------------------------------------------------------------------------
370680
+ const writeFile = (0, react_1.useCallback)((filename, content) => {
370681
+ pyodideWorker?.postMessage({ method: "writeFile", filename, content });
370682
+ }, [pyodideWorker]);
370683
+ const handleRun = (0, react_1.useCallback)(async () => {
370684
+ if (!workerReady.current || !pyodideWorker) {
370685
+ return;
370410
370686
  }
370411
- if (componentToUpdate) {
370412
- dispatch((0, EditorSlice_1.updateProjectComponent)({
370413
- ...componentToUpdate,
370414
- content: updatedContent,
370687
+ if (stdinStrategy.current === "unavailable") {
370688
+ dispatch((0, EditorSlice_1.setError)({
370689
+ type: Errors_1.ErrorType.RUNTIME_ERROR,
370690
+ message: "Python input() fallback is unavailable because the Service Worker is not controlling this page. Reload after Service Worker activation.",
370415
370691
  }));
370692
+ dispatch((0, EditorSlice_1.codeRunHandled)());
370693
+ return;
370416
370694
  }
370417
- else {
370418
- const { dirPath, name, extension } = (0, projectHelpers_1.parseComponentPath)(filePath);
370419
- const newFile = {
370420
- id: crypto.randomUUID(),
370421
- name,
370422
- extension,
370423
- content: updatedContent,
370424
- type: ProjectTypes_1.ProjectComponentType.FILE,
370425
- path: filePath,
370426
- };
370427
- dispatch((0, EditorSlice_1.addProjectComponent)(newFile));
370428
- const dirParent = projectComponents.find((component) => component.type === ProjectTypes_1.ProjectComponentType.DIR &&
370429
- component.path === dirPath);
370430
- if (dirParent) {
370431
- dispatch((0, EditorSlice_1.updateProjectComponent)({
370432
- ...dirParent,
370433
- children: [...(dirParent.children ?? []), newFile.id],
370695
+ if (stdinStrategy.current === "sync-xhr") {
370696
+ const swStatus = await ensureInputServiceWorker();
370697
+ if (!swStatus.controlled) {
370698
+ dispatch((0, EditorSlice_1.setError)({
370699
+ type: Errors_1.ErrorType.RUNTIME_ERROR,
370700
+ message: "Python input() fallback requires an active Service Worker controller. Reload the page and try again.",
370434
370701
  }));
370702
+ dispatch((0, EditorSlice_1.codeRunHandled)());
370703
+ return;
370435
370704
  }
370436
- }
370437
- };
370438
- const handleVisual = (origin, content) => {
370439
- setVisuals((array) => [...array, { origin, content }]);
370440
- };
370441
- const handleRun = async () => {
370442
- if (!workerReady.current || !pyodideWorker) {
370443
- return;
370705
+ registerStdinClient();
370444
370706
  }
370445
370707
  if (output.current) {
370446
370708
  output.current.innerHTML = "";
370447
370709
  }
370448
- // entry file is the component with name main and extension py
370449
- const entryFile = projectCode.find((component) => component.path === PYTHON_ENTRY_FILE_PATH);
370710
+ const entryFile = projectCode.find((component) => component.path === constants_1.PYTHON_ENTRY_FILE_PATH);
370450
370711
  if (!entryFile) {
370451
370712
  dispatch((0, EditorSlice_1.setError)({
370452
370713
  type: Errors_1.ErrorType.ENTRY_FILE_NOT_FOUND,
370453
- message: `can't open file '${PYTHON_ENTRY_FILE_PATH}': No such file or directory`,
370714
+ message: `can't open file '${constants_1.PYTHON_ENTRY_FILE_PATH}': No such file or directory`,
370454
370715
  details: {
370455
- fileName: PYTHON_ENTRY_FILE_PATH.split("/").pop(),
370716
+ fileName: constants_1.PYTHON_ENTRY_FILE_PATH.split("/").pop(),
370456
370717
  },
370457
370718
  }));
370458
370719
  dispatch((0, EditorSlice_1.codeRunHandled)());
@@ -370461,6 +370722,8 @@ const PyodideRunner = ({ active, packageApiUrl, }) => {
370461
370722
  dispatch((0, EditorSlice_1.setError)(null));
370462
370723
  setVisuals([]);
370463
370724
  stdinClosed.current = false;
370725
+ // Mirror the project directory tree into the Pyodide filesystem so that
370726
+ // relative imports between user files resolve correctly.
370464
370727
  const dirSet = new Set();
370465
370728
  for (const { path } of projectCode) {
370466
370729
  if (path) {
@@ -370470,115 +370733,357 @@ const PyodideRunner = ({ active, packageApiUrl, }) => {
370470
370733
  }
370471
370734
  }
370472
370735
  }
370473
- // Create directories in Pyodide FS
370474
370736
  const dirs = Array.from(dirSet);
370475
- if (pyodideWorker) {
370476
- pyodideWorker.postMessage({
370477
- method: "createDirectories",
370478
- dirs,
370479
- });
370480
- }
370481
- // Write files to Pyodide FS
370737
+ pyodideWorker.postMessage({ method: "createDirectories", dirs });
370482
370738
  for (const { path, content } of projectCode) {
370483
370739
  if (path) {
370484
370740
  writeFile(path, content);
370485
370741
  }
370486
370742
  }
370487
370743
  if (interruptBuffer.current) {
370488
- interruptBuffer.current[0] = 0; // Clear previous signals.
370744
+ interruptBuffer.current[0] = 0; // Clear previous SIGINT.
370489
370745
  }
370490
- pyodideWorker?.postMessage({
370746
+ runId.current = crypto.randomUUID();
370747
+ activeInputRequest.current = null;
370748
+ pyodideWorker.postMessage({
370491
370749
  method: "runPython",
370492
370750
  python: entryFile.content,
370493
370751
  userModuleNames,
370752
+ runId: runId.current,
370494
370753
  });
370495
- };
370496
- const handleStop = () => {
370754
+ }, [
370755
+ pyodideWorker,
370756
+ dispatch,
370757
+ projectCode,
370758
+ userModuleNames,
370759
+ writeFile,
370760
+ ensureInputServiceWorker,
370761
+ registerStdinClient,
370762
+ ]);
370763
+ const handleStop = (0, react_1.useCallback)(() => {
370764
+ if (runId.current && stdinStrategy.current === "sync-xhr") {
370765
+ // Stop is a true cancellation (user-driven interrupt), so use CANCEL
370766
+ // and let the worker surface KeyboardInterrupt to user code.
370767
+ (0, serviceWorker_1.postMessageToStdinServiceWorker)((0, stdinFallbackMessages_1.buildStdinFallbackCancel)({
370768
+ clientId: tabIdRef.current,
370769
+ runId: runId.current,
370770
+ }));
370771
+ }
370497
370772
  pyodideWorker?.postMessage({ method: "stopPython" });
370498
370773
  if (interruptBuffer.current) {
370499
- interruptBuffer.current[0] = 2; // Send a SIGINT signal.
370774
+ interruptBuffer.current[0] = 2; // SIGINT to the running Python.
370500
370775
  disableInput();
370501
370776
  return;
370502
370777
  }
370778
+ // No SIGINT channel available. If Python is currently blocked on input()
370779
+ // under the sync-XHR strategy, the CANCEL we just posted to the SW is
370780
+ // enough on its own: the worker's pending XHR will return 499, throw
370781
+ // PYODIDE_STDIN_CANCELLED, and runPython will post handleError
370782
+ // (KeyboardInterrupt) followed by handleLoaded — the orchestrator will
370783
+ // reset its refs naturally and no recreate is needed.
370784
+ //
370785
+ // Avoiding the recreate is important on Safari: WebKit does not reliably
370786
+ // attach the page's Service Worker controller to a freshly-created
370787
+ // dedicated Web Worker, so the next run's stdin XHR escapes to the
370788
+ // network (HTTP 404 → OSError [Errno 29] in Python). By keeping the same
370789
+ // worker alive we keep the SW route working across Stop → Run cycles.
370790
+ if (stdinStrategy.current === "sync-xhr" &&
370791
+ activeInputRequest.current !== null) {
370792
+ disableInput();
370793
+ return;
370794
+ }
370795
+ // Otherwise (CPU-bound user code without SIGINT) we have no choice but
370796
+ // to terminate and recreate the worker.
370503
370797
  disableInput();
370504
- destroyAndRecreateWorker();
370798
+ recreateWorker();
370505
370799
  dispatch((0, EditorSlice_1.setError)({
370506
370800
  type: Errors_1.ErrorType.RUNTIME_ERROR,
370507
370801
  message: "Execution interrupted",
370508
370802
  }));
370803
+ }, [pyodideWorker, dispatch, disableInput, recreateWorker]);
370804
+ // -------------------------------------------------------------------------
370805
+ // Effects
370806
+ // -------------------------------------------------------------------------
370807
+ // Send the `init` message every time a fresh worker becomes available, so
370808
+ // it knows where to find pyodide assets and how to talk to the stdin SW.
370809
+ (0, react_1.useEffect)(() => {
370810
+ if (!pyodideWorker)
370811
+ return;
370812
+ let cancelled = false;
370813
+ const initWorker = async () => {
370814
+ const swStatus = await ensureInputServiceWorker();
370815
+ if (cancelled) {
370816
+ return;
370817
+ }
370818
+ pyodideWorker.postMessage({
370819
+ method: "init",
370820
+ assets: assetUrls_1.pyodideAssets,
370821
+ packageApiUrl,
370822
+ stdinFallback: {
370823
+ enabled: swStatus.supported && swStatus.controlled,
370824
+ endpointPath: constants_1.PYODIDE_STDIN_ENDPOINT,
370825
+ clientId: tabIdRef.current,
370826
+ },
370827
+ });
370828
+ };
370829
+ initWorker();
370830
+ return () => {
370831
+ cancelled = true;
370832
+ };
370833
+ }, [pyodideWorker, ensureInputServiceWorker, packageApiUrl]);
370834
+ // Kick off a run when the Redux flag flips on.
370835
+ (0, react_1.useEffect)(() => {
370836
+ if (codeRunTriggered && active && output.current) {
370837
+ handleRun();
370838
+ }
370839
+ }, [codeRunTriggered, output.current]);
370840
+ // Stop a run when the Redux flag flips on.
370841
+ (0, react_1.useEffect)(() => {
370842
+ if (codeRunStopped && active) {
370843
+ handleStop();
370844
+ }
370845
+ }, [codeRunStopped]);
370846
+ return {
370847
+ output,
370848
+ visuals,
370849
+ setVisuals,
370850
+ workerInitialized: Boolean(pyodideWorker),
370509
370851
  };
370510
- const writeFile = (filename, content) => {
370511
- pyodideWorker?.postMessage({ method: "writeFile", filename, content });
370512
- };
370513
- const inputSpan = () => {
370514
- const span = document.createElement("span");
370515
- span.setAttribute("id", "input");
370516
- span.setAttribute("spellCheck", "false");
370517
- span.setAttribute("class", styles_module_scss_1.default.pythonrunnerInput);
370518
- span.setAttribute("contentEditable", "true");
370519
- return span;
370520
- };
370521
- const getInputElement = () => document.getElementById("input");
370522
- const getInputContent = async (element) => {
370523
- element.focus();
370524
- return new Promise((resolve, reject) => {
370525
- element.addEventListener("keydown", function removeInput(e) {
370526
- const ctrlD = (e.ctrlKey && e.key.toLowerCase() === "d");
370527
- const lineEnded = e.key === "Enter" || ctrlD;
370528
- if (lineEnded) {
370529
- element.removeEventListener(e.type, removeInput);
370530
- const content = element.innerText;
370531
- element.removeAttribute("id");
370532
- element.removeAttribute("contentEditable");
370533
- element.innerText = content + "\n";
370534
- document.addEventListener("keyup", function storeInput(e) {
370535
- if (lineEnded) {
370536
- document.removeEventListener(e.type, storeInput);
370537
- resolve({ content, ctrlD });
370538
- }
370852
+ };
370853
+ exports.usePyodideRunner = usePyodideRunner;
370854
+
370855
+
370856
+ /***/ }),
370857
+
370858
+ /***/ 93895:
370859
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
370860
+
370861
+
370862
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
370863
+ exports.usePyodideWorker = void 0;
370864
+ const react_1 = __webpack_require__(51649);
370865
+ const assetUrls_1 = __webpack_require__(85799);
370866
+ /**
370867
+ * Owns the lifecycle of the Pyodide Web Worker.
370868
+ *
370869
+ * Responsibilities:
370870
+ * - Create the worker once the runner becomes active.
370871
+ * - Re-create the worker whenever the project identifier changes (each
370872
+ * project starts from a clean Python environment).
370873
+ * - Expose an imperative `recreateWorker` for callers that need to force a
370874
+ * reset (e.g. after the stdin SW activates and we need to retry init).
370875
+ * - Terminate the worker on unmount.
370876
+ *
370877
+ * Posting messages and decoding incoming messages is the orchestrator's job —
370878
+ * this hook just hands the worker over and forwards messages.
370879
+ */
370880
+ const usePyodideWorker = ({ active, projectIdentifier, onMessage, onBeforeRecreate, }) => {
370881
+ const [worker, setWorker] = (0, react_1.useState)(null);
370882
+ // The onMessage callback closes over orchestrator state, so we route through
370883
+ // a ref to avoid rebuilding the worker every render.
370884
+ const onMessageRef = (0, react_1.useRef)(onMessage);
370885
+ onMessageRef.current = onMessage;
370886
+ const onBeforeRecreateRef = (0, react_1.useRef)(onBeforeRecreate);
370887
+ onBeforeRecreateRef.current = onBeforeRecreate;
370888
+ const createWorker = (0, react_1.useCallback)(() => {
370889
+ const w = new Worker(assetUrls_1.PYODIDE_WORKER_URL);
370890
+ w.onmessage = ({ data }) => {
370891
+ onMessageRef.current(data, w);
370892
+ };
370893
+ w.onerror = (error) => {
370894
+ console.error("Error in PyodideWorker:", error);
370895
+ };
370896
+ return w;
370897
+ }, []);
370898
+ const recreateWorker = (0, react_1.useCallback)(() => {
370899
+ onBeforeRecreateRef.current?.();
370900
+ setWorker((current) => {
370901
+ if (current) {
370902
+ console.log("Destroying and recreating Pyodide worker");
370903
+ current.terminate();
370904
+ }
370905
+ return createWorker();
370906
+ });
370907
+ }, [createWorker]);
370908
+ // First-mount creation: only when active and no worker exists yet.
370909
+ (0, react_1.useEffect)(() => {
370910
+ if (worker)
370911
+ return;
370912
+ if (!active)
370913
+ return;
370914
+ setWorker(createWorker());
370915
+ }, [active, worker, createWorker]);
370916
+ // Project changes always reset the worker
370917
+ (0, react_1.useEffect)(() => {
370918
+ recreateWorker();
370919
+ // eslint-disable-next-line react-hooks/exhaustive-deps
370920
+ }, [projectIdentifier]);
370921
+ // Terminate on unmount or when the worker reference is replaced.
370922
+ (0, react_1.useEffect)(() => {
370923
+ return () => {
370924
+ worker?.terminate();
370925
+ };
370926
+ }, [worker]);
370927
+ return { worker, recreateWorker };
370928
+ };
370929
+ exports.usePyodideWorker = usePyodideWorker;
370930
+
370931
+
370932
+ /***/ }),
370933
+
370934
+ /***/ 86357:
370935
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
370936
+
370937
+
370938
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
370939
+ exports.useStdinServiceWorker = void 0;
370940
+ const react_1 = __webpack_require__(51649);
370941
+ const assetUrls_1 = __webpack_require__(85799);
370942
+ const serviceWorker_1 = __webpack_require__(58158);
370943
+ /**
370944
+ * Manages the lifecycle of the stdin Service Worker:
370945
+ *
370946
+ * - registers the SW (with a non-root-scope fallback for restricted hosts)
370947
+ * - waits for the page to actually be controlled before declaring success
370948
+ * - probes the SW fetch route to confirm interception is wired up
370949
+ * - retries the registration once if either check fails
370950
+ * - listens for SW messages and forwards stdin requests to the orchestrator
370951
+ * - listens for `controllerchange` so the orchestrator can re-register and
370952
+ * decide whether to recreate the Pyodide worker
370953
+ *
370954
+ * Returns helpers (`ensureInputServiceWorker`, `registerStdinClient`) the
370955
+ * orchestrator calls from `run` and from `init`.
370956
+ */
370957
+ const useStdinServiceWorker = ({ active, tabIdRef, onStdinRequest, onControllerChange, }) => {
370958
+ // Keep latest callbacks in refs so the event listener effects don't need to
370959
+ // re-subscribe whenever the parent re-renders with a new closure.
370960
+ const onStdinRequestRef = (0, react_1.useRef)(onStdinRequest);
370961
+ onStdinRequestRef.current = onStdinRequest;
370962
+ const onControllerChangeRef = (0, react_1.useRef)(onControllerChange);
370963
+ onControllerChangeRef.current = onControllerChange;
370964
+ const registerStdinClient = (0, react_1.useCallback)(() => {
370965
+ (0, serviceWorker_1.postMessageToStdinServiceWorker)({
370966
+ type: "PYODIDE_STDIN_REGISTER",
370967
+ clientId: tabIdRef.current,
370968
+ });
370969
+ }, [tabIdRef]);
370970
+ const ensureInputServiceWorker = (0, react_1.useCallback)(async () => {
370971
+ if (typeof window === "undefined") {
370972
+ return { supported: false, controlled: false };
370973
+ }
370974
+ if (!("serviceWorker" in navigator)) {
370975
+ return { supported: false, controlled: false };
370976
+ }
370977
+ try {
370978
+ const registerStdinWorker = async () => {
370979
+ try {
370980
+ return await navigator.serviceWorker.register(assetUrls_1.PYODIDE_STDIN_SW_URL, {
370981
+ scope: "/",
370539
370982
  });
370540
370983
  }
370541
- });
370542
- });
370543
- };
370544
- const shiftFocusToInput = (event) => {
370545
- const documentSelection = window.getSelection();
370546
- if (documentSelection && documentSelection.toString().length > 0) {
370984
+ catch (rootScopeError) {
370985
+ // Fallback for hosts that do not allow broad SW scope from the asset path.
370986
+ const fallbackRegistration = await navigator.serviceWorker.register(assetUrls_1.PYODIDE_STDIN_SW_URL);
370987
+ console.warn("Registered stdin Service Worker without root scope", rootScopeError);
370988
+ return fallbackRegistration;
370989
+ }
370990
+ };
370991
+ const evaluateRegistration = async (registration) => {
370992
+ await Promise.race([
370993
+ navigator.serviceWorker.ready,
370994
+ new Promise((resolve) => setTimeout(resolve, 2000)),
370995
+ ]);
370996
+ const controlled = Boolean(navigator.serviceWorker.controller) ||
370997
+ (await (0, serviceWorker_1.waitForServiceWorkerControl)());
370998
+ if (controlled || registration?.active) {
370999
+ const messageTarget = navigator.serviceWorker.controller ||
371000
+ registration?.active ||
371001
+ registration?.waiting ||
371002
+ registration?.installing;
371003
+ messageTarget?.postMessage({
371004
+ type: "PYODIDE_STDIN_REGISTER",
371005
+ clientId: tabIdRef.current,
371006
+ });
371007
+ }
371008
+ const routeReady = await (0, serviceWorker_1.verifyStdinServiceWorkerRoute)();
371009
+ return controlled && routeReady;
371010
+ };
371011
+ let registration = await registerStdinWorker();
371012
+ let healthy = await evaluateRegistration(registration);
371013
+ if (!healthy) {
371014
+ try {
371015
+ await registration?.unregister();
371016
+ }
371017
+ catch (error) {
371018
+ console.debug("stdin SW unregister retry skipped", error);
371019
+ }
371020
+ registration = await registerStdinWorker();
371021
+ healthy = await evaluateRegistration(registration);
371022
+ }
371023
+ return { supported: true, controlled: healthy };
371024
+ }
371025
+ catch (error) {
371026
+ console.warn("Failed to register stdin Service Worker", error);
371027
+ return { supported: true, controlled: false };
371028
+ }
371029
+ }, [tabIdRef]);
371030
+ // Listen for messages from the SW. The SW forwards a PYODIDE_STDIN_REQUEST
371031
+ // whenever the worker thread blocks on input() via the sync-XHR fallback.
371032
+ (0, react_1.useEffect)(() => {
371033
+ if (!("serviceWorker" in navigator)) {
370547
371034
  return;
370548
371035
  }
370549
- const inputBox = getInputElement();
370550
- if (inputBox && event.target !== inputBox) {
370551
- const input = getInputElement();
370552
- const selection = window.getSelection();
370553
- selection?.removeAllRanges();
370554
- if (input?.innerText && input.innerText.length > 0) {
370555
- const range = document.createRange();
370556
- range.setStart(input, 1);
370557
- range.collapse(true);
370558
- selection?.addRange(range);
371036
+ const handleMessage = (event) => {
371037
+ const data = event.data;
371038
+ if (!data || typeof data !== "object") {
371039
+ return;
370559
371040
  }
370560
- input?.focus();
371041
+ if (data.type !== "PYODIDE_STDIN_REQUEST") {
371042
+ return;
371043
+ }
371044
+ if (data.clientId !== tabIdRef.current) {
371045
+ return;
371046
+ }
371047
+ onStdinRequestRef.current({
371048
+ runId: data.runId,
371049
+ requestId: data.requestId,
371050
+ clientId: data.clientId,
371051
+ });
371052
+ };
371053
+ navigator.serviceWorker.addEventListener("message", handleMessage);
371054
+ return () => {
371055
+ navigator.serviceWorker.removeEventListener("message", handleMessage);
371056
+ };
371057
+ }, [tabIdRef]);
371058
+ // Re-register stdin client and notify the orchestrator whenever the page
371059
+ // gains a new SW controller (e.g. after first registration or a SW update).
371060
+ (0, react_1.useEffect)(() => {
371061
+ if (!active) {
371062
+ return;
370561
371063
  }
370562
- };
370563
- const disableInput = () => {
370564
- const element = getInputElement();
370565
- if (element) {
370566
- element.removeAttribute("id");
370567
- element.removeAttribute("contentEditable");
371064
+ if (!("serviceWorker" in navigator)) {
371065
+ return;
370568
371066
  }
370569
- };
370570
- if (!pyodideWorker && active) {
370571
- console.warn("PyodideWorker is not initialized");
370572
- return null;
370573
- }
370574
- return ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.pythonrunnerContainer, styles_module_scss_1.default.pyodiderunner, active && styles_module_scss_1.default.active), children: [(0, jsx_runtime_1.jsxs)(OutputTabPanel_1.OutputTabPanel, { title: "Terminal", icon: console_svg_1.default, readOnly: readOnly, children: [(0, jsx_runtime_1.jsx)(ErrorMessage_1.default, {}), (0, jsx_runtime_1.jsx)("pre", { className: styles_module_scss_1.default.console, onClick: shiftFocusToInput, ref: output })] }), (0, jsx_runtime_1.jsx)(ResizableWithHandle_1.default, { "data-testid": "proj-console-container", handleDirection: "top", defaultHeight: "50%", className: styles_module_scss_1.default.resizeContainer, handleClassName: styles_module_scss_1.default.resizeHandleContainer, children: (0, jsx_runtime_1.jsx)(OutputTabPanel_1.OutputTabPanel, { title: "Visual output", icon: preview_svg_1.default, readOnly: readOnly, children: (0, jsx_runtime_1.jsx)(VisualOutputPane_1.default, { visuals: visuals, setVisuals: setVisuals }) }) })] }));
371067
+ const handleControllerChange = () => {
371068
+ if (!navigator.serviceWorker.controller) {
371069
+ return;
371070
+ }
371071
+ registerStdinClient();
371072
+ onControllerChangeRef.current();
371073
+ };
371074
+ navigator.serviceWorker.addEventListener("controllerchange", handleControllerChange);
371075
+ return () => {
371076
+ navigator.serviceWorker.removeEventListener("controllerchange", handleControllerChange);
371077
+ };
371078
+ }, [active, registerStdinClient]);
371079
+ return { ensureInputServiceWorker, registerStdinClient };
370575
371080
  };
370576
- exports["default"] = PyodideRunner;
371081
+ exports.useStdinServiceWorker = useStdinServiceWorker;
370577
371082
 
370578
371083
 
370579
371084
  /***/ }),
370580
371085
 
370581
- /***/ 39626:
371086
+ /***/ 35660:
370582
371087
  /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
370583
371088
 
370584
371089
 
@@ -370586,89 +371091,395 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
370586
371091
  return (mod && mod.__esModule) ? mod : { "default": mod };
370587
371092
  };
370588
371093
  Object.defineProperty(exports, "__esModule", ({ value: true }));
370589
- const jsx_runtime_1 = __webpack_require__(74848);
370590
- const react_1 = __webpack_require__(51649);
370591
- const highcharts_1 = __importDefault(__webpack_require__(14783));
370592
- const plotly_js_1 = __importDefault(__webpack_require__(28850));
370593
- const styles_module_scss_1 = __importDefault(__webpack_require__(46259));
370594
- const VisualOutputPane = ({ visuals, setVisuals }) => {
370595
- const output = (0, react_1.useRef)(null);
370596
- const showVisual = (0, react_1.useCallback)((visual, output) => {
370597
- switch (visual.origin) {
370598
- case "pygal":
370599
- const chartContent = {
370600
- ...visual.content,
370601
- chart: {
370602
- ...visual.content.chart,
370603
- events: {
370604
- ...visual.content.chart.events,
370605
- load: function () {
370606
- this.renderTo.style.overflow = "visible";
370607
- },
370608
- },
370609
- },
370610
- tooltip: {
370611
- ...visual.content.tooltip,
370612
- formatter: visual.content.chart.type === "pie"
370613
- ? function () {
370614
- return this.key + ": " + this.y;
370615
- }
370616
- : null,
370617
- },
370618
- };
370619
- highcharts_1.default.chart(output.current, chartContent);
370620
- break;
370621
- case "turtle":
370622
- output.current.innerHTML = elementFromProps(visual.content).outerHTML;
370623
- break;
370624
- case "matplotlib":
370625
- // convert visual.content from Uint8Array to jpg
370626
- const img = document.createElement("img");
370627
- img.style = "max-width: 100%; max-height: 100%;";
370628
- img.src = `data:image/jpg;base64,${window.btoa(String.fromCharCode(...new Uint8Array(visual.content)))}`;
370629
- output.current.innerHTML = img.outerHTML;
370630
- break;
370631
- case "plotly":
370632
- const plotlyJson = visual.content;
370633
- // Parse the JSON
370634
- const figure = JSON.parse(plotlyJson);
370635
- // Render using Plotly.js
370636
- plotly_js_1.default.newPlot(output.current, figure.data, figure.layout);
370637
- break;
370638
- default:
370639
- throw new Error(`Unsupported origin: ${visual.origin}`);
370640
- }
370641
- visual.showing = true;
370642
- return visual;
370643
- }, []);
370644
- const showVisuals = (0, react_1.useCallback)((visuals, output) => visuals.map((v) => (v.showing ? v : showVisual(v, output))), [showVisual]);
370645
- (0, react_1.useEffect)(() => {
370646
- if (visuals.length === 0 && output.current) {
370647
- if (output.current) {
370648
- output.current.innerHTML = "";
371094
+ exports.shiftFocusToInput = exports.disableInputElement = exports.getInputContent = exports.getInputElement = exports.inputSpan = void 0;
371095
+ const styles_module_scss_1 = __importDefault(__webpack_require__(12914));
371096
+ /**
371097
+ * DOM helpers for the contentEditable span that captures the user's stdin.
371098
+ *
371099
+ * These helpers intentionally side-step React: the input element is appended
371100
+ * to a `pre` element managed via a ref, and lifecycle is driven by the
371101
+ * worker's stdin requests, not by React render cycles.
371102
+ */
371103
+ /** Build the contentEditable `<span>` that captures a single line of stdin. */
371104
+ const inputSpan = () => {
371105
+ const span = document.createElement("span");
371106
+ span.setAttribute("id", "input");
371107
+ span.setAttribute("spellCheck", "false");
371108
+ span.setAttribute("class", styles_module_scss_1.default.pythonrunnerInput || "");
371109
+ span.setAttribute("contentEditable", "true");
371110
+ return span;
371111
+ };
371112
+ exports.inputSpan = inputSpan;
371113
+ /** Lookup the currently-active input span (id="input"), if any. */
371114
+ const getInputElement = () => document.getElementById("input");
371115
+ exports.getInputElement = getInputElement;
371116
+ /**
371117
+ * Wait for the user to press Enter (submit) or Ctrl+D (EOF) inside the input
371118
+ * element. Resolves with the typed text and whether EOF was signalled.
371119
+ *
371120
+ * The element is taken out of editable mode after the line is submitted so it
371121
+ * appears as part of the transcript above.
371122
+ */
371123
+ const getInputContent = (element) => {
371124
+ element.focus();
371125
+ return new Promise((resolve) => {
371126
+ element.addEventListener("keydown", function removeInput(e) {
371127
+ const ctrlD = (e.ctrlKey && e.key.toLowerCase() === "d");
371128
+ const lineEnded = e.key === "Enter" || ctrlD;
371129
+ if (lineEnded) {
371130
+ element.removeEventListener(e.type, removeInput);
371131
+ const content = element.innerText;
371132
+ element.removeAttribute("id");
371133
+ element.removeAttribute("contentEditable");
371134
+ element.innerText = content + "\n";
371135
+ document.addEventListener("keyup", function storeInput(ev) {
371136
+ if (lineEnded) {
371137
+ document.removeEventListener(ev.type, storeInput);
371138
+ resolve({ content, ctrlD });
371139
+ }
371140
+ });
370649
371141
  }
371142
+ });
371143
+ });
371144
+ };
371145
+ exports.getInputContent = getInputContent;
371146
+ /**
371147
+ * Remove the editable attributes from the active input span so it's frozen as
371148
+ * transcript text. Safe to call even when no input is active.
371149
+ */
371150
+ const disableInputElement = () => {
371151
+ const element = (0, exports.getInputElement)();
371152
+ if (element) {
371153
+ element.removeAttribute("id");
371154
+ element.removeAttribute("contentEditable");
371155
+ }
371156
+ };
371157
+ exports.disableInputElement = disableInputElement;
371158
+ /**
371159
+ * Click handler for the console pane that re-focuses the active input span
371160
+ * when the user clicks anywhere in the console (without losing a selection).
371161
+ */
371162
+ const shiftFocusToInput = (event) => {
371163
+ const documentSelection = window.getSelection();
371164
+ if (documentSelection && documentSelection.toString().length > 0) {
371165
+ return;
371166
+ }
371167
+ const inputBox = (0, exports.getInputElement)();
371168
+ if (inputBox && event.target !== inputBox) {
371169
+ const input = (0, exports.getInputElement)();
371170
+ const selection = window.getSelection();
371171
+ selection?.removeAllRanges();
371172
+ if (input?.innerText && input.innerText.length > 0) {
371173
+ const range = document.createRange();
371174
+ range.setStart(input, 1);
371175
+ range.collapse(true);
371176
+ selection?.addRange(range);
370650
371177
  }
370651
- else if (visuals.some((v) => !v.showing)) {
370652
- setVisuals((visuals) => showVisuals(visuals, output));
370653
- }
370654
- }, [visuals, setVisuals, showVisuals]);
370655
- return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.visualOutput, children: (0, jsx_runtime_1.jsx)("div", { ref: output, className: styles_module_scss_1.default.pythonGraphic }) }));
371178
+ input?.focus();
371179
+ }
370656
371180
  };
370657
- const elementFromProps = (map) => {
370658
- const tag = map.get("tag");
370659
- if (!tag) {
370660
- return document.createTextNode(map.get("text"));
371181
+ exports.shiftFocusToInput = shiftFocusToInput;
371182
+
371183
+
371184
+ /***/ }),
371185
+
371186
+ /***/ 98131:
371187
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
371188
+
371189
+
371190
+ var __importDefault = (this && this.__importDefault) || function (mod) {
371191
+ return (mod && mod.__esModule) ? mod : { "default": mod };
371192
+ };
371193
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
371194
+ exports.appendConsoleLine = void 0;
371195
+ const classnames_1 = __importDefault(__webpack_require__(46942));
371196
+ const styles_module_scss_1 = __importDefault(__webpack_require__(12914));
371197
+ /**
371198
+ * Append a line of Python stdout/stderr to the console `pre` element.
371199
+ *
371200
+ * The element's innerHTML is set via `new Option(...).innerHTML` to escape
371201
+ * any HTML control characters in the worker's output.
371202
+ */
371203
+ const appendConsoleLine = (outputElement, stream, content) => {
371204
+ if (!outputElement) {
371205
+ return;
370661
371206
  }
370662
- const node = document.createElement(tag);
370663
- for (const [key, value] of map.get("props")) {
370664
- node.setAttribute(key, value);
371207
+ const span = document.createElement("span");
371208
+ span.className = (0, classnames_1.default)(styles_module_scss_1.default.pythonConsoleLine, stream === "stderr" && styles_module_scss_1.default["stderr"], stream === "stdout" && styles_module_scss_1.default["stdout"]);
371209
+ span.innerHTML = new Option(content || " ").innerHTML + "\n";
371210
+ outputElement.appendChild(span);
371211
+ outputElement.scrollTop = outputElement.scrollHeight;
371212
+ };
371213
+ exports.appendConsoleLine = appendConsoleLine;
371214
+
371215
+
371216
+ /***/ }),
371217
+
371218
+ /***/ 45230:
371219
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
371220
+
371221
+
371222
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
371223
+ exports.applyPyodideFileWrite = void 0;
371224
+ const EditorSlice_1 = __webpack_require__(68512);
371225
+ const ProjectTypes_1 = __webpack_require__(27130);
371226
+ const projectHelpers_1 = __webpack_require__(2610);
371227
+ /**
371228
+ * Apply a file-write event from the Pyodide worker to the project tree.
371229
+ *
371230
+ * Modes:
371231
+ * - "w" / "x" → overwrite (or create)
371232
+ * - "a" → append to existing content
371233
+ *
371234
+ * When the target file doesn't exist yet, a new ProjectFile is created and
371235
+ * attached to its parent directory's children list (if the parent exists).
371236
+ */
371237
+ const applyPyodideFileWrite = ({ dispatch, projectComponents, projectCode, filePath, content, mode, }) => {
371238
+ const componentToUpdate = projectCode.find((item) => item.path === filePath);
371239
+ let updatedContent;
371240
+ if (mode === "w" || mode === "x") {
371241
+ updatedContent = content;
370665
371242
  }
370666
- for (const childProps of map.get("children")) {
370667
- node.appendChild(elementFromProps(childProps));
371243
+ else if (mode === "a") {
371244
+ updatedContent =
371245
+ (componentToUpdate ? componentToUpdate.content : "") + content;
371246
+ }
371247
+ if (updatedContent === undefined) {
371248
+ return;
371249
+ }
371250
+ if (componentToUpdate) {
371251
+ dispatch((0, EditorSlice_1.updateProjectComponent)({
371252
+ ...componentToUpdate,
371253
+ content: updatedContent,
371254
+ }));
371255
+ return;
371256
+ }
371257
+ const { dirPath, name, extension } = (0, projectHelpers_1.parseComponentPath)(filePath);
371258
+ const newFile = {
371259
+ id: crypto.randomUUID(),
371260
+ name,
371261
+ extension,
371262
+ content: updatedContent,
371263
+ type: ProjectTypes_1.ProjectComponentType.FILE,
371264
+ path: filePath,
371265
+ };
371266
+ dispatch((0, EditorSlice_1.addProjectComponent)(newFile));
371267
+ const dirParent = projectComponents.find((component) => component.type === ProjectTypes_1.ProjectComponentType.DIR && component.path === dirPath);
371268
+ if (dirParent) {
371269
+ dispatch((0, EditorSlice_1.updateProjectComponent)({
371270
+ ...dirParent,
371271
+ children: [...(dirParent.children ?? []), newFile.id],
371272
+ }));
370668
371273
  }
370669
- return node;
370670
371274
  };
370671
- exports["default"] = VisualOutputPane;
371275
+ exports.applyPyodideFileWrite = applyPyodideFileWrite;
371276
+
371277
+
371278
+ /***/ }),
371279
+
371280
+ /***/ 58158:
371281
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
371282
+
371283
+
371284
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
371285
+ exports.postMessageToStdinServiceWorker = exports.verifyStdinServiceWorkerRoute = exports.waitForServiceWorkerControl = void 0;
371286
+ const constants_1 = __webpack_require__(90804);
371287
+ /**
371288
+ * Resolve once the current page is controlled by a Service Worker, or once
371289
+ * the timeout elapses. The page may briefly be uncontrolled after a fresh
371290
+ * registration even though the SW is active, so we listen for
371291
+ * `controllerchange` rather than polling.
371292
+ */
371293
+ const waitForServiceWorkerControl = (timeoutMs = constants_1.SERVICE_WORKER_CONTROL_WAIT_MS) => new Promise((resolve) => {
371294
+ if (!("serviceWorker" in navigator)) {
371295
+ resolve(false);
371296
+ return;
371297
+ }
371298
+ if (navigator.serviceWorker.controller) {
371299
+ resolve(true);
371300
+ return;
371301
+ }
371302
+ let settled = false;
371303
+ const onControllerChange = () => {
371304
+ if (settled)
371305
+ return;
371306
+ if (!navigator.serviceWorker.controller)
371307
+ return;
371308
+ settled = true;
371309
+ window.clearTimeout(timeout);
371310
+ navigator.serviceWorker.removeEventListener("controllerchange", onControllerChange);
371311
+ resolve(true);
371312
+ };
371313
+ const timeout = window.setTimeout(() => {
371314
+ if (settled)
371315
+ return;
371316
+ settled = true;
371317
+ navigator.serviceWorker.removeEventListener("controllerchange", onControllerChange);
371318
+ resolve(Boolean(navigator.serviceWorker.controller));
371319
+ }, timeoutMs);
371320
+ navigator.serviceWorker.addEventListener("controllerchange", onControllerChange);
371321
+ });
371322
+ exports.waitForServiceWorkerControl = waitForServiceWorkerControl;
371323
+ /**
371324
+ * Probe the stdin Service Worker fetch route to confirm it's actually
371325
+ * intercepting requests. The SW is configured to return HTTP 400 for probes
371326
+ * that omit runId/requestId/clientId, so anything else means the route isn't
371327
+ * wired up yet.
371328
+ */
371329
+ const verifyStdinServiceWorkerRoute = async () => {
371330
+ if (typeof window === "undefined") {
371331
+ return false;
371332
+ }
371333
+ if (!("serviceWorker" in navigator)) {
371334
+ return false;
371335
+ }
371336
+ if (!navigator.serviceWorker.controller) {
371337
+ return false;
371338
+ }
371339
+ const probeController = new AbortController();
371340
+ const timeoutId = window.setTimeout(() => probeController.abort(), constants_1.SERVICE_WORKER_PROBE_TIMEOUT_MS);
371341
+ try {
371342
+ const probeUrl = new URL(constants_1.PYODIDE_STDIN_ENDPOINT, window.location.origin);
371343
+ probeUrl.searchParams.set("probe", "1");
371344
+ const response = await fetch(probeUrl.toString(), {
371345
+ method: "GET",
371346
+ cache: "no-store",
371347
+ signal: probeController.signal,
371348
+ });
371349
+ // SW returns 400 for probe requests without runId/requestId/clientId.
371350
+ return response.status === 400;
371351
+ }
371352
+ catch (_) {
371353
+ return false;
371354
+ }
371355
+ finally {
371356
+ window.clearTimeout(timeoutId);
371357
+ }
371358
+ };
371359
+ exports.verifyStdinServiceWorkerRoute = verifyStdinServiceWorkerRoute;
371360
+ /**
371361
+ * Send a message to the stdin Service Worker. Prefers `navigator.serviceWorker.controller`,
371362
+ * but falls back to the registration's active worker when the controller is
371363
+ * temporarily unavailable (best effort — used to keep stdin mapping fresh).
371364
+ *
371365
+ * Returns true if the message was posted to the active controller.
371366
+ *
371367
+ * The `message` is intentionally typed as a structured-cloneable object — the
371368
+ * concrete shapes live in `./stdinFallbackMessages.ts` and are the source of
371369
+ * truth for the wire protocol.
371370
+ */
371371
+ const postMessageToStdinServiceWorker = (message) => {
371372
+ if (!("serviceWorker" in navigator)) {
371373
+ return false;
371374
+ }
371375
+ const controller = navigator.serviceWorker.controller;
371376
+ if (controller) {
371377
+ controller.postMessage(message);
371378
+ return true;
371379
+ }
371380
+ navigator.serviceWorker.ready
371381
+ .then((registration) => {
371382
+ registration.active?.postMessage(message);
371383
+ })
371384
+ .catch((error) => {
371385
+ console.debug("stdin SW post fallback skipped", error);
371386
+ });
371387
+ return false;
371388
+ };
371389
+ exports.postMessageToStdinServiceWorker = postMessageToStdinServiceWorker;
371390
+
371391
+
371392
+ /***/ }),
371393
+
371394
+ /***/ 94879:
371395
+ /***/ ((__unused_webpack_module, exports) => {
371396
+
371397
+
371398
+ /**
371399
+ * Pure builders for the messages the main thread posts to the stdin Service
371400
+ * Worker. Keeping them as data-only helpers (no `postMessage` side effects)
371401
+ * makes the protocol surface easy to unit test.
371402
+ *
371403
+ * The three shapes correspond one-to-one with the three terminal outcomes the
371404
+ * Service Worker can produce for a pending `/pyodide-stdin` fetch:
371405
+ *
371406
+ * - RESPONSE → HTTP 200 with the typed line (data path)
371407
+ * - EOF → HTTP 204 (clean EOF: input() raises EOFError in user code)
371408
+ * - CANCEL → HTTP 499 (user pressed Stop: worker raises KeyboardInterrupt)
371409
+ *
371410
+ * EOF and CANCEL look superficially similar but mean very different things to
371411
+ * Python — see `docs/PyodideRunner.md` §9 for the full flow.
371412
+ */
371413
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
371414
+ exports.buildStdinFallbackCancel = exports.buildStdinFallbackEof = exports.buildStdinFallbackResponse = void 0;
371415
+ /** Build a successful stdin response targeting a specific (runId, requestId). */
371416
+ const buildStdinFallbackResponse = (args) => ({
371417
+ type: "PYODIDE_STDIN_RESPONSE",
371418
+ clientId: args.clientId,
371419
+ runId: args.runId,
371420
+ requestId: args.requestId,
371421
+ value: args.value,
371422
+ });
371423
+ exports.buildStdinFallbackResponse = buildStdinFallbackResponse;
371424
+ /**
371425
+ * Build an EOF signal for a specific pending input request. Use this when the
371426
+ * user pressed Ctrl+D or when stdin was already closed earlier in the run —
371427
+ * NOT when the user pressed Stop (use the cancel builder for that).
371428
+ */
371429
+ const buildStdinFallbackEof = (args) => ({
371430
+ type: "PYODIDE_STDIN_EOF",
371431
+ clientId: args.clientId,
371432
+ runId: args.runId,
371433
+ requestId: args.requestId,
371434
+ });
371435
+ exports.buildStdinFallbackEof = buildStdinFallbackEof;
371436
+ /**
371437
+ * Build a cancellation message. Targets either a specific request or every
371438
+ * pending request for the given runId (when `requestId` is omitted).
371439
+ */
371440
+ const buildStdinFallbackCancel = (args) => {
371441
+ const message = {
371442
+ type: "PYODIDE_STDIN_CANCEL",
371443
+ clientId: args.clientId,
371444
+ runId: args.runId,
371445
+ };
371446
+ if (args.requestId !== undefined) {
371447
+ message.requestId = args.requestId;
371448
+ }
371449
+ return message;
371450
+ };
371451
+ exports.buildStdinFallbackCancel = buildStdinFallbackCancel;
371452
+
371453
+
371454
+ /***/ }),
371455
+
371456
+ /***/ 95369:
371457
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
371458
+
371459
+
371460
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
371461
+ exports.getOrCreateTabId = void 0;
371462
+ const constants_1 = __webpack_require__(90804);
371463
+ /**
371464
+ * Return a stable id for this browser tab so the stdin Service Worker can
371465
+ * route input requests back to the right client. Falls back to a fresh UUID
371466
+ * if sessionStorage is unavailable (e.g. private mode).
371467
+ */
371468
+ const getOrCreateTabId = () => {
371469
+ try {
371470
+ const existing = window.sessionStorage.getItem(constants_1.PYODIDE_TAB_ID_STORAGE_KEY);
371471
+ if (existing) {
371472
+ return existing;
371473
+ }
371474
+ const next = crypto.randomUUID();
371475
+ window.sessionStorage.setItem(constants_1.PYODIDE_TAB_ID_STORAGE_KEY, next);
371476
+ return next;
371477
+ }
371478
+ catch (_) {
371479
+ return crypto.randomUUID();
371480
+ }
371481
+ };
371482
+ exports.getOrCreateTabId = getOrCreateTabId;
370672
371483
 
370673
371484
 
370674
371485
  /***/ }),
@@ -370829,7 +371640,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
370829
371640
  };
370830
371641
  Object.defineProperty(exports, "__esModule", ({ value: true }));
370831
371642
  const jsx_runtime_1 = __webpack_require__(74848);
370832
- const styles_module_scss_1 = __importDefault(__webpack_require__(20140));
371643
+ const styles_module_scss_1 = __importDefault(__webpack_require__(87295));
370833
371644
  const loading_animation_gif_1 = __importDefault(__webpack_require__(73875));
370834
371645
  const Loading = ({}) => {
370835
371646
  return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.loadingPage, children: (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.loadingContainer, children: [(0, jsx_runtime_1.jsx)("img", { src: loading_animation_gif_1.default, className: styles_module_scss_1.default.loadingContainerAnimation }), (0, jsx_runtime_1.jsxs)("div", { children: ["Project loading", (0, jsx_runtime_1.jsxs)("span", { className: styles_module_scss_1.default.dots, "aria-hidden": "true", children: [(0, jsx_runtime_1.jsx)("span", { className: `${styles_module_scss_1.default.dot} ${styles_module_scss_1.default.dot1}`, children: "." }), (0, jsx_runtime_1.jsx)("span", { className: `${styles_module_scss_1.default.dot} ${styles_module_scss_1.default.dot2}`, children: "." }), (0, jsx_runtime_1.jsx)("span", { className: `${styles_module_scss_1.default.dot} ${styles_module_scss_1.default.dot3}`, children: "." })] })] }), (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.loadingContainerSubtext, children: "Building your world!" })] }) }));
@@ -370850,7 +371661,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
370850
371661
  const jsx_runtime_1 = __webpack_require__(74848);
370851
371662
  const react_menu_1 = __webpack_require__(71231);
370852
371663
  const classnames_1 = __importDefault(__webpack_require__(46942));
370853
- const styles_module_scss_1 = __importDefault(__webpack_require__(29707));
371664
+ const styles_module_scss_1 = __importDefault(__webpack_require__(28076));
370854
371665
  const ContextMenu = (props) => {
370855
371666
  const { align, direction, menuOptions, menuWidth, menuHeight, opened, anchorRef, onClose, anchorPoint, gap, hoverElement, title, activeItemId, showDivider = true, } = props;
370856
371667
  const portalTarget = document.getElementById("textjam-root") || document.body;
@@ -370887,7 +371698,7 @@ const react_1 = __webpack_require__(51649);
370887
371698
  const classnames_1 = __importDefault(__webpack_require__(46942));
370888
371699
  const SvgIcon_1 = __webpack_require__(82917);
370889
371700
  const arrow_right_svg_1 = __importDefault(__webpack_require__(17297));
370890
- const styles_module_scss_1 = __importDefault(__webpack_require__(12102));
371701
+ const styles_module_scss_1 = __importDefault(__webpack_require__(51191));
370891
371702
  const ContextMenu_1 = __importDefault(__webpack_require__(39179));
370892
371703
  const Dropdown = (props) => {
370893
371704
  const { ButtonIcon, buttonClassname, menuOptions, menuPosition, ariaLabel } = props;
@@ -370910,7 +371721,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
370910
371721
  };
370911
371722
  Object.defineProperty(exports, "__esModule", ({ value: true }));
370912
371723
  const jsx_runtime_1 = __webpack_require__(74848);
370913
- const SidebarPanel_1 = __importDefault(__webpack_require__(19190));
371724
+ const SidebarPanel_1 = __importDefault(__webpack_require__(83617));
370914
371725
  const FileTree_1 = __webpack_require__(88675);
370915
371726
  const stores_1 = __webpack_require__(32132);
370916
371727
  const FilePanel = () => {
@@ -370938,7 +371749,7 @@ exports.EmptyStateMessage = void 0;
370938
371749
  const jsx_runtime_1 = __webpack_require__(74848);
370939
371750
  const open_folder_svg_1 = __importDefault(__webpack_require__(2316));
370940
371751
  const SvgIcon_1 = __webpack_require__(82917);
370941
- const styles_module_scss_1 = __importDefault(__webpack_require__(79473));
371752
+ const styles_module_scss_1 = __importDefault(__webpack_require__(10556));
370942
371753
  const EmptyStateMessage = () => {
370943
371754
  return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.emptyStateContainer, children: [(0, jsx_runtime_1.jsx)(SvgIcon_1.SvgIcon, { size: 24, SvgElement: open_folder_svg_1.default, className: styles_module_scss_1.default.emptyStateIcon }), (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.emptyStateMessage, children: "There are no items to display yet." }), (0, jsx_runtime_1.jsx)("div", { children: " As items are added, they will be displayed here." })] }));
370944
371755
  };
@@ -370963,7 +371774,7 @@ const add_folder_svg_1 = __importDefault(__webpack_require__(3503));
370963
371774
  const add_file_svg_1 = __importDefault(__webpack_require__(41625));
370964
371775
  const ImportButton_1 = __webpack_require__(67532);
370965
371776
  const classnames_1 = __importDefault(__webpack_require__(46942));
370966
- const styles_module_scss_1 = __importDefault(__webpack_require__(79473));
371777
+ const styles_module_scss_1 = __importDefault(__webpack_require__(10556));
370967
371778
  const react_1 = __webpack_require__(51649);
370968
371779
  const FileTreeContext_1 = __webpack_require__(5323);
370969
371780
  const ProjectTypes_1 = __webpack_require__(27130);
@@ -370992,7 +371803,7 @@ const jsx_runtime_1 = __webpack_require__(74848);
370992
371803
  const Text_1 = __webpack_require__(82803);
370993
371804
  const ItemEdit_1 = __webpack_require__(61576);
370994
371805
  const ItemIcon_1 = __webpack_require__(3427);
370995
- const styles_module_scss_1 = __importDefault(__webpack_require__(68233));
371806
+ const styles_module_scss_1 = __importDefault(__webpack_require__(10614));
370996
371807
  const Tooltip_1 = __importDefault(__webpack_require__(26982));
370997
371808
  const useHover_1 = __webpack_require__(78556);
370998
371809
  const button_dots_svg_1 = __importDefault(__webpack_require__(80054));
@@ -371069,7 +371880,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
371069
371880
  Object.defineProperty(exports, "__esModule", ({ value: true }));
371070
371881
  exports.DeleteOption = void 0;
371071
371882
  const jsx_runtime_1 = __webpack_require__(74848);
371072
- const styles_module_scss_1 = __importDefault(__webpack_require__(81055));
371883
+ const styles_module_scss_1 = __importDefault(__webpack_require__(52160));
371073
371884
  const DeleteOption = () => {
371074
371885
  return (0, jsx_runtime_1.jsx)("span", { className: styles_module_scss_1.default.textDelete, children: "Delete" });
371075
371886
  };
@@ -371197,7 +372008,7 @@ exports.ItemEdit = void 0;
371197
372008
  const jsx_runtime_1 = __webpack_require__(74848);
371198
372009
  const react_1 = __webpack_require__(51649);
371199
372010
  const classnames_1 = __importDefault(__webpack_require__(46942));
371200
- const styles_module_scss_1 = __importDefault(__webpack_require__(68233));
372011
+ const styles_module_scss_1 = __importDefault(__webpack_require__(10614));
371201
372012
  const FileTreeContext_1 = __webpack_require__(5323);
371202
372013
  const SvgIcon_1 = __webpack_require__(82917);
371203
372014
  const alert_svg_1 = __importDefault(__webpack_require__(11367));
@@ -371282,7 +372093,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
371282
372093
  exports.FileTreeItem = void 0;
371283
372094
  const jsx_runtime_1 = __webpack_require__(74848);
371284
372095
  const classnames_1 = __importDefault(__webpack_require__(46942));
371285
- const styles_module_scss_1 = __importDefault(__webpack_require__(68233));
372096
+ const styles_module_scss_1 = __importDefault(__webpack_require__(10614));
371286
372097
  const treeGuides_1 = __webpack_require__(35258);
371287
372098
  const react_1 = __webpack_require__(51649);
371288
372099
  const FileTreeContext_1 = __webpack_require__(5323);
@@ -371336,7 +372147,7 @@ const upload_svg_1 = __importDefault(__webpack_require__(13616));
371336
372147
  const upload_file_svg_1 = __importDefault(__webpack_require__(98201));
371337
372148
  const upload_folder_svg_1 = __importDefault(__webpack_require__(66351));
371338
372149
  const SvgIcon_1 = __webpack_require__(82917);
371339
- const styles_module_scss_1 = __importDefault(__webpack_require__(79473));
372150
+ const styles_module_scss_1 = __importDefault(__webpack_require__(10556));
371340
372151
  const FileImport_1 = __webpack_require__(23079);
371341
372152
  const Dropdown_1 = __importDefault(__webpack_require__(44651));
371342
372153
  const ProjectTypes_1 = __webpack_require__(27130);
@@ -371731,7 +372542,7 @@ const jsx_runtime_1 = __webpack_require__(74848);
371731
372542
  const FileTreeItem_1 = __webpack_require__(8153);
371732
372543
  const react_1 = __webpack_require__(51649);
371733
372544
  const FileTreeActions_1 = __webpack_require__(42884);
371734
- const styles_module_scss_1 = __importDefault(__webpack_require__(79473));
372545
+ const styles_module_scss_1 = __importDefault(__webpack_require__(10556));
371735
372546
  const useFileTreeActions_1 = __webpack_require__(98028);
371736
372547
  const stores_1 = __webpack_require__(32132);
371737
372548
  const FileTreeContext_1 = __webpack_require__(5323);
@@ -371803,7 +372614,7 @@ const AuthContext_1 = __webpack_require__(55471);
371803
372614
  // import FontIcon from "../../../assets/icons/font.svg";
371804
372615
  // import PlaygroundIcon from "../../../assets/icons/playground.svg";
371805
372616
  // import ThemeIcon from "../../../assets/icons/theme.svg";
371806
- const styles_module_scss_1 = __importDefault(__webpack_require__(50239));
372617
+ const styles_module_scss_1 = __importDefault(__webpack_require__(21852));
371807
372618
  const getSidebarOptions = (initials, homeAction, isCodeVisible) => [
371808
372619
  {
371809
372620
  name: "home",
@@ -371868,7 +372679,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
371868
372679
  };
371869
372680
  Object.defineProperty(exports, "__esModule", ({ value: true }));
371870
372681
  const jsx_runtime_1 = __webpack_require__(74848);
371871
- const styles_module_scss_1 = __importDefault(__webpack_require__(50239));
372682
+ const styles_module_scss_1 = __importDefault(__webpack_require__(21852));
371872
372683
  const SidebarBarOption_1 = __importDefault(__webpack_require__(19371));
371873
372684
  const SidebarBar = (props) => {
371874
372685
  const { menuOptions, option, toggleOption } = props;
@@ -371892,9 +372703,9 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
371892
372703
  const jsx_runtime_1 = __webpack_require__(74848);
371893
372704
  const react_1 = __webpack_require__(51649);
371894
372705
  const stores_1 = __webpack_require__(32132);
371895
- const Button_1 = __importDefault(__webpack_require__(60232));
372706
+ const Button_1 = __importDefault(__webpack_require__(79428));
371896
372707
  const classnames_1 = __importDefault(__webpack_require__(46942));
371897
- const styles_module_scss_1 = __importDefault(__webpack_require__(50239));
372708
+ const styles_module_scss_1 = __importDefault(__webpack_require__(21852));
371898
372709
  const UserMenu_1 = __importDefault(__webpack_require__(2957));
371899
372710
  const backgroundColors = [
371900
372711
  'D7F9F4', '43D6B9',
@@ -371983,9 +372794,9 @@ const react_modal_1 = __importDefault(__webpack_require__(20312));
371983
372794
  const info_svg_1 = __importDefault(__webpack_require__(13579));
371984
372795
  const SvgIcon_1 = __webpack_require__(82917);
371985
372796
  const Text_1 = __webpack_require__(82803);
371986
- const Button_1 = __importDefault(__webpack_require__(60232));
371987
- const CloseIcon_1 = __importDefault(__webpack_require__(66298));
371988
- const base_module_scss_1 = __importDefault(__webpack_require__(15744));
372797
+ const Button_1 = __importDefault(__webpack_require__(79428));
372798
+ const CloseIcon_1 = __importDefault(__webpack_require__(61193));
372799
+ const base_module_scss_1 = __importDefault(__webpack_require__(62857));
371989
372800
  const BaseModal = ({ isOpen, closeModal, header, hasCloseButton = true, body, infoText, buttons, headerIcon, width, modalLabel, }) => {
371990
372801
  return ((0, jsx_runtime_1.jsxs)(react_modal_1.default, { isOpen: isOpen, onRequestClose: closeModal, className: base_module_scss_1.default.modalContent, overlayClassName: base_module_scss_1.default.modalOverlay, shouldCloseOnOverlayClick: true, contentLabel: modalLabel, style: width ? { content: { width: `${width}px` } } : undefined, parentSelector: () => document.querySelector("#textjam-editor") || document.body, appElement: document.querySelector("#textjam-root"), children: [(0, jsx_runtime_1.jsxs)("div", { className: base_module_scss_1.default.header, children: [(0, jsx_runtime_1.jsx)("div", { className: base_module_scss_1.default.headerButtonContainer, children: hasCloseButton && ((0, jsx_runtime_1.jsx)(Button_1.default, { className: base_module_scss_1.default.buttonClose, onClickHandler: closeModal, ButtonIcon: CloseIcon_1.default, label: "Close", title: "Close", variant: "icon" })) }), (0, jsx_runtime_1.jsxs)("div", { className: base_module_scss_1.default.headerContent, children: [headerIcon, header] })] }), body && (0, jsx_runtime_1.jsx)("div", { className: base_module_scss_1.default.body, children: body }), infoText && ((0, jsx_runtime_1.jsxs)("div", { className: base_module_scss_1.default.infoBox, children: [(0, jsx_runtime_1.jsx)(SvgIcon_1.SvgIcon, { size: 18, SvgElement: info_svg_1.default }), (0, jsx_runtime_1.jsx)(Text_1.Text, { size: 12, children: infoText })] })), buttons && (0, jsx_runtime_1.jsx)("div", { className: base_module_scss_1.default.footer, children: buttons })] }));
371991
372802
  };
@@ -372003,13 +372814,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
372003
372814
  };
372004
372815
  Object.defineProperty(exports, "__esModule", ({ value: true }));
372005
372816
  const jsx_runtime_1 = __webpack_require__(74848);
372006
- const styles_module_scss_1 = __importDefault(__webpack_require__(49871));
372817
+ const styles_module_scss_1 = __importDefault(__webpack_require__(29642));
372007
372818
  const EditorSlice_1 = __webpack_require__(68512);
372008
372819
  const types_1 = __webpack_require__(92932);
372009
372820
  const react_redux_1 = __webpack_require__(14062);
372010
372821
  const BaseModal_1 = __webpack_require__(30659);
372011
372822
  const restore_svg_1 = __importDefault(__webpack_require__(503));
372012
- const Button_1 = __importDefault(__webpack_require__(60232));
372823
+ const Button_1 = __importDefault(__webpack_require__(79428));
372013
372824
  const SvgIcon_1 = __webpack_require__(82917);
372014
372825
  const stores_1 = __webpack_require__(32132);
372015
372826
  const selectors_1 = __webpack_require__(43551);
@@ -372080,13 +372891,13 @@ const EditorSlice_1 = __webpack_require__(68512);
372080
372891
  const stores_1 = __webpack_require__(32132);
372081
372892
  const types_1 = __webpack_require__(92932);
372082
372893
  const BaseModal_1 = __webpack_require__(30659);
372083
- const Button_1 = __importDefault(__webpack_require__(60232));
372894
+ const Button_1 = __importDefault(__webpack_require__(79428));
372084
372895
  const SvgIcon_1 = __webpack_require__(82917);
372085
372896
  const save_svg_1 = __importDefault(__webpack_require__(48060));
372086
372897
  const Text_1 = __webpack_require__(82803);
372087
372898
  const LeaveFlowSlice_1 = __webpack_require__(52990);
372088
372899
  const SpinnerDotted_1 = __webpack_require__(79458);
372089
- const styles_module_scss_1 = __importDefault(__webpack_require__(79730));
372900
+ const styles_module_scss_1 = __importDefault(__webpack_require__(6631));
372090
372901
  const useProjectCache_1 = __webpack_require__(69557);
372091
372902
  const projectTabSync_1 = __webpack_require__(48235);
372092
372903
  const SaveBeforeLeaveModal = () => {
@@ -372137,19 +372948,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
372137
372948
  };
372138
372949
  Object.defineProperty(exports, "__esModule", ({ value: true }));
372139
372950
  const jsx_runtime_1 = __webpack_require__(74848);
372140
- const styles_module_scss_1 = __importDefault(__webpack_require__(41809));
372951
+ const styles_module_scss_1 = __importDefault(__webpack_require__(27924));
372141
372952
  const EditorSlice_1 = __webpack_require__(68512);
372142
372953
  const types_1 = __webpack_require__(92932);
372143
372954
  const react_redux_1 = __webpack_require__(14062);
372144
- const BaseModal_1 = __importDefault(__webpack_require__(94738));
372955
+ const BaseModal_1 = __importDefault(__webpack_require__(97933));
372145
372956
  const upload_file_svg_1 = __importDefault(__webpack_require__(98201));
372146
372957
  const upload_folder_svg_1 = __importDefault(__webpack_require__(66351));
372147
372958
  const info_svg_1 = __importDefault(__webpack_require__(13579));
372148
- const Button_1 = __importDefault(__webpack_require__(60232));
372959
+ const Button_1 = __importDefault(__webpack_require__(79428));
372149
372960
  const SvgIcon_1 = __webpack_require__(82917);
372150
372961
  const stores_1 = __webpack_require__(32132);
372151
372962
  const ProjectTypes_1 = __webpack_require__(27130);
372152
- const styles_module_scss_2 = __importDefault(__webpack_require__(79354));
372963
+ const styles_module_scss_2 = __importDefault(__webpack_require__(38653));
372153
372964
  const Text_1 = __webpack_require__(82803);
372154
372965
  const constants_1 = __webpack_require__(16287);
372155
372966
  const UploadFilesModal = () => {
@@ -372195,14 +373006,14 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
372195
373006
  exports.ModalTypeToComponentMap = void 0;
372196
373007
  const jsx_runtime_1 = __webpack_require__(74848);
372197
373008
  const types_1 = __webpack_require__(92932);
372198
- const ShareProjectModal_1 = __importDefault(__webpack_require__(58052));
373009
+ const ShareProjectModal_1 = __importDefault(__webpack_require__(38876));
372199
373010
  const ProjectHistoryModal_1 = __importDefault(__webpack_require__(39345));
372200
- const RemoveItemModal_1 = __importDefault(__webpack_require__(3985));
372201
- const SaveProjectReminderModal_1 = __importDefault(__webpack_require__(66536));
372202
- const UploadSizeLimitModal_1 = __importDefault(__webpack_require__(16893));
373011
+ const RemoveItemModal_1 = __importDefault(__webpack_require__(15406));
373012
+ const SaveProjectReminderModal_1 = __importDefault(__webpack_require__(23765));
373013
+ const UploadSizeLimitModal_1 = __importDefault(__webpack_require__(66156));
372203
373014
  const UploadFilesModal_1 = __importDefault(__webpack_require__(9825));
372204
- const RemixProjectModal_1 = __importDefault(__webpack_require__(45829));
372205
- const DraftUnsavedChangesModal_1 = __importDefault(__webpack_require__(94778));
373015
+ const RemixProjectModal_1 = __importDefault(__webpack_require__(14472));
373016
+ const DraftUnsavedChangesModal_1 = __importDefault(__webpack_require__(56724));
372206
373017
  exports.ModalTypeToComponentMap = {
372207
373018
  [types_1.ModalType.SHARE_PROJECT]: (0, jsx_runtime_1.jsx)(ShareProjectModal_1.default, {}),
372208
373019
  [types_1.ModalType.REMOVE_ITEM]: (0, jsx_runtime_1.jsx)(RemoveItemModal_1.default, {}),
@@ -372228,13 +373039,13 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
372228
373039
  const jsx_runtime_1 = __webpack_require__(74848);
372229
373040
  const gwc_logo_svg_1 = __importDefault(__webpack_require__(72865));
372230
373041
  const text_jam_logo_svg_1 = __importDefault(__webpack_require__(97552));
372231
- const ProjectName_1 = __importDefault(__webpack_require__(23559));
373042
+ const ProjectName_1 = __importDefault(__webpack_require__(73658));
372232
373043
  const DownloadButton_1 = __importDefault(__webpack_require__(2492));
372233
- const SaveButton_1 = __importDefault(__webpack_require__(50468));
373044
+ const SaveButton_1 = __importDefault(__webpack_require__(88814));
372234
373045
  const ShareButton_1 = __importDefault(__webpack_require__(21422));
372235
373046
  const HistoryButton_1 = __importDefault(__webpack_require__(21091));
372236
- const RunBar_1 = __importDefault(__webpack_require__(78176));
372237
- const styles_module_scss_1 = __importDefault(__webpack_require__(19436));
373047
+ const RunBar_1 = __importDefault(__webpack_require__(57715));
373048
+ const styles_module_scss_1 = __importDefault(__webpack_require__(88525));
372238
373049
  const stores_1 = __webpack_require__(32132);
372239
373050
  const types_1 = __webpack_require__(92932);
372240
373051
  const ProjectBar = ({ nameEditable = true, }) => {
@@ -372260,14 +373071,14 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
372260
373071
  exports.SharedProjectBar = void 0;
372261
373072
  const jsx_runtime_1 = __webpack_require__(74848);
372262
373073
  const classnames_1 = __importDefault(__webpack_require__(46942));
372263
- const Button_1 = __importDefault(__webpack_require__(60232));
373074
+ const Button_1 = __importDefault(__webpack_require__(79428));
372264
373075
  const SharedProjectName_1 = __importDefault(__webpack_require__(15591));
372265
- const RunBar_1 = __importDefault(__webpack_require__(78176));
373076
+ const RunBar_1 = __importDefault(__webpack_require__(57715));
372266
373077
  const SvgIcon_1 = __webpack_require__(82917);
372267
373078
  const link_svg_1 = __importDefault(__webpack_require__(19351));
372268
373079
  const gwc_logo_svg_1 = __importDefault(__webpack_require__(72865));
372269
373080
  const text_jam_logo_svg_1 = __importDefault(__webpack_require__(97552));
372270
- const styles_module_scss_1 = __importDefault(__webpack_require__(19436));
373081
+ const styles_module_scss_1 = __importDefault(__webpack_require__(88525));
372271
373082
  const react_redux_1 = __webpack_require__(14062);
372272
373083
  const EditorSlice_1 = __webpack_require__(68512);
372273
373084
  const types_1 = __webpack_require__(92932);
@@ -372326,7 +373137,7 @@ const projectHelpers_1 = __webpack_require__(2610);
372326
373137
  const SvgIcon_1 = __webpack_require__(82917);
372327
373138
  const file_svg_1 = __importDefault(__webpack_require__(70429));
372328
373139
  const Text_1 = __webpack_require__(82803);
372329
- const styles_module_scss_1 = __importDefault(__webpack_require__(32026));
373140
+ const styles_module_scss_1 = __importDefault(__webpack_require__(29881));
372330
373141
  const SharedProjectName = () => {
372331
373142
  const project = (0, stores_1.useAppSelector)((state) => state.editor.project);
372332
373143
  const authorName = (0, projectHelpers_1.getAuthorName)(project.author);
@@ -372348,14 +373159,14 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
372348
373159
  const jsx_runtime_1 = __webpack_require__(74848);
372349
373160
  const react_1 = __webpack_require__(51649);
372350
373161
  const share_svg_1 = __importDefault(__webpack_require__(48268));
372351
- const Button_1 = __importDefault(__webpack_require__(60232));
373162
+ const Button_1 = __importDefault(__webpack_require__(79428));
372352
373163
  const Tooltip_1 = __importDefault(__webpack_require__(26982));
372353
373164
  const react_redux_1 = __webpack_require__(14062);
372354
373165
  const EditorSlice_1 = __webpack_require__(68512);
372355
373166
  const types_1 = __webpack_require__(92932);
372356
373167
  const stores_1 = __webpack_require__(32132);
372357
373168
  const useHover_1 = __webpack_require__(78556);
372358
- const styles_module_scss_1 = __importDefault(__webpack_require__(99855));
373169
+ const styles_module_scss_1 = __importDefault(__webpack_require__(68776));
372359
373170
  const SvgIcon_1 = __webpack_require__(82917);
372360
373171
  const ShareButton = (props) => {
372361
373172
  const dispatch = (0, react_redux_1.useDispatch)();
@@ -372390,7 +373201,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
372390
373201
  Object.defineProperty(exports, "__esModule", ({ value: true }));
372391
373202
  exports.SpinnerDotted = void 0;
372392
373203
  const jsx_runtime_1 = __webpack_require__(74848);
372393
- const styles_module_scss_1 = __importDefault(__webpack_require__(2109));
373204
+ const styles_module_scss_1 = __importDefault(__webpack_require__(73386));
372394
373205
  const DEFAUL_POINT_COUNT = 8;
372395
373206
  const SpinnerDotted = ({ pointCount = DEFAUL_POINT_COUNT }) => {
372396
373207
  return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.spinnerDotted, children: [...new Array(pointCount)].map((_, i) => ((0, jsx_runtime_1.jsx)("span", { style: { "--itemIndex": i } }, i))) }));
@@ -372411,7 +373222,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
372411
373222
  exports.Text = void 0;
372412
373223
  const jsx_runtime_1 = __webpack_require__(74848);
372413
373224
  const classnames_1 = __importDefault(__webpack_require__(46942));
372414
- const styles_module_scss_1 = __importDefault(__webpack_require__(99265));
373225
+ const styles_module_scss_1 = __importDefault(__webpack_require__(91156));
372415
373226
  const Text = (props) => {
372416
373227
  const { children, size = 12, weight = "regular", variant = "text", tooltip, className, ...rest } = props;
372417
373228
  return ((0, jsx_runtime_1.jsx)("span", { className: (0, classnames_1.default)(styles_module_scss_1.default[variant], styles_module_scss_1.default[`size-${size}`], styles_module_scss_1.default[`weight-${weight}`], className), title: tooltip, ...rest, children: children }));
@@ -372436,7 +373247,7 @@ const alert_svg_1 = __importDefault(__webpack_require__(11367));
372436
373247
  const circle_check_svg_1 = __importDefault(__webpack_require__(16882));
372437
373248
  const info_svg_1 = __importDefault(__webpack_require__(13579));
372438
373249
  const SvgIcon_1 = __webpack_require__(82917);
372439
- const styles_module_scss_1 = __importDefault(__webpack_require__(92867));
373250
+ const styles_module_scss_1 = __importDefault(__webpack_require__(27112));
372440
373251
  const ToastItem = ({ data, closeToast, toastProps, }) => {
372441
373252
  const type = toastProps.type;
372442
373253
  const isError = type === "error";
@@ -372515,7 +373326,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
372515
373326
  Object.defineProperty(exports, "__esModule", ({ value: true }));
372516
373327
  const jsx_runtime_1 = __webpack_require__(74848);
372517
373328
  const classnames_1 = __importDefault(__webpack_require__(46942));
372518
- const styles_module_scss_1 = __importDefault(__webpack_require__(64383));
373329
+ const styles_module_scss_1 = __importDefault(__webpack_require__(28188));
372519
373330
  const Tooltip = ({ message, visible = false, position = "bottom", className, style, }) => {
372520
373331
  if (!visible)
372521
373332
  return null;
@@ -372537,11 +373348,11 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
372537
373348
  const jsx_runtime_1 = __webpack_require__(74848);
372538
373349
  const react_1 = __webpack_require__(51649);
372539
373350
  const marked_1 = __webpack_require__(6709);
372540
- const Project_1 = __importDefault(__webpack_require__(69118));
373351
+ const Project_1 = __importDefault(__webpack_require__(26665));
372541
373352
  const Output_1 = __importDefault(__webpack_require__(95148));
372542
- const DefaultMZCriteria_1 = __webpack_require__(98748);
372543
- const WebComponentCustomEvents_1 = __webpack_require__(30272);
372544
- const styles_module_scss_1 = __importDefault(__webpack_require__(63534));
373353
+ const DefaultMZCriteria_1 = __webpack_require__(29441);
373354
+ const WebComponentCustomEvents_1 = __webpack_require__(53841);
373355
+ const styles_module_scss_1 = __importDefault(__webpack_require__(93105));
372545
373356
  const stores_1 = __webpack_require__(32132);
372546
373357
  const WebComponentProject = ({ nameEditable = false, sidebarOptions = [], packageApiUrl, }) => {
372547
373358
  const loading = (0, stores_1.useAppSelector)((state) => state.editor.loading);
@@ -372646,7 +373457,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
372646
373457
  exports.SvgIcon = void 0;
372647
373458
  const jsx_runtime_1 = __webpack_require__(74848);
372648
373459
  const classnames_1 = __importDefault(__webpack_require__(46942));
372649
- const styles_module_scss_1 = __importDefault(__webpack_require__(50879));
373460
+ const styles_module_scss_1 = __importDefault(__webpack_require__(36974));
372650
373461
  const SvgIcon = ({ size, SvgElement, className, ...rest }) => {
372651
373462
  return ((0, jsx_runtime_1.jsx)(SvgElement, { className: (0, classnames_1.default)(styles_module_scss_1.default[`svgIcon-${size}`], className), ...rest }));
372652
373463
  };
@@ -372677,12 +373488,12 @@ const useProject_1 = __webpack_require__(54095);
372677
373488
  const useProjectPersistence_1 = __webpack_require__(72300);
372678
373489
  const useProjectRemix_1 = __webpack_require__(35602);
372679
373490
  const useProjectTabSync_1 = __webpack_require__(17299);
372680
- const settings_1 = __webpack_require__(3798);
372681
- const ErrorModal_1 = __importDefault(__webpack_require__(95049));
372682
- __webpack_require__(99782);
372683
- __webpack_require__(22984);
372684
- __webpack_require__(32433);
372685
- const WebComponentCustomEvents_1 = __webpack_require__(30272);
373491
+ const settings_1 = __webpack_require__(62161);
373492
+ const ErrorModal_1 = __importDefault(__webpack_require__(15382));
373493
+ __webpack_require__(7703);
373494
+ __webpack_require__(75765);
373495
+ __webpack_require__(41882);
373496
+ const WebComponentCustomEvents_1 = __webpack_require__(53841);
372686
373497
  const ToastMessages_1 = __webpack_require__(6459);
372687
373498
  const Modals_1 = __webpack_require__(18284);
372688
373499
  const Loading_1 = __importDefault(__webpack_require__(34466));
@@ -383846,7 +384657,7 @@ module.exports = webpackAsyncContext;
383846
384657
  /***/ 24427:
383847
384658
  /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
383848
384659
 
383849
- module.exports = __webpack_require__.p + "assets/PyodideWorkerdeabb0560f66f0f43f49.js";
384660
+ module.exports = __webpack_require__.p + "assets/PyodideWorkerb1409749c37aedc47dc8.js";
383850
384661
 
383851
384662
  /***/ }),
383852
384663