import { Action } from "redux";
import * as React from "react";
import {
  Directory,
  Point,
  Bounds,
  Struct,
  StructReference,
  TreeNode,
  File,
  KeyValue,
  TreeMoveOffset,
  FSItem,
  FSItemTagNames
} from "tandem-common";
import { publicActionCreator } from "tandem-common";
import {
  ComputedDisplayInfo,
  SyntheticNativeNodeMap,
  SyntheticVisibleNode,
  PCNodeClip,
  PCVariantTrigger,
  PCVariable,
  Frame,
  PCComponent,
  PCVariant,
  PCVariantTriggerSource,
  PCVariableType,
  PCMediaQuery,
  PCQueryType,
  PCMediaQueryCondition,
  PCQuery,
  PCVariableQueryCondition
} from "paperclip";
import { RegisteredComponent } from "..";
import {
  FrameMode,
  ToolType,
  EditorWindow,
  ProjectConfig,
  ProjectInfo,
  BaseQuickSearchResult,
  QuickSearchResult,
  ScriptProcess,
  ScriptProcessLog,
  Unloader
} from "../state";
import { InspectorNode } from "paperclip";
import { ProjectTemplate } from "tandem-starter-kits";

export const PROJECT_LOADED = "PROJECT_LOADED";
export const ACTIVE_FILE_CHANGED = "ACTIVE_FILE_CHANGED";
export const SYNTHETIC_WINDOW_OPENED = "SYNTHETIC_WINDOW_OPENED";
export const PROJECT_DIRECTORY_LOADED = "PROJECT_DIRECTORY_LOADED";
export const DOCUMENT_RENDERED = "DOCUMENT_RENDERERED";

export const CANVAS_TOOL_OVERLAY_MOUSE_LEAVE =
  "CANVAS_TOOL_OVERLAY_MOUSE_LEAVE";
export const CANVAS_TOOL_OVERLAY_MOUSE_PAN_START =
  "CANVAS_TOOL_OVERLAY_MOUSE_PAN_START";
export const CANVAS_TOOL_OVERLAY_MOUSE_PANNING =
  "CANVAS_TOOL_OVERLAY_MOUSE_PANNING";
export const CANVAS_TOOL_OVERLAY_MOUSE_PAN_END =
  "CANVAS_TOOL_OVERLAY_MOUSE_PAN_END";
export const CANVAS_TOOL_OVERLAY_MOUSE_DOUBLE_CLICKED =
  "CANVAS_TOOL_OVERLAY_MOUSE_DOUBLE_CLICKED";
export const CANVAS_TOOL_WINDOW_BACKGROUND_CLICKED =
  "CANVAS_TOOL_WINDOW_BACKGROUND_CLICKED";
export const CANVAS_TOOL_WINDOW_KEY_DOWN = "CANVAS_TOOL_WINDOW_KEY_DOWN";
export const CANVAS_TOOL_ARTBOARD_TITLE_CLICKED =
  "CANVAS_TOOL_ARTBOARD_TITLE_CLICKED";
export const CANVAS_TOOL_PREVIEW_BUTTON_CLICKED =
  "CANVAS_TOOL_PREVIEW_BUTTON_CLICKED";
export const FILE_NAVIGATOR_ITEM_CLICKED = "FILE_NAVIGATOR_ITEM_CLICKED";
export const FILE_NAVIGATOR_ITEM_DOUBLE_CLICKED =
  "FILE_NAVIGATOR_ITEM_DOUBLE_CLICKED";
export const FILE_NAVIGATOR_ITEM_BLURRED = "FILE_NAVIGATOR_ITEM_BLURRED";
export const FILE_NAVIGATOR_NEW_FILE_CLICKED =
  "FILE_NAVIGATOR_NEW_FILE_CLICKED";
export const FILE_NAVIGATOR_NEW_DIRECTORY_CLICKED =
  "FILE_NAVIGATOR_NEW_DIRECTORY_CLICKED";
export const FILE_NAVIGATOR_TOGGLE_DIRECTORY_CLICKED =
  "FILE_NAVIGATOR_TOGGLE_DIRECTORY_CLICKED";
export const FILE_NAVIGATOR_BASENAME_CHANGED =
  "FILE_NAVIGATOR_BASENAME_CHANGED";
export const FILE_NAVIGATOR_NEW_FILE_ENTERED =
  "FILE_NAVIGATOR_NEW_FILE_ENTERED";
export const FILE_NAVIGATOR_DROPPED_ITEM = "FILE_NAVIGATOR_DROPPED_ITEM";
export const TOOLBAR_TOOL_CLICKED = "TOOLBAR_TOOL_CLICKED";
export const EDITOR_TAB_CLICKED = "EDITOR_TAB_CLICKED";
export const EDITOR_TAB_RIGHT_CLICKED = "EDITOR_TAB_RIGHT_CLICKED";
export const EDITOR_TAB_CLOSE_BUTTON_CLICKED =
  "EDITOR_TAB_CLOSE_BUTTON_CLICKED";
export const EDITOR_TAB_CONTEXT_MENU_OPEN_IN_BOTTOM_OPTION_CLICKED =
  "EDITOR_TAB_CONTEXT_MENU_OPEN_IN_BOTTOM_OPTION_CLICKED";
export const MODULE_CONTEXT_MENU_CLOSE_OPTION_CLICKED =
  "MODULE_CONTEXT_MENU_CLOSE_OPTION_CLICKED";
export const OPEN_FILE_ITEM_CLICKED = "OPEN_FILE_ITEM_CLICKED";
export const OPEN_FILE_ITEM_CLOSE_CLICKED = "OPEN_FILE_ITEM_CLOSE_CLICKED";
export const CANVAS_MOUNTED = "CANVAS_MOUNTED";
export const CANVAS_MOUSE_MOVED = "CANVAS_MOUSE_MOVED";
export const CANVAS_DRAGGED_OVER = "CANVAS_DRAGGED_OVER";
export const CANVAS_MOUSE_CLICKED = "CANVAS_MOUSE_CLICKED";
export const CANVAS_MOUSE_DOUBLE_CLICKED = "CANVAS_MOUSE_DOUBLE_CLICKED";
export const CANVAS_WHEEL = "CANVAS_WHEEL";
export const CANVAS_MOTION_RESTED = "CANVAS_MOTION_RESTED";
export const CANVAS_DROPPED_ITEM = "CANVAS_DROPPED_ITEM";
export const ADD_VARIANT_BUTTON_CLICKED = "ADD_VARIANT_BUTTON_CLICKED";
export const REMOVE_VARIANT_BUTTON_CLICKED = "REMOVE_VARIANT_BUTTON_CLICKED";
export const VARIANT_DEFAULT_SWITCH_CLICKED = "VARIANT_DEFAULT_SWITCH_CLICKED";
export const VARIANT_LABEL_CHANGED = "VARIANT_LABEL_CHANGED";
export const ADD_STYLE_BUTTON_CLICKED = "ADD_STYLE_BUTTON_CLICKED";
export const NEW_STYLE_VARIANT_CONFIRMED = "NEW_STYLE_VARIANT_CONFIRMED";
export const NEW_STYLE_VARIANT_BUTTON_CLICKED =
  "NEW_STYLE_VARIANT_BUTTON_CLICKED";
export const PROMPT_OK_BUTTON_CLICKED = "PROMPT_OK_BUTTON_CLICKED";
export const PROMPT_CANCEL_BUTTON_CLICKED = "PROMPT_CANCEL_BUTTON_CLICKED";
export const REMOVE_STYLE_BUTTON_CLICKED = "ADD_STYLE_BUTTON_CLICKED";
export const EDIT_VARIANT_NAME_BUTTON_CLICKED =
  "EDIT_VARIANT_NAME_BUTTON_CLICKED";
export const EDIT_VARIANT_NAME_CONFIRMED = "EDIT_VARIANT_NAME_CONFIRMED";
export const STYLE_VARIANT_DROPDOWN_CHANGED = "STYLE_VARIANT_DROPDOWN_CHANGED";
export const ADD_VARIABLE_BUTTON_CLICKED = "ADD_VARIABLE_BUTTON_CLICKED";
export const QUICK_SEARCH_FILTER_CHANGED = "QUICK_SEARCH_FILTER_CHANGED";
export const QUICK_SEARCH_RESULT_LOADED = "QUICK_SEARCH_RESULT_LOADED";
export const VARIABLE_LABEL_CHANGE_COMPLETED =
  "VARIABLE_LABEL_CHANGE_COMPLETED";
export const VARIABLE_VALUE_CHANGED = "VARIABLE_VALUE_CHANGED";
export const VARIABLE_VALUE_CHANGE_COMPLETED =
  "VARIABLE_VALUE_CHANGE_COMPLETED";
export const COMPONENT_INSTANCE_VARIANT_TOGGLED =
  "COMPONENT_INSTANCE_VARIANT_TOGGLED";
