/*
 * 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 'theme-mixin';

:host {
  display: block;
}

.themeMixin({
  .content {
    width: 100%;
    position: relative;

    &.header-mode {
      .operation {
        display: none;
      }
    }
  }
  .rename {
    width: 200px;
  }
  nz-tree {
    display: block;
  
    ::ng-deep nz-tree-node-title {
      width: calc(~'100% - 24px');
    }
  }
  nz-input-group {
    width: 100%;
    margin-top: 12px;
    margin-bottom: 6px;
  }
  .node {
    line-height: 24px;
    width: 100%;

    &.not-matched {
      opacity: 0.5;
      filter: grayscale(1);
    }

    .folder,
    .file {
      display: flex;
      align-items: center;
      width: 100%;
      .name {
        min-width: 0;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
      }
    }

    .operation {
      flex-shrink: 0;
      margin-left: 12px;

      i {
        font-size: 12px;
        display: none;

        &:hover {
          color: @link-active-color;
        }
      }
    }

    &.active {
      .name {
        color: @link-active-color;
      }
    }

    &:hover, &.active {
      .operation {
        i {
          display: inline-block;
        }
      }
    }
  }
});
