/*!
 * Multiple-Select-Vanilla styling
 * @author zhixin wen <wenzhixin2010@gmail.com>
 * @contributor Ghislain B.
 */

@forward 'mixins';
@forward 'variables';

@use 'mixins' as m;
@use 'variables' as v;

// create some SVG icons used by the lib
@include m.createSvgClass("ms-icon-caret", v.$ms-icon-caret-svg-path);
@include m.createSvgClass("ms-icon-close", v.$ms-icon-close-svg-path);
@include m.createSvgClass("ms-icon-check", v.$ms-icon-check-svg-path);
@include m.createSvgClass("ms-icon-partial-all", v.$ms-icon-partial-all-svg-path);
@include m.createSvgClass("ms-icon-partial-group", v.$ms-icon-partial-group-svg-path);
@include m.createSvgClass("ms-icon-radio", v.$ms-icon-radio-svg-path);
@include m.createSvgClass("ms-icon-loading", v.$ms-icon-loading-svg-path);
@include m.createSvgClass("ms-icon-lazy-failed", v.$ms-icon-lazy-failed-svg-path);

@keyframes icon-spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

.ms-spin {
  animation: icon-spin var(--ms-loading-spin-animation, v.$ms-loading-spin-animation);
}

.ms-parent, .ms-drop {
  .ms-icon {
    display: inline-block;
    background-color: currentColor;
    flex-shrink: 0;
    color: var(--ms-icon-color, v.$ms-icon-color);
    font-size: var(--ms-icon-size, v.$ms-icon-size);
    height: var(--ms-icon-size, v.$ms-icon-size);
    width: var(--ms-icon-size, v.$ms-icon-size);
    &:hover {
      color: var(--ms-icon-color-hover, v.$ms-icon-color-hover);
    }
  }

  .ms-select-all,
  li:not(.hide-radio) {
    cursor: pointer;
    &.disabled {
      cursor: default;
    }

    .icon-checkbox-container {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      height: var(--ms-checkbox-icon-container-height, v.$ms-checkbox-icon-container-height);
      width: var(--ms-checkbox-icon-container-width, v.$ms-checkbox-icon-container-width);
      border: var(--ms-checkbox-icon-container-border, v.$ms-checkbox-icon-container-border);
      border-radius: var(--ms-checkbox-icon-container-border-radius, v.$ms-checkbox-icon-container-border-radius);

      div {
        font-size: 14px;
        color: var(--ms-checkbox-color, v.$ms-checkbox-color);
        &:hover {
          color: var(--ms-checkbox-hover-color, v.$ms-checkbox-hover-color);
        }
        // since we use the div container with a border, we don't actually need an icon for unchecked
        // BUT since we want to keep the same size, we can simply hide the mask to keep the same size
        &.ms-icon-uncheck {
          visibility: hidden;
        }
      }
      &.radio {
        border-radius: 50%;
      }
      & + span {
        display: inline-flex;
        align-items: center;
        column-gap: var(--ms-label-column-gap, v.$ms-label-column-gap);
        padding-left: var(--ms-label-text-padding-left, v.$ms-label-text-padding-left);
      }
    }
  }
}

.ms-offscreen {
  clip: rect(0 0 0 0) !important;
  width: 1px !important;
  height: 1px !important;
  border: 0 !important;
  margin: 0 !important;
  padding: 0 !important;
  overflow: hidden !important;
  position: absolute !important;
  outline: 0 !important;
  left: auto !important;
  top: auto !important;
}

.ms-parent {
  display: inline-block;
  position: relative;
  vertical-align: middle;
}

