pxt-core
Version:
Microsoft MakeCode provides Blocks / JavaScript / Python tools and editors
512 lines (415 loc) • 12.8 kB
text/less
/* Import all components */
@import 'themes/default/globals/site.variables';
@import 'themes/pxt/globals/site.variables';
@import 'fieldeditors';
@import 'spriteeditor.less';
@import 'melodyeditor.less';
/*******************************
Blockly SVG
*******************************/
svg.blocklySvg {
background-color: var(--pxt-target-background1) ;
color: var(--pxt-target-foreground1) ;
}
#maineditor, #blocksEditor > div.loading {
background: var(--pxt-target-background1);
color: var(--pxt-target-foreground1);
}
.blocksAndErrorList {
display: flex;
flex-direction: column;
height: 100%;
}
.blocksEditorOuter {
position: relative;
display: inline-block;
overflow: hidden;
height: 100%;
}
#blocksEditor {
position: absolute;
width: 100%;
height: 100%;
.injectionDiv svg {
overflow: visible;
}
> div.loading {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
z-index: 1;
opacity: 0.7;
}
}
.blocklyMainBackground {
stroke: none ;
}
.rtl text.blocklyText {
text-align: right;
}
body.blocklyMinimalBody {
min-width: initial;
overflow: initial;
position: unset;
}
@supports (-ms-accelerator:true) {
.rtl .blocklyPreview {
right: 50%;
left: auto;
}
}
/*******************************
Blockly Text
*******************************/
.pxt-renderer.classic-theme {
text.blocklyFlyoutLabelText, .blocklyFlyoutButton text.blocklyText {
font-family: @pageFont ;
}
text.blocklyText.blocklyBoldText {
font-weight: bold;
}
text.blocklyText.blocklyItalicizedText {
font-style: italic;
}
text.blocklyText.blocklyBoldItalicizedText {
font-weight: bold;
font-style: italic;
}
text.blocklyText.blocklyBubbleText {
fill: #fff;
}
.blocklyEditableText>text.semanticIcon, .blocklyNonEditableText>text.semanticIcon {
fill: #fff;
font-family: "Icons";
font-size: 19px;
}
.blocklyEditableText>text.semanticIcon.inverted {
fill: #000;
}
}
/* Used by custom field in grey expression blocks */
.blocklyGreyExpressionBlockText {
color: white;
}
/*******************************
Blockly Toolbox
*******************************/
.blocklyTreeRowContentContainer {
// pointEvents style required to work around non-null assertion operator in Blockly code.
// See https://github.com/google/blockly/blob/develop/core/toolbox/toolbox.ts#L263
pointer-events: none;
}
span.blocklyTreeIcon {
visibility: visible;
&.pxt-toolbox-icon {
display: inline-block;
}
}
i.icon.blocklyTreeButton {
float: right;
line-height: 40px;
color: grey;
opacity: 0;
transition-property: opacity;
transition-duration: .5s;
}
.blocklyTreeRow:hover i.icon.blocklyTreeButton {
opacity: 1;
}
/*******************************
Blockly Flyout
*******************************/
.blocklyFlyoutButton {
fill: transparent ;
}
.blocklyFlyoutButton:hover {
fill: var(--pxt-primary-background) ;
}
.blocklyFlyoutButtonBackground {
stroke: var(--pxt-primary-background) ;
stroke-width: 3px ;
}
.blocklyFlyoutButton .blocklyText {
fill: var(--pxt-neutral-foreground3) ;
}
.blocklyFlyoutButtonShadow {
fill: none ;
}
.blocklyFlyoutLabelText {
fill: var(--pxt-neutral-foreground3) ;
font-size: 1rem;
}
.blocklyFlyoutHeading .blocklyFlyoutLabelText {
fill: var(--pxt-neutral-foreground3) ;
font-size: 1.5rem;
}
.blocklyFlyoutLabelText:hover {
fill: var(--pxt-neutral-foreground3) ;
}
.blocklyFlyoutLabelIcon {
font-family: 'Icons';
font-size: 1.5rem;
}
line.blocklyFlyoutLine {
stroke: var(--pxt-neutral-foreground3);
}
/* Opacity of blockly flyout background */
path.blocklyFlyoutBackground {
fill: var(--pxt-neutral-background3) ;
fill-opacity: @blocklyFlyoutColorOpacity ;
}
/*******************************
Field divs
*******************************/
div.blocklyWidgetDiv {
position: fixed;
/* Lower Z index for BlocklyWidgetDiv and grid picker tooltips */
z-index: @blocklyWidgetDivZIndex;
&:focus-visible {
outline: none;
}
}
div.blocklyWidgetDiv.functioneditor {
/* The Blockly widget should appear above the function editor */
z-index: @blocklyWidgetDivFunctionEditorZIndex;
}
div.blocklyDropDownDiv {
z-index: @blocklyDropdownDivZIndex;
overflow: hidden;
&:focus-visible {
outline: none;
}
}
div.blocklyTooltipDiv {
border: none ;
box-shadow: none ;
background-color: transparent ;
opacity: 1 ;
/* wrap the JS text inside a blockly Tooltip */
overflow-wrap: break-word;
}
div.blocklyTooltipDiv .ui.card .content .description {
/* override semantic, tooltip text should always be visible*/
display: inline;
}
/* Blockly Slider field */
.blocklyWidgetDiv .goog-slider-horizontal {
background: white;
border: 2px solid black;
border-radius: 5px;
}
/* (microbit only) This is to ensure the leds inside showLeds fill the entire checkbox */
text.blocklyCheckbox {
fill: #ff3030 ;
text-shadow: 0px 0px 6px #f00;
font-size: 17pt ;
}
/* (arcade only) Sets the correct background color for the sprite image field */
.pxt-renderer.classic-theme {
.blocklyNonEditableText > rect.blocklySpriteField,
.blocklyNonEditableText > rect.blocklyAnimationField,
.blocklyNonEditableText > rect.blocklyTilemapField,
.blocklyEditableField > rect.blocklySpriteField,
.blocklyEditableText > rect.blocklySpriteField,
.blocklyEditableText > rect.blocklyAnimationField,
.blocklyEditableText > rect.blocklyTilemapField {
fill: #dedede;
stroke: #898989;
stroke-width: 1;
}
}
/*******************************
Blocks
*******************************/
/* Transulcent blocks when dragging */
.blocklyDragging>.blocklyPath {
fill-opacity: 0.7;
}
/* Fade out disabled blocks, but don't completely lose the colour */
.blocklyDisabled > .blocklyPathDark {
display: block ;
fill-opacity: 0.5;
}
.blocklyDisabled {
.blocklyNonEditableText .blocklyBlockBackground {
fill-opacity: 0.1 ;
}
}
/* Keyboard navigation plugin styles */
.passiveBlockFocus.blocklyPath {
stroke-dasharray: 5 3;
stroke-width: 3;
stroke: #ffa200;
}
.passiveNextIndicator {
stroke: #ffa200;
fill: #ffa200;
}
.inputActiveFocus {
stroke-width: 3;
stroke: #ffa200;
}
/*******************************
Scrollbars
*******************************/
.blocklyScrollbarBackground {
fill: none;
}
.blocklyScrollbarHandle {
fill: var(--pxt-target-stencil1);
opacity: @blocklyScrollbarOpacity;
}
.blocklyScrollbarBackground:hover+.blocklyScrollbarHandle, .blocklyScrollbarHandle:hover, .blocklyScrollbarBackground:active+.blocklyScrollbarHandle, .blocklyScrollbarHandle:active {
stroke-width: 3;
stroke: var(--pxt-target-stencil1);
}
/*******************************
Context menu
*******************************/
.blocklyWidgetDiv .blocklyContextMenu {
background: var(--pxt-neutral-background1);
color: var(--pxt-neutral-foreground1);
border: 1px solid var(--pxt-neutral-stencil1);
box-shadow: 0 1px 2px 0 var(--pxt-neutral-alpha20) ;
padding: 0 ;
}
.blocklyWidgetDiv .blocklyContextMenu .blocklyMenuItem {
margin: 0 ;
padding: .92857143em 1.14285714em ;
font: normal 13px @pageFont ;
background: var(--pxt-neutral-background1);
color: var(--pxt-neutral-foreground1);
&.blocklyMenuItemDisabled {
color: var(--pxt-neutral-alpha20);
}
}
.blocklyWidgetDiv .blocklyContextMenu .blocklyMenuItem.blocklyMenuItemHighlight,
.blocklyWidgetDiv .blocklyContextMenu .gridpicker-menuitem-hover {
border: none ;
padding: .92857143em 1.14285714em ;
background: var(--pxt-neutral-background1-hover) ;
color: var(--pxt-neutral-foreground1-hover);
}
/*******************************
Comments
*******************************/
.blocklyDeleteIcon {
display: block;
}
.blocklyComment .blocklyTextarea {
border: none;
color: #575E75;
}
/*******************************
Workspace Search
*******************************/
.blockly-ws-searching {
path.blocklyPath:not(.blockly-ws-search-highlight-pxt) {
opacity: 0.6;
}
path.blocklyPath.blockly-ws-search-highlight-pxt.blockly-ws-search-current {
stroke: #FFF200;
stroke-width: 4px;
transition: none;
}
}
/*******************************
Media Adjustments
*******************************/
/* Mobile */
@media only screen and (max-width: @largestMobileScreen) {
text.blocklyCheckbox {
font-size: 17pt ;
}
}
/*******************************
Focus styles
*******************************/
.injectionDiv {
--blockly-active-node-color: #fff200;
--blockly-active-tree-color: var(--pxt-target-foreground1);
/* Comments are yellow default highlight is orange */
--blockly-active-workspace-comment-color: var(--pxt-target-foreground1);
--blockly-selection-width: 3px;
}
// Avoid focus outlines when not using the keyboard navigation plugin.
div.blocklyTreeRoot > div[role="tree"]:focus-visible {
outline: none;
}
.blocklyKeyboardNavigation div.blocklyTreeRoot > div[role="tree"]:focus-visible {
outline: var(--blockly-selection-width) solid var(--blockly-active-tree-color);
outline-offset: calc(var(--blockly-selection-width) * -1);
}
/* Blocks, connections and fields. */
.blocklyKeyboardNavigation
.blocklyActiveFocus.blocklyField
> .blocklyFieldRect.blocklySpriteField,
.blocklyKeyboardNavigation
.blocklyActiveFocus.blocklyIconGroup
> :is(.blocklyBreakpointSymbol) {
stroke: var(--blockly-active-node-color);
stroke-width: var(--blockly-selection-width);
}
.blocklyKeyboardNavigation
.blocklyPassiveFocus.blocklyField
> .blocklyFieldRect.blocklySpriteField,
.blocklyKeyboardNavigation
.blocklyPassiveFocus.blocklyIconGroup
> :is(.blocklyBreakpointSymbol) {
stroke: var(--blockly-active-node-color);
stroke-dasharray: 5px 3px;
stroke-width: var(--blockly-selection-width);
}
.blocklyKeyboardNavigation .blocklyIconGroup:is(.blocklyActiveFocus, .blocklyPassiveFocus) {
// Unless you hover the icon group has opacity 0.6 which makes
// the focus indicator unclear.
opacity: 1;
}
/* Toolbox and flyout. */
.blocklyKeyboardNavigation .injectionDiv .blocklyToolbox:has(.blocklyActiveFocus) {
outline: none;
}
/* Flyout buttons and labels */
.blocklyKeyboardNavigation .blocklyFlyout .blocklyFlyoutLabel.blocklyActiveFocus,
.blocklyKeyboardNavigation .blocklyFlyout .blocklyFlyoutButton.blocklyActiveFocus {
outline: none;
}
/* Use the backgrounds because the group can't have an outline on Safari */
.blocklyKeyboardNavigation .blocklyFlyout .blocklyFlyoutLabel.blocklyActiveFocus > .blocklyFlyoutLabelBackground,
.blocklyKeyboardNavigation .blocklyFlyout .blocklyFlyoutButton.blocklyActiveFocus > .blocklyFlyoutButtonBackground {
outline-offset: 2px;
outline: var(--blockly-selection-width) solid
var(--blockly-active-node-color);
border-radius: 2px;
}
.blocklyKeyboardNavigation .blocklyFlyout .blocklyFlyoutLabel.blocklyActiveFocus > .blocklyFlyoutLabelBackground {
// Swap opacity for transparent fill so we can see the focus indicator.
opacity: 1;
fill: transparent;
}
// Image fields e.g. +/- buttons. Needs to be the image for Safari but Chrome has the group by default.
.blocklyKeyboardNavigation .blocklyImageField:focus-visible {
outline: none;
}
.blocklyKeyboardNavigation .blocklyImageField:is(.blocklyActiveFocus, .blocklyPassiveFocus) > image {
outline: var(--blockly-selection-width) solid
var(--blockly-active-node-color);
border-radius: 2px;
outline-offset: 2px;
}
.blocklyKeyboardNavigation .blocklyImageField.blocklyPassiveFocus > image {
outline-style: dashed;
}
/* Workspace comments */
.blocklyKeyboardNavigation .blocklyComment.blocklyActiveFocus .blocklyCommentHighlight {
/* Different colour for contrast */
stroke: var(--blockly-active-workspace-comment-color);
stroke-width: 4px;
}
.blocklyCommentTopbar .blocklyActiveFocus {
outline: 2px solid var(--blockly-active-workspace-comment-color);
border-radius: 2px;
outline-offset: -1px;
}