(3) Scratch (and clones - i love Snap! the language, but EX is same) deserves a mention for being demonstrably easy for beginners (incl. beginners taught by beginners :) and good with touch.
I'd say the editing experience is low-floor, mid-ceiling at best? There are not many power-user editing moves...
(1) Things like costumes have a tight focus e.g. direct lo-fi painting.
OTOH tasks like "create 10 sprites" and "cut&paste between sprites" are hard, and feel more like "ad-hoc GUI" than a unified editor, imho a weakness_._ E.g. I dont think you can move a costume to another sprite, only delete and re-create?
(2) Builtin library of images & sounds + default values in many places (instead of prompting) all help unlock creativity 👍
(2) Some hinting via dropdowns, shapes (boolean = hexagonal etc.,), not very strong. But the language is designed to be very forgiving, closer to Lisp / Perl not Rust / ML.
IMHO part of its success was inverting (1): designing the language to fit the editor, not the other way around!
• stdlib sized to discoverably fit in reasonable ~10 palettes.
• Forgiving (few errors, at worst error balloon but keeps running) to encourage click-to-execute experimentation. Can even execute inside the palette!
• Persistent image: contually running, no state-losing "restart". Green flag convention to code your own initialization. This semantics (A) relives beginners of need to understand process lifetime 💡 (B) blurs the line between programatic actions and editing. E.g. I can directly drag a sprite to where I want it to be, or I can execute a "set opacity 50%" block - and both are on equal footing. => Many properties have no other GUI, the blocks palette doubles as an editing menu!
• Block names freely mixing parameters amid text. [compare:Smalltalk or:ObjC names]
• Snap! custom blocks have macro-like powers do mimic any block shape, incl. control structures. Also some affordances to add help tooltip and param type hints & defaults. This is great didactic tool for a teacher to add lesson-specific scaffolding.
• Concurrent execution semantics match greatly with free-floating code chains with separate on- event trigger "hats" 🥰 . Plus, per-sprite implicit "self" takes advantage of intuitive "visual OOP" to make accessible some concurrent programming that would be genuinely mentally hard in textual languages. This is IMHO scratch's deepest achievement.