First pass at svg icons and dark theme for topo
Have not addressed top bar etc
Change-Id: I0cc47a1f500bd9d8589eeaf8042f21ec4c8e6cbe
diff --git a/web/gui/src/main/webapp/icons.svg b/web/gui/src/main/webapp/icons.svg
new file mode 100644
index 0000000..524594b
--- /dev/null
+++ b/web/gui/src/main/webapp/icons.svg
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg">
+ <symbol id="switch">
+ <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1" transform="translate(-344.44812,-517.03149)">
+ <path d="m 389.9165,532.15849 -44.64875,0 0,14.495 44.64875,0 0,-14.495 z" id="path24009" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:currentColor;stroke-width:0.40000001"/>
+ <g id="g24011" transform="matrix(1.25,0,0,-1.25,345.15125,532.23224)">
+ <path d="m 0,0 14.428,11.694 33.33,0 L 35.779,0 0,0 z" id="path24013" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g24015" transform="matrix(1.25,0,0,-1.25,345.15125,532.23224)">
+ <path d="m 0,0 14.428,11.694 33.33,0 L 35.779,0 0,0 z" id="path24017" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g24019" transform="matrix(1.25,0,0,-1.25,389.8925,547.10962)">
+ <path d="M 0,0 11.932,12.892 11.939,23.575 0,11.919 0,0 z" id="path24021" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g24023" transform="matrix(1.25,0,0,-1.25,389.8925,547.10962)">
+ <path d="M 0,0 11.932,12.892 11.939,23.575 0,11.919 0,0 z" id="path24025" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g24027" transform="matrix(1.25,0,0,-1.25,371.32312,528.42974)">
+ <path d="m 0,0 -0.691,-0.568 -8.911,0 -0.886,-0.888 -2.414,1.052 4.853,1.389 L -8.906,0 0,0 z" id="path24029" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g24031" transform="matrix(1.25,0,0,-1.25,380.07312,522.96099)">
+ <path d="m 0,0 -0.691,-0.568 -8.911,0 -0.886,-0.888 -2.414,1.052 4.853,1.389 L -8.906,0 0,0 z" id="path24033" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g24035" transform="matrix(1.25,0,0,-1.25,373.28837,526.49738)">
+ <path d="m 0,0 0.691,0.569 8.913,0 L 10.49,1.456 12.904,0.405 8.049,-0.984 8.908,0 0,0 z" id="path24037" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g24039" transform="matrix(1.25,0,0,-1.25,379.06962,521.02863)">
+ <path d="m 0,0 0.691,0.569 8.913,0 L 10.49,1.456 12.904,0.405 8.049,-0.984 8.908,0 0,0 z" id="path24041" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ </g>
+ </symbol>
+ <symbol id="router">
+ <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1" transform="translate(-351.74132,-516.62992)">
+ <g id="g18775" transform="matrix(1.25,0,0,-1.25,397.99132,525.81444)">
+ <path d="m 0,0 c 0,-3.95 -8.235,-7.152 -18.393,-7.152 -10.158,0 -18.393,3.202 -18.393,7.152 l 0,-10.478 c 0,-3.948 8.235,-7.151 18.393,-7.151 10.158,0 18.393,3.203 18.393,7.151 L 0,0 z" id="path18777" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g18779" transform="matrix(1.25,0,0,-1.25,397.99132,525.81444)">
+ <path d="m 0,0 c 0,-3.95 -8.235,-7.152 -18.393,-7.152 -10.158,0 -18.393,3.202 -18.393,7.152 l 0,-10.478 c 0,-3.948 8.235,-7.151 18.393,-7.151 10.158,0 18.393,3.203 18.393,7.151 L 0,0 z" id="path18781" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g18783" transform="matrix(1.25,0,0,-1.25,374.99992,534.75492)">
+ <path d="m 0,0 c 10.158,0 18.393,3.202 18.393,7.152 0,3.952 -8.235,7.153 -18.393,7.153 -10.158,0 -18.393,-3.201 -18.393,-7.153 C -18.393,3.202 -10.158,0 0,0" id="path18785" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g18787" transform="matrix(1.25,0,0,-1.25,374.99992,534.75492)">
+ <path d="m 0,0 c 10.158,0 18.393,3.202 18.393,7.152 0,3.952 -8.235,7.153 -18.393,7.153 -10.158,0 -18.393,-3.201 -18.393,-7.153 C -18.393,3.202 -10.158,0 0,0 z" id="path18789" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g18791" transform="matrix(1.25,0,0,-1.25,369.75031,522.31831)">
+ <path d="m 0,0 1.518,-2.278 -5.742,-1.327 1.255,1.043 -8.875,1.518 2.227,1.669 8.563,-1.45 L 0,0 z" id="path18793" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g18795" transform="matrix(1.25,0,0,-1.25,379.85043,529.22393)">
+ <path d="M 0,0 -1.036,2.35 4.143,3.384 3.245,2.579 11.878,1.104 9.807,-0.553 1.225,1.06 0,0 z" id="path18797" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g18799" transform="matrix(1.25,0,0,-1.25,376.31043,520.76318)">
+ <path d="M 0,0 5.802,1.588 5.87,-0.898 4.42,-0.622 1.589,-2.972 -1.113,-2.576 1.809,-0.279 0,0 z" id="path18801" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g18803" transform="matrix(1.25,0,0,-1.25,373.20244,531.90095)">
+ <path d="M 0,0 -5.525,-1.035 -5.732,1.52 -4.144,1.175 -1.103,3.771 1.588,3.315 -1.658,0.483 0,0 z" id="path18805" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ </g>
+ </symbol>
+ <symbol id="roadm">
+ <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1" transform="translate(-352.14937,-517.55019)">
+ <g id="g23883" transform="matrix(1.25,0,0,-1.25,397.44718,526.34356)">
+ <path d="m 0,0 0,-9.5 -8.725,-6.977 -18.127,0 -9.064,6.977 0,9.5" id="path23885" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g23887" transform="matrix(1.25,0,0,-1.25,386.32906,517.78456)">
+ <path d="m 0,0 -17.787,0 -9.234,-6.847 9.064,-6.977 18.127,0 8.725,6.977 L 0,0 z" id="path23889" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g23891" transform="matrix(1.25,0,0,-1.25,386.32906,517.78456)">
+ <path d="m 0,0 -17.787,0 -9.234,-6.847 9.064,-6.977 18.127,0 8.725,6.977 L 0,0 z" id="path23893" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g23895" transform="matrix(1.25,0,0,-1.25,370.5857,523.05858)">
+ <path d="m 0,0 1.384,-2.076 -5.235,-1.21 1.145,0.952 -6.697,1.421 2.03,1.522 6.412,-1.361 L 0,0 z" id="path23897" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g23899" transform="matrix(1.25,0,0,-1.25,379.79093,529.35194)">
+ <path d="M 0,0 -0.945,2.14 3.777,3.084 2.959,2.351 9.951,1.152 8.064,-0.36 1.117,0.965 0,0 z" id="path23901" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g23903" transform="matrix(1.25,0,0,-1.25,377.03218,521.01569)">
+ <path d="M 0,0 5.289,1.448 5.352,-0.818 4.029,-0.566 1.449,-2.707 -1.014,-2.347 1.65,-0.255 0,0 z" id="path23905" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g23907" transform="matrix(1.25,0,0,-1.25,372.99894,532.36957)">
+ <path d="M 0,0 -5.037,-0.944 -5.224,1.385 -3.777,1.071 -1.006,3.44 1.447,3.023 -1.512,0.441 0,0 z" id="path23909" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g23911" transform="matrix(1.25,0,0,-1.25,386.49758,546.80069)">
+ <path d="M 0,0 0,9.389 M -18.25,0 l 0,9.389" id="path23913" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g25718" transform="matrix(1.25,0,0,-1.25,397.44718,526.34356)">
+ <path d="m 0,0 0,-9.5 -8.725,-6.977 -18.127,0 -9.064,6.977 0,9.5" id="path25720" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g25722" transform="matrix(1.25,0,0,-1.25,386.32906,517.78456)">
+ <path d="m 0,0 -17.787,0 -9.234,-6.847 9.064,-6.977 18.127,0 8.725,6.977 L 0,0 z" id="path25724" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g25726" transform="matrix(1.25,0,0,-1.25,386.32906,517.78456)">
+ <path d="m 0,0 -17.787,0 -9.234,-6.847 9.064,-6.977 18.127,0 8.725,6.977 L 0,0 z" id="path25728" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g25730" transform="matrix(1.25,0,0,-1.25,370.5857,523.05858)">
+ <path d="m 0,0 1.384,-2.076 -5.235,-1.21 1.145,0.952 -6.697,1.421 2.03,1.522 6.412,-1.361 L 0,0 z" id="path25732" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g25734" transform="matrix(1.25,0,0,-1.25,379.79093,529.35194)">
+ <path d="M 0,0 -0.945,2.14 3.777,3.084 2.959,2.351 9.951,1.152 8.064,-0.36 1.117,0.965 0,0 z" id="path25736" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g25738" transform="matrix(1.25,0,0,-1.25,377.03218,521.01569)">
+ <path d="M 0,0 5.289,1.448 5.352,-0.818 4.029,-0.566 1.449,-2.707 -1.014,-2.347 1.65,-0.255 0,0 z" id="path25740" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g25742" transform="matrix(1.25,0,0,-1.25,372.99894,532.36957)">
+ <path d="M 0,0 -5.037,-0.944 -5.224,1.385 -3.777,1.071 -1.006,3.44 1.447,3.023 -1.512,0.441 0,0 z" id="path25744" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g25746" transform="matrix(1.25,0,0,-1.25,386.49758,546.80069)">
+ <path d="M 0,0 0,9.389 M -18.25,0 l 0,9.389" id="path25748" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ </g>
+ </symbol>
+ <symbol id="endstation">
+ <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1" transform="translate(-361.79125,-513.72074)">
+ <g id="g19723" transform="matrix(1.25,0,0,-1.25,381.81625,520.11362)">
+ <path d="m 0,0 -15.82,0 0,-24.512 15.82,0" id="path19725" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g19727" transform="matrix(1.25,0,0,-1.25,381.81625,550.75074)">
+ <path d="m 0,0 4.914,4.912 0,24.512 -14.445,0 L -15.82,24.51 0,24.51 0,0 z" id="path19729" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g19731" transform="matrix(1.25,0,0,-1.25,381.81625,550.75074)">
+ <path d="m 0,0 4.914,4.912 0,24.512 -14.445,0 L -15.82,24.51 0,24.51 0,0 z" id="path19733" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g19735" transform="matrix(1.25,0,0,-1.25,381.81625,520.11362)">
+ <path d="M 0,0 4.914,4.914" id="path19737" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g19739" transform="matrix(1.25,0,0,-1.25,371.85774,520.11362)">
+ <path d="M 0,0 0,-24.512" id="path19741" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g19743" transform="matrix(1.25,0,0,-1.25,372.17024,520.11362)">
+ <path d="M 0,0 5.346,4.914" id="path19745" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <path d="m 379.91712,544.47137 -6.64125,0 0,4.0625 6.64125,0 0,-4.0625 z m -9.52375,0 -6.64125,0 0,4.0625 6.64125,0 0,-4.0625 z m 9.52375,-6.5625 -6.64125,0 0,4.0625 6.64125,0 0,-4.0625 z m -9.52375,0 -6.64125,0 0,4.0625 6.64125,0 0,-4.0625 z m 9.52375,-15 -6.64125,0 0,4.0625 6.64125,0 0,-4.0625 z m -9.52375,0 -6.64125,0 0,4.0625 6.64125,0 0,-4.0625 z m 1.7775,-2.795 6.68125,-6.1425" id="path19747" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ </symbol>
+ <symbol id="bgpSpeaker">
+ <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1" transform="translate(-355.47362,-514.96093)">
+ <path d="m 355.72362,519.29593 34.56875,0 0,30.2175 -34.56875,0 0,-30.2175 z" id="path5104" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ <path d="m 355.72362,519.29593 34.57,0 0,30.2175 -34.57,0 0,-30.2175 z" id="path5106" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ <g id="g5108" transform="matrix(1.25,0,0,-1.25,359.70763,515.2113)">
+ <path d="m 0,0 -3.187,-3.268 27.656,0 L 27.655,0 0,0 z" id="path5110" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g5112" transform="matrix(1.25,0,0,-1.25,359.70763,515.2113)">
+ <path d="m 0,0 -3.187,-3.268 27.656,0 L 27.655,0 0,0 z" id="path5114" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g5116" transform="matrix(1.25,0,0,-1.25,394.27674,545.42854)">
+ <path d="m 0,0 0,24.174 -3.186,-3.268 0,-24.174 L 0,0 z" id="path5118" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <path d="m 387.49987,522.07593 z m 6.77625,23.3525 0,-30.2175 -3.9825,4.085 0,30.2175 3.9825,-4.085 z" id="path5120" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ <g id="g5122" transform="matrix(1.25,0,0,-1.25,385.85025,531.2343)">
+ <path d="m 0,0 c 0,-2.152 -4.486,-3.896 -10.02,-3.896 -5.533,0 -10.019,1.744 -10.019,3.896 l 0,-5.707 c 0,-2.152 4.486,-3.897 10.019,-3.897 5.534,0 10.02,1.745 10.02,3.897 L 0,0 z" id="path5124" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g5126" transform="matrix(1.25,0,0,-1.25,385.85025,531.2343)">
+ <path d="m 0,0 c 0,-2.152 -4.486,-3.896 -10.02,-3.896 -5.533,0 -10.019,1.744 -10.019,3.896 l 0,-5.707 c 0,-2.152 4.486,-3.897 10.019,-3.897 5.534,0 10.02,1.745 10.02,3.897 L 0,0 z" id="path5128" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g5130" transform="matrix(1.25,0,0,-1.25,373.32524,536.10479)">
+ <path d="M 0,0 C 5.534,0 10.02,1.744 10.02,3.896 10.02,6.049 5.534,7.793 0,7.793 -5.533,7.793 -10.019,6.049 -10.019,3.896 -10.019,1.744 -5.533,0 0,0" id="path5132" inkscape:connector-curvature="0" style="fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g5134" transform="matrix(1.25,0,0,-1.25,373.32524,536.10479)">
+ <path d="M 0,0 C 5.534,0 10.02,1.744 10.02,3.896 10.02,6.049 5.534,7.793 0,7.793 -5.533,7.793 -10.019,6.049 -10.019,3.896 -10.019,1.744 -5.533,0 0,0 z" id="path5136" inkscape:connector-curvature="0" style="fill:none;stroke:currentColor;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ <g id="g5138" transform="matrix(1.25,0,0,-1.25,370.46387,529.32993)">
+ <path d="m 0,0 0.828,-1.241 -3.128,-0.723 0.683,0.569 -4.834,0.828 1.213,0.908 4.665,-0.79 L 0,0 z" id="path5140" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g5142" transform="matrix(1.25,0,0,-1.25,375.96798,533.09218)">
+ <path d="M 0,0 -0.565,1.279 2.257,1.844 1.767,1.404 6.47,0.602 5.341,-0.301 0.668,0.577 0,0 z" id="path5144" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g5146" transform="matrix(1.25,0,0,-1.25,374.03937,528.48281)">
+ <path d="M 0,0 3.16,0.865 3.198,-0.488 2.408,-0.339 0.865,-1.617 -0.606,-1.403 0.986,-0.151 0,0 z" id="path5148" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <g id="g5150" transform="matrix(1.25,0,0,-1.25,372.34687,534.54968)">
+ <path d="M 0,0 -3.01,-0.564 -3.123,0.828 -2.258,0.64 -0.601,2.055 0.865,1.807 -0.903,0.264 0,0 z" id="path5152" inkscape:connector-curvature="0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ </g>
+ </symbol>
+</svg>
\ No newline at end of file
diff --git a/web/gui/src/main/webapp/index2.html b/web/gui/src/main/webapp/index2.html
index ce09aab..24aeee3 100644
--- a/web/gui/src/main/webapp/index2.html
+++ b/web/gui/src/main/webapp/index2.html
@@ -40,12 +40,14 @@
<!-- Base library and framework stylesheets included here -->
<link rel="stylesheet" href="base.css">
<link rel="stylesheet" href="onos2.css">
+ <link rel="stylesheet" href="onos_theme.css">
<link rel="stylesheet" href="mast2.css">
<link rel="stylesheet" href="floatPanel.css">
<!-- This is where contributed stylesheets get INJECTED -->
<!-- TODO: replace with template marker and inject refs server-side -->
<link rel="stylesheet" href="topo2.css">
+ <link rel="stylesheet" href="topo_theme.css">
<link rel="stylesheet" href="webSockTrace.css">
@@ -56,7 +58,7 @@
<script src="onos2.js"></script>
</head>
-<body>
+<body class='theme_dark'>
<div id="frame">
<div id="mast">
<!-- NOTE: masthead injected here by mast.js -->
diff --git a/web/gui/src/main/webapp/onos_theme.css b/web/gui/src/main/webapp/onos_theme.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/web/gui/src/main/webapp/onos_theme.css
diff --git a/web/gui/src/main/webapp/topo2.css b/web/gui/src/main/webapp/topo2.css
index d14b966..7ee73c6 100644
--- a/web/gui/src/main/webapp/topo2.css
+++ b/web/gui/src/main/webapp/topo2.css
@@ -25,14 +25,11 @@
}
#topo #map {
- stroke-width: 2px;
- stroke: #aaaaaa;
fill: transparent;
}
#topo svg .glyph {
- fill: white;
stroke: none;
}
@@ -68,39 +65,20 @@
#topo svg .node.device.fixed rect {
stroke-width: 1.5;
- stroke: #ccc;
+}
+
+#topo .node text {
+ font-weight: 100;
}
/* note: device is offline without the 'online' class */
-#topo svg .node.device {
- fill: #777;
-}
-
-#topo svg .node.device.switch.online {
- fill: #17f;
-}
-
-#topo svg .node.device.roadm.online {
- fill: #03c;
-}
-
/* note: device is offline without the 'online' class */
#topo svg .node.device text {
- fill: #aaa;
font: 10pt sans-serif;
}
-#topo svg .node.device.online text {
- fill: white;
-}
-
-
/* Host Nodes */
-#topo svg .node.host {
- stroke: #000;
-}
-
#topo svg .node.host text {
fill: #846;
stroke: none;
@@ -127,29 +105,23 @@
}
#topo svg .link.primary {
- stroke: #f11;
stroke-width: 6px;
}
#topo svg .link.secondary {
- stroke: rgba(255,100,100,0.5);
stroke-width: 4px;
}
#topo svg .link.animated {
- stroke: #f11;
stroke-width: 10px;
stroke-dasharray: 8 8
}
#topo svg .link.primary.optical {
- stroke: #74f;
stroke-width: 6px;
}
#topo svg .link.secondary.optical {
- stroke: rgba(128,64,255,0.5);
stroke-width: 4px;
}
#topo svg .link.animated.optical {
- stroke: #74f;
stroke-width: 10px;
stroke-dasharray: 8 8
}
@@ -205,17 +177,13 @@
cursor: pointer;
width: 50%;
text-align: center;
-
- /* theme specific... */
- border: 1px solid #ddf;
- color: #99f;
+ border-width: 1px;
+ borer-style: solid;
}
#topo-detail .actionBtn:hover {
- /* theme specific... */
- border: 1px solid #ddf;
- background: #eef;
- color: #77d;
+ border-width: 1px;
+ border-style: solid;
}
@@ -239,29 +207,14 @@
height: 80px;
margin: 4px 0;
cursor: pointer;
-
- /* theme-related */
- color: #444;
- background-color: #ccc;
- border: 2px solid #aaa;
-}
-
-#topo-oibox .onosInst.online {
- /* theme-related */
- color: #113;
- background-color: #bbf;
- border: 2px solid #555;
+ border-width: 2px;
+ border-style: solid;
}
#topo-oibox .onosInst .onosTitle {
text-align: center;
font-size: 11pt;
margin-top: 6px;
- color: #888;
-}
-
-#topo-oibox .onosInst.online .onosTitle {
- color: black;
}
#topo-oibox .onosInst img {
diff --git a/web/gui/src/main/webapp/topo2.js b/web/gui/src/main/webapp/topo2.js
index 66366c7..f818e2f 100644
--- a/web/gui/src/main/webapp/topo2.js
+++ b/web/gui/src/main/webapp/topo2.js
@@ -70,23 +70,17 @@
}
},
topo: {
- linkBaseColor: '#666',
linkInColor: '#66f',
- linkInWidth: 14,
linkOutColor: '#f00',
+ linkInWidth: 14,
linkOutWidth: 30
},
- icons: {
- w: 28,
- h: 28,
- xoff: -12,
- yoff: -8
+ map: {
+ strokeWidth: 1
},
- iconUrl: {
- device: 'img/device.png',
- host: 'img/host.png',
- pkt: 'img/pkt.png',
- opt: 'img/opt.png'
+ icons: {
+ w: 100,
+ h: 100
},
force: {
note_for_links: 'link.type is used to differentiate',
@@ -532,8 +526,7 @@
}
el.transition()
.duration(1000)
- .attr('stroke-width', linkScale(lw))
- .attr('stroke', config.topo.linkBaseColor);
+ .attr('stroke-width', linkScale(lw));
}
// ==============================
@@ -1234,8 +1227,8 @@
$.extend(node, xy);
}
- function iconUrl(d) {
- return 'img/' + d.type + '.png';
+ function getIconUrl(d) {
+ return 'icons.svg#' + d.type;
}
// returns the newly computed bounding box of the rectangle
@@ -1277,6 +1270,29 @@
return (label && label.trim()) ? label : '.';
}
+ function updateDeviceIconAppearance(node, box, animate) {
+ var u = node.select('use');
+ var ubbox = u.node().getBBox();
+
+ var xoff = -ubbox.width/2 - box.width/2 - 4;
+ var yoff = -ubbox.height;
+ var iconTransform = 'translate(' + xoff + ',' + yoff + ')';
+ if (animate) {
+ node.select('use')
+ .transition()
+ .attr('transform', iconTransform);
+ } else {
+ node.select('use')
+ .attr('transform', iconTransform);
+ }
+
+ var computedStyle = window.getComputedStyle(node.node());
+ u.attr({
+ fill: computedStyle.fill,
+ color: computedStyle.color
+ });
+ }
+
function updateDeviceLabel(d) {
var label = niceLabel(deviceLabel(d)),
node = d.el,
@@ -1294,10 +1310,7 @@
.transition()
.attr(box);
- node.select('image')
- .transition()
- .attr('x', box.x + config.icons.xoff)
- .attr('y', box.y + config.icons.yoff);
+ updateDeviceIconAppearance(node, box, true);
}
function updateHostLabel(d) {
@@ -1339,18 +1352,6 @@
}
}
- function addHostIcon(node, radius, iconId) {
- var dim = radius * 1.5,
- xlate = -dim / 2;
-
- node.append('use')
- .classed('glyph', true)
- .attr('transform', translate(xlate,xlate))
- .attr('xlink:href', '#' + iconId)
- .attr('width', dim)
- .attr('height', dim);
- }
-
function updateNodes() {
node = nodeG.selectAll('.node')
.data(network.nodes, function (d) { return d.id; });
@@ -1377,7 +1378,7 @@
// augment device nodes...
entering.filter('.device').each(function (d) {
var node = d3.select(this),
- icon = iconUrl(d),
+ iconUrl = getIconUrl(d),
label = niceLabel(deviceLabel(d)),
box;
@@ -1399,18 +1400,17 @@
node.select('rect')
.attr(box);
- if (icon) {
- var cfg = config.icons;
- node.append('svg:image')
+ if (iconUrl) {
+ node.append('svg:use')
.attr({
- x: box.x + config.icons.xoff,
- y: box.y + config.icons.yoff,
- width: cfg.w,
- height: cfg.h,
- 'xlink:href': icon
+ 'xlink:href': iconUrl,
+ width: config.icons.w,
+ height: config.icons.h
});
}
+ updateDeviceIconAppearance(node, box, false);
+
// debug function to show the modelled x,y coordinates of nodes...
if (debug('showNodeXY')) {
node.select('rect').attr('fill-opacity', 0.5);
@@ -1424,36 +1424,43 @@
}
});
- // TODO: better place for this configuration state
- var defaultHostRadius = 9,
- hostRadius = {
- bgpSpeaker: 20
- },
- hostIcon = {
- bgpSpeaker: 'bullhorn'
- };
-
-
// augment host nodes...
entering.filter('.host').each(function (d) {
var node = d3.select(this),
- r = hostRadius[d.type] || defaultHostRadius,
- textDy = r + 10,
- icon = hostIcon[d.type];
+ iconUrl = getIconUrl(d);
// provide ref to element from backing data....
d.el = node;
- node.append('circle')
- .attr('r', r);
+ // var box = node.append('circle')
+ // .attr('r', r).node().getBBox();
- if (icon) {
- addHostIcon(node, r, icon);
+ var textYOff = 0;
+ var textXOff = 0;
+ if (iconUrl) {
+ var computedStyle = window.getComputedStyle(node.node());
+ var u = node.append('svg:use')
+ .attr({
+ 'xlink:href': iconUrl,
+ width: config.icons.w,
+ height: config.icons.h,
+ fill: computedStyle.fill,
+ color: computedStyle.color
+ });
+
+ var ubbox = node.select('use').node().getBBox();
+ u.attr('y', -ubbox.height/2);
+ textYOff = ubbox.height/2 + 4; // pad by 4 pixels
+ textXOff = ubbox.width/2;
}
+
+
node.append('text')
.text(hostLabel)
- .attr('dy', textDy)
+ .attr('alignment-baseline', 'text-before-edge')
+ .attr('x', textXOff)
+ .attr('y', textYOff)
.attr('text-anchor', 'middle');
// debug function to show the modelled x,y coordinates of nodes...
@@ -1492,9 +1499,9 @@
.style('opacity', 0);
// note, leave <g>.remove to remove this element
- node.select('circle')
- .style('stroke-fill', '#555')
- .style('fill', '#888')
+ node.select('use')
+ .style('color', '#aaa')
+ .style('fill', '#000')
.style('opacity', 0.5)
.transition()
.duration(1500)
@@ -1817,7 +1824,7 @@
function zoomPan(scale, translate) {
zoomPanContainer.attr("transform", "translate(" + translate + ")scale(" + scale + ")");
// keep the map lines constant width while zooming
- bgImg.style("stroke-width", 2.0 / scale + "px");
+ bgImg.attr("stroke-width", config.map.strokeWidth / scale + "px");
}
function resetZoomPan() {
@@ -1934,6 +1941,27 @@
gly.defBullhorn(defs);
}
+ // create references to bring these into cache so that getBBox() works when they
+ // are inserted later
+ function preloadIcons(svg) {
+ var icons = [
+ "router",
+ "switch",
+ "roadm",
+ "endstation",
+ "bgpSpeaker"
+ ];
+
+ var g = svg.append('g');
+ for (var icon in icons) {
+ g.append('use')
+ .attr({
+ 'xlink:href': 'icons.svg#' + icon
+ });
+ }
+ g.style('visibility', 'hidden');
+ }
+
// ==============================
// View life-cycle callbacks
@@ -1950,6 +1978,7 @@
setSize(svg, view);
loadGlyphs(svg);
+ preloadIcons(svg);
zoomPanContainer = svg.append('g').attr('id', 'zoomPanContainer');
setupZoomPan();
@@ -2046,7 +2075,7 @@
width: config.birdDim,
height: config.birdDim,
fill: '#111'
- })
+ });
}
function para(sel, text) {
@@ -2161,11 +2190,13 @@
.translate(t);
bgImg = zoomPanContainer.insert("g", '#topo-G');
- bgImg.attr('id', 'map').selectAll('path')
- .data(topoData.features)
- .enter()
- .append('path')
- .attr('d', path);
+ // pointer-events: none so that browser select tools don't pick up the map svg
+ bgImg.attr('id', 'map').attr('stroke-width', config.map.strokeWidth + 'px').style('pointer-events', 'none')
+ .selectAll('path')
+ .data(topoData.features)
+ .enter()
+ .append('path')
+ .attr('d', path);
}
function resize(view, ctx, flags) {
diff --git a/web/gui/src/main/webapp/topo_theme.css b/web/gui/src/main/webapp/topo_theme.css
new file mode 100644
index 0000000..9bb2fd7
--- /dev/null
+++ b/web/gui/src/main/webapp/topo_theme.css
@@ -0,0 +1,107 @@
+.theme_dark #topo {
+ background-color: #20201D;
+}
+
+.theme_dark #topo #map {
+ stroke: #444;
+}
+
+/* note: device is offline without the 'online' class */
+.theme_dark #topo svg .node.device {
+ fill: #777;
+}
+
+.theme_dark #topo .host {
+ fill: #000;
+ color: white;
+}
+
+
+.theme_dark #topo svg .node.device.switch.online {
+ fill: #000;
+}
+
+.theme_dark #topo svg .node.device.roadm.online {
+ fill: #03c;
+}
+
+/* note: device is offline without the 'online' class */
+.theme_dark #topo svg .node.device text {
+ fill: #aaa;
+}
+
+.theme_dark #topo svg .node.device.online {
+ color: white;
+}
+.theme_dark #topo svg .node.device.online text {
+ fill: currentColor;
+}
+
+.theme_dark #topo svg .glyph {
+ fill: white;
+}
+
+.theme_dark #topo-oibox .onosInst {
+ color: #444;
+ background-color: #ccc;
+ border-color: #aaa;
+}
+
+.theme_dark #topo-oibox .onosInst.online {
+ color: #113;
+ background-color: #bbf;
+ border-color: #555;
+}
+
+.theme_dark #topo-oibox .onosInst .onosTitle {
+ color: #888;
+}
+
+.theme_dark #topo svg .node.device.fixed.online rect {
+ stroke: #666;
+}
+
+.theme_dark #topo svg .node.host {
+ stroke: #000;
+}
+
+.theme_dark #topo-detail .actionBtn {
+ border-color: #ddf;
+ color: #99f;
+}
+
+.theme_dark #topo-detail .actionBtn:hover {
+ border-color: #ddf;
+ background: #eef;
+ color: #77d;
+}
+
+.theme_dark #topo svg .link.primary {
+ stroke: #f11;
+}
+
+.theme_dark #topo svg .link.secondary {
+ stroke: rgba(255,100,100,0.5);
+}
+
+.theme_dark #topo svg .link.animated {
+ stroke: #f11;
+}
+
+.theme_dark #topo svg .link.primary.optical {
+ stroke: #74f;
+}
+
+.theme_dark #topo svg .link.secondary.optical {
+ stroke: rgba(128,64,255,0.5);
+}
+
+.theme_dark #topo svg .link.animated.optical {
+ stroke: #74f;
+}
+
+/*.theme_dark #topo .link {
+ stroke: #666;
+}
+*/
+