:root {
  --ts-pr-clear-button: 1rem;
  --ts-pr-caret: 0rem;
  --ts-pr-min: 0.75rem;
}

@layer utilities {
  /* ==========================================================================
    TomSelect base styles & customizations
    =========================================================================== */

  /* Hide the original <select>/<input> that tom-select replaces */
  .ts-hidden-accessible {
    border: 0 !important;
    clip: rect(0 0 0 0) !important;
    clip-path: inset(50%) !important;
    overflow: hidden !important;
    padding: 0 !important;
    position: absolute !important;
    width: 1px !important;
    white-space: nowrap !important;
  }

  /* Outer wrapper — positioning container for control + dropdown */
  .ts-wrapper {
    position: relative;
    display: flex;
  }

  /* The inner clickable control area */
  .ts-control {
    width: 100%;
    overflow: hidden;
    box-sizing: border-box;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    align-content: center;
    cursor: text;
  }

  .ts-control,
  .ts-wrapper.single.input-active .ts-control {
    cursor: text;
  }

  .ts-wrapper.single .ts-control,
  .ts-wrapper.single .ts-control input {
    cursor: pointer;
  }

  /* Input inside control */
  .ts-wrapper .ts-control > input {
    flex: 1 1 auto;
    min-width: 7rem;
    display: inline-block;
    padding: 0;
    min-height: 0;
    max-height: none;
    max-width: 100%;
    margin: 0;
    text-indent: 0;
    border: 0 none;
    background: none;
    line-height: inherit;
    user-select: auto;
    box-shadow: none;
    text-overflow: ellipsis;
    white-space: nowrap;

    &:focus { outline: none; }
    &::-ms-clear { display: none; }
  }

  .ts-wrapper.single.has-items .ts-control:has(.badge) {
    cursor: pointer;
    & > input { opacity: 0; }
  }

  .ts-wrapper.has-items .ts-control > input { margin: 0 .125rem; }

  /* RTL support */
  .ts-wrapper.rtl { text-align: right; }
  .ts-wrapper.rtl.single .ts-control::after { left: calc(0.75rem + 5px); right: auto; }
  .ts-wrapper.rtl .ts-control > input { margin: 0 4px 0 -2px; }

  /* Padding math for caret */
  .ts-wrapper:not(.rtl) .ts-control {
    padding-right: max(var(--ts-pr-min), calc(var(--ts-pr-caret)));
  }
  .ts-wrapper.rtl .ts-control {
    padding-left: max(var(--ts-pr-min), calc(var(--ts-pr-caret)));
  }
  /* Padding math for clear button + caret */
  .ts-wrapper:not(.rtl).plugin-remove_button.has-items .ts-control {
    padding-right: max(var(--ts-pr-min), calc(var(--ts-pr-clear-button) + var(--ts-pr-caret)));
  }
  .ts-wrapper.rtl.plugin-remove_button.has-items .ts-control {
    padding-left: max(var(--ts-pr-min), calc(var(--ts-pr-clear-button) + var(--ts-pr-caret)));
  }
  .ts-wrapper.select {
    &:not(.rtl) .ts-control { padding-left: .75rem; }
    &.rtl .ts-control { padding-right: .75rem; }
    &.multi.has-items:not(.rtl) .ts-control { padding-left: .5rem; }
    &.multi.has-items.rtl .ts-control { padding-right: .5rem; }
  }
  .ts-wrapper.input {
    &.multi.has-items { padding-left: .5rem; }
  }

  /* Disabled */
  .disabled .ts-control,
  .disabled .ts-control * { cursor: default; }
  .disabled .ts-control { opacity: 0.5; }

  /* Hidden input (dropdown_input plugin) */
  .input-hidden .ts-control > input {
    opacity: 0;
    position: absolute;
    left: -10000px;
  }

  /* Inherited font */
  .ts-dropdown,
  .ts-control,
  .ts-control input {
    font-family: inherit;
    font-size: inherit;
    line-height: 1.5;
  }

  /* Dropdown — absolute positioned list */
  .ts-dropdown {
    position: absolute;
    top: 100%;
    left: 0;
    width: 100%;
    z-index: 1000;
    margin: 0.25rem 0 0;
    box-sizing: border-box;

    & [data-selectable] {
      cursor: pointer;
      overflow: hidden;
    }

    & [data-selectable] .highlight {
      background: rgba(255, 237, 40, 0.4);
      border-radius: 1px;
    }

    & .option,
    & [data-disabled],
    & [data-disabled] [data-selectable].option {
      cursor: inherit;
      opacity: 0.5;
    }

    & [data-selectable].option {
      opacity: 1;
      cursor: pointer;
    }

    & .optgroup:first-child .optgroup-header { border-top: 0 none; }

    & .create { color: rgba(52, 58, 64, 0.5); }
  }


  .ts-dropdown-content {
    overflow: hidden auto;
    max-height: 200px;
    scroll-behavior: smooth;
    padding: 0.25rem 0;
  }

  /* Spinner */
  .ts-dropdown .spinner {
    display: inline-block;
    width: 30px;
    height: 30px;
    margin: 3px 0.75rem;

    &::after {
      content: " ";
      display: block;
      width: 24px;
      height: 24px;
      margin: 3px;
      border-radius: 50%;
      border: 5px solid #d0d0d0;
      border-color: #d0d0d0 transparent #d0d0d0 transparent;
      animation: ts-dual-ring 1.2s linear infinite;
    }
  }

  @keyframes ts-dual-ring {
    0%   { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  }

  /* ---------------------------------------------------------------------------
    Plugin: drag_drop
    --------------------------------------------------------------------------- */
  .plugin-drag_drop {
    & .ts-dragging {
      color: transparent;
      & > * { visibility: hidden; }
    }
    & [draggable="true"] { cursor: move; }
  }

  /* ---------------------------------------------------------------------------
    Plugin: checkbox_options
    --------------------------------------------------------------------------- */
  .plugin-checkbox_options:not(.rtl) .option input { margin-right: 0.5rem; }
  .plugin-checkbox_options.rtl .option input { margin-left: 0.5rem; }

  /* ---------------------------------------------------------------------------
    Plugin: clear_button
    --------------------------------------------------------------------------- */
  .plugin-clear_button {
    --ts-pr-clear-button: 1.25rem;

    & .ts-clear-button-wrapper {
      opacity: 0;
      visibility: hidden;
      position: absolute;
      top: 50%;
      transform: translateY(-50%);
      right: calc(0.75rem - 5px);
      margin-right: 0;
      background: transparent;
      cursor: pointer;
    }

    &.form-select .ts-clear-button-wrapper,
    &.single .ts-clear-button-wrapper {
      right: max(var(--ts-pr-caret), 0.75rem);
    }

    &.has-items .ts-clear-button-wrapper,
    &:not(.disabled):hover.has-items .ts-clear-button-wrapper {
      opacity: 1;
      visibility: visible;
    }
  }


  /* ---------------------------------------------------------------------------
    Plugin: dropdown_header
    --------------------------------------------------------------------------- */
  .ts-wrapper {
    &.dropdown-header {
      position: relative;
      padding: 6px 0.75rem;
      border-bottom: 1px solid var(--color-base-300, #d0d0d0);
      border-radius: var(--radius-box, 0.375rem) var(--radius-box, 0.375rem) 0 0;
    }
    & .dropdown-header-close {
      position: absolute;
      right: 0.75rem;
      top: 50%;
      opacity: 0.4;
      margin-top: -12px;
      line-height: 20px;
      font-size: 20px;

      &:hover { opacity: 1; }
    }
  }

  /* ---------------------------------------------------------------------------
    Plugin: dropdown_input
    --------------------------------------------------------------------------- */
  .plugin-dropdown_input {
    &.focus.dropdown-active .ts-control {
      box-shadow: none;
    }
    & .dropdown-input {
      border: 1px solid var(--color-base-300, #d0d0d0);
      border-width: 0 0 1px;
      display: block;
      padding: 0.375rem 0;
      box-shadow: none;
      width: 100%;
      background: transparent;
    }
    & .items-placeholder {
      border: 0 none;
      box-shadow: none;
      width: 100%;
    }

    &.has-items .items-placeholder,
    &.dropdown-active .items-placeholder {
      display: none;
    }
  }

  /* ---------------------------------------------------------------------------
    Plugin: input_autogrow
    --------------------------------------------------------------------------- */
  .plugin-input_autogrow {
    &.has-items .ts-control > input {
      min-width: 0;
      &::placeholder { color: transparent; }
    }
    &.has-items.focus .ts-control > input {
      flex: none;
      min-width: .25rem;
    }
    /* Compact the search input when items exist (caret-position style) */
    &.has-items.single .ts-control > input {
      margin: 0 4px;
      min-width: 0;
      flex: none;
    }
    &.has-items:not(.single) .ts-control > input {
      min-width: 2rem;
      flex: 0 1 auto;
    }
  }

  /* ---------------------------------------------------------------------------
    Plugin: optgroup_columns
    --------------------------------------------------------------------------- */
  .ts-dropdown.plugin-optgroup_columns {
    & .ts-dropdown-content { display: flex; }
    & .optgroup {
      border-right: 1px solid var(--color-base-200, #f2f2f2);
      border-top: 0 none;
      flex-grow: 1;
      flex-basis: 0;
      min-width: 0;

      &:last-child { border-right: 0 none; }
      &::before { display: none; }
    }
    & .optgroup-header { border-top: 0 none; }
  }

  /* ---------------------------------------------------------------------------
    Plugin: remove_button
    --------------------------------------------------------------------------- */
  .plugin-remove_button {
    & .item {
      display: inline-flex;
      align-items: center;
    }

    & .item .remove {
      color: inherit;
      text-decoration: none;
      vertical-align: middle;
      display: inline-block;
    }

    & .item .remove:hover { background: rgba(0, 0, 0, 0.05); }
    &.disabled .item .remove:hover { background: none; }

    & .remove-single {
      position: absolute;
      right: 0;
      top: 0;
      font-size: 23px;
    }

    &:not(.rtl) .item { padding-right: 0.25rem !important; }
    &.rtl .item { padding-left: 0.25rem !important; }
  }

  /* =============================================================================
    DaisyUI overrides
    ============================================================================= */

  .ts-wrapper {
    z-index: 1;

    &.focus {
      outline: 2px solid var(--color-primary-focus, var(--color-primary));
      outline-offset: 2px;
      z-index: 2;
    }

    &.disabled,
    & .ts-control.disabled {
      opacity: 0.5;
      cursor: not-allowed;
    }

    /* DaisyUI .select sets fixed height + overflow:hidden — override for TomSelect.
      min-height matches .select-sm (2.375rem) so it aligns with other inputs when empty. */
    &.select {
      overflow: visible !important;
      height: auto !important;
      min-height: 2.375rem;
      padding: 0;
    }
    &.input {
      height: auto !important;
      min-height: 2.375rem;
    }

    /* Multi-select: allow item wrapping and growth beyond single line */
    &.multi.select .ts-control,
    &.multi.input .ts-control {
      overflow: hidden;
      padding-top: .25rem;
      padding-bottom: .25rem;
    }

    &.multi .ts-control .item,
    &.multi .ts-control .item > span,
    &.single .ts-control .item {
      text-overflow: ellipsis;
      white-space: nowrap;
      overflow: hidden;
    }

    /* Clear button — circular ghost button with cross icon via CSS mask.
      Styled to match <c-input-search> clear button */
    & .ts-clear-button {
      display: flex;
      align-items: center;
      justify-content: center;
      width: 1.5rem;
      height: 1.5rem;
      border-radius: 50%;
      cursor: pointer;

      &::after {
        content: '';
        display: block;
        width: 1rem;
        height: 1rem;
        background-color: var(--color-primary);
        -webkit-mask: url("../../assets/cross.8ead511e29ff.svg") center / contain no-repeat;
        mask: url("../../assets/cross.8ead511e29ff.svg") center / contain no-repeat;
      }

      &:hover {
        background-color: color-mix(in oklab, var(--color-primary) 10%, transparent);
      }
    }

    /* select chevron — icon via CSS mask on ::after pseudo-element.
      Suppress DaisyUI's background-image chevron; we render our own via ::after. */
    &.select--chevron {
      --ts-pr-caret: 1.75rem;
      background-image: none;

      & .ts-clear-button-wrapper {
        right: var(--ts-pr-caret);
      }
      & .ts-control::after {
        content: '';
        position: absolute;
        right: 0.6rem;
        top: 50%;
        transform: translateY(-50%);
        width: 10px;
        height: 15px;
        pointer-events: none;
        background-color: var(--color-primary);
        -webkit-mask: url("../../assets/chevron-updown.0cec2d824ffc.svg") center / contain no-repeat;
        mask: url("../../assets/chevron-updown.0cec2d824ffc.svg") center / contain no-repeat;
      }
      & .ts-control[aria-invalid="true"]::after {
        background-color: var(--color-error, currentColor);
      }
    }

    /* Hover-editable: hide chevron & clear button until hovered/focused */
    &.input--hovereditable,
    &.select--hovereditable {
      & .ts-control::after,
      &.plugin-clear_button.has-items .ts-clear-button-wrapper {
        opacity: 0;
        visibility: hidden;
      }

      &:hover,
      &:focus-within,
      &.focus,
      &.input-active,
      &.dropdown-active {
        --input-color: var(--color-base-300);
        border-color: var(--input-color, var(--color-base-content));

        & .ts-control::after,
        &.plugin-clear_button.has-items .ts-clear-button-wrapper {
          opacity: 1;
          visibility: visible;
        }
      }
    }
  }

  /* Control — full-size clickable area, grows with content */
  .ts-control {
    min-height: 2rem;
    gap: 0.25rem;

    /* Placeholder & typed text */
    & input {
      /* align-self: stretch; */
      font-size: 0.875rem;
      color: var(--color-base-content);

      &::placeholder {
        color: var(--color-base-content);
        opacity: 0.4;
      }
    }

    & .item {
      display: inline-flex;
      align-items: center;
      gap: 0.125rem;

      &.active {
        background-color: var(--color-primary);
        border-color: var(--color-primary);
        color: var(--color-primary-content);
      }

    }

    /* Remove button — icon via CSS mask referencing static/assets/cross.svg */
    & .item .remove {
      display: inline-block;
      width: 1rem;
      height: 1rem;
      flex-shrink: 0;
      cursor: pointer;
      opacity: 0.7;
      background-color: currentColor;
      -webkit-mask: url("../../assets/cross.8ead511e29ff.svg") center / contain no-repeat;
      mask: url("../../assets/cross.8ead511e29ff.svg") center / contain no-repeat;
      border: none;

      &:hover {
        opacity: 1;
        background-color: currentColor; /* keep mask colour on hover */
      }
    }
  }

  /* Dropdown panel */
  .ts-dropdown {
    background-color: var(--color-base-100);
    border: 1px solid var(--color-base-300);
    border-top-width: 1px;
    border-radius: var(--radius-box);
    box-shadow: 0 10px 25px rgba(0, 0, 0, 0.12);
    padding: 0.25rem;

    /* Options */
    & .option,
    & .optgroup-header,
    & .no-results,
    & .create {
      padding: 0.5rem 0.75rem;
      font-size: 0.875rem;
      color: var(--color-base-content);
      border-radius: var(--radius-field);
    }

    & .option:hover,
    & .option.active {
      background-color: var(--color-primary);
      color: var(--color-primary-content);
    }
    & .option.selected {
      background-color: color-mix(in oklab, var(--color-primary) 15%, transparent);
      color: var(--color-primary);

      &.active {
        background-color: var(--color-primary);
        color: var(--color-primary-content);
      }
    }
    & .no-results {
      opacity: 0.6;
    }
    & .optgroup-header {
      font-size: 0.75rem;
      font-weight: 600;
      text-transform: uppercase;
      letter-spacing: 0.05em;
      opacity: 0.6;
      padding: 0.5rem 0.75rem 0.25rem;
    }
    & .optgroup {
      border-top: 1px solid var(--color-base-200);

      &:first-child { border-top: none; }
    }

    /* Highlight in search results */
    & [data-selectable] .highlight {
      background: color-mix(in oklab, var(--color-warning) 30%, transparent);
      border-radius: 2px;
    }
  }

  /* ============================================================================
    django-tomselect.css base & customizations
    ============================================================================ */
  .ts-dropdown {
    & .option:hover:has(.loading),
    & .option.active:has(.loading) {
      background-color: initial;
      color: initial;
      cursor: default;
    }
  }

  .ts-dropdown-content {
      max-height: 300px;
  }


  .ts-wrapper.multi .ts-control > div.active {
      background: var(--color-primary);
      color: #fff;
  }

  /* Update button, when using the edit plugin, needs tweaking if used.
  .ts-wrapper .item .update {
    color: inherit;
    text-decoration: none;
    vertical-align: middle;
    display: inline-block;
    padding: 0 6px;
    border-radius: 0 2px 2px 0;
    box-sizing: border-box;
  }
  .ts-wrapper .item .update:hover {
    background: rgba(0, 0, 0, 0.05);
  }
  .ts-wrapper.disabled .item .update:hover {
    background: none;
  }
  .ts-wrapper .update-single {
    position: absolute;
    right: 0;
    top: 0;
    font-size: 23px;
  }
  .ts-wrapper:not(.rtl) .item .update {
    border-left: 1px solid var(--color-primary);
    margin-left: 6px;
  }
  .ts-wrapper:not(.rtl) .item.active .update {
    border-left-color: var(--color-primary-focus);
  }
  .ts-wrapper:not(.rtl).disabled .item .update {
    border-left-color: var(--color-disabled);
  }

  .ts-wrapper.rtl .item .update {
    border-right: 1px solid var(--color-primary);
    margin-right: 6px;
  }
  .ts-wrapper.rtl .item.active .update {
    border-right-color: var(--color-primary-focus);
  }
  .ts-wrapper.rtl.disabled .item .update {
    border-right-color: var(--color-disabled);
  } */

  .ts-wrapper.multi.disabled .ts-control [data-value],
  .ts-wrapper.multi.disabled .ts-control [data-value] .update {
    border-color: var(--color-disabled);
  }
  .ts-wrapper.multi.disabled .ts-control [data-value] .update {
    background: none;
  }

  .visually-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border-width: 0;
  }
}