/*
 * Copyright 2018-present Open Networking Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


/*
 ONOS GUI -- Topology View (forces link svg) -- CSS file
 */
/* --- Topo Links --- */
line {
    stroke: #888888;
    stroke-width: 2px;
}

.link {
    opacity: .9;
}

.link.selected {
    stroke: #009fdb;
}
.link.enhanced {
    stroke: #009fdb;
    stroke-width: 4px;
    cursor: pointer;
}

.link.inactive {
    opacity: .5;
    stroke-dasharray: 4 2;
}
/* TODO: Review for not-permitted links */
.link.not-permitted {
    stroke: rgb(255,0,0);
    stroke-dasharray: 8 4;
}

.link.secondary {
    stroke: rgba(0,153,51,0.5);
}

.link.secondary.port-traffic-green {
    stroke: rgb(0,153,51);
}

.link.secondary.port-traffic-yellow {
    stroke: rgb(128,145,27);
}

.link.secondary.port-traffic-orange {
    stroke: rgb(255, 137, 3);
}

.link.secondary.port-traffic-red {
    stroke: rgb(183, 30, 21);
}

/* Port traffic color visualization for Kbps, Mbps, and Gbps */

.link.secondary.port-traffic-Kbps {
    stroke: rgb(0,153,51);
}

.link.secondary.port-traffic-Mbps {
    stroke: rgb(128,145,27);
}

.link.secondary.port-traffic-Gbps {
    stroke: rgb(255, 137, 3);
}

.link.secondary.port-traffic-Gbps-choked {
    stroke: rgb(183, 30, 21);
}

.link.animated {
    stroke-dasharray: 8;
    animation: ants 5s infinite linear;
    /* below line could be added via Javascript, based on path, if we cared
     * enough about the direction of ant-flow
     */
    /*animation-direction: reverse;*/
}
@keyframes ants {
    from {
        stroke-dashoffset: 0;
    }
    to {
        stroke-dashoffset: 400;
    }
}

.link.primary {
    stroke-width: 4px;
    stroke: #ffA300;
}

.link.secondary.optical {
    stroke-width: 4px;
    stroke: rgba(128,64,255,0.5);
}

.link.primary.optical {
    stroke-width: 6px;
    stroke: #74f;
}

/* Link Labels */
.linkLabel rect {
    stroke: none;
    fill: #ffffff;
}

.linkLabel text {
    fill: #444;
    text-anchor: middle;
}


/* Port Labels */
.portLabel rect {
    stroke: #a3a596;
    fill: #ffffff;
}

.portLabel {
    fill: #444;
    alignment-baseline: middle;
    dominant-baseline: middle;
}

/* Number of Links Labels */


#ov-topo2 text.numLinkText {
    fill: #444;
}