.ms-choice {
  display: flex;
  align-items: center;
  cursor: pointer;
  width: 100%;
  overflow: hidden;
  height: var(--ms-choice-height, v.$ms-choice-height);
  padding: var(--ms-choice-padding, v.$ms-choice-padding);
  background-color: var(--ms-choice-bgcolor, v.$ms-choice-bgcolor);
  border: var(--ms-choice-border, v.$ms-choice-border);
  border-radius: var(--ms-choice-border-radius, v.$ms-choice-border-radius);
  line-height: var(--ms-choice-line-height, v.$ms-choice-line-height);
  color: var(--ms-choice-color, v.$ms-choice-color);
  text-align: var(--ms-choice-text-align, v.$ms-choice-text-align);
  outline: var(--ms-drop-outline, v.$ms-drop-outline);
  text-decoration: none;
  user-select: none;
  white-space: nowrap;
  &:focus {
    border-color: var(--ms-choice-focus-border-color, v.$ms-choice-focus-border-color);
    box-shadow: var(--ms-choice-focus-box-shadow, v.$ms-choice-focus-box-shadow);
  }

  &.disabled {
    border: var(--ms-choice-disabled-border, v.$ms-choice-disabled-border);
    background-color: var(--ms-choice-disabled-bgcolor, v.$ms-choice-disabled-bgcolor);
    background-image: none;
    cursor: default;
  }

  > {
    span {
      display: flex;
      flex: 1;
      align-items: center;
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
      column-gap: var(--ms-label-column-gap, v.$ms-label-column-gap);

      &.ms-placeholder {
        color: var(--ms-placeholder-color, v.$ms-placeholder-color);
      }
    }
    div.ms-icon-close {
      margin-right: 2px;
    }
    div.ms-icon-caret {
      height: var(--ms-chevron-icon-size, v.$ms-chevron-icon-size);
      width: var(--ms-chevron-icon-size, v.$ms-chevron-icon-size);
      &.open {
        transform: scaleY(-1);
      }
    }
  }
}

.ms-drop {
  width: auto;
  min-width: 100%;
  overflow: hidden;
  display: none;
  position: absolute;
  background: var(--ms-drop-background, v.$ms-drop-background);
  border: var(--ms-drop-border, v.$ms-drop-border);
  border-radius: var(--ms-drop-border-radius, v.$ms-drop-border-radius);
  color: var(--ms-drop-color, v.$ms-drop-color);
  margin-top: var(--ms-drop-margin-top, v.$ms-drop-margin-top);
  padding: var(--ms-drop-padding, v.$ms-drop-padding);
  z-index: var(--ms-drop-zindex, v.$ms-drop-zindex);

  &.bottom {
    top: 100%;
    box-shadow: var(--ms-drop-bottom-box-shadow, v.$ms-drop-bottom-box-shadow);
  }

  &.top {
    bottom: 100%;
    box-shadow: var(--ms-drop-top-box-shadow, v.$ms-drop-top-box-shadow);
  }

  .ms-select-all {
    border-bottom: var(--ms-select-all-border-bottom, v.$ms-select-all-border-bottom);
    line-height: var(--ms-select-all-line-height, v.$ms-select-all-line-height);
    padding: var(--ms-select-all-padding, v.$ms-select-all-padding);
    width: 100%;
    &:hover {
      background-color: var(--ms-select-all-text-hover-color, v.$ms-select-all-text-hover-color);
    }
    &.highlighted {
      background-color: var(--ms-option-highlight-bg-color, v.$ms-option-highlight-bg-color);
    }

    label {
      display: inline-flex;
      align-items: center;
      font-weight: var(--ms-select-all-text-font-weight, v.$ms-select-all-text-font-weight);
      padding: var(--ms-select-all-label-padding, v.$ms-select-all-label-padding);
      border: var(--ms-select-all-label-border, v.$ms-select-all-label-border);
      color: var(--ms-select-all-text-color, v.$ms-select-all-text-color);
      width: 100%;
      &:hover {
        cursor: pointer;
        border: var(--ms-select-all-label-hover-border, v.$ms-select-all-label-hover-border);
      }
      input {
        // hide original input checkbox since we use an SVG over it
        opacity: 0;
        width: 0;
        margin-left: 0;
      }
      div {
        display: inline-flex;
      }
    }
  }

  .ms-ok-button {
    cursor: pointer;
    display: block;
    padding: var(--ms-ok-button-padding, v.$ms-ok-button-padding);
    width: var(--ms-ok-button-width, v.$ms-ok-button-width);
    height: var(--ms-ok-button-height, v.$ms-ok-button-height);
    border-color: var(--ms-ok-button-border-color, v.$ms-ok-button-border-color);
    border-radius: var(--ms-ok-button-border-radius, v.$ms-ok-button-border-radius);
    border-width: var(--ms-ok-button-border-width, v.$ms-ok-button-border-width);
    text-align: var(--ms-ok-button-text-align, v.$ms-ok-button-text-align);
    color: var(--ms-ok-button-text-color, v.$ms-ok-button-text-color);
    font-weight: var(--ms-ok-button-font-weight, v.$ms-ok-button-font-weight);
    background-color: var(--ms-ok-button-bg-color, v.$ms-ok-button-bg-color);
    &:hover {
      background-color: var(--ms-ok-button-bg-hover-color, v.$ms-ok-button-bg-hover-color);
      color: var(--ms-ok-button-text-hover-color, v.$ms-ok-button-text-hover-color);
    }
  }
}

