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

.page {
  max-width: 960px;
  margin: 0 auto;
  padding: 2.5rem 1rem 4rem;
  overflow-wrap: anywhere;
}

.header {
  margin-bottom: 2rem;
}

.title {
  font-family: var(--ifm-font-family-monospace);
  margin-bottom: 0.5rem;
  word-break: break-word;
}

.subtitle {
  color: var(--ifm-color-emphasis-700);
  margin: 0;
}

.search {
  width: 100%;
  padding: 0.7rem 1rem;
  font-size: 1rem;
  border: 1px solid var(--ifm-color-emphasis-300);
  border-radius: var(--ifm-global-radius);
  background: var(--ifm-background-color);
  color: var(--ifm-font-color-base);
  margin-bottom: 2rem;
}

.search:focus {
  outline: none;
  border-color: var(--ifm-color-primary);
}

.grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 1rem;
}

.card {
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
  height: 100%;
  padding: 1rem 1.1rem;
  border: 1px solid var(--ifm-color-emphasis-200);
  border-radius: var(--ifm-global-radius);
  background: var(--ifm-card-background-color, var(--ifm-background-surface-color));
  transition:
    border-color 0.15s ease,
    transform 0.15s ease,
    box-shadow 0.15s ease;
}

.card:hover {
  text-decoration: none;
  border-color: var(--ifm-color-primary);
  transform: translateY(-2px);
  box-shadow: var(--ifm-global-shadow-lw);
}

.cardName {
  font-family: var(--ifm-font-family-monospace);
  font-size: 1.1rem;
  font-weight: 600;
  color: var(--ifm-heading-color);
  word-break: break-word;
}

.cardMeta {
  font-size: 0.85rem;
  color: var(--ifm-color-emphasis-600);
}

.section {
  margin-top: 2.5rem;
}

.details {
  margin-top: 0.5rem;
}

.detailsSummary {
  cursor: pointer;
  font-weight: 500;
  padding: 0.5rem 0;
  color: var(--ifm-color-emphasis-700);
}

.hint {
  margin-top: 1rem;
  font-size: 0.85rem;
  color: var(--ifm-color-emphasis-600);
}

.page :global(.theme-code-block),
.page :global([class*="codeBlockContainer"]) {
  max-width: 100%;
}

.group {
  border: 1px solid var(--odl-code-border);
  border-radius: var(--odl-radius-md);
  margin-bottom: 0.75rem;
  overflow: hidden;
  background: var(--ifm-background-color);
  background-clip: padding-box;
}

.groupSummary {
  cursor: pointer;
  font-size: 0.95rem;
  font-weight: 700;
  padding: 0.7rem 1rem;
  background: var(--odl-code-bg);
  color: var(--ifm-heading-color);
  border-radius: calc(var(--odl-radius-md) - 1px);
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.group[open] > .groupSummary {
  border-bottom: 1px solid var(--odl-code-border);
  border-radius: calc(var(--odl-radius-md) - 1px)
    calc(var(--odl-radius-md) - 1px) 0 0;
}

.groupCount {
  font-size: 0.75rem;
  font-weight: 500;
  color: var(--ifm-color-emphasis-600);
  background: var(--ifm-background-color);
  border: 1px solid var(--ifm-color-emphasis-300);
  border-radius: 999px;
  padding: 0 0.5rem;
}

.chip {
  display: inline-block;
  margin-left: 0.4rem;
  padding: 0.05rem 0.4rem;
  font-size: 0.72rem;
  border-radius: var(--ifm-global-radius);
  background: var(--ifm-color-emphasis-100);
  color: var(--ifm-color-emphasis-700);
  white-space: nowrap;
}

.chipCode {
  font-size: 0.72rem;
  background: transparent;
  border: none;
  padding: 0;
}

.tableWrap {
  margin: 0;
  overflow-x: auto;
  overflow-y: hidden;
  max-width: 100%;
  -webkit-overflow-scrolling: touch;
  background: var(--ifm-background-color);
}

.table {
  --service-table-border: var(--odl-code-border);
  --service-table-border-strong: var(--odl-border-strong);
  --service-table-stripe: var(--odl-code-bg);

  width: 100%;
  min-width: 720px;
  margin: 0;
  display: table;
  border: 0;
  border-collapse: separate;
  border-spacing: 0;
  background: transparent;
}

.tableHeaderRow {
  border-top: 0;
  background: transparent;
}

.tableRow {
  border-top: 0;
  background: transparent;
}

.tableHeaderCell,
.tableCell {
  text-align: left;
  vertical-align: top;
  padding: 0.6rem 0.75rem;
  border: 0;
  background: transparent;
  overflow-wrap: normal;
  word-break: normal;
}

.tableHeaderCell {
  font-size: 0.8rem;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--ifm-color-emphasis-600);
  border-bottom: 1px solid var(--service-table-border);
}

