gwchq-textjam 0.2.1 → 0.2.3

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
@@ -68347,8 +68347,8 @@ __webpack_require__.r(__webpack_exports__);
68347
68347
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
68348
68348
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
68349
68349
  /* harmony export */ });
68350
- /* harmony import */ var D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(89379);
68351
- /* harmony import */ var D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(53986);
68350
+ /* harmony import */ var D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(89379);
68351
+ /* harmony import */ var D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(53986);
68352
68352
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51649);
68353
68353
  /* harmony import */ var _hello_pangea_dnd__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(98850);
68354
68354
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(14062);
@@ -68372,7 +68372,7 @@ var DraggableTab = _ref => {
68372
68372
  panelIndex,
68373
68373
  fileIndex
68374
68374
  } = _ref,
68375
- otherProps = (0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)(_ref, _excluded);
68375
+ otherProps = (0,D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)(_ref, _excluded);
68376
68376
  var openFiles = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(state => state.editor.openedFiles);
68377
68377
  var openFilesCount = openFiles[panelIndex].length;
68378
68378
  var dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();
@@ -68389,7 +68389,7 @@ var DraggableTab = _ref => {
68389
68389
  switchToFileTab(panelIndex, (fileIndex + openFilesCount - 1) % openFilesCount);
68390
68390
  }
68391
68391
  };
