Message `editor\src\messages\message.rs`
├── Animation
│   ├── AnimationMessage `editor\src\messages\animation\animation_message.rs`
│   │   ├── ToggleLivePreview
│   │   ├── EnableLivePreview
│   │   ├── DisableLivePreview
│   │   ├── RestartAnimation
│   │   ├── SetFrameIndex
│   │   │   └── frame: f64
│   │   ├── SetTime
│   │   │   └── time: f64
│   │   ├── UpdateTime
│   │   ├── IncrementFrameCounter
│   │   └── SetAnimationTimeMode
│   │       └── animation_time_mode: AnimationTimeMode
│   └── AnimationMessageHandler `editor\src\messages\animation\animation_message_handler.rs`
│       ├── live_preview_recently_zero: bool
│       ├── timestamp: f64
│       ├── frame_index: f64
│       ├── animation_state: AnimationState
│       ├── fps: f64
│       └── animation_time_mode: AnimationTimeMode
├── AppWindow
│   ├── AppWindowMessage `editor\src\messages\app_window\app_window_message.rs`
│   │   ├── AppWindowMinimize
│   │   ├── AppWindowMaximize
│   │   └── AppWindowClose
│   └── AppWindowMessageHandler `editor\src\messages\app_window\app_window_message_handler.rs`
│       ├── platform: AppWindowPlatform
│       ├── maximized: bool
│       └── viewport_hole_punch_active: bool
├── Broadcast
│   ├── BroadcastMessage `editor\src\messages\broadcast\broadcast_message.rs`
│   │   ├── TriggerEvent
│   │   │   ├── EventMessage `editor\src\messages\broadcast\event\event_message.rs`
│   │   │   │   ├── AnimationFrame
│   │   │   │   ├── CanvasTransformed
│   │   │   │   ├── ToolAbort
│   │   │   │   ├── SelectionChanged
│   │   │   │   └── WorkingColorChanged
│   │   │   ├── EventMessageHandler `editor\src\messages\broadcast\event\event_message_handler.rs`
│   │   │   └── EventMessageContext `editor\src\messages\broadcast\event\event_message_handler.rs`
│   │   │       └── listeners: &'a mut HashMap<EventMessage, Vec<Message>>
│   │   ├── SubscribeEvent
│   │   │   ├── on: EventMessage
│   │   │   └── send: Box<Message>
│   │   └── UnsubscribeEvent
│   │       ├── on: EventMessage
│   │       └── send: Box<Message>
│   └── BroadcastMessageHandler `editor\src\messages\broadcast\broadcast_message_handler.rs`
│       ├── event: EventMessageHandler
│       └── listeners: HashMap<EventMessage, Vec<Message>>
├── Debug
│   ├── DebugMessage `editor\src\messages\debug\debug_message.rs`
│   │   ├── ToggleTraceLogs
│   │   ├── MessageOff
│   │   ├── MessageNames
│   │   └── MessageContents
│   └── DebugMessageHandler `editor\src\messages\debug\debug_message_handler.rs`
│       └── message_logging_verbosity: MessageLoggingVerbosity
├── Defer
│   ├── DeferMessage `editor\src\messages\defer\defer_message.rs`
│   │   ├── SetGraphSubmissionIndex
│   │   │   └── execution_id: u64
│   │   ├── TriggerGraphRun
│   │   │   ├── execution_id: u64
│   │   │   └── document_id: DocumentId
│   │   ├── AfterGraphRun
│   │   │   └── messages: Vec<Message>
│   │   ├── TriggerNavigationReady
│   │   └── AfterNavigationReady
│   │       └── messages: Vec<Message>
│   ├── DeferMessageHandler `editor\src\messages\defer\defer_message_handler.rs`
│   │   ├── after_graph_run: HashMap<DocumentId, Vec<(u64, Message)>>
│   │   ├── after_viewport_resize: Vec<Message>
│   │   └── current_graph_submission_id: u64
│   └── DeferMessageContext `editor\src\messages\defer\defer_message_handler.rs`
│       └── portfolio: &'a PortfolioMessageHandler
├── Dialog
│   ├── DialogMessage `editor\src\messages\dialog\dialog_message.rs`
│   │   ├── ExportDialog
│   │   │   ├── ExportDialogMessage `editor\src\messages\dialog\export_dialog\export_dialog_message.rs`
│   │   │   │   ├── FileType
│   │   │   │   │   └── file_type: FileType
│   │   │   │   ├── ScaleFactor
│   │   │   │   │   └── factor: f64
│   │   │   │   ├── TransparentBackground
│   │   │   │   │   └── transparent: bool
│   │   │   │   ├── ExportBounds
│   │   │   │   │   └── bounds: ExportBounds
│   │   │   │   └── Submit
│   │   │   ├── ExportDialogMessageHandler `editor\src\messages\dialog\export_dialog\export_dialog_message_handler.rs`
│   │   │   │   ├── file_type: FileType
│   │   │   │   ├── scale_factor: f64
│   │   │   │   ├── bounds: ExportBounds
│   │   │   │   ├── transparent_background: bool
│   │   │   │   ├── artboards: HashMap<LayerNodeIdentifier, String>
│   │   │   │   └── has_selection: bool
│   │   │   └── ExportDialogMessageContext `editor\src\messages\dialog\export_dialog\export_dialog_message_handler.rs`
│   │   │       └── portfolio: &'a PortfolioMessageHandler
│   │   ├── NewDocumentDialog
│   │   │   ├── NewDocumentDialogMessage `editor\src\messages\dialog\new_document_dialog\new_document_dialog_message.rs`
│   │   │   │   ├── Name
│   │   │   │   │   └── name: String
│   │   │   │   ├── Infinite
│   │   │   │   │   └── infinite: bool
│   │   │   │   ├── DimensionsX
│   │   │   │   │   └── width: f64
│   │   │   │   ├── DimensionsY
│   │   │   │   │   └── height: f64
│   │   │   │   └── Submit
│   │   │   ├── NewDocumentDialogMessageHandler `editor\src\messages\dialog\new_document_dialog\new_document_dialog_message_handler.rs`
│   │   │   │   ├── name: String
│   │   │   │   ├── infinite: bool
│   │   │   │   └── dimensions: UVec2
│   │   │   └── NewDocumentDialogMessageContext `editor\src\messages\dialog\new_document_dialog\new_document_dialog_message_handler.rs`
│   │   │       └── viewport_bounds: &'a ViewportBounds
│   │   ├── PreferencesDialog
│   │   │   ├── PreferencesDialogMessage `editor\src\messages\dialog\preferences_dialog\preferences_dialog_message.rs`
│   │   │   │   └── Confirm
│   │   │   ├── PreferencesDialogMessageHandler `editor\src\messages\dialog\preferences_dialog\preferences_dialog_message_handler.rs`
│   │   │   └── PreferencesDialogMessageContext `editor\src\messages\dialog\preferences_dialog\preferences_dialog_message_handler.rs`
│   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   ├── CloseAllDocumentsWithConfirmation
│   │   ├── CloseDialogAndThen
│   │   │   └── followups: Vec<Message>
│   │   ├── DisplayDialogError
│   │   │   ├── title: String
│   │   │   └── description: String
│   │   ├── RequestAboutGraphiteDialog
│   │   ├── RequestAboutGraphiteDialogWithLocalizedCommitDate
│   │   │   ├── localized_commit_date: String
│   │   │   └── localized_commit_year: String
│   │   ├── RequestComingSoonDialog
│   │   │   └── issue: Option<u32>
│   │   ├── RequestDemoArtworkDialog
│   │   ├── RequestExportDialog
│   │   ├── RequestLicensesDialogWithLocalizedCommitDate
│   │   │   └── localized_commit_year: String
│   │   ├── RequestNewDocumentDialog
│   │   └── RequestPreferencesDialog
│   ├── DialogMessageHandler `editor\src\messages\dialog\dialog_message_handler.rs`
│   │   ├── export_dialog: ExportDialogMessageHandler
│   │   ├── new_document_dialog: NewDocumentDialogMessageHandler
│   │   └── preferences_dialog: PreferencesDialogMessageHandler
│   └── DialogMessageContext `editor\src\messages\dialog\dialog_message_handler.rs`
│       ├── portfolio: &'a PortfolioMessageHandler
│       ├── viewport_bounds: &'a ViewportBounds
│       └── preferences: &'a PreferencesMessageHandler
├── Frontend
│   ├── FrontendMessage `editor\src\messages\frontend\frontend_message.rs`
│   │   ├── DisplayDialog
│   │   │   ├── title: String
│   │   │   └── icon: String
│   │   ├── DisplayDialogDismiss
│   │   ├── DisplayDialogPanic
│   │   │   └── panic_info: String
│   │   ├── DisplayEditableTextbox
│   │   │   ├── text: String
│   │   │   ├── line_height_ratio: f64
│   │   │   ├── font_size: f64
│   │   │   ├── color: Color
│   │   │   ├── url: String
│   │   │   ├── transform: [f64; 6]
│   │   │   ├── max_width: Option<f64>
│   │   │   ├── max_height: Option<f64>
│   │   │   └── align: TextAlign
│   │   ├── DisplayEditableTextboxTransform
│   │   │   └── transform: [f64; 6]
│   │   ├── DisplayRemoveEditableTextbox
│   │   ├── SendUIMetadata
│   │   │   ├── node_descriptions: Vec<(String, String)>
│   │   │   └── node_types: Vec<FrontendNodeType>
│   │   ├── TriggerAboutGraphiteLocalizedCommitDate
│   │   │   └── commit_date: String
│   │   ├── TriggerSaveDocument
│   │   │   ├── document_id: DocumentId
│   │   │   ├── name: String
│   │   │   ├── path: Option<PathBuf>
│   │   │   └── content: Vec<u8>
│   │   ├── TriggerSaveFile
│   │   │   ├── name: String
│   │   │   └── content: Vec<u8>
│   │   ├── TriggerExportImage
│   │   │   ├── svg: String
│   │   │   ├── name: String
│   │   │   ├── mime: String
│   │   │   └── size: (f64, f64)
│   │   ├── TriggerFetchAndOpenDocument
│   │   │   ├── name: String
│   │   │   └── filename: String
│   │   ├── TriggerFontLoad
│   │   │   └── font: Font
│   │   ├── TriggerImport
│   │   ├── TriggerIndexedDbRemoveDocument
│   │   │   └── document_id: DocumentId
│   │   ├── TriggerIndexedDbWriteDocument
│   │   │   ├── document: String
│   │   │   └── details: FrontendDocumentDetails
│   │   ├── TriggerLoadFirstAutoSaveDocument
│   │   ├── TriggerLoadRestAutoSaveDocuments
│   │   ├── TriggerLoadPreferences
│   │   ├── TriggerOpenDocument
│   │   ├── TriggerPaste
│   │   ├── TriggerSavePreferences
│   │   │   └── preferences: PreferencesMessageHandler
│   │   ├── TriggerSaveActiveDocument
│   │   │   └── document_id: DocumentId
│   │   ├── TriggerTextCommit
│   │   ├── TriggerTextCopy
│   │   │   └── copy_text: String
│   │   ├── TriggerVisitLink
│   │   │   └── url: String
│   │   ├── UpdateActiveDocument
│   │   │   └── document_id: DocumentId
│   │   ├── UpdateImportsExports
│   │   │   ├── imports: Vec<(FrontendGraphOutput, i32, i32)>
│   │   │   ├── exports: Vec<(FrontendGraphInput, i32, i32)>
│   │   │   ├── add_import: Option<(i32, i32)>
│   │   │   └── add_export: Option<(i32, i32)>
│   │   ├── UpdateInSelectedNetwork
│   │   │   └── in_selected_network: bool
│   │   ├── UpdateBox
│   │   │   └── box_selection: Option<BoxSelection>
│   │   ├── UpdateContextMenuInformation
│   │   │   └── context_menu_information: Option<ContextMenuInformation>
│   │   ├── UpdateClickTargets
│   │   │   └── click_targets: Option<FrontendClickTargets>
│   │   ├── UpdateGraphViewOverlay
│   │   │   └── open: bool
│   │   ├── UpdateDataPanelState
│   │   │   └── open: bool
│   │   ├── UpdatePropertiesPanelState
│   │   │   └── open: bool
│   │   ├── UpdateLayersPanelState
│   │   │   └── open: bool
│   │   ├── UpdateDataPanelLayout
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── diff: Vec<WidgetDiff>
│   │   ├── UpdateImportReorderIndex
│   │   │   └── index: Option<usize>
│   │   ├── UpdateExportReorderIndex
│   │   │   └── index: Option<usize>
│   │   ├── UpdateLayerWidths
│   │   │   ├── layer_widths: HashMap<NodeId, u32>
│   │   │   ├── chain_widths: HashMap<NodeId, u32>
│   │   │   └── has_left_input_wire: HashMap<NodeId, bool>
│   │   ├── UpdateDialogButtons
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── diff: Vec<WidgetDiff>
│   │   ├── UpdateDialogColumn1
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── diff: Vec<WidgetDiff>
│   │   ├── UpdateDialogColumn2
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── diff: Vec<WidgetDiff>
│   │   ├── UpdateDocumentArtwork
│   │   │   └── svg: String
│   │   ├── UpdateImageData
│   │   │   └── image_data: Vec<(u64, Image<Color>)>
│   │   ├── UpdateDocumentBarLayout
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── diff: Vec<WidgetDiff>
│   │   ├── UpdateDocumentLayerDetails
│   │   │   └── data: LayerPanelEntry
│   │   ├── UpdateDocumentLayerStructure
│   │   │   └── data_buffer: RawBuffer
│   │   ├── UpdateDocumentLayerStructureJs
│   │   │   └── data_buffer: JsRawBuffer
│   │   ├── UpdateDocumentModeLayout
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── diff: Vec<WidgetDiff>
│   │   ├── UpdateDocumentRulers
│   │   │   ├── origin: (f64, f64)
│   │   │   ├── spacing: f64
│   │   │   ├── interval: f64
│   │   │   └── visible: bool
│   │   ├── UpdateDocumentScrollbars
│   │   │   ├── position: (f64, f64)
│   │   │   ├── size: (f64, f64)
│   │   │   └── multiplier: (f64, f64)
│   │   ├── UpdateEyedropperSamplingState
│   │   │   ├── mouse_position: Option<(f64, f64)>
│   │   │   ├── primary_color: String
│   │   │   ├── secondary_color: String
│   │   │   └── set_color_choice: Option<String>
│   │   ├── UpdateGraphFadeArtwork
│   │   │   └── percentage: f64
│   │   ├── UpdateInputHints
│   │   │   └── hint_data: HintData
│   │   ├── UpdateLayersPanelControlBarLeftLayout
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── diff: Vec<WidgetDiff>
│   │   ├── UpdateLayersPanelControlBarRightLayout
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── diff: Vec<WidgetDiff>
│   │   ├── UpdateLayersPanelBottomBarLayout
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── diff: Vec<WidgetDiff>
│   │   ├── UpdateMenuBarLayout
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── layout: Vec<MenuBarEntry>
│   │   ├── UpdateMouseCursor
│   │   │   └── cursor: MouseCursorIcon
│   │   ├── UpdateNodeGraphNodes
│   │   │   └── nodes: Vec<FrontendNode>
│   │   ├── UpdateVisibleNodes
│   │   │   └── nodes: Vec<NodeId>
│   │   ├── UpdateNodeGraphWires
│   │   │   └── wires: Vec<WirePathUpdate>
│   │   ├── ClearAllNodeGraphWires
│   │   ├── UpdateNodeGraphControlBarLayout
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── diff: Vec<WidgetDiff>
│   │   ├── UpdateNodeGraphSelection
│   │   │   └── selected: Vec<NodeId>
│   │   ├── UpdateNodeGraphTransform
│   │   │   └── transform: Transform
│   │   ├── UpdateNodeThumbnail
│   │   │   ├── id: NodeId
│   │   │   └── value: String
│   │   ├── UpdateOpenDocumentsList
│   │   │   └── open_documents: Vec<FrontendDocumentDetails>
│   │   ├── UpdatePropertiesPanelLayout
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── diff: Vec<WidgetDiff>
│   │   ├── UpdateToolOptionsLayout
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── diff: Vec<WidgetDiff>
│   │   ├── UpdateToolShelfLayout
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── diff: Vec<WidgetDiff>
│   │   ├── UpdateWirePathInProgress
│   │   │   └── wire_path: Option<WirePath>
│   │   ├── UpdateWorkingColorsLayout
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── diff: Vec<WidgetDiff>
│   │   ├── UpdatePlatform
│   │   │   └── platform: AppWindowPlatform
│   │   ├── UpdateMaximized
│   │   │   └── maximized: bool
│   │   ├── UpdateViewportHolePunch
│   │   │   └── active: bool
│   │   └── RenderOverlays
│   │       └── context: OverlayContext
├── Globals
│   ├── GlobalsMessage `editor\src\messages\globals\globals_message.rs`
│   │   └── SetPlatform
│   │       └── platform: Platform
│   └── GlobalsMessageHandler `editor\src\messages\globals\globals_message_handler.rs`
├── InputPreprocessor
│   ├── InputPreprocessorMessage `editor\src\messages\input_preprocessor\input_preprocessor_message.rs`
│   │   ├── BoundsOfViewports
│   │   │   └── bounds_of_viewports: Vec<ViewportBounds>
│   │   ├── DoubleClick
│   │   │   ├── editor_mouse_state: EditorMouseState
│   │   │   └── modifier_keys: ModifierKeys
│   │   ├── KeyDown
│   │   │   ├── key: Key
│   │   │   ├── key_repeat: bool
│   │   │   └── modifier_keys: ModifierKeys
│   │   ├── KeyUp
│   │   │   ├── key: Key
│   │   │   ├── key_repeat: bool
│   │   │   └── modifier_keys: ModifierKeys
│   │   ├── PointerDown
│   │   │   ├── editor_mouse_state: EditorMouseState
│   │   │   └── modifier_keys: ModifierKeys
│   │   ├── PointerMove
│   │   │   ├── editor_mouse_state: EditorMouseState
│   │   │   └── modifier_keys: ModifierKeys
│   │   ├── PointerUp
│   │   │   ├── editor_mouse_state: EditorMouseState
│   │   │   └── modifier_keys: ModifierKeys
│   │   ├── PointerShake
│   │   │   ├── editor_mouse_state: EditorMouseState
│   │   │   └── modifier_keys: ModifierKeys
│   │   ├── CurrentTime
│   │   │   └── timestamp: u64
│   │   └── WheelScroll
│   │       ├── editor_mouse_state: EditorMouseState
│   │       └── modifier_keys: ModifierKeys
│   ├── InputPreprocessorMessageHandler `editor\src\messages\input_preprocessor\input_preprocessor_message_handler.rs`
│   │   ├── frame_time: FrameTimeInfo
│   │   ├── time: u64
│   │   ├── keyboard: KeyStates
│   │   ├── mouse: MouseState
│   │   └── viewport_bounds: ViewportBounds
│   └── InputPreprocessorMessageContext `editor\src\messages\input_preprocessor\input_preprocessor_message_handler.rs`
│       └── keyboard_platform: KeyboardPlatformLayout
├── KeyMapping
│   ├── KeyMappingMessage `editor\src\messages\input_mapper\key_mapping\key_mapping_message.rs`
│   │   ├── Lookup
│   │   │   ├── InputMapperMessage `editor\src\messages\input_mapper\input_mapper_message.rs`
│   │   │   │   ├── KeyDown
│   │   │   │   │   └── Key
│   │   │   │   ├── KeyUp
│   │   │   │   │   └── Key
│   │   │   │   ├── KeyDownNoRepeat
│   │   │   │   │   └── Key
│   │   │   │   ├── KeyUpNoRepeat
│   │   │   │   │   └── Key
│   │   │   │   ├── DoubleClick
│   │   │   │   │   └── MouseButton
│   │   │   │   ├── PointerMove
│   │   │   │   ├── PointerShake
│   │   │   │   └── WheelScroll
│   │   │   ├── InputMapperMessageHandler `editor\src\messages\input_mapper\input_mapper_message_handler.rs`
│   │   │   │   └── mapping: Mapping
│   │   │   └── InputMapperMessageContext `editor\src\messages\input_mapper\input_mapper_message_handler.rs`
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       └── actions: ActionList
│   │   └── ModifyMapping
│   │       └── mapping: MappingVariant
│   ├── KeyMappingMessageHandler `editor\src\messages\input_mapper\key_mapping\key_mapping_message_handler.rs`
│   │   └── mapping_handler: InputMapperMessageHandler
│   └── KeyMappingMessageContext `editor\src\messages\input_mapper\key_mapping\key_mapping_message_handler.rs`
│       ├── input: &'a InputPreprocessorMessageHandler
│       └── actions: ActionList
├── Layout
│   ├── LayoutMessage `editor\src\messages\layout\layout_message.rs`
│   │   ├── ResendActiveWidget
│   │   │   ├── layout_target: LayoutTarget
│   │   │   └── widget_id: WidgetId
│   │   ├── SendLayout
│   │   │   ├── layout: Layout
│   │   │   └── layout_target: LayoutTarget
│   │   ├── WidgetValueCommit
│   │   │   ├── layout_target: LayoutTarget
│   │   │   ├── widget_id: WidgetId
│   │   │   └── value: serde_json::Value
│   │   └── WidgetValueUpdate
│   │       ├── layout_target: LayoutTarget
│   │       ├── widget_id: WidgetId
│   │       └── value: serde_json::Value
│   ├── LayoutMessageHandler `editor\src\messages\layout\layout_message_handler.rs`
│   │   └── layouts: [Layout; LayoutTarget::LayoutTargetLength as usize]
│   └── LayoutMessageContext `editor\src\messages\layout\layout_message_handler.rs`
│       └── action_input_mapping: &'a dyn Fn(&MessageDiscriminant) -> Option<KeysGroup>
├── Portfolio
│   ├── PortfolioMessage `editor\src\messages\portfolio\portfolio_message.rs`
│   │   ├── MenuBar
│   │   │   ├── MenuBarMessage `editor\src\messages\portfolio\menu_bar\menu_bar_message.rs`
│   │   │   │   └── SendLayout
│   │   │   └── MenuBarMessageHandler `editor\src\messages\portfolio\menu_bar\menu_bar_message_handler.rs`
│   │   │       ├── has_active_document: bool
│   │   │       ├── canvas_tilted: bool
│   │   │       ├── canvas_flipped: bool
│   │   │       ├── rulers_visible: bool
│   │   │       ├── node_graph_open: bool
│   │   │       ├── has_selected_nodes: bool
│   │   │       ├── has_selected_layers: bool
│   │   │       ├── has_selection_history: (bool, bool)
│   │   │       ├── message_logging_verbosity: MessageLoggingVerbosity
│   │   │       ├── reset_node_definitions_on_open: bool
│   │   │       ├── make_path_editable_is_allowed: bool
│   │   │       ├── data_panel_open: bool
│   │   │       ├── layers_panel_open: bool
│   │   │       └── properties_panel_open: bool
│   │   ├── Document
│   │   │   ├── DocumentMessage `editor\src\messages\portfolio\document\document_message.rs`
│   │   │   │   ├── Noop
│   │   │   │   ├── GraphOperation
│   │   │   │   │   ├── GraphOperationMessage `editor\src\messages\portfolio\document\graph_operation\graph_operation_message.rs`
│   │   │   │   │   │   ├── FillSet
│   │   │   │   │   │   │   ├── layer: LayerNodeIdentifier
│   │   │   │   │   │   │   └── fill: Fill
│   │   │   │   │   │   ├── BlendingFillSet
│   │   │   │   │   │   │   ├── layer: LayerNodeIdentifier
│   │   │   │   │   │   │   └── fill: f64
│   │   │   │   │   │   ├── OpacitySet
│   │   │   │   │   │   │   ├── layer: LayerNodeIdentifier
│   │   │   │   │   │   │   └── opacity: f64
│   │   │   │   │   │   ├── BlendModeSet
│   │   │   │   │   │   │   ├── layer: LayerNodeIdentifier
│   │   │   │   │   │   │   └── blend_mode: BlendMode
│   │   │   │   │   │   ├── ClipModeToggle
│   │   │   │   │   │   │   └── layer: LayerNodeIdentifier
│   │   │   │   │   │   ├── StrokeSet
│   │   │   │   │   │   │   ├── layer: LayerNodeIdentifier
│   │   │   │   │   │   │   └── stroke: Stroke
│   │   │   │   │   │   ├── TransformChange
│   │   │   │   │   │   │   ├── layer: LayerNodeIdentifier
│   │   │   │   │   │   │   ├── transform: DAffine2
│   │   │   │   │   │   │   ├── transform_in: TransformIn
│   │   │   │   │   │   │   └── skip_rerender: bool
│   │   │   │   │   │   ├── TransformSet
│   │   │   │   │   │   │   ├── layer: LayerNodeIdentifier
│   │   │   │   │   │   │   ├── transform: DAffine2
│   │   │   │   │   │   │   ├── transform_in: TransformIn
│   │   │   │   │   │   │   └── skip_rerender: bool
│   │   │   │   │   │   ├── Vector
│   │   │   │   │   │   │   ├── layer: LayerNodeIdentifier
│   │   │   │   │   │   │   └── modification_type: VectorModificationType
│   │   │   │   │   │   ├── Brush
│   │   │   │   │   │   │   ├── layer: LayerNodeIdentifier
│   │   │   │   │   │   │   └── strokes: Vec<BrushStroke>
│   │   │   │   │   │   ├── SetUpstreamToChain
│   │   │   │   │   │   │   └── layer: LayerNodeIdentifier
│   │   │   │   │   │   ├── NewArtboard
│   │   │   │   │   │   │   ├── id: NodeId
│   │   │   │   │   │   │   └── artboard: Artboard
│   │   │   │   │   │   ├── NewBitmapLayer
│   │   │   │   │   │   │   ├── id: NodeId
│   │   │   │   │   │   │   ├── image_frame: Table<Raster<CPU>>
│   │   │   │   │   │   │   ├── parent: LayerNodeIdentifier
│   │   │   │   │   │   │   └── insert_index: usize
│   │   │   │   │   │   ├── NewBooleanOperationLayer
│   │   │   │   │   │   │   ├── id: NodeId
│   │   │   │   │   │   │   ├── operation: graphene_std::path_bool::BooleanOperation
│   │   │   │   │   │   │   ├── parent: LayerNodeIdentifier
│   │   │   │   │   │   │   └── insert_index: usize
│   │   │   │   │   │   ├── NewCustomLayer
│   │   │   │   │   │   │   ├── id: NodeId
│   │   │   │   │   │   │   ├── nodes: Vec<(NodeId, NodeTemplate)>
│   │   │   │   │   │   │   ├── parent: LayerNodeIdentifier
│   │   │   │   │   │   │   └── insert_index: usize
│   │   │   │   │   │   ├── NewVectorLayer
│   │   │   │   │   │   │   ├── id: NodeId
│   │   │   │   │   │   │   ├── subpaths: Vec<Subpath<PointId>>
│   │   │   │   │   │   │   ├── parent: LayerNodeIdentifier
│   │   │   │   │   │   │   └── insert_index: usize
│   │   │   │   │   │   ├── NewTextLayer
│   │   │   │   │   │   │   ├── id: NodeId
│   │   │   │   │   │   │   ├── text: String
│   │   │   │   │   │   │   ├── font: Font
│   │   │   │   │   │   │   ├── typesetting: TypesettingConfig
│   │   │   │   │   │   │   ├── parent: LayerNodeIdentifier
│   │   │   │   │   │   │   └── insert_index: usize
│   │   │   │   │   │   ├── ResizeArtboard
│   │   │   │   │   │   │   ├── layer: LayerNodeIdentifier
│   │   │   │   │   │   │   ├── location: IVec2
│   │   │   │   │   │   │   └── dimensions: IVec2
│   │   │   │   │   │   ├── RemoveArtboards
│   │   │   │   │   │   └── NewSvg
│   │   │   │   │   │       ├── id: NodeId
│   │   │   │   │   │       ├── svg: String
│   │   │   │   │   │       ├── transform: DAffine2
│   │   │   │   │   │       ├── parent: LayerNodeIdentifier
│   │   │   │   │   │       └── insert_index: usize
│   │   │   │   │   ├── GraphOperationMessageHandler `editor\src\messages\portfolio\document\graph_operation\graph_operation_message_handler.rs`
│   │   │   │   │   └── GraphOperationMessageContext `editor\src\messages\portfolio\document\graph_operation\graph_operation_message_handler.rs`
│   │   │   │   │       ├── network_interface: &'a mut NodeNetworkInterface
│   │   │   │   │       ├── collapsed: &'a mut CollapsedLayers
│   │   │   │   │       └── node_graph: &'a mut NodeGraphMessageHandler
│   │   │   │   ├── Navigation
│   │   │   │   │   ├── NavigationMessage `editor\src\messages\portfolio\document\navigation\navigation_message.rs`
│   │   │   │   │   │   ├── BeginCanvasPan
│   │   │   │   │   │   ├── BeginCanvasTilt
│   │   │   │   │   │   │   └── was_dispatched_from_menu: bool
│   │   │   │   │   │   ├── BeginCanvasZoom
│   │   │   │   │   │   ├── CanvasPan
│   │   │   │   │   │   │   └── delta: DVec2
│   │   │   │   │   │   ├── CanvasPanAbortPrepare
│   │   │   │   │   │   │   └── x_not_y_axis: bool
│   │   │   │   │   │   ├── CanvasPanAbort
│   │   │   │   │   │   │   └── x_not_y_axis: bool
│   │   │   │   │   │   ├── CanvasPanByViewportFraction
│   │   │   │   │   │   │   └── delta: DVec2
│   │   │   │   │   │   ├── CanvasPanMouseWheel
│   │   │   │   │   │   │   └── use_y_as_x: bool
│   │   │   │   │   │   ├── CanvasTiltResetAndZoomTo100Percent
│   │   │   │   │   │   ├── CanvasTiltSet
│   │   │   │   │   │   │   └── angle_radians: f64
│   │   │   │   │   │   ├── CanvasZoomDecrease
│   │   │   │   │   │   │   └── center_on_mouse: bool
│   │   │   │   │   │   ├── CanvasZoomIncrease
│   │   │   │   │   │   │   └── center_on_mouse: bool
│   │   │   │   │   │   ├── CanvasZoomMouseWheel
│   │   │   │   │   │   ├── CanvasZoomSet
│   │   │   │   │   │   │   └── zoom_factor: f64
│   │   │   │   │   │   ├── CanvasFlip
│   │   │   │   │   │   ├── EndCanvasPTZ
│   │   │   │   │   │   │   └── abort_transform: bool
│   │   │   │   │   │   ├── EndCanvasPTZWithClick
│   │   │   │   │   │   │   └── commit_key: Key
│   │   │   │   │   │   ├── FitViewportToBounds
│   │   │   │   │   │   │   ├── bounds: [DVec2; 2]
│   │   │   │   │   │   │   └── prevent_zoom_past_100: bool
│   │   │   │   │   │   ├── FitViewportToSelection
│   │   │   │   │   │   └── PointerMove
│   │   │   │   │   │       └── snap: Key
│   │   │   │   │   ├── NavigationMessageHandler `editor\src\messages\portfolio\document\navigation\navigation_message_handler.rs`
│   │   │   │   │   │   ├── navigation_operation: NavigationOperation
│   │   │   │   │   │   ├── mouse_position: ViewportPosition
│   │   │   │   │   │   ├── finish_operation_with_click: bool
│   │   │   │   │   │   └── abortable_pan_start: Option<f64>
│   │   │   │   │   └── NavigationMessageContext `editor\src\messages\portfolio\document\navigation\navigation_message_handler.rs`
│   │   │   │   │       ├── network_interface: &'a mut NodeNetworkInterface
│   │   │   │   │       ├── breadcrumb_network_path: &'a [NodeId]
│   │   │   │   │       ├── ipp: &'a InputPreprocessorMessageHandler
│   │   │   │   │       ├── document_ptz: &'a mut PTZ
│   │   │   │   │       ├── graph_view_overlay_open: bool
│   │   │   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   │   │   ├── NodeGraph
│   │   │   │   │   ├── NodeGraphMessage `editor\src\messages\portfolio\document\node_graph\node_graph_message.rs`
│   │   │   │   │   │   ├── AddNodes
│   │   │   │   │   │   │   ├── nodes: Vec<(NodeId, NodeTemplate)>
│   │   │   │   │   │   │   └── new_ids: HashMap<NodeId, NodeId>
│   │   │   │   │   │   ├── AddPathNode
│   │   │   │   │   │   ├── AddImport
│   │   │   │   │   │   ├── AddExport
│   │   │   │   │   │   ├── Init
│   │   │   │   │   │   ├── SelectedNodesUpdated
│   │   │   │   │   │   ├── Copy
│   │   │   │   │   │   ├── CreateNodeInLayerNoTransaction
│   │   │   │   │   │   │   ├── node_type: String
│   │   │   │   │   │   │   └── layer: LayerNodeIdentifier
│   │   │   │   │   │   ├── CreateNodeInLayerWithTransaction
│   │   │   │   │   │   │   ├── node_type: String
│   │   │   │   │   │   │   └── layer: LayerNodeIdentifier
│   │   │   │   │   │   ├── CreateNodeFromContextMenu
│   │   │   │   │   │   │   ├── node_id: Option<NodeId>
│   │   │   │   │   │   │   ├── node_type: String
│   │   │   │   │   │   │   ├── xy: Option<(i32, i32)>
│   │   │   │   │   │   │   └── add_transaction: bool
│   │   │   │   │   │   ├── CreateWire
│   │   │   │   │   │   │   ├── output_connector: OutputConnector
│   │   │   │   │   │   │   └── input_connector: InputConnector
│   │   │   │   │   │   ├── ConnectUpstreamOutputToInput
│   │   │   │   │   │   │   ├── downstream_input: InputConnector
│   │   │   │   │   │   │   └── input_connector: InputConnector
│   │   │   │   │   │   ├── Cut
│   │   │   │   │   │   ├── DeleteNodes
│   │   │   │   │   │   │   ├── node_ids: Vec<NodeId>
│   │   │   │   │   │   │   └── delete_children: bool
│   │   │   │   │   │   ├── DeleteSelectedNodes
│   │   │   │   │   │   │   └── delete_children: bool
│   │   │   │   │   │   ├── DisconnectInput
│   │   │   │   │   │   │   └── input_connector: InputConnector
│   │   │   │   │   │   ├── DisconnectRootNode
│   │   │   │   │   │   ├── EnterNestedNetwork
│   │   │   │   │   │   ├── DuplicateSelectedNodes
│   │   │   │   │   │   ├── ExposeInput
│   │   │   │   │   │   │   ├── input_connector: InputConnector
│   │   │   │   │   │   │   ├── set_to_exposed: bool
│   │   │   │   │   │   │   └── start_transaction: bool
│   │   │   │   │   │   ├── InsertNode
│   │   │   │   │   │   │   ├── node_id: NodeId
│   │   │   │   │   │   │   └── node_template: NodeTemplate
│   │   │   │   │   │   ├── InsertNodeBetween
│   │   │   │   │   │   │   ├── node_id: NodeId
│   │   │   │   │   │   │   ├── input_connector: InputConnector
│   │   │   │   │   │   │   └── insert_node_input_index: usize
│   │   │   │   │   │   ├── MergeSelectedNodes
│   │   │   │   │   │   ├── MoveLayerToStack
│   │   │   │   │   │   │   ├── layer: LayerNodeIdentifier
│   │   │   │   │   │   │   ├── parent: LayerNodeIdentifier
│   │   │   │   │   │   │   └── insert_index: usize
│   │   │   │   │   │   ├── MoveNodeToChainStart
│   │   │   │   │   │   │   ├── node_id: NodeId
│   │   │   │   │   │   │   └── parent: LayerNodeIdentifier
│   │   │   │   │   │   ├── SetChainPosition
│   │   │   │   │   │   │   └── node_id: NodeId
│   │   │   │   │   │   ├── PasteNodes
│   │   │   │   │   │   │   └── serialized_nodes: String
│   │   │   │   │   │   ├── PointerDown
│   │   │   │   │   │   │   ├── shift_click: bool
│   │   │   │   │   │   │   ├── control_click: bool
│   │   │   │   │   │   │   ├── alt_click: bool
│   │   │   │   │   │   │   └── right_click: bool
│   │   │   │   │   │   ├── PointerMove
│   │   │   │   │   │   │   └── shift: Key
│   │   │   │   │   │   ├── PointerUp
│   │   │   │   │   │   ├── PointerOutsideViewport
│   │   │   │   │   │   │   └── shift: Key
│   │   │   │   │   │   ├── ShakeNode
│   │   │   │   │   │   ├── RemoveImport
│   │   │   │   │   │   │   └── import_index: usize
│   │   │   │   │   │   ├── RemoveExport
│   │   │   │   │   │   │   └── export_index: usize
│   │   │   │   │   │   ├── ReorderImport
│   │   │   │   │   │   │   ├── start_index: usize
│   │   │   │   │   │   │   └── end_index: usize
│   │   │   │   │   │   ├── ReorderExport
│   │   │   │   │   │   │   ├── start_index: usize
│   │   │   │   │   │   │   └── end_index: usize
│   │   │   │   │   │   ├── RunDocumentGraph
│   │   │   │   │   │   ├── ForceRunDocumentGraph
│   │   │   │   │   │   ├── SelectedNodesAdd
│   │   │   │   │   │   │   └── nodes: Vec<NodeId>
│   │   │   │   │   │   ├── SelectedNodesRemove
│   │   │   │   │   │   │   └── nodes: Vec<NodeId>
│   │   │   │   │   │   ├── SelectedNodesSet
│   │   │   │   │   │   │   └── nodes: Vec<NodeId>
│   │   │   │   │   │   ├── SendClickTargets
│   │   │   │   │   │   ├── EndSendClickTargets
│   │   │   │   │   │   ├── UnloadWires
│   │   │   │   │   │   ├── SendWires
│   │   │   │   │   │   ├── UpdateVisibleNodes
│   │   │   │   │   │   ├── SendGraph
│   │   │   │   │   │   ├── SetGridAlignedEdges
│   │   │   │   │   │   ├── SetInputValue
│   │   │   │   │   │   │   ├── node_id: NodeId
│   │   │   │   │   │   │   ├── input_index: usize
│   │   │   │   │   │   │   └── value: TaggedValue
│   │   │   │   │   │   ├── SetInput
│   │   │   │   │   │   │   ├── input_connector: InputConnector
│   │   │   │   │   │   │   └── input: NodeInput
│   │   │   │   │   │   ├── SetDisplayName
│   │   │   │   │   │   │   ├── node_id: NodeId
│   │   │   │   │   │   │   ├── alias: String
│   │   │   │   │   │   │   └── skip_adding_history_step: bool
│   │   │   │   │   │   ├── SetDisplayNameImpl
│   │   │   │   │   │   │   ├── node_id: NodeId
│   │   │   │   │   │   │   └── alias: String
│   │   │   │   │   │   ├── SetToNodeOrLayer
│   │   │   │   │   │   │   ├── node_id: NodeId
│   │   │   │   │   │   │   └── is_layer: bool
│   │   │   │   │   │   ├── ShiftNodePosition
│   │   │   │   │   │   │   ├── node_id: NodeId
│   │   │   │   │   │   │   ├── x: i32
│   │   │   │   │   │   │   └── y: i32
│   │   │   │   │   │   ├── ShiftSelectedNodes
│   │   │   │   │   │   │   ├── direction: Direction
│   │   │   │   │   │   │   └── rubber_band: bool
│   │   │   │   │   │   ├── ShiftSelectedNodesByAmount
│   │   │   │   │   │   │   ├── graph_delta: IVec2
│   │   │   │   │   │   │   └── rubber_band: bool
│   │   │   │   │   │   ├── TogglePreview
│   │   │   │   │   │   │   └── node_id: NodeId
│   │   │   │   │   │   ├── TogglePreviewImpl
│   │   │   │   │   │   │   └── node_id: NodeId
│   │   │   │   │   │   ├── SetImportExportName
│   │   │   │   │   │   │   ├── name: String
│   │   │   │   │   │   │   └── index: ImportOrExport
│   │   │   │   │   │   ├── SetImportExportNameImpl
│   │   │   │   │   │   │   ├── name: String
│   │   │   │   │   │   │   └── index: ImportOrExport
│   │   │   │   │   │   ├── ToggleSelectedAsLayersOrNodes
│   │   │   │   │   │   ├── ToggleSelectedLocked
│   │   │   │   │   │   ├── ToggleLocked
│   │   │   │   │   │   │   └── node_id: NodeId
│   │   │   │   │   │   ├── SetLocked
│   │   │   │   │   │   │   ├── node_id: NodeId
│   │   │   │   │   │   │   └── locked: bool
│   │   │   │   │   │   ├── ToggleSelectedIsPinned
│   │   │   │   │   │   ├── ToggleSelectedVisibility
│   │   │   │   │   │   ├── ToggleVisibility
│   │   │   │   │   │   │   └── node_id: NodeId
│   │   │   │   │   │   ├── SetPinned
│   │   │   │   │   │   │   ├── node_id: NodeId
│   │   │   │   │   │   │   └── pinned: bool
│   │   │   │   │   │   ├── SetVisibility
│   │   │   │   │   │   │   ├── node_id: NodeId
│   │   │   │   │   │   │   └── visible: bool
│   │   │   │   │   │   ├── SetLockedOrVisibilitySideEffects
│   │   │   │   │   │   │   └── node_ids: Vec<NodeId>
│   │   │   │   │   │   ├── UpdateEdges
│   │   │   │   │   │   ├── UpdateBoxSelection
│   │   │   │   │   │   ├── UpdateImportsExports
│   │   │   │   │   │   ├── UpdateLayerPanel
│   │   │   │   │   │   ├── UpdateNewNodeGraph
│   │   │   │   │   │   ├── UpdateTypes
│   │   │   │   │   │   │   ├── resolved_types: ResolvedDocumentNodeTypesDelta
│   │   │   │   │   │   │   └── node_graph_errors: GraphErrors
│   │   │   │   │   │   ├── UpdateActionButtons
│   │   │   │   │   │   ├── UpdateGraphBarRight
│   │   │   │   │   │   ├── UpdateInSelectedNetwork
│   │   │   │   │   │   ├── UpdateHints
│   │   │   │   │   │   └── SendSelectedNodes
│   │   │   │   │   ├── NodeGraphMessageHandler `editor\src\messages\portfolio\document\node_graph\node_graph_message_handler.rs`
│   │   │   │   │   │   ├── network: Vec<NodeId>
│   │   │   │   │   │   ├── node_graph_errors: GraphErrors
│   │   │   │   │   │   ├── has_selection: bool
│   │   │   │   │   │   ├── widgets: [LayoutGroup; 2]
│   │   │   │   │   │   ├── begin_dragging: bool
│   │   │   │   │   │   ├── node_has_moved_in_drag: bool
│   │   │   │   │   │   ├── drag_start: Option<(DragStart, bool)>
│   │   │   │   │   │   ├── drag_start_chain_nodes: Vec<NodeId>
│   │   │   │   │   │   ├── box_selection_start: Option<(DVec2, bool)>
│   │   │   │   │   │   ├── selection_before_pointer_down: Vec<NodeId>
│   │   │   │   │   │   ├── shift_without_push: bool
│   │   │   │   │   │   ├── disconnecting: Option<InputConnector>
│   │   │   │   │   │   ├── initial_disconnecting: bool
│   │   │   │   │   │   ├── select_if_not_dragged: Option<NodeId>
│   │   │   │   │   │   ├── wire_in_progress_from_connector: Option<DVec2>
│   │   │   │   │   │   ├── wire_in_progress_type: FrontendGraphDataType
│   │   │   │   │   │   ├── wire_in_progress_to_connector: Option<DVec2>
│   │   │   │   │   │   ├── context_menu: Option<ContextMenuInformation>
│   │   │   │   │   │   ├── deselect_on_pointer_up: Option<usize>
│   │   │   │   │   │   ├── auto_panning: AutoPanning
│   │   │   │   │   │   ├── preview_on_mouse_up: Option<NodeId>
│   │   │   │   │   │   ├── reordering_import: Option<usize>
│   │   │   │   │   │   ├── reordering_export: Option<usize>
│   │   │   │   │   │   ├── end_index: Option<usize>
│   │   │   │   │   │   ├── frontend_nodes: Vec<NodeId>
│   │   │   │   │   │   └── frontend_wires: HashSet<(NodeId, usize)>
│   │   │   │   │   └── NodeGraphMessageContext `editor\src\messages\portfolio\document\node_graph\node_graph_message_handler.rs`
│   │   │   │   │       ├── network_interface: &'a mut NodeNetworkInterface
│   │   │   │   │       ├── selection_network_path: &'a [NodeId]
│   │   │   │   │       ├── breadcrumb_network_path: &'a [NodeId]
│   │   │   │   │       ├── document_id: DocumentId
│   │   │   │   │       ├── collapsed: &'a mut CollapsedLayers
│   │   │   │   │       ├── ipp: &'a InputPreprocessorMessageHandler
│   │   │   │   │       ├── graph_view_overlay_open: bool
│   │   │   │   │       ├── graph_fade_artwork_percentage: f64
│   │   │   │   │       ├── navigation_handler: &'a NavigationMessageHandler
│   │   │   │   │       ├── preferences: &'a PreferencesMessageHandler
│   │   │   │   │       └── layers_panel_open: bool
│   │   │   │   ├── Overlays
│   │   │   │   │   ├── OverlaysMessage `editor\src\messages\portfolio\document\overlays\overlays_message.rs`
│   │   │   │   │   │   ├── Draw
│   │   │   │   │   │   ├── AddProvider
│   │   │   │   │   │   │   └── provider: OverlayProvider
│   │   │   │   │   │   └── RemoveProvider
│   │   │   │   │   │       └── provider: OverlayProvider
│   │   │   │   │   ├── OverlaysMessageHandler `editor\src\messages\portfolio\document\overlays\overlays_message_handler.rs`
│   │   │   │   │   │   └── overlay_providers: HashSet<OverlayProvider>
│   │   │   │   │   └── OverlaysMessageContext `editor\src\messages\portfolio\document\overlays\overlays_message_handler.rs`
│   │   │   │   │       ├── visibility_settings: OverlaysVisibilitySettings
│   │   │   │   │       ├── ipp: &'a InputPreprocessorMessageHandler
│   │   │   │   │       └── device_pixel_ratio: f64
│   │   │   │   ├── PropertiesPanel
│   │   │   │   │   ├── PropertiesPanelMessage `editor\src\messages\portfolio\document\properties_panel\properties_panel_message.rs`
│   │   │   │   │   │   ├── Clear
│   │   │   │   │   │   └── Refresh
│   │   │   │   │   ├── PropertiesPanelMessageHandler `editor\src\messages\portfolio\document\properties_panel\properties_panel_message_handler.rs`
│   │   │   │   │   └── PropertiesPanelMessageContext `editor\src\messages\portfolio\document\properties_panel\properties_panel_message_handler.rs`
│   │   │   │   │       ├── network_interface: &'a mut NodeNetworkInterface
│   │   │   │   │       ├── selection_network_path: &'a [NodeId]
│   │   │   │   │       ├── document_name: &'a str
│   │   │   │   │       ├── executor: &'a mut NodeGraphExecutor
│   │   │   │   │       ├── persistent_data: &'a PersistentData
│   │   │   │   │       └── properties_panel_open: bool
│   │   │   │   ├── DataPanel
│   │   │   │   │   ├── DataPanelMessage `editor\src\messages\portfolio\document\data_panel\data_panel_message.rs`
│   │   │   │   │   │   ├── UpdateLayout
│   │   │   │   │   │   │   └── inspect_result: InspectResult
│   │   │   │   │   │   ├── ClearLayout
│   │   │   │   │   │   ├── PushToElementPath
│   │   │   │   │   │   │   └── index: usize
│   │   │   │   │   │   ├── TruncateElementPath
│   │   │   │   │   │   │   └── len: usize
│   │   │   │   │   │   └── ViewVectorTableTab
│   │   │   │   │   │       └── tab: VectorTableTab
│   │   │   │   │   ├── DataPanelMessageHandler `editor\src\messages\portfolio\document\data_panel\data_panel_message_handler.rs`
│   │   │   │   │   │   ├── introspected_node: Option<NodeId>
│   │   │   │   │   │   ├── introspected_data: Option<Arc<dyn Any + Send + Sync>>
│   │   │   │   │   │   ├── element_path: Vec<usize>
│   │   │   │   │   │   └── active_vector_table_tab: VectorTableTab
│   │   │   │   │   └── DataPanelMessageContext `editor\src\messages\portfolio\document\data_panel\data_panel_message_handler.rs`
│   │   │   │   │       ├── network_interface: &'a mut NodeNetworkInterface
│   │   │   │   │       └── data_panel_open: bool
│   │   │   │   ├── AlignSelectedLayers
│   │   │   │   │   ├── axis: AlignAxis
│   │   │   │   │   └── aggregate: AlignAggregate
│   │   │   │   ├── RemoveArtboards
│   │   │   │   ├── ClearLayersPanel
│   │   │   │   ├── CreateEmptyFolder
│   │   │   │   ├── DeleteNode
│   │   │   │   │   └── node_id: NodeId
│   │   │   │   ├── DeleteSelectedLayers
│   │   │   │   ├── DeselectAllLayers
│   │   │   │   ├── DocumentHistoryBackward
│   │   │   │   ├── DocumentHistoryForward
│   │   │   │   ├── DocumentStructureChanged
│   │   │   │   ├── DrawArtboardOverlays
│   │   │   │   │   └── context: OverlayContext
│   │   │   │   ├── DuplicateSelectedLayers
│   │   │   │   ├── EnterNestedNetwork
│   │   │   │   │   └── node_id: NodeId
│   │   │   │   ├── Escape
│   │   │   │   ├── ExitNestedNetwork
│   │   │   │   │   └── steps_back: usize
│   │   │   │   ├── FlipSelectedLayers
│   │   │   │   │   └── flip_axis: FlipAxis
│   │   │   │   ├── RotateSelectedLayers
│   │   │   │   │   └── degrees: f64
│   │   │   │   ├── GraphViewOverlay
│   │   │   │   │   └── open: bool
│   │   │   │   ├── GraphViewOverlayToggle
│   │   │   │   ├── GridOptions
│   │   │   │   │   └── options: GridSnapping
│   │   │   │   ├── GridOverlays
│   │   │   │   │   └── context: OverlayContext
│   │   │   │   ├── GridVisibility
│   │   │   │   │   └── visible: bool
│   │   │   │   ├── GroupSelectedLayers
│   │   │   │   │   └── group_folder_type: GroupFolderType
│   │   │   │   ├── MoveSelectedLayersTo
│   │   │   │   │   ├── parent: LayerNodeIdentifier
│   │   │   │   │   └── insert_index: usize
│   │   │   │   ├── MoveSelectedLayersToGroup
│   │   │   │   │   └── parent: LayerNodeIdentifier
│   │   │   │   ├── NudgeSelectedLayers
│   │   │   │   │   ├── delta_x: f64
│   │   │   │   │   ├── delta_y: f64
│   │   │   │   │   ├── resize: Key
│   │   │   │   │   └── resize_opposite_corner: Key
│   │   │   │   ├── PasteImage
│   │   │   │   │   ├── name: Option<String>
│   │   │   │   │   ├── image: Image<Color>
│   │   │   │   │   ├── mouse: Option<(f64, f64)>
│   │   │   │   │   └── parent_and_insert_index: Option<(LayerNodeIdentifier, usize)>
│   │   │   │   ├── PasteSvg
│   │   │   │   │   ├── name: Option<String>
│   │   │   │   │   ├── svg: String
│   │   │   │   │   ├── mouse: Option<(f64, f64)>
│   │   │   │   │   └── parent_and_insert_index: Option<(LayerNodeIdentifier, usize)>
│   │   │   │   ├── Redo
│   │   │   │   ├── RenameDocument
│   │   │   │   │   └── new_name: String
│   │   │   │   ├── RenderRulers
│   │   │   │   ├── RenderScrollbars
│   │   │   │   ├── SaveDocument
│   │   │   │   ├── SaveDocumentAs
│   │   │   │   ├── SavedDocument
│   │   │   │   │   └── path: Option<PathBuf>
│   │   │   │   ├── SelectParentLayer
│   │   │   │   ├── SelectAllLayers
│   │   │   │   ├── SelectedLayersLower
│   │   │   │   ├── SelectedLayersLowerToBack
│   │   │   │   ├── SelectedLayersRaise
│   │   │   │   ├── SelectedLayersRaiseToFront
│   │   │   │   ├── SelectedLayersReverse
│   │   │   │   ├── SelectedLayersReorder
│   │   │   │   │   └── relative_index_offset: isize
│   │   │   │   ├── ClipLayer
│   │   │   │   │   └── id: NodeId
│   │   │   │   ├── SelectLayer
│   │   │   │   │   ├── id: NodeId
│   │   │   │   │   ├── ctrl: bool
│   │   │   │   │   └── shift: bool
│   │   │   │   ├── SetActivePanel
│   │   │   │   │   └── active_panel: PanelType
│   │   │   │   ├── SetBlendModeForSelectedLayers
│   │   │   │   │   └── blend_mode: BlendMode
│   │   │   │   ├── SetGraphFadeArtwork
│   │   │   │   │   └── percentage: f64
│   │   │   │   ├── SetNodePinned
│   │   │   │   │   ├── node_id: NodeId
│   │   │   │   │   └── pinned: bool
│   │   │   │   ├── SetOpacityForSelectedLayers
│   │   │   │   │   └── opacity: f64
│   │   │   │   ├── SetFillForSelectedLayers
│   │   │   │   │   └── fill: f64
│   │   │   │   ├── SetOverlaysVisibility
│   │   │   │   │   ├── visible: bool
│   │   │   │   │   └── overlays_type: Option<OverlaysType>
│   │   │   │   ├── SetRangeSelectionLayer
│   │   │   │   │   └── new_layer: Option<LayerNodeIdentifier>
│   │   │   │   ├── SetSnapping
│   │   │   │   │   ├── closure: Option<for<'a>fn(&'a mut SnappingState) -> &'a mut bool>
│   │   │   │   │   └── snapping_state: bool
│   │   │   │   ├── SetToNodeOrLayer
│   │   │   │   │   ├── node_id: NodeId
│   │   │   │   │   └── is_layer: bool
│   │   │   │   ├── SetViewMode
│   │   │   │   │   └── view_mode: ViewMode
│   │   │   │   ├── AddTransaction
│   │   │   │   ├── StartTransaction
│   │   │   │   ├── EndTransaction
│   │   │   │   ├── CommitTransaction
│   │   │   │   ├── AbortTransaction
│   │   │   │   ├── RepeatedAbortTransaction
│   │   │   │   │   └── undo_count: usize
│   │   │   │   ├── ToggleLayerExpansion
│   │   │   │   │   ├── id: NodeId
│   │   │   │   │   └── recursive: bool
│   │   │   │   ├── ToggleSelectedVisibility
│   │   │   │   ├── ToggleSelectedLocked
│   │   │   │   ├── ToggleGridVisibility
│   │   │   │   ├── ToggleOverlaysVisibility
│   │   │   │   ├── ToggleSnapping
│   │   │   │   ├── UpdateUpstreamTransforms
│   │   │   │   │   ├── upstream_footprints: HashMap<NodeId, Footprint>
│   │   │   │   │   ├── local_transforms: HashMap<NodeId, DAffine2>
│   │   │   │   │   └── first_element_source_id: HashMap<NodeId, Option<NodeId>>
│   │   │   │   ├── UpdateClickTargets
│   │   │   │   │   └── click_targets: HashMap<NodeId, Vec<ClickTarget>>
│   │   │   │   ├── UpdateClipTargets
│   │   │   │   │   └── clip_targets: HashSet<NodeId>
│   │   │   │   ├── Undo
│   │   │   │   ├── UngroupSelectedLayers
│   │   │   │   ├── UngroupLayer
│   │   │   │   │   └── layer: LayerNodeIdentifier
│   │   │   │   ├── PTZUpdate
│   │   │   │   ├── SelectionStepBack
│   │   │   │   ├── SelectionStepForward
│   │   │   │   ├── WrapContentInArtboard
│   │   │   │   │   └── place_artboard_at_origin: bool
│   │   │   │   ├── ZoomCanvasTo100Percent
│   │   │   │   ├── ZoomCanvasTo200Percent
│   │   │   │   └── ZoomCanvasToFitAll
│   │   │   ├── DocumentMessageHandler `editor\src\messages\portfolio\document\document_message_handler.rs`
│   │   │   │   ├── navigation_handler: NavigationMessageHandler
│   │   │   │   ├── node_graph_handler: NodeGraphMessageHandler
│   │   │   │   ├── overlays_message_handler: OverlaysMessageHandler
│   │   │   │   ├── properties_panel_message_handler: PropertiesPanelMessageHandler
│   │   │   │   ├── data_panel_message_handler: DataPanelMessageHandler
│   │   │   │   ├── network_interface: NodeNetworkInterface
│   │   │   │   ├── collapsed: CollapsedLayers
│   │   │   │   ├── commit_hash: String
│   │   │   │   ├── document_ptz: PTZ
│   │   │   │   ├── document_mode: DocumentMode
│   │   │   │   ├── view_mode: ViewMode
│   │   │   │   ├── overlays_visibility_settings: OverlaysVisibilitySettings
│   │   │   │   ├── rulers_visible: bool
│   │   │   │   ├── snapping_state: SnappingState
│   │   │   │   ├── graph_view_overlay_open: bool
│   │   │   │   ├── graph_fade_artwork_percentage: f64
│   │   │   │   ├── name: String
│   │   │   │   ├── path: Option<PathBuf>
│   │   │   │   ├── breadcrumb_network_path: Vec<NodeId>
│   │   │   │   ├── selection_network_path: Vec<NodeId>
│   │   │   │   ├── document_undo_history: VecDeque<NodeNetworkInterface>
│   │   │   │   ├── document_redo_history: VecDeque<NodeNetworkInterface>
│   │   │   │   ├── saved_hash: Option<u64>
│   │   │   │   ├── auto_saved_hash: Option<u64>
│   │   │   │   ├── layer_range_selection_reference: Option<LayerNodeIdentifier>
│   │   │   │   └── is_loaded: bool
│   │   │   └── DocumentMessageContext `editor\src\messages\portfolio\document\document_message_handler.rs`
│   │   │       ├── document_id: DocumentId
│   │   │       ├── ipp: &'a InputPreprocessorMessageHandler
│   │   │       ├── persistent_data: &'a PersistentData
│   │   │       ├── executor: &'a mut NodeGraphExecutor
│   │   │       ├── current_tool: &'a ToolType
│   │   │       ├── preferences: &'a PreferencesMessageHandler
│   │   │       ├── device_pixel_ratio: f64
│   │   │       ├── data_panel_open: bool
│   │   │       ├── layers_panel_open: bool
│   │   │       └── properties_panel_open: bool
│   │   ├── Init
│   │   ├── DocumentPassMessage
│   │   │   ├── document_id: DocumentId
│   │   │   └── message: DocumentMessage
│   │   ├── AutoSaveActiveDocument
│   │   ├── AutoSaveAllDocuments
│   │   ├── AutoSaveDocument
│   │   │   └── document_id: DocumentId
│   │   ├── CloseActiveDocumentWithConfirmation
│   │   ├── CloseAllDocuments
│   │   ├── CloseAllDocumentsWithConfirmation
│   │   ├── CloseDocument
│   │   │   └── document_id: DocumentId
│   │   ├── CloseDocumentWithConfirmation
│   │   │   └── document_id: DocumentId
│   │   ├── Copy
│   │   │   └── clipboard: Clipboard
│   │   ├── Cut
│   │   │   └── clipboard: Clipboard
│   │   ├── DeleteDocument
│   │   │   └── document_id: DocumentId
│   │   ├── DestroyAllDocuments
│   │   ├── EditorPreferences
│   │   ├── FontLoaded
│   │   │   ├── font_family: String
│   │   │   ├── font_style: String
│   │   │   ├── preview_url: String
│   │   │   └── data: Vec<u8>
│   │   ├── Import
│   │   ├── LoadDocumentResources
│   │   │   └── document_id: DocumentId
│   │   ├── LoadFont
│   │   │   └── font: Font
│   │   ├── NewDocumentWithName
│   │   │   └── name: String
│   │   ├── NextDocument
│   │   ├── OpenDocument
│   │   ├── OpenDocumentFile
│   │   │   ├── document_name: Option<String>
│   │   │   ├── document_path: Option<PathBuf>
│   │   │   └── document_serialized_content: String
│   │   ├── OpenDocumentFileWithId
│   │   │   ├── document_id: DocumentId
│   │   │   ├── document_name: Option<String>
│   │   │   ├── document_path: Option<PathBuf>
│   │   │   ├── document_is_auto_saved: bool
│   │   │   ├── document_is_saved: bool
│   │   │   ├── document_serialized_content: String
│   │   │   └── to_front: bool
│   │   ├── ToggleResetNodesToDefinitionsOnOpen
│   │   ├── PasteIntoFolder
│   │   │   ├── clipboard: Clipboard
│   │   │   ├── parent: LayerNodeIdentifier
│   │   │   └── insert_index: usize
│   │   ├── PasteSerializedData
│   │   │   └── data: String
│   │   ├── PasteSerializedVector
│   │   │   └── data: String
│   │   ├── CenterPastedLayers
│   │   │   └── layers: Vec<LayerNodeIdentifier>
│   │   ├── PasteImage
│   │   │   ├── name: Option<String>
│   │   │   ├── image: Image<Color>
│   │   │   ├── mouse: Option<(f64, f64)>
│   │   │   └── parent_and_insert_index: Option<(LayerNodeIdentifier, usize)>
│   │   ├── PasteSvg
│   │   │   ├── name: Option<String>
│   │   │   ├── svg: String
│   │   │   ├── mouse: Option<(f64, f64)>
│   │   │   └── parent_and_insert_index: Option<(LayerNodeIdentifier, usize)>
│   │   ├── PrevDocument
│   │   ├── SetActivePanel
│   │   │   └── panel: PanelType
│   │   ├── SetDevicePixelRatio
│   │   │   └── ratio: f64
│   │   ├── SelectDocument
│   │   │   └── document_id: DocumentId
│   │   ├── SubmitDocumentExport
│   │   │   ├── name: String
│   │   │   ├── file_type: FileType
│   │   │   ├── scale_factor: f64
│   │   │   ├── bounds: ExportBounds
│   │   │   └── transparent_background: bool
│   │   ├── SubmitActiveGraphRender
│   │   ├── SubmitGraphRender
│   │   │   ├── document_id: DocumentId
│   │   │   └── ignore_hash: bool
│   │   ├── ToggleDataPanelOpen
│   │   ├── TogglePropertiesPanelOpen
│   │   ├── ToggleLayersPanelOpen
│   │   ├── ToggleRulers
│   │   ├── UpdateDocumentWidgets
│   │   ├── UpdateOpenDocumentsList
│   │   └── UpdateVelloPreference
│   ├── PortfolioMessageHandler `editor\src\messages\portfolio\portfolio_message_handler.rs`
│   │   ├── menu_bar_message_handler: MenuBarMessageHandler
│   │   ├── documents: HashMap<DocumentId, DocumentMessageHandler>
│   │   ├── document_ids: VecDeque<DocumentId>
│   │   ├── active_panel: PanelType
│   │   ├── active_document_id: Option<DocumentId>
│   │   ├── copy_buffer: [Vec<CopyBufferEntry>; INTERNAL_CLIPBOARD_COUNT as usize]
│   │   ├── persistent_data: PersistentData
│   │   ├── executor: NodeGraphExecutor
│   │   ├── selection_mode: SelectionMode
│   │   ├── device_pixel_ratio: Option<f64>
│   │   ├── reset_node_definitions_on_open: bool
│   │   ├── data_panel_open: bool
│   │   ├── layers_panel_open: bool
│   │   └── properties_panel_open: bool
│   └── PortfolioMessageContext `editor\src\messages\portfolio\portfolio_message_handler.rs`
│       ├── ipp: &'a InputPreprocessorMessageHandler
│       ├── preferences: &'a PreferencesMessageHandler
│       ├── animation: &'a AnimationMessageHandler
│       ├── current_tool: &'a ToolType
│       ├── message_logging_verbosity: MessageLoggingVerbosity
│       ├── reset_node_definitions_on_open: bool
│       └── timing_information: TimingInformation
├── Preferences
│   ├── PreferencesMessage `editor\src\messages\preferences\preferences_message.rs`
│   │   ├── Load
│   │   │   └── preferences: String
│   │   ├── ResetToDefaults
│   │   ├── UseVello
│   │   │   └── use_vello: bool
│   │   ├── SelectionMode
│   │   │   └── selection_mode: SelectionMode
│   │   ├── VectorMeshes
│   │   │   └── enabled: bool
│   │   ├── ModifyLayout
│   │   │   └── zoom_with_scroll: bool
│   │   ├── GraphWireStyle
│   │   │   └── style: GraphWireStyle
│   │   └── ViewportZoomWheelRate
│   │       └── rate: f64
│   └── PreferencesMessageHandler `editor\src\messages\preferences\preferences_message_handler.rs`
│       ├── selection_mode: SelectionMode
│       ├── zoom_with_scroll: bool
│       ├── use_vello: bool
│       ├── vector_meshes: bool
│       ├── graph_wire_style: GraphWireStyle
│       └── viewport_zoom_wheel_rate: f64
├── Tool
│   ├── ToolMessage `editor\src\messages\tool\tool_message.rs`
│   │   ├── TransformLayer
│   │   │   ├── TransformLayerMessage `editor\src\messages\tool\transform_layer\transform_layer_message.rs`
│   │   │   │   ├── Overlays
│   │   │   │   │   └── context: OverlayContext
│   │   │   │   ├── ApplyTransformOperation
│   │   │   │   │   └── final_transform: bool
│   │   │   │   ├── BeginTransformOperation
│   │   │   │   │   └── operation: TransformType
│   │   │   │   ├── BeginGrab
│   │   │   │   ├── BeginRotate
│   │   │   │   ├── BeginScale
│   │   │   │   ├── BeginGRS
│   │   │   │   │   └── operation: TransformType
│   │   │   │   ├── BeginGrabPen
│   │   │   │   │   ├── last_point: DVec2
│   │   │   │   │   └── handle: DVec2
│   │   │   │   ├── BeginRotatePen
│   │   │   │   │   ├── last_point: DVec2
│   │   │   │   │   └── handle: DVec2
│   │   │   │   ├── BeginScalePen
│   │   │   │   │   ├── last_point: DVec2
│   │   │   │   │   └── handle: DVec2
│   │   │   │   ├── CancelTransformOperation
│   │   │   │   ├── ConstrainX
│   │   │   │   ├── ConstrainY
│   │   │   │   ├── PointerMove
│   │   │   │   │   ├── slow_key: Key
│   │   │   │   │   └── increments_key: Key
│   │   │   │   ├── SelectionChanged
│   │   │   │   ├── TypeBackspace
│   │   │   │   ├── TypeDecimalPoint
│   │   │   │   ├── TypeDigit
│   │   │   │   │   └── digit: u8
│   │   │   │   ├── TypeNegate
│   │   │   │   └── SetPivotGizmo
│   │   │   │       └── pivot_gizmo: PivotGizmo
│   │   │   ├── TransformLayerMessageHandler `editor\src\messages\tool\transform_layer\transform_layer_message_handler.rs`
│   │   │   │   ├── transform_operation: TransformOperation
│   │   │   │   ├── slow: bool
│   │   │   │   ├── increments: bool
│   │   │   │   ├── local: bool
│   │   │   │   ├── layer_bounding_box: Quad
│   │   │   │   ├── typing: Typing
│   │   │   │   ├── mouse_position: ViewportPosition
│   │   │   │   ├── start_mouse: ViewportPosition
│   │   │   │   ├── original_transforms: OriginalTransforms
│   │   │   │   ├── pivot_gizmo: PivotGizmo
│   │   │   │   ├── pivot: ViewportPosition
│   │   │   │   ├── path_bounds: Option<[DVec2; 2]>
│   │   │   │   ├── local_pivot: DocumentPosition
│   │   │   │   ├── local_mouse_start: DocumentPosition
│   │   │   │   ├── grab_target: DocumentPosition
│   │   │   │   ├── ptz: PTZ
│   │   │   │   ├── initial_transform: DAffine2
│   │   │   │   ├── operation_count: usize
│   │   │   │   ├── handle: DVec2
│   │   │   │   ├── last_point: DVec2
│   │   │   │   ├── grs_pen_handle: bool
│   │   │   │   ├── ghost_outline: Vec<(Vec<ClickTargetType>, DAffine2)>
│   │   │   │   └── was_grabbing: bool
│   │   │   └── TransformLayerMessageContext `editor\src\messages\tool\transform_layer\transform_layer_message_handler.rs`
│   │   │       ├── document: &'a DocumentMessageHandler
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       ├── tool_data: &'a ToolData
│   │   │       └── shape_editor: &'a mut ShapeState
│   │   ├── Select
│   │   │   ├── SelectToolMessage `editor\src\messages\tool\tool_messages\select_tool.rs`
│   │   │   │   ├── Abort
│   │   │   │   ├── Overlays
│   │   │   │   │   └── context: OverlayContext
│   │   │   │   ├── DragStart
│   │   │   │   │   ├── extend_selection: Key
│   │   │   │   │   ├── remove_from_selection: Key
│   │   │   │   │   ├── select_deepest: Key
│   │   │   │   │   ├── lasso_select: Key
│   │   │   │   │   └── skew: Key
│   │   │   │   ├── DragStop
│   │   │   │   │   └── remove_from_selection: Key
│   │   │   │   ├── EditLayer
│   │   │   │   ├── EditLayerExec
│   │   │   │   ├── Enter
│   │   │   │   ├── PointerMove
│   │   │   │   │   └── modifier_keys: SelectToolPointerKeys
│   │   │   │   ├── PointerOutsideViewport
│   │   │   │   │   └── modifier_keys: SelectToolPointerKeys
│   │   │   │   ├── SelectOptions
│   │   │   │   │   └── options: SelectOptionsUpdate
│   │   │   │   ├── SetPivot
│   │   │   │   │   └── position: ReferencePoint
│   │   │   │   ├── SyncHistory
│   │   │   │   ├── ShiftSelectedNodes
│   │   │   │   │   └── offset: DVec2
│   │   │   │   └── PivotShift
│   │   │   │       ├── offset: Option<DVec2>
│   │   │   │       └── flush: bool
│   │   │   ├── SelectTool `editor\src\messages\tool\tool_messages\select_tool.rs`
│   │   │   │   ├── fsm_state: SelectToolFsmState
│   │   │   │   └── tool_data: SelectToolData
│   │   │   └── &mut ToolActionMessageContext<'a> `editor\src\messages\tool\utility_types.rs`
│   │   │       ├── document: &'a mut DocumentMessageHandler
│   │   │       ├── document_id: DocumentId
│   │   │       ├── global_tool_data: &'a DocumentToolData
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       ├── font_cache: &'a FontCache
│   │   │       ├── shape_editor: &'a mut ShapeState
│   │   │       ├── node_graph: &'a NodeGraphExecutor
│   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   ├── Artboard
│   │   │   ├── ArtboardToolMessage `editor\src\messages\tool\tool_messages\artboard_tool.rs`
│   │   │   │   ├── Abort
│   │   │   │   ├── Overlays
│   │   │   │   │   └── context: OverlayContext
│   │   │   │   ├── UpdateSelectedArtboard
│   │   │   │   ├── DeleteSelected
│   │   │   │   ├── NudgeSelected
│   │   │   │   │   ├── delta_x: f64
│   │   │   │   │   ├── delta_y: f64
│   │   │   │   │   ├── resize: Key
│   │   │   │   │   └── resize_opposite_corner: Key
│   │   │   │   ├── PointerDown
│   │   │   │   ├── PointerMove
│   │   │   │   │   ├── constrain_axis_or_aspect: Key
│   │   │   │   │   └── center: Key
│   │   │   │   ├── PointerOutsideViewport
│   │   │   │   │   ├── constrain_axis_or_aspect: Key
│   │   │   │   │   └── center: Key
│   │   │   │   └── PointerUp
│   │   │   ├── ArtboardTool `editor\src\messages\tool\tool_messages\artboard_tool.rs`
│   │   │   │   ├── fsm_state: ArtboardToolFsmState
│   │   │   │   └── data: ArtboardToolData
│   │   │   └── &mut ToolActionMessageContext<'a> `editor\src\messages\tool\utility_types.rs`
│   │   │       ├── document: &'a mut DocumentMessageHandler
│   │   │       ├── document_id: DocumentId
│   │   │       ├── global_tool_data: &'a DocumentToolData
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       ├── font_cache: &'a FontCache
│   │   │       ├── shape_editor: &'a mut ShapeState
│   │   │       ├── node_graph: &'a NodeGraphExecutor
│   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   ├── Navigate
│   │   │   ├── NavigateToolMessage `editor\src\messages\tool\tool_messages\navigate_tool.rs`
│   │   │   │   ├── Abort
│   │   │   │   ├── PointerUp
│   │   │   │   │   └── zoom_in: bool
│   │   │   │   ├── PointerMove
│   │   │   │   │   └── snap: Key
│   │   │   │   ├── TiltCanvasBegin
│   │   │   │   ├── ZoomCanvasBegin
│   │   │   │   └── End
│   │   │   ├── NavigateTool `editor\src\messages\tool\tool_messages\navigate_tool.rs`
│   │   │   │   ├── fsm_state: NavigateToolFsmState
│   │   │   │   └── tool_data: NavigateToolData
│   │   │   └── &mut ToolActionMessageContext<'a> `editor\src\messages\tool\utility_types.rs`
│   │   │       ├── document: &'a mut DocumentMessageHandler
│   │   │       ├── document_id: DocumentId
│   │   │       ├── global_tool_data: &'a DocumentToolData
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       ├── font_cache: &'a FontCache
│   │   │       ├── shape_editor: &'a mut ShapeState
│   │   │       ├── node_graph: &'a NodeGraphExecutor
│   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   ├── Eyedropper
│   │   │   ├── EyedropperToolMessage `editor\src\messages\tool\tool_messages\eyedropper_tool.rs`
│   │   │   │   ├── Abort
│   │   │   │   ├── SamplePrimaryColorBegin
│   │   │   │   ├── SamplePrimaryColorEnd
│   │   │   │   ├── PointerMove
│   │   │   │   ├── SampleSecondaryColorBegin
│   │   │   │   └── SampleSecondaryColorEnd
│   │   │   ├── EyedropperTool `editor\src\messages\tool\tool_messages\eyedropper_tool.rs`
│   │   │   │   ├── fsm_state: EyedropperToolFsmState
│   │   │   │   └── data: EyedropperToolData
│   │   │   └── &mut ToolActionMessageContext<'a> `editor\src\messages\tool\utility_types.rs`
│   │   │       ├── document: &'a mut DocumentMessageHandler
│   │   │       ├── document_id: DocumentId
│   │   │       ├── global_tool_data: &'a DocumentToolData
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       ├── font_cache: &'a FontCache
│   │   │       ├── shape_editor: &'a mut ShapeState
│   │   │       ├── node_graph: &'a NodeGraphExecutor
│   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   ├── Fill
│   │   │   ├── FillToolMessage `editor\src\messages\tool\tool_messages\fill_tool.rs`
│   │   │   │   ├── Abort
│   │   │   │   ├── WorkingColorChanged
│   │   │   │   ├── Overlays
│   │   │   │   │   └── context: OverlayContext
│   │   │   │   ├── PointerMove
│   │   │   │   ├── PointerUp
│   │   │   │   ├── FillPrimaryColor
│   │   │   │   └── FillSecondaryColor
│   │   │   ├── FillTool `editor\src\messages\tool\tool_messages\fill_tool.rs`
│   │   │   │   └── fsm_state: FillToolFsmState
│   │   │   └── &mut ToolActionMessageContext<'a> `editor\src\messages\tool\utility_types.rs`
│   │   │       ├── document: &'a mut DocumentMessageHandler
│   │   │       ├── document_id: DocumentId
│   │   │       ├── global_tool_data: &'a DocumentToolData
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       ├── font_cache: &'a FontCache
│   │   │       ├── shape_editor: &'a mut ShapeState
│   │   │       ├── node_graph: &'a NodeGraphExecutor
│   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   ├── Gradient
│   │   │   ├── GradientToolMessage `editor\src\messages\tool\tool_messages\gradient_tool.rs`
│   │   │   │   ├── Abort
│   │   │   │   ├── Overlays
│   │   │   │   │   └── context: OverlayContext
│   │   │   │   ├── DeleteStop
│   │   │   │   ├── InsertStop
│   │   │   │   ├── PointerDown
│   │   │   │   ├── PointerMove
│   │   │   │   │   └── constrain_axis: Key
│   │   │   │   ├── PointerOutsideViewport
│   │   │   │   │   └── constrain_axis: Key
│   │   │   │   ├── PointerUp
│   │   │   │   └── UpdateOptions
│   │   │   │       └── options: GradientOptionsUpdate
│   │   │   ├── GradientTool `editor\src\messages\tool\tool_messages\gradient_tool.rs`
│   │   │   │   ├── fsm_state: GradientToolFsmState
│   │   │   │   ├── data: GradientToolData
│   │   │   │   └── options: GradientOptions
│   │   │   └── &mut ToolActionMessageContext<'a> `editor\src\messages\tool\utility_types.rs`
│   │   │       ├── document: &'a mut DocumentMessageHandler
│   │   │       ├── document_id: DocumentId
│   │   │       ├── global_tool_data: &'a DocumentToolData
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       ├── font_cache: &'a FontCache
│   │   │       ├── shape_editor: &'a mut ShapeState
│   │   │       ├── node_graph: &'a NodeGraphExecutor
│   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   ├── Path
│   │   │   ├── PathToolMessage `editor\src\messages\tool\tool_messages\path_tool.rs`
│   │   │   │   ├── Abort
│   │   │   │   ├── SelectionChanged
│   │   │   │   ├── Overlays
│   │   │   │   │   └── context: OverlayContext
│   │   │   │   ├── BreakPath
│   │   │   │   ├── DeselectAllPoints
│   │   │   │   ├── Delete
│   │   │   │   ├── DeleteAndBreakPath
│   │   │   │   ├── DragStop
│   │   │   │   │   ├── extend_selection: Key
│   │   │   │   │   └── shrink_selection: Key
│   │   │   │   ├── Enter
│   │   │   │   │   ├── extend_selection: Key
│   │   │   │   │   └── shrink_selection: Key
│   │   │   │   ├── Escape
│   │   │   │   ├── ClosePath
│   │   │   │   ├── DoubleClick
│   │   │   │   │   ├── extend_selection: Key
│   │   │   │   │   └── shrink_selection: Key
│   │   │   │   ├── GRS
│   │   │   │   │   └── key: Key
│   │   │   │   ├── ManipulatorMakeHandlesFree
│   │   │   │   ├── ManipulatorMakeHandlesColinear
│   │   │   │   ├── MouseDown
│   │   │   │   │   ├── extend_selection: Key
│   │   │   │   │   ├── lasso_select: Key
│   │   │   │   │   ├── handle_drag_from_anchor: Key
│   │   │   │   │   ├── drag_restore_handle: Key
│   │   │   │   │   └── segment_editing_modifier: Key
│   │   │   │   ├── NudgeSelectedPoints
│   │   │   │   │   ├── delta_x: f64
│   │   │   │   │   └── delta_y: f64
│   │   │   │   ├── PointerMove
│   │   │   │   │   ├── equidistant: Key
│   │   │   │   │   ├── toggle_colinear: Key
│   │   │   │   │   ├── move_anchor_with_handles: Key
│   │   │   │   │   ├── snap_angle: Key
│   │   │   │   │   ├── lock_angle: Key
│   │   │   │   │   ├── delete_segment: Key
│   │   │   │   │   ├── break_colinear_molding: Key
│   │   │   │   │   └── segment_editing_modifier: Key
│   │   │   │   ├── PointerOutsideViewport
│   │   │   │   │   ├── equidistant: Key
│   │   │   │   │   ├── toggle_colinear: Key
│   │   │   │   │   ├── move_anchor_with_handles: Key
│   │   │   │   │   ├── snap_angle: Key
│   │   │   │   │   ├── lock_angle: Key
│   │   │   │   │   ├── delete_segment: Key
│   │   │   │   │   ├── break_colinear_molding: Key
│   │   │   │   │   └── segment_editing_modifier: Key
│   │   │   │   ├── RightClick
│   │   │   │   ├── SelectAllAnchors
│   │   │   │   ├── SelectedPointUpdated
│   │   │   │   ├── SelectedPointXChanged
│   │   │   │   │   └── new_x: f64
│   │   │   │   ├── SelectedPointYChanged
│   │   │   │   │   └── new_y: f64
│   │   │   │   ├── SetPivot
│   │   │   │   │   └── position: ReferencePoint
│   │   │   │   ├── SwapSelectedHandles
│   │   │   │   ├── UpdateOptions
│   │   │   │   │   └── options: PathOptionsUpdate
│   │   │   │   ├── UpdateSelectedPointsStatus
│   │   │   │   │   └── overlay_context: OverlayContext
│   │   │   │   ├── StartSlidingPoint
│   │   │   │   ├── Copy
│   │   │   │   │   └── clipboard: Clipboard
│   │   │   │   ├── Cut
│   │   │   │   │   └── clipboard: Clipboard
│   │   │   │   ├── Paste
│   │   │   │   │   └── data: String
│   │   │   │   ├── DeleteSelected
│   │   │   │   ├── Duplicate
│   │   │   │   ├── TogglePointEditing
│   │   │   │   └── ToggleSegmentEditing
│   │   │   ├── PathTool `editor\src\messages\tool\tool_messages\path_tool.rs`
│   │   │   │   ├── fsm_state: PathToolFsmState
│   │   │   │   ├── tool_data: PathToolData
│   │   │   │   └── options: PathToolOptions
│   │   │   └── &mut ToolActionMessageContext<'a> `editor\src\messages\tool\utility_types.rs`
│   │   │       ├── document: &'a mut DocumentMessageHandler
│   │   │       ├── document_id: DocumentId
│   │   │       ├── global_tool_data: &'a DocumentToolData
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       ├── font_cache: &'a FontCache
│   │   │       ├── shape_editor: &'a mut ShapeState
│   │   │       ├── node_graph: &'a NodeGraphExecutor
│   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   ├── Pen
│   │   │   ├── PenToolMessage `editor\src\messages\tool\tool_messages\pen_tool.rs`
│   │   │   │   ├── Abort
│   │   │   │   ├── SelectionChanged
│   │   │   │   ├── WorkingColorChanged
│   │   │   │   ├── Overlays
│   │   │   │   │   └── context: OverlayContext
│   │   │   │   ├── AddPointLayerPosition
│   │   │   │   │   ├── layer: LayerNodeIdentifier
│   │   │   │   │   └── viewport: DVec2
│   │   │   │   ├── Confirm
│   │   │   │   ├── DragStart
│   │   │   │   │   └── append_to_selected: Key
│   │   │   │   ├── DragStop
│   │   │   │   ├── PointerMove
│   │   │   │   │   ├── snap_angle: Key
│   │   │   │   │   ├── break_handle: Key
│   │   │   │   │   ├── lock_angle: Key
│   │   │   │   │   ├── colinear: Key
│   │   │   │   │   └── move_anchor_with_handles: Key
│   │   │   │   ├── PointerOutsideViewport
│   │   │   │   │   ├── snap_angle: Key
│   │   │   │   │   ├── break_handle: Key
│   │   │   │   │   ├── lock_angle: Key
│   │   │   │   │   ├── colinear: Key
│   │   │   │   │   └── move_anchor_with_handles: Key
│   │   │   │   ├── Redo
│   │   │   │   ├── Undo
│   │   │   │   ├── UpdateOptions
│   │   │   │   │   └── options: PenOptionsUpdate
│   │   │   │   ├── RecalculateLatestPointsPosition
│   │   │   │   ├── RemovePreviousHandle
│   │   │   │   ├── GRS
│   │   │   │   │   ├── grab: Key
│   │   │   │   │   ├── rotate: Key
│   │   │   │   │   └── scale: Key
│   │   │   │   ├── FinalPosition
│   │   │   │   │   └── final_position: DVec2
│   │   │   │   └── SwapHandles
│   │   │   ├── PenTool `editor\src\messages\tool\tool_messages\pen_tool.rs`
│   │   │   │   ├── fsm_state: PenToolFsmState
│   │   │   │   ├── tool_data: PenToolData
│   │   │   │   └── options: PenOptions
│   │   │   └── &mut ToolActionMessageContext<'a> `editor\src\messages\tool\utility_types.rs`
│   │   │       ├── document: &'a mut DocumentMessageHandler
│   │   │       ├── document_id: DocumentId
│   │   │       ├── global_tool_data: &'a DocumentToolData
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       ├── font_cache: &'a FontCache
│   │   │       ├── shape_editor: &'a mut ShapeState
│   │   │       ├── node_graph: &'a NodeGraphExecutor
│   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   ├── Freehand
│   │   │   ├── FreehandToolMessage `editor\src\messages\tool\tool_messages\freehand_tool.rs`
│   │   │   │   ├── Overlays
│   │   │   │   │   └── context: OverlayContext
│   │   │   │   ├── Abort
│   │   │   │   ├── WorkingColorChanged
│   │   │   │   ├── DragStart
│   │   │   │   │   └── append_to_selected: Key
│   │   │   │   ├── DragStop
│   │   │   │   ├── PointerMove
│   │   │   │   └── UpdateOptions
│   │   │   │       └── options: FreehandOptionsUpdate
│   │   │   ├── FreehandTool `editor\src\messages\tool\tool_messages\freehand_tool.rs`
│   │   │   │   ├── fsm_state: FreehandToolFsmState
│   │   │   │   ├── data: FreehandToolData
│   │   │   │   └── options: FreehandOptions
│   │   │   └── &mut ToolActionMessageContext<'a> `editor\src\messages\tool\utility_types.rs`
│   │   │       ├── document: &'a mut DocumentMessageHandler
│   │   │       ├── document_id: DocumentId
│   │   │       ├── global_tool_data: &'a DocumentToolData
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       ├── font_cache: &'a FontCache
│   │   │       ├── shape_editor: &'a mut ShapeState
│   │   │       ├── node_graph: &'a NodeGraphExecutor
│   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   ├── Spline
│   │   │   ├── SplineToolMessage `editor\src\messages\tool\tool_messages\spline_tool.rs`
│   │   │   │   ├── Overlays
│   │   │   │   │   └── context: OverlayContext
│   │   │   │   ├── CanvasTransformed
│   │   │   │   ├── Abort
│   │   │   │   ├── WorkingColorChanged
│   │   │   │   ├── Confirm
│   │   │   │   ├── DragStart
│   │   │   │   │   └── append_to_selected: Key
│   │   │   │   ├── DragStop
│   │   │   │   ├── MergeEndpoints
│   │   │   │   ├── PointerMove
│   │   │   │   ├── PointerOutsideViewport
│   │   │   │   ├── Undo
│   │   │   │   └── UpdateOptions
│   │   │   │       └── options: SplineOptionsUpdate
│   │   │   ├── SplineTool `editor\src\messages\tool\tool_messages\spline_tool.rs`
│   │   │   │   ├── fsm_state: SplineToolFsmState
│   │   │   │   ├── tool_data: SplineToolData
│   │   │   │   └── options: SplineOptions
│   │   │   └── &mut ToolActionMessageContext<'a> `editor\src\messages\tool\utility_types.rs`
│   │   │       ├── document: &'a mut DocumentMessageHandler
│   │   │       ├── document_id: DocumentId
│   │   │       ├── global_tool_data: &'a DocumentToolData
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       ├── font_cache: &'a FontCache
│   │   │       ├── shape_editor: &'a mut ShapeState
│   │   │       ├── node_graph: &'a NodeGraphExecutor
│   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   ├── Shape
│   │   │   ├── ShapeToolMessage `editor\src\messages\tool\tool_messages\shape_tool.rs`
│   │   │   │   ├── Overlays
│   │   │   │   │   └── context: OverlayContext
│   │   │   │   ├── Abort
│   │   │   │   ├── WorkingColorChanged
│   │   │   │   ├── DragStart
│   │   │   │   ├── DragStop
│   │   │   │   ├── HideShapeTypeWidget
│   │   │   │   │   └── hide: bool
│   │   │   │   ├── PointerMove
│   │   │   │   │   └── modifier: ShapeToolModifierKey
│   │   │   │   ├── PointerOutsideViewport
│   │   │   │   │   └── modifier: ShapeToolModifierKey
│   │   │   │   ├── UpdateOptions
│   │   │   │   │   └── options: ShapeOptionsUpdate
│   │   │   │   ├── SetShape
│   │   │   │   │   └── shape: ShapeType
│   │   │   │   ├── IncreaseSides
│   │   │   │   ├── DecreaseSides
│   │   │   │   └── NudgeSelectedLayers
│   │   │   │       ├── delta_x: f64
│   │   │   │       ├── delta_y: f64
│   │   │   │       ├── resize: Key
│   │   │   │       └── resize_opposite_corner: Key
│   │   │   ├── ShapeTool `editor\src\messages\tool\tool_messages\shape_tool.rs`
│   │   │   │   ├── fsm_state: ShapeToolFsmState
│   │   │   │   ├── tool_data: ShapeToolData
│   │   │   │   └── options: ShapeToolOptions
│   │   │   └── &mut ToolActionMessageContext<'a> `editor\src\messages\tool\utility_types.rs`
│   │   │       ├── document: &'a mut DocumentMessageHandler
│   │   │       ├── document_id: DocumentId
│   │   │       ├── global_tool_data: &'a DocumentToolData
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       ├── font_cache: &'a FontCache
│   │   │       ├── shape_editor: &'a mut ShapeState
│   │   │       ├── node_graph: &'a NodeGraphExecutor
│   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   ├── Text
│   │   │   ├── TextToolMessage `editor\src\messages\tool\tool_messages\text_tool.rs`
│   │   │   │   ├── Abort
│   │   │   │   ├── WorkingColorChanged
│   │   │   │   ├── Overlays
│   │   │   │   │   └── context: OverlayContext
│   │   │   │   ├── DragStart
│   │   │   │   ├── DragStop
│   │   │   │   ├── EditSelected
│   │   │   │   ├── Interact
│   │   │   │   ├── PointerMove
│   │   │   │   │   ├── center: Key
│   │   │   │   │   └── lock_ratio: Key
│   │   │   │   ├── PointerOutsideViewport
│   │   │   │   │   ├── center: Key
│   │   │   │   │   └── lock_ratio: Key
│   │   │   │   ├── TextChange
│   │   │   │   │   ├── new_text: String
│   │   │   │   │   └── is_left_or_right_click: bool
│   │   │   │   ├── UpdateBounds
│   │   │   │   │   └── new_text: String
│   │   │   │   └── UpdateOptions
│   │   │   │       └── options: TextOptionsUpdate
│   │   │   ├── TextTool `editor\src\messages\tool\tool_messages\text_tool.rs`
│   │   │   │   ├── fsm_state: TextToolFsmState
│   │   │   │   ├── tool_data: TextToolData
│   │   │   │   └── options: TextOptions
│   │   │   └── &mut ToolActionMessageContext<'a> `editor\src\messages\tool\utility_types.rs`
│   │   │       ├── document: &'a mut DocumentMessageHandler
│   │   │       ├── document_id: DocumentId
│   │   │       ├── global_tool_data: &'a DocumentToolData
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       ├── font_cache: &'a FontCache
│   │   │       ├── shape_editor: &'a mut ShapeState
│   │   │       ├── node_graph: &'a NodeGraphExecutor
│   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   ├── Brush
│   │   │   ├── BrushToolMessage `editor\src\messages\tool\tool_messages\brush_tool.rs`
│   │   │   │   ├── Abort
│   │   │   │   ├── WorkingColorChanged
│   │   │   │   ├── DragStart
│   │   │   │   ├── DragStop
│   │   │   │   ├── PointerMove
│   │   │   │   └── UpdateOptions
│   │   │   │       └── options: BrushToolMessageOptionsUpdate
│   │   │   ├── BrushTool `editor\src\messages\tool\tool_messages\brush_tool.rs`
│   │   │   │   ├── fsm_state: BrushToolFsmState
│   │   │   │   ├── data: BrushToolData
│   │   │   │   └── options: BrushOptions
│   │   │   └── &mut ToolActionMessageContext<'a> `editor\src\messages\tool\utility_types.rs`
│   │   │       ├── document: &'a mut DocumentMessageHandler
│   │   │       ├── document_id: DocumentId
│   │   │       ├── global_tool_data: &'a DocumentToolData
│   │   │       ├── input: &'a InputPreprocessorMessageHandler
│   │   │       ├── font_cache: &'a FontCache
│   │   │       ├── shape_editor: &'a mut ShapeState
│   │   │       ├── node_graph: &'a NodeGraphExecutor
│   │   │       └── preferences: &'a PreferencesMessageHandler
│   │   ├── ActivateToolSelect
│   │   ├── ActivateToolArtboard
│   │   ├── ActivateToolNavigate
│   │   ├── ActivateToolEyedropper
│   │   ├── ActivateToolFill
│   │   ├── ActivateToolGradient
│   │   ├── ActivateToolPath
│   │   ├── ActivateToolPen
│   │   ├── ActivateToolFreehand
│   │   ├── ActivateToolSpline
│   │   ├── ActivateToolShapeLine
│   │   ├── ActivateToolShapeRectangle
│   │   ├── ActivateToolShapeEllipse
│   │   ├── ActivateToolShape
│   │   ├── ActivateToolText
│   │   ├── ActivateToolBrush
│   │   ├── ActivateTool
│   │   │   └── tool_type: ToolType
│   │   ├── DeactivateTools
│   │   ├── InitTools
│   │   ├── PreUndo
│   │   ├── Redo
│   │   ├── RefreshToolOptions
│   │   ├── ResetColors
│   │   ├── SelectWorkingColor
│   │   │   ├── color: Color
│   │   │   └── primary: bool
│   │   ├── SelectRandomWorkingColor
│   │   │   └── primary: bool
│   │   ├── ToggleSelectVsPath
│   │   ├── SwapColors
│   │   ├── Undo
│   │   ├── UpdateCursor
│   │   ├── UpdateHints
│   │   └── UpdateSelectionMode
│   │       └── selection_mode: SelectionMode
│   ├── ToolMessageHandler `editor\src\messages\tool\tool_message_handler.rs`
│   │   ├── tool_state: ToolFsmState
│   │   ├── transform_layer_handler: TransformLayerMessageHandler
│   │   ├── shape_editor: ShapeState
│   │   └── tool_is_active: bool
│   └── ToolMessageContext `editor\src\messages\tool\tool_message_handler.rs`
│       ├── document_id: DocumentId
│       ├── document: &'a mut DocumentMessageHandler
│       ├── input: &'a InputPreprocessorMessageHandler
│       ├── persistent_data: &'a PersistentData
│       ├── node_graph: &'a NodeGraphExecutor
│       └── preferences: &'a PreferencesMessageHandler
├── Batched
│   └── messages: Box<[Message]>
└── NoOp
