Spaces:
Runtime error
Runtime error
| @import "../../css/units.css"; | |
| @import "../../css/colors.css"; | |
| @import "../../css/z-index.css"; | |
| .page-wrapper { | |
| height: 100%; | |
| } | |
| .body-wrapper { | |
| height: calc(100% - $menu-bar-height); | |
| background-color: $ui-primary; | |
| } | |
| .body-wrapper-playground { | |
| height: 100%; | |
| } | |
| .body-wrapper * { | |
| box-sizing: border-box; | |
| } | |
| .flex-wrapper { | |
| display: flex; | |
| /* | |
| Make 2 columns: | |
| a) for the blocks + workspace panes, and | |
| b) for combined stage menu + stage + sprite/stage selectors | |
| */ | |
| flex-direction: row; | |
| height: 100%; | |
| /* | |
| Stop scrollbar popping in and out from scratch-blocks border issue | |
| https://github.com/LLK/scratch-gui/issues/318 | |
| */ | |
| overflow: hidden; | |
| } | |
| .editor-wrapper { | |
| /* | |
| This is carefully balanced-- the minimum width at which the GUI will be displayed is 1024px. | |
| At that size, the stage pane is 408px wide, with $space of padding to each side. | |
| However, we must also add the border width to the stage pane. All-in-all, the stage pane's final width is | |
| 408px + ($space + $stage-standard-border-width * 2) (one border & padding per left/right side). | |
| @todo This is in place to prevent "doubling up" of horizontal scrollbars in narrow windows, but there are likely | |
| much better ways to solve that (e.g. undo #2124, remove this flex-basis entirely). However, they run their own | |
| risks of breaking things, so let's just leave this as-is for the time being. | |
| */ | |
| flex-basis: calc(1024px - 408px - (($space + $stage-standard-border-width) * 2)); | |
| flex-grow: 1; | |
| flex-shrink: 0; | |
| position: relative; | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| .tab-list { | |
| height: $stage-menu-height; | |
| width: 250px; /* Match width of the toolbox */ | |
| display: flex; | |
| align-items: flex-end; | |
| flex-shrink: 0; | |
| font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; | |
| font-weight: 500; | |
| font-size: 0.80rem; | |
| /* Overrides for react-tabs styling */ | |
| margin: 0 ; | |
| border-bottom: 0 ; | |
| } | |
| .tab { | |
| flex-grow: 1; | |
| height: 80%; | |
| margin-bottom: 0; | |
| border-radius: 1rem 1rem 0 0; | |
| border: 1px solid $ui-black-transparent; | |
| padding: 0.125rem 1.25rem 0; | |
| font-size: 0.75rem; | |
| background-color: $ui-tertiary; | |
| color: $text-primary-transparent; | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| user-select: none; | |
| white-space: nowrap; | |
| } | |
| [theme="dark"] .tab { | |
| color: $text-primary; | |
| } | |
| .tab > div { | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| } | |
| .tab-disabled { | |
| display: none; | |
| } | |
| .add-tab-button { | |
| margin: 8px 0; | |
| margin-left: 4px; | |
| padding: 4px; | |
| font-size: larger; | |
| background: white; | |
| border: 1px solid rgba(0,0,0,.15); | |
| border-radius: 4px; | |
| display: flex; | |
| flex-direction: row; | |
| align-items: center; | |
| justify-content: center; | |
| transform: translateY(6px); | |
| } | |
| [dir="rtl"] .add-tab-button { | |
| margin-left: initial; | |
| margin-right: 4px; | |
| } | |
| [theme="dark"] .add-tab-button { | |
| background: none; | |
| border-color: rgba(255,255,255,.15); | |
| } | |
| [theme="dark"] .add-tab-button img { | |
| filter: invert(1); | |
| } | |
| .add-tab-button-disabled { | |
| cursor: not-allowed; | |
| opacity: 0.5; | |
| } | |
| .tab-addition-item { | |
| display: flex; | |
| align-items: center; | |
| } | |
| .tab-addition-item img { | |
| width: 1.375rem; | |
| } | |
| [dir="ltr"] .tab { | |
| margin-left: -0.5rem; | |
| } | |
| [dir="rtl"] .tab { | |
| margin-right: -0.5rem; | |
| } | |
| [dir="ltr"] .tab:nth-of-type(1) { | |
| margin-left: 0; | |
| } | |
| [dir="rtl"] .tab:nth-of-type(1) { | |
| margin-right: 0; | |
| } | |
| /* Use z-indices to force left-on-top for tabs */ | |
| .tab:nth-of-type(1) { | |
| z-index: 3; | |
| } | |
| .tab:nth-of-type(2) { | |
| z-index: 2; | |
| } | |
| .tab:nth-of-type(3) { | |
| z-index: 1; | |
| } | |
| .tab:hover { | |
| background-color: $ui-primary; | |
| } | |
| [theme="dark"] .tab:hover { | |
| background-color: $ui-secondary; | |
| } | |
| .tab.is-selected { | |
| height: 90%; | |
| color: $motion-primary; | |
| background-color: $ui-white; | |
| z-index: 4; /* Make sure selected is always above */ | |
| } | |
| [theme="dark"] .tab.is-selected { | |
| background-color: $ui-secondary; | |
| } | |
| .tab img { | |
| width: 1.375rem; | |
| filter: grayscale(100%); | |
| } | |
| [dir="ltr"] .tab img { | |
| margin-right: 0.125rem; | |
| } | |
| [dir="rtl"] .tab img { | |
| margin-left: 0.125rem; | |
| } | |
| /* mirror blocks and sound tab icons */ | |
| [dir="rtl"] .tab:nth-of-type(1) img { | |
| transform: scaleX(-1); | |
| } | |
| [dir="rtl"] .tab:nth-of-type(3) img { | |
| transform: scaleX(-1); | |
| } | |
| .tab.is-selected img { | |
| filter: none; | |
| } | |
| /* Tab style overrides from react-tabs */ | |
| .tab.is-selected:after { | |
| display: none; | |
| } | |
| .tab.is-selected:focus { | |
| outline: none; | |
| box-shadow: none; | |
| border-color: $ui-black-transparent; | |
| } | |
| .tab.is-selected:focus:after { | |
| display: none; | |
| } | |
| /* Body of the tabs */ | |
| .tabs { | |
| position: relative; | |
| flex-grow: 1; | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| .tab-panel { | |
| position: relative; | |
| flex-grow: 1; | |
| display: none; | |
| } | |
| .tab-panel.is-selected { | |
| display: flex; | |
| } | |
| .blocks-wrapper { | |
| flex-grow: 1; | |
| position: relative; | |
| } | |
| .stage-and-target-wrapper { | |
| /* | |
| Makes rows for children: | |
| 1) stage menu | |
| 2) stage | |
| 3) sprite/stage selectors | |
| Only reason we need this, is so .targetWrapper, which holds the selectors, | |
| goes to full vertical height of the window | |
| */ | |
| display: flex; | |
| flex-direction: column; | |
| /* pad entire wrapper to the left and right; allow children to fill width */ | |
| padding-left: $space; | |
| padding-right: $space; | |
| /* this will only ever be as wide as the stage */ | |
| flex-basis: 0; | |
| } | |
| .target-wrapper { | |
| display: flex; | |
| flex-grow: 1; | |
| flex-basis: 0; | |
| padding-top: $space; | |
| min-height: 0; /* this makes it work in Firefox */ | |
| /* | |
| For making the sprite-selector a scrollable pane | |
| @todo: Not working in Safari | |
| */ | |
| /* TODO this also breaks the thermometer menu */ | |
| /* overflow: hidden; */ | |
| } | |
| .extension-button-container { | |
| width: 3.75rem; | |
| height: 3.25rem; | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| right: 0; | |
| z-index: $z-index-extension-button; | |
| background: $motion-primary; | |
| border: 1px solid $motion-primary; | |
| box-sizing: content-box; /* To match scratch-block vertical toolbox borders */ | |
| } | |
| $fade-out-distance: 15px; | |
| .extension-button-container:before { | |
| content: ""; | |
| position: absolute; | |
| top: calc(calc(-1 * $fade-out-distance) - 1px); | |
| left: -1px; | |
| background: linear-gradient(rgba(0, 0, 0, 0),rgba(0, 0, 0, 0.15)); | |
| height: $fade-out-distance; | |
| width: calc(100% + 0.5px); | |
| } | |
| .extension-button { | |
| background: none; | |
| border: none; | |
| outline: none; | |
| width: 100%; | |
| height: 100%; | |
| cursor: pointer; | |
| } | |
| .extension-button-icon { | |
| width: 1.75rem; | |
| height: 1.75rem; | |
| } | |
| [dir="rtl"] .extension-button-icon { | |
| transform: scaleX(-1); | |
| } | |
| .extension-button > div { | |
| margin-top: 0; | |
| } | |
| /* Sprite Selection Watermark */ | |
| .watermark { | |
| position: absolute; | |
| top: 1.25rem; | |
| pointer-events: none; | |
| } | |
| [dir="ltr"] .watermark { | |
| right: 1.25rem; | |
| } | |
| [dir="rtl"] .watermark { | |
| left: 1.25rem; | |
| } | |
| /* Menu */ | |
| .menu-bar-position { | |
| position: relative; | |
| z-index: $z-index-menu-bar; | |
| } | |
| /* Alerts */ | |
| .alerts-container { | |
| display: flex; | |
| justify-content: center; | |
| width: 100%; | |
| z-index: $z-index-alerts; | |
| position: absolute; | |
| margin-top: 53px; | |
| pointer-events: none; | |
| } | |
| /* | |
| Make the (background) page not scrollable when modals are open | |
| This CSS class is automatically added to the body when react-modal is open | |
| */ | |
| :global(.ReactModal__Body--open) { | |
| overflow: hidden; | |
| } | |
| /* tw: tw: when window is fullscreen, put a solid white background behind the stage */ | |
| .fullscreen-background { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; | |
| /* if the user-specified background color can't be understood by the browser, default to white */ | |
| background-color: white; | |
| } | |