/*
 * Copyright (C) 2018 Apple 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 APPLE 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 APPLE 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.
 */

.tree-outline .item.audit > .status {
    display: flex;
    align-items: center;
    width: 16px;
    height: 16px;
}

.tree-outline .item.audit > .status > img {
    width: 100%;
    height: 100%;
}

.tree-outline .item.audit:matches(.test-case, .test-group):not(.unsupported, .manager-active) > .status:hover > img {
    width: 75%;
    height: 75%;
    margin: 0 auto;
    content: url(../Images/AuditStart.svg) !important;
}

.tree-outline .item.audit > .status:not(:hover) > img.show-on-hover,
.tree-outline .item.audit.test-group.expanded:not(.unsupported, .editing-audits) > .status:not(:hover) {
    opacity: 0;
}

.tree-outline .item.audit.manager-active > .status > img.show-on-hover,
.tree-outline .item.audit.test-group.expanded:not(.editing-audits) > .status:hover > :not(img),
.tree-outline .item.audit.test-group-result.expanded > .status,
.tree-outline .item.audit.unsupported + .children .item.audit.unsupported  > .status > img {
    display: none;
}

.tree-outline .item.audit.unsupported:not(.selected) > :matches(.icon, .titles) {
    opacity: 0.5;
}

.tree-outline .item.audit.unsupported > .status > img {
    width: 75%;
    height: 75%;
    margin: 0 auto;
    content: url(../Images/Warning.svg);
}

.tree-outline .item.audit > .status > img.pass {
    content: url(../Images/AuditTestPass.svg);
}

.tree-outline .item.audit > .status > img.warn {
    content: url(../Images/AuditTestWarn.svg);
}

.tree-outline .item.audit > .status > img.fail {
    content: url(../Images/AuditTestFail.svg);
}

.tree-outline .item.audit > .status > img.error {
    content: url(../Images/AuditTestError.svg);
}

.tree-outline .item.audit > .status > img.unsupported {
    content: url(../Images/AuditTestUnsupported.svg);
}

.audit.test-case .icon {
    content: url(../Images/AuditTestCase.svg);
}

.audit.test-group .icon {
    content: url(../Images/AuditTestGroup.svg);
}

.audit.test-case-result .icon {
    content: url(../Images/AuditTestCaseResult.svg);
}

.audit.test-group-result .icon {
    content: url(../Images/AuditTestGroupResult.svg);
}
