gwchq-textjam 0.5.8 → 0.5.10

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
@@ -13337,11 +13337,11 @@ __webpack_require__.d(__webpack_exports__, {
13337
13337
  "default": () => (/* binding */ Button_Button)
13338
13338
  });
13339
13339
 
13340
- // EXTERNAL MODULE: ./node_modules/react-router-dom/dist/index.js + 2 modules
13341
- var dist = __webpack_require__(92648);
13342
13340
  // EXTERNAL MODULE: ./node_modules/classnames/index.js
13343
13341
  var classnames = __webpack_require__(46942);
13344
13342
  var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);
13343
+ // EXTERNAL MODULE: ./node_modules/react-router-dom/dist/index.js + 2 modules
13344
+ var dist = __webpack_require__(92648);
13345
13345
  ;// ./src/components/Button/styles.module.scss
13346
13346
  // extracted by mini-css-extract-plugin
13347
13347
  /* 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","btn":"styles-module__btn--0Px6W","btn--primary":"styles-module__btn--primary--k7oQ0","btn-outer":"styles-module__btn-outer--4KgkG","btn--secondary":"styles-module__btn--secondary--tK09f","btn--tertiary":"styles-module__btn--tertiary--jf5po","btn--tertiaryGray":"styles-module__btn--tertiaryGray--gFHKt","btn--danger":"styles-module__btn--danger--SmsoX","btn--small":"styles-module__btn--small--cJ2bM","btnOuter":"styles-module__btnOuter--ip64U","svgOnly":"styles-module__svgOnly--eXeyf","primary":"styles-module__primary--AeI1M","secondary":"styles-module__secondary--tAMJR","tertiary":"styles-module__tertiary--Kr5w9","tertiaryGray":"styles-module__tertiaryGray--gVUq6","iconed":"styles-module__iconed--AMs-c","icon":"styles-module__icon--C2jj1"});
@@ -13352,7 +13352,6 @@ var jsx_runtime_ = __webpack_require__(71178);
13352
13352
 
13353
13353
 
13354
13354
 
13355
-
13356
13355
  var Button = props => {
13357
13356
  var {
13358
13357
  className,
@@ -13371,7 +13370,8 @@ var Button = props => {
13371
13370
  label,
13372
13371
  buttonIconPosition = "left",
13373
13372
  variant,
13374
- style
13373
+ style,
13374
+ ariaLive
13375
13375
  } = props;
13376
13376
  var VARIANT_CLASSES = {
13377
13377
  icon: styles_module.icon,
@@ -13415,6 +13415,7 @@ var Button = props => {
13415
13415
  text: text,
13416
13416
  onClick: buttonOuter ? null : onButtonClick,
13417
13417
  onKeyDown: onKeyDown,
13418
+ "aria-live": ariaLive,
13418
13419
  children: [buttonImage && /*#__PURE__*/(0,jsx_runtime_.jsx)("img", {
13419
13420
  src: buttonImage,
13420
13421
  alt: buttonImageAltText,
@@ -48045,7 +48046,8 @@ var ShareProjectModal = () => {
48045
48046
  variant: "primary",
48046
48047
  onClickHandler: handleCopy,
48047
48048
  buttonText: isCopied ? "Copied!" : "Copy",
48048
- className: "".concat(ShareProjectModal_styles_module.copyButton, " ").concat(isCopied ? ShareProjectModal_styles_module.copyButtonSelected : "")
48049
+ className: "".concat(ShareProjectModal_styles_module.copyButton, " ").concat(isCopied ? ShareProjectModal_styles_module.copyButtonSelected : ""),
48050
+ ariaLive: "polite"
48049
48051
  })]
48050
48052
  })]
48051
48053
  })
@@ -62994,7 +62996,7 @@ __webpack_require__.r(__webpack_exports__);
62994
62996
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
62995
62997
  /* harmony export */ });
62996
62998
  // extracted by mini-css-extract-plugin
62997
- /* 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","row":"styles-module__row--XtAJr","treeItem":"styles-module__treeItem--kbyYk","itemContent":"styles-module__itemContent--663gn","itemTitle":"styles-module__itemTitle--a6Liw","itemButton":"styles-module__itemButton--oB91C","itemFocused":"styles-module__itemFocused--SmUbE","level-0":"styles-module__level-0--5PVOR","level-1":"styles-module__level-1--vTMYv","level-2":"styles-module__level-2--Xx8Ie","level-3":"styles-module__level-3--ySuP4","level-4":"styles-module__level-4--7uciy","level-5":"styles-module__level-5--AEspR","level-6":"styles-module__level-6--c28W9","level-7":"styles-module__level-7--gU++Q","level-8":"styles-module__level-8--dmg5P","level-9":"styles-module__level-9--X73V0","level-10":"styles-module__level-10--VAKPI","level-11":"styles-module__level-11--5rqim","level-12":"styles-module__level-12--8cLBy","level-13":"styles-module__level-13--qlzYN","level-14":"styles-module__level-14--Q7bCT","level-15":"styles-module__level-15---1KaW","level-16":"styles-module__level-16--BCkZb","level-17":"styles-module__level-17--tM3Ht","level-18":"styles-module__level-18--GkyjF","level-19":"styles-module__level-19--kxLhM","level-20":"styles-module__level-20--sIjDn","itemContentEdit":"styles-module__itemContentEdit--cNmeE","inputError":"styles-module__inputError--zb21a","errorMessage":"styles-module__errorMessage--IT3hQ","itemTooltip":"styles-module__itemTooltip--c5oiY"});
62999
+ /* 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","row":"styles-module__row--XtAJr","treeItem":"styles-module__treeItem--kbyYk","itemContent":"styles-module__itemContent--663gn","itemTitle":"styles-module__itemTitle--a6Liw","itemButton":"styles-module__itemButton--oB91C","itemSelected":"styles-module__itemSelected--JLLW5","itemFocused":"styles-module__itemFocused--SmUbE","level-0":"styles-module__level-0--5PVOR","level-1":"styles-module__level-1--vTMYv","level-2":"styles-module__level-2--Xx8Ie","level-3":"styles-module__level-3--ySuP4","level-4":"styles-module__level-4--7uciy","level-5":"styles-module__level-5--AEspR","level-6":"styles-module__level-6--c28W9","level-7":"styles-module__level-7--gU++Q","level-8":"styles-module__level-8--dmg5P","level-9":"styles-module__level-9--X73V0","level-10":"styles-module__level-10--VAKPI","level-11":"styles-module__level-11--5rqim","level-12":"styles-module__level-12--8cLBy","level-13":"styles-module__level-13--qlzYN","level-14":"styles-module__level-14--Q7bCT","level-15":"styles-module__level-15---1KaW","level-16":"styles-module__level-16--BCkZb","level-17":"styles-module__level-17--tM3Ht","level-18":"styles-module__level-18--GkyjF","level-19":"styles-module__level-19--kxLhM","level-20":"styles-module__level-20--sIjDn","itemContentEdit":"styles-module__itemContentEdit--cNmeE","inputError":"styles-module__inputError--zb21a","errorMessage":"styles-module__errorMessage--IT3hQ","itemTooltip":"styles-module__itemTooltip--c5oiY"});
62998
63000
 
62999
63001
  /***/ }),
63000
63002
 
@@ -82854,13 +82856,16 @@ const Text_1 = __webpack_require__(82803);
82854
82856
  const stores_1 = __webpack_require__(32132);
82855
82857
  const Tooltip_1 = __importDefault(__webpack_require__(26982));
82856
82858
  const useHover_1 = __webpack_require__(78556);