.tableRow:not(:last-child) .tableCell {
  border-bottom: 1px solid var(--service-table-border);
}

.tableHeaderCell:not(:last-child),
.tableCell:not(:last-child) {
  border-right: 1px solid var(--service-table-border);
}

.tableHeaderCell:nth-child(2),
.tableCell:nth-child(2) {
  min-width: 5.5rem;
  white-space: nowrap;
}

.tableHeaderCell:nth-child(3),
.tableCell:nth-child(3) {
  min-width: 6.75rem;
  white-space: nowrap;
}

.desc {
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  font-size: 0.9rem;
  color: var(--ifm-color-emphasis-800);
}

.deprecatedRow .configKey {
  text-decoration: line-through;
}

.badge {
  display: inline-block;
  margin-left: 0.4rem;
  padding: 0.05rem 0.4rem;
  font-size: 0.7rem;
  border-radius: var(--ifm-global-radius);
  background: var(--ifm-color-warning-contrast-background);
  color: var(--ifm-color-warning-darkest);
}

.deprecatedNote {
  margin-top: 0.35rem;
  font-size: 0.8rem;
  color: var(--ifm-color-warning-darkest);
}

@media (max-width: 996px) {
  .page {
    padding: 1.75rem 0.875rem 3rem;
  }

  .page :global(.theme-code-block),
  .page :global([class*="codeBlockContainer"]) {
    overflow: hidden;
  }

  .page :global(.prism-code) {
    white-space: pre-wrap;
    overflow-wrap: anywhere;
    word-break: break-word;
  }

  .page :global(.token-line) {
    white-space: inherit;
    overflow-wrap: inherit;
  }

  .grid {
    grid-template-columns: repeat(auto-fill, minmax(9.5rem, 1fr));
    gap: 0.75rem;
  }

  .card {
    padding: 0.85rem 0.9rem;
  }

  .groupSummary {
    padding: 0.65rem 0.875rem;
  }

  .tableWrap {
    overflow-x: visible;
  }

  .table {
    min-width: 0;
    display: block;
  }

  .tableHead {
    display: none;
  }

  .tableBody,
  .tableRow,
  .tableCell {
    box-sizing: border-box;
    display: block;
    width: 100%;
  }

  .tableBody > .tableRow {
    padding: 0;
    border-bottom: 0;
    background-color: var(--ifm-background-color);
  }

  .tableBody > .tableRow:nth-child(2n) {
    background-color: var(--service-table-stripe);
  }

  .tableRow > .tableCell {
    border-bottom: 1px solid var(--service-table-border-strong);
    border-right: 0;
  }

  .tableCell {
    padding: 0.28rem 0.875rem;
    background-color: transparent;
  }

  .tableCell:nth-child(2),
  .tableCell:nth-child(3) {
    min-width: 0;
    white-space: normal;
  }

  .tableCell::before {
    content: attr(data-label);
    display: block;
    margin-bottom: 0.1rem;
    font-size: 0.68rem;
    font-weight: 600;
    text-transform: uppercase;
    color: var(--ifm-color-emphasis-600);
  }

  .tableKeyCell::before {
    content: "Key";
  }

  .chip,
  .badge {
    margin-top: 0.3rem;
    margin-left: 0;
    margin-right: 0.3rem;
    white-space: normal;
  }
}
