From eac5aa21c4ff5beb6f2b432efb37914c199b163f Mon Sep 17 00:00:00 2001 From: github-actions-bot Date: Thu, 2 May 2024 17:19:10 +0000 Subject: [PATCH] Updates --- plugins/continuous-toolbox/README.html | 2 +- plugins/continuous-toolbox/build/test_bundle.js | 2 +- plugins/continuous-toolbox/test/index.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/continuous-toolbox/README.html b/plugins/continuous-toolbox/README.html index 3dcc24ba45..1ba1748793 100644 --- a/plugins/continuous-toolbox/README.html +++ b/plugins/continuous-toolbox/README.html @@ -24,7 +24,7 @@
@blockly/continuous-toolbox Demo
A Blockly plugin that adds a continous-scrolling style toolbox and flyout
- 5.0.16 + 5.0.17 View code View on npm diff --git a/plugins/continuous-toolbox/build/test_bundle.js b/plugins/continuous-toolbox/build/test_bundle.js index b5791f46f6..d6060f3af7 100644 --- a/plugins/continuous-toolbox/build/test_bundle.js +++ b/plugins/continuous-toolbox/build/test_bundle.js @@ -279,7 +279,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ContinuousFlyout\": () => (/* binding */ ContinuousFlyout)\n/* harmony export */ });\n/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ \"./node_modules/blockly/core-browser.js\");\n/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _ContinuousToolbox__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ContinuousToolbox */ \"./src/ContinuousToolbox.js\");\n/* harmony import */ var _ContinuousMetricsFlyout__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ContinuousMetricsFlyout */ \"./src/ContinuousMetricsFlyout.js\");\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Flyout that supports always-open continuous scrolling.\n */\n\n\n\n\n\n/**\n * Class for continuous flyout.\n */\nclass ContinuousFlyout extends blockly_core__WEBPACK_IMPORTED_MODULE_0__.VerticalFlyout {\n /** @override */\n constructor(workspaceOptions) {\n super(workspaceOptions);\n\n /**\n * List of scroll positions for each category.\n * @type {!Array<{name: string, position: !Object}>}\n */\n this.scrollPositions = [];\n\n /**\n * Target scroll position, used to smoothly scroll to a given category\n * location when selected.\n * @type {?number}\n */\n this.scrollTarget = null;\n\n /**\n * The percentage of the distance to the scrollTarget that should be\n * scrolled at a time. Lower values will produce a smoother, slower scroll.\n * @type {number}\n */\n this.scrollAnimationFraction = 0.3;\n\n /**\n * Whether to recycle blocks when refreshing the flyout. When false, do not\n * allow anything to be recycled. The default is to recycle.\n * @type {boolean}\n * @private\n */\n this.recyclingEnabled_ = true;\n\n this.workspace_.setMetricsManager(\n new _ContinuousMetricsFlyout__WEBPACK_IMPORTED_MODULE_2__.ContinuousFlyoutMetrics(this.workspace_, this),\n );\n\n this.workspace_.addChangeListener((e) => {\n if (e.type === blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.VIEWPORT_CHANGE) {\n this.selectCategoryByScrollPosition_(-this.workspace_.scrollY);\n }\n });\n\n this.autoClose = false;\n }\n\n /**\n * Gets parent toolbox.\n * Since we registered the ContinuousToolbox, we know that's its type.\n * @returns {!ContinuousToolbox} Toolbox that owns this flyout.\n * @private\n */\n getParentToolbox_() {\n const toolbox = this.targetWorkspace.getToolbox();\n return /** @type {!ContinuousToolbox} */ (toolbox);\n }\n\n /**\n * Records scroll position for each category in the toolbox.\n * The scroll position is determined by the coordinates of each category's\n * label after the entire flyout has been rendered.\n * @package\n */\n recordScrollPositions() {\n this.scrollPositions = [];\n const categoryLabels = this.buttons_.filter(\n (button) =>\n button.isLabel() &&\n this.getParentToolbox_().getCategoryByName(button.getButtonText()),\n );\n for (const [index, button] of categoryLabels.entries()) {\n if (button.isLabel()) {\n const position = button.getPosition();\n const adjustedPosition = new blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.Coordinate(\n position.x,\n position.y - this.labelGaps[index],\n );\n this.scrollPositions.push({\n name: button.getButtonText(),\n position: adjustedPosition,\n });\n }\n }\n }\n\n /**\n * Returns the scroll position for the given category name.\n * @param {string} name Category name.\n * @returns {?Object} Scroll position for given category, or null if not\n * found.\n * @package\n */\n getCategoryScrollPosition(name) {\n for (const scrollInfo of this.scrollPositions) {\n if (scrollInfo.name === name) {\n return scrollInfo.position;\n }\n }\n console.warn(`Scroll position not recorded for category ${name}`);\n return null;\n }\n\n /**\n * Selects an item in the toolbox based on the scroll position of the flyout.\n * @param {number} position Current scroll position of the workspace.\n * @private\n */\n selectCategoryByScrollPosition_(position) {\n // If we are currently auto-scrolling, due to selecting a category by\n // clicking on it, do not update the category selection.\n if (this.scrollTarget !== null) {\n return;\n }\n const scaledPosition = Math.round(position / this.workspace_.scale);\n // Traverse the array of scroll positions in reverse, so we can select the\n // furthest category that the scroll position is beyond.\n for (let i = this.scrollPositions.length - 1; i >= 0; i--) {\n const category = this.scrollPositions[i];\n if (scaledPosition >= category.position.y) {\n this.getParentToolbox_().selectCategoryByName(category.name);\n return;\n }\n }\n }\n\n /**\n * Scrolls flyout to given position.\n * @param {number} position The Y coordinate to scroll to.\n */\n scrollTo(position) {\n // Set the scroll target to either the scaled position or the lowest\n // possible scroll point, whichever is smaller.\n const metrics = this.workspace_.getMetrics();\n this.scrollTarget = Math.min(\n position * this.workspace_.scale,\n metrics.scrollHeight - metrics.viewHeight,\n );\n\n this.stepScrollAnimation_();\n }\n\n /**\n * Step the scrolling animation by scrolling a fraction of the way to\n * a scroll target, and request the next frame if necessary.\n * @private\n */\n stepScrollAnimation_() {\n if (this.scrollTarget === null) {\n return;\n }\n\n const currentScrollPos = -this.workspace_.scrollY;\n const diff = this.scrollTarget - currentScrollPos;\n if (Math.abs(diff) < 1) {\n this.workspace_.scrollbar.setY(this.scrollTarget);\n this.scrollTarget = null;\n return;\n }\n this.workspace_.scrollbar.setY(\n currentScrollPos + diff * this.scrollAnimationFraction,\n );\n\n requestAnimationFrame(this.stepScrollAnimation_.bind(this));\n }\n\n /**\n * Add additional padding to the bottom of the flyout if needed,\n * in order to make it possible to scroll to the top of the last category.\n * @param {!Blockly.MetricsManager.ContainerRegion} contentMetrics Content\n * metrics for the flyout.\n * @param {!Blockly.MetricsManager.ContainerRegion} viewMetrics View metrics\n * for the flyout.\n * @returns {number} Additional bottom padding.\n */\n calculateBottomPadding(contentMetrics, viewMetrics) {\n if (this.scrollPositions.length > 0) {\n const lastCategory =\n this.scrollPositions[this.scrollPositions.length - 1];\n const lastPosition = lastCategory.position.y * this.workspace_.scale;\n const lastCategoryHeight = contentMetrics.height - lastPosition;\n if (lastCategoryHeight < viewMetrics.height) {\n return viewMetrics.height - lastCategoryHeight;\n }\n }\n return 0;\n }\n\n /** @override */\n getX() {\n if (\n this.isVisible() &&\n this.targetWorkspace.toolboxPosition === this.toolboxPosition_ &&\n this.targetWorkspace.getToolbox() &&\n this.toolboxPosition_ !== blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.toolbox.Position.LEFT\n ) {\n // This makes it so blocks cannot go under the flyout in RTL mode.\n return this.targetWorkspace.getMetricsManager().getViewMetrics().width;\n }\n\n return super.getX();\n }\n\n /**\n * @override\n */\n show(flyoutDef) {\n super.show(flyoutDef);\n this.recordScrollPositions();\n this.workspace_.resizeContents();\n this.selectCategoryByScrollPosition_(0);\n }\n\n /**\n * Determine if this block can be recycled in the flyout. Blocks that have no\n * variables and are not dynamic shadows can be recycled.\n * @param {!Blockly.BlockSvg} block The block to attempt to recycle.\n * @returns {boolean} True if the block can be recycled.\n * @protected\n */\n blockIsRecyclable_(block) {\n if (!this.recyclingEnabled_) {\n return false;\n }\n\n // If the block needs to parse mutations, never recycle.\n if (block.mutationToDom && block.domToMutation) {\n return false;\n }\n\n if (!block.isEnabled()) {\n return false;\n }\n\n for (const input of block.inputList) {\n for (const field of input.fieldRow) {\n // No variables.\n if (field.referencesVariables()) {\n return false;\n }\n if (field instanceof blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown) {\n if (field.isOptionListDynamic()) {\n return false;\n }\n }\n }\n // Check children.\n if (input.connection) {\n const targetBlock =\n /** @type {Blockly.BlockSvg} */\n (input.connection.targetBlock());\n if (targetBlock && !this.blockIsRecyclable_(targetBlock)) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * Sets the function used to determine whether a block is recyclable.\n * @param {function(!Blockly.BlockSvg):boolean} func The function used to\n * determine if a block is recyclable.\n * @public\n */\n setBlockIsRecyclable(func) {\n this.blockIsRecyclable_ = func;\n }\n\n /**\n * Set whether the flyout can recycle blocks.\n * @param {boolean} isEnabled True to allow blocks to be recycled, false\n * otherwise.\n * @public\n */\n setRecyclingEnabled(isEnabled) {\n this.recyclingEnabled_ = isEnabled;\n }\n\n /**\n * Lay out the blocks in the flyout.\n * @param {Array} contents The blocks and buttons to lay out.\n * @param {Array} gaps The visible gaps between blocks.\n */\n layout_(contents, gaps) {\n super.layout_(contents, gaps);\n this.labelGaps = [];\n for (const [index, item] of contents.entries()) {\n if (item.type === 'button' && item.button.isLabel()) {\n this.labelGaps.push(gaps[index - 1] ?? this.MARGIN);\n }\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BibG9ja2x5L2NvbnRpbnVvdXMtdG9vbGJveC8uL3NyYy9Db250aW51b3VzRmx5b3V0LmpzP2JjZmMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgRmx5b3V0IHRoYXQgc3VwcG9ydHMgYWx3YXlzLW9wZW4gY29udGludW91cyBzY3JvbGxpbmcuXG4gKi9cblxuaW1wb3J0ICogYXMgQmxvY2tseSBmcm9tICdibG9ja2x5L2NvcmUnO1xuaW1wb3J0IHtDb250aW51b3VzVG9vbGJveH0gZnJvbSAnLi9Db250aW51b3VzVG9vbGJveCc7XG5pbXBvcnQge0NvbnRpbnVvdXNGbHlvdXRNZXRyaWNzfSBmcm9tICcuL0NvbnRpbnVvdXNNZXRyaWNzRmx5b3V0JztcblxuLyoqXG4gKiBDbGFzcyBmb3IgY29udGludW91cyBmbHlvdXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250aW51b3VzRmx5b3V0IGV4dGVuZHMgQmxvY2tseS5WZXJ0aWNhbEZseW91dCB7XG4gIC8qKiBAb3ZlcnJpZGUgKi9cbiAgY29uc3RydWN0b3Iod29ya3NwYWNlT3B0aW9ucykge1xuICAgIHN1cGVyKHdvcmtzcGFjZU9wdGlvbnMpO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBzY3JvbGwgcG9zaXRpb25zIGZvciBlYWNoIGNhdGVnb3J5LlxuICAgICAqIEB0eXBlIHshQXJyYXk8e25hbWU6IHN0cmluZywgcG9zaXRpb246ICFPYmplY3R9Pn1cbiAgICAgKi9cbiAgICB0aGlzLnNjcm9sbFBvc2l0aW9ucyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogVGFyZ2V0IHNjcm9sbCBwb3NpdGlvbiwgdXNlZCB0byBzbW9vdGhseSBzY3JvbGwgdG8gYSBnaXZlbiBjYXRlZ29yeVxuICAgICAqIGxvY2F0aW9uIHdoZW4gc2VsZWN0ZWQuXG4gICAgICogQHR5cGUgez9udW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5zY3JvbGxUYXJnZXQgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGRpc3RhbmNlIHRvIHRoZSBzY3JvbGxUYXJnZXQgdGhhdCBzaG91bGQgYmVcbiAgICAgKiBzY3JvbGxlZCBhdCBhIHRpbWUuIExvd2VyIHZhbHVlcyB3aWxsIHByb2R1Y2UgYSBzbW9vdGhlciwgc2xvd2VyIHNjcm9sbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuc2Nyb2xsQW5pbWF0aW9uRnJhY3Rpb24gPSAwLjM7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIHJlY3ljbGUgYmxvY2tzIHdoZW4gcmVmcmVzaGluZyB0aGUgZmx5b3V0LiBXaGVuIGZhbHNlLCBkbyBub3RcbiAgICAgKiBhbGxvdyBhbnl0aGluZyB0byBiZSByZWN5Y2xlZC4gVGhlIGRlZmF1bHQgaXMgdG8gcmVjeWNsZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMucmVjeWNsaW5nRW5hYmxlZF8gPSB0cnVlO1xuXG4gICAgdGhpcy53b3Jrc3BhY2VfLnNldE1ldHJpY3NNYW5hZ2VyKFxuICAgICAgbmV3IENvbnRpbnVvdXNGbHlvdXRNZXRyaWNzKHRoaXMud29ya3NwYWNlXywgdGhpcyksXG4gICAgKTtcblxuICAgIHRoaXMud29ya3NwYWNlXy5hZGRDaGFuZ2VMaXN0ZW5lcigoZSkgPT4ge1xuICAgICAgaWYgKGUudHlwZSA9PT0gQmxvY2tseS5FdmVudHMuVklFV1BPUlRfQ0hBTkdFKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Q2F0ZWdvcnlCeVNjcm9sbFBvc2l0aW9uXygtdGhpcy53b3Jrc3BhY2VfLnNjcm9sbFkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hdXRvQ2xvc2UgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHBhcmVudCB0b29sYm94LlxuICAgKiBTaW5jZSB3ZSByZWdpc3RlcmVkIHRoZSBDb250aW51b3VzVG9vbGJveCwgd2Uga25vdyB0aGF0J3MgaXRzIHR5cGUuXG4gICAqIEByZXR1cm5zIHshQ29udGludW91c1Rvb2xib3h9IFRvb2xib3ggdGhhdCBvd25zIHRoaXMgZmx5b3V0LlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0UGFyZW50VG9vbGJveF8oKSB7XG4gICAgY29uc3QgdG9vbGJveCA9IHRoaXMudGFyZ2V0V29ya3NwYWNlLmdldFRvb2xib3goKTtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHshQ29udGludW91c1Rvb2xib3h9ICovICh0b29sYm94KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHNjcm9sbCBwb3NpdGlvbiBmb3IgZWFjaCBjYXRlZ29yeSBpbiB0aGUgdG9vbGJveC5cbiAgICogVGhlIHNjcm9sbCBwb3NpdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb29yZGluYXRlcyBvZiBlYWNoIGNhdGVnb3J5J3NcbiAgICogbGFiZWwgYWZ0ZXIgdGhlIGVudGlyZSBmbHlvdXQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqIEBwYWNrYWdlXG4gICAqL1xuICByZWNvcmRTY3JvbGxQb3NpdGlvbnMoKSB7XG4gICAgdGhpcy5zY3JvbGxQb3NpdGlvbnMgPSBbXTtcbiAgICBjb25zdCBjYXRlZ29yeUxhYmVscyA9IHRoaXMuYnV0dG9uc18uZmlsdGVyKFxuICAgICAgKGJ1dHRvbikgPT5cbiAgICAgICAgYnV0dG9uLmlzTGFiZWwoKSAmJlxuICAgICAgICB0aGlzLmdldFBhcmVudFRvb2xib3hfKCkuZ2V0Q2F0ZWdvcnlCeU5hbWUoYnV0dG9uLmdldEJ1dHRvblRleHQoKSksXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgYnV0dG9uXSBvZiBjYXRlZ29yeUxhYmVscy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChidXR0b24uaXNMYWJlbCgpKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gYnV0dG9uLmdldFBvc2l0aW9uKCk7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkUG9zaXRpb24gPSBuZXcgQmxvY2tseS51dGlscy5Db29yZGluYXRlKFxuICAgICAgICAgIHBvc2l0aW9uLngsXG4gICAgICAgICAgcG9zaXRpb24ueSAtIHRoaXMubGFiZWxHYXBzW2luZGV4XSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zY3JvbGxQb3NpdGlvbnMucHVzaCh7XG4gICAgICAgICAgbmFtZTogYnV0dG9uLmdldEJ1dHRvblRleHQoKSxcbiAgICAgICAgICBwb3NpdGlvbjogYWRqdXN0ZWRQb3NpdGlvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNjcm9sbCBwb3NpdGlvbiBmb3IgdGhlIGdpdmVuIGNhdGVnb3J5IG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENhdGVnb3J5IG5hbWUuXG4gICAqIEByZXR1cm5zIHs/T2JqZWN0fSBTY3JvbGwgcG9zaXRpb24gZm9yIGdpdmVuIGNhdGVnb3J5LCBvciBudWxsIGlmIG5vdFxuICAgKiAgICAgZm91bmQuXG4gICAqIEBwYWNrYWdlXG4gICAqL1xuICBnZXRDYXRlZ29yeVNjcm9sbFBvc2l0aW9uKG5hbWUpIHtcbiAgICBmb3IgKGNvbnN0IHNjcm9sbEluZm8gb2YgdGhpcy5zY3JvbGxQb3NpdGlvbnMpIHtcbiAgICAgIGlmIChzY3JvbGxJbmZvLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHNjcm9sbEluZm8ucG9zaXRpb247XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUud2FybihgU2Nyb2xsIHBvc2l0aW9uIG5vdCByZWNvcmRlZCBmb3IgY2F0ZWdvcnkgJHtuYW1lfWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYW4gaXRlbSBpbiB0aGUgdG9vbGJveCBiYXNlZCBvbiB0aGUgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBmbHlvdXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvbiBDdXJyZW50IHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgd29ya3NwYWNlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2VsZWN0Q2F0ZWdvcnlCeVNjcm9sbFBvc2l0aW9uXyhwb3NpdGlvbikge1xuICAgIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgYXV0by1zY3JvbGxpbmcsIGR1ZSB0byBzZWxlY3RpbmcgYSBjYXRlZ29yeSBieVxuICAgIC8vIGNsaWNraW5nIG9uIGl0LCBkbyBub3QgdXBkYXRlIHRoZSBjYXRlZ29yeSBzZWxlY3Rpb24uXG4gICAgaWYgKHRoaXMuc2Nyb2xsVGFyZ2V0ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjYWxlZFBvc2l0aW9uID0gTWF0aC5yb3VuZChwb3NpdGlvbiAvIHRoaXMud29ya3NwYWNlXy5zY2FsZSk7XG4gICAgLy8gVHJhdmVyc2UgdGhlIGFycmF5IG9mIHNjcm9sbCBwb3NpdGlvbnMgaW4gcmV2ZXJzZSwgc28gd2UgY2FuIHNlbGVjdCB0aGVcbiAgICAvLyBmdXJ0aGVzdCBjYXRlZ29yeSB0aGF0IHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgYmV5b25kLlxuICAgIGZvciAobGV0IGkgPSB0aGlzLnNjcm9sbFBvc2l0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSB0aGlzLnNjcm9sbFBvc2l0aW9uc1tpXTtcbiAgICAgIGlmIChzY2FsZWRQb3NpdGlvbiA+PSBjYXRlZ29yeS5wb3NpdGlvbi55KSB7XG4gICAgICAgIHRoaXMuZ2V0UGFyZW50VG9vbGJveF8oKS5zZWxlY3RDYXRlZ29yeUJ5TmFtZShjYXRlZ29yeS5uYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIGZseW91dCB0byBnaXZlbiBwb3NpdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uIFRoZSBZIGNvb3JkaW5hdGUgdG8gc2Nyb2xsIHRvLlxuICAgKi9cbiAgc2Nyb2xsVG8ocG9zaXRpb24pIHtcbiAgICAvLyBTZXQgdGhlIHNjcm9sbCB0YXJnZXQgdG8gZWl0aGVyIHRoZSBzY2FsZWQgcG9zaXRpb24gb3IgdGhlIGxvd2VzdFxuICAgIC8vIHBvc3NpYmxlIHNjcm9sbCBwb2ludCwgd2hpY2hldmVyIGlzIHNtYWxsZXIuXG4gICAgY29uc3QgbWV0cmljcyA9IHRoaXMud29ya3NwYWNlXy5nZXRNZXRyaWNzKCk7XG4gICAgdGhpcy5zY3JvbGxUYXJnZXQgPSBNYXRoLm1pbihcbiAgICAgIHBvc2l0aW9uICogdGhpcy53b3Jrc3BhY2VfLnNjYWxlLFxuICAgICAgbWV0cmljcy5zY3JvbGxIZWlnaHQgLSBtZXRyaWNzLnZpZXdIZWlnaHQsXG4gICAgKTtcblxuICAgIHRoaXMuc3RlcFNjcm9sbEFuaW1hdGlvbl8oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGVwIHRoZSBzY3JvbGxpbmcgYW5pbWF0aW9uIGJ5IHNjcm9sbGluZyBhIGZyYWN0aW9uIG9mIHRoZSB3YXkgdG9cbiAgICogYSBzY3JvbGwgdGFyZ2V0LCBhbmQgcmVxdWVzdCB0aGUgbmV4dCBmcmFtZSBpZiBuZWNlc3NhcnkuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdGVwU2Nyb2xsQW5pbWF0aW9uXygpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxUYXJnZXQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50U2Nyb2xsUG9zID0gLXRoaXMud29ya3NwYWNlXy5zY3JvbGxZO1xuICAgIGNvbnN0IGRpZmYgPSB0aGlzLnNjcm9sbFRhcmdldCAtIGN1cnJlbnRTY3JvbGxQb3M7XG4gICAgaWYgKE1hdGguYWJzKGRpZmYpIDwgMSkge1xuICAgICAgdGhpcy53b3Jrc3BhY2VfLnNjcm9sbGJhci5zZXRZKHRoaXMuc2Nyb2xsVGFyZ2V0KTtcbiAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy53b3Jrc3BhY2VfLnNjcm9sbGJhci5zZXRZKFxuICAgICAgY3VycmVudFNjcm9sbFBvcyArIGRpZmYgKiB0aGlzLnNjcm9sbEFuaW1hdGlvbkZyYWN0aW9uLFxuICAgICk7XG5cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5zdGVwU2Nyb2xsQW5pbWF0aW9uXy5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYWRkaXRpb25hbCBwYWRkaW5nIHRvIHRoZSBib3R0b20gb2YgdGhlIGZseW91dCBpZiBuZWVkZWQsXG4gICAqIGluIG9yZGVyIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gc2Nyb2xsIHRvIHRoZSB0b3Agb2YgdGhlIGxhc3QgY2F0ZWdvcnkuXG4gICAqIEBwYXJhbSB7IUJsb2NrbHkuTWV0cmljc01hbmFnZXIuQ29udGFpbmVyUmVnaW9ufSBjb250ZW50TWV0cmljcyBDb250ZW50XG4gICAqICAgIG1ldHJpY3MgZm9yIHRoZSBmbHlvdXQuXG4gICAqIEBwYXJhbSB7IUJsb2NrbHkuTWV0cmljc01hbmFnZXIuQ29udGFpbmVyUmVnaW9ufSB2aWV3TWV0cmljcyBWaWV3IG1ldHJpY3NcbiAgICogICAgZm9yIHRoZSBmbHlvdXQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IEFkZGl0aW9uYWwgYm90dG9tIHBhZGRpbmcuXG4gICAqL1xuICBjYWxjdWxhdGVCb3R0b21QYWRkaW5nKGNvbnRlbnRNZXRyaWNzLCB2aWV3TWV0cmljcykge1xuICAgIGlmICh0aGlzLnNjcm9sbFBvc2l0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0Q2F0ZWdvcnkgPVxuICAgICAgICB0aGlzLnNjcm9sbFBvc2l0aW9uc1t0aGlzLnNjcm9sbFBvc2l0aW9ucy5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IGxhc3RQb3NpdGlvbiA9IGxhc3RDYXRlZ29yeS5wb3NpdGlvbi55ICogdGhpcy53b3Jrc3BhY2VfLnNjYWxlO1xuICAgICAgY29uc3QgbGFzdENhdGVnb3J5SGVpZ2h0ID0gY29udGVudE1ldHJpY3MuaGVpZ2h0IC0gbGFzdFBvc2l0aW9uO1xuICAgICAgaWYgKGxhc3RDYXRlZ29yeUhlaWdodCA8IHZpZXdNZXRyaWNzLmhlaWdodCkge1xuICAgICAgICByZXR1cm4gdmlld01ldHJpY3MuaGVpZ2h0IC0gbGFzdENhdGVnb3J5SGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKi9cbiAgZ2V0WCgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzVmlzaWJsZSgpICYmXG4gICAgICB0aGlzLnRhcmdldFdvcmtzcGFjZS50b29sYm94UG9zaXRpb24gPT09IHRoaXMudG9vbGJveFBvc2l0aW9uXyAmJlxuICAgICAgdGhpcy50YXJnZXRXb3Jrc3BhY2UuZ2V0VG9vbGJveCgpICYmXG4gICAgICB0aGlzLnRvb2xib3hQb3NpdGlvbl8gIT09IEJsb2NrbHkudXRpbHMudG9vbGJveC5Qb3NpdGlvbi5MRUZUXG4gICAgKSB7XG4gICAgICAvLyBUaGlzIG1ha2VzIGl0IHNvIGJsb2NrcyBjYW5ub3QgZ28gdW5kZXIgdGhlIGZseW91dCBpbiBSVEwgbW9kZS5cbiAgICAgIHJldHVybiB0aGlzLnRhcmdldFdvcmtzcGFjZS5nZXRNZXRyaWNzTWFuYWdlcigpLmdldFZpZXdNZXRyaWNzKCkud2lkdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmdldFgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHNob3coZmx5b3V0RGVmKSB7XG4gICAgc3VwZXIuc2hvdyhmbHlvdXREZWYpO1xuICAgIHRoaXMucmVjb3JkU2Nyb2xsUG9zaXRpb25zKCk7XG4gICAgdGhpcy53b3Jrc3BhY2VfLnJlc2l6ZUNvbnRlbnRzKCk7XG4gICAgdGhpcy5zZWxlY3RDYXRlZ29yeUJ5U2Nyb2xsUG9zaXRpb25fKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBpZiB0aGlzIGJsb2NrIGNhbiBiZSByZWN5Y2xlZCBpbiB0aGUgZmx5b3V0LiAgQmxvY2tzIHRoYXQgaGF2ZSBub1xuICAgKiB2YXJpYWJsZXMgYW5kIGFyZSBub3QgZHluYW1pYyBzaGFkb3dzIGNhbiBiZSByZWN5Y2xlZC5cbiAgICogQHBhcmFtIHshQmxvY2tseS5CbG9ja1N2Z30gYmxvY2sgVGhlIGJsb2NrIHRvIGF0dGVtcHQgdG8gcmVjeWNsZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGJsb2NrIGNhbiBiZSByZWN5Y2xlZC5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgYmxvY2tJc1JlY3ljbGFibGVfKGJsb2NrKSB7XG4gICAgaWYgKCF0aGlzLnJlY3ljbGluZ0VuYWJsZWRfKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGJsb2NrIG5lZWRzIHRvIHBhcnNlIG11dGF0aW9ucywgbmV2ZXIgcmVjeWNsZS5cbiAgICBpZiAoYmxvY2subXV0YXRpb25Ub0RvbSAmJiBibG9jay5kb21Ub011dGF0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFibG9jay5pc0VuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgYmxvY2suaW5wdXRMaXN0KSB7XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGlucHV0LmZpZWxkUm93KSB7XG4gICAgICAgIC8vIE5vIHZhcmlhYmxlcy5cbiAgICAgICAgaWYgKGZpZWxkLnJlZmVyZW5jZXNWYXJpYWJsZXMoKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBCbG9ja2x5LkZpZWxkRHJvcGRvd24pIHtcbiAgICAgICAgICBpZiAoZmllbGQuaXNPcHRpb25MaXN0RHluYW1pYygpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBjaGlsZHJlbi5cbiAgICAgIGlmIChpbnB1dC5jb25uZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEJsb2NrID1cbiAgICAgICAgICAvKiogQHR5cGUge0Jsb2NrbHkuQmxvY2tTdmd9ICovXG4gICAgICAgICAgKGlucHV0LmNvbm5lY3Rpb24udGFyZ2V0QmxvY2soKSk7XG4gICAgICAgIGlmICh0YXJnZXRCbG9jayAmJiAhdGhpcy5ibG9ja0lzUmVjeWNsYWJsZV8odGFyZ2V0QmxvY2spKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBibG9jayBpcyByZWN5Y2xhYmxlLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFCbG9ja2x5LkJsb2NrU3ZnKTpib29sZWFufSBmdW5jIFRoZSBmdW5jdGlvbiB1c2VkIHRvXG4gICAqICAgICBkZXRlcm1pbmUgaWYgYSBibG9jayBpcyByZWN5Y2xhYmxlLlxuICAgKiBAcHVibGljXG4gICAqL1xuICBzZXRCbG9ja0lzUmVjeWNsYWJsZShmdW5jKSB7XG4gICAgdGhpcy5ibG9ja0lzUmVjeWNsYWJsZV8gPSBmdW5jO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIHRoZSBmbHlvdXQgY2FuIHJlY3ljbGUgYmxvY2tzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW5hYmxlZCBUcnVlIHRvIGFsbG93IGJsb2NrcyB0byBiZSByZWN5Y2xlZCwgZmFsc2VcbiAgICogICAgIG90aGVyd2lzZS5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2V0UmVjeWNsaW5nRW5hYmxlZChpc0VuYWJsZWQpIHtcbiAgICB0aGlzLnJlY3ljbGluZ0VuYWJsZWRfID0gaXNFbmFibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIExheSBvdXQgdGhlIGJsb2NrcyBpbiB0aGUgZmx5b3V0LlxuICAgKiBAcGFyYW0ge0FycmF5PEJsb2NrbHkuRmx5b3V0LkZseW91dEl0ZW0+fSBjb250ZW50cyBUaGUgYmxvY2tzIGFuZCBidXR0b25zIHRvIGxheSBvdXQuXG4gICAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gZ2FwcyBUaGUgdmlzaWJsZSBnYXBzIGJldHdlZW4gYmxvY2tzLlxuICAgKi9cbiAgbGF5b3V0Xyhjb250ZW50cywgZ2Fwcykge1xuICAgIHN1cGVyLmxheW91dF8oY29udGVudHMsIGdhcHMpO1xuICAgIHRoaXMubGFiZWxHYXBzID0gW107XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIGNvbnRlbnRzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2J1dHRvbicgJiYgaXRlbS5idXR0b24uaXNMYWJlbCgpKSB7XG4gICAgICAgIHRoaXMubGFiZWxHYXBzLnB1c2goZ2Fwc1tpbmRleCAtIDFdID8/IHRoaXMuTUFSR0lOKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ContinuousFlyout.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ContinuousFlyout\": () => (/* binding */ ContinuousFlyout)\n/* harmony export */ });\n/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ \"./node_modules/blockly/core-browser.js\");\n/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _ContinuousToolbox__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ContinuousToolbox */ \"./src/ContinuousToolbox.js\");\n/* harmony import */ var _ContinuousMetricsFlyout__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ContinuousMetricsFlyout */ \"./src/ContinuousMetricsFlyout.js\");\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Flyout that supports always-open continuous scrolling.\n */\n\n\n\n\n\n/**\n * Class for continuous flyout.\n */\nclass ContinuousFlyout extends blockly_core__WEBPACK_IMPORTED_MODULE_0__.VerticalFlyout {\n /** @override */\n constructor(workspaceOptions) {\n super(workspaceOptions);\n\n /**\n * List of scroll positions for each category.\n * @type {!Array<{name: string, position: !Object}>}\n */\n this.scrollPositions = [];\n\n /**\n * Target scroll position, used to smoothly scroll to a given category\n * location when selected.\n * @type {?number}\n */\n this.scrollTarget = null;\n\n /**\n * The percentage of the distance to the scrollTarget that should be\n * scrolled at a time. Lower values will produce a smoother, slower scroll.\n * @type {number}\n */\n this.scrollAnimationFraction = 0.3;\n\n /**\n * Whether to recycle blocks when refreshing the flyout. When false, do not\n * allow anything to be recycled. The default is to recycle.\n * @type {boolean}\n * @private\n */\n this.recyclingEnabled_ = true;\n\n this.workspace_.setMetricsManager(\n new _ContinuousMetricsFlyout__WEBPACK_IMPORTED_MODULE_2__.ContinuousFlyoutMetrics(this.workspace_, this),\n );\n\n this.workspace_.addChangeListener((e) => {\n if (e.type === blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.VIEWPORT_CHANGE) {\n this.selectCategoryByScrollPosition_(-this.workspace_.scrollY);\n }\n });\n\n this.autoClose = false;\n }\n\n /**\n * Gets parent toolbox.\n * Since we registered the ContinuousToolbox, we know that's its type.\n * @returns {!ContinuousToolbox} Toolbox that owns this flyout.\n * @private\n */\n getParentToolbox_() {\n const toolbox = this.targetWorkspace.getToolbox();\n return /** @type {!ContinuousToolbox} */ (toolbox);\n }\n\n /**\n * Records scroll position for each category in the toolbox.\n * The scroll position is determined by the coordinates of each category's\n * label after the entire flyout has been rendered.\n * @package\n */\n recordScrollPositions() {\n this.scrollPositions = [];\n const categoryLabels = this.buttons_.filter(\n (button) =>\n button.isLabel() &&\n this.getParentToolbox_().getCategoryByName(button.getButtonText()),\n );\n for (const [index, button] of categoryLabels.entries()) {\n if (button.isLabel()) {\n const position = button.getPosition();\n const adjustedPosition = new blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.Coordinate(\n position.x,\n position.y - this.labelGaps[index],\n );\n this.scrollPositions.push({\n name: button.getButtonText(),\n position: adjustedPosition,\n });\n }\n }\n }\n\n /**\n * Returns the scroll position for the given category name.\n * @param {string} name Category name.\n * @returns {?Object} Scroll position for given category, or null if not\n * found.\n * @package\n */\n getCategoryScrollPosition(name) {\n for (const scrollInfo of this.scrollPositions) {\n if (scrollInfo.name === name) {\n return scrollInfo.position;\n }\n }\n console.warn(`Scroll position not recorded for category ${name}`);\n return null;\n }\n\n /**\n * Selects an item in the toolbox based on the scroll position of the flyout.\n * @param {number} position Current scroll position of the workspace.\n * @private\n */\n selectCategoryByScrollPosition_(position) {\n // If we are currently auto-scrolling, due to selecting a category by\n // clicking on it, do not update the category selection.\n if (this.scrollTarget !== null) {\n return;\n }\n const scaledPosition = Math.round(position / this.workspace_.scale);\n // Traverse the array of scroll positions in reverse, so we can select the\n // furthest category that the scroll position is beyond.\n for (let i = this.scrollPositions.length - 1; i >= 0; i--) {\n const category = this.scrollPositions[i];\n if (scaledPosition >= category.position.y) {\n this.getParentToolbox_().selectCategoryByName(category.name);\n return;\n }\n }\n }\n\n /**\n * Scrolls flyout to given position.\n * @param {number} position The Y coordinate to scroll to.\n */\n scrollTo(position) {\n // Set the scroll target to either the scaled position or the lowest\n // possible scroll point, whichever is smaller.\n const metrics = this.workspace_.getMetrics();\n this.scrollTarget = Math.min(\n position * this.workspace_.scale,\n metrics.scrollHeight - metrics.viewHeight,\n );\n\n this.stepScrollAnimation_();\n }\n\n /**\n * Step the scrolling animation by scrolling a fraction of the way to\n * a scroll target, and request the next frame if necessary.\n * @private\n */\n stepScrollAnimation_() {\n if (this.scrollTarget === null) {\n return;\n }\n\n const currentScrollPos = -this.workspace_.scrollY;\n const diff = this.scrollTarget - currentScrollPos;\n if (Math.abs(diff) < 1) {\n this.workspace_.scrollbar.setY(this.scrollTarget);\n this.scrollTarget = null;\n return;\n }\n this.workspace_.scrollbar.setY(\n currentScrollPos + diff * this.scrollAnimationFraction,\n );\n\n requestAnimationFrame(this.stepScrollAnimation_.bind(this));\n }\n\n /**\n * Add additional padding to the bottom of the flyout if needed,\n * in order to make it possible to scroll to the top of the last category.\n * @param {!Blockly.MetricsManager.ContainerRegion} contentMetrics Content\n * metrics for the flyout.\n * @param {!Blockly.MetricsManager.ContainerRegion} viewMetrics View metrics\n * for the flyout.\n * @returns {number} Additional bottom padding.\n */\n calculateBottomPadding(contentMetrics, viewMetrics) {\n if (this.scrollPositions.length > 0) {\n const lastCategory =\n this.scrollPositions[this.scrollPositions.length - 1];\n const lastPosition = lastCategory.position.y * this.workspace_.scale;\n const lastCategoryHeight = contentMetrics.height - lastPosition;\n if (lastCategoryHeight < viewMetrics.height) {\n return viewMetrics.height - lastCategoryHeight;\n }\n }\n return 0;\n }\n\n /** @override */\n getX() {\n if (\n this.isVisible() &&\n this.targetWorkspace.toolboxPosition === this.toolboxPosition_ &&\n this.targetWorkspace.getToolbox() &&\n this.toolboxPosition_ !== blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.toolbox.Position.LEFT\n ) {\n // This makes it so blocks cannot go under the flyout in RTL mode.\n return this.targetWorkspace.getMetricsManager().getViewMetrics().width;\n }\n\n return super.getX();\n }\n\n /**\n * @override\n */\n show(flyoutDef) {\n super.show(flyoutDef);\n this.recordScrollPositions();\n this.workspace_.resizeContents();\n if (!this.getParentToolbox_().getSelectedItem()) {\n this.selectCategoryByScrollPosition_(0);\n }\n }\n\n /**\n * Determine if this block can be recycled in the flyout. Blocks that have no\n * variables and are not dynamic shadows can be recycled.\n * @param {!Blockly.BlockSvg} block The block to attempt to recycle.\n * @returns {boolean} True if the block can be recycled.\n * @protected\n */\n blockIsRecyclable_(block) {\n if (!this.recyclingEnabled_) {\n return false;\n }\n\n // If the block needs to parse mutations, never recycle.\n if (block.mutationToDom && block.domToMutation) {\n return false;\n }\n\n if (!block.isEnabled()) {\n return false;\n }\n\n for (const input of block.inputList) {\n for (const field of input.fieldRow) {\n // No variables.\n if (field.referencesVariables()) {\n return false;\n }\n if (field instanceof blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown) {\n if (field.isOptionListDynamic()) {\n return false;\n }\n }\n }\n // Check children.\n if (input.connection) {\n const targetBlock =\n /** @type {Blockly.BlockSvg} */\n (input.connection.targetBlock());\n if (targetBlock && !this.blockIsRecyclable_(targetBlock)) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * Sets the function used to determine whether a block is recyclable.\n * @param {function(!Blockly.BlockSvg):boolean} func The function used to\n * determine if a block is recyclable.\n * @public\n */\n setBlockIsRecyclable(func) {\n this.blockIsRecyclable_ = func;\n }\n\n /**\n * Set whether the flyout can recycle blocks.\n * @param {boolean} isEnabled True to allow blocks to be recycled, false\n * otherwise.\n * @public\n */\n setRecyclingEnabled(isEnabled) {\n this.recyclingEnabled_ = isEnabled;\n }\n\n /**\n * Lay out the blocks in the flyout.\n * @param {Array} contents The blocks and buttons to lay out.\n * @param {Array} gaps The visible gaps between blocks.\n */\n layout_(contents, gaps) {\n super.layout_(contents, gaps);\n this.labelGaps = [];\n for (const [index, item] of contents.entries()) {\n if (item.type === 'button' && item.button.isLabel()) {\n this.labelGaps.push(gaps[index - 1] ?? this.MARGIN);\n }\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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YUFBYSxlQUFlO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYmxvY2tseS9jb250aW51b3VzLXRvb2xib3gvLi9zcmMvQ29udGludW91c0ZseW91dC5qcz9iY2ZjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEZseW91dCB0aGF0IHN1cHBvcnRzIGFsd2F5cy1vcGVuIGNvbnRpbnVvdXMgc2Nyb2xsaW5nLlxuICovXG5cbmltcG9ydCAqIGFzIEJsb2NrbHkgZnJvbSAnYmxvY2tseS9jb3JlJztcbmltcG9ydCB7Q29udGludW91c1Rvb2xib3h9IGZyb20gJy4vQ29udGludW91c1Rvb2xib3gnO1xuaW1wb3J0IHtDb250aW51b3VzRmx5b3V0TWV0cmljc30gZnJvbSAnLi9Db250aW51b3VzTWV0cmljc0ZseW91dCc7XG5cbi8qKlxuICogQ2xhc3MgZm9yIGNvbnRpbnVvdXMgZmx5b3V0LlxuICovXG5leHBvcnQgY2xhc3MgQ29udGludW91c0ZseW91dCBleHRlbmRzIEJsb2NrbHkuVmVydGljYWxGbHlvdXQge1xuICAvKiogQG92ZXJyaWRlICovXG4gIGNvbnN0cnVjdG9yKHdvcmtzcGFjZU9wdGlvbnMpIHtcbiAgICBzdXBlcih3b3Jrc3BhY2VPcHRpb25zKTtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2Ygc2Nyb2xsIHBvc2l0aW9ucyBmb3IgZWFjaCBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7IUFycmF5PHtuYW1lOiBzdHJpbmcsIHBvc2l0aW9uOiAhT2JqZWN0fT59XG4gICAgICovXG4gICAgdGhpcy5zY3JvbGxQb3NpdGlvbnMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIFRhcmdldCBzY3JvbGwgcG9zaXRpb24sIHVzZWQgdG8gc21vb3RobHkgc2Nyb2xsIHRvIGEgZ2l2ZW4gY2F0ZWdvcnlcbiAgICAgKiBsb2NhdGlvbiB3aGVuIHNlbGVjdGVkLlxuICAgICAqIEB0eXBlIHs/bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSBkaXN0YW5jZSB0byB0aGUgc2Nyb2xsVGFyZ2V0IHRoYXQgc2hvdWxkIGJlXG4gICAgICogc2Nyb2xsZWQgYXQgYSB0aW1lLiBMb3dlciB2YWx1ZXMgd2lsbCBwcm9kdWNlIGEgc21vb3RoZXIsIHNsb3dlciBzY3JvbGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnNjcm9sbEFuaW1hdGlvbkZyYWN0aW9uID0gMC4zO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byByZWN5Y2xlIGJsb2NrcyB3aGVuIHJlZnJlc2hpbmcgdGhlIGZseW91dC4gV2hlbiBmYWxzZSwgZG8gbm90XG4gICAgICogYWxsb3cgYW55dGhpbmcgdG8gYmUgcmVjeWNsZWQuIFRoZSBkZWZhdWx0IGlzIHRvIHJlY3ljbGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnJlY3ljbGluZ0VuYWJsZWRfID0gdHJ1ZTtcblxuICAgIHRoaXMud29ya3NwYWNlXy5zZXRNZXRyaWNzTWFuYWdlcihcbiAgICAgIG5ldyBDb250aW51b3VzRmx5b3V0TWV0cmljcyh0aGlzLndvcmtzcGFjZV8sIHRoaXMpLFxuICAgICk7XG5cbiAgICB0aGlzLndvcmtzcGFjZV8uYWRkQ2hhbmdlTGlzdGVuZXIoKGUpID0+IHtcbiAgICAgIGlmIChlLnR5cGUgPT09IEJsb2NrbHkuRXZlbnRzLlZJRVdQT1JUX0NIQU5HRSkge1xuICAgICAgICB0aGlzLnNlbGVjdENhdGVnb3J5QnlTY3JvbGxQb3NpdGlvbl8oLXRoaXMud29ya3NwYWNlXy5zY3JvbGxZKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYXV0b0Nsb3NlID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBwYXJlbnQgdG9vbGJveC5cbiAgICogU2luY2Ugd2UgcmVnaXN0ZXJlZCB0aGUgQ29udGludW91c1Rvb2xib3gsIHdlIGtub3cgdGhhdCdzIGl0cyB0eXBlLlxuICAgKiBAcmV0dXJucyB7IUNvbnRpbnVvdXNUb29sYm94fSBUb29sYm94IHRoYXQgb3ducyB0aGlzIGZseW91dC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldFBhcmVudFRvb2xib3hfKCkge1xuICAgIGNvbnN0IHRvb2xib3ggPSB0aGlzLnRhcmdldFdvcmtzcGFjZS5nZXRUb29sYm94KCk7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7IUNvbnRpbnVvdXNUb29sYm94fSAqLyAodG9vbGJveCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyBzY3JvbGwgcG9zaXRpb24gZm9yIGVhY2ggY2F0ZWdvcnkgaW4gdGhlIHRvb2xib3guXG4gICAqIFRoZSBzY3JvbGwgcG9zaXRpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29vcmRpbmF0ZXMgb2YgZWFjaCBjYXRlZ29yeSdzXG4gICAqIGxhYmVsIGFmdGVyIHRoZSBlbnRpcmUgZmx5b3V0IGhhcyBiZWVuIHJlbmRlcmVkLlxuICAgKiBAcGFja2FnZVxuICAgKi9cbiAgcmVjb3JkU2Nyb2xsUG9zaXRpb25zKCkge1xuICAgIHRoaXMuc2Nyb2xsUG9zaXRpb25zID0gW107XG4gICAgY29uc3QgY2F0ZWdvcnlMYWJlbHMgPSB0aGlzLmJ1dHRvbnNfLmZpbHRlcihcbiAgICAgIChidXR0b24pID0+XG4gICAgICAgIGJ1dHRvbi5pc0xhYmVsKCkgJiZcbiAgICAgICAgdGhpcy5nZXRQYXJlbnRUb29sYm94XygpLmdldENhdGVnb3J5QnlOYW1lKGJ1dHRvbi5nZXRCdXR0b25UZXh0KCkpLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGJ1dHRvbl0gb2YgY2F0ZWdvcnlMYWJlbHMuZW50cmllcygpKSB7XG4gICAgICBpZiAoYnV0dG9uLmlzTGFiZWwoKSkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGJ1dHRvbi5nZXRQb3NpdGlvbigpO1xuICAgICAgICBjb25zdCBhZGp1c3RlZFBvc2l0aW9uID0gbmV3IEJsb2NrbHkudXRpbHMuQ29vcmRpbmF0ZShcbiAgICAgICAgICBwb3NpdGlvbi54LFxuICAgICAgICAgIHBvc2l0aW9uLnkgLSB0aGlzLmxhYmVsR2Fwc1tpbmRleF0sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2Nyb2xsUG9zaXRpb25zLnB1c2goe1xuICAgICAgICAgIG5hbWU6IGJ1dHRvbi5nZXRCdXR0b25UZXh0KCksXG4gICAgICAgICAgcG9zaXRpb246IGFkanVzdGVkUG9zaXRpb24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzY3JvbGwgcG9zaXRpb24gZm9yIHRoZSBnaXZlbiBjYXRlZ29yeSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBDYXRlZ29yeSBuYW1lLlxuICAgKiBAcmV0dXJucyB7P09iamVjdH0gU2Nyb2xsIHBvc2l0aW9uIGZvciBnaXZlbiBjYXRlZ29yeSwgb3IgbnVsbCBpZiBub3RcbiAgICogICAgIGZvdW5kLlxuICAgKiBAcGFja2FnZVxuICAgKi9cbiAgZ2V0Q2F0ZWdvcnlTY3JvbGxQb3NpdGlvbihuYW1lKSB7XG4gICAgZm9yIChjb25zdCBzY3JvbGxJbmZvIG9mIHRoaXMuc2Nyb2xsUG9zaXRpb25zKSB7XG4gICAgICBpZiAoc2Nyb2xsSW5mby5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiBzY3JvbGxJbmZvLnBvc2l0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLndhcm4oYFNjcm9sbCBwb3NpdGlvbiBub3QgcmVjb3JkZWQgZm9yIGNhdGVnb3J5ICR7bmFtZX1gKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGFuIGl0ZW0gaW4gdGhlIHRvb2xib3ggYmFzZWQgb24gdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgZmx5b3V0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gcG9zaXRpb24gQ3VycmVudCBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIHdvcmtzcGFjZS5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlbGVjdENhdGVnb3J5QnlTY3JvbGxQb3NpdGlvbl8ocG9zaXRpb24pIHtcbiAgICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGF1dG8tc2Nyb2xsaW5nLCBkdWUgdG8gc2VsZWN0aW5nIGEgY2F0ZWdvcnkgYnlcbiAgICAvLyBjbGlja2luZyBvbiBpdCwgZG8gbm90IHVwZGF0ZSB0aGUgY2F0ZWdvcnkgc2VsZWN0aW9uLlxuICAgIGlmICh0aGlzLnNjcm9sbFRhcmdldCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzY2FsZWRQb3NpdGlvbiA9IE1hdGgucm91bmQocG9zaXRpb24gLyB0aGlzLndvcmtzcGFjZV8uc2NhbGUpO1xuICAgIC8vIFRyYXZlcnNlIHRoZSBhcnJheSBvZiBzY3JvbGwgcG9zaXRpb25zIGluIHJldmVyc2UsIHNvIHdlIGNhbiBzZWxlY3QgdGhlXG4gICAgLy8gZnVydGhlc3QgY2F0ZWdvcnkgdGhhdCB0aGUgc2Nyb2xsIHBvc2l0aW9uIGlzIGJleW9uZC5cbiAgICBmb3IgKGxldCBpID0gdGhpcy5zY3JvbGxQb3NpdGlvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGNhdGVnb3J5ID0gdGhpcy5zY3JvbGxQb3NpdGlvbnNbaV07XG4gICAgICBpZiAoc2NhbGVkUG9zaXRpb24gPj0gY2F0ZWdvcnkucG9zaXRpb24ueSkge1xuICAgICAgICB0aGlzLmdldFBhcmVudFRvb2xib3hfKCkuc2VsZWN0Q2F0ZWdvcnlCeU5hbWUoY2F0ZWdvcnkubmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyBmbHlvdXQgdG8gZ2l2ZW4gcG9zaXRpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvbiBUaGUgWSBjb29yZGluYXRlIHRvIHNjcm9sbCB0by5cbiAgICovXG4gIHNjcm9sbFRvKHBvc2l0aW9uKSB7XG4gICAgLy8gU2V0IHRoZSBzY3JvbGwgdGFyZ2V0IHRvIGVpdGhlciB0aGUgc2NhbGVkIHBvc2l0aW9uIG9yIHRoZSBsb3dlc3RcbiAgICAvLyBwb3NzaWJsZSBzY3JvbGwgcG9pbnQsIHdoaWNoZXZlciBpcyBzbWFsbGVyLlxuICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLndvcmtzcGFjZV8uZ2V0TWV0cmljcygpO1xuICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ID0gTWF0aC5taW4oXG4gICAgICBwb3NpdGlvbiAqIHRoaXMud29ya3NwYWNlXy5zY2FsZSxcbiAgICAgIG1ldHJpY3Muc2Nyb2xsSGVpZ2h0IC0gbWV0cmljcy52aWV3SGVpZ2h0LFxuICAgICk7XG5cbiAgICB0aGlzLnN0ZXBTY3JvbGxBbmltYXRpb25fKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RlcCB0aGUgc2Nyb2xsaW5nIGFuaW1hdGlvbiBieSBzY3JvbGxpbmcgYSBmcmFjdGlvbiBvZiB0aGUgd2F5IHRvXG4gICAqIGEgc2Nyb2xsIHRhcmdldCwgYW5kIHJlcXVlc3QgdGhlIG5leHQgZnJhbWUgaWYgbmVjZXNzYXJ5LlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RlcFNjcm9sbEFuaW1hdGlvbl8oKSB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsVGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFNjcm9sbFBvcyA9IC10aGlzLndvcmtzcGFjZV8uc2Nyb2xsWTtcbiAgICBjb25zdCBkaWZmID0gdGhpcy5zY3JvbGxUYXJnZXQgLSBjdXJyZW50U2Nyb2xsUG9zO1xuICAgIGlmIChNYXRoLmFicyhkaWZmKSA8IDEpIHtcbiAgICAgIHRoaXMud29ya3NwYWNlXy5zY3JvbGxiYXIuc2V0WSh0aGlzLnNjcm9sbFRhcmdldCk7XG4gICAgICB0aGlzLnNjcm9sbFRhcmdldCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMud29ya3NwYWNlXy5zY3JvbGxiYXIuc2V0WShcbiAgICAgIGN1cnJlbnRTY3JvbGxQb3MgKyBkaWZmICogdGhpcy5zY3JvbGxBbmltYXRpb25GcmFjdGlvbixcbiAgICApO1xuXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuc3RlcFNjcm9sbEFuaW1hdGlvbl8uYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFkZGl0aW9uYWwgcGFkZGluZyB0byB0aGUgYm90dG9tIG9mIHRoZSBmbHlvdXQgaWYgbmVlZGVkLFxuICAgKiBpbiBvcmRlciB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHNjcm9sbCB0byB0aGUgdG9wIG9mIHRoZSBsYXN0IGNhdGVnb3J5LlxuICAgKiBAcGFyYW0geyFCbG9ja2x5Lk1ldHJpY3NNYW5hZ2VyLkNvbnRhaW5lclJlZ2lvbn0gY29udGVudE1ldHJpY3MgQ29udGVudFxuICAgKiAgICBtZXRyaWNzIGZvciB0aGUgZmx5b3V0LlxuICAgKiBAcGFyYW0geyFCbG9ja2x5Lk1ldHJpY3NNYW5hZ2VyLkNvbnRhaW5lclJlZ2lvbn0gdmlld01ldHJpY3MgVmlldyBtZXRyaWNzXG4gICAqICAgIGZvciB0aGUgZmx5b3V0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBBZGRpdGlvbmFsIGJvdHRvbSBwYWRkaW5nLlxuICAgKi9cbiAgY2FsY3VsYXRlQm90dG9tUGFkZGluZyhjb250ZW50TWV0cmljcywgdmlld01ldHJpY3MpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxQb3NpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFzdENhdGVnb3J5ID1cbiAgICAgICAgdGhpcy5zY3JvbGxQb3NpdGlvbnNbdGhpcy5zY3JvbGxQb3NpdGlvbnMubGVuZ3RoIC0gMV07XG4gICAgICBjb25zdCBsYXN0UG9zaXRpb24gPSBsYXN0Q2F0ZWdvcnkucG9zaXRpb24ueSAqIHRoaXMud29ya3NwYWNlXy5zY2FsZTtcbiAgICAgIGNvbnN0IGxhc3RDYXRlZ29yeUhlaWdodCA9IGNvbnRlbnRNZXRyaWNzLmhlaWdodCAtIGxhc3RQb3NpdGlvbjtcbiAgICAgIGlmIChsYXN0Q2F0ZWdvcnlIZWlnaHQgPCB2aWV3TWV0cmljcy5oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHZpZXdNZXRyaWNzLmhlaWdodCAtIGxhc3RDYXRlZ29yeUhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICovXG4gIGdldFgoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1Zpc2libGUoKSAmJlxuICAgICAgdGhpcy50YXJnZXRXb3Jrc3BhY2UudG9vbGJveFBvc2l0aW9uID09PSB0aGlzLnRvb2xib3hQb3NpdGlvbl8gJiZcbiAgICAgIHRoaXMudGFyZ2V0V29ya3NwYWNlLmdldFRvb2xib3goKSAmJlxuICAgICAgdGhpcy50b29sYm94UG9zaXRpb25fICE9PSBCbG9ja2x5LnV0aWxzLnRvb2xib3guUG9zaXRpb24uTEVGVFxuICAgICkge1xuICAgICAgLy8gVGhpcyBtYWtlcyBpdCBzbyBibG9ja3MgY2Fubm90IGdvIHVuZGVyIHRoZSBmbHlvdXQgaW4gUlRMIG1vZGUuXG4gICAgICByZXR1cm4gdGhpcy50YXJnZXRXb3Jrc3BhY2UuZ2V0TWV0cmljc01hbmFnZXIoKS5nZXRWaWV3TWV0cmljcygpLndpZHRoO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5nZXRYKCk7XG4gIH1cblxuICAvKipcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBzaG93KGZseW91dERlZikge1xuICAgIHN1cGVyLnNob3coZmx5b3V0RGVmKTtcbiAgICB0aGlzLnJlY29yZFNjcm9sbFBvc2l0aW9ucygpO1xuICAgIHRoaXMud29ya3NwYWNlXy5yZXNpemVDb250ZW50cygpO1xuICAgIGlmICghdGhpcy5nZXRQYXJlbnRUb29sYm94XygpLmdldFNlbGVjdGVkSXRlbSgpKSB7XG4gICAgICB0aGlzLnNlbGVjdENhdGVnb3J5QnlTY3JvbGxQb3NpdGlvbl8oMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBpZiB0aGlzIGJsb2NrIGNhbiBiZSByZWN5Y2xlZCBpbiB0aGUgZmx5b3V0LiAgQmxvY2tzIHRoYXQgaGF2ZSBub1xuICAgKiB2YXJpYWJsZXMgYW5kIGFyZSBub3QgZHluYW1pYyBzaGFkb3dzIGNhbiBiZSByZWN5Y2xlZC5cbiAgICogQHBhcmFtIHshQmxvY2tseS5CbG9ja1N2Z30gYmxvY2sgVGhlIGJsb2NrIHRvIGF0dGVtcHQgdG8gcmVjeWNsZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGJsb2NrIGNhbiBiZSByZWN5Y2xlZC5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgYmxvY2tJc1JlY3ljbGFibGVfKGJsb2NrKSB7XG4gICAgaWYgKCF0aGlzLnJlY3ljbGluZ0VuYWJsZWRfKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGJsb2NrIG5lZWRzIHRvIHBhcnNlIG11dGF0aW9ucywgbmV2ZXIgcmVjeWNsZS5cbiAgICBpZiAoYmxvY2subXV0YXRpb25Ub0RvbSAmJiBibG9jay5kb21Ub011dGF0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFibG9jay5pc0VuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgYmxvY2suaW5wdXRMaXN0KSB7XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGlucHV0LmZpZWxkUm93KSB7XG4gICAgICAgIC8vIE5vIHZhcmlhYmxlcy5cbiAgICAgICAgaWYgKGZpZWxkLnJlZmVyZW5jZXNWYXJpYWJsZXMoKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBCbG9ja2x5LkZpZWxkRHJvcGRvd24pIHtcbiAgICAgICAgICBpZiAoZmllbGQuaXNPcHRpb25MaXN0RHluYW1pYygpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBjaGlsZHJlbi5cbiAgICAgIGlmIChpbnB1dC5jb25uZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEJsb2NrID1cbiAgICAgICAgICAvKiogQHR5cGUge0Jsb2NrbHkuQmxvY2tTdmd9ICovXG4gICAgICAgICAgKGlucHV0LmNvbm5lY3Rpb24udGFyZ2V0QmxvY2soKSk7XG4gICAgICAgIGlmICh0YXJnZXRCbG9jayAmJiAhdGhpcy5ibG9ja0lzUmVjeWNsYWJsZV8odGFyZ2V0QmxvY2spKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBibG9jayBpcyByZWN5Y2xhYmxlLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFCbG9ja2x5LkJsb2NrU3ZnKTpib29sZWFufSBmdW5jIFRoZSBmdW5jdGlvbiB1c2VkIHRvXG4gICAqICAgICBkZXRlcm1pbmUgaWYgYSBibG9jayBpcyByZWN5Y2xhYmxlLlxuICAgKiBAcHVibGljXG4gICAqL1xuICBzZXRCbG9ja0lzUmVjeWNsYWJsZShmdW5jKSB7XG4gICAgdGhpcy5ibG9ja0lzUmVjeWNsYWJsZV8gPSBmdW5jO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIHRoZSBmbHlvdXQgY2FuIHJlY3ljbGUgYmxvY2tzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW5hYmxlZCBUcnVlIHRvIGFsbG93IGJsb2NrcyB0byBiZSByZWN5Y2xlZCwgZmFsc2VcbiAgICogICAgIG90aGVyd2lzZS5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2V0UmVjeWNsaW5nRW5hYmxlZChpc0VuYWJsZWQpIHtcbiAgICB0aGlzLnJlY3ljbGluZ0VuYWJsZWRfID0gaXNFbmFibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIExheSBvdXQgdGhlIGJsb2NrcyBpbiB0aGUgZmx5b3V0LlxuICAgKiBAcGFyYW0ge0FycmF5PEJsb2NrbHkuRmx5b3V0LkZseW91dEl0ZW0+fSBjb250ZW50cyBUaGUgYmxvY2tzIGFuZCBidXR0b25zIHRvIGxheSBvdXQuXG4gICAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gZ2FwcyBUaGUgdmlzaWJsZSBnYXBzIGJldHdlZW4gYmxvY2tzLlxuICAgKi9cbiAgbGF5b3V0Xyhjb250ZW50cywgZ2Fwcykge1xuICAgIHN1cGVyLmxheW91dF8oY29udGVudHMsIGdhcHMpO1xuICAgIHRoaXMubGFiZWxHYXBzID0gW107XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIGNvbnRlbnRzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2J1dHRvbicgJiYgaXRlbS5idXR0b24uaXNMYWJlbCgpKSB7XG4gICAgICAgIHRoaXMubGFiZWxHYXBzLnB1c2goZ2Fwc1tpbmRleCAtIDFdID8/IHRoaXMuTUFSR0lOKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ContinuousFlyout.js\n"); /***/ }), diff --git a/plugins/continuous-toolbox/test/index.html b/plugins/continuous-toolbox/test/index.html index be07dd5e8d..ac03afd43c 100644 --- a/plugins/continuous-toolbox/test/index.html +++ b/plugins/continuous-toolbox/test/index.html @@ -33,7 +33,7 @@
@blockly/continuous-toolbox Demo
A Blockly plugin that adds a continous-scrolling style toolbox and flyout
- 5.0.16 + 5.0.17 View code View on npm