[WIP] Minimize changes to blockly core

This commit is contained in:
Evan W. Patton
2016-10-12 15:16:13 -04:00
parent a62b22229f
commit 4e398b7057
23 changed files with 26 additions and 663 deletions

View File

@@ -1,26 +0,0 @@
*** 943,968 ****
var expandOption = {enabled: hasCollapsedBlocks};
expandOption.text = Blockly.Msg.EXPAND_ALL;
expandOption.callback = function() {
+ Blockly.Instrument.initializeStats("expandAllCollapsedBlocks");
+ Blockly.Instrument.timer(
+ function () {
+ var ms = 0;
+ for (var i = 0; i < topBlocks.length; i++) {
+ var block = topBlocks[i];
+ while (block) {
+ setTimeout(block.setCollapsed.bind(block, false), ms);
+ block = block.getNextBlock();
+ ms += COLLAPSE_DELAY;
+ }
+ }
+ Blockly.resetWorkspaceArrangements();
+ },
+ function (result, timeDiff) {
+ Blockly.Instrument.stats.totalTime = timeDiff;
+ Blockly.Instrument.displayStats("expandAllCollapsedBlocks");
+ }
+ );
};
options.push(expandOption);
}

View File

@@ -1,30 +0,0 @@
***************
*** 255,266 ****
* @param {!Blockly.Workspace} workspace The workspace to delete callers from.
* @param {!Array.<string>} paramNames Array of new parameter names.
* @param {!Array.<string>} paramIds Array of unique parameter IDs.
*/
Blockly.Procedures.mutateCallers = function(name, workspace,
- paramNames, paramIds) {
var callers = Blockly.Procedures.getCallers(name, workspace);
for (var x = 0; x < callers.length; x++) {
- callers[x].setProcedureParameters(paramNames, paramIds);
}
};
--- 256,270 ----
* @param {!Blockly.Workspace} workspace The workspace to delete callers from.
* @param {!Array.<string>} paramNames Array of new parameter names.
* @param {!Array.<string>} paramIds Array of unique parameter IDs.
+ * @param {boolean} opt_intializeTracking indicate whether paramId tracking should start
+ * Is undefined (falsey) as default. // [lyn, 10/26/13] added this.
*/
Blockly.Procedures.mutateCallers = function(name, workspace,
+ paramNames, paramIds,
+ opt_initializeTracking) {
var callers = Blockly.Procedures.getCallers(name, workspace);
for (var x = 0; x < callers.length; x++) {
+ callers[x].setProcedureParameters(paramNames, paramIds, opt_initializeTracking);
}
};

View File

@@ -1,60 +0,0 @@
***************
*** 82,99 ****
<text class="blocklyIconMark" x="8" y="13">!</text>
*/
var iconShield = Blockly.createSvgElement('path',
- {'class': 'blocklyIconShield',
'd': 'M 2,15 Q -1,15 0.5,12 L 6.5,1.7 Q 8,-1 9.5,1.7 L 15.5,12 ' +
'Q 17,15 14,15 z'},
this.iconGroup_);
this.iconMark_ = Blockly.createSvgElement('text',
- {'class': 'blocklyIconMark',
'x': Blockly.Icon.RADIUS,
'y': 2 * Blockly.Icon.RADIUS - 3}, this.iconGroup_);
this.iconMark_.appendChild(document.createTextNode('!'));
};
/**
* Show or hide the warning bubble.
* @param {boolean} visible True if the bubble should be visible.
*/
--- 82,120 ----
<text class="blocklyIconMark" x="8" y="13">!</text>
*/
var iconShield = Blockly.createSvgElement('path',
+ {'class': 'blocklyWarningIconShield',
'd': 'M 2,15 Q -1,15 0.5,12 L 6.5,1.7 Q 8,-1 9.5,1.7 L 15.5,12 ' +
'Q 17,15 14,15 z'},
this.iconGroup_);
this.iconMark_ = Blockly.createSvgElement('text',
+ {'class': 'blocklyWarningIconMark',
'x': Blockly.Icon.RADIUS,
'y': 2 * Blockly.Icon.RADIUS - 3}, this.iconGroup_);
this.iconMark_.appendChild(document.createTextNode('!'));
};
/**
+ * Create the text for the warning's bubble.
+ * @param {string} text The text to display.
+ * @return {!SVGTextElement} The top-level node of the text.
+ * @private
+ */
+ Blockly.Warning.prototype.textToDom_ = function(text) {
+ var paragraph = /** @type {!SVGTextElement} */ (
+ Blockly.createSvgElement(
+ 'text', {'class': 'blocklyText blocklyErrorWarningText', 'y': Blockly.Bubble.BORDER_WIDTH},
+ null));
+ var lines = text.split('\n');
+ for (var i = 0; i < lines.length; i++) {
+ var tspanElement = Blockly.createSvgElement('tspan',
+ {'dy': '1em', 'x': Blockly.Bubble.BORDER_WIDTH}, paragraph);
+ var textNode = document.createTextNode(lines[i]);
+ tspanElement.appendChild(textNode);
+ }
+ return paragraph;
+ };
+
+ /**
* Show or hide the warning bubble.
* @param {boolean} visible True if the bubble should be visible.
*/