.ms-search {
  display: flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  position: relative;
  white-space: nowrap;
  width: 100%;
  margin: var(--ms-search-margin, v.$ms-search-margin);
  min-height: var(--ms-search-min-height, v.$ms-search-min-height);
  padding: var(--ms-search-padding, v.$ms-search-padding);
  z-index: var(--ms-search-zindex, v.$ms-search-zindex);

  input {
    box-shadow: none;
    font-family: sans-serif;
    height: auto !important;
    width: 100%;
    color: var(--ms-search-input-color, v.$ms-search-input-color);
    background-color: var(--ms-search-input-bg-color, v.$ms-search-input-bg-color);
    border: var(--ms-search-input-border, v.$ms-search-input-border);
    border-radius: var(--ms-search-input-border-radius, v.$ms-search-input-border-radius);
    min-height: var(--ms-search-input-min-height, v.$ms-search-input-min-height);
    outline: var(--ms-search-input-outline, v.$ms-search-input-outline);
    padding: var(--ms-search-input-padding, v.$ms-search-input-padding);
    margin: var(--ms-search-input-margin, v.$ms-search-input-margin);
    &::placeholder {
      color: var(--ms-search-input-placeholder, v.$ms-search-input-placeholder);
    }
  }

  span.ms-icon-close {
    cursor: pointer;
    height: var(--ms-icon-size, v.$ms-icon-size);
    margin: var(--ms-search-icon-close-margin, v.$ms-search-icon-close-margin);
  }
}

