[Cursor] microsoft/pxt#11292 — add a new color picker block - #45
Conversation
This is cool! I needed this earlier |
I think the circle is enough to tell you which color I chose. I think the colored square on the left is unnecessary... |
@THEb0nny i'm just copying what most color pickers do for the preview! plus i think having a nice big square makes it way easier to see changes take effect |
|
@cursor review |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 5 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit f58ab97. Configure here.
| } | ||
|
|
||
| this.setColorHSV(hsv); | ||
| } |
There was a problem hiding this comment.
Format switch ignores inputs
High Severity
After a saved block loads HSV from its mutation, changing the format dropdown re-applies stored colorHSV instead of reading the current channel or hex values. Edits to inputs are overwritten and the converted color no longer matches what the block displays before the switch.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit f58ab97. Configure here.
| const numField = document.createElement("field"); | ||
| numField.setAttribute("name", "NUM"); | ||
| numField.textContent = "0"; | ||
| shadow.appendChild(numField); |
There was a problem hiding this comment.
Toolbox RGB defaults all zero
Medium Severity
Builtin toolbox XML for the color picker sets every RGB shadow NUM field to 0, so new blocks from the toolbox start as black. The inline comment and Monaco snippets use yellow (255, 255, 0), so the default block color does not match the intended example.
Reviewed by Cursor Bugbot for commit f58ab97. Configure here.
| const numField = document.createElement("field"); | ||
| numField.setAttribute("name", "NUM"); | ||
| numField.textContent = "0"; | ||
| shadow.appendChild(numField); |
There was a problem hiding this comment.
Toolbox shadows lack format
Medium Severity
Toolbox shadows for makecode_color_picker_number omit the format mutation, so RGB channels initialize as degree fields (max 360) instead of 0–255 RGB. Channel limits and the color UI behave incorrectly until the block reshapes the shadows.
Reviewed by Cursor Bugbot for commit f58ab97. Configure here.
| const field = target.getField("TEXT"); | ||
| field.setValue(color); | ||
| } | ||
| return; |
There was a problem hiding this comment.
Hex mode skips HSV store
Medium Severity
When the format is hex, setColorHSV updates the hex text field but returns without assigning this.colorHSV. Internal HSV stays stale while the hex string changes, so mutations, format switches, and other logic that rely on colorHSV can disagree with the displayed hex color.
Reviewed by Cursor Bugbot for commit f58ab97. Configure here.
|
|
||
| if (colorPickerBlock?.type === COLOR_PICKER_BLOCK_TYPE) { | ||
| colorHSV = colorPickerBlock.colorHSV; | ||
| } |
There was a problem hiding this comment.
Hex picker ignores typed hex
Medium Severity
Opening the visual picker from the hex string field uses colorPickerBlock.colorHSV directly and never calls readColorFromInputs(), unlike the numeric channel fields. After typing a hex value, the widget can open on the wrong color until another sync path runs.
Reviewed by Cursor Bugbot for commit f58ab97. Configure here.


adds a new color picker block! the motivation here is that we've always had a lot of targets/extensions that define multiple blocks for getting colors in various color spaces. for example, the neopixel extension in micro:bit, the circuit playground editor, pxt-ev3 (for the home button color), some of the boards in pxt-maker, the color fading extension in arcade, etc.
as a result, we have a lot of duplicated color space conversion code in our many repos. given how universal this is to all of our targets, this PR aims to create one color picker block to rule them all!
the new block natively supports all of the usual color formats:
internally, the color is stored as HSV in a mutation on the block. the reason for this is that the HSV and HSL color spaces have a lot of points that map to the same color in the RGB derived color spaces, so if you compile down to RGB then you get a lot of jumping around for the various HSV and HSL channel values as the hue changes.
on hardware the colors are all actually stored as 24 bit RGB numbers which i believe is universally how we do it in all of our targets. there are new functions on the
colorHelpersnamespace for converting the various formats to 24 bit RGB.the UI for the fields is a barebones HSV color picker:
like pauseuntil, this block is optional. unlike pauseuntil, we have a lot of targets where this block probably won't need to be in the default categories that come with the editor. for this reason, i had to a add a new scheme that allows extensions to contribute builtin blocks to the toolbox. in order to have this block appear in the toolbox, you simply need to define a function that has the
builtinBlockId="makecode_color_picker"comment annotation like so:the color parameter is also necessary to make the block match the color of whatever category contains it. adding this will also add monaco toolbox entries for all the various colorHelper functions.
right now the
builtinBlockIdannotation only supports the color picker, but i plan to add support for pause until and other blocks in the future. the first place this block is going to be used is in the color fading extension in arcade (i have some devious plans to completely overhaul the APIs in that extension)Mirrored from upstream PR:
https://github.com/microsoft/pxt/pull/11292Created automatically by pr-sxs-human-evals for code-review agent comparison.
(URL wrapped in a code span so GitHub does not create a cross-reference on the upstream timeline.)
Note
Medium Risk
Touches block compilation, decompilation, and toolbox generation across the editor; behavior is opt-in but the new conversion and UI paths are broad and user-facing.
Overview
Introduces a shared MakeCode color picker Blockly block (
makecode_color_picker) with RGB, HSV, HSL, CMYK, and hex modes, an HSV-based mutation for stable editing, and companion shadow blocks/fields plus a dropdown UI widget.Adds
colorHelpersruntime APIs (ported from color-convert, with ThirdPartyNotice) and Blockly compile/decompile paths socolorHelpers.*calls map to the new block. Extensions opt in viabuiltinBlockId="makecode_color_picker"on a stub API (withcolorfor category styling); toolbox and Monaco snippets are generated from that annotation instead of a normal block definition.Also extends
FieldSliderCSS variables for reuse by the hue control and minor formatting inpxt-helpers/ license text.Reviewed by Cursor Bugbot for commit f58ab97. Bugbot is set up for automated code reviews on this repo. Configure here.