class BBS::Widgets::Scene

A BBS::Art as a picture of the modern face that shows the board’s life: the art (with the layers stacked on it) as the background, and over it the hotspots filled from data, each by a block given for it. A block is called at every render with the Art::Hotspot and returns what goes there: a String (ANSI colours allowed; lines split at \n fill the hotspot’s rows), or nil to leave the art as it is. What a block returns is cut to its hotspot.

house = BBS::Art.load('art/house.yml').with(*BBS::Season.now.layers)
scene = BBS::Widgets::Scene.new(art: house, align: :center)
scene.fill(:window_1) { node_busy?(1) ? "\e[38;5;220m▓" : nil }
scene.fill(:mailbox)  { |spot| "✉#{unread}".ljust(spot.width) }
container.add(scene)

On a terminal smaller than the art the scene is cut to its bounds: what is right of and below them is left off, and a hotspot outside is not filled. With crop: false it draws nothing instead (a dashboard that drops the picture on a small screen asks fits?).