export const INSTANCE_VARIANT_RESET_CLICKED = "INSTANCE_VARIANT_RESET_CLICKED";
export const FRAME_MODE_CHANGE_COMPLETE = "FRAME_MODE_CHANGE_COMPLETE";
export const RESIZER_PATH_MOUSE_MOVED = "RESIZER_PATH_MOUSE_MOVED";
export const RESIZER_PATH_MOUSE_STOPPED_MOVING =
  "RESIZER_PATH_MOUSE_STOPPED_MOVING";
export const RESIZER_MOVED = "RESIZER_MOVED";
export const RESIZER_STOPPED_MOVING = "RESIZER_STOPPED_MOVING";
export const COMPONENT_PICKER_BACKGROUND_CLICK =
  "COMPONENT_PICKER_BACKGROUND_CLICK";
export const UNHANDLED_ERROR = "UNHANDLED_ERROR";
export const COMPONENT_PICKER_ITEM_CLICK = "COMPONENT_PICKER_ITEM_CLICK";
export const RESIZER_MOUSE_DOWN = "RESIZER_MOUSE_DOWN";
export const RESIZER_START_DRGG = "RESIZER_START_DRGG";
export const TD_PROJECT_LOADED = "TD_PROJECT_LOADED";
export const CONFIRM_CLOSE_WINDOW = "CONFIRM_CLOSE_WINDOW";
export const PROJECT_INFO_LOADED = "PROJECT_INFO_LOADED";
export const SHORTCUT_ZOOM_IN_KEY_DOWN = "SHORTCUT_ZOOM_IN_KEY_DOWN";
export const SHORTCUT_TOGGLE_PANEL = "SHORTCUT_TOGGLE_PANEL";
export const SHORTCUT_ZOOM_OUT_KEY_DOWN = "SHORTCUT_ZOOM_OUT_KEY_DOWN";
export const SHORTCUT_ESCAPE_KEY_DOWN = "SHORTCUT_ESCAPE_KEY_DOWN";
export const SHORTCUT_SAVE_KEY_DOWN = "SHORTCUT_SAVE_KEY_DOWN";
export const SHORTCUT_QUICK_SEARCH_KEY_DOWN = "SHORTCUT_QUICK_SEARCH_KEY_DOWN";
export const SHORTCUT_DELETE_KEY_DOWN = "SHORTCUT_DELETE_KEY_DOWN";
export const SHORTCUT_UNDO_KEY_DOWN = "SHORTCUT_UNDO_KEY_DOWN";
export const SHORTCUT_REDO_KEY_DOWN = "SHORTCUT_REDO_KEY_DOWN";
export const SHORTCUT_R_KEY_DOWN = "SHORTCUT_R_KEY_DOWN";
export const SHORTCUT_C_KEY_DOWN = "SHORTCUT_C_KEY_DOWN";
export const SHORTCUT_T_KEY_DOWN = "SHORTCUT_T_KEY_DOWN";
export const SHORTCUT_SELECT_NEXT_TAB = "SHORTCUT_SELECT_NEXT_TAB";
export const SHORTCUT_SELECT_PREVIOUS_TAB = "SHORTCUT_SELECT_PREVIOUS_TAB";
export const SHORTCUT_CLOSE_CURRENT_TAB = "SHORTCUT_CLOSE_CURRENT_TAB";
export const OPEN_TEXT_EDITOR_BUTTON_CLICKED =
  "OPEN_TEXT_EDITOR_BUTTON_CLICKED";
export const SHORTCUT_CONVERT_TO_COMPONENT_KEY_DOWN =
  "SHORTCUT_CONVERT_TO_COMPONENT_KEY_DOWN";
export const SHORTCUT_WRAP_IN_SLOT_KEY_DOWN = "SHORTCUT_WRAP_IN_SLOT_KEY_DOWN";
export const SHORTCUT_TOGGLE_SIDEBAR = "SHORTCUT_TOGGLE_SIDEBAR";
export const INHERIT_PANE_ADD_BUTTON_CLICK = "INHERIT_PANE_ADD_BUTTON_CLICK";
export const FILE_ITEM_CONTEXT_MENU_DELETE_CLICKED =
  "FILE_ITEM_CONTEXT_MENU_DELETE_CLICKED";
export const FILE_ITEM_CONTEXT_MENU_OPEN_CLICKED =
  "FILE_ITEM_CONTEXT_MENU_OPEN_CLICKED";
export const FILE_ITEM_CONTEXT_MENU_OPEN_IN_FINDER_CLICKED =
  "FILE_ITEM_CONTEXT_MENU_OPEN_IN_FINDER_CLICKED";
export const FILE_ITEM_CONTEXT_MENU_COPY_PATH_CLICKED =
  "FILE_ITEM_CONTEXT_MENU_COPY_PATH_CLICKED";
export const FILE_ITEM_CONTEXT_MENU_RENAME_CLICKED =
  "FILE_ITEM_CONTEXT_MENU_RENAME_CLICKED";
export const SYNTHETIC_NODE_CONTEXT_MENU_CONVERT_TO_COMPONENT_CLICKED =
  "SYNTHETIC_NODE_CONTEXT_MENU_CONVERT_TO_COMPONENT_CLICKED";
export const SYNTHETIC_NODE_CONTEXT_MENU_WRAP_IN_ELEMENT_CLICKED =
  "SYNTHETIC_NODE_CONTEXT_MENU_WRAP_IN_ELEMENT_CLICKED";
export const SYNTHETIC_NODE_CONTEXT_MENU_CONVERT_TO_STYLE_MIXIN_CLICKED =
  "SYNTHETIC_NODE_CONTEXT_MENU_CONVERT_TO_STYLE_MIXIN_CLICKED";
export const SYNTHETIC_NODE_CONTEXT_MENU_CONVERT_TEXT_STYLES_TO_MIXIN_CLICKED =
  "SYNTHETIC_NODE_CONTEXT_MENU_CONVERT_TEXT_STYLES_TO_MIXIN_CLICKED";
export const SYNTHETIC_NODE_CONTEXT_MENU_REMOVE_CLICKED =
  "SYNTHETIC_NODE_CONTEXT_MENU_REMOVE_CLICKED";
export const SYNTHETIC_NODE_CONTEXT_MENU_RENAME_CLICKED =
  "SYNTHETIC_NODE_CONTEXT_MENU_RENAME_CLICKED";
export const SYNTHETIC_NODE_CONTEXT_MENU_COPY_CLICKED =
  "SYNTHETIC_NODE_CONTEXT_MENU_COPYCLICKED";
export const SYNTHETIC_NODE_CONTEXT_MENU_PASTE_CLICKED =
  "SYNTHETIC_NODE_CONTEXT_MENU_PASTE_CLICKED";
export const SYNTHETIC_NODE_CONTEXT_MENU_WRAP_IN_SLOT_CLICKED =
  "SYNTHETIC_NODE_CONTEXT_MENU_WRAP_IN_SLOT_CLICKED";
export const SYNTHETIC_NODE_CONTEXT_MENU_SELECT_PARENT_CLICKED =
  "SYNTHETIC_NODE_CONTEXT_MENU_SELECT_PARENT_CLICKED";
export const SYNTHETIC_NODE_CONTEXT_MENU_SELECT_SOURCE_NODE_CLICKED =
  "SYNTHETIC_NODE_CONTEXT_MENU_SELECT_SOURCE_NODE_CLICKED";
export const SYNTHETIC_NODE_CONTEXT_MENU_SHOW_IN_CANVAS_CLICKED =
  "SYNTHETIC_NODE_CONTEXT_MENU_SHOW_IN_CANVAS_CLICKED";
export const INHERIT_PANE_REMOVE_BUTTON_CLICK =
  "INHERIT_PANE_REMOVE_BUTTON_CLICK";
export const EXPORT_NAME_CHANGED = "EXPORT_NAME_CHANGED";
export const ACTIVE_EDITOR_URI_DIRS_LOADED = "ACTIVE_EDITOR_URI_DIRS_LOADED";
export const INHERIT_ITEM_COMPONENT_TYPE_CHANGE_COMPLETE =
  "INHERIT_ITEM_COMPONENT_TYPE_CHANGE_COMPLETE";

export const INHERIT_ITEM_CLICK = "INHERIT_ITEM_CLICK";
export const INSERT_TOOL_FINISHED = "INSERT_TOOL_FINISHED";
export const SYNTHETIC_NODES_PASTED = "SYNTHETIC_NODES_PASTED";
export const APP_LOADED = "APP_LOADED";
export const SAVED_FILE = "SAVED_FILE";
export const SAVED_ALL_FILES = "SAVED_ALL_FILES";
export const FRAME_BOUNDS_CHANGED = "FRAME_BOUNDS_CHANGED";
export const FRAME_BOUNDS_CHANGE_COMPLETED = "FRAME_BOUNDS_CHANGE_COMPLETED";
export const NEW_FILE_ENTERED = "NEW_FILE_ENTERED";
export const PROJECT_DIRECTORY_DIR_LOADED = "PROJECT_DIRECTORY_DIR_LOADED";
export const NEW_DIRECTORY_ENTERED = "NEW_DIRECTORY_ENTERED";
export const RAW_CSS_TEXT_CHANGED = "RAW_CSS_TEXT_CHANGED";
export const CSS_PROPERTY_CHANGED = "CSS_PROPERTY_CHANGED";
export const CSS_PROPERTIES_CHANGED = "CSS_PROPERTIES_CHANGED";
export const QUICK_SEARCH_RESULT_ITEM_SPLIT_BUTTON_CLICKED =
  "QUICK_SEARCH_RESULT_ITEM_SPLIT_BUTTON_CLICKED";
