I'm getting very enthusiastic about this notion because I can see how it could work - from user interface, architectural, and implementation points of view. Of course, the devil is in the details and I'm only looking at an overall picture. It seems to me that a small change in Leo's design would open up all kinds of possibilities. My thinking is guided by a number of features that already exist, especially 1) the tabbed Log pane; 2) the machinery behind the display of @pyplot nodes, and 3) the viewrendered and viewrendered3 plugins.
Let's start with the Log pane. Whoever came up with it had a brilliant idea. Most users are probably familiar with the Find and Nav tabs, and possibly the Completion and Spell tabs. You click on a tab and get a completely different view. What you may not realize is that a tab is just the display device for an entire mini-application, in the form of scripts and a set of one or more "widgets". To hook it into the log pane with its own tab is remarkably simple, programming-wise - this is the brilliant part. You just give the top-level widget and a tab name to the log pane and the pane sets up all the tab and switching machinery for you. So a tab could contain almost anything - a web browser, a dictionary, you name it. If it has a single top-level display widget and code behind that, it can get its own tab in the log pane. The scripts for the tab have access to all of Leo's code and data, so they can do just about whatever they like. Tabs can be installed by plugins, bit also by non-plugin scripts.
So this is a model for making use of graphical capability. Make what is now the body into a tabbed frame. You can probably adopt the log pane code with little change. The standard body display becomes one of the tabs, one that is always there. Nodes would pick up an additional piece: Currently nodes have headline data (p.h) and text data (p.b). They can be enhanced to contain, say, p.canvas, which would be data or drawing instructions for a canvas. There might end up being a use for several types of p.canvas, say p.canvas_x. So we'd eventually need some machinery to accommodate that.
I'll pick this up in my next post, since this one is already getting too long.