| /* |
| * Copyright 2016-present Open Networking Laboratory |
| * |
| * 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 (theme) -- CSS file |
| */ |
| |
| /* --- Base SVG Layer --- */ |
| |
| #ov-topo svg { |
| background-color: #f4f4f4; |
| } |
| |
| /* --- "No Devices" Layer --- */ |
| |
| #ov-topo svg .noDevsBird { |
| fill: #db7773; |
| } |
| |
| #ov-topo svg #topo-noDevsLayer text { |
| fill: #7e9aa8; |
| } |
| |
| /* --- Topo Map --- */ |
| |
| #ov-topo svg #topo-map { |
| stroke-width: 2px; |
| stroke: #f4f4f4; |
| fill: #e5e5e6; |
| } |
| |
| /* --- general topo-panel styling --- */ |
| |
| .topo-p svg .glyph { |
| fill: #222; |
| } |
| |
| .topo-p svg .glyph.overlay { |
| fill: #fff; |
| } |
| |
| .topo-p h2 { |
| color: black; |
| } |
| |
| .topo-p h3 { |
| color: black; |
| } |
| |
| .topo-p td.label { |
| /* works for both light and dark themes ... */ |
| color: #777; |
| } |
| .topo-p td.value { |
| } |
| |
| .topo-p hr { |
| background-color: #ccc; |
| color: #ccc; |
| } |
| |
| /* --- Topo Instance Panel --- */ |
| |
| #topo-p-instance svg rect { |
| stroke-width: 0; |
| fill: #fbfbfb; |
| } |
| |
| /* body of an instance */ |
| #topo-p-instance .online svg rect { |
| opacity: 1; |
| fill: #fbfbfb; |
| } |
| |
| #topo-p-instance svg .glyph { |
| fill: #fff; |
| } |
| #topo-p-instance .online svg .glyph { |
| fill: #fff; |
| } |
| |
| |
| /* offline */ |
| #topo-p-instance svg .badgeIcon { |
| opacity: 0.4; |
| fill: #939598; |
| } |
| |
| /* online */ |
| #topo-p-instance .online svg .badgeIcon { |
| opacity: 1.0; |
| fill: #939598; |
| } |
| #topo-p-instance .online svg .badgeIcon.bird { |
| fill: #ffffff; |
| } |
| |
| #topo-p-instance svg .readyBadge { |
| visibility: hidden; |
| } |
| #topo-p-instance .ready svg .readyBadge { |
| visibility: visible; |
| } |
| |
| #topo-p-instance svg text { |
| text-anchor: left; |
| opacity: 0.5; |
| fill: #3c3a3a; |
| } |
| |
| #topo-p-instance .online svg text { |
| opacity: 1.0; |
| fill: #3c3a3a; |
| } |
| |
| #topo-p-instance .onosInst.mastership { |
| opacity: 0.3; |
| } |
| #topo-p-instance .onosInst.mastership.affinity { |
| opacity: 1.0; |
| } |
| #topo-p-instance .onosInst.mastership.affinity svg rect { |
| filter: url(#blue-glow); |
| } |
| |
| .firefox #topo-p-instance .onosInst.mastership.affinity svg rect { |
| filter: url("data:image/svg+xml;utf8, <svg xmlns = \'http://www.w3.org/2000/svg\'><filter x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\" id=\"blue-glow\"><feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0 0 0 1 0 \"></feColorMatrix><feGaussianBlur stdDeviation=\"3\" result=\"coloredBlur\"></feGaussianBlur><feMerge><feMergeNode in=\"coloredBlur\"></feMergeNode><feMergeNode in=\"SourceGraphic\"></feMergeNode></feMerge></filter></svg>#blue-glow"); |
| } |
| |
| /* --- Topo Nodes --- */ |
| |
| #ov-topo svg .suppressed { |
| opacity: 0.5 !important; |
| } |
| |
| #ov-topo svg .suppressedmax { |
| opacity: 0.2 !important; |
| } |
| |
| #ov-topo svg .node.selected rect, |
| #ov-topo svg .node.selected circle { |
| fill: #f90; |
| filter: url(#blue-glow); |
| } |
| .firefox #ov-topo svg .node.selected rect, |
| .firefox #ov-topo svg .node.selected circle { |
| filter: url("data:image/svg+xml;utf8, <svg xmlns = \'http://www.w3.org/2000/svg\'><filter x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\" id=\"blue-glow\"><feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0 0 0 1 0 \"></feColorMatrix><feGaussianBlur stdDeviation=\"3\" result=\"coloredBlur\"></feGaussianBlur><feMerge><feMergeNode in=\"coloredBlur\"></feMergeNode><feMergeNode in=\"SourceGraphic\"></feMergeNode></feMerge></filter></svg>#blue-glow"); |
| } |
| |
| /* Device Nodes */ |
| |
| /* note: device without the 'online' class is offline */ |
| #ov-topo svg .node.device rect { |
| /* TODO: theme */ |
| fill: #f0f0f0; |
| } |
| #ov-topo svg .node.device text { |
| /*TODO: theme*/ |
| fill: #bbb; |
| } |
| #ov-topo svg .node.device use { |
| /*TODO: theme*/ |
| fill: #777; |
| } |
| |
| |
| #ov-topo svg .node.device.online rect { |
| fill: #ffffff; |
| } |
| #ov-topo svg .node.device.online text { |
| fill: #3c3a3a; |
| } |
| #ov-topo svg .node.device.online use { |
| /* NOTE: this gets overridden programatically */ |
| fill: #454545; |
| } |
| |
| |
| #ov-topo svg .node.device.selected rect { |
| fill: #f90; |
| } |
| |
| /* Badges */ |
| /* (... works for bothand dark themes...) */ |
| #ov-topo svg .node .badge circle { |
| stroke: #aaa; |
| } |
| |
| #ov-topo svg .node .badge.badgeInfo circle { |
| fill: #99d; |
| } |
| |
| #ov-topo svg .node .badge.badgeWarn circle { |
| fill: #da2; |
| } |
| |
| #ov-topo svg .node .badge.badgeError circle { |
| fill: #e44; |
| } |
| |
| #ov-topo svg .node .badge use { |
| fill: white !important; |
| } |
| |
| #ov-topo svg .node .badge.badgeInfo use { |
| fill: #448; |
| } |
| |
| #ov-topo svg .node .badge text { |
| fill: white !important; |
| } |
| |
| #ov-topo svg .node .badge.badgeInfo text { |
| fill: #448; |
| } |
| |
| /* Host Nodes */ |
| |
| #ov-topo svg .node.host { |
| } |
| |
| #ov-topo svg .node.host text { |
| stroke: none; |
| font: 9pt sans-serif; |
| fill: #846; |
| } |
| |
| svg .node.host circle { |
| stroke: #a3a596; |
| fill: #e0dfd6; |
| } |
| |
| svg .node.host .svgIcon { |
| fill: #444; |
| } |
| |
| /* --- Topo Links --- */ |
| |
| #ov-topo svg .link { |
| opacity: .9; |
| } |
| |
| #ov-topo svg .link.selected, |
| #ov-topo svg .link.enhanced { |
| stroke-width: 4.5px; |
| filter: url(#blue-glow); |
| } |
| .firefox #ov-topo svg .link.selected, |
| .firefox #ov-topo svg .link.enhanced { |
| filter: url("data:image/svg+xml;utf8, <svg xmlns = \'http://www.w3.org/2000/svg\'><filter x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\" id=\"blue-glow\"><feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0 0 0 1 0 \"></feColorMatrix><feGaussianBlur stdDeviation=\"3\" result=\"coloredBlur\"></feGaussianBlur><feMerge><feMergeNode in=\"coloredBlur\"></feMergeNode><feMergeNode in=\"SourceGraphic\"></feMergeNode></feMerge></filter></svg>#blue-glow"); |
| } |
| |
| #ov-topo svg .link.inactive { |
| opacity: .5; |
| stroke-dasharray: 8 4; |
| } |
| /* TODO: Review for not-permitted links */ |
| #ov-topo svg .link.not-permitted { |
| stroke: rgb(255,0,0); |
| stroke-width: 5.0; |
| stroke-dasharray: 8 4; |
| } |
| |
| #ov-topo svg .link.secondary { |
| stroke-width: 3px; |
| stroke: rgba(0,153,51,0.5); |
| } |
| |
| /* Port traffic color visualization for Kbps, Mbps, and Gbps */ |
| |
| #ov-topo svg .link.secondary.port-traffic-Kbps { |
| stroke: rgb(0,153,51); |
| stroke-width: 5.0; |
| } |
| |
| #ov-topo svg .link.secondary.port-traffic-Mbps { |
| stroke: rgb(128,145,27); |
| stroke-width: 6.5; |
| } |
| |
| #ov-topo svg .link.secondary.port-traffic-Gbps { |
| stroke: rgb(255, 137, 3); |
| stroke-width: 8.0; |
| } |
| |
| #ov-topo svg .link.secondary.port-traffic-Gbps-choked { |
| stroke: rgb(183, 30, 21); |
| stroke-width: 8.0; |
| } |
| |
| |
| |
| #ov-topo svg .link.animated { |
| stroke-dasharray: 8 5; |
| animation: ants 5s infinite linear; |
| /* below line will be added via Javascript based on path */ |
| /*animation-direction: reverse;*/ |
| } |
| @keyframes ants { |
| from { |
| stroke-dashoffset: 0; |
| } |
| to { |
| stroke-dashoffset: 400; |
| } |
| } |
| |
| #ov-topo svg .link.primary { |
| stroke-width: 4px; |
| stroke: #ffA300; |
| } |
| |
| #ov-topo svg .link.secondary.optical { |
| stroke-width: 4px; |
| stroke: rgba(128,64,255,0.5); |
| } |
| |
| #ov-topo svg .link.primary.optical { |
| stroke-width: 6px; |
| stroke: #74f; |
| } |
| |
| /* Link Labels */ |
| #ov-topo svg .linkLabel rect { |
| stroke: none; |
| fill: #eee; |
| } |
| |
| #ov-topo svg .linkLabel text { |
| fill: #444; |
| } |
| |
| /* Port Labels */ |
| |
| #ov-topo svg .portLabel rect { |
| stroke: none; |
| fill: #eee; |
| } |
| |
| #ov-topo svg .portLabel text { |
| fill: #444; |
| } |
| |
| /* Number of Links Labels */ |
| |
| |
| #ov-topo text.numLinkText { |
| fill: #444; |
| } |
| |
| /* ------------------------------------------------- */ |
| /* Sprite Layer */ |
| |
| #ov-topo svg #topo-sprites .gold1 use { |
| stroke: #fda; |
| fill: none; |
| } |
| #ov-topo svg #topo-sprites .gold1 text { |
| fill: #eda; |
| } |
| |
| #ov-topo svg #topo-sprites .blue1 use { |
| stroke: #bbd; |
| fill: none; |
| } |
| #ov-topo svg #topo-sprites .blue1 text { |
| fill: #cce; |
| } |
| |
| #ov-topo svg #topo-sprites .gray1 use { |
| stroke: #ccc; |
| fill: none; |
| } |
| #ov-topo svg #topo-sprites .gray1 text { |
| fill: #ddd; |
| } |
| |
| /* fills */ |
| #ov-topo svg #topo-sprites use.fill-gray2 { |
| fill: #eee; |
| } |
| |
| #ov-topo svg #topo-sprites use.fill-blue2 { |
| fill: #bce; |
| } |