export const CSS_PROPERTY_CHANGE_COMPLETED = "CSS_PROPERTY_CHANGE_COMPLETED";
export const CSS_PROPERTIES_CHANGE_COMPLETED =
  "CSS_PROPERTIES_CHANGE_COMPLETED";
export const ATTRIBUTE_CHANGED = "ATTRIBUTE_CHANGED";
export const SLOT_TOGGLE_CLICK = "SLOT_TOGGLE_CLICK";
export const TEXT_VALUE_CHANGED = "TEXT_VALUE_CHANGED";
export const ELEMENT_TYPE_CHANGED = "ELEMENT_TYPE_CHANGED";
export const FILE_ITEM_RIGHT_CLICKED = "FILE_ITEM_RIGHT_CLICKED";
export const CANVAS_RIGHT_CLICKED = "CANVAS_RIGHT_CLICKED";
export const PC_LAYER_RIGHT_CLICKED = "PC_LAYER_RIGHT_CLICKED";
export const PC_LAYER_DOUBLE_CLICKED = "PC_LAYER_DOUBLE_CLICKED";
export const SOURCE_INSPECTOR_LAYER_CLICKED = "SOURCE_INSPECTOR_LAYER_CLICKED";
export const SOURCE_INSPECTOR_LAYER_ARROW_CLICKED =
  "SOURCE_INSPECTOR_LAYER_ARROW_CLICKED";
export const SOURCE_INSPECTOR_LAYER_LABEL_CHANGED =
  "SOURCE_INSPECTOR_LAYER_LABEL_CHANGED";
export const SOURCE_INSPECTOR_LAYER_DROPPED = "SOURCE_INSPECTOR_LAYER_DROPPED";
export const NEW_FILE_ADDED = "NEW_FILE_ADDED";
export const QUICK_SEARCH_ITEM_CLICKED = "QUICK_SEARCH_ITEM_CLICKED";
export const QUICK_SEARCH_INPUT_ENTERED = "QUICK_SEARCH_INPUT_ENTERED";
export const QUICK_SEARCH_BACKGROUND_CLICK = "QUICK_SEARCH_BACKGROUND_CLICK";
export const NEW_VARIANT_NAME_ENTERED = "NEW_VARIANT_NAME_ENTERED";
export const COMPONENT_VARIANT_REMOVED = "COMPONENT_VARIANT_REMOVED";
export const COMPONENT_VARIANT_NAME_CHANGED = "COMPONENT_VARIANT_NAME_CHANGED";
export const COMPONENT_VARIANT_NAME_CLICKED = "COMPONENT_VARIANT_NAME_CLICKED";
export const OPEN_PROJECT_BUTTON_CLICKED = "OPEN_PROJECT_BUTTON_CLICKED";
export const CREATE_PROJECT_BUTTON_CLICKED = "CREATE_PROJECT_BUTTON_CLICKED";
export const OPEN_CONTROLLER_BUTTON_CLICKED = "OPEN_CONTROLLER_BUTTON_CLICKED";
export const ADD_COMPONENT_CONTROLLER_BUTTON_CLICKED =
  "ADD_COMPONENT_CONTROLLER_BUTTON_CLICKED";
export const REMOVE_COMPONENT_CONTROLLER_BUTTON_CLICKED =
  "REMOVE_COMPONENT_CONTROLLER_BUTTON_CLICKED";
export const COMPONENT_CONTROLLER_PICKED = "COMPONENT_CONTROLLER_PICKED";
export const COMPONENT_VARIANT_NAME_DEFAULT_TOGGLE_CLICK =
  "COMPONENT_VARIANT_NAME_DEFAULT_TOGGLE_CLICK";
export const ELEMENT_VARIANT_TOGGLED = "ELEMENT_VARIANT_TOGGLED";

export const CONFIRM_SAVE_CHANGES = "CONFIRM_SAVE_CHANGES";
export const CHROME_HEADER_MOUSE_DOWN = "CHROME_HEADER_MOUSE_DOWN";
export const CHROME_CLOSE_BUTTON_CLICKED = "CHROME_CLOSE_BUTTON_CLICKED";
export const CHROME_MINIMIZE_BUTTON_CLICKED = "CHROME_MINIMIZE_BUTTON_CLICKED";
export const CHROME_MAXIMIZE_BUTTON_CLICKED = "CHROME_MAXIMIZE_BUTTON_CLICKED";
export const CSS_RESET_PROPERTY_OPTION_CLICKED =
  "CSS_RESET_PROPERTY_OPTION_CLICKED";
export const IMAGE_BROWSE_BUTTON_CLICKED = "IMAGE_BROWSE_BUTTON_CLICKED";
export const BROWSE_DIRECTORY_CLICKED = "BROWSE_DIRECTORY_CLICKED";
export const IMAGE_SOURCE_INPUT_CHANGED = "IMAGE_SOURCE_INPUT_CHANGED";
export const IMAGE_PATH_PICKED = "IMAGE_PATH_PICKED";
export const DIRECTORY_PATH_PICKED = "DIRECTORY_PATH_PICKED";
export const CSS_INHERITED_FROM_LABEL_CLICKED =
  "CSS_INHERITED_FROM_LABEL_CLICKED";

export const CANVAS_TEXT_EDIT_CHANGE_COMPLETE =
  "CANVAS_TEXT_EDIT_CHANGE_COMPLETE";

export const ADD_VARIANT_TRIGGER_CLICKED = "ADD_VARIANT_TRIGGER_CLICKED";
export const REMOVE_VARIANT_TRIGGER_CLICKED = "REMOVE_VARIANT_TRIGGER_CLICKED";

export const VARIANT_TRIGGER_SOURCE_CHANGED = "VARIANT_TRIGGER_SOURCE_CHANGED";
export const VARIANT_TRIGGER_TARGET_CHANGED = "VARIANT_TRIGGER_TARGET_CHANGED";
export const ADD_QUERY_BUTTON_CLICKED = "ADD_QUERY_BUTTON_CLICKED";
export const REMOVE_MEDIA_QUERY_BUTTON_CLICK =
  "REMOVE_MEDIA_QUERY_BUTTON_CLICK";
export const QUERY_LABEL_CHANGED = "QUERY_LABEL_CHANGED";
export const QUERY_CONDITION_CHANGED = "QUERY_CONDITION_CHANGED";
export const QUERY_TYPE_CHANGED = "QUERY_TYPE_CHANGED";
export const VARIABLE_QUERY_SOURCE_VARIABLE_CHANGE =
  "VARIABLE_QUERY_SOURCE_VARIABLE_CHANGE";
export const BREAD_CRUMB_CLICKED = "BREAD_CRUMB_CLICKED";
export const BUILD_BUTTON_START_CLICKED = "BUILD_BUTTON_START_CLICKED";
export const BUILD_BUTTON_STOP_CLICKED = "BUILD_BUTTON_STOP_CLICKED";
export const BUILD_BUTTON_OPEN_APP_CLICKED = "BUILD_BUTTON_OPEN_APP_CLICKED";
export const BUILD_BUTTON_CONFIGURE_CLICKED = "BUILD_BUTTON_CONFIGURE_CLICKED";
export const CONFIGURE_BUILD_MODAL_X_CLICKED =
  "CONFIGURE_BUILD_MODAL_X_CLICKED";
export const CONFIGURE_BUILD_MODAL_BACKGROUND_CLICKED =
  "CONFIGURE_BUILD_MODAL_BACKGROUND_CLICKED";
export const SCRIPT_PROCESS_STARTED = "SCRIPT_PROCESS_STARTED";
export const SCRIPT_PROCESS_LOGGED = "SCRIPT_PROCESS_LOGGED";
export const SCRIPT_PROCESS_CLOSED = "SCRIPT_PROCESS_CLOSED";
export const BUILD_SCRIPT_STARTED = "BUILD_SCRIPT_STARTED";
export const CLOSE_BOTTOM_GUTTER_BUTTON_CLICKED =
  "CLOSE_BOTTOM_GUTTER_BUTTON_CLICKED";
export const BUILD_SCRIPT_CONFIG_CHANGED = "BUILD_SCRIPT_CONFIG_CHANGED";
export const OPEN_APP_SCRIPT_CONFIG_CHANGED = "OPEN_APP_SCRIPT_CONFIG_CHANGED";
export const UNLOADING = "UNLOADING";
export const UNLOADER_CREATED = "UNLOADER_CREATED";
export const UNLOADER_COMPLETED = "UNLOADER_COMPLETED";
export const RELOAD = "RELOAD";
export const LINK_CICKED = "LINK_CICKED";

