/*
 * 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.
 */
.panel-table {
  .panel {
    border-color: darken(@card-border-color, 10%);

    .panel-heading {
      background: @primary-10;
      border-bottom: 1px solid darken(@card-border-color, 10%);
      font-weight: bold;
    }
  }
}


.activity-any {     
    .accordion-title-toolbar {
        margin-left: 10px; 
        margin-right: 8px;
        .accordion-title-toolbar-item {
            margin-left: 10px;
        }
    }
    .accordion-title-toolbar, .title-toolbar {
        .btn {
            padding-left: 0;
            padding-right: 0;
        }
        margin-left: 10px; 
        margin-right: 16px;
        .accordion-title-toolbar-item, .title-toolbar-item {
            margin-left: 10px;
            margin-right: 0;
            color: darken(desaturate(@brand-primary, 20%), 10%);
            transition: color ease 300ms;
            &:hover {
                color: lighten(saturate(@brand-primary, 10%), 10%);
            }
        }
    }
}