parseStory method
Parses a standalone story block — pages and chrome, with no rail.
The story-floater template carries its story beside the window canvas
rather than inside it (floater_story_config.dart), but the block itself
is the digia/canvasStory widget's props minus the rail fields. Reading it
through the same parser is what keeps one definition of "a story" in the
SDK: the rail-only values fall back to their defaults and are never read,
because nothing draws a rail from this.
Returns null on the same terms _story does — no readable page, or no
chrome to close the viewer with.
Implementation
CampaignCanvasStory? parseStory(Map<String, dynamic>? props) =>
props == null ? null : _story(CampaignCanvasBox.none, props);