//
// Copyright IBM Corp. 2016, 2025
//
// This source code is licensed under the Apache-2.0 license found in the
// LICENSE file in the root directory of this source tree.
//

@use '../checkbox';
@use '../list-box';
@use '../../config' as *;
@use '../../motion' as *;
@use '../../spacing' as *;
@use '../../theme' as *;
@use '../../utilities/convert';
@use '../../utilities/focus-outline' as *;

/// Multi select styles
/// @access public
/// @group multi-select
@mixin multiselect {
  .#{$prefix}--multi-select {
    box-sizing: border-box;
  }

  .#{$prefix}--multi-select .#{$prefix}--list-box__field--wrapper {
    display: inline-flex;
    align-items: center;
    block-size: calc(100% + 1px);
    inline-size: 100%;
  }

  .#{$prefix}--multi-select .#{$prefix}--list-box__field:focus {
    @include focus-outline('reset');
  }

  .#{$prefix}--multi-select--filterable .#{$prefix}--list-box__field {
    padding: 0;
  }

  .#{$prefix}--multi-select .#{$prefix}--tag {
    margin: 0 $spacing-03 0 $spacing-05;
    min-inline-size: auto;
  }

  .#{$prefix}--multi-select .#{$prefix}--list-box__menu {
    min-inline-size: auto;
  }

  // When select all is turned on, the first item in the listbox
  // is always the "Select all" option and gets special border
  // treatment
  .#{$prefix}--multi-select.#{$prefix}--multi-select--selectall
    .#{$prefix}--list-box__menu-item:first-child
    .#{$prefix}--list-box__menu-item__option {
    padding: 0.6875rem $spacing-05;
    margin: 0;
    border-block-end: 1px solid $border-subtle-01;
  }

  // When select all is turned on, the second item in the list
  // has special treatment to look correct against the "Select all"
  // border treatment
  .#{$prefix}--multi-select.#{$prefix}--multi-select--selectall
    .#{$prefix}--list-box__menu-item:nth-child(2)
    .#{$prefix}--list-box__menu-item__option {
    border-block-start: none;
  }

  .#{$prefix}--multi-select
    .#{$prefix}--list-box__menu-item__option
    .#{$prefix}--checkbox-wrapper {
    display: flex;
    align-items: center;
    block-size: 100%;
    inline-size: 100%;
  }

  .#{$prefix}--multi-select
    .#{$prefix}--list-box__menu-item__option
    .#{$prefix}--checkbox-label {
    display: inline-block;
    overflow: hidden;
    inline-size: 100%;
    padding-inline-start: convert.to-rem(28px);
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  .#{$prefix}--multi-select
    .#{$prefix}--list-box__menu-item__option
    .#{$prefix}--checkbox-label::before {
    margin-block: 0;
  }

  .#{$prefix}--multi-select
    .#{$prefix}--list-box__menu-item__option
    .#{$prefix}--checkbox:indeterminate
    + .#{$prefix}--checkbox-label::after {
    inset-block-start: convert.to-rem(9px);
  }
  .#{$prefix}--multi-select
    .#{$prefix}--list-box__menu-item__option
    .#{$prefix}--checkbox-label::after {
    inset-block-start: convert.to-rem(5px);
  }
  .#{$prefix}--multi-select
    .#{$prefix}--list-box__menu-item__option
    > .#{$prefix}--form-item {
    flex-direction: row;
    margin: 0;
  }

  .#{$prefix}--multi-select
    .#{$prefix}--list-box__menu-item
    .#{$prefix}--checkbox:checked
    ~ .#{$prefix}--checkbox-label-text {
    color: $text-primary;
  }

  .#{$prefix}--multi-select--filterable {
    transition: outline-color $duration-fast-01 motion(standard, productive);
  }

  .#{$prefix}--multi-select--filterable.#{$prefix}--combo-box
    .#{$prefix}--text-input {
    border: convert.to-rem(2px) solid transparent;
    background-clip: padding-box;
    outline: none;
  }

  .#{$prefix}--multi-select--filterable--input-focused,
  .#{$prefix}--multi-select
    .#{$prefix}--list-box__field--wrapper--input-focused:has(
      button[aria-expanded='false']
    ),
  .#{$prefix}--multi-select
    .#{$prefix}--list-box__field--wrapper--input-focused:has(
      button[aria-expanded='true']
    ) {
    @include focus-outline('outline');
  }

  .#{$prefix}--multi-select.#{$prefix}--list-box--expanded
    .#{$prefix}--list-box__field--wrapper:has(
      button[aria-activedescendant]:not([aria-activedescendant=''])
    ),
  .#{$prefix}--multi-select--filterable.#{$prefix}--list-box--expanded:has(
      input[aria-activedescendant]:not([aria-activedescendant=''])
    ) {
    outline-offset: convert.to-rem(-1px);
    outline-width: convert.to-rem(1px);
  }

  .#{$prefix}--multi-select--filterable.#{$prefix}--multi-select--selected
    .#{$prefix}--list-box__menu-item:first-child.#{$prefix}--list-box__menu-item--highlighted::before,
  .#{$prefix}--multi-select.#{$prefix}--multi-select--selected
    .#{$prefix}--list-box__menu-item:first-child.#{$prefix}--list-box__menu-item--highlighted::before {
    position: absolute;
    border: 2px solid $focus;
    block-size: 100%;
    border-block-start: 1px solid $focus;
    content: '';
    inline-size: 100%;
  }

  .#{$prefix}--multi-select--filterable.#{$prefix}--multi-select--selected
    .#{$prefix}--list-box__menu-item:first-child.#{$prefix}--list-box__menu-item--highlighted,
  .#{$prefix}--multi-select.#{$prefix}--multi-select--selected
    .#{$prefix}--list-box__menu-item:first-child.#{$prefix}--list-box__menu-item--highlighted {
    @include focus-outline('reset');
  }

  .#{$prefix}--multi-select--filterable.#{$prefix}--multi-select--selected
    .#{$prefix}--text-input,
  .#{$prefix}--multi-select.#{$prefix}--multi-select--selected
    .#{$prefix}--list-box__field {
    padding-inline-start: 0;
  }

  .#{$prefix}--multi-select--filterable.#{$prefix}--list-box--disabled:hover:not(
      .#{$prefix}--multi-select--filterable
    )
    .#{$prefix}--text-input {
    background-color: $field;
  }

  .#{$prefix}--multi-select--filterable
    .#{$prefix}--list-box__selection--multi {
    margin: 0 0 0 $spacing-05;
  }

  .#{$prefix}--multi-select--filterable.#{$prefix}--multi-select--inline,
  .#{$prefix}--multi-select--filterable.#{$prefix}--multi-select--inline
    .#{$prefix}--text-input {
    background-color: transparent;
    border-block-end: 0;
  }

  .#{$prefix}--multi-select:not(.#{$prefix}--list-box--expanded)
    .#{$prefix}--list-box__menu {
    visibility: hidden;
  }

  .#{$prefix}--multi-select.#{$prefix}--multi-select--readonly,
  .#{$prefix}--multi-select.#{$prefix}--multi-select--readonly:hover {
    background-color: transparent;
    border-block-end-color: $border-subtle;
  }

  .#{$prefix}--multi-select.#{$prefix}--multi-select--readonly
    .#{$prefix}--list-box__menu-icon
    svg {
    fill: $icon-disabled;
  }

  .#{$prefix}--multi-select.#{$prefix}--multi-select--readonly
    .#{$prefix}--tag--filter,
  .#{$prefix}--multi-select.#{$prefix}--multi-select--readonly
    .#{$prefix}--tag__close-icon:hover {
    background-color: transparent;
    color: $text-primary;
    cursor: default;
  }

  .#{$prefix}--multi-select.#{$prefix}--multi-select--readonly
    .#{$prefix}--tag--filter {
    box-shadow: 0 0 0 1px $border-subtle;
  }

  .#{$prefix}--multi-select.#{$prefix}--multi-select--readonly
    .#{$prefix}--tag--filter
    svg {
    fill: $icon-disabled;
  }

  .#{$prefix}--multi-select.#{$prefix}--multi-select--readonly
    .#{$prefix}--list-box__field,
  .#{$prefix}--multi-select.#{$prefix}--multi-select--readonly
    .#{$prefix}--list-box__menu-icon {
    cursor: default;
  }
}
