`viewport` - a callback function that is used to determine whether a given view should be shown in an `async` paper. If the function returns `true`, the view is attached to the DOM; if it returns `false`, the view is detached from the DOM. The callback function is provided with three arguments:

view | mvc.View | The view in question
isDetached | boolean | Is the view currently hidden from the paper?
paper | dia.Paper | This paper (for context)

This function is meant to support hiding of views when they are outside the viewport. In most situations, it is unnecessary to render DOM elements that are not visible by the user; removing those elements from the DOM dramatically improves rendering times of huge graphs (thousands of views) and improves smoothness of user interaction. (If you do need to show a view that falls outside of this viewport, you can manually force the view to be shown using `paper.requireView()`. If you need to show views according to a different viewport function, use `paper.checkViewport()`. If you need to force all views to be shown, use `paper.dumpViews()`.)

Example usage:

    var viewportRect = new g.Rect(0, 0, 600, 400);
    var graph = new joint.dia.Graph();
    var paper = new joint.dia.Paper({
        model: graph,
        async: true,
        viewport: function(view) {
            var model = view.model;
            var bbox = model.getBBox();
            if (model.isLink()) {
                // vertical/horizontal links have zero width/height
                // we need to manually inflate the bounding box
                bbox.inflate(1);
            }
            // Return true if there is an intersection
            // Return true if bbox is within viewportRect
            return viewportRect.intersect(bbox);
        }
    });

The `viewport` function can also be used to support collapsing/uncollapsing behavior:

    var graph = new joint.dia.Graph();
    var paper = new joint.dia.Paper({
        model: graph,
        async: true,
        viewport: function(view) {
            // Return true if model is not hidden
            return !model.get('hidden');
        }
    });

    paper.on('element:pointerclick', function(view, evt) {
        evt.stopPropagation();
        toggleBranch(view.model);
    });

    function toggleBranch(root) {
        var shouldHide = !root.get('collapsed');
        root.set('collapsed', shouldHide);
        graph.getSuccessors(root).forEach(function(successor) {
            successor.set('hidden', shouldHide);
            successor.set('collapsed', false);
        });
    }