/*
 * 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 5;
    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;
}
