/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

 .dropdown-button{

  color:#3498dB;
}
::placeholder{
  color: #3498dB;
  font-size: 12px;
}
.app-container {
  flex: 1;
  width: 100%;
  height:100%;
  min-width: 100%;
  position:fixed;  
}
.my-toolbar{
  height:20px;
  background-color: #363636;
  opacity:100%;
}

.app-sidenav-content{
  display:flex;
  min-height:100%;
  
  flex-direction:column;
  opacity: 40%;
 
}
.app-sidenav{
  display:flex;
  height:100%;
  flex-direction:column;
  
  opacity:40%;
  
  
}
mat-list > a{

  color:white;
}
.fineract-toolicon{
  color:white;
}
.wrapper{
  margin:50px;
  
}
ul#menu li{
  display: inline;
}
.search1{
  
  margin-left:8%;
  
}
.fineract-toolsearch{
  width:230px;
  max-height: 10px;
}


.fineract-logo{
  width:40px;
  height:37px;
  vertical-align: bottom;
  
}
.logo-title{
  vertical-align: middle;
  font-size:11px;
  color:white;
}

.search1,.search2{
  display: inline-block;
}

.menu1{
  padding:0;
}

.test{
  padding-left:0;
  padding-right: 0;
}
.flex-container{
  height: 45px;
}