export type WrappedEvent<T> = {
  sourceEvent: T;
} & Action;

export type ProjectLoaded = {
  uri: string;
} & Action;

export type DocumentRendered = {
  nativeMap: SyntheticNativeNodeMap;
  documentId: string;
  info: ComputedDisplayInfo;
} & Action;

export type ModuleContextMenuOptionClicked = {
  uri: string;
} & Action;

export type FileNavigatorItemClicked = {
  node: FSItem;
} & Action;

export type FileNavigatorBasenameChanged = {
  item: FSItem;
  basename: string;
} & Action;

export type OpenFilesItemClick = {
  uri: string;
} & WrappedEvent<React.MouseEvent<any>>;

export type ToolbarToolClicked = {
  toolType: ToolType;
} & Action;

export type RawCSSTextChanged = {
  value: string;
} & Action;

export type AddVariableButtonClicked = {
  variableType: PCVariableType;
} & Action;

export type VariablePropertyChanged = {
  variable: PCVariable;
  value: string;
} & Action;

export type CSSPropertyChanged = {
  name: string;
  value: string;
} & Action;

export type CSSPropertiesChanged = {
  properties: KeyValue<string>;
} & Action;

export type AttributeChanged = {
  name: string;
  value: string;
} & Action;

export type ProjectDirectoryLoaded = {
  directory: Directory;
} & Action;

export type ProjectInfoLoaded = {
  info: ProjectInfo;
} & Action;

export type CanvasToolOverlayMousePanStart = {
  documentId: string;
} & Action;

export type CanvasToolOverlayMousePanning = {
  documentId: string;
  deltaY: number;
  velocityY: number;
  center: Point;
} & Action;

export type LinkClicked = {
  url: string;
} & Action;

export type ResetPropertyOptionClicked = {
  property: string;
} & Action;

export type CanvasMouseMoved = {
  editorWindow: EditorWindow;
} & WrappedEvent<any>;

export type NewFileAdded = {
  uri: string;
  fileType: FSItemTagNames;
} & Action;

export type CanvasToolOverlayMousePanEnd = {
  documentId: string;
} & Action;

export type CanvasTextEditChangeComplete = {
  value: string;
} & Action;

export type CanvasToolOverlayClicked = {
  documentId: string;
} & WrappedEvent<React.MouseEvent<any>>;

export type CanvasToolOverlayMouseMoved = {} & WrappedEvent<
  React.MouseEvent<any>
>;

export type VariantTriggerSourceChanged = {
  trigger: PCVariantTrigger;
  value: PCVariantTriggerSource;
} & Action;

export type VariantTriggerTargetChanged = {
  trigger: PCVariantTrigger;
  value: PCVariant;
} & Action;

export type ElementVariantToggled = {
  node: SyntheticVisibleNode;
  newVariants: string[];
} & Action;

export type CanvasWheel = {
  canvasWidth: number;
  canvasHeight: number;
  type: string;
  metaKey: boolean;
  ctrlKey: boolean;
  deltaX: number;
  deltaY: number;
} & Action;

export type TreeLayerMouseOver = {
  node: TreeNode<any>;
} & Action;

export type ProjectDirectoryDirLoaded = {
  items: FSItem[];
} & Action;

export type ImagePathPicked = {
  filePath: string;
} & Action;

export type DirectoryPathPicked = {
  directoryPath: string;
} & Action;

export type StyleVariantDropdownChanged = {
  variant: PCVariant;
  component: PCComponent;
} & Action;

export type TreeLayerLabelChanged = {
  label: string;
  node: TreeNode<any>;
} & Action;

export type TreeLayerDroppedNode = {
  node: TreeNode<any>;
  targetNode: TreeNode<any>;
  offset?: TreeMoveOffset;
} & Action;

export type SourceInspectorLayerDropped = {
  source: InspectorNode;
  target: InspectorNode;
  offset: TreeMoveOffset;
} & Action;

export type QuickSearchResultItemSplitButtonClicked = {
  item: QuickSearchResult;
} & Action;

export type QuickSearchFilterChanged = {
  value: string;
} & Action;

export type QuickSearchResultLoaded = {
  matches: QuickSearchResult[];
} & Action;

export type ScriptConfigChanged = {
  script: string;
} & Action;

export type TreeLayerClick = TreeLayerMouseOver &
  WrappedEvent<React.MouseEvent<any>>;
export type TreeLayerExpandToggleClick = TreeLayerMouseOver;
export type TreeLayerMouseOut = TreeLayerMouseOver;

export type InspectorLayerEvent = {
  node: InspectorNode;
} & WrappedEvent<React.MouseEvent<any>>;

export type InspectorLayerLabelChanged = {
  node: InspectorNode;
  label: string;
} & WrappedEvent<React.KeyboardEvent<any>>;

export type BreadCrumbClicked = {
  node: InspectorNode;
} & Action;

export type CanvasMounted = {
  element: HTMLDivElement;
  fileUri: string;
} & Action;

export type NewFileEntered = {
  basename: string;
} & Action;

export type CanvasToolWindowKeyDown = {
  documentId: string;
} & WrappedEvent<React.KeyboardEvent<any>>;

export type CanvasToolArtboardTitleClicked = {
  frame: Frame;
} & WrappedEvent<React.MouseEvent<any>>;

export type ImageSourceInputChanged = {
  value: string;
} & Action;

export type OpenTextEditorButtonClicked = {
  uri: string;
} & Action;

export type SlotToggleClick = {} & Action;

export type NewVariantNameEntered = {
  value: string;
} & Action;

export type FileItemContextMenuAction = {
  item: FSItem;
} & Action;

export type SyntheticNodeContextMenuAction = {
  item: SyntheticVisibleNode;
} & Action;

export type ComponentVariantNameChanged = {
  oldName: string;
  newName: string;
} & Action;

export type ComponentVariantNameClicked = {
  name: string;
} & Action;

export type CSSInheritedFromLabelClicked = {
  inheritedFromNode: InspectorNode;
} & Action;

export type ComponentControllerPicked = {
  filePath: string;
} & Action;

export type ComponentControllerItemClicked = {
  relativePath: string;
} & Action;

export type AddComponentControllerButtonClicked = {
  defaultPath: string;
} & Action;

export type InstanceVariantToggled = {
  variant: PCVariant;
} & Action;

export type ComponentVariantNameDefaultToggleClick = {
  name: string;
  value: boolean;
} & Action;

export type PromptConfirmed = {
  inputValue: string;
} & Action;

export type PromptCancelButtonClicked = {} & Action;

export type TextValueChanged = {
  value: string;
} & Action;

export type ConfirmCloseWindow = {
  type: string;
  closeWithoutSaving: boolean;
  cancel: boolean;
  save: boolean;
} & Action;

export type ElementTypeChanged = {
  value: string;
} & Action;

export type UnhandledError = {
  error: Error;
} & Action;

export type ResizerPathMoved = {
  originalBounds: Bounds;
  newBounds: Bounds;
  anchor: Point;
} & WrappedEvent<MouseEvent>;

export type ResizerMoved = {
  point: Point;
} & Action;

export type AddQueryButtonClicked = {
  queryType: PCQueryType;
} & Action;

export type ResizerMouseDown = {} & WrappedEvent<React.MouseEvent<any>>;

export type ResizerPathStoppedMoving = {} & ResizerPathMoved;

export type QueryConditionChanged = {
  target: PCQuery;
  condition: Partial<any>;
} & Action;

export type QueryLabelChanged = {
  target: PCQuery;
  label?: string;
} & Action;

export type QueryTypeChanged = {
  target: PCQuery;
  newType: PCQueryType;
} & Action;

export type FrameModeChangeComplete = {
  frame: Frame;
  mode: FrameMode;
} & Action;

export type SelectorDoubleClicked = {
  nodeId: string;
} & WrappedEvent<React.MouseEvent<any>>;

export type ShortcutKeyDown = {};

export type CreateProjectButtonClicked = {
  files: Object;
  directory: string;
} & Action;

export type QuickSearchItemClicked = {
  item: QuickSearchResult;
} & Action;

export type ComponentPickerItemClick = {
  component: PCComponent;
} & Action;

export type RemoveComponentControllerButtonClicked = {
  relativePath: string;
} & Action;

export type SavedFile = {
  uri: string;
} & Action;

export type ScriptProcessStarted = {
  process: ScriptProcess;
} & Action;

export type ScriptProcessLogged = {
  process: ScriptProcess;
  log: ScriptProcessLog;
} & Action;

export type ScriptProcessStopped = {
  process: ScriptProcess;
} & Action;

export type SavedAllFiles = {} & Action;

export type InsertToolFinished = {
  fileUri: string;
  point: Point;
} & Action;

export type SyntheticVisibleNodesPasted = {
  clips: PCNodeClip[];
} & Action;