View File

@@ -1,34 +0,0 @@
***************
*** 342,348 ****
}
if (firstRealGrandchild &&
firstRealGrandchild.nodeName.toLowerCase() == 'block') {
- blockChild = Blockly.Xml.domToBlock(workspace, firstRealGrandchild,
opt_reuseBlock);
if (blockChild.outputConnection) {
input.connection.connect(blockChild.outputConnection);
--- 415,421 ----
}
if (firstRealGrandchild &&
firstRealGrandchild.nodeName.toLowerCase() == 'block') {
+ blockChild = Blockly.Xml.domToBlockInner(workspace, firstRealGrandchild,
opt_reuseBlock);
if (blockChild.outputConnection) {
input.connection.connect(blockChild.outputConnection);
***************
*** 362,368 ****
// This could happen if there is more than one XML 'next' tag.
throw 'Next statement is already connected.';
}
- blockChild = Blockly.Xml.domToBlock(workspace, firstRealGrandchild,
opt_reuseBlock);
if (!blockChild.previousConnection) {
throw 'Next block does not have previous statement.';
--- 435,441 ----
// This could happen if there is more than one XML 'next' tag.
throw 'Next statement is already connected.';
}
+ blockChild = Blockly.Xml.domToBlockInner(workspace, firstRealGrandchild,
opt_reuseBlock);
if (!blockChild.previousConnection) {
throw 'Next block does not have previous statement.';

View File

@@ -3,7 +3,7 @@
# Code shared by translation conversion scripts.
#
# Copyright 2013 Google Inc.
# https://blockly.googlecode.com/
# https://developers.google.com/blockly/
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -61,7 +61,7 @@ def read_json_file(filename):
return defs
except ValueError, e:
print('Error reading ' + filename)
raise InputError(file, str(e))
raise InputError(filename, str(e))
def _create_qqq_file(output_dir):

View File

@@ -3,7 +3,7 @@
# Generate .js files defining Blockly core and language messages.
#
# Copyright 2013 Google Inc.
# https://blockly.googlecode.com/
# https://developers.google.com/blockly/
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -28,6 +28,14 @@ from common import read_json_file
_NEWLINE_PATTERN = re.compile('[\n\r]')
def string_is_ascii(s):
try:
s.decode('ascii')
return True
except UnicodeEncodeError:
return False
def main():
"""Generate .js files defining Blockly core and language messages."""
@@ -76,10 +84,17 @@ def main():
target_lang = filename[:filename.index('.')]
if target_lang not in ('qqq', 'keys', 'synonyms'):
target_defs = read_json_file(os.path.join(os.curdir, arg_file))
# Verify that keys are 'ascii'
bad_keys = [key for key in target_defs if not string_is_ascii(key)]
if bad_keys:
print(u'These keys in {0} contain non ascii characters: {1}'.format(
filename, ', '.join(bad_keys)))
# If there's a '\n' or '\r', remove it and print a warning.
for key, value in target_defs.items():
if _NEWLINE_PATTERN.search(value):
print('WARNING: definition of {0} in {1} contained '
print(u'WARNING: definition of {0} in {1} contained '
'a newline character.'.
format(key, arg_file))
target_defs[key] = _NEWLINE_PATTERN.sub(' ', value)
@@ -118,10 +133,10 @@ goog.require('Blockly.Msg');
synonym_keys = [key for key in target_defs if key in synonym_defs]
if not args.quiet:
if extra_keys:
print('These extra keys appeared in {0}: {1}'.format(
print(u'These extra keys appeared in {0}: {1}'.format(
filename, ', '.join(extra_keys)))
if synonym_keys:
print('These synonym keys appeared in {0}: {1}'.format(
print(u'These synonym keys appeared in {0}: {1}'.format(
filename, ', '.join(synonym_keys)))
outfile.write(synonym_text)

View File

@@ -7,7 +7,7 @@
# output.
#
# Copyright 2013 Google Inc.
# https://blockly.googlecode.com/
# https://developers.google.com/blockly/
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.

View File

@@ -3,7 +3,7 @@
# Gives the translation status of the specified apps and languages.
#
# Copyright 2013 Google Inc.
# https://blockly.googlecode.com/
# https://developers.google.com/blockly/
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.

View File

@@ -3,7 +3,7 @@
# Converts .json files into .js files for use within Blockly apps.
#
# Copyright 2013 Google Inc.
# https://blockly.googlecode.com/
# https://developers.google.com/blockly/
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.

View File

@@ -1,247 +0,0 @@
#!/usr/bin/python
# Gives the translation status of the specified apps and languages.
#
# Copyright 2013 Google Inc.
# https://blockly.googlecode.com/
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Produce a table showing the translation status of each app by language.
@author Ellen Spertus (ellen.spertus@gmail.com)
"""
import argparse
import os
from common import read_json_file
# Bogus language name representing all messages defined.
TOTAL = 'qqq'
# List of key prefixes, which are app names, except for 'Apps', which
# has common messages. It is included here for convenience.
APPS = ['Apps', 'Code', 'Graph', 'Maze', 'Plane', 'Puzzle', 'Turtle']
def get_prefix(s):
"""Gets the portion of a string before the first period.
Args:
s: A string.
Returns:
The portion of the string before the first period, or the entire
string if it does not contain a period.
"""
return s.split('.')[0]
def get_prefix_count(prefix, arr):
"""Counts how many strings in the array start with the prefix.
Args:
prefix: The prefix string.
arr: An array of strings.
Returns:
The number of strings in arr starting with prefix.
"""
# This code was chosen for its elegance not its efficiency.
return len([elt for elt in arr if elt.startswith(prefix)])
def output_as_html(messages, apps, verbose):
"""Outputs the given prefix counts and percentages as HTML.
Specifically, a sortable HTML table is produced, where the app names
are column headers, and one language is output per row. Entries
are color-coded based on the percent completeness.
Args:
messages: A dictionary of dictionaries, where the outer keys are language
codes used by translatewiki (generally, ISO 639 language codes) or
the string TOTAL, used to indicate the total set of messages. The
inner dictionary makes message keys to values in that language.
apps: Apps to consider.
verbose: Whether to list missing keys.
"""
def generate_language_url(lang):
return 'https://translatewiki.net/wiki/Special:SupportedLanguages#' + lang
def generate_number_as_percent(num, total, tag):
percent = num * 100 / total
if percent == 100:
color = 'green'
elif percent >= 90:
color = 'orange'
elif percent >= 60:
color = 'black'
else:
color = 'gray'
s = '<font color={0}>{1} ({2}%)</font>'.format(color, num, percent)
if verbose and percent < 100:
return '<a href="#{0}">{1}'.format(tag, s)
else:
return s
print('<head><title>Blockly app translation status</title></head><body>')
print("<SCRIPT LANGUAGE='JavaScript1.2' SRC='https://neil.fraser.name/"
"software/tablesort/tablesort-min.js'></SCRIPT>")
print('<table cellspacing=5><thead><tr>')
print('<th class=nocase>Language</th><th class=num>' +
'</th><th class=num>'.join(apps) + '</th></tr></thead><tbody>')
for lang in messages:
if lang != TOTAL:
print('<tr><td><a href="{1}">{0}</a></td>'.format(
lang, generate_language_url(lang)))
for app in apps:
print '<td>'
print(generate_number_as_percent(
get_prefix_count(app, messages[lang]),
get_prefix_count(app, messages[TOTAL]),
(lang + app)))
print '</td>'
print('</tr>')
print('</tbody><tfoot><tr><td>ALL</td><td>')
print('</td><td>'.join([str(get_prefix_count(app, TOTAL)) for app in apps]))
print('</td></tr></tfoot></table>')
if verbose:
for lang in messages:
if lang != TOTAL:
for app in apps:
if (get_prefix_count(app, messages[lang]) <
get_prefix_count(app, messages[TOTAL])):
print('<div id={0}{1}><strong>{1} (<a href="{2}">{0}</a>)'.
format(lang, app, generate_language_url(lang)))
print('</strong> missing: ')
print(', '.join(
[key for key in messages[TOTAL] if
key.startswith(app) and key not in messages[lang]]))
print('<br><br></div>')
print('</body>')
def output_as_text(messages, apps, verbose):
"""Outputs the given prefix counts and percentages as text.
Args:
messages: A dictionary of dictionaries, where the outer keys are language
codes used by translatewiki (generally, ISO 639 language codes) or
the string TOTAL, used to indicate the total set of messages. The
inner dictionary makes message keys to values in that language.
apps: Apps to consider.
verbose: Whether to list missing keys.
"""
def generate_number_as_percent(num, total):
return '{0} ({1}%)'.format(num, num * 100 / total)
MAX_WIDTH = len('999 (100%)') + 1
FIELD_STRING = '{0: <' + str(MAX_WIDTH) + '}'
print(FIELD_STRING.format('Language') + ''.join(
[FIELD_STRING.format(app) for app in apps]))
print(('-' * (MAX_WIDTH - 1) + ' ') * (len(apps) + 1))
for lang in messages:
if lang != TOTAL:
print(FIELD_STRING.format(lang) +
''.join([FIELD_STRING.format(generate_number_as_percent(
get_prefix_count(app, messages[lang]),
get_prefix_count(app, messages[TOTAL])))
for app in apps]))
print(FIELD_STRING.format(TOTAL) +
''.join(
[FIELD_STRING.format(get_prefix_count(app, messages[TOTAL]))
for app in apps]))
if verbose:
for lang in messages:
if lang != TOTAL:
for app in apps:
missing = [key for key in messages[TOTAL]
if key.startswith(app) and key not in messages[lang]]
print('{0} {1}: Missing: {2}'.format(
app.upper(), lang, (', '.join(missing) if missing else 'none')))
def output_as_csv(messages, apps):
"""Outputs the given prefix counts and percentages as CSV.
Args:
messages: A dictionary of dictionaries, where the outer keys are language
codes used by translatewiki (generally, ISO 639 language codes) or
the string TOTAL, used to indicate the total set of messages. The
inner dictionary makes message keys to values in that language.
apps: Apps to consider.
"""
# Header row.
print('Language, ' + ', ,'.join(apps))
# Total row.
# Put at top, rather than bottom, so it can be frozen.
print('TOTAL, ' + ', '.join(
[str(get_prefix_count(app, messages[TOTAL])) + ', '
for app in apps]))
# One line per language.
for lang in messages:
if lang != TOTAL:
print(lang + ', ' + ', '.join(
[str(get_prefix_count(app, messages[lang]))
+ ', '
+ str((get_prefix_count(app, messages[lang]) * 1.0 /
get_prefix_count(app, messages[TOTAL])))
for app in apps]))
def main():
"""Processes input files and outputs results in specified format.
"""
# Argument parsing.
parser = argparse.ArgumentParser(
description='Display translation status by app and language.')
parser.add_argument('--key_file', default='json' + os.path.sep + 'keys.json',
help='file with complete list of keys.')
parser.add_argument('--output', default='text',
choices=['text', 'html', 'csv'],
help='output format')
parser.add_argument('--verbose', action='store_true', default=False,
help='whether to indicate which messages were translated '
'(only used in text and html output modes)')
parser.add_argument('--app', default=None, choices=APPS,
help='if set, only consider the specified app (prefix).')
parser.add_argument('lang_files', nargs='+',
help='names of JSON files to examine')
args = parser.parse_args()
apps = [args.app] if args.app else APPS
# Read in JSON files.
messages = {} # A dictionary of dictionaries.
messages[TOTAL] = read_json_file(args.key_file)
for lang_file in args.lang_files:
prefix = get_prefix(os.path.split(lang_file)[1])
# Skip non-language files.
if prefix not in ['qqq', 'keys']:
messages[prefix] = read_json_file(lang_file)
# Output results.
if args.output == 'text':
output_as_text(messages, apps, args.verbose)
elif args.output == 'html':
output_as_html(messages, apps, args.verbose)
elif args.output == 'csv':
output_as_csv(messages, apps)
else:
print('No output?!')
if __name__ == '__main__':
main()

View File

@@ -4,7 +4,7 @@
# Tests of i18n scripts.
#
# Copyright 2013 Google Inc.
# https://blockly.googlecode.com/
# https://developers.google.com/blockly/
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.

View File

@@ -3,7 +3,7 @@
# Converts .xlf files into .json files for use at http://translatewiki.net.
#
# Copyright 2013 Google Inc.
# https://blockly.googlecode.com/
# https://developers.google.com/blockly/
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,255 +0,0 @@
.blocklySvg {
background-color: #fff;
}
.blocklyWidgetDiv {
position: absolute;
display: none;
z-index: 999;
}
.blocklyDraggable {
cursor: url(handopen.cur) 8 5 , auto;
}
.blocklyResizeSE {
fill: #aaa;
cursor: se-resize;
}
.blocklyResizeSW {
fill: #aaa;
cursor: sw-resize;
}
.blocklyResizeLine {
stroke-width: 1;
stroke: #888;
}
.blocklyHighlightedConnectionPath {
stroke-width: 4px;
stroke: #fc3;
fill: none;
}
.blocklyPathLight {
fill: none;
stroke-width: 2;
stroke-linecap: round;
}
.blocklySelected>.blocklyPath {
stroke-width: 3px;
stroke: #fc3;
}
.blocklySelected>.blocklyPathLight {
display: none;
}
.blocklyDragging>.blocklyPath, .blocklyDragging>.blocklyPathLight {
fill-opacity: .8;
stroke-opacity: .8;
}
.blocklyDragging>.blocklyPathDark {
display: none;
}
.blocklyDisabled>.blocklyPath {
fill-opacity: .5;
stroke-opacity: .5;
}
.blocklyDisabled>.blocklyPathLight, .blocklyDisabled>.blocklyPathDark {
display: none;
}
.blocklyText {
cursor: default;
font-family: sans-serif;
font-size: 11pt;
fill: #fff;
}
.blocklyNonEditableText>text {
pointer-events: none;
}
.blocklyNonEditableText>rect, .blocklyEditableText>rect {
fill: #fff;
fill-opacity: .6;
}
.blocklyNonEditableText>text, .blocklyEditableText>text {
fill: #000;
}
.blocklyEditableText:hover>rect {
stroke-width: 2;
stroke: #fff;
}
.blocklySvg text {
-moz-user-select: none;
-webkit-user-select: none;
user-select: none;
cursor: inherit;
}
.blocklyHidden {
display: none;
}
.blocklyTooltipBackground {
fill: #ffffc7;
stroke-width: 1px;
stroke: #d8d8d8;
}
.blocklyTooltipShadow, .blocklyContextMenuShadow, .blocklyDropdownMenuShadow {
fill: #bbb;
filter: url(#blocklyShadowFilter);
}
.blocklyTooltipText {
font-family: sans-serif;
font-size: 9pt;
fill: #000;
}
.blocklyIconShield {
cursor: default;
fill: #00c;
stroke-width: 1px;
stroke: #ccc;
}
.blocklyIconGroup:hover>.blocklyIconShield {
fill: #00f;
stroke: #fff;
}
.blocklyIconGroup:hover>.blocklyIconMark {
fill: #fff;
}
.blocklyIconMark {
cursor: default !important;
font-family: sans-serif;
font-size: 9pt;
font-weight: bold;
fill: #ccc;
text-anchor: middle;
}
.blocklyMinimalBody {
margin: 0;
padding: 0;
}
.blocklyCommentTextarea {
margin: 0;
padding: 2px;
border: 0;
resize: none;
background-color: #ffc;
}
.blocklyHtmlInput {
font-family: sans-serif;
font-size: 11pt;
border: none;
outline: none;
}
.blocklyContextMenuBackground, .blocklyMutatorBackground {
fill: #fff;
stroke-width: 1;
stroke: #ddd;
}
.blocklyContextMenuOptions>.blocklyMenuDiv, .blocklyContextMenuOptions>.blocklyMenuDivDisabled, .blocklyDropdownMenuOptions>.blocklyMenuDiv {
fill: #fff;
}
.blocklyToolboxOptions>.blocklyMenuDiv {
fill: #ddd;
}
.blocklyToolboxOptions>.blocklyMenuDiv:hover {
fill: #e4e4e4;
}
.blocklyContextMenuOptions>.blocklyMenuDiv:hover>rect, .blocklyDropdownMenuOptions>.blocklyMenuDiv:hover>rect, .blocklyMenuSelected>rect {
fill: #57e;
}
.blocklyMenuText {
cursor: default !important;
font-family: sans-serif;
font-size: 15px;
fill: #000;
}
.blocklyContextMenuOptions>.blocklyMenuDiv:hover>.blocklyMenuText, .blocklyDropdownMenuOptions>.blocklyMenuDiv:hover>.blocklyMenuText, .blocklyMenuSelected>.blocklyMenuText {
fill: #fff;
}
.blocklyMenuDivDisabled>.blocklyMenuText {
fill: #ccc;
}
.blocklyToolboxBackground {
fill: #ddd;
}
.blocklyFlyoutBackground {
fill: #ddd;
fill-opacity: .8;
}
.blocklyColourBackground {
fill: #666;
}
.blocklyScrollbarBackground {
fill: #fff;
stroke-width: 1;
stroke: #e4e4e4;
}
.blocklyScrollbarKnob {
fill: #ccc;
}
.blocklyScrollbarBackground:hover+.blocklyScrollbarKnob, .blocklyScrollbarKnob:hover {
fill: #bbb;
}
.blocklyInvalidInput {
background: #faa;
}
.goog-palette {
outline: none;
cursor: default;
}
.goog-palette-table {
border: 1px solid #666;
border-collapse: collapse;
}
.goog-palette-cell {
height: 13px;
width: 15px;
margin: 0;
border: 0;
text-align: center;
vertical-align: middle;
border-right: 1px solid #666;
font-size: 1px;
}
.goog-palette-colorswatch {
position: relative;
height: 13px;
width: 15px;
border: 1px solid #666;
}
.goog-palette-cell-hover .goog-palette-colorswatch {
border: 1px solid #fff;
}
.goog-palette-cell-selected .goog-palette-colorswatch {
border: 1px solid #000;
color: #fff;
}
.blocklyErrorIconShield {
cursor: default;
fill: #f00;
stroke-width: 1px;
stroke: #ccc;
}
.blocklyIconGroup:hover>.blocklyErrorIconShield {
fill: #f00;
stroke: #fff;
}
.blocklyWarningIconShield {
cursor: default;
fill: #ff5;
stroke-width: 1px;
stroke: #555;
}
.blocklyIconGroup:hover>.blocklyWarningIconShield {
fill: #ff0;
stroke: #000;
}
.blocklyWarningIconMark {
cursor: default !important;
font-family: sans-serif;
font-size: 9pt;
font-weight: bold;
fill: #555;
text-anchor: middle;
}
.blocklyIconGroup:hover>.blocklyWarningIconMark {
fill: #000;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB