/*
 * Copyright (C) 2013 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.
 */

.call-frame {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    cursor: pointer;
}

.call-frame .icon {
    display: inline-block;
    vertical-align: top;
    width: 16px;
    height: 16px;
    -webkit-margin-end: 3px;
}

.call-frame .titles {
    display: inline-block;
}

.call-frame .subtitle,
.call-frame .subtitle .source-link {
    color: hsla(0, 0%, 0%, 0.6);
    text-decoration: none;
}

.call-frame:hover .subtitle .source-link,
.call-frame:focus .subtitle .source-link {
    color: hsl(210, 0%, 0%);
}

.call-frame .subtitle:empty {
    display: none;
}

.call-frame .subtitle {
    font-size: inherit;
}

.call-frame .colon {
    background-color: red;
}

.call-frame .separator {
    white-space: nowrap;
    color: hsla(0, 0%, 0%, 0.2);
}

@media (prefers-color-scheme: dark) {
    .call-frame .subtitle,
    .call-frame .subtitle .source-link {
        color: hsla(0, 0%, var(--foreground-lightness), 0.6);
    }

    .call-frame:hover .subtitle .source-link,
    .call-frame:focus .subtitle .source-link {
        color: hsl(0, 0%, var(--foreground-lightness));
    }

    .call-frame .separator {
        color: hsla(0, 0%, var(--foreground-lightness), 0.2);
    }
}