82857
- const FileTreeActions = ({ hasExpandedNodes, }) => {
82859
+ const FileTreeActions = ({ hasExpandedNodes, treeId, }) => {
82858
82860
  const { expandAll, collapseAll, createComponent, importFiles, importFolder } = (0, react_1.useContext)(FileTreeContext_1.TreeContext);
82859
82861
  const isReadOnly = (0, stores_1.useAppSelector)((state) => state.editor.readOnly);
82860
82862
  const { hovered: toggleHovered, hoverProps: toggleHoverProps } = (0, useHover_1.useHover)();
82861
82863
  const { hovered: addFolderHovered, hoverProps: addFolderHoverProps } = (0, useHover_1.useHover)();
82862
82864
  const { hovered: addFileHovered, hoverProps: addFileHoverProps } = (0, useHover_1.useHover)();
82863
- return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.fileTreeActions, children: [hasExpandedNodes ? ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.tooltipWrapper, ...toggleHoverProps, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", "aria-label": "Collapse all folders", onClick: collapseAll, className: styles_module_scss_1.default.iconButton, children: (0, jsx_runtime_1.jsx)(minus_circle_svg_1.default, { "aria-hidden": "true", focusable: "false" }) }), (0, jsx_runtime_1.jsx)(Tooltip_1.default, { message: "Collapse all folders", visible: toggleHovered, position: "bottom", strategy: "fixed", size: "fit" })] })) : ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.tooltipWrapper, ...toggleHoverProps, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", "aria-label": "Expand all folders", onClick: expandAll, className: styles_module_scss_1.default.iconButton, children: (0, jsx_runtime_1.jsx)(plus_circle_svg_1.default, { "aria-hidden": "true", focusable: "false" }) }), (0, jsx_runtime_1.jsx)(Tooltip_1.default, { message: "Expand all folders", visible: toggleHovered, position: "bottom", strategy: "fixed", size: "fit" })] })), (0, jsx_runtime_1.jsx)(Text_1.Text, { size: 12, weight: "medium", className: styles_module_scss_1.default.fileTreeActionsLabel, children: "Project files" }), !isReadOnly && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.tooltipWrapper, ...addFolderHoverProps, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", "aria-label": "Add folder", onClick: () => createComponent(ProjectTypes_1.ProjectComponentType.DIR), className: (0, classnames_1.default)([styles_module_scss_1.default.iconButtonFilled, styles_module_scss_1.default.iconButton]), children: (0, jsx_runtime_1.jsx)(add_folder_svg_1.default, { "aria-hidden": "true", focusable: "false" }) }), (0, jsx_runtime_1.jsx)(Tooltip_1.default, { message: "Add folder", visible: addFolderHovered, position: "bottom", strategy: "fixed", size: "fit" })] }), (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.tooltipWrapper, ...addFileHoverProps, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", "aria-label": "Add file", onClick: () => createComponent(ProjectTypes_1.ProjectComponentType.FILE), className: (0, classnames_1.default)([styles_module_scss_1.default.iconButtonFilled, styles_module_scss_1.default.iconButton]), children: (0, jsx_runtime_1.jsx)(add_file_svg_1.default, { "aria-hidden": "true", focusable: "false" }) }), (0, jsx_runtime_1.jsx)(Tooltip_1.default, { message: "Add file", visible: addFileHovered, position: "bottom", strategy: "fixed", size: "fit" })] }), (0, jsx_runtime_1.jsx)(ImportButton_1.ImportButton, { importFiles: importFiles, importFolder: importFolder })] }))] }));
82865
+ const toggleLabel = hasExpandedNodes
82866
+ ? "Collapse all folders"
82867
+ : "Expand all folders";
82868
+ return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.fileTreeActions, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.tooltipWrapper, ...toggleHoverProps, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", "aria-label": toggleLabel, "aria-expanded": hasExpandedNodes, "aria-controls": treeId, onClick: hasExpandedNodes ? collapseAll : expandAll, className: styles_module_scss_1.default.iconButton, children: hasExpandedNodes ? ((0, jsx_runtime_1.jsx)(minus_circle_svg_1.default, { "aria-hidden": "true", focusable: "false" })) : ((0, jsx_runtime_1.jsx)(plus_circle_svg_1.default, { "aria-hidden": "true", focusable: "false" })) }), (0, jsx_runtime_1.jsx)(Tooltip_1.default, { message: toggleLabel, visible: toggleHovered, position: "bottom", strategy: "fixed", size: "fit" })] }), (0, jsx_runtime_1.jsx)(Text_1.Text, { size: 12, weight: "medium", className: styles_module_scss_1.default.fileTreeActionsLabel, children: "Project files" }), !isReadOnly && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.tooltipWrapper, ...addFolderHoverProps, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", "aria-label": "Add folder", onClick: () => createComponent(ProjectTypes_1.ProjectComponentType.DIR), className: (0, classnames_1.default)([styles_module_scss_1.default.iconButtonFilled, styles_module_scss_1.default.iconButton]), children: (0, jsx_runtime_1.jsx)(add_folder_svg_1.default, { "aria-hidden": "true", focusable: "false" }) }), (0, jsx_runtime_1.jsx)(Tooltip_1.default, { message: "Add folder", visible: addFolderHovered, position: "bottom", strategy: "fixed", size: "fit" })] }), (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.tooltipWrapper, ...addFileHoverProps, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", "aria-label": "Add file", onClick: () => createComponent(ProjectTypes_1.ProjectComponentType.FILE), className: (0, classnames_1.default)([styles_module_scss_1.default.iconButtonFilled, styles_module_scss_1.default.iconButton]), children: (0, jsx_runtime_1.jsx)(add_file_svg_1.default, { "aria-hidden": "true", focusable: "false" }) }), (0, jsx_runtime_1.jsx)(Tooltip_1.default, { message: "Add file", visible: addFileHovered, position: "bottom", strategy: "fixed", size: "fit" })] }), (0, jsx_runtime_1.jsx)(ImportButton_1.ImportButton, { importFiles: importFiles, importFolder: importFolder })] }))] }));
82864
82869
  };
82865
82870
  exports.FileTreeActions = FileTreeActions;
82866
82871
 