export type FileNavigatorLabelClicked = {
  fileId: string;
} & Action;

export type FrameBoundsChanged = {
  newBounds: Bounds;
} & Action;

export type FileItemRightClicked = {
  event: React.MouseEvent<any>;
  type: string;
  item: FSItem;
} & Action;

export type CanvasRightClicked = {
  event: React.MouseEvent<any>;
} & Action;

export type PCLayerRightClicked = {
  item: InspectorNode;
  event: React.MouseEvent<any>;
} & Action;

export type FileNavigatorNewFileEntered = {
  directoryId: string;
  basename: string;
  insertType: FSItemTagNames;
} & Action;

export type FileNavigatorDroppedItem = {
  node: FSItem;
  targetNode: FSItem;
  offset: TreeMoveOffset;
} & Action;

export type ExportNameChanged = {
  value: string;
} & Action;

export type VariableQuerySourceVariableChange = {
  query: PCQuery;
  variable: PCVariable;
} & Action;

export type EditorTabClicked = {
  event: React.MouseEvent<any>;
  uri: string;
} & Action;

export type CanvasDroppedItem = {
  editorUri: string;
  item: RegisteredComponent | TreeNode<any>;
  point: Point;
} & Action;

export type BuildScriptStarted = {
  process: ScriptProcess;
} & Action;

export type VariantClicked = {
  variant: PCVariant;
} & Action;

export type AddVariantTriggerClicked = {} & Action;

export type RemoveVariantTriggerClicked = {
  trigger: PCVariantTrigger;
} & Action;

export type VariantDefaultSwitchClicked = {
  variant: PCVariant;
} & Action;

export type VariantLabelChanged = {
  variant: PCVariant;
  newLabel?: string;
} & Action;

export type CanvasDraggingOver = {
  item: any;
  offset: Point;
} & Action;

export type InheritPaneItemClick = {
  componentId: string;
} & Action;

export type InheritPaneRemoveButtonClick = {
  componentId: string;
} & Action;

export type InheritItemComponentTypeChangeComplete = {
  oldComponentId: string;
  newComponentId: string;
} & Action;

export type InheritItemClick = {
  componentId: string;
} & Action;

export type UnloaderAction = {
  unloader: Unloader;
} & Action;

export const quickSearchResultItemSplitButtonClick = (
  item: QuickSearchResult
): QuickSearchResultItemSplitButtonClicked => ({
  item,
  type: QUICK_SEARCH_RESULT_ITEM_SPLIT_BUTTON_CLICKED
});

export const fileNavigatorDroppedItem = (
  node: FSItem,
  targetNode: Directory,
  offset: TreeMoveOffset
): FileNavigatorDroppedItem => ({
  node,
  targetNode,
  offset,
  type: FILE_NAVIGATOR_DROPPED_ITEM
});

export const editorTabClicked = (
  event: React.MouseEvent<any>,
  uri: string
): EditorTabClicked => ({
  uri,
  event,
  type: EDITOR_TAB_CLICKED
});

export const editorTabContextMenuOpenInBottomTabOptionClicked = publicActionCreator(
  (uri: string): ModuleContextMenuOptionClicked => ({
    type: EDITOR_TAB_CONTEXT_MENU_OPEN_IN_BOTTOM_OPTION_CLICKED,
    uri
  })
);

export const moduleContextMenuCloseOptionClicked = publicActionCreator(
  (uri: string): ModuleContextMenuOptionClicked => ({
    type: MODULE_CONTEXT_MENU_CLOSE_OPTION_CLICKED,
    uri
  })
);

export const editorTabRightClicked = (
  event: React.MouseEvent<any>,
  uri: string
): EditorTabClicked => ({
  uri,
  event,
  type: EDITOR_TAB_RIGHT_CLICKED
});

export const fileItemContextMenuDeleteClicked = publicActionCreator(
  (item: FSItem): FileItemContextMenuAction => ({
    item,
    type: FILE_ITEM_CONTEXT_MENU_DELETE_CLICKED
  })
);

export const fileItemContextMenuCopyPathClicked = publicActionCreator(
  (item: FSItem): FileItemContextMenuAction => ({
    item,
    type: FILE_ITEM_CONTEXT_MENU_COPY_PATH_CLICKED
  })
);

export const variableQuerySourceVariableChange = (
  query: PCQuery,
  variable: PCVariable
): VariableQuerySourceVariableChange => ({
  type: VARIABLE_QUERY_SOURCE_VARIABLE_CHANGE,
  query,
  variable
});

export const queryConditionChanged = (
  target: PCQuery,
  condition: Partial<any>
): QueryConditionChanged => ({
  type: QUERY_CONDITION_CHANGED,
  target,
  condition
});

export const queryLabelChanged = (
  target: PCQuery,
  label?: string
): QueryLabelChanged => ({
  type: QUERY_LABEL_CHANGED,
  target,
  label
});

export const breadCrumbClicked = (node: InspectorNode): BreadCrumbClicked => ({
  type: BREAD_CRUMB_CLICKED,
  node
});

export const queryTypeChanged = (
  target: PCQuery,
  newType: PCQueryType
): QueryTypeChanged => ({
  type: QUERY_TYPE_CHANGED,
  target,
  newType
});

export const fileItemContextMenuRenameClicked = publicActionCreator(
  (item: FSItem): FileItemContextMenuAction => ({
    item,
    type: FILE_ITEM_CONTEXT_MENU_RENAME_CLICKED
  })
);

export const linkClicked = (url: string): LinkClicked => ({
  url,
  type: LINK_CICKED
});

export const fileItemContextMenuOpenClicked = publicActionCreator(
  (item: FSItem): FileItemContextMenuAction => ({
    item,
    type: FILE_ITEM_CONTEXT_MENU_OPEN_CLICKED
  })
);

export const buildButtonStartClicked = () => ({
  type: BUILD_BUTTON_START_CLICKED
});

export const buildButtonConfigureClicked = () => ({
  type: BUILD_BUTTON_CONFIGURE_CLICKED
});

export const buildButtonStopClicked = () => ({
  type: BUILD_BUTTON_STOP_CLICKED
});
export const buildButtonOpenAppClicked = () => ({
  type: BUILD_BUTTON_OPEN_APP_CLICKED
});

export const configureBuildModalXClicked = () => ({
  type: CONFIGURE_BUILD_MODAL_X_CLICKED
});

export const buildScriptConfigChanged = (
  script: string
): ScriptConfigChanged => ({
  type: BUILD_SCRIPT_CONFIG_CHANGED,
  script
});

export const openAppScriptConfigChanged = (
  script: string
): ScriptConfigChanged => ({
  type: OPEN_APP_SCRIPT_CONFIG_CHANGED,
  script
});

export const configureBuildModalBackgroundClicked = () => ({
  type: CONFIGURE_BUILD_MODAL_BACKGROUND_CLICKED
});

export const unloading = () => ({
  type: UNLOADING
});

export const unloaderCreated = (unloader: Unloader): UnloaderAction => ({
  unloader,
  type: UNLOADER_CREATED
});

export const unloaderCompleted = (unloader: Unloader): UnloaderAction => ({
  unloader,
  type: UNLOADER_COMPLETED
});

export const addQueryButtonClick = (
  queryType: PCQueryType
): AddQueryButtonClicked => ({
  type: ADD_QUERY_BUTTON_CLICKED,
  queryType
});

export const fileItemContextMenuOpenInFinderClicked = publicActionCreator(
  (item: FSItem): FileItemContextMenuAction => ({
    item,
    type: FILE_ITEM_CONTEXT_MENU_OPEN_IN_FINDER_CLICKED
  })
);

export const syntheticNodeContextMenuWrapInElementClicked = publicActionCreator(
  (item: SyntheticVisibleNode): SyntheticNodeContextMenuAction => ({
    type: SYNTHETIC_NODE_CONTEXT_MENU_WRAP_IN_ELEMENT_CLICKED,
    item
  })
);

export const syntheticNodeContextMenuConvertToComponentClicked = publicActionCreator(
  (item: SyntheticVisibleNode): SyntheticNodeContextMenuAction => ({
    type: SYNTHETIC_NODE_CONTEXT_MENU_CONVERT_TO_COMPONENT_CLICKED,
    item
  })
);

export const imageBrowseButtonClicked = publicActionCreator(
  (): Action => ({
    type: IMAGE_BROWSE_BUTTON_CLICKED
  })
);

export const browseDirectoryClicked = publicActionCreator(
  (): Action => ({
    type: BROWSE_DIRECTORY_CLICKED
  })
);

export const buildScriptStarted = (
  process: ScriptProcess
): BuildScriptStarted => ({
  type: BUILD_SCRIPT_STARTED,
  process
});

export const reload = () => ({
  type: RELOAD
});

export const canvasTextEditChangeComplete = (
  value: string
): CanvasTextEditChangeComplete => ({
  value,
  type: CANVAS_TEXT_EDIT_CHANGE_COMPLETE
});

