{
  "name": "Editor Module",
  "description": "A flexible module for quickly building powerful, drag-and-drop editors like what you see in PowerPoint, Canva, or 10 Minute Pages. This module renders a canvas of web components, each wrapped with customizable handlers that take care of dragging, dropping, and content manipulation. Components are rendered based on a data array provided in the props with each item in the array mapping to a provided set of react components (e.g. headline, pictures, videos, etc.). Editor components are simply react components (provided by props or plugins) that render itself based on settings provided by the editor. Each editor component provides its own properties control, which is used to further customize itself. The module also provides common property building tools (e.g. sidebar, sections, sliders, typography, etc.) that can be leveraged for speed and visual consistency",
  "workflow": "",
  "user_stories": [
    "As a user, I want to be able to select individual page elements (widgets) on the page",
    "As a user I want to be able to drag my objects around the page with pixel precision",
    "As a user I want to be able to drag my objects around the page and have them snap to (or inside) the other objects on the page",
    "As a user I would like to delete objects using my keyboard",
    "As a user I would like all elements fit to the width of parent container by default",
    "As a developer I would like to customize the various component wrappers (e.g. resize handle, toolbar, etc.)",
    "As a developer I would like to provide a list of components that the content array will use for displaying content",
    "As a developer I would like to hook in and override any of the events associated with the editor (e.g. update, delete, drag, move, etc.)",
    "As a developer I would like to configure the editor to be readOnly",
    "As a developer, I would like to configure the editor to not allow dragging or adding new items",
    "As a developer, I would like to pass in an array of content that links to a provided component that I want it to render",
    "As a developer I would like to turn on/off snap guides to aid in pixel-level edit control",
    "As a user I would like to easily undo or redo previous actions",
    "As a user I would like the ability to resize editor content"
  ],
  "test_plan": [
    {
      "scenario": "Actions",
      "expected": "Should be able to drag new objects immediately above or below existing objects",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to drag existing objects immediately above or below existing objects",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to drag objects inside of existing object containers",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to select an object and make it active",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to see objects highlight when I hover over them",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to open an objects property (if provided) when I double click on it",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to remove items via [delete] on my keyboard",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to remove items through an action item in the editor object action menu",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to duplicate an item through an action item in the editor object action menu",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to duplicate an item by pressing [CTRL/CMD] + [D] on my keyboard",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to replace the content in the editor through the updateContent method",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to change the style properties of an item in the editor through the updateComponentStyle method",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to update anything about an item through the updateComponentSettings method",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to make an object the main active object by clicking on it",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to undo one or more changes I make to the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Actions",
      "expected": "Should be able to reverse an undo decision via a redo button",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should show editor in the dom",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should show the same number of items in the dom as there are items in the content prop",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should show items in the dom as specifie in the content prop and match components found in the components prop",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should not be able to add new items if canAddItems prop is false",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should not be able to drag items if canDrag prop is false",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should be able to move items one pixel at a time if dragMode prop is set to PIXELBYPIXEL",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should only be able to move items above, beneath, and inside existing objects if dragMode prop is set to OBJECT",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should only be able to drag section objects up and down if dragMode prop is set to BLOCK",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should show a snap guide if in PIXELBYPIXEL mode and dragging an object next to the vertical or horizontal cross-section of another object",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should show a cursor when dragging items around in OBJECT mode",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should show a custom cursor component when one is provided in the cursorComponent prop",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should show a wrapper component around each object in the dom",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should show a custom wrapper component around each object when a custom component is provided in the editorObjectComponent prop",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should modify the editor object (e.g. colors, etc.) according to the editorObjectSettings prop",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should show a default drag handle component near each object when selected",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should show a custom drag handle component near each object when selected and a custom component is provided in the dragHandleComponent prop",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should modify the drag handle (e.g. colors, etc.) according to the dragHandleSettings prop",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should show a custom resize handler component for resizable editor objects when one is provided in the resizeHandleComponent prop",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should modify the resize handler (e.g. colors, etc.) according to the resizeHandlerSettings prop",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should keep track of the changes that occur in the content prop via the undoStack prop",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should keep track of the current undo position in the undoPosition prop.  Number decrements on undo actions, increments on redo.",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should not allow any changes of any kind when the readOnly prop is set to true",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should show editor component in a zoomed state the corresponds with the number in the zoom prop",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should show an item legend if the itemLegendIsVisible prop is true",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Props in the item legend should match the object provided in the itemLegendSettings prop",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Rendering",
      "expected": "Should show the component provided in the itemLegendComponent prop instead of the default one if one is provided",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Methods",
      "expected": "Should trigger the addThisAfterThat() method when an item is to be added to the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Methods",
      "expected": "Should trigger the removeItem() method when an item should be removed from the content array",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Methods",
      "expected": "Should trigger the duplicateItem() method when an item should be duplicated",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Methods",
      "expected": "Should trigger the moveThisByThat() method when an item should be moved to another location",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Methods",
      "expected": "Should trigger the updateContent() method when the editor's content should be updated",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Methods",
      "expected": "Should trigger the updateComponentStyle() method when an items style should be changed",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Methods",
      "expected": "Should trigger the updateComponentSettings() method when something should change about an item",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Methods",
      "expected": "Should trigger the setActiveObject() method when an item's state should be active",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Methods",
      "expected": "Should trigger the doUndoRedo() method when the editor's content needs to return to a previous state",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Methods",
      "expected": "Should trigger the chagneState() method when the item's state should change",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Methods",
      "expected": "Should be able to enable or disable the editors canDrag property from anywhere in the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Methods",
      "expected": "Should be able to retrieve a list of all the direct ancestors to a provided editor item from anywhere inside the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Methods",
      "expected": "Should be able to retrieve a list of the items (and a useful icon) in the editor using the listComponents method from anywhere inside the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Events",
      "expected": "Should trigger onAdd() event with appropriate payload when a new item is added to the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Events",
      "expected": "Should trigger onRemove() event with appropriate payload when an item is removed from the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Events",
      "expected": "Should trigger onDuplicate() event with appropriate payload when an item is duplicated in the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Events",
      "expected": "Should trigger onMove() event with appropriate payload when an item is moved in the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Events",
      "expected": "Should trigger onStateChange() event with appropriate payload when the state of an item changes in the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Events",
      "expected": "Should trigger onChange() event with appropriate payload when an item in the editor changes in some way",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Events",
      "expected": "Should trigger onKeyUp() event with appropriate payload when a key is pressed in the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Events",
      "expected": "Should trigger onSelect() event with appropriate payload when an item is selected in the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Events",
      "expected": "Should trigger onUndo() event with appropriate payload when an undo action is supposed to happen",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Events",
      "expected": "Should trigger onRedo() event with appropriate payload when redo action is supposed to happen",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onAddItem_ hook when a new item is added to the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onRemoveItem_ hook when an item is removed from the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onDuplicateItem_ hook when an item is duplicated in the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onMoveItem_ hook when an item is duplicated in the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onResizeItem_ hook when an item is resizing in the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onResizeItemEnd_ hook when an item is done resizing itself",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onItemStateChange_ hook when the state of an item changes in the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onChange_ hook when an item in the editor changes in some way",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onKeyUp_ hook when a key is pressed in the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onSelectItem_ hook when an item is selected in the editor",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onUndo_ hook when an undo action is supposed to happen",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onRedo_ hook when redo action is supposed to happen",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onEditorRender_ hook when Editor is rendered",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onEditorObjectRender_ hook when Editor Object is rendered",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onComponentLoaderRender_ hook when the Component Loader is rendered",
      "automated": "Yes",
      "type": "End To End"
    },
    {
      "scenario": "Hooks",
      "expected": "Should trigger _onWebComponentWrapperRender_ hook when componentWrapper is rendered",
      "automated": "Yes",
      "type": "End To End"
    }
  ],
  "screens": "http://ambid-backups.s3.amazonaws.com/screenshots/sandcastle/funnel_screen_simple.png",
  "components": [
    {
      "type": "Containers",
      "name": "Editor",
      "description": "A flexible module for quickly building powerful, drag-and-drop editors like what you see in PowerPoint, Canva, or 10 Minute Pages",
      "behaviors": "",
      "exists": "No",
      "package": "No",
      "schema": [
        {
          "schema_type": "prop",
          "name": "name",
          "type": "string",
          "description": "The name to use for the Editor component.  Useful for plugins that want to hook into your specific editor vs others",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "canAddItems",
          "type": "bool",
          "description": "Whether or not the user is able to add new items to the editor",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "canDrag",
          "type": "bool",
          "description": "Whether or not dragging is enabled",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "dragMode",
          "type": "enum(PIXELBYPIXEL,OBJECT,BLOCK)",
          "description": "The type of drag to perform (pixel-by-pixel, object snap, or blocks)",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "snapGuidesAreEnabled",
          "type": "bool",
          "description": "Whether or not snap guides are enabled while in pixel-by-pixel mode",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "content",
          "type": "array",
          "description": "The content to use to populate the editor with objects",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "components",
          "type": "array",
          "description": "The components that are available for rendering",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "cursorComponent",
          "type": "React.ReactNode",
          "description": "The custom component to use for the cursor that shows while dragging",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "componentWrapperComponent",
          "type": "React.ReactNode",
          "description": "A custom component that will wrap around each editor component",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "editorObjectComponent",
          "type": "React.ReactNode",
          "description": "The custom component to use instead of the default editor object component",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "editorObjectSettings",
          "type": "any",
          "description": "For customizing the default editor object (e.g. colors, etc.)",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "dragHandleComponent",
          "type": "React.ReactNode",
          "description": "The custom component to use instead of the default drag handle component",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "dragHandleSettings",
          "type": "any",
          "description": "For customizing the default drag handle (e.g. colors, etc.)",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "resizeHandleComponent",
          "type": "React.ReactNode",
          "description": "The custom component to use for resize handles",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "resizeHandleSettings",
          "type": "any",
          "description": "For customizing the default resize handle (e.g. colors, etc.)",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "itemLegendSettings",
          "type": "object",
          "description": "The props to use for the <ItemLegend /> component",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "itemLegendIsVisible",
          "type": "bool",
          "description": "Whether or not the <ItemLegend /> component should render",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "itemLegendComponent",
          "type": "element",
          "description": "Replaces the default <ItemLegend /> component",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "undoStack",
          "type": "array",
          "description": "The current undo stack",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "undoPosition",
          "type": "int",
          "description": "The current position in the undo stack",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "readOnly",
          "type": "bool",
          "description": "Whether or not the editor is in read only mode",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "zoom",
          "type": "float",
          "description": "The current zoom of the editor",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "onAdd",
          "type": "() => void",
          "description": "Triggers when a new item is added to the editor",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "onRemove",
          "type": "() => void",
          "description": "Triggers when an item is removed from the editor",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "onDuplicate",
          "type": "() => void",
          "description": "Triggers when an item is duplicated in the editor",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "onMove",
          "type": "() => void",
          "description": "Triggers when an item is moved in the editor",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "onStateChange",
          "type": "() => void",
          "description": "Triggers when the state of an item changes in the editor",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "onChange",
          "type": "() => void",
          "description": "Triggers when an item in the editor changes in some way",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "onKeyUp",
          "type": "() => void",
          "description": "Triggers when a key is pressed in the editor ~ to handle delete requests, pixel nudging, etc.",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "onSelect",
          "type": "() => void",
          "description": "Triggers when an item is selected in the editor",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "onUndo",
          "type": "() => void",
          "description": "Triggers when an undo action is supposed to happen",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "onRedo",
          "type": "() => void",
          "description": "Triggers when redo action is supposed to happen",
          "required": true
        },
        {
          "schema_type": "prop",
          "name": "content",
          "type": "any[]",
          "description": "The current content (same as the one in the props) in the editor",
          "required": true
        },
        {
          "schema_type": "method",
          "name": "addThisAfterThat",
          "type": "() => void",
          "description": "Takes an object representing a new component and adds it immediately after an existing item in the content array",
          "required": true
        },
        {
          "schema_type": "method",
          "name": "removeItem",
          "type": "() => void",
          "description": "Removes an item from the content array",
          "required": true
        },
        {
          "schema_type": "method",
          "name": "duplicateItem",
          "type": "() => void",
          "description": "Duplicates a specific item in the content array",
          "required": true
        },
        {
          "schema_type": "method",
          "name": "moveThisByThat",
          "type": "() => void",
          "description": "Moves an item in the content array to another location in the content array",
          "required": true
        },
        {
          "schema_type": "method",
          "name": "updateContent",
          "type": "() => void",
          "description": "Updates the entire content array",
          "required": true
        },
        {
          "schema_type": "method",
          "name": "updateComponentStyle",
          "type": "() => void",
          "description": "Updates the properties object of an item in the content array",
          "required": true
        },
        {
          "schema_type": "method",
          "name": "updateComponentSettings",
          "type": "() => void",
          "description": "Updates an item in the content array",
          "required": true
        },
        {
          "schema_type": "method",
          "name": "setActiveObject",
          "type": "() => void",
          "description": "Sets the provided object to be the active object",
          "required": true
        },
        {
          "schema_type": "method",
          "name": "doUndoRedo",
          "type": "() => void",
          "description": "Triggers an undo or a redo command",
          "required": true
        },
        {
          "schema_type": "method",
          "name": "changeState",
          "type": "() => void",
          "description": "Sets the provided object's current state to something else",
          "required": true
        },
        {
          "schema_type": "method",
          "name": "resizeObject",
          "type": "() => void",
          "description": "Updates the width and height of the provided object",
          "required": true
        },
        {
          "schema_type": "method",
          "name": "setCanDrag",
          "type": "() => void",
          "description": "A global way to update the editor's canDrag property",
          "required": true
        },
        {
          "schema_type": "method",
          "name": "listAncestors",
          "type": "() => void",
          "description": "Provides a list of all the direct ancestors to a provided editor item",
          "required": true
        },
        {
          "schema_type": "method",
          "name": "listComponents",
          "type": "() => void",
          "description": "Generates a list of the current items in the editor.  Including an icon to use when display. Also will return a filtered list of components if you provide the filter in [key, value] format (e.g. ['type', 'Body'] for filtering out the main body or ['canHaveChildren', true] for filtering only containers)",
          "required": true
        }
      ]
    },
    {
      "type": "Components",
      "name": "LoadComponent",
      "description": "(Formerly WebComponent) The react component used to interpret each item in the editor.",
      "behaviors": "Dynamically loads the appropriate editor widget plugin",
      "exists": "No",
      "package": "No",
      "schema": [
        {
          "schema_type": "prop",
          "name": "mode",
          "required": true,
          "type": "enum",
          "description": "enum(LIVE,EDITOR)"
        },
        {
          "schema_type": "prop",
          "name": "type",
          "required": true,
          "type": "string",
          "description": "The name of the component that should be loaded"
        },
        {
          "schema_type": "prop",
          "name": "settings",
          "required": true,
          "type": "object",
          "description": "The settings to pass along to the component"
        },
        {
          "schema_type": "prop",
          "name": "[!]rSettings",
          "required": true,
          "type": "object",
          "description": "Mobile responsive settings"
        },
        {
          "schema_type": "prop",
          "name": "isDragInProgress",
          "required": true,
          "type": "bool",
          "description": "Whether or not the component is currently being dragged"
        },
        {
          "schema_type": "prop",
          "name": "children",
          "required": true,
          "type": "component",
          "description": ""
        },
        {
          "schema_type": "globals",
          "name": "itemCoordinates",
          "required": true,
          "public": true,
          "type": "object",
          "description": "The current top, right, bottom, left, width, height coordinates of the component"
        },
        {
          "schema_type": "globals",
          "name": "parentCoordinates",
          "required": true,
          "public": true,
          "type": "object",
          "description": "The current top, right, bottom, left, width, height coordinates of the parent component"
        },
        {
          "schema_type": "globals",
          "name": "settings",
          "required": true,
          "public": true,
          "type": "object",
          "description": "The current settings for the item"
        },
        {
          "schema_type": "globals",
          "name": "setIsEditing",
          "required": true,
          "public": true,
          "type": "() => void",
          "description": "Sets the component in 'editing' mode"
        },
        {
          "schema_type": "globals",
          "name": "isEditing",
          "required": true,
          "public": true,
          "type": "bool",
          "description": "Whether or not the component is being edited"
        }
      ],
      "tests": [
        {
          "it": "Should render the component provided in the type prop",
          "type": "Integration"
        },
        {
          "it": "Should render the `LIVE` version of the component when the mode is set to `LIVE`",
          "type": "Integration"
        },
        {
          "it": "Should render the `EDITOR` version of the component when the mode is set to `EDITOR`",
          "type": "Integration"
        },
        {
          "it": "Component rendered should reflect the properties found in the settings prop",
          "type": "Integration"
        },
        {
          "it": "Should set isDragInProgress prop to true when in the middle of dragging",
          "type": "Integration"
        },
        {
          "it": "Should see accurate values in itemCoordinates prop after the item's position changes",
          "type": "Integration"
        },
        {
          "it": "Should see accurate values in parentCoordinates prop after the item's position changes to be inside of a different parent container/column",
          "type": "Integration"
        },
        {
          "it": "Should be able to access itemCoordinates, settings, isEditing, setIsEditing, and parentCoordinates from any child component",
          "type": "Integration"
        },
        {
          "it": "Should set the isEditing prop to true when the component is being edited",
          "type": "Integration"
        }
      ]
    },
    {
      "type": "Components",
      "name": "ComponentWrapper",
      "description": "The container that is wrapped around each component in the editor",
      "behaviors": "",
      "exists": "No",
      "package": "No",
      "schema": [
        {
          "schema_type": "prop",
          "name": "isShowingProperties",
          "required": true,
          "public": true,
          "type": "bool",
          "description": "Whether or not the component is currently showing properties"
        },
        {
          "schema_type": "prop",
          "name": "children",
          "required": true,
          "public": true,
          "type": "bool",
          "description": ""
        }
      ],
      "tests": [
        {
          "it": "Should render in dom as parent to the editor component",
          "type": "Integration"
        },
        {
          "it": "Should set the isShowingProperties prop to true when the properties are showing",
          "type": "Integration"
        },
        {
          "it": "Should set the isShowingProperties prop to true when setIsEditing() method is called",
          "type": "Integration"
        }
      ]
    },
    {
      "type": "Components",
      "name": "EditorObject",
      "description": "This component makes child components compatible with the editor, enabling drag-and-drop, widget toolbars, etc. Each component in the editor should wrap itself with this component. It's the component that highlights the object in various ways to let the user know what they are editing at a given time",
      "behaviors": "",
      "exists": "No",
      "package": "No",
      "schema": [
        {
          "schema_type": "prop",
          "name": "title",
          "required": true,
          "public": true,
          "type": "string",
          "description": "The caption to title the editor object"
        },
        {
          "schema_type": "prop",
          "name": "icon",
          "required": true,
          "public": true,
          "type": "string",
          "description": "The icon to use in the title"
        },
        {
          "schema_type": "prop",
          "name": "color",
          "required": true,
          "public": true,
          "type": "string",
          "description": "The color of the editor object borders"
        },
        {
          "schema_type": "prop",
          "name": "style",
          "required": true,
          "public": true,
          "type": "object",
          "description": "The sytle to use for the editor object"
        },
        {
          "schema_type": "prop",
          "name": "resizeHandles",
          "required": true,
          "public": true,
          "type": "array",
          "description": "The resize handles that are enabled (e.g. [`SW`] or [`N`,`S`,`E`,`W`]"
        },
        {
          "schema_type": "prop",
          "name": "isResizable",
          "required": true,
          "public": true,
          "type": "bool",
          "description": "Whether or not the component is resizable"
        },
        {
          "schema_type": "prop",
          "name": "isEditing",
          "required": true,
          "public": true,
          "type": "bool",
          "description": "Whether or not the editor is in `editing` mode"
        },
        {
          "schema_type": "prop",
          "name": "overlay",
          "required": true,
          "public": true,
          "type": "bool",
          "description": "Whether or not to place a transparent <div /> on the component in order to prevent the user from manipulating the component while editing. For example, videos.  You likely don't want them to be able to play/pause videos while in the editor.  This would place an overlay over the video so that users can't interact with it"
        },
        {
          "schema_type": "prop",
          "name": "actions",
          "required": true,
          "public": true,
          "type": "object",
          "description": "An array of objects that represent the items in to show in the dropdown menu and associated actions to take (id, label, icon, onSelect) e.g. (Duplicate, Delete, Copy, Paste, Save)"
        },
        {
          "schema_type": "prop",
          "name": "actionComponent",
          "required": true,
          "public": true,
          "type": "",
          "description": "Custom component to use instead of the default action component"
        },
        {
          "schema_type": "prop",
          "name": "propertiesViewComponent",
          "required": true,
          "public": true,
          "type": "",
          "description": "The component to use for the object's properties"
        },
        {
          "schema_type": "prop",
          "name": "resizeHandlesComponent",
          "required": true,
          "public": true,
          "type": "",
          "description": "The component to use for the resize handles"
        },
        {
          "schema_type": "prop",
          "name": "dragHandleComponent",
          "required": true,
          "public": true,
          "type": "",
          "description": "The component to use for the drag handle"
        },
        {
          "schema_type": "prop",
          "name": "children",
          "required": true,
          "public": true,
          "type": "component",
          "description": ""
        },
        {
          "schema_type": "prop",
          "name": "onResizing",
          "description": "Triggers when a resize is supposed to take place",
          "required": "true",
          "public": true,
          "type": "() => void"
        },
        {
          "schema_type": "prop",
          "name": "onResizeEnd",
          "description": "Triggers when a resize has ended",
          "required": "true",
          "public": true,
          "type": "() => void"
        },
        {
          "schema_type": "prop",
          "name": "onDragStart",
          "description": "Triggers when the editor object's drag handle has begun dragging",
          "required": "true",
          "public": true,
          "type": "() => void"
        },
        {
          "schema_type": "prop",
          "name": "onClick",
          "description": "Triggers when the editor object is clicked",
          "required": "true",
          "public": true,
          "type": "() => void"
        },
        {
          "schema_type": "prop",
          "name": "onContextMenu",
          "description": "Triggers when the `right` mouse button is clicked",
          "required": "true",
          "public": true,
          "type": "() => void"
        }
      ],
      "tests": [
        {
          "it": "Should render the Editor Object component when called",
          "type": "Integration"
        },
        {
          "it": "Should render in hover mode when state is hovered",
          "type": "Integration"
        },
        {
          "it": "Should render in active mode when state is active",
          "type": "Integration"
        },
        {
          "it": "Should show a caption in the editor object that reflects the title prop",
          "type": "Integration"
        },
        {
          "it": "Should show an icon if one is provided that reflects the icon prop",
          "type": "Integration"
        },
        {
          "it": "Should be styled according to the style prop if one is present",
          "type": "Integration"
        },
        {
          "it": "Should render resize handles if isResizable prop is true",
          "type": "Integration"
        },
        {
          "it": "Should render the `North` resize handle if resizeHandles prop has an `N` as an array item",
          "type": "Integration"
        },
        {
          "it": "Should render the `North West` resize handle if resizeHandles prop has an `NW` as an array item",
          "type": "Integration"
        },
        {
          "it": "Should render the `West` resize handle if resizeHandles prop has an `W` as an array item",
          "type": "Integration"
        },
        {
          "it": "Should render the `South West` resize handle if resizeHandles prop has an `SW` as an array item",
          "type": "Integration"
        },
        {
          "it": "Should render the `South` resize handle if resizeHandles prop has an `S` as an array item",
          "type": "Integration"
        },
        {
          "it": "Should render the `South East` resize handle if resizeHandles prop has an `SE` as an array item",
          "type": "Integration"
        },
        {
          "it": "Should render the `East` resize handle if resizeHandles prop has an `E` as an array item",
          "type": "Integration"
        },
        {
          "it": "Should render the `North East` resize handle if resizeHandles prop has an `NE` as an array item",
          "type": "Integration"
        },
        {
          "it": "Should render a transparent div component if overlay prop is true",
          "type": "Integration"
        },
        {
          "it": "Should show an overlay prop across the entire editor object if one is showing",
          "type": "Integration"
        },
        {
          "it": "Should show a list of menu items in the actions drop down menu that reflect the items in the actions prop",
          "type": "Integration"
        },
        {
          "it": "Should show a custom drag handle component if provided in the dragHandleComponent prop",
          "type": "Integration"
        },
        {
          "it": "Should show a custom resize handler component for resizable editor objects when one is provided in the resizeHandleComponent prop",
          "type": "Integration"
        },
        {
          "it": "Should trigger the onResize event with an appropriate payload when a resize is supposed to take place",
          "type": "Integration"
        },
        {
          "it": "Should trigger the onResizeEnd event with an appropriate payload when a resize has ended",
          "type": "Integration"
        },
        {
          "it": "Shoudl trigger the onDragStart event when the editor object's drag handle has begun dragging",
          "type": "Integration"
        },
        {
          "it": "Should trigger the onClick event when the editor object is clicked",
          "type": "Integration"
        },
        {
          "it": "Should delete the item if the [del] key is pressed (while not in edit mode)",
          "type": "Integration"
        },
        {
          "it": "Should exit editing mode if the [esc] key is pressed",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onEditorObjectResize` plugin hook when the resize is taking place",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onEditorObjectDragDrop` plugin hook when the editor object drag and drop is taking place",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onEditorObjectClick` plugin hook when the editor object is clicked",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onEditorObjectContextMenu` plugin hook when the context menu is being showed",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onEditorObjectRender` plugin hook when the editor object is being rendered",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onEditorObjectResizeHandleRender` plugin hook when the editor object's resize handler is being rendered",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onEditorObjectActionComponentRender` plugin hook when the editor object's action component is being rendered",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onEditorObjectActionMenuList` plugin hook when the editor object's action menu list is being generated",
          "type": "Integration"
        }
      ]
    },
    {
      "type": "Components",
      "name": "RichEditor",
      "description": "A component for providing rich, wysiwyg text composition. A wrapper of the draft.js library",
      "behaviors": "",
      "exists": "No",
      "package": "No",
      "schema": [
        {
          "schema_type": "prop",
          "name": "buttonList",
          "type": "string[]",
          "description": "The array of buttons you want to display (e.g. settings, duplicate, delete, color, upload, spacer, bold, italic, underline, textStyle, textAlign, textAlignLeft, textAlignRight, textAlignCenter, link, list, listBullet, listNumbers, objAlignLeft, objAlignRight, objAlignCenter)",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "onChange",
          "type": "() => void",
          "description": "Triggers when a change is made in the rich editor",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "onFocus",
          "type": "() => void",
          "description": "Triggers when the editor is focused on",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "onBlur",
          "type": "() => void",
          "description": "Triggers when the editor loses focus",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "onKeyCommand",
          "type": "() => void",
          "description": "Triggers when a key is pressed while in the editor",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "inlineControlsComponent",
          "type": "element",
          "description": "Render this component instead of the default component when inline controls are to be shown",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "content",
          "type": "string",
          "description": "The html content of the rich editor",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "onSelectText",
          "type": "() => void",
          "description": "Triggers when text is selected in the editor",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "disabled",
          "type": "bool",
          "description": "Whether or not the rich editor is disabled",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "position",
          "type": "enum",
          "description": "The desired position of the inline style controls",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "disableInlineControls",
          "type": "bool",
          "description": "Whether or not to display an inline control toolbar",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "inlineControlsStyle",
          "type": "object",
          "description": "The style to use for the inline controls toolbar",
          "required": true,
          "public": false
        }
      ],
      "tests": [
        {
          "it": "Should render the RichEditor in the dom",
          "type": "Integration"
        },
        {
          "it": "Should render a collection of buttons that match the list provided in the buttonList prop",
          "type": "Integration"
        },
        {
          "it": "Should show the inline control buttons in the location provided in the position prop",
          "type": "Integration"
        },
        {
          "it": "Should not render any inline controls if the disableInlineControls prop is true",
          "type": "Integration"
        },
        {
          "it": "Should style the inline controls according to the style provided in the inlineControlsStyle prop",
          "type": "Integration"
        },
        {
          "it": "Should render the component provided in the inlineControlsComponent instead of the default component when one is provided in the props",
          "type": "Integration"
        },
        {
          "it": "Should show content inside the editor that matches the html content provided in the content prop",
          "type": "Integration"
        },
        {
          "it": "Should disable the editor when the disabled prop is true",
          "type": "Integration"
        },
        {
          "it": "Should trigger the onChange() event when a change is made in the rich editor",
          "type": "Integration"
        },
        {
          "it": "Should trigger the onFocus() event when the editor is focused on",
          "type": "Integration"
        },
        {
          "it": "Should trigger the onBlur() event when the editor loses focus",
          "type": "Integration"
        },
        {
          "it": "Should trigger the onKeyCommand() event when a key is pressed while in the editor",
          "type": "Integration"
        },
        {
          "it": "Should trigger the onSelectText() event when text is selected in the editor",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onRichEditorRender` plugin hook when the RichEditor component is rendering",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onRichEditorFocus` plugin hook when the editor is focused on",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onRichEditorChange` plugin hook when a change is made in the rich editor",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onRichEditorKeyCommand` plugin hook when a key is pressed while in the editor",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onRichEditorSelectText` plugin hook when text is selected in the editor",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onRichEditorBlur` plugin hook when the editor loses focus",
          "type": "Integration"
        }
      ]
    },
    {
      "type": "Components",
      "name": "InlineControls",
      "description": "The toolbar of <InlineControlButtons /> or Button Groups for controlling formatting, etc",
      "behaviors": "",
      "package": "No",
      "exists": "No",
      "schema": [
        {
          "name": "isShowing",
          "type": "bool",
          "description": "Whether or not the inline controls are showing at the moment"
        },
        {
          "name": "buttonList",
          "type": "array",
          "description": "An array of buttons to display (e.g. settings, duplicate, delete, color, upload, spacer, bold, italic, underline, textStyle, textAlign, textAlignLeft, textAlignRight, textAlignCenter, link, list, listBullet, listNumbers, objAlignLeft, objAlignRight, objAlignCenter)"
        },
        {
          "name": "position",
          "type": "string",
          "description": "The current location of the inline popup (e.g. top, right, bottom, left, auto, [x,y] offset)"
        },
        {
          "name": "currentStyle",
          "type": "any",
          "description": "The current inline style of the editor (editorState.getCurrentInlineStyle())"
        }
      ],
      "tests": [
        {
          "it": "Should not render any inline controls if the isShowing prop is false",
          "type": "Integration"
        },
        {
          "it": "Should render a collection of buttons that match the list provided in the buttonList prop",
          "type": "Integration"
        },
        {
          "it": "Should show the inline control buttons in the location provided in the position prop",
          "type": "Integration"
        },
        {
          "it": "Should triggers the `onlnlineControlsRender` plugin hook when the InlineControls are rendering",
          "type": "Integration"
        }
      ]
    },
    {
      "name": "InlineControlButton",
      "description": "A single button that displays on the toolbar",
      "behavior": "Loads a button from the `All Buttons` or `ButtonGroups` based on what `type` is provided in the props",
      "exists": "No",
      "package": "No",
      "schema": [
        {
          "name": "type",
          "type": "string",
          "description": "The button to show"
        },
        {
          "name": "isActive",
          "type": "bool",
          "description": "Whether or not the button should be `active` (e.g. if the highlight text is bold, and this button is the [bold] button, then active would be `true`)"
        },
        {
          "name": "action",
          "type": "string",
          "description": "The type prop in upper case.  Represents the constant that Draft.js uses to indicate the action to perform to the content editable element. For example if type is `bold`, action is `BOLD`, meaning the `BOLD` action will be triggered against the constant editable when the button is clicked"
        },
        {
          "name": "onToggle",
          "type": "() => void",
          "description": "Triggers when the button is clicked. Accepts a payload that represents the content editable function it should perform. Recommended action is to let it perform the draft.js onToggle event, which will perform the content editable function"
        }
      ],
      "tests": [
        {
          "it": "Should trigger the onToggle event when the button is clicked",
          "type": "Integration"
        },
        {
          "it": "Should trigger a DraftJs contenteditable action that matches the `action` prop when the button is clicked",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onInlineControlButtonRender` plugin hook when the InlineControlButton is being rendered",
          "type": "Integration"
        },
        {
          "it": "Should trigger the `onInlineControlButtonToggle` plugin hook when the inline control button is clicked",
          "type": "Integration"
        },
        {
          "it": "Should render a `Settings` button in the dom when the type prop is `settings`",
          "type": "Integration"
        },
        {
          "it": "Should render a `Duplicate` button in the dom when the type prop is `duplicate`",
          "type": "Integration"
        },
        {
          "it": "Should render a `Delete` button in the dom when the type prop is `delete`",
          "type": "Integration"
        },
        {
          "it": "Should render a `Close` button in the dom when the type prop is `close`",
          "type": "Integration"
        },
        {
          "it": "Should render a `Color` button in the dom when the type prop is `color`",
          "type": "Integration"
        },
        {
          "it": "Should render a `Upload` button in the dom when the type prop is `upload`",
          "type": "Integration"
        },
        {
          "it": "Should render a `Spacer` button in the dom when the type prop is `spacer`",
          "type": "Integration"
        },
        {
          "it": "Should render a `Bold` button in the dom when the type prop is `bold`",
          "type": "Integration"
        },
        {
          "it": "Should render a `Italic` button in the dom when the type prop is `italic`",
          "type": "Integration"
        },
        {
          "it": "Should render a `Underline` button in the dom when the type prop is `underline`",
          "type": "Integration"
        },
        {
          "it": "Should render a `TextStyle` button in the dom when the type prop is `textStyle`",
          "type": "Integration"
        },
        {
          "it": "Should render a `TextAlign` button in the dom when the type prop is `textAlign`",
          "type": "Integration"
        },
        {
          "it": "Should render a `TextAlignLeft` button in the dom when the type prop is `textAlignLeft`",
          "type": "Integration"
        },
        {
          "it": "Should render a `TextAlignRight` button in the dom when the type prop is `textAlignRight`",
          "type": "Integration"
        },
        {
          "it": "Should render a `TextAlignCenter` button in the dom when the type prop is `textAlignCenter`",
          "type": "Integration"
        },
        {
          "it": "Should render a `Link` button in the dom when the type prop is `link`",
          "type": "Integration"
        },
        {
          "it": "Should render a `List` button in the dom when the type prop is `list`",
          "type": "Integration"
        },
        {
          "it": "Should render a `ListBullet` button in the dom when the type prop is `listBullet`",
          "type": "Integration"
        },
        {
          "it": "Should render a `ListNumbers` button in the dom when the type prop is `listNumbers`",
          "type": "Integration"
        },
        {
          "it": "Should render a `ObjAlignLeft` button in the dom when the type prop is `objAlignLeft`",
          "type": "Integration"
        },
        {
          "it": "Should render a `ObjAlignRight` button in the dom when the type prop is `objAlignRight`",
          "type": "Integration"
        },
        {
          "it": "Should render a `ObjAlignCenter` button in the dom when the type prop is `objAlignCenter`",
          "type": "Integration"
        },
        {
          "it": "Should render a `ButtonAlignGroup` button in the dom when the type prop is `textAlignGroup`",
          "type": "Integration"
        },
        {
          "it": "Should render a `ButtonLinkGroup` button in the dom when the type prop is `linkGroup`",
          "type": "Integration"
        },
        {
          "it": "Should render a `ButtonColorGroup` button in the dom when the type prop is `colorGroup`",
          "type": "Integration"
        },
        {
          "it": "Should render a `ButtonFontGroup` button in the dom when the type prop is `fontGroup`",
          "type": "Integration"
        },
        {
          "it": "Should render a `Custom` button in the dom when the type prop is not recognized",
          "type": "Integration"
        }
      ]
    },
    {
      "name": "ItemLegend",
      "description": "A `table of contents` for the web page.",
      "behaviors": "Shows a list of all the current editor items. Letting you navigate between page elements from a `birds-eye-view`",
      "exists": "No",
      "package": "No",
      "schema": [
        {
          "schema_type": "prop",
          "name": "isCollapsed",
          "type": "bool",
          "description": "Whether or not the big legend is showing or not",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "title",
          "type": "string",
          "description": "The title/caption that shows as the title of the item legend",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "tabs",
          "type": "array",
          "description": "{ id, component, itemComponent, label, filterOut, filterOnly }",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "canReorder",
          "type": "bool",
          "description": "Whether or not re-ordering the items in the legend is enabled or not",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "showNesting",
          "type": "bool",
          "description": "Whether or not the list should show how the items are nested (e.g. should containers as uncollapsed, then show the objects inside the container indented)",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "showCloseButton",
          "type": "bool",
          "description": "Whether or not a close button is showing",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "onClose",
          "type": "() => void",
          "description": "Triggers when the item legend is closed",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "onReorder",
          "type": "() => void",
          "description": "Triggers when an item in the legend is re-ordered",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "onItemSelect",
          "type": "() => void",
          "description": "Triggers when an item in the legend is selected",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "onItemDoubleClick",
          "type": "() => void",
          "description": "Triggers when an item in the legend is double clicked",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "onItemChange",
          "type": "() => void",
          "description": "Triggers when an item in the legend has changed",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "onItemMouseEnter",
          "type": "() => void",
          "description": "Triggers when the mouse enters an item in the legend",
          "required": true,
          "public": false
        },
        {
          "schema_type": "prop",
          "name": "onItemMouseLeave",
          "type": "() => void",
          "description": "Triggers when the mouse leaves an item in the legend",
          "required": true,
          "public": false
        }
      ],
      "tests": [
        {
          "it": "Should be able to see all my page objects and sections in a legend, where i can show/hide and re-order",
          "type": "Integration"
        },
        {
          "it": "Should (in addition to the editor) be able to reorder my page elements from a simple list",
          "type": "Integration"
        },
        {
          "it": "Should (in addition to on the editor) be able to delete elements from a simple list",
          "type": "Integration"
        },
        {
          "it": "Should be able to access the page elements properties from the simple components list (double-click)",
          "type": "Integration"
        },
        {
          "it": "Should be able to Double-click to change the name",
          "type": "Integration"
        }
      ]
    },
    {
      "name": "ComponentSelector",
      "description": "Shows a (filtered) list of the current components on the page",
      "behaviors": "",
      "exists": "No",
      "package": "No",
      "schema": [
        {
          "name": "filterOut",
          "type": "array",
          "description": "An array of components NOT to show. e.g. `filterOut={[[`type`, `Body`]]}`",
          "required": true,
          "public": false
        },
        {
          "name": "filterOnly",
          "type": "array",
          "description": "An array of components ONLY to show. e.g. `filterOnly={[[`canHaveChildren`, true]]}`. ^^ This is useful for showing only blocks, etc.",
          "required": true,
          "public": false
        },
        {
          "name": "label",
          "type": "string",
          "description": "The label to show for the dropdown menu",
          "required": true,
          "public": false
        },
        {
          "name": "onChange",
          "type": "() => void",
          "description": "Triggers when an item is clicked",
          "required": true,
          "public": false
        }
      ],
      "tests": [
        {
          "it": "Should render the component in the dom",
          "type": "Integraiton"
        },
        {
          "it": "Should render a list of components extracted from the content of the page",
          "type": "Integraiton"
        },
        {
          "it": "Should filter out any items from the list of editor items based on the filterOut prop that matches the [key, value] pattern (e.g. ['type', 'Body'])",
          "type": "Integraiton"
        },
        {
          "it": "Should only show a list of editor items that match what's in the filterOnly prop where the filter matches the [key, value] pattern (e.g. ['canHaveChildren', true])",
          "type": "Integraiton"
        },
        {
          "it": "Should show a placeholder in the dropdown menu that matches the provided label prop",
          "type": "Integraiton"
        },
        {
          "it": "Should highlight the actual page object when mouse hovers over the item",
          "type": "Integraiton"
        },
        {
          "it": "Should render an icon next to each item in the list",
          "type": "Integraiton"
        },
        {
          "it": "Should trigger the onChange() event when an item is clicked",
          "type": "Integraiton"
        },
        {
          "it": "Should trigger the `onComponentSelectorMenuList` plugin hook when the list to show is being generated",
          "type": "Integraiton"
        },
        {
          "it": "Should trigger the `onComponentSelected` plugin hook when an item is selected",
          "type": "Integraiton"
        },
        {
          "it": "Should trigger the `onComponentSelectorRender` the ComponentSelector is rendering",
          "type": "Integraiton"
        }
      ]
    }
  ]
}