@@ -82896,7 +82901,7 @@ const BasicItemContent = ({ item, onOpenMenu, isMenuOpen, triggerRef, }) => {
82896
82901
  return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.itemContent, onContextMenu: (e) => {
82897
82902
  e.preventDefault();
82898
82903
  onOpenMenu({ x: e.clientX, y: e.clientY });
82899
- }, children: [(0, jsx_runtime_1.jsx)(ItemIcon_1.ItemIcon, { itemData: itemData }), (0, jsx_runtime_1.jsx)(Text_1.Text, { className: styles_module_scss_1.default.itemTitle, size: 12, draggable: true, ...hoverProps, children: item.getItemName() }), !isSharedProject && ((0, jsx_runtime_1.jsx)("button", { ref: triggerRef, type: "button", className: styles_module_scss_1.default.itemButton, "aria-label": `More actions for ${item.getItemName()}`, "aria-haspopup": "menu", "aria-expanded": isMenuOpen, onClick: (e) => {
82904
+ }, children: [(0, jsx_runtime_1.jsx)(ItemIcon_1.ItemIcon, { itemData: itemData }), (0, jsx_runtime_1.jsx)(Text_1.Text, { className: styles_module_scss_1.default.itemTitle, size: 12, draggable: true, ...hoverProps, children: item.getItemName() }), !isSharedProject && ((0, jsx_runtime_1.jsx)("button", { ref: triggerRef, type: "button", tabIndex: -1, className: styles_module_scss_1.default.itemButton, "aria-label": `More actions for ${item.getItemName()}`, "aria-haspopup": "menu", "aria-expanded": isMenuOpen, onClick: (e) => {
82900
82905
  e.stopPropagation();
82901
82906
  // Anchor to the button's box, not the click point: a keyboard
82902
82907
  // activation reports clientX/Y of 0.
@@ -83231,16 +83236,35 @@ const FileTreeItem = ({ item, guides, activeLevel, isContextMenuAvailable, }) =>
83231
83236
  const handleCloseContextMenu = () => {
83232
83237
  setIsContextMenuOpen(false);
83233
83238
  setContextMenuPosition({ x: 0, y: 0 });
83234
- // On close, return focus to the trigger button but only if focus was
83235
- // lost (e.g. Escape), not when an action moved it (rename input, modal).
83239
+ // Back to the row, not the button, which is outside the tab order — but
83240
+ // only if focus was lost (Escape), not moved on purpose (rename, modal).
83236
83241
  requestAnimationFrame(() => {
83237
83242
  const active = document.activeElement;
83238
83243
  if (!active || active === document.body) {
83239
- triggerRef.current?.focus();
83244
+ item.setFocused();
83245
+ item.getElement()?.focus();
83240
83246
  }
83241
83247
  });
83242
83248
  };
83243
- return ((0, jsx_runtime_1.jsx)("div", { ...item.getProps(), className: (0, classnames_1.default)(styles_module_scss_1.default.row, styles_module_scss_1.default[`level-${level}`]), style: {
83249
+ // Keyboard route to the menu, which is out of the tab order.
83250
+ const handleKeyDown = (e) => {
83251
+ const isMenuKey = e.key === "ContextMenu" ||
83252
+ (e.shiftKey && e.key === "F10") ||
83253
+ (e.altKey && e.key === "ArrowDown");
83254
+ if (!isMenuKey)
83255
+ return;
83256
+ if (e.target !== e.currentTarget)
83257
+ return; // the row itself, not a child
83258
+ // no ⋯ button rendered, no keyboard menu either
83259
+ const trigger = triggerRef.current;
83260
+ if (!trigger)
83261
+ return;
83262
+ e.preventDefault();
83263
+ item.setFocused();
83264
+ const rect = trigger.getBoundingClientRect();
83265
+ handleOpenContextMenu({ x: rect.left, y: rect.bottom });
83266
+ };
83267
+ return ((0, jsx_runtime_1.jsx)("div", { ...item.getProps(), onKeyDown: handleKeyDown, className: (0, classnames_1.default)(styles_module_scss_1.default.row, styles_module_scss_1.default[`level-${level}`]), style: {
83244
83268
  ["--guides-bg"]: layers.join(","),
83245
83269
  ["--guides-pos"]: positions.join(","),
83246
83270
  ["--guides-size"]: sizes.join(","),
@@ -83411,12 +83435,9 @@ const useFileTree = ({ projectFiles, onRename, onDrop, onOpenFile, rootId, readO
83411
83435
  itemInstance: {
83412
83436
  getProps: ({ item, prev }) => {
83413
83437
  const isFolder = item.isFolder();
83414
- const state = item.isExpanded() ? "expanded" : "collapsed";
83415
83438
  return {
83416
83439
  ...prev?.(),
83417
- ...(isFolder && {
83418
- "aria-label": `${item.getItemName()}, ${state}`,
83419
- }),
83440
+ ...(isFolder && { "aria-expanded": item.isExpanded() }),
83420
83441
  onClick: () => {
83421
83442
  item.setFocused();
83422
83443
  item.primaryAction();
@@ -83509,6 +83530,7 @@ const EditorTypes_1 = __webpack_require__(42108);
83509
83530
  const projectHelpers_1 = __webpack_require__(2610);
83510
83531
  const ProjectTypes_1 = __webpack_require__(27130);
83511
83532
  const stores_1 = __webpack_require__(32132);
83533
+ const announce_1 = __webpack_require__(29331);
83512
83534
  const downloadContent_1 = __webpack_require__(9879);
83513
83535
  const editorFsThunks_1 = __webpack_require__(71862);
83514
83536
  /** Custom hook for action handlers on top headless-tree functionality */
@@ -83520,6 +83542,8 @@ const useFileTreeActions = () => {
83520
83542
  const dispatch = (0, react_redux_1.useDispatch)();
83521
83543
  // Creating component draft is local-only, not persisted in Redux
83522
83544
  const [draft, setDraft] = (0, react_1.useState)(null);
83545
+ // A created item still waiting to be focused, once it renders in place.
83546
+ const [pendingFocusId, setPendingFocusId] = (0, react_1.useState)(null);
83523
83547
  const openTreeFile = (0, react_1.useCallback)((id) => {
83524
83548
  const isTab = (tab) => tab.type === EditorTypes_1.OpenedTabType.FILE && tab.id === id;
83525
83549
  const fileIndex = openedTabs.findIndex(isTab);
@@ -83647,13 +83671,37 @@ const useFileTreeActions = () => {
83647
83671
  const item = tree.getRenamingItem();
83648
83672
  if (!item)
83649
83673
  return;
83674
+ const id = item.getId();
83675
+ const isDraft = Boolean(draft && draft.id === id);
83650
83676
  // If any draft that is being created
83651
- if (draft && draft.id === item.getId()) {
83677
+ if (draft && isDraft) {
83652
83678
  const data = item.getItemData();
83653
83679
  saveNewComponent(data, draft.parentId);
83654
83680
  }
83655
83681
  tree.completeRenaming();
83656
- }, [tree, draft, saveNewComponent]);
83682
+ if (isDraft) {
83683
+ setPendingFocusId(id);
83684
+ return;
83685
+ }
83686
+ setFocusedItem(id);
83687
+ const renamedRow = tree.getItemInstance(id)?.getElement();
83688
+ if (renamedRow)
83689
+ (0, announce_1.describeFocusTarget)(renamedRow);
83690
+ }, [tree, draft, saveNewComponent, setFocusedItem]);
83691
+ // Runs on the render that first places a created item in its sorted position.
83692
+ (0, react_1.useEffect)(() => {
83693
+ if (!pendingFocusId)
83694
+ return;
83695
+ const element = tree.getItemInstance(pendingFocusId)?.getElement();
83696
+ if (!element?.isConnected)
83697
+ return;
83698
+ setPendingFocusId(null);
83699
+ setFocusedItem(pendingFocusId);
83700
+ if (document.activeElement === element)
83701
+ element.blur();
83702
+ (0, announce_1.describeFocusTarget)(element);
83703
+ element.focus();
83704
+ }, [pendingFocusId, projectComponents, tree, setFocusedItem]);
83657
83705
  const removeComponent = (0, react_1.useCallback)((id) => {
83658
83706
  const item = tree.getItemInstance(id);
83659
83707
  if (!item)
@@ -83699,6 +83747,7 @@ const FileTreeContext_1 = __webpack_require__(5323);
83699
83747
  const treeGuides_1 = __webpack_require__(35258);
83700
83748
  const EmptyStateMessage_1 = __webpack_require__(34898);
83701
83749
  const FileTree = () => {
83750
+ const treeId = (0, react_1.useId)();
83702
83751
  const projectComponents = (0, stores_1.useAppSelector)((state) => state.editor.project.components);
83703
83752
  const focussedFileIndex = (0, stores_1.useAppSelector)((state) => state.editor.focussedFileIndex);
83704
83753
  const openFiles = (0, stores_1.useAppSelector)((state) => state.editor.openedTabs);
@@ -83707,19 +83756,42 @@ const FileTree = () => {
83707
83756
  const treeItems = tree.getItems();
83708
83757
  const guidesByIndex = (0, treeGuides_1.getGuidesByIndex)(treeItems);
83709
83758
  const activeLevel = (0, treeGuides_1.getActiveLevel)(treeItems.find((it) => it.getId() === focusedItem) ?? null);
83710
- // Sync focused file in editor with focused item in tree
83759
+ // Selection, not focus: focus carries the tree's single tab stop, so pointing
83760
+ // it at the open file would make Tab land there instead of at the top.
83711
83761
  (0, react_1.useEffect)(() => {
83712
83762
  if (!openFiles || focussedFileIndex === undefined)
83713
83763
  return;
83714
83764
  const tab = openFiles[focussedFileIndex];
83715
- const focusedFileId = tab?.type === EditorTypes_1.OpenedTabType.FILE ? tab.id : undefined;
83716
- const projectFile = projectComponents.find((c) => c.id === focusedFileId);
83717
- if (projectFile && projectFile.id !== focusedItem) {
83718
- setFocusedItem(projectFile.id);
83719
- }
83765
+ const openFileId = tab?.type === EditorTypes_1.OpenedTabType.FILE ? tab.id : undefined;
83766
+ const projectFile = projectComponents.find((c) => c.id === openFileId);
83767
+ tree.setSelectedItems(projectFile ? [projectFile.id] : []);
83720
83768
  // react only to focussedFileIndex and openFiles changes
83721
83769
  // eslint-disable-next-line react-hooks/exhaustive-deps
83722
- }, [focussedFileIndex, openFiles, setFocusedItem]);
83770
+ }, [focussedFileIndex, openFiles]);
83771
+ // Collapsing a folder hides whatever was focused inside it, and a focusedItem
83772
+ // matching no rendered row drops the whole tree out of the tab order.
83773
+ (0, react_1.useEffect)(() => {
83774
+ if (focusedItem === null)
83775
+ return;
83776
+ if (treeItems.some((item) => item.getId() === focusedItem))
83777
+ return;
83778
+ setFocusedItem(null);
83779
+ }, [treeItems, focusedItem, setFocusedItem]);
83780
+ // The tab stop lives on focusedItem, which is remembered — so without this
83781
+ // every entry after the first lands on the focused item, not first one.
83782
+ const handleFocusLeavingTree = (event) => {
83783
+ const movedTo = event.relatedTarget;
83784
+ if (movedTo && event.currentTarget.contains(movedTo))
83785
+ return; // still inside
83786
+ // A missing relatedTarget can also mean the rename input just unmounted, so
83787
+ // wait a frame and clear only if focus really landed outside the tree.
83788
+ const container = event.currentTarget;
83789
+ requestAnimationFrame(() => {
83790
+ if (container.contains(document.activeElement))
83791
+ return;
83792
+ setFocusedItem(null);
83793
+ });
83794
+ };
83723
83795
  const treeCtx = {
83724
83796
  createComponent,
83725
83797
  cancelRenaming,
@@ -83734,7 +83806,7 @@ const FileTree = () => {
83734
83806
  removeComponent,
83735
83807
  importFolder,
83736
83808
  };
83737
- return ((0, jsx_runtime_1.jsxs)(FileTreeContext_1.TreeContext.Provider, { value: treeCtx, children: [(0, jsx_runtime_1.jsx)(FileTreeActions_1.FileTreeActions, { hasExpandedNodes: Boolean(tree.getState().expandedItems.length) }), treeItems.length > 0 ? ((0, jsx_runtime_1.jsxs)("div", { ...tree.getContainerProps("Project files"), className: styles_module_scss_1.default.tree, children: [treeItems.map((item, i) => ((0, jsx_runtime_1.jsx)(FileTreeItem_1.FileTreeItem, { item: item, guides: guidesByIndex[i], activeLevel: activeLevel, isContextMenuAvailable: !isReadOnly }, item.getId()))), (0, jsx_runtime_1.jsx)("div", { style: tree.getDragLineStyle(), className: styles_module_scss_1.default.dragline })] })) : ((0, jsx_runtime_1.jsx)(EmptyStateMessage_1.EmptyStateMessage, {}))] }));
83809
+ return ((0, jsx_runtime_1.jsxs)(FileTreeContext_1.TreeContext.Provider, { value: treeCtx, children: [(0, jsx_runtime_1.jsx)(FileTreeActions_1.FileTreeActions, { hasExpandedNodes: Boolean(tree.getState().expandedItems.length), treeId: treeItems.length > 0 ? treeId : undefined }), treeItems.length > 0 ? ((0, jsx_runtime_1.jsxs)("div", { ...tree.getContainerProps("Project files"), id: treeId, onBlur: handleFocusLeavingTree, className: styles_module_scss_1.default.tree, children: [treeItems.map((item, i) => ((0, jsx_runtime_1.jsx)(FileTreeItem_1.FileTreeItem, { item: item, guides: guidesByIndex[i], activeLevel: activeLevel, isContextMenuAvailable: !isReadOnly }, item.getId()))), (0, jsx_runtime_1.jsx)("div", { style: tree.getDragLineStyle(), className: styles_module_scss_1.default.dragline })] })) : ((0, jsx_runtime_1.jsx)(EmptyStateMessage_1.EmptyStateMessage, {}))] }));
83738
83810
  };
83739
83811
  exports.FileTree = FileTree;
83740
83812
 
@@ -87348,6 +87420,7 @@ exports["default"] = exports.UserSlice.reducer;
87348
87420
  Object.defineProperty(exports, "__esModule", ({ value: true }));
87349
87421
  exports.fsImportFolder = exports.fsImportFiles = exports.fsRemove = exports.fsAdd = exports.fsMove = exports.fsRename = void 0;
87350
87422
  const sendToast_1 = __webpack_require__(50068);
87423
+ const announce_1 = __webpack_require__(29331);
87351
87424
  const fileValidation_1 = __webpack_require__(59615);
87352
87425
  const planners_1 = __webpack_require__(5819);
87353
87426
  const utils_1 = __webpack_require__(33321);
@@ -87355,6 +87428,7 @@ const constants_1 = __webpack_require__(16287);
87355
87428
  const EditorTypes_1 = __webpack_require__(42108);
87356
87429
  const ProjectTypes_1 = __webpack_require__(27130);
87357
87430
  const macSystemFiles_1 = __webpack_require__(18213);
87431
+ const projectHelpers_1 = __webpack_require__(2610);
87358
87432
  const EditorSlice_1 = __webpack_require__(68512);
87359
87433
  const selectComponents = (state) => {
87360
87434
  return state.editor.project.components ?? [];
@@ -87368,6 +87442,30 @@ const DELETE_SUCCESS_TOAST = {
87368
87442
  [ProjectTypes_1.ProjectComponentType.DIR]: "The folder has been successfully deleted.",
87369
87443
  [ProjectTypes_1.ProjectComponentType.FILE]: "The file has been successfully deleted.",
87370
87444
  };
87445
+ // Screen-reader copy: shorter and single-line than the toasts.
87446
+ const kindOf = (component) => component.type === ProjectTypes_1.ProjectComponentType.DIR ? "Folder" : "File";
87447
+ const fileCount = (count) => `${count} ${count === 1 ? "file" : "files"}`;
87448
+ const withDuplicates = (summary, hasDuplicates) => hasDuplicates ? `${summary} Duplicate names were renamed.` : summary;
87449
+ const filesUploadedMessage = (uploaded, total, hasDuplicates, singleName) => {
87450
+ if (uploaded === 0) {
87451
+ return `Upload failed. ${fileCount(total)} could not be uploaded.`;
87452
+ }
87453
+ if (uploaded < total) {
87454
+ return withDuplicates(`${uploaded} of ${fileCount(total)} uploaded, ${total - uploaded} failed.`, hasDuplicates);
87455
+ }
87456
+ const summary = uploaded === 1 && singleName
87457
+ ? `${singleName} uploaded.`
87458
+ : `${fileCount(uploaded)} uploaded.`;
87459
+ return withDuplicates(summary, hasDuplicates);
87460
+ };
87461
+ const folderUploadedMessage = (folderName, uploaded, total, hasDuplicates) => {
87462
+ if (uploaded === 0)
87463
+ return `Folder ${folderName} could not be uploaded.`;
87464
+ const summary = uploaded === total
87465
+ ? `Folder ${folderName} uploaded with ${fileCount(uploaded)}.`
87466
+ : `Folder ${folderName} uploaded with ${uploaded} of ${fileCount(total)}, ${total - uploaded} failed.`;
87467
+ return withDuplicates(summary, hasDuplicates);
87468
+ };
87371
87469
  const hasCaseInsensitiveDuplicateNames = (files) => {
87372
87470
  const seen = new Set();
87373
87471
  for (const file of files) {
@@ -87383,8 +87481,16 @@ const fsRename = ({ id, parentId, newName, }) => (dispatch, getState) => {
87383
87481
  const state = getState();
87384
87482
  const components = selectComponents(state);
87385
87483
  const componentsMap = (0, utils_1.buildComponentsById)(components);
87484
+ const component = componentsMap.get(id);
87386
87485
  const patch = (0, planners_1.planRename)(id, parentId, newName, componentsMap);
87387
87486
  dispatch((0, EditorSlice_1.applyComponentsPatch)(patch));
87487
+ if (!component)
87488
+ return;
87489
+ // The tree creates items nameless and names them through this rename, so an
87490
+ // empty previous name means a create.
87491
+ (0, announce_1.announce)(component.name
87492
+ ? `${(0, projectHelpers_1.getFullComponentName)(component)} renamed to ${newName}`
87493
+ : `${kindOf(component)} ${newName} created`);
87388
87494
  };
87389
87495
  exports.fsRename = fsRename;
87390
87496
  const fsMove = ({ id, parentId }) => (dispatch, getState) => {
@@ -87392,8 +87498,15 @@ const fsMove = ({ id, parentId }) => (dispatch, getState) => {
87392
87498
  const components = selectComponents(state);
87393
87499
  const componentsMap = (0, utils_1.buildComponentsById)(components);
87394
87500
  const parentByChildId = (0, utils_1.buildParentByChildId)(components);
87501
+ const destination = componentsMap.get(parentId);
87395
87502
  const patch = (0, planners_1.planMove)(id, parentId, componentsMap, parentByChildId);
87396
87503
  dispatch((0, EditorSlice_1.applyComponentsPatch)(patch));
87504
+ // Absent from the patch means nothing moved. Use the planned name: it may
87505
+ // have been made unique in the new parent.
87506
+ const moved = patch.upsert.find((component) => component.id === id);
87507
+ if (moved && destination) {
87508
+ (0, announce_1.announce)(`${(0, projectHelpers_1.getFullComponentName)(moved)} moved to ${destination.name || "the project root"}`);
87509
+ }
87397
87510
  };
87398
87511
  exports.fsMove = fsMove;
87399
87512
  const fsAdd = ({ component, parentId, }) => (dispatch, getState) => {
@@ -87402,6 +87515,7 @@ const fsAdd = ({ component, parentId, }) => (dispatch, getState) => {
87402
87515
  if (component.type === ProjectTypes_1.ProjectComponentType.FILE &&
87403
87516
  !(0, utils_1.validateProjectFilesCount)(components, 1)) {
87404
87517
  (0, sendToast_1.showError)(filesCountErrorMessage);
87518
+ (0, announce_1.announce)(filesCountErrorMessage);
87405
87519
  return;
87406
87520
  }
87407
87521
  const componentsMap = (0, utils_1.buildComponentsById)(components);
@@ -87410,6 +87524,7 @@ const fsAdd = ({ component, parentId, }) => (dispatch, getState) => {
87410
87524
  if (component.type === ProjectTypes_1.ProjectComponentType.FILE) {
87411
87525
  dispatch((0, EditorSlice_1.openFile)({ id: component.id }));
87412
87526
  }
87527
+ // Silent: the draft is nameless here, and fsRename announces the create.
87413
87528
  };
87414
87529
  exports.fsAdd = fsAdd;
87415
87530
  const fsRemove = (id) => (dispatch, getState) => {
@@ -87427,8 +87542,10 @@ const fsRemove = (id) => (dispatch, getState) => {
87427
87542
  dispatch((0, EditorSlice_1.closeFile)({ id }));
87428
87543
  });
87429
87544
  dispatch((0, EditorSlice_1.applyComponentsPatch)(patch));
87430
- if (component)
87545
+ if (component) {
87431
87546
  (0, sendToast_1.showSuccess)(DELETE_SUCCESS_TOAST[component.type]);
87547
+ (0, announce_1.announce)(`${kindOf(component)} ${(0, projectHelpers_1.getFullComponentName)(component)} deleted`);
87548
+ }
87432
87549
  };
87433
87550
  exports.fsRemove = fsRemove;
87434
87551
  const fsImportFiles = ({ files, parentId }) => async (dispatch, getState) => {
@@ -87440,10 +87557,12 @@ const fsImportFiles = ({ files, parentId }) => async (dispatch, getState) => {
87440
87557
  return;
87441
87558
  if (!(0, utils_1.validateProjectFilesCount)(components, importableFiles.length)) {
87442
87559
  (0, sendToast_1.showError)(filesCountErrorMessage);
87560
+ (0, announce_1.announce)(filesCountErrorMessage);
87443
87561
  return;
87444
87562
  }
87445
87563
  const { validFiles, importErrors } = (0, fileValidation_1.validateFiles)(importableFiles);
87446
87564
  const hasDuplicates = hasCaseInsensitiveDuplicateNames(validFiles);
87565
+ const summary = filesUploadedMessage(validFiles.length, importableFiles.length, hasDuplicates, validFiles[0]?.name);
87447
87566
  if (validFiles.length > 0) {
87448
87567
  (0, sendToast_1.showSuccess)(`Selected files uploaded successfully.\n${validFiles.length} of ${importableFiles.length} file(s) uploaded.`);
87449
87568
  if (hasDuplicates) {
@@ -87452,6 +87571,7 @@ const fsImportFiles = ({ files, parentId }) => async (dispatch, getState) => {
87452
87571
  }
87453
87572
  else {
87454
87573
  (0, sendToast_1.showError)(`Selected files couldn’t be uploaded.\n${importableFiles.length} file(s) failed to upload.`);
87574
+ (0, announce_1.announce)(summary);
87455
87575
  }
87456
87576
  for (const error of importErrors) {
87457
87577
  (0, sendToast_1.showError)(error.reason);
@@ -87466,6 +87586,7 @@ const fsImportFiles = ({ files, parentId }) => async (dispatch, getState) => {
87466
87586
  dispatch((0, EditorSlice_1.queueBinaryWrites)({
87467
87587
  writes: binaryWrites,
87468
87588
  }));
87589
+ (0, announce_1.announce)(summary);
87469
87590
  };
87470
87591
  exports.fsImportFiles = fsImportFiles;
87471
87592
  const fsImportFolder = ({ files, parentId }) => async (dispatch, getState) => {
@@ -87479,11 +87600,13 @@ const fsImportFolder = ({ files, parentId }) => async (dispatch, getState) => {
87479
87600
  return;
87480
87601
  if (!(0, utils_1.validateProjectFilesCount)(components, importableFiles.length)) {
87481
87602
  (0, sendToast_1.showError)(filesCountErrorMessage);
87603
+ (0, announce_1.announce)(filesCountErrorMessage);
87482
87604
  return;
87483
87605
  }
87484
87606
  const folderName = importableFiles[0]?.webkitRelativePath?.split("/")[0];
87485
87607
  const { validFiles, importErrors } = (0, fileValidation_1.validateFiles)(importableFiles);
87486
87608
  const hasDuplicates = hasCaseInsensitiveDuplicateNames(validFiles);
87609
+ const summary = folderUploadedMessage(folderName ?? "", validFiles.length, importableFiles.length, hasDuplicates);
87487
87610
  if (validFiles.length > 0) {
87488
87611
  (0, sendToast_1.showSuccess)(`Folder '${folderName}' upload complete.\n${validFiles.length} of ${importableFiles.length} file(s) uploaded successfully.`);
87489
87612
  if (hasDuplicates) {
@@ -87492,6 +87615,7 @@ const fsImportFolder = ({ files, parentId }) => async (dispatch, getState) => {
87492
87615
  }
87493
87616
  else {
87494
87617
  (0, sendToast_1.showError)(`'${folderName}' folder couldn't be uploaded.\n${importableFiles.length} file(s) failed to upload.`);
87618
+ (0, announce_1.announce)(summary);
87495
87619
  }
87496
87620
  for (const error of importErrors) {
87497
87621
  (0, sendToast_1.showError)(error.reason);
@@ -87509,6 +87633,7 @@ const fsImportFolder = ({ files, parentId }) => async (dispatch, getState) => {
87509
87633
  dispatch((0, EditorSlice_1.queueBinaryWrites)({
87510
87634
  writes: binaryWrites,
87511
87635
  }));
87636
+ (0, announce_1.announce)(summary);
87512
87637
  };
87513
87638
  exports.fsImportFolder = fsImportFolder;
87514
87639
 
@@ -88040,6 +88165,115 @@ class LeaveGuardController {
88040
88165
  exports.LeaveGuardController = LeaveGuardController;
88041
88166
 
88042
88167
 
88168
+ /***/ }),
88169
+
88170
+ /***/ 29331:
88171
+ /***/ ((__unused_webpack_module, exports) => {
88172
+
88173
+
88174
+ /**
88175
+ * Screen-reader status messages. Two rules: a message must
88176
+ * be a node inserted into a region already on the page, and a live region is
88177
+ * never heard while focus moves - hence describeFocusTarget().
88178
+ */
88179
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
88180
+ exports.resetAnnouncements = exports.describeFocusTarget = exports.announce = exports.FOCUS_SETTLE_MS = void 0;
88181
+ // How long a message waits for a focus target to claim it.
88182
+ exports.FOCUS_SETTLE_MS = 150;
88183
+ // How long a message stays in the DOM once read.
88184
+ const MESSAGE_TTL_MS = 5000;
88185
+ const HIDDEN_STYLE = "position:absolute;inline-size:1px;block-size:1px;margin:-1px;padding:0;" +
88186
+ "overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0";
88187
+ let live = null;
88188
+ // Not a live region: holds text referenced by aria-describedby.
88189
+ let descriptions = null;
88190
+ let pending = null;
88191
+ let claimable = null;
88192
+ let descriptionCount = 0;
88193
+ const mount = () => {
88194
+ if (live)
88195
+ return;
88196
+ const host = document.createElement("div");
88197
+ host.setAttribute("style", HIDDEN_STYLE);
88198
+ live = document.createElement("div");
88199
+ live.setAttribute("role", "alert");
88200
+ live.setAttribute("aria-live", "assertive");
88201
+ descriptions = document.createElement("div");
88202
+ host.append(live, descriptions);
88203
+ document.body.appendChild(host);
88204
+ };
88205
+ if (typeof document !== "undefined") {
88206
+ if (document.body)
88207
+ mount();
88208
+ else
88209
+ document.addEventListener("DOMContentLoaded", mount, { once: true });
88210
+ }
88211
+ const announce = (message) => {
88212
+ const text = message.replace(/\s+/g, " ").trim();
88213
+ if (!text)
88214
+ return;
88215
+ claimable = text;
88216
+ if (pending)
88217
+ clearTimeout(pending);
88218
+ pending = setTimeout(() => {
88219
+ pending = null;
88220
+ if (claimable === null || !live)
88221
+ return;
88222
+ const node = document.createElement("div");
88223
+ node.textContent = claimable;
88224
+ claimable = null;
88225
+ live.appendChild(node);
88226
+ setTimeout(() => node.remove(), MESSAGE_TTL_MS);
88227
+ }, exports.FOCUS_SETTLE_MS);
88228
+ };
88229
+ exports.announce = announce;
88230
+ const describeFocusTarget = (element) => {
88231
+ if (claimable === null || !descriptions)
88232
+ return;
88233
+ const text = claimable;
88234
+ claimable = null;
88235
+ if (pending) {
88236
+ clearTimeout(pending);
88237
+ pending = null;
88238
+ }
88239
+ const id = `textjam-status-${(descriptionCount += 1)}`;
88240
+ const node = document.createElement("div");
88241
+ node.id = id;
88242
+ node.textContent = text;
88243
+ descriptions.appendChild(node);
88244
+ element.setAttribute("aria-describedby", [element.getAttribute("aria-describedby"), id].filter(Boolean).join(" "));
88245
+ // Only describes the action just taken, so drop it on blur.
88246
+ const cleanup = () => {
88247
+ if (!node.isConnected)
88248
+ return;
88249
+ element.removeEventListener("blur", cleanup);
88250
+ const next = (element.getAttribute("aria-describedby") ?? "")
88251
+ .split(/\s+/)
88252
+ .filter(Boolean)
88253
+ .filter((token) => token !== id)
88254
+ .join(" ");
88255
+ if (next)
88256
+ element.setAttribute("aria-describedby", next);
88257
+ else
88258
+ element.removeAttribute("aria-describedby");
88259
+ node.remove();
88260
+ };
88261
+ element.addEventListener("blur", cleanup);
88262
+ setTimeout(cleanup, MESSAGE_TTL_MS);
88263
+ };
88264
+ exports.describeFocusTarget = describeFocusTarget;
88265
+ /** Test helper: empties the regions and drops any pending message. */
88266
+ const resetAnnouncements = () => {
88267
+ if (pending)
88268
+ clearTimeout(pending);
88269
+ pending = null;
88270
+ claimable = null;
88271
+ live?.replaceChildren();
88272
+ descriptions?.replaceChildren();
88273
+ };
88274
+ exports.resetAnnouncements = resetAnnouncements;
88275
+
88276
+
88043
88277
  /***/ }),
88044
88278
 
88045
88279
  /***/ 5060:
package/dist/style.css CHANGED
@@ -690,7 +690,7 @@
690
690
  :root{--rpf-white: #ffffff}.styles-module__wrapper--NmEQI{display:flex;align-items:center;gap:calc(.5rem*var(--scale-factor, 1))}.styles-module__tooltipAnchor--nyFj4{position:relative}.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:699}.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.75rem*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;min-inline-size:0;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
  .resizable-with-handle__handle>div{position:relative;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,0) !important}.resizable-with-handle__bar{display:block;background:var(--editor-color-text-secondary);border-radius:999px;pointer-events:auto}.resizable-with-handle__bar:focus{outline:none}.resizable-with-handle__bar:focus-visible{outline:2px auto Highlight;outline:2px auto -webkit-focus-ring-color;outline-offset:-1px}.resizable-with-handle__handle--right>div{inset-inline-end:3px !important}.resizable-with-handle__bar--right,.resizable-with-handle__bar--left{inline-size:4px;block-size:128px}.resizable-with-handle__handle--bottom>div{inset-block-end:3px !important}.resizable-with-handle__bar--bottom,.resizable-with-handle__bar--top{inline-size:128px;block-size:4px}
692
692
  :root{--rpf-white: #ffffff}.styles-module__sidebar--Fu5Qi{display:flex;position:relative;scrollbar-width:none}.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;inline-size:calc(2.75rem*var(--scale-factor, 1));block-size:calc(2.75rem*var(--scale-factor, 1));margin:0}.styles-module__option--MOGCu.styles-module__userOption--qGt5j{inline-size:calc(2.5rem*var(--scale-factor, 1));block-size: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__optionTooltipWrapper--7BqNv{position:relative}.styles-module__optionTooltip--wNPIN{inset-block-start:50%;inset-inline-start:100%;margin-inline-start:calc(.5rem*var(--scale-factor, 1));transform:translateY(-50%)}.styles-module__panel--bHhSv{display:flex;flex-direction:column;border-radius:calc(.5rem*var(--scale-factor, 1));box-shadow:0px 4px 20px 0px rgba(0,0,0,.15);margin-inline-end:calc(.625rem*var(--scale-factor, 1));inline-size:inherit;background:var(--sidebar-panel-background)}.styles-module__panelsColumn--3qf\+3{display:flex;flex-direction:column;margin-inline-end:calc(.625rem*var(--scale-factor, 1))}.styles-module__panelsColumn--3qf\+3 .styles-module__panel--bHhSv{margin-inline-end:0;inline-size:100%;block-size:100%;min-block-size:0}.styles-module__panelsColumnTop--OKT\+V{min-block-size:0;margin-block-end:calc(.625rem*var(--scale-factor, 1))}.styles-module__panelsColumnTop--OKT\+V .resizable-with-handle__handle--bottom>div{inset-block-end:calc(-1*calc(0.625rem * var(--scale-factor, 1))) !important}.styles-module__panelsColumnFill--v\+VWp{display:flex;flex-direction:column;flex:1;min-block-size:0}.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}
693
- :root{--rpf-white: #ffffff}.styles-module__row--XtAJr{position:relative;margin-block-end: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:start;position:relative;cursor:pointer}.styles-module__itemContent--663gn{inline-size:100%;border-radius:4px;display:flex;align-items:center;gap:calc(.5rem*var(--scale-factor, 1));text-align:start;padding:calc(.25rem*var(--scale-factor, 1)) calc(.5rem*var(--scale-factor, 1))}.styles-module__itemContent--663gn:hover{background:#e5f6f1}.styles-module__itemTitle--a6Liw{inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.styles-module__itemButton--oB91C{display:none;padding:0;border:none;background:none;color:inherit;cursor:pointer}.styles-module__itemButton--oB91C:focus-visible{outline:none}.styles-module__itemFocused--SmUbE .styles-module__itemContent--663gn{background-color:#c5ffe8}.styles-module__itemFocused--SmUbE .styles-module__itemButton--oB91C{display:flex}.styles-module__itemContent--663gn:hover .styles-module__itemButton--oB91C,.styles-module__itemContent--663gn:focus-within .styles-module__itemButton--oB91C{display:flex}.styles-module__level-0--5PVOR{padding-inline-start:0px}.styles-module__level-1--vTMYv{padding-inline-start:20px}.styles-module__level-2--Xx8Ie{padding-inline-start:40px}.styles-module__level-3--ySuP4{padding-inline-start:60px}.styles-module__level-4--7uciy{padding-inline-start:80px}.styles-module__level-5--AEspR{padding-inline-start:100px}.styles-module__level-6--c28W9{padding-inline-start:120px}.styles-module__level-7--gU\+\+Q{padding-inline-start:140px}.styles-module__level-8--dmg5P{padding-inline-start:160px}.styles-module__level-9--X73V0{padding-inline-start:180px}.styles-module__level-10--VAKPI{padding-inline-start:200px}.styles-module__level-11--5rqim{padding-inline-start:220px}.styles-module__level-12--8cLBy{padding-inline-start:240px}.styles-module__level-13--qlzYN{padding-inline-start:260px}.styles-module__level-14--Q7bCT{padding-inline-start:280px}.styles-module__level-15---1KaW{padding-inline-start:300px}.styles-module__level-16--BCkZb{padding-inline-start:320px}.styles-module__level-17--tM3Ht{padding-inline-start:340px}.styles-module__level-18--GkyjF{padding-inline-start:360px}.styles-module__level-19--kxLhM{padding-inline-start:380px}.styles-module__level-20--sIjDn{padding-inline-start:400px}.styles-module__itemContentEdit--cNmeE{--border-width: 1px;inline-size:100%;display:flex;align-items:center;gap:calc(.5rem*var(--scale-factor, 1));text-align:start;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;inset-block-start:100%;inset-inline-start:0;inline-size:100%;padding:calc(.5rem*var(--scale-factor, 1));margin-block-start:calc(.25rem*var(--scale-factor, 1));border:1px solid #e0201c;border-radius:8px;background-color:#ffd5ce;color:#242424;z-index:650;display:flex;align-items:flex-start;gap:calc(.5rem*var(--scale-factor, 1))}.styles-module__errorMessage--IT3hQ svg{color:#e0201c}.styles-module__itemTooltip--c5oiY{min-inline-size:auto}
693
+ :root{--rpf-white: #ffffff}.styles-module__row--XtAJr{position:relative;margin-block-end: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:start;position:relative;cursor:pointer}.styles-module__itemContent--663gn{inline-size:100%;border-radius:4px;display:flex;align-items:center;gap:calc(.5rem*var(--scale-factor, 1));text-align:start;padding:calc(.25rem*var(--scale-factor, 1)) calc(.5rem*var(--scale-factor, 1))}.styles-module__itemContent--663gn:hover{background:#e5f6f1}.styles-module__itemTitle--a6Liw{inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.styles-module__itemButton--oB91C{display:none;padding:0;border:none;background:none;color:inherit;cursor:pointer}.styles-module__itemButton--oB91C:focus-visible{outline:none}.styles-module__itemSelected--JLLW5 .styles-module__itemContent--663gn{background-color:#c5ffe8}.styles-module__itemSelected--JLLW5 .styles-module__itemButton--oB91C,.styles-module__itemFocused--SmUbE .styles-module__itemButton--oB91C{display:flex}.styles-module__itemContent--663gn:hover .styles-module__itemButton--oB91C,.styles-module__itemContent--663gn:focus-within .styles-module__itemButton--oB91C{display:flex}.styles-module__level-0--5PVOR{padding-inline-start:0px}.styles-module__level-1--vTMYv{padding-inline-start:20px}.styles-module__level-2--Xx8Ie{padding-inline-start:40px}.styles-module__level-3--ySuP4{padding-inline-start:60px}.styles-module__level-4--7uciy{padding-inline-start:80px}.styles-module__level-5--AEspR{padding-inline-start:100px}.styles-module__level-6--c28W9{padding-inline-start:120px}.styles-module__level-7--gU\+\+Q{padding-inline-start:140px}.styles-module__level-8--dmg5P{padding-inline-start:160px}.styles-module__level-9--X73V0{padding-inline-start:180px}.styles-module__level-10--VAKPI{padding-inline-start:200px}.styles-module__level-11--5rqim{padding-inline-start:220px}.styles-module__level-12--8cLBy{padding-inline-start:240px}.styles-module__level-13--qlzYN{padding-inline-start:260px}.styles-module__level-14--Q7bCT{padding-inline-start:280px}.styles-module__level-15---1KaW{padding-inline-start:300px}.styles-module__level-16--BCkZb{padding-inline-start:320px}.styles-module__level-17--tM3Ht{padding-inline-start:340px}.styles-module__level-18--GkyjF{padding-inline-start:360px}.styles-module__level-19--kxLhM{padding-inline-start:380px}.styles-module__level-20--sIjDn{padding-inline-start:400px}.styles-module__itemContentEdit--cNmeE{--border-width: 1px;inline-size:100%;display:flex;align-items:center;gap:calc(.5rem*var(--scale-factor, 1));text-align:start;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;inset-block-start:100%;inset-inline-start:0;inline-size:100%;padding:calc(.5rem*var(--scale-factor, 1));margin-block-start:calc(.25rem*var(--scale-factor, 1));border:1px solid #e0201c;border-radius:8px;background-color:#ffd5ce;color:#242424;z-index:650;display:flex;align-items:flex-start;gap:calc(.5rem*var(--scale-factor, 1))}.styles-module__errorMessage--IT3hQ svg{color:#e0201c}.styles-module__itemTooltip--c5oiY{min-inline-size:auto}
694
694
  :root{--rpf-white: #ffffff}.styles-module__textDelete--9Qu4T{color:#e0201c}
695
695
  :root{--rpf-white: #ffffff}.styles-module__toastContainer--SzERA{display:flex;align-items:flex-start;gap:calc(.875rem*var(--scale-factor, 1));color:#003046;font-size:calc(.875rem*var(--scale-factor, 1));line-height:calc(1.25rem*var(--scale-factor, 1));font-weight:500;overflow-wrap:anywhere}.styles-module__toastMessage--5Ze6a{flex-grow:1;white-space:pre-line}.styles-module__errorIcon--v90W6{color:#e0201c}.styles-module__successIcon--gCtAd{color:#527d7a}.styles-module__closeIcon--iZ9ey{color:#003046;cursor:pointer;flex-shrink:0}.styles-module__toastList--7K4rT{display:flex;flex-direction:column-reverse;block-size:calc(100vh - 62px - 1em);max-block-size:calc(100vh - 62px - 1em);overflow-y:auto;overscroll-behavior:contain;padding-inline-end:calc(.25rem*var(--scale-factor, 1));scrollbar-color:rgba(0,48,70,.2) rgba(0,0,0,0);scrollbar-width:thin}.styles-module__toastList--7K4rT::-webkit-scrollbar{inline-size:calc(.5rem*var(--scale-factor, 1))}.styles-module__toastList--7K4rT::-webkit-scrollbar-track{background:rgba(0,0,0,0)}.styles-module__toastList--7K4rT::-webkit-scrollbar-thumb{background-color:rgba(0,48,70,.2);border-radius:calc(.25rem*var(--scale-factor, 1))}.styles-module__toastList--7K4rT:hover .Toastify__progress-bar{animation-play-state:paused !important}.styles-module__toast--LJOJf{flex-shrink:0;max-block-size:none;overflow:visible;padding:calc(1.125rem*var(--scale-factor, 1)) !important}.styles-module__toastBody--0iN2Q{align-items:flex-start;margin:0}.styles-module__infoIcon--tva-x{color:#0d47a1}
696
696
  :root{--rpf-white: #ffffff}.styles-module__tree--KziAJ{max-inline-size:100%;min-block-size:100px;color:#33625e}.styles-module__fileTreeActions--k\+Wsd{display:flex;gap:calc(.5rem*var(--scale-factor, 1));align-items:center;margin-block-end:calc(1rem*var(--scale-factor, 1))}.styles-module__tooltipWrapper--wltXE{position:relative;z-index:650}.styles-module__fileTreeActionsLabel--dPZp4{flex-grow:1;color:#69746d}.styles-module__importButton--rcLUm{inline-size:calc(2.5rem*var(--scale-factor, 1))}.styles-module__importArrowIcon--3eOLN{margin-inline-start:calc(.25rem*var(--scale-factor, 1))}.styles-module__label--WY51f{margin:0;flex-grow:1}.styles-module__iconButton--6UIVe{border:none;display:flex;justify-content:center;align-items:center;cursor:pointer}.styles-module__iconButtonFilled--w2vJC{background-color:#e5f6f1;border-radius:calc(.5rem*var(--scale-factor, 1));min-inline-size:calc(2rem*var(--scale-factor, 1));block-size:calc(2rem*var(--scale-factor, 1));transition:background-color .2s ease-in-out}.styles-module__iconButtonFilled--w2vJC:hover{background-color:#d7e7e3}.styles-module__iconButtonFilled--w2vJC:active{background-color:rgba(0,0,0,0)}.styles-module__dragline--RXmTT{block-size:2px;margin-block-start:-1px;background-color:#003046}.styles-module__dragline--RXmTT ::before{content:"";position:absolute;inset-inline-start:0;inset-block-start:-3px;block-size:4px;inline-size:4px;background:#fff;border:2px solid #003046;border-radius:99px}.styles-module__emptyStateContainer--AnTAm{padding:calc(.75rem*var(--scale-factor, 1));display:flex;flex-direction:column;align-items:center;text-align:center;font-size:calc(.75rem*var(--scale-factor, 1));line-height:calc(1rem*var(--scale-factor, 1));font-weight:400;color:#69746d;gap:calc(.25rem*var(--scale-factor, 1))}.styles-module__emptyStateIcon--sDlxK{inline-size:calc(1.5rem*var(--scale-factor, 1));block-size:calc(1.5rem*var(--scale-factor, 1))}.styles-module__emptyStateMessage--OkPax{font-weight:700}
@@ -711,7 +711,7 @@
711
711
  :root{--rpf-white: #ffffff}.styles-module__projRunnerContainer--ImBw-{display:flex;flex:5;border-radius:calc(.5rem*var(--scale-factor, 1));overflow:visible}.styles-module__projRunnerContainer--ImBw- .styles-module__react-tabs__tab-panel--selected--z2CLa{overflow-y:auto}.styles-module__projRunnerContainer--ImBw- .styles-module__react-tabs__tab-list--GLkmj{flex:1}.styles-module__projRunnerContainer--ImBw- .styles-module__react-tabs__tab-container--yOCPX .styles-module__btn--run--Nwouj,.styles-module__projRunnerContainer--ImBw- .styles-module__react-tabs__tab-container--yOCPX .styles-module__btn--stop--NAmPu{margin-block-start:0;margin-block-end:0}
712
712
  :root{--rpf-white: #ffffff}.styles-module__outputPreview--dHe0z{display:flex;flex:1 1 auto;block-size:auto;overflow:hidden;background-color:#fff}
713
713
  :root{--rpf-white: #ffffff}.styles-module__modalOverlay--uz0ee{display:flex;align-items:center;justify-content:center;padding:calc(5rem*var(--scale-factor, 1));z-index:800;position:fixed;inset:0px;background-color:HSL(0, 0%, 14%, 30%)}@media screen and (max-width: 480px){.styles-module__modalOverlay--uz0ee{padding:calc(2rem*var(--scale-factor, 1))}}.styles-module__modalContent--PcRss{font-family:Roboto,-apple-system,BlinkMacSystemFont,"Segoe UI",Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;max-block-size:100%;border:0;display:flex;flex-direction:column;border-radius:calc(.75rem*var(--scale-factor, 1));padding:calc(1.5rem*var(--scale-factor, 1));background-color:#fff;outline:none}.styles-module__modalContent--PcRss:focus{outline:none}.styles-module__modalContentHeader--U85mA{display:flex;align-items:center;min-block-size:fit-content}.styles-module__modalContentHeader--U85mA button{margin-inline-start:auto;block-size:fit-content}.styles-module__modalContentHeading--Pj43a{font-size:calc(1.5rem*var(--scale-factor, 1));line-height:calc(2rem*var(--scale-factor, 1));margin-block:calc(.5rem*var(--scale-factor, 1));margin-inline:calc(.5rem*var(--scale-factor, 1)) 0}.styles-module__modalContentBody--8Fp1K{padding-block-start:0;display:flex;flex-direction:column;row-gap:calc(.5rem*var(--scale-factor, 1));overflow-y:auto}.styles-module__modalContentSubHeading--YtzNg{font-size:calc(1rem*var(--scale-factor, 1));line-height:calc(1.5rem*var(--scale-factor, 1));margin:0;font-weight:700}.styles-module__modalContentText--qERKp{margin:0;line-height:1.4}.styles-module__modalContentButtons--3eyjq{display:flex;flex-wrap:wrap;flex-direction:row-reverse;justify-content:flex-start;gap:calc(.5rem*var(--scale-factor, 1));padding:0px}@media screen and (max-width: 480px){.styles-module__modalContentButtons--3eyjq{display:flex;flex-direction:column}}.styles-module__modalContentButtons--3eyjq button,.styles-module__modalContentButtons--3eyjq a{margin:0}.styles-module__modalContentButtons--3eyjq button span,.styles-module__modalContentButtons--3eyjq a span{inline-size:100%}@media screen and (max-width: 480px){.styles-module__modalContentButtons--3eyjq button,.styles-module__modalContentButtons--3eyjq a{inline-size:100%}}.styles-module__buttonClose--NQ701{background-color:rgba(0,0,0,0);inline-size:calc(1rem*var(--scale-factor, 1));block-size:calc(1rem*var(--scale-factor, 1))}.styles-module__buttonClose--NQ701 svg{color:#003046;fill:#003046;inline-size:calc(1rem*var(--scale-factor, 1));block-size:calc(1rem*var(--scale-factor, 1));padding:0px}.styles-module__headerContainer--yr6W5{text-align:center}.styles-module__headerText---tBwm{font-weight:400;font-size:calc(1.5rem*var(--scale-factor, 1));line-height:calc(2rem*var(--scale-factor, 1));text-align:center}.styles-module__headerIcon--Hof0F{text-align:center;inline-size:calc(2rem*var(--scale-factor, 1));block-size:calc(2rem*var(--scale-factor, 1))}.styles-module__modalContentButtons--3eyjq button span{font-size:calc(.875rem*var(--scale-factor, 1));line-height:calc(1.25rem*var(--scale-factor, 1))}
714
- :root{--rpf-white: #ffffff}.styles-module__content--khecF{inline-size:454px;max-inline-size:calc(100vw - 2*1rem*var(--scale-factor, 1))}.styles-module__headerIcon--fnE18 path{stroke:#33625e}.styles-module__headerText--ua6h6{color:#003046;font-weight:400;font-size:24px;line-height:34px;text-align:center}.styles-module__copyButton--jEsq1{flex-shrink:0;color:#003046;font-size:calc(.875rem*var(--scale-factor, 1));line-height:calc(1.25rem*var(--scale-factor, 1))}.styles-module__copyButtonSelected--4baTP,.styles-module__copyButtonSelected--4baTP:hover,.styles-module__copyButtonSelected--4baTP:active{background:#fff;border:1px solid #003046}.styles-module__tabContainer--Xb4IP{block-size:40px;margin-block-start:calc(.5rem*var(--scale-factor, 1))}.styles-module__tabButton--4BrBv{font-family:Roboto,-apple-system,BlinkMacSystemFont,"Segoe UI",Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;padding:calc(.75rem*var(--scale-factor, 1)) calc(1rem*var(--scale-factor, 1));background-color:#e5e5e5;font-weight:500;font-size:calc(.75rem*var(--scale-factor, 1));line-height:calc(1rem*var(--scale-factor, 1));letter-spacing:"0%";text-align:center;color:#527d7a;cursor:pointer}.styles-module__tabButton--4BrBv:first-child{border-start-start-radius:calc(.75rem*var(--scale-factor, 1));border-end-start-radius:calc(.75rem*var(--scale-factor, 1))}.styles-module__tabButton--4BrBv:last-child{border-start-end-radius:calc(.75rem*var(--scale-factor, 1));border-end-end-radius:calc(.75rem*var(--scale-factor, 1))}.styles-module__tabButtonActive--CdxX8{background-color:#c5ffe8;color:#003046}.styles-module__containerBox--rwoTV{margin-block-start:calc(.5rem*var(--scale-factor, 1));display:flex;align-items:center}.styles-module__linkContainer--XPt-Q{background-color:#c5ffe8;border-radius:calc(.5rem*var(--scale-factor, 1));display:flex;align-items:center;padding:calc(.875rem*var(--scale-factor, 1)) calc(1.25rem*var(--scale-factor, 1));flex:1;margin-inline-end:calc(.75rem*var(--scale-factor, 1));overflow:hidden}.styles-module__linkText--3vzcO{font-weight:600;flex:1;color:#33625e;font-size:calc(.875rem*var(--scale-factor, 1));line-height:calc(1.25rem*var(--scale-factor, 1));overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
714
+ :root{--rpf-white: #ffffff}.styles-module__content--khecF{inline-size:454px;max-inline-size:calc(100vw - 2*1rem*var(--scale-factor, 1))}.styles-module__headerIcon--fnE18 path{stroke:#33625e}.styles-module__headerText--ua6h6{color:#003046;font-weight:400;font-size:24px;line-height:34px;text-align:center}.styles-module__copyButton--jEsq1{flex-shrink:0;color:#003046;border:1px solid rgba(0,0,0,0);padding:calc(.75rem*var(--scale-factor, 1) - 1px) calc(1.25rem*var(--scale-factor, 1) - 1px);font-size:calc(.875rem*var(--scale-factor, 1));line-height:calc(1.25rem*var(--scale-factor, 1))}.styles-module__copyButtonSelected--4baTP,.styles-module__copyButtonSelected--4baTP:hover,.styles-module__copyButtonSelected--4baTP:active{background:#fff;border-color:#003046}.styles-module__tabContainer--Xb4IP{block-size:40px;margin-block-start:calc(.5rem*var(--scale-factor, 1))}.styles-module__tabButton--4BrBv{font-family:Roboto,-apple-system,BlinkMacSystemFont,"Segoe UI",Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;padding:calc(.75rem*var(--scale-factor, 1)) calc(1rem*var(--scale-factor, 1));background-color:#e5e5e5;font-weight:500;font-size:calc(.75rem*var(--scale-factor, 1));line-height:calc(1rem*var(--scale-factor, 1));letter-spacing:"0%";text-align:center;color:#527d7a;cursor:pointer}.styles-module__tabButton--4BrBv:first-child{border-start-start-radius:calc(.75rem*var(--scale-factor, 1));border-end-start-radius:calc(.75rem*var(--scale-factor, 1))}.styles-module__tabButton--4BrBv:last-child{border-start-end-radius:calc(.75rem*var(--scale-factor, 1));border-end-end-radius:calc(.75rem*var(--scale-factor, 1))}.styles-module__tabButtonActive--CdxX8{background-color:#c5ffe8;color:#003046}.styles-module__containerBox--rwoTV{margin-block-start:calc(.5rem*var(--scale-factor, 1));display:flex;align-items:center}.styles-module__linkContainer--XPt-Q{background-color:#c5ffe8;border-radius:calc(.5rem*var(--scale-factor, 1));display:flex;align-items:center;padding:calc(.875rem*var(--scale-factor, 1)) calc(1.25rem*var(--scale-factor, 1));flex:1;margin-inline-end:calc(.75rem*var(--scale-factor, 1));overflow:hidden}.styles-module__linkText--3vzcO{font-weight:600;flex:1;color:#33625e;font-size:calc(.875rem*var(--scale-factor, 1));line-height:calc(1.25rem*var(--scale-factor, 1));overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
715
715
  :root{--rpf-white: #ffffff}.styles-module__versionDate--OLHbO{font-weight:500;font-size:18px;line-height:30px;margin-block-start:calc(.5rem*var(--scale-factor, 1));color:#33625e}.styles-module__loadingButton--77kAZ{display:flex;flex-direction:row;align-items:center;gap:calc(.5rem*var(--scale-factor, 1))}
716
716
  :root{--rpf-white: #ffffff}.base-module__modalOverlay--f2LcG{display:flex;align-items:center;justify-content:center;padding:calc(5rem*var(--scale-factor, 1));z-index:800;position:fixed;inset:0px;background-color:HSL(0, 0%, 14%, 30%)}.base-module__modalContent--uIBvv{max-block-size:100%;border:0;display:flex;flex-direction:column;border-radius:calc(.75rem*var(--scale-factor, 1));padding:calc(1.5rem*var(--scale-factor, 1));background-color:#fff;gap:calc(.5rem*var(--scale-factor, 1))}.base-module__modalContent--uIBvv:focus,.base-module__modalContent--uIBvv:focus-visible{outline:none}.base-module__header--yqkGA{display:flex;flex-direction:column;align-items:center;justify-content:center;min-block-size:fit-content;font-size:calc(1.5rem*var(--scale-factor, 1));line-height:calc(2rem*var(--scale-factor, 1))}.base-module__headerContent--UL1eM{display:flex;align-items:center;flex-direction:column;gap:calc(.5rem*var(--scale-factor, 1));inline-size:100%}.base-module__body--0dDkY{padding-block-start:0;display:flex;flex-direction:column;text-align:center;row-gap:calc(.5rem*var(--scale-factor, 1));overflow-y:auto}.base-module__footer--YgVxg{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:calc(.5rem*var(--scale-factor, 1))}.base-module__footer--YgVxg button,.base-module__footer--YgVxg a{margin:0;font-size:calc(.875rem*var(--scale-factor, 1));line-height:calc(1.25rem*var(--scale-factor, 1))}.base-module__headerButtonContainer--A3leX{inline-size:100%;display:flex;align-items:center;justify-content:flex-end}.base-module__buttonClose--EPig\+{background-color:rgba(0,0,0,0);inline-size:calc(1rem*var(--scale-factor, 1));block-size:calc(1rem*var(--scale-factor, 1))}.base-module__buttonClose--EPig\+ svg{color:#003046;fill:#003046;inline-size:calc(1rem*var(--scale-factor, 1));block-size:calc(1rem*var(--scale-factor, 1));padding:0px}.base-module__infoBox--ggEhk{inline-size:100%;background-color:#b9e6ee;border-radius:calc(.5rem*var(--scale-factor, 1));padding:calc(1rem*var(--scale-factor, 1));display:flex;align-items:center;gap:calc(.5rem*var(--scale-factor, 1));overflow-wrap:anywhere}.base-module__infoBox--ggEhk svg{margin:calc(.125rem*var(--scale-factor, 1));color:#0d47a1}
717
717
  :root{--rpf-white: #ffffff}.styles-module__content--uVl64{inline-size:330px;gap:0px}.styles-module__headerContainer--FPLYl{text-align:center}.styles-module__headerIcon--VUrhy path{fill:#e0201c}.styles-module__headerText--F\+NA0{color:#003046;line-height:34px}.styles-module__containerBox--Dezow{margin-block-start:calc(.25rem*var(--scale-factor, 1));color:#242424;font-weight:400;font-size:calc(.75rem*var(--scale-factor, 1));line-height:calc(1rem*var(--scale-factor, 1));text-align:center}.styles-module__buttonsContainer--pnT1Q{margin-block-start:calc(.75rem*var(--scale-factor, 1));padding-block-end:0}
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.5.8",
4
+ "version": "0.5.10",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/GirlsFirst/gwchq-textjam",
7
7
  "author": "Girls Who Code HQ",