export const cssInheritedFromLabelClicked = (
  inheritedFromNode: InspectorNode
): CSSInheritedFromLabelClicked => ({
  type: CSS_INHERITED_FROM_LABEL_CLICKED,
  inheritedFromNode
});

export const imageSourceInputChanged = (
  value: string
): ImageSourceInputChanged => ({
  value,
  type: IMAGE_SOURCE_INPUT_CHANGED
});

export const syntheticNodeContextMenuConvertToStyleMixinClicked = publicActionCreator(
  (item: SyntheticVisibleNode): SyntheticNodeContextMenuAction => ({
    type: SYNTHETIC_NODE_CONTEXT_MENU_CONVERT_TO_STYLE_MIXIN_CLICKED,
    item
  })
);

export const syntheticNodeContextMenuConvertTextStylesToMixinClicked = publicActionCreator(
  (item: SyntheticVisibleNode): SyntheticNodeContextMenuAction => ({
    type: SYNTHETIC_NODE_CONTEXT_MENU_CONVERT_TEXT_STYLES_TO_MIXIN_CLICKED,
    item
  })
);

export const syntheticNodeContextMenuRemoveClicked = publicActionCreator(
  (item: SyntheticVisibleNode): SyntheticNodeContextMenuAction => ({
    type: SYNTHETIC_NODE_CONTEXT_MENU_REMOVE_CLICKED,
    item
  })
);

export const syntheticNodeContextMenuRenameClicked = publicActionCreator(
  (item: SyntheticVisibleNode): SyntheticNodeContextMenuAction => ({
    type: SYNTHETIC_NODE_CONTEXT_MENU_RENAME_CLICKED,
    item
  })
);
export const syntheticNodeContextMenuCopyClicked = publicActionCreator(
  (item: SyntheticVisibleNode): SyntheticNodeContextMenuAction => ({
    type: SYNTHETIC_NODE_CONTEXT_MENU_COPY_CLICKED,
    item
  })
);
export const syntheticNodeContextMenuPasteClicked = publicActionCreator(
  (item: SyntheticVisibleNode): SyntheticNodeContextMenuAction => ({
    type: SYNTHETIC_NODE_CONTEXT_MENU_PASTE_CLICKED,
    item
  })
);

export const syntheticNodeContextMenuWrapInSlotClicked = publicActionCreator(
  (item: SyntheticVisibleNode): SyntheticNodeContextMenuAction => ({
    type: SYNTHETIC_NODE_CONTEXT_MENU_WRAP_IN_SLOT_CLICKED,
    item
  })
);

export const syntheticNodeContextMenuSelectParentClicked = publicActionCreator(
  (item: SyntheticVisibleNode): SyntheticNodeContextMenuAction => ({
    type: SYNTHETIC_NODE_CONTEXT_MENU_SELECT_PARENT_CLICKED,
    item
  })
);

export const syntheticNodeContextMenuSelectSourceNodeClicked = publicActionCreator(
  (item: SyntheticVisibleNode): SyntheticNodeContextMenuAction => ({
    type: SYNTHETIC_NODE_CONTEXT_MENU_SELECT_SOURCE_NODE_CLICKED,
    item
  })
);

export const syntheticNodeContextMenuShowInCanvasClicked = publicActionCreator(
  (item: SyntheticVisibleNode): SyntheticNodeContextMenuAction => ({
    type: SYNTHETIC_NODE_CONTEXT_MENU_SHOW_IN_CANVAS_CLICKED,
    item
  })
);

export const cssResetPropertyOptionClicked = (
  property: string
): ResetPropertyOptionClicked => ({
  type: CSS_RESET_PROPERTY_OPTION_CLICKED,
  property
});

export const editorTabCloseButtonClicked = (
  event: React.MouseEvent<any>,
  uri: string
): EditorTabClicked => ({
  uri,
  event,
  type: EDITOR_TAB_CLOSE_BUTTON_CLICKED
});

export const fileNavigatorItemClicked = (
  node: FSItem
): FileNavigatorItemClicked => ({
  node,
  type: FILE_NAVIGATOR_ITEM_CLICKED
});

export const fileNavigatorToggleDirectoryClicked = (
  node: FSItem
): FileNavigatorItemClicked => ({
  node,
  type: FILE_NAVIGATOR_TOGGLE_DIRECTORY_CLICKED
});

export const fileNavigatorBasenameChanged = (
  basename: string,
  item: FSItem
): FileNavigatorBasenameChanged => ({
  item,
  basename,
  type: FILE_NAVIGATOR_BASENAME_CHANGED
});

export const scriptProcessStarted = (
  process: ScriptProcess
): ScriptProcessStarted => ({
  type: SCRIPT_PROCESS_STARTED,
  process
});

export const scriptProcessLog = (
  process: ScriptProcess,
  log: ScriptProcessLog
): ScriptProcessLogged => ({
  type: SCRIPT_PROCESS_LOGGED,
  process,
  log
});

export const scriptProcessStopped = (
  process: ScriptProcess
): ScriptProcessStopped => ({
  type: SCRIPT_PROCESS_CLOSED,
  process
});

export const promptConfirmed = (
  inputValue: string,
  actionType: string
): PromptConfirmed => ({
  inputValue,
  type: actionType
});

export const exportNameChanged = (value: string): ExportNameChanged => ({
  type: EXPORT_NAME_CHANGED,
  value
});

export const promptCancelButtonClicked = (): PromptCancelButtonClicked => ({
  type: PROMPT_CANCEL_BUTTON_CLICKED
});

export const openTextEditorButtonClicked = publicActionCreator(
  (uri: string): OpenTextEditorButtonClicked => ({
    uri,
    type: OPEN_TEXT_EDITOR_BUTTON_CLICKED
  })
);

export const newFileAdded = (
  uri: string,
  fileType: FSItemTagNames
): NewFileAdded => ({
  uri,
  fileType,
  type: NEW_FILE_ADDED
});

export const elementVariantToggled = (
  newVariants: string[],
  node: SyntheticVisibleNode
): ElementVariantToggled => ({
  newVariants,
  node,
  type: ELEMENT_VARIANT_TOGGLED
});

export const closeBottomGutterButtonClicked = (): Action => ({
  type: CLOSE_BOTTOM_GUTTER_BUTTON_CLICKED
});

export const fileNavigatorNewFileClicked = (): Action => ({
  type: FILE_NAVIGATOR_NEW_FILE_CLICKED
});

export const styleVariantDropdownChanged = (
  variant: PCVariant,
  component: PCComponent
): StyleVariantDropdownChanged => ({
  type: STYLE_VARIANT_DROPDOWN_CHANGED,
  component,
  variant
});

export const addVariableButtonClicked = (
  variableType: PCVariableType
): AddVariableButtonClicked => ({
  variableType,
  type: ADD_VARIABLE_BUTTON_CLICKED
});

export const variableLabelChangeCompleted = (
  variable: PCVariable,
  value: string
): VariablePropertyChanged => ({
  variable,
  type: VARIABLE_LABEL_CHANGE_COMPLETED,
  value
});

export const variableValueChanged = (
  variable: PCVariable,
  value: string
): VariablePropertyChanged => ({
  variable,
  type: VARIABLE_VALUE_CHANGED,
  value
});

export const variableValueChangeCompleted = (
  variable: PCVariable,
  value: string
): VariablePropertyChanged => ({
  variable,
  type: VARIABLE_VALUE_CHANGE_COMPLETED,
  value
});

export const newStyleVariantButtonClicked = (): Action => ({
  type: NEW_STYLE_VARIANT_BUTTON_CLICKED
});

export const projectDirectoryDirLoaded = (
  items: FSItem[]
): ProjectDirectoryDirLoaded => ({
  type: PROJECT_DIRECTORY_DIR_LOADED,
  items
});

export const removeStyleButtonClicked = (): Action => ({
  type: REMOVE_STYLE_BUTTON_CLICKED
});

export const editVariantNameButtonClicked = (): Action => ({
  type: EDIT_VARIANT_NAME_BUTTON_CLICKED
});

export const addStyleButtonClicked = (): Action => ({
  type: ADD_STYLE_BUTTON_CLICKED
});

export const fileNavigatorNewDirectoryClicked = (): Action => ({
  type: FILE_NAVIGATOR_NEW_DIRECTORY_CLICKED
});

export const openProjectButtonClicked = publicActionCreator(() => ({
  type: OPEN_PROJECT_BUTTON_CLICKED
}));

export const createProjectButtonClicked = publicActionCreator(
  (directory: string, files: Object): CreateProjectButtonClicked => ({
    directory,
    type: CREATE_PROJECT_BUTTON_CLICKED,
    files
  })
);

export const inheritPaneAddButtonClick = (): Action => ({
  type: INHERIT_PANE_ADD_BUTTON_CLICK
});

export const inheritPaneRemoveButtonClick = (
  componentId: string
): InheritPaneRemoveButtonClick => ({
  componentId,
  type: INHERIT_PANE_REMOVE_BUTTON_CLICK
});
export const projectInfoLoaded = (info: ProjectInfo): ProjectInfoLoaded => ({
  type: PROJECT_INFO_LOADED,
  info
});

