/*
 * Copyright (C) 2011 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * 1. Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC.
 * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

:host {
    overflow: hidden;
}

.shadow-split-widget {
    display: flex;
    overflow: hidden;
}

.shadow-split-widget-contents {
    display: flex;
    position: relative;
    flex-direction: column;
    contain: layout size style;
}

.shadow-split-widget-sidebar {
    flex: none;
}

.shadow-split-widget-main, .shadow-split-widget-sidebar.maximized {
    flex: auto;
}

.shadow-split-widget.hbox > .shadow-split-widget-resizer {
    position: absolute;
    top: 0;
    bottom: 0;
    width: 6px;
    z-index: 500;
}

.shadow-split-widget.vbox > .shadow-split-widget-resizer {
    position: absolute;
    left: 0;
    right: 0;
    height: 6px;
    z-index: 500;
}

.shadow-split-widget.hbox.shadow-split-widget-first-is-sidebar {
    flex-direction: row-reverse !important;
}

.shadow-split-widget.vbox.shadow-split-widget-first-is-sidebar {
    flex-direction: column-reverse !important;
}

.shadow-split-widget-resizer-border {
    pointer-events: none;
}

.shadow-split-widget.vbox > .shadow-split-widget-sidebar.no-default-splitter {
    border: 0 !important;
}

.shadow-split-widget.vbox > .shadow-split-widget-sidebar:not(.maximized) {
    border: 0;
    border-top: 1px solid var(--divider-color);
}

.shadow-split-widget.vbox.shadow-split-widget-first-is-sidebar > .shadow-split-widget-sidebar:not(.maximized) {
    border: 0;
    border-bottom: 1px solid var(--divider-color);
}

.shadow-split-widget.hbox > .shadow-split-widget-sidebar:not(.maximized) {
    border: 0;
    border-left: 1px solid var(--divider-color);
}

.shadow-split-widget.hbox.shadow-split-widget-first-is-sidebar > .shadow-split-widget-sidebar:not(.maximized) {
    border: 0;
    border-right: 1px solid var(--divider-color);
}
