Spaces:
Running
Running
@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; | |
} | |