export const inheritItemComponentTypeChangeComplete = (
  oldComponentId: string,
  newComponentId: string
): InheritItemComponentTypeChangeComplete => ({
  oldComponentId,
  newComponentId,
  type: INHERIT_ITEM_COMPONENT_TYPE_CHANGE_COMPLETE
});
export const componentPickerBackgroundClick = (): Action => ({
  type: COMPONENT_PICKER_BACKGROUND_CLICK
});

export const addVariantButtonClicked = (): Action => ({
  type: ADD_VARIANT_BUTTON_CLICKED
});

export const addVariantTriggerButtonClicked = (): Action => ({
  type: ADD_VARIANT_TRIGGER_CLICKED
});

export const variantTriggerSourceChanged = (
  trigger: PCVariantTrigger,
  value: PCVariantTriggerSource
): VariantTriggerSourceChanged => ({
  type: VARIANT_TRIGGER_SOURCE_CHANGED,
  value,
  trigger
});

export const variantTriggerTargetChanged = (
  trigger: PCVariantTrigger,
  value: PCVariant
): VariantTriggerTargetChanged => ({
  type: VARIANT_TRIGGER_TARGET_CHANGED,
  value,
  trigger
});

export const removeVariantTriggerButtonClicked = (
  trigger: PCVariantTrigger
): RemoveVariantTriggerClicked => ({
  trigger,
  type: REMOVE_VARIANT_TRIGGER_CLICKED
});

export const fileItemRightClicked = (
  item: FSItem,
  event: React.MouseEvent<any>
): FileItemRightClicked => ({
  type: FILE_ITEM_RIGHT_CLICKED,
  event,
  item
});

export const canvasRightClicked = (
  event: React.MouseEvent<any>
): CanvasRightClicked => ({
  type: CANVAS_RIGHT_CLICKED,
  event
});

export const pcLayerRightClicked = (
  item: InspectorNode,
  event: React.MouseEvent<any>
): PCLayerRightClicked => ({
  item,
  type: PC_LAYER_RIGHT_CLICKED,
  event
});

export const pcLayerDoubleClicked = (
  item: InspectorNode,
  event: React.MouseEvent<any>
): PCLayerRightClicked => ({
  item,
  type: PC_LAYER_DOUBLE_CLICKED,
  event
});

export const unhandledError = (error: Error): UnhandledError => ({
  error,
  type: UNHANDLED_ERROR
});

export const removeVariantButtonClicked = (): Action => ({
  type: REMOVE_VARIANT_BUTTON_CLICKED
});

export const quickSearchFilterChanged = (
  value: string
): QuickSearchFilterChanged => ({
  type: QUICK_SEARCH_FILTER_CHANGED,
  value
});

export const quickSearchFilterResultLoaded = (
  matches: QuickSearchResult[]
): QuickSearchResultLoaded => ({
  matches,
  type: QUICK_SEARCH_RESULT_LOADED
});

export const variantDefaultSwitchClicked = (
  variant: PCVariant
): VariantDefaultSwitchClicked => ({
  variant,
  type: VARIANT_DEFAULT_SWITCH_CLICKED
});

export const instanceVariantToggled = (
  variant: PCVariant
): InstanceVariantToggled => ({
  variant,
  type: COMPONENT_INSTANCE_VARIANT_TOGGLED
});

export const instanceVariantResetClicked = (
  variant: PCVariant
): InstanceVariantToggled => ({
  variant,
  type: INSTANCE_VARIANT_RESET_CLICKED
});

export const variantLabelChanged = (
  variant: PCVariant,
  newLabel: string
): VariantLabelChanged => ({
  variant,
  newLabel,
  type: VARIANT_LABEL_CHANGED
});

export const componentPickerItemClick = (
  component: PCComponent
): ComponentPickerItemClick => ({
  component,
  type: COMPONENT_PICKER_ITEM_CLICK
});

export const quickSearchItemClicked = (
  item: QuickSearchResult
): QuickSearchItemClicked => ({
  item,
  type: QUICK_SEARCH_ITEM_CLICKED
});

export const quickSearchInputEntered = (
  item: QuickSearchResult
): QuickSearchItemClicked => ({
  item,
  type: QUICK_SEARCH_INPUT_ENTERED
});

export const openControllerButtonClicked = (
  relativePath: string
): ComponentControllerItemClicked => ({
  relativePath,
  type: OPEN_CONTROLLER_BUTTON_CLICKED
});

export const addComponentControllerButtonClicked = publicActionCreator(
  (defaultPath: string): AddComponentControllerButtonClicked => ({
    defaultPath,
    type: ADD_COMPONENT_CONTROLLER_BUTTON_CLICKED
  })
);

export const removeComponentControllerButtonClicked = (
  relativePath: string
): RemoveComponentControllerButtonClicked => ({
  relativePath,
  type: REMOVE_COMPONENT_CONTROLLER_BUTTON_CLICKED
});

export const componentControllerPicked = (
  filePath: string
): ComponentControllerPicked => ({
  filePath,
  type: COMPONENT_CONTROLLER_PICKED
});

export const quickSearchBackgroundClick = (): Action => ({
  type: QUICK_SEARCH_BACKGROUND_CLICK
});

export const fileNavigatorNewFileEntered = (
  basename: string,
  insertType: FSItemTagNames,
  directoryId: string
): FileNavigatorNewFileEntered => ({
  basename,
  directoryId,
  insertType,
  type: FILE_NAVIGATOR_NEW_FILE_ENTERED
});

export const openFilesItemClick = (
  uri: string,
  sourceEvent: React.MouseEvent<any>
): OpenFilesItemClick => ({
  uri,
  sourceEvent,
  type: OPEN_FILE_ITEM_CLICKED
});

export const openFilesItemCloseClick = (uri: string): OpenFilesItemClick => ({
  uri,
  sourceEvent: null,
  type: OPEN_FILE_ITEM_CLOSE_CLICKED
});

export const activeEditorUriDirsLoaded = (): Action => ({
  type: ACTIVE_EDITOR_URI_DIRS_LOADED
});

export const frameModeChangeComplete = (
  frame: Frame,
  mode: FrameMode
): FrameModeChangeComplete => ({
  type: FRAME_MODE_CHANGE_COMPLETE,
  frame,
  mode
});

export const toolbarToolClicked = (toolType: ToolType): ToolbarToolClicked => ({
  type: TOOLBAR_TOOL_CLICKED,
  toolType
});

export const fileNavigatorItemDoubleClicked = (
  node: FSItem
): FileNavigatorItemClicked => ({
  node,
  type: FILE_NAVIGATOR_ITEM_DOUBLE_CLICKED
});

export const fileNavigatorItemBlurred = (
  node: FSItem
): FileNavigatorItemClicked => ({
  node,
  type: FILE_NAVIGATOR_ITEM_BLURRED
});

export const sourceInspectorLayerClicked = (
  node: InspectorNode,
  sourceEvent: React.MouseEvent<any>
): InspectorLayerEvent => ({
  type: SOURCE_INSPECTOR_LAYER_CLICKED,
  node,
  sourceEvent
});

export const sourceInspectorLayerArrowClicked = (
  node: InspectorNode,
  sourceEvent: React.MouseEvent<any>
): InspectorLayerEvent => ({
  type: SOURCE_INSPECTOR_LAYER_ARROW_CLICKED,
  node,
  sourceEvent
});

export const sourceInspectorLayerLabelChanged = (
  node: InspectorNode,
  label: string,
  sourceEvent: React.KeyboardEvent<any>
): InspectorLayerLabelChanged => ({
  type: SOURCE_INSPECTOR_LAYER_LABEL_CHANGED,
  node,
  label,
  sourceEvent
});

export const newVariantNameEntered = (
  value: string
): NewVariantNameEntered => ({
  value,
  type: NEW_VARIANT_NAME_ENTERED
});

export const componentComponentVariantNameChanged = (
  oldName: string,
  newName: string
): ComponentVariantNameChanged => ({
  oldName,
  newName,
  type: COMPONENT_VARIANT_NAME_CHANGED
});

export const componentComponentVariantNameClicked = (
  name: string
): ComponentVariantNameClicked => ({
  name,
  type: COMPONENT_VARIANT_NAME_CLICKED
});

export const componentVariantNameDefaultToggleClick = (
  name: string,
  value: boolean
): ComponentVariantNameDefaultToggleClick => ({
  name,
  value,
  type: COMPONENT_VARIANT_NAME_DEFAULT_TOGGLE_CLICK
});

export const sourceInspectorLayerDropped = (
  source: InspectorNode,
  target: InspectorNode,
  offset: TreeMoveOffset
): SourceInspectorLayerDropped => ({
  source,
  target,
  offset,
  type: SOURCE_INSPECTOR_LAYER_DROPPED
});

export const rawCssTextChanged = (value: string): RawCSSTextChanged => ({
  value,
  type: RAW_CSS_TEXT_CHANGED
});

export const cssPropertyChanged = (
  name: string,
  value: string
): CSSPropertyChanged => ({
  name,
  value,
  type: CSS_PROPERTY_CHANGED
});

export const cssPropertiesChanged = (
  properties: KeyValue<string>
): CSSPropertiesChanged => ({
  properties,
  type: CSS_PROPERTIES_CHANGED
});

export const cssPropertyChangeCompleted = (
  name: string,
  value: string
): CSSPropertyChanged => ({
  name,
  value,
  type: CSS_PROPERTY_CHANGE_COMPLETED
});

export const cssPropertiesChangeCompleted = (
  properties: KeyValue<string>
): CSSPropertiesChanged => ({
  properties,
  type: CSS_PROPERTIES_CHANGE_COMPLETED
});

export const attributeChanged = (
  name: string,
  value: string
): AttributeChanged => ({
  name,
  value,
  type: ATTRIBUTE_CHANGED
});

export const slotToggleClick = (): SlotToggleClick => ({
  type: SLOT_TOGGLE_CLICK
});

export const textValueChanged = (value: string): TextValueChanged => ({
  value,
  type: TEXT_VALUE_CHANGED
});

export const elementTypeChanged = (value: string): ElementTypeChanged => ({
  value,
  type: ELEMENT_TYPE_CHANGED
});

export const appLoaded = publicActionCreator(() => ({ type: APP_LOADED }));

export const newFileEntered = (basename: string): NewFileEntered => ({
  basename,
  type: NEW_FILE_ENTERED
});

export const newDirectoryEntered = (basename: string): NewFileEntered => ({
  basename,
  type: NEW_DIRECTORY_ENTERED
});

export const projectLoaded = (uri: string): ProjectLoaded => ({
  uri,
  type: PROJECT_LOADED
});

export const projectDirectoryLoaded = publicActionCreator(
  (directory: Directory): ProjectDirectoryLoaded => ({
    directory,
    type: PROJECT_DIRECTORY_LOADED
  })
);

export const shortcutKeyDown = publicActionCreator(
  (type: string): ShortcutKeyDown => ({
    type
  })
);

export const syntheticNodesPasted = (
  clips: PCNodeClip[]
): SyntheticVisibleNodesPasted => ({
  clips,
  type: SYNTHETIC_NODES_PASTED
});

export const documentRendered = (
  documentId: string,
  info: ComputedDisplayInfo,
  nativeMap: SyntheticNativeNodeMap
): DocumentRendered => ({
  nativeMap,
  documentId,
  info,
  type: DOCUMENT_RENDERED
});

export const savedFile = (uri: string): SavedFile => ({
  uri,
  type: SAVED_FILE
});

export const savedAllFiles = (uri: string): SavedAllFiles => ({
  type: SAVED_ALL_FILES
});

export const canvasToolOverlayMousePanStart = (
  documentId: string
): CanvasToolOverlayMousePanStart => ({
  documentId,
  type: CANVAS_TOOL_OVERLAY_MOUSE_PAN_START
});

export const canvasToolOverlayMousePanning = (
  documentId: string,
  center: Point,
  deltaY: number,
  velocityY: number
): CanvasToolOverlayMousePanning => ({
  documentId,
  center,
  deltaY,
  velocityY,
  type: CANVAS_TOOL_OVERLAY_MOUSE_PANNING
});

export const canvasToolOverlayMouseLeave = (
  sourceEvent: React.MouseEvent<any>
): CanvasToolOverlayMouseMoved => ({
  type: CANVAS_TOOL_OVERLAY_MOUSE_LEAVE,
  sourceEvent
});

export const canvasToolOverlayMousePanEnd = (
  documentId: string
): CanvasToolOverlayMousePanEnd => ({
  documentId,
  type: CANVAS_TOOL_OVERLAY_MOUSE_PAN_END
});

export const canvasToolOverlayMouseDoubleClicked = (
  documentId: string,
  sourceEvent: React.MouseEvent<any>
): CanvasToolOverlayClicked => ({
  documentId,
  type: CANVAS_TOOL_OVERLAY_MOUSE_DOUBLE_CLICKED,
  sourceEvent
});

export const canvasContainerMounted = (
  element: HTMLDivElement,
  fileUri: string
): CanvasMounted => ({
  element,
  fileUri,
  type: CANVAS_MOUNTED
});

export const canvasMouseMoved = (
  editorWindow: EditorWindow,
  sourceEvent: React.MouseEvent<any>
): CanvasMouseMoved => ({
  editorWindow,
  sourceEvent,
  type: CANVAS_MOUSE_MOVED
});

export const canvasDraggedOver = (
  item: any,
  offset: Point
): CanvasDraggingOver => ({
  item,
  offset,
  type: CANVAS_DRAGGED_OVER
});

export const canvasMouseClicked = (
  sourceEvent: React.MouseEvent<any>
): WrappedEvent<React.MouseEvent<any>> => ({
  sourceEvent,
  type: CANVAS_MOUSE_CLICKED
});

export const canvasMouseDoubleClicked = (
  sourceEvent: React.MouseEvent<any>
): WrappedEvent<React.MouseEvent<any>> => ({
  sourceEvent,
  type: CANVAS_MOUSE_DOUBLE_CLICKED
});

export const canvasWheel = (
  canvasWidth: number,
  canvasHeight: number,
  { metaKey, ctrlKey, deltaX, deltaY, clientX, clientY }: React.WheelEvent<any>
): CanvasWheel => ({
  metaKey,
  canvasWidth,
  canvasHeight,
  ctrlKey,
  deltaX,
  deltaY,
  type: CANVAS_WHEEL
});

export const canvasDroppedItem = (
  item: RegisteredComponent,
  point: Point,
  editorUri: string
): CanvasDroppedItem => ({
  editorUri,
  item,
  point,
  type: CANVAS_DROPPED_ITEM
});

export const canvasMotionRested = () => ({
  type: CANVAS_MOTION_RESTED
});

export const insertToolFinished = (
  point: Point,
  fileUri: string
): InsertToolFinished => ({
  point,
  fileUri,
  type: INSERT_TOOL_FINISHED
});

export const canvasToolWindowBackgroundClicked = (
  sourceEvent: React.KeyboardEvent<any>
): WrappedEvent<React.KeyboardEvent<any>> => ({
  type: CANVAS_TOOL_WINDOW_BACKGROUND_CLICKED,
  sourceEvent
});
export const canvasToolWindowKeyDown = (
  documentId: string,
  sourceEvent: React.KeyboardEvent<any>
): CanvasToolWindowKeyDown => ({
  type: CANVAS_TOOL_WINDOW_KEY_DOWN,
  documentId,
  sourceEvent
});
export const canvasToolDocumentTitleClicked = (
  frame: Frame,
  sourceEvent: React.MouseEvent<any>
): CanvasToolArtboardTitleClicked => ({
  type: CANVAS_TOOL_ARTBOARD_TITLE_CLICKED,
  frame,
  sourceEvent
});

export const canvasToolPreviewButtonClicked = (
  frame: Frame,
  sourceEvent: React.MouseEvent<any>
): CanvasToolArtboardTitleClicked => ({
  type: CANVAS_TOOL_PREVIEW_BUTTON_CLICKED,
  frame,
  sourceEvent
});

export const resizerPathMoved = (
  anchor: Point,
  originalBounds: Bounds,
  newBounds: Bounds,
  sourceEvent: MouseEvent
): ResizerPathMoved => ({
  type: RESIZER_PATH_MOUSE_MOVED,
  anchor,
  originalBounds,
  newBounds,
  sourceEvent
});

export const frameBoundsChanged = (newBounds: Bounds) => ({
  type: FRAME_BOUNDS_CHANGED,
  newBounds
});

export const frameBoundsChangeCompleted = (newBounds: Bounds) => ({
  type: FRAME_BOUNDS_CHANGE_COMPLETED,
  newBounds
});

export const resizerPathStoppedMoving = (
  anchor: Point,
  originalBounds: Bounds,
  newBounds: Bounds,
  sourceEvent: MouseEvent
): ResizerPathMoved => ({
  type: RESIZER_PATH_MOUSE_STOPPED_MOVING,
  anchor,
  originalBounds,
  newBounds,
  sourceEvent: { ...sourceEvent }
});

export const resizerMoved = (point: Point): ResizerMoved => ({
  point,
  type: RESIZER_MOVED
});

export const resizerStoppedMoving = (point: Point): ResizerMoved => ({
  point,
  type: RESIZER_STOPPED_MOVING
});

export const resizerMouseDown = (
  sourceEvent: React.MouseEvent<any>
): ResizerMouseDown => ({
  sourceEvent,
  type: RESIZER_MOUSE_DOWN
});

export const resizerStartDrag = (
  sourceEvent: React.MouseEvent<any>
): ResizerMouseDown => ({
  sourceEvent,
  type: RESIZER_START_DRGG
});
