/*
 * 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:0;
  
}
.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;
}
