/* components.css — shared UI components */

/* ── Buttons ────────────────────────────────────────────────────────────────── */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.25rem;
  padding: 0.375rem 0.75rem;
  font-size: 1rem;
  font-weight: 400;
  line-height: 1.5;
  background: transparent;
  color: var(--color-text);
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  cursor: pointer;
  text-decoration: none;
  transition: background-color .15s, border-color .15s, color .15s;
  white-space: nowrap;
  user-select: none;
}
.btn:hover { text-decoration: none; background-color: var(--color-surface-alt); }
.btn:disabled, .btn[disabled] { opacity: 0.65; pointer-events: none; }
.btn:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; }

.btn-primary {
  color: #fff;
  background-color: var(--color-primary);
  border-color: var(--color-primary);
}
.btn-primary:hover {
  color: #fff;
  background-color: var(--color-primary-hover);
  border-color: var(--color-primary-hover);
}

.btn-secondary {
  color: #fff;
  background-color: var(--color-secondary);
  border-color: var(--color-secondary);
}
.btn-secondary:hover {
  color: #fff;
  background-color: var(--color-secondary-hover);
  border-color: var(--color-secondary-hover);
}

.btn-success {
  color: #fff;
  background-color: var(--color-success);
  border-color: var(--color-success);
}
.btn-success:hover {
  color: #fff;
  background-color: var(--color-success-hover);
  border-color: var(--color-success-hover);
}

.btn-danger {
  color: #fff;
  background-color: var(--color-danger);
  border-color: var(--color-danger);
}
.btn-danger:hover {
  color: #fff;
  background-color: var(--color-danger-hover);
  border-color: var(--color-danger-hover);
}

.btn-warning {
  color: #000;
  background-color: var(--color-warning);
  border-color: var(--color-warning);
}
.btn-warning:hover {
  color: #000;
  background-color: var(--color-warning-hover);
  border-color: var(--color-warning-hover);
}

.btn-info {
  color: #000;
  background-color: var(--color-info);
  border-color: var(--color-info);
}
.btn-info:hover {
  color: #000;
  background-color: var(--color-info-hover);
  border-color: var(--color-info-hover);
}

.btn-dark {
  color: var(--color-bg);
  background-color: var(--color-dark);
  border-color: var(--color-dark);
}
.btn-dark:hover {
  color: var(--color-bg);
  background-color: var(--color-dark-hover);
  border-color: var(--color-dark-hover);
}

.btn-outline-primary {
  color: var(--color-primary);
  background: transparent;
  border-color: var(--color-primary);
}
.btn-outline-primary:hover {
  color: #fff;
  background-color: var(--color-primary);
}

.btn-outline-secondary {
  color: var(--color-text);
  background: transparent;
  border-color: var(--color-border);
}
.btn-outline-secondary:hover {
  background-color: var(--color-surface-alt);
}

