I don't understand why the width function is implemented on all elements if it returns 0 for non-zero width elements. The following returns 0 for me.
Shoes.app do
p = para "My width is: "
para p.width
end
Why is that? (app.width does not return 0)
The problem is that the size of the para object is determined dynamically when it is drawn. At the time you create the second para, nothing has actually been laid out yet, so a width hasn't been set. You can see that accessing the width after drawing works as expected:
The way to get around this is to use the start method, which is called when the containing slot is drawn for the first time: