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


@import './../../../style/vars.scss';
@import '../../../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/variables';

xos-service-graph-legend {
  svg {
    height: 95%;
    width: 100%;

    text {
      fill: #fff;
    }

    .service path {
      fill: $color-accent;
    }

    .serviceinstance path {
      fill: $serviceinstances-fg;
    }

    .instance path {
      fill: $instances-fg;
    }

    .network path {
      fill: $networks-fg;
    }
  }
}