blockly 7.20211209.2 → 8.0.0

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.
Files changed (262) hide show
  1. package/blockly.d.ts +18963 -18432
  2. package/blockly.min.js +852 -844
  3. package/blockly_compressed.js +669 -664
  4. package/blockly_compressed.js.map +1 -1
  5. package/blocks/blocks.js +47 -0
  6. package/blocks/colour.js +13 -3
  7. package/blocks/lists.js +22 -13
  8. package/blocks/logic.js +13 -3
  9. package/blocks/loops.js +24 -11
  10. package/blocks/math.js +12 -3
  11. package/blocks/procedures.js +41 -27
  12. package/blocks/text.js +22 -13
  13. package/blocks/variables.js +14 -3
  14. package/blocks/variables_dynamic.js +13 -3
  15. package/blocks_compressed.js +146 -141
  16. package/blocks_compressed.js.map +1 -1
  17. package/core/block.js +1869 -1814
  18. package/core/block_drag_surface.js +201 -200
  19. package/core/block_dragger.js +377 -373
  20. package/core/block_svg.js +1593 -1479
  21. package/core/blockly.js +8 -22
  22. package/core/blocks.js +9 -2
  23. package/core/browser_events.js +22 -5
  24. package/core/bubble.js +841 -797
  25. package/core/bubble_dragger.js +213 -206
  26. package/core/bump_objects.js +2 -2
  27. package/core/clipboard.js +9 -9
  28. package/core/comment.js +353 -332
  29. package/core/common.js +46 -17
  30. package/core/component_manager.js +181 -174
  31. package/core/config.js +87 -0
  32. package/core/connection.js +595 -584
  33. package/core/connection_checker.js +242 -244
  34. package/core/connection_db.js +235 -230
  35. package/core/contextmenu.js +9 -6
  36. package/core/contextmenu_items.js +1 -2
  37. package/core/contextmenu_registry.js +93 -89
  38. package/core/css.js +474 -474
  39. package/core/delete_area.js +45 -42
  40. package/core/drag_target.js +57 -56
  41. package/core/dropdowndiv.js +153 -163
  42. package/core/events/events.js +2 -2
  43. package/core/events/events_abstract.js +89 -77
  44. package/core/events/events_block_base.js +37 -36
  45. package/core/events/events_block_change.js +130 -124
  46. package/core/events/events_block_create.js +73 -71
  47. package/core/events/events_block_delete.js +84 -82
  48. package/core/events/events_block_drag.js +50 -49
  49. package/core/events/events_block_move.js +147 -140
  50. package/core/events/events_bubble_open.js +51 -50
  51. package/core/events/events_click.js +48 -44
  52. package/core/events/events_comment_base.js +72 -69
  53. package/core/events/events_comment_change.js +63 -61
  54. package/core/events/events_comment_create.js +44 -42
  55. package/core/events/events_comment_delete.js +42 -40
  56. package/core/events/events_comment_move.js +106 -104
  57. package/core/events/events_marker_move.js +65 -64
  58. package/core/events/events_selected.js +46 -45
  59. package/core/events/events_theme_change.js +36 -35
  60. package/core/events/events_toolbox_item_select.js +46 -45
  61. package/core/events/events_trashcan_open.js +37 -36
  62. package/core/events/events_ui.js +47 -46
  63. package/core/events/events_ui_base.js +30 -29
  64. package/core/events/events_var_base.js +37 -36
  65. package/core/events/events_var_create.js +50 -48
  66. package/core/events/events_var_delete.js +50 -48
  67. package/core/events/events_var_rename.js +51 -49
  68. package/core/events/events_viewport.js +66 -65
  69. package/core/events/utils.js +29 -14
  70. package/core/events/workspace_events.js +49 -55
  71. package/core/extensions.js +4 -3
  72. package/core/field.js +1061 -997
  73. package/core/field_angle.js +462 -442
  74. package/core/field_checkbox.js +194 -182
  75. package/core/field_colour.js +519 -505
  76. package/core/field_dropdown.js +617 -598
  77. package/core/field_image.js +229 -220
  78. package/core/field_label.js +102 -91
  79. package/core/field_label_serializable.js +42 -41
  80. package/core/field_multilineinput.js +372 -358
  81. package/core/field_number.js +272 -253
  82. package/core/field_textinput.js +499 -467
  83. package/core/field_variable.js +458 -420
  84. package/core/flyout_base.js +1005 -952
  85. package/core/flyout_button.js +277 -260
  86. package/core/flyout_horizontal.js +304 -302
  87. package/core/flyout_metrics_manager.js +64 -64
  88. package/core/flyout_vertical.js +306 -300
  89. package/core/generator.js +459 -446
  90. package/core/gesture.js +829 -813
  91. package/core/grid.js +166 -163
  92. package/core/icon.js +168 -159
  93. package/core/inject.js +7 -5
  94. package/core/input.js +257 -248
  95. package/core/insertion_marker_manager.js +655 -624
  96. package/core/internal_constants.js +0 -129
  97. package/core/keyboard_nav/ast_node.js +605 -596
  98. package/core/keyboard_nav/basic_cursor.js +166 -165
  99. package/core/keyboard_nav/cursor.js +99 -97
  100. package/core/keyboard_nav/marker.js +83 -79
  101. package/core/keyboard_nav/tab_navigate_cursor.js +18 -23
  102. package/core/marker_manager.js +153 -141
  103. package/core/menu.js +377 -372
  104. package/core/menuitem.js +223 -217
  105. package/core/metrics_manager.js +403 -390
  106. package/core/mutator.js +468 -437
  107. package/core/names.js +229 -188
  108. package/core/options.js +290 -284
  109. package/core/procedures.js +29 -17
  110. package/core/registry.js +19 -16
  111. package/core/rendered_connection.js +482 -463
  112. package/core/renderers/common/block_rendering.js +9 -3
  113. package/core/renderers/common/constants.js +1119 -1112
  114. package/core/renderers/common/debug.js +14 -0
  115. package/core/renderers/common/debugger.js +338 -316
  116. package/core/renderers/common/drawer.js +380 -370
  117. package/core/renderers/common/i_path_object.js +2 -2
  118. package/core/renderers/common/info.js +626 -618
  119. package/core/renderers/common/marker_svg.js +579 -541
  120. package/core/renderers/common/path_object.js +203 -200
  121. package/core/renderers/common/renderer.js +220 -218
  122. package/core/renderers/geras/constants.js +36 -36
  123. package/core/renderers/geras/drawer.js +155 -147
  124. package/core/renderers/geras/highlight_constants.js +244 -238
  125. package/core/renderers/geras/highlighter.js +231 -179
  126. package/core/renderers/geras/info.js +392 -369
  127. package/core/renderers/geras/measurables/inline_input.js +25 -19
  128. package/core/renderers/geras/measurables/statement_input.js +23 -17
  129. package/core/renderers/geras/path_object.js +106 -121
  130. package/core/renderers/geras/renderer.js +96 -98
  131. package/core/renderers/measurables/base.js +30 -18
  132. package/core/renderers/measurables/bottom_row.js +83 -80
  133. package/core/renderers/measurables/connection.js +22 -15
  134. package/core/renderers/measurables/external_value_input.js +35 -22
  135. package/core/renderers/measurables/field.js +35 -20
  136. package/core/renderers/measurables/hat.js +18 -13
  137. package/core/renderers/measurables/icon.js +24 -17
  138. package/core/renderers/measurables/in_row_spacer.js +15 -13
  139. package/core/renderers/measurables/inline_input.js +43 -33
  140. package/core/renderers/measurables/input_connection.js +41 -28
  141. package/core/renderers/measurables/input_row.js +50 -44
  142. package/core/renderers/measurables/jagged_edge.js +14 -12
  143. package/core/renderers/measurables/next_connection.js +16 -14
  144. package/core/renderers/measurables/output_connection.js +26 -20
  145. package/core/renderers/measurables/previous_connection.js +16 -15
  146. package/core/renderers/measurables/round_corner.js +20 -18
  147. package/core/renderers/measurables/row.js +184 -168
  148. package/core/renderers/measurables/spacer_row.js +38 -23
  149. package/core/renderers/measurables/square_corner.js +18 -16
  150. package/core/renderers/measurables/statement_input.js +23 -20
  151. package/core/renderers/measurables/top_row.js +88 -85
  152. package/core/renderers/minimalist/constants.js +8 -7
  153. package/core/renderers/minimalist/drawer.js +11 -10
  154. package/core/renderers/minimalist/info.js +18 -18
  155. package/core/renderers/minimalist/renderer.js +40 -39
  156. package/core/renderers/thrasos/info.js +258 -248
  157. package/core/renderers/thrasos/renderer.js +20 -20
  158. package/core/renderers/zelos/constants.js +898 -873
  159. package/core/renderers/zelos/drawer.js +186 -169
  160. package/core/renderers/zelos/info.js +502 -479
  161. package/core/renderers/zelos/marker_svg.js +129 -115
  162. package/core/renderers/zelos/measurables/bottom_row.js +31 -30
  163. package/core/renderers/zelos/measurables/inputs.js +22 -21
  164. package/core/renderers/zelos/measurables/row_elements.js +14 -13
  165. package/core/renderers/zelos/measurables/top_row.js +34 -33
  166. package/core/renderers/zelos/path_object.js +181 -180
  167. package/core/renderers/zelos/renderer.js +91 -92
  168. package/core/scrollbar.js +759 -713
  169. package/core/scrollbar_pair.js +250 -245
  170. package/core/serialization/blocks.js +19 -9
  171. package/core/serialization/workspaces.js +3 -2
  172. package/core/shortcut_registry.js +286 -277
  173. package/core/sprites.js +31 -0
  174. package/core/theme.js +135 -141
  175. package/core/theme_manager.js +147 -143
  176. package/core/toolbox/category.js +602 -576
  177. package/core/toolbox/collapsible_category.js +226 -227
  178. package/core/toolbox/separator.js +70 -61
  179. package/core/toolbox/toolbox.js +934 -927
  180. package/core/toolbox/toolbox_item.js +115 -99
  181. package/core/tooltip.js +108 -35
  182. package/core/touch.js +8 -3
  183. package/core/touch_gesture.js +254 -251
  184. package/core/trashcan.js +606 -595
  185. package/core/utils/coordinate.js +97 -95
  186. package/core/utils/dom.js +2 -2
  187. package/core/utils/global.js +2 -0
  188. package/core/utils/rect.js +41 -37
  189. package/core/utils/sentinel.js +25 -0
  190. package/core/utils/size.js +30 -27
  191. package/core/utils/svg.js +18 -16
  192. package/core/variable_map.js +325 -341
  193. package/core/variable_model.js +55 -54
  194. package/core/variables.js +9 -2
  195. package/core/variables_dynamic.js +3 -1
  196. package/core/warning.js +126 -120
  197. package/core/widgetdiv.js +4 -4
  198. package/core/workspace.js +685 -664
  199. package/core/workspace_audio.js +124 -118
  200. package/core/workspace_comment.js +308 -298
  201. package/core/workspace_comment_svg.js +1029 -951
  202. package/core/workspace_drag_surface_svg.js +147 -140
  203. package/core/workspace_dragger.js +70 -71
  204. package/core/workspace_svg.js +2322 -2297
  205. package/core/xml.js +30 -20
  206. package/core/zoom_controls.js +431 -439
  207. package/dart_compressed.js +40 -43
  208. package/dart_compressed.js.map +1 -1
  209. package/generators/dart/colour.js +56 -64
  210. package/generators/dart/lists.js +61 -50
  211. package/generators/dart/math.js +160 -148
  212. package/generators/dart/text.js +83 -61
  213. package/generators/javascript/colour.js +37 -34
  214. package/generators/javascript/lists.js +50 -43
  215. package/generators/javascript/math.js +123 -139
  216. package/generators/javascript/text.js +67 -81
  217. package/generators/lua/colour.js +25 -23
  218. package/generators/lua/lists.js +97 -69
  219. package/generators/lua/logic.js +1 -2
  220. package/generators/lua/math.js +182 -144
  221. package/generators/lua/text.js +116 -99
  222. package/generators/php/colour.js +38 -32
  223. package/generators/php/lists.js +109 -89
  224. package/generators/php/math.js +90 -81
  225. package/generators/php/text.js +63 -61
  226. package/generators/python/colour.js +18 -18
  227. package/generators/python/lists.js +38 -30
  228. package/generators/python/loops.js +12 -8
  229. package/generators/python/math.js +104 -106
  230. package/generators/python/text.js +34 -30
  231. package/javascript_compressed.js +37 -39
  232. package/javascript_compressed.js.map +1 -1
  233. package/lua_compressed.js +39 -42
  234. package/lua_compressed.js.map +1 -1
  235. package/msg/az.js +2 -2
  236. package/msg/be.js +4 -4
  237. package/msg/cs.js +15 -15
  238. package/msg/de.js +1 -1
  239. package/msg/diq.js +1 -1
  240. package/msg/eo.js +1 -1
  241. package/msg/es.js +1 -1
  242. package/msg/fa.js +1 -1
  243. package/msg/fr.js +4 -4
  244. package/msg/he.js +1 -1
  245. package/msg/hr.js +2 -2
  246. package/msg/hy.js +2 -2
  247. package/msg/id.js +12 -12
  248. package/msg/inh.js +14 -14
  249. package/msg/ja.js +7 -7
  250. package/msg/lv.js +29 -29
  251. package/msg/pa.js +3 -3
  252. package/msg/smn.js +436 -0
  253. package/msg/te.js +1 -1
  254. package/msg/yue.js +1 -1
  255. package/msg/zh-hans.js +3 -3
  256. package/msg/zh-hant.js +3 -3
  257. package/package.json +7 -6
  258. package/php_compressed.js +38 -42
  259. package/php_compressed.js.map +1 -1
  260. package/python_compressed.js +26 -25
  261. package/python_compressed.js.map +1 -1
  262. package/blocks/all.js +0 -23
