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

:global(.systemTable){
    position: relative;
    display: block;
    :global(.search){
        color: #1890ff;
        position: absolute;
        top: 12px;
        left: 98%;
        z-index: 2;
    }
    :global(.searchSystem){
        top: -33px;
        right: 91px;
        z-index: 2;
        color: #1890ff;
        position: absolute;
    }
}
:table {
    :global {
      .ant-table-thead > tr > th {
        background: #fff !important;
        white-space: nowrap; 
      }
      .ant-table-tbody >tr> td {
        white-space: nowrap; 
      }
    }
  }