.btn-outline-danger {
  color: var(--color-danger);
  background: transparent;
  border-color: var(--color-danger);
}
.btn-outline-danger:hover { color: #fff; background-color: var(--color-danger); }

.btn-outline-warning {
  color: var(--color-warning);
  background: transparent;
  border-color: var(--color-warning);
}
.btn-outline-warning:hover { background-color: var(--color-warning); color: #000; }

.btn-outline-success {
  color: var(--color-success);
  background: transparent;
  border-color: var(--color-success);
}
.btn-outline-success:hover { background-color: var(--color-success); color: #000; }

.btn-outline-info {
  color: var(--color-info);
  background: transparent;
  border-color: var(--color-info);
}
.btn-outline-info:hover { background-color: var(--color-info); color: #000; }

.btn-outline-dark {
  color: var(--color-dark);
  background: transparent;
  border-color: var(--color-dark);
}
.btn-outline-dark:hover { background-color: var(--color-dark); color: var(--color-bg); }

.btn-outline-default {
  color: var(--color-text);
  background: transparent;
  border-color: var(--color-border);
}
.btn-outline-default:hover { background-color: var(--color-surface-alt); }

.btn-sm {
  padding: 0.25rem 0.5rem;
  font-size: 0.875rem;
  border-radius: var(--radius-sm);
}

/* Navbar-adaptive button */
.btn-nav {
  color: var(--color-nav-text);
  background: transparent;
  border: 1px solid color-mix(in srgb, var(--color-nav-text) 35%, transparent);
  border-radius: var(--radius);
}
.btn-nav:hover, .btn-nav:focus {
  color: var(--color-nav-text);
  background: color-mix(in srgb, var(--color-nav-text) 10%, transparent);
  border-color: color-mix(in srgb, var(--color-nav-text) 50%, transparent);
}

/* Footer toggle button */
.btn-footer-toggle {
  color: var(--color-text);
  background: transparent;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  padding: 0.2rem 0.5rem;
  font-size: 0.875rem;
  cursor: pointer;
}
.btn-footer-toggle:hover {
  background: color-mix(in srgb, var(--color-text) 10%, transparent);
}
.btn-check:checked + .btn-footer-toggle,
.btn-check:checked + .btn-outline-secondary {
  color: var(--color-bg);
  background: var(--color-text);
  border-color: var(--color-text);
}
.btn-check:checked + .btn-outline-secondary {
  background: var(--color-primary);
  border-color: var(--color-primary);
  color: #fff;
}

/* Button group */
.btn-group {
  display: inline-flex;
}
.btn-group > .btn { border-radius: 0; }
.btn-group > .btn:first-child { border-radius: var(--radius) 0 0 var(--radius); }
.btn-group > .btn:last-child  { border-radius: 0 var(--radius) var(--radius) 0; }
.btn-group > .btn:not(:first-child) { margin-left: -1px; }

.btn-group-sm > .btn {
  padding: 0.2rem 0.45rem;
  font-size: 0.875rem;
}
.btn-group-sm > .btn:first-child { border-radius: var(--radius-sm) 0 0 var(--radius-sm); }
.btn-group-sm > .btn:last-child  { border-radius: 0 var(--radius-sm) var(--radius-sm) 0; }

/* Hidden radio/checkbox for btn-check pattern */
.btn-check {
  position: absolute;
  clip: rect(0,0,0,0);
  pointer-events: none;
}

/* Close button */
.btn-close {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.5rem; height: 1.5rem;
  padding: 0;
  background: transparent;
  border: none;
  cursor: pointer;
  opacity: 0.5;
  font-size: 1.2rem;
  line-height: 1;
  color: var(--color-text);
}
.btn-close::before { content: "×"; }
.btn-close:hover { opacity: 1; }

/* ── Cards ──────────────────────────────────────────────────────────────────── */

.card {
  background-color: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  overflow: hidden;
}

.card-header {
  padding: 0.75rem 1rem;
  background-color: var(--color-surface);
  border-bottom: 1px solid var(--color-border);
  font-weight: 500;
  display: flex;
  align-items: center;
}

.card-body {
  padding: 1rem;
  color: var(--color-text);
}

.card-footer {
  padding: 0.75rem 1rem;
  background-color: var(--color-surface);
  border-top: 1px solid var(--color-border);
}

.card-title {
  font-size: 1.25rem;
  font-weight: 600;
  margin-bottom: 0.75rem;
}

/* Card header with title on the left and a trailing action button on the right.
   Used by the admin screens (Rule §15.3) and anywhere a card needs a header CTA. */
.card-header-split {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
}

.shadow-sm { box-shadow: var(--shadow-sm); }

/* ── Tabs ───────────────────────────────────────────────────────────────────── */
/* Used by Rule §15 admin screens and anywhere a page needs tabbed sections.
   Pair with the JS helper `activateTab(name)` from ~/Git/css/js/admin.js.     */

.tab-bar {
  display: flex;
  gap: 0.5rem;
  border-bottom: 1px solid var(--color-border);
  margin-top: 1rem;
  margin-bottom: 1.25rem;
  flex-wrap: wrap;
}

.tab-btn {
  appearance: none;
  background: none;
  border: 1px solid transparent;
  border-bottom: none;
  border-top-left-radius: var(--radius);
  border-top-right-radius: var(--radius);
  color: var(--color-muted);
  cursor: pointer;
  font: inherit;
  font-size: 0.95rem;
  line-height: 1.2;
  padding: 0.6rem 1rem;
  min-height: 2.75rem;
  margin-bottom: -1px;
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
}
.tab-btn:hover { color: var(--color-text); }
.tab-btn:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 2px;
}
.tab-btn.is-active,
.tab-btn.active {
  color: var(--color-text);
  background: var(--color-surface);
  border-color: var(--color-border);
}

.tab-panel { display: none; }
.tab-panel.is-active,
.tab-panel:not(.hidden):not([hidden]) { display: block; }
.tab-panel.hidden,
.tab-panel[hidden] { display: none; }

/* ── Forms ──────────────────────────────────────────────────────────────────── */

.form-label {
  display: block;
  margin-bottom: 0.375rem;
  font-weight: 500;
  font-size: 0.9375rem;
}

.form-control {
  display: block;
  width: 100%;
  padding: 0.375rem 0.75rem;
  font-size: 1rem;
  line-height: 1.5;
  color: var(--color-text);
  background-color: var(--color-bg);
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  appearance: none;
  transition: border-color .15s, box-shadow .15s;
}
.form-control:focus {
  outline: none;
  border-color: var(--color-primary);
  box-shadow: 0 0 0 0.2rem color-mix(in srgb, var(--color-primary) 25%, transparent);
}
.form-control::placeholder { color: var(--color-muted); opacity: 1; }

.form-control-sm {
  padding: 0.25rem 0.5rem;
  font-size: 0.875rem;
  border-radius: var(--radius-sm);
}

.form-select {
  display: block;
  width: 100%;
  padding: 0.375rem 2.25rem 0.375rem 0.75rem;
  font-size: 1rem;
  line-height: 1.5;
  color: var(--color-text);
  background-color: var(--color-bg);
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  appearance: none;
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%236c757d' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
  background-repeat: no-repeat;
  background-position: right 0.75rem center;
  background-size: 16px 12px;
  cursor: pointer;
}
.form-select:focus {
  outline: none;
  border-color: var(--color-primary);
  box-shadow: 0 0 0 0.2rem color-mix(in srgb, var(--color-primary) 25%, transparent);
}

.form-check {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding-left: 0;
}

.form-check-input {
  width: 1rem; height: 1rem;
  cursor: pointer;
  flex-shrink: 0;
}

.form-check-label { cursor: pointer; }

.form-range {
  width: 100%;
  height: 1.5rem;
  cursor: pointer;
  appearance: none;
  background: transparent;
}
.form-range::-webkit-slider-runnable-track {
  height: 0.375rem;
  background: var(--color-border);
  border-radius: 1rem;
}
.form-range::-webkit-slider-thumb {
  appearance: none;
  width: 1rem; height: 1rem;
  border-radius: 50%;
  background: var(--color-primary);
  margin-top: -0.3125rem;
}

.form-text {
  font-size: 0.875em;
  color: var(--color-muted);
  margin-top: 0.25rem;
}

.input-group {
  display: flex;
  align-items: stretch;
}
.input-group > .form-control,
.input-group > .btn {
  border-radius: 0;
}
.input-group > *:first-child {
  border-radius: var(--radius) 0 0 var(--radius);
}
.input-group > *:last-child {
  border-radius: 0 var(--radius) var(--radius) 0;
}
.input-group > *:not(:first-child) {
  margin-left: -1px;
}
.input-group-sm > .form-control,
.input-group-sm > .btn {
  padding: 0.25rem 0.5rem;
  font-size: 0.875rem;
}

/* ── Alerts ─────────────────────────────────────────────────────────────────── */

.alert {
  padding: 0.75rem 1rem;
  border: 1px solid transparent;
  border-radius: var(--radius);
  margin-bottom: 1rem;
  position: relative;
}

.alert-danger  { color: #58151c; background-color: #f8d7da; border-color: #f1aeb5; }
.alert-success { color: #0a3622; background-color: #d1e7dd; border-color: #a3cfbb; }
.alert-warning { color: #664d03; background-color: #fff3cd; border-color: #ffe69c; }
.alert-info    { color: #055160; background-color: #cff4fc; border-color: #9eeaf9; }

[data-theme="dark"] .alert-danger,
[data-theme="dark"] .alert-success,
[data-theme="dark"] .alert-warning,
[data-theme="dark"] .alert-info {
  color: var(--color-text);
}
[data-theme="dark"] .alert-danger  { background-color: #3d1515; border-color: #7a2020; }
[data-theme="dark"] .alert-success { background-color: #0f2a1a; border-color: #1e5c35; }
[data-theme="dark"] .alert-warning { background-color: #2a2000; border-color: #5c4700; }
[data-theme="dark"] .alert-info    { background-color: #072030; border-color: #0d4a6e; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .alert-danger  { color: var(--color-text); background-color: #3d1515; border-color: #7a2020; }
  :root:not([data-theme="light"]) .alert-success { color: var(--color-text); background-color: #0f2a1a; border-color: #1e5c35; }
  :root:not([data-theme="light"]) .alert-warning { color: var(--color-text); background-color: #2a2000; border-color: #5c4700; }
  :root:not([data-theme="light"]) .alert-info    { color: var(--color-text); background-color: #072030; border-color: #0d4a6e; }
}

.alert-dismissible {
  padding-right: 3rem;
}
.alert-dismissible .btn-close {
  position: absolute;
  top: 50%;
  right: 0.75rem;
  transform: translateY(-50%);
}

.fade { transition: opacity .15s linear; }
.fade:not(.show) { opacity: 0; }
.show { opacity: 1; }

/* ── Badge ──────────────────────────────────────────────────────────────────── */

.badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0.25em 0.5em;
  font-size: 0.75em;
  font-weight: 700;
  border-radius: var(--radius-sm);
  min-width: 2rem;
}

/* ── Tables ─────────────────────────────────────────────────────────────────── */

.table {
  width: 100%;
  color: var(--color-text);
  vertical-align: top;
  border-color: var(--color-border);
}
.table > thead { vertical-align: bottom; }
.table > :not(caption) > * > * {
  padding: 0.5rem;
  border-bottom: 1px solid var(--color-border);
}
.table-sm > :not(caption) > * > * { padding: 0.25rem 0.5rem; }

.table-hover > tbody > tr:hover > * {
  background-color: color-mix(in srgb, var(--color-text) 5%, transparent);
}

.table-dark {
  background-color: var(--color-surface-alt);
  color: var(--color-text);
}
.table-dark > tr > th {
  background-color: var(--color-surface-alt);
  border-color: var(--color-border);
}

.table-responsive {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}

/* ── Pagination ─────────────────────────────────────────────────────────────── */

.pagination {
  display: flex;
  gap: 0.25rem;
  list-style: none;
  flex-wrap: wrap;
}
.pagination-sm .page-link {
  padding: 0.2rem 0.5rem;
  font-size: 0.875rem;
}
.page-item { display: flex; }
.page-link {
  display: flex;
  align-items: center;
  padding: 0.375rem 0.625rem;
  color: var(--color-primary);
  background-color: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  text-decoration: none;
  transition: background-color .15s;
}
.page-link:hover { background-color: var(--color-surface-alt); }
.page-item.active .page-link {
  color: #fff;
  background-color: var(--color-primary);
  border-color: var(--color-primary);
}

/* ── Dropdown ───────────────────────────────────────────────────────────────── */

.dropdown { position: relative; }

.dropdown-toggle::after {
  display: none; /* we use icon instead */
}

.dropdown-menu {
  display: none;
  position: absolute;
  right: 0;
  top: calc(100% + 4px);
  min-width: 14rem;
  background-color: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  z-index: 200;
  overflow: hidden;
}
.dropdown-menu.show { display: block; }
.dropdown-menu-end { right: 0; left: auto; }

.dropdown-item {
  display: flex;
  align-items: center;
  gap: 0.25rem;
  padding: 0.5rem 1rem;
  color: var(--color-text);
  text-decoration: none;
  white-space: nowrap;
  background: transparent;
  border: none;
  width: 100%;
  cursor: pointer;
  font-size: 0.9375rem;
}
.dropdown-item:hover {
  background-color: var(--color-surface-alt);
  text-decoration: none;
}

.dropdown-item-text {
  display: block;
  padding: 0.5rem 1rem;
  color: var(--color-muted);
  font-size: 0.875rem;
}

.dropdown-divider {
  height: 0;
  margin: 0.25rem 0;
  overflow: hidden;
  border-top: 1px solid var(--color-border);
}

/* ── Modal ──────────────────────────────────────────────────────────────────── */

.modal {
  display: none;
  position: fixed;
  inset: 0;
  z-index: 1050;
  overflow-y: auto;
  background-color: rgba(0,0,0,.5);
  padding: 1rem;
  align-items: flex-start;
  justify-content: center;
}
.modal.show {
  display: flex;
}

.modal-dialog {
  background-color: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  width: 100%;
  max-width: 500px;
  margin-top: 3rem;
  overflow: hidden;
}

.modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 1rem;
  border-bottom: 1px solid var(--color-border);
}
.modal-title {
  font-size: 1.1rem;
  font-weight: 600;
  margin: 0;
}
.modal-body   { padding: 1rem; }
.modal-alerts:empty { display: none; }
.modal-alerts .alert { margin-bottom: 0.75rem; }
.modal-footer {
  display: flex;
  justify-content: flex-end;
  gap: 0.5rem;
  padding: 1rem;
  border-top: 1px solid var(--color-border);
}

/* ── Spinner ────────────────────────────────────────────────────────────────── */

.spinner-border {
  display: inline-block;
  width: 2rem; height: 2rem;
  border: 0.25em solid var(--color-border);
  border-right-color: var(--color-primary);
  border-radius: 50%;
  animation: spinner-border .75s linear infinite;
}
.spinner-border-sm {
  width: 1rem; height: 1rem;
  border-width: 0.2em;
}
@keyframes spinner-border {
  to { transform: rotate(360deg); }
}

/* ── Misc ───────────────────────────────────────────────────────────────────── */

.list-group-item {
  padding: 0.5rem 1rem;
  background-color: var(--color-surface);
  border: 1px solid var(--color-border);
  color: var(--color-text);
}

.list-unstyled { list-style: none; padding-left: 0; }

.nav-avatar {
  width: 28px; height: 28px;
  border-radius: 50%;
  object-fit: cover;
}

/* SVG icons — inherit text color, sized to 1em */
.icon {
  display: inline-block;
  width: 1em; height: 1em;
  vertical-align: -0.125em;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.5;
  stroke-linecap: round;
  stroke-linejoin: round;
  flex-shrink: 0;
}

/* Mask-based UI icons: colour via currentColor, shape from SVG file.
   Usage: <span class="ui-icon ui-icon-edit" aria-hidden="true"></span>
   Both icon-edit.svg and icon-delete.svg live in css/icons/ (symlinked). */
.ui-icon {
  display: inline-block;
  width: 1em; height: 1em;
  vertical-align: -0.125em;
  background-color: currentColor;
  -webkit-mask-size: contain;
          mask-size: contain;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-position: center;
          mask-position: center;
  flex-shrink: 0;
}
.ui-icon-edit {
  -webkit-mask-image: url('./icons/icon-edit.svg');
          mask-image: url('./icons/icon-edit.svg');
}
.ui-icon-delete {
  -webkit-mask-image: url('./icons/icon-delete.svg');
          mask-image: url('./icons/icon-delete.svg');
}
.ui-icon-ban {
  -webkit-mask-image: url('./icons/icon-ban.svg');
          mask-image: url('./icons/icon-ban.svg');
}
.ui-icon-check {
  -webkit-mask-image: url('./icons/icon-check.svg');
          mask-image: url('./icons/icon-check.svg');
}
.ui-icon-key {
  -webkit-mask-image: url('./icons/icon-key.svg');
          mask-image: url('./icons/icon-key.svg');
}
.ui-icon-shield-off {
  -webkit-mask-image: url('./icons/icon-shield-off.svg');
          mask-image: url('./icons/icon-shield-off.svg');
}
.ui-icon-filter {
  -webkit-mask-image: url('./icons/icon-filter.svg');
          mask-image: url('./icons/icon-filter.svg');
}
.ui-icon-close {
  -webkit-mask-image: url('./icons/icon-close.svg');
          mask-image: url('./icons/icon-close.svg');
}

/* Compact icon-only button: square, tight padding, 1.1em icon.
   Usage: <button class="btn btn-sm btn-icon" title="…" aria-label="…">
            <span class="ui-icon ui-icon-edit" aria-hidden="true"></span>
          </button> */
.btn-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: .25rem .4rem;
  line-height: 1;
}
.btn-icon .ui-icon {
  width: 1.1em;
  height: 1.1em;
  vertical-align: middle;
}

/* ── Login page ─────────────────────────────────────────────────────────────── */

.login-wrap {
  display: flex;
  justify-content: center;
  align-items: flex-start;
  min-height: calc(100vh - 60px);
  padding: 2rem;
}

.login-card {
  background: var(--color-card);
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  padding: 2rem;
  width: 100%;
  max-width: 360px;
  box-shadow: var(--shadow);
}

.login-card h2 {
  margin: 0 0 1.5rem;
  text-align: center;
  font-size: 1.1rem;
  color: var(--color-text);
}

.login-card .form-group { margin-bottom: 1rem; }

.btn-login {
  width: 100%;
  padding: 0.7rem;
  background: var(--color-primary);
  color: #fff;
  border: none;
  border-radius: var(--radius);
  font-size: 1rem;
  font-weight: 600;
  cursor: pointer;
  margin-top: 0.5rem;
}
.btn-login:hover { background: var(--color-primary-hover); }

.login-links {
  margin-top: 1rem;
  text-align: center;
  font-size: 0.85rem;
}
.login-links a { color: var(--color-muted); text-decoration: none; }
.login-links a:hover { color: var(--color-primary); text-decoration: underline; }