@@ -17,147 +17,153 @@
17
17
  */
18
18
  goog.module('Blockly.WorkspaceAudio');
19
19
 
20
- const internalConstants = goog.require('Blockly.internalConstants');
21
20
  const userAgent = goog.require('Blockly.utils.userAgent');
22
21
  /* eslint-disable-next-line no-unused-vars */
23
22
  const {WorkspaceSvg} = goog.requireType('Blockly.WorkspaceSvg');
24
23
  const {globalThis} = goog.require('Blockly.utils.global');
25
24
 
26
25
 
26
+ /**
27
+ * Prevent a sound from playing if another sound preceded it within this many
28
+ * milliseconds.
29
+ * @const
30
+ */
31
+ const SOUND_LIMIT = 100;
32
+
27
33
  /**
28
34
  * Class for loading, storing, and playing audio for a workspace.
29
- * @param {WorkspaceSvg} parentWorkspace The parent of the workspace
30
- * this audio object belongs to, or null.
31
- * @constructor
32
35
  * @alias Blockly.WorkspaceAudio
33
36
  */
34
- const WorkspaceAudio = function(parentWorkspace) {
35
- /**
36
- * The parent of the workspace this object belongs to, or null. May be
37
- * checked for sounds that this object can't find.
38
- * @type {WorkspaceSvg}
39
- * @private
40
- */
41
- this.parentWorkspace_ = parentWorkspace;
42
-
37
+ class WorkspaceAudio {
43
38
  /**
44
- * Database of pre-loaded sounds.
45
- * @private
39
+ * @param {WorkspaceSvg} parentWorkspace The parent of the workspace
40
+ * this audio object belongs to, or null.
46
41
  */
47
- this.SOUNDS_ = Object.create(null);
48
- };
42
+ constructor(parentWorkspace) {
43
+ /**
44
+ * The parent of the workspace this object belongs to, or null. May be
45
+ * checked for sounds that this object can't find.
46
+ * @type {WorkspaceSvg}
47
+ * @private
48
+ */
49
+ this.parentWorkspace_ = parentWorkspace;
49
50
 
50
- /**
51
- * Time that the last sound was played.
52
- * @type {Date}
53
- * @private
54
- */
55
- WorkspaceAudio.prototype.lastSound_ = null;
51
+ /**
52
+ * Database of pre-loaded sounds.
53
+ * @private
54
+ */
55
+ this.SOUNDS_ = Object.create(null);
56
56
 
57
- /**
58
- * Dispose of this audio manager.
59
- * @package
60
- */
61
- WorkspaceAudio.prototype.dispose = function() {
62
- this.parentWorkspace_ = null;
63
- this.SOUNDS_ = null;
64
- };
65
-
66
- /**
67
- * Load an audio file. Cache it, ready for instantaneous playing.
68
- * @param {!Array<string>} filenames List of file types in decreasing order of
69
- * preference (i.e. increasing size). E.g. ['media/go.mp3', 'media/go.wav']
70
- * Filenames include path from Blockly's root. File extensions matter.
71
- * @param {string} name Name of sound.
72
- */
73
- WorkspaceAudio.prototype.load = function(filenames, name) {
74
- if (!filenames.length) {
75
- return;
57
+ /**
58
+ * Time that the last sound was played.
59
+ * @type {Date}
60
+ * @private
61
+ */
62
+ this.lastSound_ = null;
76
63
  }
77
- let audioTest;
78
- try {
79
- audioTest = new globalThis['Audio']();
80
- } catch (e) {
81
- // No browser support for Audio.
82
- // IE can throw an error even if the Audio object exists.
83
- return;
64
+
65
+ /**
66
+ * Dispose of this audio manager.
67
+ * @package
68
+ */
69
+ dispose() {
70
+ this.parentWorkspace_ = null;
71
+ this.SOUNDS_ = null;
84
72
  }
85
- let sound;
86
- for (let i = 0; i < filenames.length; i++) {
87
- const filename = filenames[i];
88
- const ext = filename.match(/\.(\w+)$/);
89
- if (ext && audioTest.canPlayType('audio/' + ext[1])) {
90
- // Found an audio format we can play.
91
- sound = new globalThis['Audio'](filename);
92
- break;
73
+ /**
74
+ * Load an audio file. Cache it, ready for instantaneous playing.
75
+ * @param {!Array<string>} filenames List of file types in decreasing order of
76
+ * preference (i.e. increasing size). E.g. ['media/go.mp3', 'media/go.wav']
77
+ * Filenames include path from Blockly's root. File extensions matter.
78
+ * @param {string} name Name of sound.
79
+ */
80
+ load(filenames, name) {
81
+ if (!filenames.length) {
82
+ return;
93
83
  }
94
- }
95
- if (sound && sound.play) {
96
- this.SOUNDS_[name] = sound;
97
- }
98
- };
99
-
100
- /**
101
- * Preload all the audio files so that they play quickly when asked for.
102
- * @package
103
- */
104
- WorkspaceAudio.prototype.preload = function() {
105
- for (const name in this.SOUNDS_) {
106
- const sound = this.SOUNDS_[name];
107
- sound.volume = 0.01;
108
- const playPromise = sound.play();
109
- // Edge does not return a promise, so we need to check.
110
- if (playPromise !== undefined) {
111
- // If we don't wait for the play request to complete before calling
112
- // pause() we will get an exception: (DOMException: The play() request was
113
- // interrupted) See more:
114
- // https://developers.google.com/web/updates/2017/06/play-request-was-interrupted
115
- playPromise.then(sound.pause).catch(function() {
116
- // Play without user interaction was prevented.
117
- });
118
- } else {
119
- sound.pause();
84
+ let audioTest;
85
+ try {
86
+ audioTest = new globalThis['Audio']();
87
+ } catch (e) {
88
+ // No browser support for Audio.
89
+ // IE can throw an error even if the Audio object exists.
90
+ return;
120
91
  }
121
-
122
- // iOS can only process one sound at a time. Trying to load more than one
123
- // corrupts the earlier ones. Just load one and leave the others uncached.
124
- if (userAgent.IPAD || userAgent.IPHONE) {
125
- break;
92
+ let sound;
93
+ for (let i = 0; i < filenames.length; i++) {
94
+ const filename = filenames[i];
95
+ const ext = filename.match(/\.(\w+)$/);
96
+ if (ext && audioTest.canPlayType('audio/' + ext[1])) {
97
+ // Found an audio format we can play.
98
+ sound = new globalThis['Audio'](filename);
99
+ break;
100
+ }
101
+ }
102
+ if (sound && sound.play) {
103
+ this.SOUNDS_[name] = sound;
126
104
  }
127
105
  }
128
- };
106
+ /**
107
+ * Preload all the audio files so that they play quickly when asked for.
108
+ * @package
109
+ */
110
+ preload() {
111
+ for (const name in this.SOUNDS_) {
112
+ const sound = this.SOUNDS_[name];
113
+ sound.volume = 0.01;
114
+ const playPromise = sound.play();
115
+ // Edge does not return a promise, so we need to check.
116
+ if (playPromise !== undefined) {
117
+ // If we don't wait for the play request to complete before calling
118
+ // pause() we will get an exception: (DOMException: The play() request
119
+ // was interrupted) See more:
120
+ // https://developers.google.com/web/updates/2017/06/play-request-was-interrupted
121
+ playPromise.then(sound.pause).catch(function() {
122
+ // Play without user interaction was prevented.
123
+ });
124
+ } else {
125
+ sound.pause();
126
+ }
129
127
 
130
- /**
131
- * Play a named sound at specified volume. If volume is not specified,
132
- * use full volume (1).
133
- * @param {string} name Name of sound.
134
- * @param {number=} opt_volume Volume of sound (0-1).
135
- */
136
- WorkspaceAudio.prototype.play = function(name, opt_volume) {
137
- const sound = this.SOUNDS_[name];
138
- if (sound) {
139
- // Don't play one sound on top of another.
140
- const now = new Date;
141
- if (this.lastSound_ !== null &&
142
- now - this.lastSound_ < internalConstants.SOUND_LIMIT) {
143
- return;
128
+ // iOS can only process one sound at a time. Trying to load more than one
129
+ // corrupts the earlier ones. Just load one and leave the others
130
+ // uncached.
131
+ if (userAgent.IPAD || userAgent.IPHONE) {
132
+ break;
133
+ }
144
134
  }
145
- this.lastSound_ = now;
146
- let mySound;
147
- if (userAgent.IPAD || userAgent.ANDROID) {
148
- // Creating a new audio node causes lag in Android and iPad. Android
149
- // refetches the file from the server, iPad uses a singleton audio
150
- // node which must be deleted and recreated for each new audio tag.
151
- mySound = sound;
152
- } else {
153
- mySound = sound.cloneNode();
135
+ }
136
+ /**
137
+ * Play a named sound at specified volume. If volume is not specified,
138
+ * use full volume (1).
139
+ * @param {string} name Name of sound.
140
+ * @param {number=} opt_volume Volume of sound (0-1).
141
+ */
142
+ play(name, opt_volume) {
143
+ const sound = this.SOUNDS_[name];
144
+ if (sound) {
145
+ // Don't play one sound on top of another.
146
+ const now = new Date;
147
+ if (this.lastSound_ !== null && now - this.lastSound_ < SOUND_LIMIT) {
148
+ return;
149
+ }
150
+ this.lastSound_ = now;
151
+ let mySound;
152
+ if (userAgent.IPAD || userAgent.ANDROID) {
153
+ // Creating a new audio node causes lag in Android and iPad. Android
154
+ // refetches the file from the server, iPad uses a singleton audio
155
+ // node which must be deleted and recreated for each new audio tag.
156
+ mySound = sound;
157
+ } else {
158
+ mySound = sound.cloneNode();
159
+ }
160
+ mySound.volume = (opt_volume === undefined ? 1 : opt_volume);
161
+ mySound.play();
162
+ } else if (this.parentWorkspace_) {
163
+ // Maybe a workspace on a lower level knows about this sound.
164
+ this.parentWorkspace_.getAudioManager().play(name, opt_volume);
154
165
  }
155
- mySound.volume = (opt_volume === undefined ? 1 : opt_volume);
156
- mySound.play();
157
- } else if (this.parentWorkspace_) {
158
- // Maybe a workspace on a lower level knows about this sound.
159
- this.parentWorkspace_.getAudioManager().play(name, opt_volume);
160
166
  }
161
- };
167
+ }
162
168
 
163
169
  exports.WorkspaceAudio = WorkspaceAudio;