68392
- var InnerTab = () => /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(react_tabs__WEBPACK_IMPORTED_MODULE_2__.Tab, (0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)({
68392
+ var InnerTab = () => /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(react_tabs__WEBPACK_IMPORTED_MODULE_2__.Tab, (0,D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)({
68393
68393
  onClick: e => {
68394
68394
  e.stopPropagation();
68395
68395
  switchToFileTab(panelIndex, fileIndex);
@@ -68407,7 +68407,7 @@ var DraggableTab = _ref => {
68407
68407
  draggableProps,
68408
68408
  dragHandleProps
68409
68409
  } = _ref2;
68410
- return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)("div", (0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)({
68410
+ return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)("div", (0,D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)({
68411
68411
  className: "draggable-tab",
68412
68412
  ref: innerRef
68413
68413
  }, draggableProps), dragHandleProps), {}, {
@@ -68429,8 +68429,8 @@ __webpack_require__.r(__webpack_exports__);
68429
68429
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
68430
68430
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
68431
68431
  /* harmony export */ });
68432
- /* harmony import */ var D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(89379);
68433
- /* harmony import */ var D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(53986);
68432
+ /* harmony import */ var D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(89379);
68433
+ /* harmony import */ var D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(53986);
68434
68434
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51649);
68435
68435
  /* harmony import */ var _hello_pangea_dnd__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(98850);
68436
68436
  /* harmony import */ var react_tabs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(39243);
@@ -68449,8 +68449,8 @@ var DroppableTabList = _ref => {
68449
68449
  children: _children,
68450
68450
  index
68451
68451
  } = _ref,
68452
- otherProps = (0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_4__/* ["default"] */ .A)(_ref, _excluded);
68453
- return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(react_tabs__WEBPACK_IMPORTED_MODULE_1__.TabList, (0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)((0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)({}, otherProps), {}, {
68452
+ otherProps = (0,D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_4__/* ["default"] */ .A)(_ref, _excluded);
68453
+ return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(react_tabs__WEBPACK_IMPORTED_MODULE_1__.TabList, (0,D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)((0,D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)({}, otherProps), {}, {
68454
68454
  children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_hello_pangea_dnd__WEBPACK_IMPORTED_MODULE_6__.Droppable, {
68455
68455
  direction: "horizontal",
68456
68456
  droppableId: index.toString(),
@@ -68460,7 +68460,7 @@ var DroppableTabList = _ref => {
68460
68460
  droppableProps,
68461
68461
  placeholder
68462
68462
  } = _ref2;
68463
- return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)("div", (0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)((0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)({
68463
+ return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)("div", (0,D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)((0,D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)({
68464
68464
  className: "droppable-tab-list"
68465
68465
  }, droppableProps), {}, {
68466
68466
  ref: innerRef,
@@ -102918,7 +102918,7 @@ __webpack_require__.r(__webpack_exports__);
102918
102918
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
102919
102919
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
102920
102920
  /* harmony export */ });
102921
- /* harmony import */ var D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(89379);
102921
+ /* harmony import */ var D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(89379);
102922
102922
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51649);
102923
102923
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(14062);
102924
102924
  /* harmony import */ var _redux_EditorSlice__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(68512);
@@ -102998,7 +102998,7 @@ var ProjectName = _ref => {
102998
102998
  id: "project_name_label",
102999
102999
  className: _styles_module_scss__WEBPACK_IMPORTED_MODULE_3__["default"].projectLabel,
103000
103000
  children: "Project Name"
103001
- }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)("div", (0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)({
103001
+ }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)("div", (0,D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,D_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)({
103002
103002
  className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_styles_module_scss__WEBPACK_IMPORTED_MODULE_3__["default"].projectName, className)
103003
103003
  }, hoverProps), {}, {
103004
103004
  children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)((components_Tooltip_Tooltip__WEBPACK_IMPORTED_MODULE_8___default()), {
@@ -103113,13 +103113,13 @@ var RunButton = _ref => {
103113
103113
  }, props));
103114
103114
  };
103115
103115
  /* harmony default export */ const RunButton_RunButton = (RunButton);
103116
- // EXTERNAL MODULE: ./node_modules/react-i18next/dist/es/index.js + 17 modules
103117
- var es = __webpack_require__(56576);
103118
103116
  // EXTERNAL MODULE: ./node_modules/classnames/index.js
103119
103117
  var classnames = __webpack_require__(46942);
103120
103118
  var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);
103121
103119
  // EXTERNAL MODULE: ./src/components/RunButton/styles.module.scss
103122
103120
  var styles_module = __webpack_require__(26413);
103121
+ // EXTERNAL MODULE: ./src/components/SpinnerDotted/SpinnerDotted.tsx
103122
+ var SpinnerDotted = __webpack_require__(79458);
103123
103123
  ;// ./src/components/RunButton/StopButton.jsx
103124
103124
 
103125
103125
 
@@ -103132,6 +103132,10 @@ var StopButton_excluded = ["embedded", "className"];
103132
103132
 
103133
103133
 
103134
103134
 
103135
+ var stoppingButtonText = /*#__PURE__*/(0,jsx_runtime.jsxs)("span", {
103136
+ className: styles_module/* default */.A.stopBtnContent,
103137
+ children: [/*#__PURE__*/(0,jsx_runtime.jsx)(SpinnerDotted.SpinnerDotted, {}), " Stopping..."]
103138
+ });
103135
103139
  var StopButton = _ref => {
103136
103140
  var {
103137
103141
  embedded = false,
@@ -103141,9 +103145,6 @@ var StopButton = _ref => {
103141
103145
  var codeRunStopped = (0,external_react_redux_.useSelector)(state => state.editor.codeRunStopped);
103142
103146
  var codeRunTriggered = (0,external_react_redux_.useSelector)(state => state.editor.codeRunTriggered);
103143
103147
  var dispatch = (0,external_react_redux_.useDispatch)();
103144
- var {
103145
- t
103146
- } = (0,es.useTranslation)();
103147
103148
  var onClickStop = () => {
103148
103149
  if (codeRunTriggered) {
103149
103150
  dispatch((0,EditorSlice.stopCodeRun)());
@@ -103160,15 +103161,16 @@ var StopButton = _ref => {
103160
103161
  (0,external_react_.useEffect)(() => {
103161
103162
  if (codeRunStopped) {
103162
103163
  var stopping = /*#__PURE__*/(0,jsx_runtime.jsx)(Button["default"], {
103163
- className: "".concat(className ? " ".concat(className) : ""),
103164
- buttonText: t("runButton.stopping"),
103164
+ className: styles_module/* default */.A.stopping,
103165
+ buttonText: stoppingButtonText,
103166
+ variant: "primary",
103165
103167
  disabled: true
103166
103168
  });
103167
103169
  setTimeout(() => {
103168
103170
  setButton(stopping);
103169
103171
  }, 100);
103170
103172
  }
103171
- }, [className, codeRunStopped, t]);
103173
+ }, [className, codeRunStopped]);
103172
103174
  return button;
103173
103175
  };
103174
103176
  /* harmony default export */ const RunButton_StopButton = (StopButton);
@@ -142888,7 +142890,7 @@ __webpack_require__.r(__webpack_exports__);
142888
142890
  /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
142889
142891
  /* harmony export */ });
142890
142892
  // extracted by mini-css-extract-plugin
142891
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"grey-rpi-grey-15":"#d5d7dc","grey-rpi-grey-40":"#9497a4","grey-rpi-grey-5":"#f1f2f3","grey-rpi-grey-70":"#4a4d59","grey-rpf-white":"#fff","runBar":"styles-module__runBar--JA+8h","pressed":"styles-module__pressed--iQjvR"});
142893
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"grey-rpi-grey-15":"#d5d7dc","grey-rpi-grey-40":"#9497a4","grey-rpi-grey-5":"#f1f2f3","grey-rpi-grey-70":"#4a4d59","grey-rpf-white":"#fff","runBar":"styles-module__runBar--JA+8h","stopping":"styles-module__stopping--ilJAu","stopBtnContent":"styles-module__stopBtnContent--wcJNY","pressed":"styles-module__pressed--iQjvR"});
142892
142894
 
142893
142895
  /***/ }),
142894
142896
 
@@ -370046,6 +370048,7 @@ const PyodideRunner = ({ active, packageApiUrl, }) => {
370046
370048
  const interruptBuffer = (0, react_1.useRef)(null);
370047
370049
  const stdinBuffer = (0, react_1.useRef)(null);
370048
370050
  const stdinClosed = (0, react_1.useRef)(false);
370051
+ const workerReady = (0, react_1.useRef)(false);
370049
370052
  const loadedRunner = (0, stores_1.useAppSelector)((state) => state.editor.loadedRunner);
370050
370053
  const project = (0, stores_1.useAppSelector)((s) => s.editor.project);
370051
370054
  const projectComponents = project.components || [];
@@ -370096,7 +370099,9 @@ const PyodideRunner = ({ active, packageApiUrl, }) => {
370096
370099
  console.log("Destroying and recreating Pyodide worker");
370097
370100
  pyodideWorker.terminate();
370098
370101
  }
370102
+ workerReady.current = false;
370099
370103
  interruptBuffer.current = null;
370104
+ stdinBuffer.current = null;
370100
370105
  stdinClosed.current = false;
370101
370106
  disableInput();
370102
370107
  const newWorker = createWorker();
@@ -370141,6 +370146,7 @@ const PyodideRunner = ({ active, packageApiUrl, }) => {
370141
370146
  const handleLoaded = (stdin, interrupt) => {
370142
370147
  stdinBuffer.current = stdin;
370143
370148
  interruptBuffer.current = interrupt;
370149
+ workerReady.current = true;
370144
370150
  if (loadedRunner !== EditorTypes_1.RunnerType.PYODIDE) {
370145
370151
  dispatch((0, EditorSlice_1.setLoadedRunner)(EditorTypes_1.RunnerType.PYODIDE));
370146
370152
  }
@@ -370254,6 +370260,9 @@ const PyodideRunner = ({ active, packageApiUrl, }) => {
370254
370260
  setVisuals((array) => [...array, { origin, content }]);
370255
370261
  };
370256
370262
  const handleRun = async () => {
370263
+ if (!workerReady.current || !pyodideWorker) {
370264
+ return;
370265
+ }
370257
370266
  if (output.current) {
370258
370267
  output.current.innerHTML = "";
370259
370268
  }
@@ -370318,7 +370327,6 @@ const PyodideRunner = ({ active, packageApiUrl, }) => {
370318
370327
  type: Errors_1.ErrorType.RUNTIME_ERROR,
370319
370328
  message: "Execution interrupted",
370320
370329
  }));
370321
- dispatch((0, EditorSlice_1.codeRunHandled)());
370322
370330
  };
370323
370331
  const writeFile = (filename, content) => {
370324
370332
  pyodideWorker?.postMessage({ method: "writeFile", filename, content });
@@ -372344,7 +372352,7 @@ const WebComponentProject = ({ nameEditable = false, sidebarOptions = [], packag
372344
372352
  return () => clearTimeout(timeout);
372345
372353
  }, [project]);
372346
372354
  renderer.link = function (data) {
372347
- return `<a href="${data.href}" target="_blank" rel="noreferrer"
372355
+ return `<a href="${data.href}" target="_blank" rel="noreferrer"
372348
372356
  }">${data.text}</a>`;
372349
372357
  };
372350
372358
  marked_1.marked.setOptions({
@@ -373234,14 +373242,23 @@ const getDirChildrenNames = (dir, componentsMap) => {
373234
373242
  exports.getDirChildrenNames = getDirChildrenNames;
373235
373243
  const getUniqueNameFromItem = (childrenNames, baseName, extension = "") => {
373236
373244
  const existingNames = childrenNames ?? [];
373245
+ const existingNamesLower = new Set(existingNames.map((name) => name.toLowerCase()));
373237
373246
  const fullName = (name) => `${name}${extension ? `.${extension}` : ""}`;
373238
- let name = baseName;
373247
+ const originalFullName = fullName(baseName);
373248
+ const normalizedFullName = originalFullName.toLowerCase();
373249
+ // if there is no conflict, preserve original casing
373250
+ if (!existingNamesLower.has(normalizedFullName)) {
373251
+ return baseName;
373252
+ }
373253
+ // if there is a conflict, use canonical lowercase for the duplicate
373254
+ const normalizedBaseName = baseName.toLowerCase();
373239
373255
  let counter = 1;
373240
- while (existingNames.includes(fullName(name))) {
373241
- name = `${baseName} (${counter})`;
373256
+ let candidate = `${normalizedBaseName}(${counter})`;
373257
+ while (existingNamesLower.has(fullName(candidate).toLowerCase())) {
373242
373258
  counter++;
373259
+ candidate = `${normalizedBaseName}(${counter})`;
373243
373260
  }
373244
- return name;
373261
+ return candidate;
373245
373262
  };
373246
373263
  exports.getUniqueNameFromItem = getUniqueNameFromItem;
373247
373264
  const generateFiles = async (files) => {
@@ -374385,6 +374402,18 @@ const selectOpenedFiles = (state) => {
374385
374402
  return state.editor.openedFiles ?? [[]];
374386
374403
  };
374387
374404
  const filesCountErrorMessage = `Cannot have more than ${constants_1.MAX_PROJECT_FILE_COUNT} files in a project. Please remove some files before adding new ones.`;
374405
+ const DUPLICATE_UPLOAD_TOAST = "Looks like you uploaded the same file more than once! We renamed the duplicates for you but double check your code to make sure everything still works.";
374406
+ const hasCaseInsensitiveDuplicateNames = (files) => {
374407
+ const seen = new Set();
374408
+ for (const file of files) {
374409
+ const key = (file.webkitRelativePath?.trim() || file.name).toLowerCase();
374410
+ if (seen.has(key)) {
374411
+ return true;
374412
+ }
374413
+ seen.add(key);
374414
+ }
374415
+ return false;
374416
+ };
374388
374417
  const fsRename = ({ id, parentId, newName, }) => (dispatch, getState) => {
374389
374418
  const state = getState();
374390
374419
  const components = selectComponents(state);
@@ -374442,11 +374471,15 @@ const fsImportFiles = ({ files, parentId }) => async (dispatch, getState) => {
374442
374471
  return;
374443
374472
  }
374444
374473
  const { validFiles, importErrors } = (0, fileValidation_1.validateFiles)(files);
374474
+ const hasDuplicates = hasCaseInsensitiveDuplicateNames(validFiles);
374445
374475
  for (const error of importErrors) {
374446
374476
  (0, sendToast_1.showError)(error.reason);
374447
374477
  }
374448
374478
  if (validFiles.length > 0) {
374449
374479
  (0, sendToast_1.showSuccess)(`Selected files uploaded successfully. ${validFiles.length} of ${files.length} file(s) uploaded.`);
374480
+ if (hasDuplicates) {
374481
+ (0, sendToast_1.showInfo)(DUPLICATE_UPLOAD_TOAST);
374482
+ }
374450
374483
  }
374451
374484
  else {
374452
374485
  (0, sendToast_1.showError)(`Selected files couldn’t be uploaded. ${files.length} file(s) failed to upload.`);
@@ -374472,11 +374505,15 @@ const fsImportFolder = ({ files, parentId }) => async (dispatch, getState) => {
374472
374505
  }
374473
374506
  const folderName = files[0]?.webkitRelativePath?.split("/")[0];
374474
374507
  const { validFiles, importErrors } = (0, fileValidation_1.validateFiles)(files);
374508
+ const hasDuplicates = hasCaseInsensitiveDuplicateNames(validFiles);
374475
374509
  for (const error of importErrors) {
374476
374510
  (0, sendToast_1.showError)(error.reason);
374477
374511
  }
374478
374512
  if (validFiles.length > 0) {
374479
374513
  (0, sendToast_1.showSuccess)(`Folder '${folderName}' upload complete. ${validFiles.length} of ${files.length} file(s) uploaded successfully.`);
374514
+ if (hasDuplicates) {
374515
+ (0, sendToast_1.showInfo)(DUPLICATE_UPLOAD_TOAST);
374516
+ }
374480
374517
  }
374481
374518
  else {
374482
374519
  (0, sendToast_1.showError)(`'${folderName}' folder couldn't be uploaded. ${files.length} file(s) failed to upload.`);
@@ -383262,7 +383299,7 @@ module.exports = webpackAsyncContext;
383262
383299
  /***/ 24427:
383263
383300
  /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
383264
383301
 
383265
- module.exports = __webpack_require__.p + "assets/PyodideWorkerd2b0583273d433314bf9.js";
383302
+ module.exports = __webpack_require__.p + "assets/PyodideWorkerdeabb0560f66f0f43f49.js";
383266
383303
 
383267
383304
  /***/ }),
383268
383305
 
package/dist/style.css CHANGED
@@ -681,12 +681,12 @@
681
681
  :root{--rpf-white: #ffffff}.styles-module__projectName--HRN56{align-items:center;display:flex;block-size:100%;padding-inline-start:calc(.5rem*var(--scale-factor, 1));position:relative}.styles-module__projectLabel--IyOEH{font-size:calc(.75rem*var(--scale-factor, 1));line-height:calc(1rem*var(--scale-factor, 1));color:#003046;font-weight:400}.styles-module__projectInput--ppPP8{font-size:calc(.875rem*var(--scale-factor, 1));line-height:calc(1.25rem*var(--scale-factor, 1));padding:0 calc(1.25rem*var(--scale-factor, 1));block-size:44px;border-radius:calc(.75rem*var(--scale-factor, 1));border:none;color:#003046;background-color:#43d6b9;text-overflow:ellipsis;inline-size:calc(10.125rem*var(--scale-factor, 1));cursor:pointer}.styles-module__projectInput--ppPP8:focus-visible,.styles-module__projectInput--ppPP8:focus{outline:none}.styles-module__projectInput--ppPP8.styles-module__editing--\+2Ncm{background-color:#fff;cursor:text;outline:none}.styles-module__shared--exD57{color:#003046;gap:calc(.5rem*var(--scale-factor, 1))}
682
682
  :root{--rpf-white: #ffffff}.styles-module__tooltip--7XFyr{position:absolute;background-color:#242424;color:#e5e5e5;padding:calc(.25rem*var(--scale-factor, 1)) calc(.5rem*var(--scale-factor, 1));border-radius:calc(.25rem*var(--scale-factor, 1));font-size:calc(.75rem*var(--scale-factor, 1));line-height:calc(1rem*var(--scale-factor, 1));min-inline-size:calc(10.25rem*var(--scale-factor, 1));z-index:600;pointer-events:none;white-space:pre-wrap;opacity:0;visibility:hidden;transition:opacity .2s ease,transform .2s ease}.styles-module__tooltip--7XFyr.styles-module__visible--wGPCM{opacity:1;visibility:visible}.styles-module__position-bottom--Lwi\+l{inset-block-start:100%;inset-inline-end:0;margin-block-start:calc(.25rem*var(--scale-factor, 1))}.styles-module__position-fixed--t8yrP{position:fixed;margin-top:calc(.625rem*var(--scale-factor, 1));margin-right:calc(2rem*var(--scale-factor, 1))}
683
683
  :root{--rpf-white: #ffffff}.styles-module__btn--0Px6W{align-items:center;border-radius:calc(.75rem*var(--scale-factor, 1));border:0;box-sizing:border-box;padding:calc(.75rem*var(--scale-factor, 1)) calc(1.25rem*var(--scale-factor, 1));color:#003046;cursor:pointer;display:inline-flex;font-family:var(--wc-font-family-sans-serif);font-size:inherit;font-weight:500;gap:calc(.5rem*var(--scale-factor, 1));justify-content:center;position:relative;text-align:center;text-decoration:none;transition:all .2s ease}.styles-module__btn--0Px6W:disabled{background-color:#4a4d59;color:#69746d;cursor:default}.styles-module__btn--0Px6W:focus-visible{border:3px solid #cd2356;outline:none}.styles-module__btn--primary--k7oQ0{background-color:var(--rpf-button-primary-background-color);border-radius:calc(.5rem*var(--scale-factor, 1));color:var(--rpf-button-primary-text-color)}.styles-module__btn--primary--k7oQ0 svg{fill:var(--rpf-button-primary-text-color)}.styles-module__btn--primary--k7oQ0:active,.styles-module__btn-outer--4KgkG:active .styles-module__btn--primary--k7oQ0{background-color:var(--rpf-button-primary-background-color-active)}.styles-module__btn--primary--k7oQ0:focus-visible,.styles-module__btn-outer--4KgkG:focus-visible .styles-module__btn--primary--k7oQ0{background-color:var(--rpf-button-primary-background-color-focus)}.styles-module__btn--primary--k7oQ0:hover,.styles-module__btn-outer--4KgkG:hover .styles-module__btn--primary--k7oQ0{background-color:var(--rpf-button-primary-background-color-hover);border-radius:calc(.5rem*var(--scale-factor, 1))}.styles-module__btn--primary--k7oQ0:disabled{background-color:var(--rpf-button-primary-background-color-disabled);color:var(--rpf-button-primary-color-disabled)}.styles-module__btn--primary--k7oQ0:disabled svg{fill:var(--rpf-button-primary-color-disabled)}.styles-module__btn--primary--k7oQ0:disabled:hover,.styles-module__btn-outer--4KgkG:hover .styles-module__btn--primary--k7oQ0:disabled{background-color:var(--rpf-button-primary-background-color-disabled)}.styles-module__btn--secondary--tK09f{background-color:inherit;color:var(--rpf-button-secondary-text-color);border:2px solid var(--rpf-button-primary-background-color)}.styles-module__btn--secondary--tK09f svg{fill:var(--rpf-button-secondary-text-color)}.styles-module__btn--secondary--tK09f:active,.styles-module__btn-outer--4KgkG:active .styles-module__btn--secondary--tK09f{background-color:inherit}.styles-module__btn--secondary--tK09f:focus-visible,.styles-module__btn-outer--4KgkG:focus-visible .styles-module__btn--secondary--tK09f{background-color:inherit}.styles-module__btn--secondary--tK09f:hover,.styles-module__btn-outer--4KgkG:hover .styles-module__btn--secondary--tK09f{background-color:inherit}.styles-module__btn--secondary--tK09f:disabled{background-color:var(--rpf-button-secondary-background-color-disabled);color:var(--rpf-button-secondary-background-color-active)}.styles-module__btn--secondary--tK09f:disabled svg{fill:var(--rpf-button-secondary-background-color-active)}.styles-module__btn--secondary--tK09f:disabled:hover,.styles-module__btn-outer--4KgkG:hover .styles-module__btn--secondary--tK09f:disabled{background-color:var(--rpf-button-secondary-background-color-disabled)}.styles-module__btn--secondary--tK09f:active{border:2px solid var(--rpf-button-secondary-background-color-active)}.styles-module__btn--secondary--tK09f:hover{background-color:var(--rpf-button-secondary-background-color-hover);color:var(--rpf-button-secondary-text-color-hover);border-color:var(--rpf-button-secondary-border-color-hover) !important}.styles-module__btn--secondary--tK09f:hover svg{fill:var(--rpf-button-secondary-text-color-hover)}.styles-module__btn--secondary--tK09f:focus-visible{outline:3px solid var(--rpf-button-secondary-background-color-focus)}.styles-module__btn--tertiary--jf5po{background-color:inherit;color:inherit}.styles-module__btn--tertiary--jf5po:active,.styles-module__btn-outer--4KgkG:active .styles-module__btn--tertiary--jf5po{background-color:inherit}.styles-module__btn--tertiary--jf5po:focus-visible,.styles-module__btn-outer--4KgkG:focus-visible .styles-module__btn--tertiary--jf5po{background-color:inherit}.styles-module__btn--tertiary--jf5po:hover,.styles-module__btn-outer--4KgkG:hover .styles-module__btn--tertiary--jf5po{background-color:inherit}.styles-module__btn--tertiary--jf5po:disabled{background-color:inherit;color:#4a4d59}.styles-module__btn--tertiary--jf5po:disabled svg{fill:#4a4d59}.styles-module__btn--tertiary--jf5po:disabled:hover,.styles-module__btn-outer--4KgkG:hover .styles-module__btn--tertiary--jf5po:disabled{background-color:inherit}.styles-module__btn--tertiary--jf5po:active{color:#0e857a}.styles-module__btn--tertiary--jf5po:active svg{fill:#0e857a}.styles-module__btn--tertiary--jf5po:hover{color:var(--rpf-button-tertiary-text-color-hover)}.styles-module__btn--tertiary--jf5po:hover svg{fill:var(--rpf-button-tertiary-text-color-hover)}.styles-module__btn--tertiaryGray--gFHKt{background-color:inherit;color:inherit}.styles-module__btn--tertiaryGray--gFHKt:active,.styles-module__btn-outer--4KgkG:active .styles-module__btn--tertiaryGray--gFHKt{background-color:inherit}.styles-module__btn--tertiaryGray--gFHKt:focus-visible,.styles-module__btn-outer--4KgkG:focus-visible .styles-module__btn--tertiaryGray--gFHKt{background-color:inherit}.styles-module__btn--tertiaryGray--gFHKt:hover,.styles-module__btn-outer--4KgkG:hover .styles-module__btn--tertiaryGray--gFHKt{background-color:inherit}.styles-module__btn--tertiaryGray--gFHKt:disabled{background-color:inherit;color:#4a4d59}.styles-module__btn--tertiaryGray--gFHKt:disabled svg{fill:#4a4d59}.styles-module__btn--tertiaryGray--gFHKt:disabled:hover,.styles-module__btn-outer--4KgkG:hover .styles-module__btn--tertiaryGray--gFHKt:disabled{background-color:inherit}.styles-module__btn--tertiaryGray--gFHKt:active{color:#43d6b9}.styles-module__btn--tertiaryGray--gFHKt:active svg{fill:#43d6b9}.styles-module__btn--tertiaryGray--gFHKt:hover{color:var(#4a4d59)}.styles-module__btn--tertiaryGray--gFHKt:hover svg{fill:var(#4a4d59)}.styles-module__btn--danger--SmsoX{background-color:#9e0a0a;color:#fff}.styles-module__btn--danger--SmsoX svg{fill:#fff}.styles-module__btn--danger--SmsoX:active,.styles-module__btn-outer--4KgkG:active .styles-module__btn--danger--SmsoX{background-color:#9e0a0a}.styles-module__btn--danger--SmsoX:focus-visible,.styles-module__btn-outer--4KgkG:focus-visible .styles-module__btn--danger--SmsoX{background-color:#9e0a0a}.styles-module__btn--danger--SmsoX:hover,.styles-module__btn-outer--4KgkG:hover .styles-module__btn--danger--SmsoX{background-color:#86151e}.styles-module__btn--danger--SmsoX:disabled{background-color:#9e0a0a;color:#fff}.styles-module__btn--danger--SmsoX:disabled svg{fill:#fff}.styles-module__btn--danger--SmsoX:disabled:hover,.styles-module__btn-outer--4KgkG:hover .styles-module__btn--danger--SmsoX:disabled{background-color:#9e0a0a}.styles-module__btn--danger--SmsoX:focus-visible{background-clip:padding-box;border:2px solid rgba(0,0,0,0);outline:3px solid #cd2356}.styles-module__btn--small--cJ2bM{min-block-size:unset;min-inline-size:unset;padding:calc(.25rem*var(--scale-factor, 1))}.styles-module__btnOuter--ip64U{background:rgba(0,0,0,0);border-radius:calc(.5rem*var(--scale-factor, 1));cursor:pointer;padding:calc(.5rem*var(--scale-factor, 1)) 0;display:flex;align-items:center;justify-content:center}.styles-module__btnOuter--ip64U:focus-visible{outline:none}.styles-module__btnOuter--ip64U:focus-visible .styles-module__btn--0Px6W{border:3px solid #cd2356}.styles-module__btnOuter--ip64U:has(.styles-module__btn--0Px6W:disabled){cursor:default}.styles-module__svgOnly--eXeyf{background-color:#43d6b9}.styles-module__svgOnly--eXeyf svg{margin:0}.styles-module__primary--AeI1M{background:#fde246}.styles-module__primary--AeI1M:hover{background:#edce22}.styles-module__primary--AeI1M:active{background:#fff;border:1px solid #003046}.styles-module__primary--AeI1M:disabled{background:#fffbe3;color:#69746d}.styles-module__secondary--tAMJR{background:linear-gradient(139deg, rgba(185, 230, 238, 0.8) 9.38%, rgba(113, 235, 188, 0.8) 45.1%, rgba(113, 235, 188, 0.8) 59.39%, rgba(185, 230, 238, 0.8) 88.77%),#fff;border:none}.styles-module__secondary--tAMJR:hover{background:linear-gradient(0deg, hsla(0, 0%, 34%, 0.15), hsla(0, 0%, 34%, 0.15)),linear-gradient(320deg, #B9E6EE 17.77%, #71EBBC 47.58%, #71EBBC 59.5%, #B9E6EE 84%)}.styles-module__secondary--tAMJR:active{background:#fff;border:1px solid #003046}.styles-module__secondary--tAMJR:disabled{background:linear-gradient(135deg, #B9E6EE, #71EBBC, #71EBBC, #B9E6EE),linear-gradient(139deg, #B9E6EE 9.38%, #71EBBC 45.1%, #71EBBC 59.39%, #B9E6EE 88.77%),#fff}.styles-module__tertiary--Kr5w9{background:#43d6b9;color:#003046}.styles-module__tertiary--Kr5w9:hover{background:#cbcbcb}.styles-module__tertiary--Kr5w9:active{background:#fff}.styles-module__tertiary--Kr5w9:disabled{background:#e5e5e5;color:#69746d}.styles-module__tertiaryGray--gVUq6{background:#e5e5e5;color:#33625e}.styles-module__tertiaryGray--gVUq6:hover{background:#cbcbcb}.styles-module__tertiaryGray--gVUq6:disabled{background:#d5d7dc;color:#69746d}.styles-module__iconed--AMs-c{padding-top:10px;padding-bottom:10px}.styles-module__icon--C2jj1{padding:0px}
684
- :root{--rpf-white: #ffffff}.styles-module__spinnerDotted--tTFFI{position:relative;width:1.125rem;height:1.125rem}.styles-module__spinnerDotted--tTFFI span{position:absolute;top:40%;left:25%;width:.225rem;height:.225rem;background-color:#fff;border-radius:50%;transform-origin:center;transform:rotate(var(--angle)) translateY(-0.5625rem);opacity:.2;animation:styles-module__fade--jNeB5 1s linear infinite;--angle: calc(var(--itemIndex) * 45deg);animation-delay:calc(var(--itemIndex)*.125s)}@keyframes styles-module__fade--jNeB5{0%{opacity:1}100%{opacity:.2}}
684
+ :root{--rpf-white: #ffffff}.styles-module__spinnerDotted--tTFFI{position:relative;inline-size:1.125rem;block-size:1.125rem}.styles-module__spinnerDotted--tTFFI span{position:absolute;inset-block-start:40%;inset-inline-start:25%;inline-size:.225rem;block-size:.225rem;background-color:var(--spinner-color, #ffffff);border-radius:50%;transform-origin:center;transform:rotate(var(--angle)) translateY(-0.5625rem);opacity:.2;animation:styles-module__fade--jNeB5 1s linear infinite;--angle: calc(var(--itemIndex) * 45deg);animation-delay:calc(var(--itemIndex)*.125s)}@keyframes styles-module__fade--jNeB5{0%{opacity:1}100%{opacity:.2}}
685
685
  .styles-module__content--Cgvxl{display:flex;gap:calc(.5rem*var(--scale-factor, 1))}
686
686
  .styles-module__shareButtonWrapper--wEN8e{position:relative}
687
687
  :root{--rpf-white: #ffffff}.styles-module__historyActive--aOVxD{background-color:#fff}.styles-module__historyButton--LInbn{color:#003046}.styles-module__commitHoverElement--foGWE{color:#33625e;display:flex;align-items:center;gap:calc(.25rem*var(--scale-factor, 1))}.styles-module__btnContainer--OlkJ2{position:relative}
688
688
  :root{--rpf-white: #ffffff}.styles-module__contextMenu--HNX6Z{list-style-type:none;padding:0;margin-inline:calc(.5rem*var(--scale-factor, 1)) 0;margin-block:0;border-radius:calc(.25rem*var(--scale-factor, 1));display:flex;flex-direction:column;background-color:#fff;border:1px solid #e5e5e5;box-shadow:0 calc(.25rem*var(--scale-factor, 1)) calc(.5rem*var(--scale-factor, 1)) 0 rgba(0,0,0,.25);overflow:auto;z-index:700}.styles-module__contextMenu--HNX6Z .styles-module__hoverElement--GLCJ0{visibility:hidden;margin-left:calc(1rem*var(--scale-factor, 1))}.styles-module__contextMenu--HNX6Z .styles-module__contextItem--9nzMH{display:flex;justify-content:space-between;font-size:calc(.875rem*var(--scale-factor, 1));line-height:calc(1.25rem*var(--scale-factor, 1));color:#69746d;padding:calc(1rem*var(--scale-factor, 1));white-space:nowrap;inline-size:100%;gap:calc(.5rem*var(--scale-factor, 1));transition:all .2s ease}.styles-module__contextMenu--HNX6Z .styles-module__contextItem--9nzMH .styles-module__optionContent--3E8Zt{display:flex;align-items:center;gap:calc(.5rem*var(--scale-factor, 1));justify-items:start}.styles-module__contextMenu--HNX6Z .styles-module__contextItem--9nzMH:hover{background-color:#e5f6f1;cursor:pointer;color:#003046}.styles-module__contextMenu--HNX6Z .styles-module__contextItem--9nzMH:hover .styles-module__hoverElement--GLCJ0{visibility:visible}.styles-module__contextMenu--HNX6Z .styles-module__contextItemActive--KkppO{background-color:#c5ffe8;color:#003046}.styles-module__contextMenu--HNX6Z .styles-module__contextHeader--jA59O{font-size:calc(.625rem*var(--scale-factor, 1));line-height:calc(1rem*var(--scale-factor, 1));font-weight:500;padding:calc(.5rem*var(--scale-factor, 1)) calc(1rem*var(--scale-factor, 1)) calc(.25rem*var(--scale-factor, 1));color:#33625e}.styles-module__contextMenu--HNX6Z svg{inline-size:calc(1.125rem*var(--scale-factor, 1))}.styles-module__contextMenu--HNX6Z .styles-module__withDivider--X54Sw{border-bottom:1px solid #e5e5e5}.styles-module__visibleScrollbar--PEea9::-webkit-scrollbar{width:calc(.25rem*var(--scale-factor, 1));display:block}.styles-module__visibleScrollbar--PEea9::-webkit-scrollbar-thumb{background-color:HSL(0, 0%, 14%, 10%);border-radius:calc(1.125rem*var(--scale-factor, 1))}
689
- :root{--rpf-white: #ffffff}.styles-module__runBar--JA\+8h{display:flex;flex-direction:row;margin-right:calc(1.5rem*var(--scale-factor, 1))}.styles-module__runBar--JA\+8h button{font-size:calc(.875rem*var(--scale-factor, 1));line-height:calc(1.25rem*var(--scale-factor, 1));font-weight:500;height:44px;width:calc(6rem*var(--scale-factor, 1))}@media screen and (max-width: 1194px){.styles-module__runBar--JA\+8h button span{display:none}}.styles-module__pressed--iQjvR{background:#fff;border:1px solid #003046}
689
+ :root{--rpf-white: #ffffff}.styles-module__runBar--JA\+8h{display:flex;flex-direction:row;margin-inline-end:calc(1.5rem*var(--scale-factor, 1))}.styles-module__runBar--JA\+8h button{font-size:calc(.875rem*var(--scale-factor, 1));line-height:calc(1.25rem*var(--scale-factor, 1));font-weight:500;block-size:44px;inline-size:calc(6rem*var(--scale-factor, 1))}@media screen and (max-width: 1194px){.styles-module__runBar--JA\+8h button span{display:none}}.styles-module__runBar--JA\+8h .styles-module__stopping--ilJAu,.styles-module__runBar--JA\+8h .styles-module__stopping--ilJAu button{inline-size:calc(7.5rem*var(--scale-factor, 1))}.styles-module__runBar--JA\+8h .styles-module__stopping--ilJAu span,.styles-module__runBar--JA\+8h .styles-module__stopping--ilJAu button span{display:flex}.styles-module__stopBtnContent--wcJNY{--spinner-color: #69746d;display:flex;gap:calc(.5rem*var(--scale-factor, 1))}.styles-module__pressed--iQjvR{background:#fff;border:1px solid #003046}
690
690
  :root{--rpf-white: #ffffff}.styles-module__wrapper--NmEQI{display:flex;align-items:center;gap:calc(.5rem*var(--scale-factor, 1))}.styles-module__header--UkMi-{display:flex;align-items:center;justify-content:space-between;font-size:12px;block-size:62px;padding:calc(.625rem*var(--scale-factor, 1)) calc(1rem*var(--scale-factor, 1)) calc(.5rem*var(--scale-factor, 1)) calc(1.25rem*var(--scale-factor, 1));flex-shrink:0;z-index:1}.styles-module__headerBtn--kUJII{font-size:calc(.875rem*var(--scale-factor, 1));line-height:calc(1.25rem*var(--scale-factor, 1));font-weight:500;block-size:44px;padding:calc(.625rem*var(--scale-factor, 1)) calc(1.25rem*var(--scale-factor, 1));gap:7px}.styles-module__gwcLogo--svs9k{inline-size:calc(2.5rem*var(--scale-factor, 1))}.styles-module__textJamLogo--dZcnz{inline-size:150px;block-size:36px;margin-inline-start:calc(.75rem*var(--scale-factor, 1))}.styles-module__btnSvg--Ri2uZ{inline-size:44px;block-size:44px}.styles-module__projectName--6o3NT{flex-grow:1;padding-inline-start:calc(1rem*var(--scale-factor, 1))}.styles-module__linkButton--bj6aP{color:#003046}.styles-module__sharedProject--baj0W{gap:calc(2rem*var(--scale-factor, 1))}.styles-module__remixBtnContent--sJf5m{display:flex;gap:calc(.5rem*var(--scale-factor, 1))}
691
691
  :root{--rpf-white: #ffffff}.styles-module__sidebar--Fu5Qi{display:flex;position:relative;scrollbar-width:none}.styles-module__gwcLogo--o2p4A{inline-size:calc(2.5rem*var(--scale-factor, 1))}.styles-module__bar--fOlLf{display:flex;flex-direction:column;justify-content:space-between;margin:calc(1.5rem*var(--scale-factor, 1)) calc(1.25rem*var(--scale-factor, 1)) calc(.625rem*var(--scale-factor, 1)) calc(1.25rem*var(--scale-factor, 1))}.styles-module__optionsTop--2jNbs,.styles-module__optionsBottom--PtwF4{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:calc(2rem*var(--scale-factor, 1))}.styles-module__option--MOGCu{display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:calc(2.75rem*var(--scale-factor, 1));height:calc(2.75rem*var(--scale-factor, 1));margin:0}.styles-module__option--MOGCu.styles-module__userOption--qGt5j{width:calc(2.5rem*var(--scale-factor, 1));height:calc(2.5rem*var(--scale-factor, 1));border-radius:50%;color:#003046;font-weight:500;background-color:#fff;cursor:pointer}.styles-module__option--MOGCu.styles-module__userOption--qGt5j:hover{background-color:#fff}.styles-module__option--MOGCu svg{margin:0;color:#003046}.styles-module__option--MOGCu:hover{background-color:#cbcbcb}.styles-module__option--MOGCu.styles-module__selected--avjSK{background-color:#fff}.styles-module__option--MOGCu.styles-module__selected--avjSK:hover{background-color:#fff}.styles-module__panel--bHhSv{display:flex;flex-direction:column;border-radius:calc(.25rem*var(--scale-factor, 1));margin-right:calc(.5rem*var(--scale-factor, 1));inline-size:inherit;background:var(--sidebar-panel-background)}.styles-module__panelWithFooter--5ItsY{padding-block-end:calc(2rem*var(--scale-factor, 1))}.styles-module__panelHeading--GRNt0{margin:0;font-size:calc(1.5rem*var(--scale-factor, 1));line-height:calc(2rem*var(--scale-factor, 1))}.styles-module__panelHeader--bAHfN{display:flex;flex-direction:column;gap:calc(1rem*var(--scale-factor, 1));padding-block-end:calc(1rem*var(--scale-factor, 1));margin-inline:calc(1rem*var(--scale-factor, 1));border-block-end:1px solid var(--sidebar-border)}.styles-module__panelContent--X7kot{flex:1;padding:calc(.75rem*var(--scale-factor, 1)) calc(1rem*var(--scale-factor, 1));overflow-y:auto;scrollbar-width:thin}.styles-module__panelButtons---y4S-{display:flex;flex-direction:column;gap:calc(1rem*var(--scale-factor, 1))}.styles-module__panelFooter--T1y-s{border-block-start:1px solid #d5d7dc;inset-block-end:0px;inline-size:100%;inline-size:-moz-available;inline-size:-webkit-stretch;inline-size:stretch;padding-inline:calc(1rem*var(--scale-factor, 1));background-color:#fff;border-end-end-radius:8px}
692
692
  :root{--rpf-white: #ffffff}.styles-module__row--XtAJr{position:relative;margin-bottom:calc(.25rem*var(--scale-factor, 1));--strong-guide-color: #33625e;--normal-guide-color: #e5e5e5;padding:1px}.styles-module__row--XtAJr::before{content:"";position:absolute;inset:calc(-1*.125rem*var(--scale-factor, 1));pointer-events:none;background-image:var(--guides-bg);background-position:var(--guides-pos);background-size:var(--guides-size);background-repeat:no-repeat}.styles-module__treeItem--kbyYk{display:flex;align-items:center;gap:calc(.5rem*var(--scale-factor, 1));text-align:left;position:relative;cursor:pointer}.styles-module__itemContent--663gn{width:100%;border-radius:4px;display:flex;align-items:center;gap:calc(.5rem*var(--scale-factor, 1));text-align:left;padding:calc(.25rem*var(--scale-factor, 1)) calc(.5rem*var(--scale-factor, 1))}.styles-module__itemContent--663gn:hover{background:#e5f6f1}.styles-module__itemContent--663gn:hover .styles-module__itemButton--oB91C{display:flex}.styles-module__itemTitle--a6Liw{width:100%}.styles-module__itemButton--oB91C{display:none}.styles-module__itemTitle--a6Liw{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.styles-module__itemFocused--SmUbE .styles-module__itemContent--663gn{background-color:#c5ffe8}.styles-module__itemFocused--SmUbE .styles-module__itemButton--oB91C{display:flex}.styles-module__level-0--5PVOR{padding-left:0px}.styles-module__level-1--vTMYv{padding-left:20px}.styles-module__level-2--Xx8Ie{padding-left:40px}.styles-module__level-3--ySuP4{padding-left:60px}.styles-module__level-4--7uciy{padding-left:80px}.styles-module__level-5--AEspR{padding-left:100px}.styles-module__level-6--c28W9{padding-left:120px}.styles-module__level-7--gU\+\+Q{padding-left:140px}.styles-module__level-8--dmg5P{padding-left:160px}.styles-module__level-9--X73V0{padding-left:180px}.styles-module__level-10--VAKPI{padding-left:200px}.styles-module__level-11--5rqim{padding-left:220px}.styles-module__level-12--8cLBy{padding-left:240px}.styles-module__level-13--qlzYN{padding-left:260px}.styles-module__level-14--Q7bCT{padding-left:280px}.styles-module__level-15---1KaW{padding-left:300px}.styles-module__level-16--BCkZb{padding-left:320px}.styles-module__level-17--tM3Ht{padding-left:340px}.styles-module__level-18--GkyjF{padding-left:360px}.styles-module__level-19--kxLhM{padding-left:380px}.styles-module__level-20--sIjDn{padding-left:400px}.styles-module__itemContentEdit--cNmeE{--border-width: 1px;width:100%;display:flex;align-items:center;gap:calc(.5rem*var(--scale-factor, 1));text-align:left;padding:calc(.25rem*var(--scale-factor, 1) - var(--border-width)) calc(.5rem*var(--scale-factor, 1) - var(--border-width));border-radius:4px;border:var(--border-width) solid #43d6b9}.styles-module__itemContentEdit--cNmeE input{border:none;font-size:calc(.75rem*var(--scale-factor, 1));line-height:calc(1rem*var(--scale-factor, 1))}.styles-module__itemContentEdit--cNmeE input:focus,.styles-module__itemContentEdit--cNmeE input:focus-visible{outline:none}.styles-module__inputError--zb21a{border-color:#e0201c}.styles-module__errorMessage--IT3hQ{position:absolute;top:100%;left:0;width:100%;padding:calc(.5rem*var(--scale-factor, 1));margin-top:calc(.25rem*var(--scale-factor, 1));border:1px solid #e0201c;border-radius:8px;background-color:#ffd5ce;color:#242424;z-index:600;display:flex;align-items:flex-start;gap:calc(.5rem*var(--scale-factor, 1))}.styles-module__errorMessage--IT3hQ svg{color:#e0201c}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gwchq-textjam",
3
3
  "description": "Embeddable React editor used in Raspberry Pi text-based projects.",
4
- "version": "0.2.1",
4
+ "version": "0.2.3",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/GirlsFirst/gwchq-textjam",
7
7
  "author": "Girls Who Code HQ",