/*
 * 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.
 */

.text-editor {
    position: relative;

    overflow: hidden;
}

.text-editor > .CodeMirror {
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
    height: auto;
}

.text-editor > .CodeMirror .has-breakpoint:not(.breakpoint-disabled) .CodeMirror-linenumber {
    color: white;
}

.text-editor > .CodeMirror .has-breakpoint.multiple-breakpoints .CodeMirror-linenumber {
    color: transparent;
}

.text-editor > .CodeMirror .has-breakpoint .CodeMirror-linenumber::before {
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: -7px;

    content: "";

    z-index: -2;

    border-image-source: image-set(url(../Images/BreakpointInactive.png) 1x, url(../Images/BreakpointInactive@2x.png) 2x);
    border-image-slice: 3 7 3 3 fill;
    border-width: 3px 7px 3px 3px;
}

.text-editor > .CodeMirror .breakpoint-resolved .CodeMirror-linenumber::before {
    border-image-source: image-set(url(../Images/Breakpoint.png) 1x, url(../Images/Breakpoint@2x.png) 2x);
}

.text-editor > .CodeMirror .breakpoint-auto-continue:not(.breakpoint-disabled) .CodeMirror-linenumber::before {
    opacity: 0.6;
}

.text-editor > .CodeMirror .breakpoint-disabled .CodeMirror-linenumber::before {
    opacity: 0.35;
}

.text-editor > .CodeMirror .has-breakpoint.multiple-breakpoints .CodeMirror-linenumber::before {
    content: "•••";
    color: white;
    line-height: 6px;
    text-align: center;
    text-indent: -1px;
}

.text-editor > .CodeMirror .execution-line.primary .CodeMirror-linenumber::after {
    position: absolute;
    top: 0;
    bottom: 0;
    right: -9px;
    width: 9px;

    content: "";

    z-index: -1;

    background-image: image-set(url(../Images/InstructionPointer.png) 1x, url(../Images/InstructionPointer@2x.png) 2x);
    background-size: 9px 100%;
    background-repeat: no-repeat;
}

.text-editor > .CodeMirror .execution-line {
    background-color: hsla(99, 38%, 86%, 0.5) !important;
}

.text-editor > .CodeMirror .execution-line .CodeMirror-matchingbracket {
    background-color: hsla(90, 30%, 82%, 0.7);
    border-bottom: 1px dotted hsl(78, 18%, 58%);
}

.text-editor > .CodeMirror .execution-range-highlight:not(.CodeMirror-selectedtext),
.text-editor > .CodeMirror .execution-range-highlight:not(.CodeMirror-selectedtext) + .CodeMirror-widget {
    background-color: hsl(90, 30%, 82%);
}

.text-editor > .CodeMirror .highlighted {
    animation: "text-editor-highlight-fadeout" 2s;
}

@keyframes text-editor-highlight-fadeout {
    from { background-color: highlight; }
}

.text-editor > .CodeMirror .hovered-expression-highlight {
    animation: "text-editor-hovered-expression-highlight-fadeout" 2s;
    background-color: hsla(0, 0%, 0%, 0.1);
}

@keyframes text-editor-hovered-expression-highlight-fadeout {
    from { background-color: highlight; }
    to { background-color: hsla(0, 0%, 0%, 0.1); }
}