.ms-drop {
  ul {
    overflow: auto;
    outline: var(--ms-drop-outline, v.$ms-drop-outline);
    margin: var(--ms-drop-list-margin, v.$ms-drop-list-margin);
    padding: var(--ms-drop-list-padding, v.$ms-drop-list-padding);
    scrollbar-color: var(--ms-drop-scrollbar-color, v.$ms-drop-scrollbar-color);

    > li {
      cursor: pointer;
      background-image: none;
      list-style: none;
      position: static;
      align-items: var(--ms-drop-list-item-align-items, v.$ms-drop-list-item-align-items);
      display: var(--ms-drop-list-item-display, v.$ms-drop-list-item-display);
      padding: var(--ms-drop-list-item-padding, v.$ms-drop-list-item-padding);

      .disabled {
        cursor: default;
        font-weight: normal !important;
        opacity: var(--ms-drop-list-item-disabled-opacity, v.$ms-drop-list-item-disabled-opacity);
        filter: var(--ms-drop-list-item-disabled-filter, v.$ms-drop-list-item-disabled-filter);
      }

      &.multiple {
        display: block;
        float: left;
      }

      &.group {
        clear: both;
      }

      &.multiple label {
        width: 100%;
        display: block;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
      }

      label {
        cursor: pointer;
        display: flex;
        align-items: center;
        font-weight: normal;
        position: relative;
        white-space: nowrap;
        flex: 0 0 100%;
        margin-bottom: var(--ms-label-margin-bottom, v.$ms-label-margin-bottom);
        min-height: var(--ms-label-min-height, v.$ms-label-min-height);
        padding: var(--ms-label-padding, v.$ms-label-padding);

        &.optgroup {
          color: var(--ms-optgroup-color, v.$ms-optgroup-color);
          font-weight: var(--ms-drop-optgroup-font-weight, v.$ms-drop-optgroup-font-weight);
        }
      }

      &.hide-radio {
        padding: var(--ms-drop-hide-radio-padding, v.$ms-drop-hide-radio-padding);

        &:focus,
        &:hover {
          background-color: var(--ms-drop-hide-radio-hover-bgcolor, v.$ms-drop-hide-radio-hover-bgcolor);
        }

        &.selected {
          color: var(--ms-drop-hide-radio-selected-color, v.$ms-drop-hide-radio-selected-color);
          background-color: var(--ms-drop-hide-radio-selected-bgcolor, v.$ms-drop-hide-radio-selected-bgcolor);
        }

        label {
          margin-bottom: var(--ms-drop-hide-radio-label-margin-bottom, v.$ms-drop-hide-radio-label-margin-bottom);
          padding: var(--ms-drop-hide-radio-label-padding, v.$ms-drop-hide-radio-label-padding);
        }

        input {
          display: none;
        }
      }

      &.option-level-1 {
        label {
          padding-left: var(--ms-drop-list-item-level1-padding-left, v.$ms-drop-list-item-level1-padding-left);
        }
      }

      &.option-divider {
        padding: var(--ms-drop-option-divider-padding, v.$ms-drop-option-divider-padding);
        border-top: var(--ms-drop-option-divider-border-top, v.$ms-drop-option-divider-border-top);
      }
      &.highlighted {
        background-color: var(--ms-option-highlight-bg-color, v.$ms-option-highlight-bg-color);
      }
    }
  }

  input {
    &[type='radio'],
    &[type='checkbox'] {
      // make input checkbox invisible but don't hide it since ms-select uses hide for something else
      opacity: 0;
      width: 0;
      position: absolute;
      margin-left: var(--ms-drop-input-margin-left, v.$ms-drop-input-margin-left);
      margin-top: var(--ms-drop-input-margin-top, v.$ms-drop-input-margin-top);
      accent-color: var(--ms-checkbox-color, v.$ms-checkbox-color);
    }
    &:focus {
      outline: var(--ms-input-focus-outline, v.$ms-input-focus-outline);
    }
  }

  .ms-no-results {
    display: none;
    padding: var(--ms-no-results-padding, v.$ms-no-results-padding);
  }

  .ms-loading,
  .ms-lazy-failed {
    display: flex;
    align-items: center;
    gap: var(--ms-loading-gap, v.$ms-loading-gap);
    padding: var(--ms-loading-padding, v.$ms-loading-padding);

    .ms-icon-lazy-failed,
    .ms-icon-loading {
      font-size: var(--ms-loading-icon-size, v.$ms-loading-icon-size);
      height: var(--ms-loading-icon-size, v.$ms-loading-icon-size);
      width: var(--ms-loading-icon-size, v.$ms-loading-icon-size);
    }
    .ms-icon-lazy-failed {
      color: var(--ms-lazy-load-failed-color, v.$ms-lazy-load-failed-color);
    }
  }

  .ms-infinite-option {
    height: var(--ms-infinite-empty-option-height, v.$ms-infinite-empty-option-height);
  }
}
