.geo-browser-modal .geo-toolbar {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 12px;
}

.geo-browser-modal .geo-toolbar .ant-input-search {
  flex: 1;
  min-width: 180px;
}

.geo-browser-modal .geo-meta {
  margin-inline-start: auto;
  font-size: 12px;
  color: var(--ant-color-text-tertiary);
  font-variant-numeric: tabular-nums;
}

.geo-browser-modal .geo-columns {
  display: grid;
  grid-template-columns: minmax(240px, 340px) minmax(0, 1fr);
  gap: 12px;
  height: 440px;
}

/* Both panes are the same fixed height, and the pager sits on the pane's floor
   rather than under the last row, so neither the dialog nor its controls move
   as the user steps between categories with wildly different rule counts. */
.geo-browser-modal .geo-panel {
  height: 100%;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  border: 1px solid var(--ant-color-border-secondary);
  border-radius: 8px;
}

.geo-browser-modal .geo-panel .ant-table-wrapper,
.geo-browser-modal .geo-panel .ant-spin-nested-loading,
.geo-browser-modal .geo-panel .ant-spin-container {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-height: 0;
  width: 100%;
}

.geo-browser-modal .geo-panel .ant-table {
  flex: 1;
  min-height: 0;
}

/* The rules table fills whatever is left between the header and the pager
   instead of carrying a hardcoded scroll height, so there is no dead strip
   above the pager and short categories do not scroll needlessly. */
.geo-browser-modal .geo-preview-body {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
}

.geo-browser-modal .geo-pager {
  margin-top: auto;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  flex-wrap: wrap;
  padding: 6px 12px;
  border-top: 1px solid var(--ant-color-border-secondary);
  font-variant-numeric: tabular-nums;
}

.geo-browser-modal .geo-pager .ant-pagination-total-text {
  font-size: 12px;
  color: var(--ant-color-text-tertiary);
}

.geo-browser-modal .geo-categories .ant-table-row {
  cursor: pointer;
}

.geo-browser-modal .geo-row-active > td {
  background: var(--ant-color-primary-bg);
}

.geo-browser-modal .geo-category {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

.geo-browser-modal .geo-code,
.geo-browser-modal .geo-entry-value,
.geo-browser-modal .geo-preview-title {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 13px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.geo-browser-modal .geo-attrs .ant-tag {
  font-size: 10px;
  line-height: 16px;
  margin-inline-end: 4px;
  padding-inline: 4px;
}

.geo-browser-modal .geo-count {
  font-variant-numeric: tabular-nums;
  color: var(--ant-color-text-tertiary);
  font-size: 12px;
}

.geo-browser-modal .geo-preview-head {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  border-bottom: 1px solid var(--ant-color-border-secondary);
}

/* The title is the part that gives way: without min-width it refuses to
   shrink, and the filter is pushed onto a second line instead of the long
   category name being clipped. */
.geo-browser-modal .geo-preview-title {
  flex: 0 1 auto;
  min-width: 0;
}

.geo-browser-modal .geo-preview-head .ant-typography {
  flex: none;
  white-space: nowrap;
}

.geo-browser-modal .geo-entry-filter {
  flex: none;
  width: 200px;
  margin-inline-start: auto;
}

@media (max-width: 520px) {
  .geo-browser-modal .geo-preview-head {
    flex-wrap: wrap;
  }

  .geo-browser-modal .geo-entry-filter {
    width: 100%;
  }
}

.geo-browser-modal .geo-kind {
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.geo-browser-modal .geo-kind-full {
  color: var(--ant-color-success);
}

.geo-browser-modal .geo-kind-keyword {
  color: var(--ant-color-warning);
}

.geo-browser-modal .geo-kind-regexp {
  color: var(--ant-color-primary);
}

.geo-browser-modal .geo-placeholder {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 40px 20px;
  text-align: center;
}

.geo-browser-modal .geo-footer {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  margin-top: 12px;
  padding-top: 12px;
  border-top: 1px solid var(--ant-color-border-secondary);
}

.geo-browser-modal .geo-chips {
  flex: 1;
  max-height: 76px;
  overflow-y: auto;
}

.geo-browser-modal .geo-selected-count {
  font-size: 12px;
  color: var(--ant-color-text-tertiary);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

@media (max-width: 720px) {
  .geo-browser-modal .geo-columns {
    grid-template-columns: minmax(0, 1fr);
    height: auto;
  }

  .geo-browser-modal .geo-panel {
    height: 320px;
  }
}

.geo-unknown-hint {
  display: block;
  margin-top: 4px;
  font-size: 12px;
}
