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

.navbar__items--right > div:has(.navbar__search) {
  padding-left: 0;
}

.navbar__search {
  position: relative;
}

/* Mask shape only; color comes from navbar icon tokens. */
.navbar__search::before {
  content: "";
  width: 1rem;
  height: 1rem;
  background-color: var(--odl-navbar-icon);
  -webkit-mask: var(--odl-search-icon-mask) no-repeat center / contain;
  mask: var(--odl-search-icon-mask) no-repeat center / contain;
  pointer-events: none;
  position: absolute;
  left: 0.75rem;
  top: 50%;
  transform: translateY(-50%);
  transition: background-color var(--odl-dur-fast) var(--odl-ease);
  z-index: 1;
}

.navbar__search:hover::before,
.navbar__search:focus-within::before {
  background-color: var(--odl-navbar-icon-hover);
}

.navbar__search-input {
  background-image: none !important;
  border: 1px solid var(--odl-search-border);
  border-radius: var(--odl-radius-pill);
  box-shadow: none;
  padding-left: 2.25rem;
  transition: border-color var(--odl-dur-fast) var(--odl-ease),
    box-shadow var(--odl-dur-fast) var(--odl-ease);
}

.navbar__search-input.search-bar,
.navbar__search-input.search-bar-expanded {
  border-radius: var(--odl-radius-pill);
}

.navbar__search-input:hover {
  border-color: var(--odl-accent-border);
}

[data-theme="dark"] .navbar__search-input:hover {
  border-color: var(--odl-ink-500);
}

.navbar__search-input:focus {
  border-color: var(--odl-accent);
  box-shadow: 0 0 0 2px var(--odl-accent-border);
  outline: 0;
}

.navbar__search--no-icon::before {
  content: none;
}

.navbar__search--no-icon .navbar__search-input {
  padding-left: 0.75rem;
  text-align: left;
}

.navbar__search-input::placeholder {
  font-size: var(--odl-text-xs);
}

/* docusaurus-lunr-search loads this CSS dynamically; keep its white dataset
   background from bleeding through rounded dark-mode dropdown corners. */
[data-theme="dark"] .navbar__search .algolia-autocomplete .ds-dropdown-menu {
  background: var(--ifm-background-color) !important;
  border-color: var(--odl-border) !important;
  border-radius: var(--odl-radius-xs) !important;
}

[data-theme="dark"]
  .navbar__search
  .algolia-autocomplete
  .ds-dropdown-menu::before {
  background: var(--ifm-background-color) !important;
  border-right-color: var(--odl-border) !important;
  border-top-color: var(--odl-border) !important;
}

[data-theme="dark"]
  .navbar__search
  .algolia-autocomplete
  .ds-dropdown-menu
  [class^="ds-dataset-"] {
  background: var(--ifm-background-color) !important;
  background-clip: padding-box;
  border-radius: var(--odl-radius-xs) !important;
}

.navbar .search-icon {
  background-color: var(--odl-navbar-icon);
  background-image: none;
  -webkit-mask: var(--odl-search-icon-mask) no-repeat center / 1rem 1rem;
  mask: var(--odl-search-icon-mask) no-repeat center / 1rem 1rem;
  transition: background-color var(--odl-dur-fast) var(--odl-ease);
}

.navbar .search-icon:hover,
.navbar .search-icon:focus-visible {
  background-color: var(--odl-navbar-icon-hover);
}

.odl-mobile-drawer-utility--search::before {
  -webkit-mask: var(--odl-search-icon-mask) no-repeat center / 1rem 1rem;
  mask: var(--odl-search-icon-mask) no-repeat center / 1rem 1rem;
}

@media (max-width: 360px) {
  .navbar__search::before {
    content: none;
  }
}

@media (max-width: 996px) {
  .navbar__items--right .navbar__search {
    display: none;
  }
}

.odl-search-page {
  padding-block: clamp(3rem, 2rem + 5vw, 6rem);
}

.odl-search-page h1 {
  color: var(--odl-fg-strong);
  font-size: var(--odl-text-2xl);
  margin: 0 0 var(--odl-space-5);
}

.odl-search-page .navbar__search {
  max-width: 42rem;
  width: 100%;
}

.odl-search-page .navbar__search-input {
  border-radius: var(--odl-radius-xs);
  height: 3rem;
  width: 100%;
}

@media (min-width: 997px) {
  .odl-search-page {
    display: none;
  }
}

@media (max-width: 996px) {
  .odl-search-page {
    padding-block: var(--odl-space-6);
  }

  .odl-search-page .navbar__search,
  .odl-search-page .navbar__search .algolia-autocomplete {
    display: block !important;
    position: static !important;
    height: auto !important;
    width: 100% !important;
  }

  .odl-search-page .navbar__search::before {
    top: 1.5rem;
  }

  .odl-search-page .navbar__search .algolia-autocomplete .ds-dropdown-menu {
    border: 1px solid var(--odl-border);
    border-radius: var(--odl-radius-xs);
    bottom: auto !important;
    box-shadow: none;
    display: block !important;
    inset: auto !important;
    left: auto !important;
    margin: var(--odl-space-3) 0 0 !important;
    max-height: none !important;
    max-width: none !important;
    min-width: 0 !important;
    position: static !important;
    right: auto !important;
    top: auto !important;
    transform: none !important;
    width: 100% !important;
    z-index: auto !important;
  }

  .odl-search-page
    .navbar__search
    .algolia-autocomplete
    .ds-dropdown-menu::before {
    content: none !important;
    display: none !important;
  }

  .odl-search-page
    .navbar__search
    .algolia-autocomplete
    .ds-dropdown-menu
    [class^="ds-dataset-"] {
    overflow: visible !important;
  }

  .odl-search-page
    .navbar__search
    .algolia-autocomplete
    .ds-dropdown-menu
    .algolia-docsearch-suggestion {
    border-bottom: 1px solid var(--odl-border);
  }
}
