/* web_board/assets/admin-v1.css — admin pages on UI v1 (partners.php first). The cabinet's
   component styles (pt-*) are reused from the partner stylesheet; this file adds the admin frame. */
@import url("https://rentoplan.com/en/partner/assets/partner-v1.css?v=4");
.adm-body { background: var(--rp-bg); color: var(--rp-text); }
.adm-top { border-bottom: 1px solid var(--rp-border); background: var(--rp-bg); position: sticky; top: 0; z-index: 20; }
.adm-top-in { max-width: 1400px; margin: 0 auto; padding: 0 24px; height: 60px; display: flex; align-items: center; gap: 20px; }
/* [2026-09-10] One line, always. The brand used to wrap to two the moment the bar ran out of
   room, which is what a broken header looks like. «Admin» is a subtitle, not part of the name. */
.adm-brand { display: flex; align-items: baseline; gap: 6px; flex: none; font-weight: 800; color: var(--rp-accent); font-size: var(--rp-fs-17); letter-spacing: -.02em; white-space: nowrap; }
.adm-brand span { font-size: var(--rp-fs-12); font-weight: 700; color: var(--rp-text-2); letter-spacing: 0; }
/* min-width:0 is the load-bearing half: without it a flex item refuses to shrink below its
   content, so every new link stole width from the brand and the user menu instead of scrolling. */
.adm-nav { display: flex; gap: 2px; flex: 1; min-width: 0; overflow-x: auto; scrollbar-width: none; -ms-overflow-style: none; }
.adm-nav::-webkit-scrollbar { display: none; }
.adm-nav a { white-space: nowrap; }
.adm-nav a { padding: 8px 12px; border-radius: 10px; font-weight: 600; color: var(--rp-text-2); font-size: var(--rp-fs-14); }
.adm-nav a:hover { background: var(--rp-surface); color: var(--rp-text); }
.adm-nav a.is-active { background: var(--rp-ink); color: var(--rp-on-ink); }
.adm-user { font-size: var(--rp-fs-13); color: var(--rp-text-2); }
.adm-user a { color: var(--rp-text); font-weight: 600; }
.adm-main { max-width: 1400px; margin: 0 auto; padding: 24px; display: flex; flex-direction: column; gap: 20px; }
.adm-tabs { align-self: flex-start; }
.adm-tabs .rp-seg-opt.is-active { background: var(--rp-bg); color: var(--rp-text); box-shadow: var(--rp-sh-sm); }
.adm-count { display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 6px; border-radius: 10px; background: var(--rp-accent); color: #fff; font-size: 11px; margin-left: 6px; }
.adm-stats { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.adm-inline { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.adm-inline .rp-select { width: 180px; }
.adm-inline .rp-input { flex: 1; min-width: 200px; }
.pt-table form { display: inline; }
.adm-dups { display: flex; flex-direction: column; gap: 16px; }
.adm-dup-head { display: flex; gap: 16px; flex-wrap: wrap; align-items: center; font-size: var(--rp-fs-14); }
.adm-dup-pair { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
.adm-dup-card { display: flex; flex-direction: column; gap: 4px; border: 1px solid var(--rp-border); border-radius: 16px; overflow: hidden; color: inherit; font-size: var(--rp-fs-13); padding-bottom: 12px; }
.adm-dup-card img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; display: block; margin-bottom: 8px; }
.adm-dup-card b, .adm-dup-card span { padding: 0 12px; }
@media (max-width: 1023px) { .adm-top-in { gap: 12px; flex-wrap: wrap; height: auto; padding: 10px 16px; } .adm-main { padding: 16px; } .adm-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* ---------- v2: shared header (_header.php) ---------- */
/* [2026-09-10] .adm-quick removed: the header's three counters moved to .adm-totals on the
   listings page and to /dashboard. See web_board/_header.php for why. */
.adm-user { position: relative; }
.adm-user-btn { display: inline-flex; align-items: center; gap: 8px; height: 36px; padding: 0 10px 0 4px; border: 1px solid var(--rp-border); border-radius: var(--rp-r-pill); background: var(--rp-bg); font: inherit; font-size: var(--rp-fs-13); font-weight: 600; color: var(--rp-text); cursor: pointer; }
.adm-user-btn:hover { border-color: var(--rp-ink); }
.adm-user-name { max-width: 140px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (max-width: 1279px) { .adm-user-name { display: none; } .adm-user-btn { padding: 0 4px; } }
.adm-avatar { width: 28px; height: 28px; border-radius: 50%; background: var(--rp-ink); color: var(--rp-on-ink); font-size: 11px; font-weight: 800; display: inline-flex; align-items: center; justify-content: center; letter-spacing: .04em; }
.adm-user-menu { display: none; position: absolute; right: 0; top: calc(100% + 8px); min-width: 200px; background: var(--rp-bg); border: 1px solid var(--rp-border); border-radius: 14px; box-shadow: var(--rp-sh-md); padding: 6px; z-index: 30; }
.adm-user-menu.show { display: block; }
.adm-user-info { display: flex; flex-direction: column; padding: 8px 10px 10px; border-bottom: 1px solid var(--rp-border); margin-bottom: 4px; font-size: var(--rp-fs-13); }
.adm-user-info small { color: var(--rp-text-2); text-transform: capitalize; }
.adm-user-menu a { display: block; padding: 8px 10px; border-radius: 8px; font-size: var(--rp-fs-14); color: var(--rp-text); }
.adm-user-menu a:hover { background: var(--rp-surface); }

/* ---------- v2: properties list ---------- */
.adm-filters { padding: 16px 20px; }
.adm-filters-row { display: grid; grid-template-columns: minmax(200px, 1.6fr) repeat(5, minmax(120px, 1fr)) auto; gap: 10px; align-items: end; }
.adm-filters .rp-field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.adm-filters .rp-field-label { font-size: var(--rp-fs-12); font-weight: 600; color: var(--rp-text-2); }
.adm-filters .rp-input, .adm-filters .rp-select { width: 100%; }
.adm-filters-actions { display: flex; gap: 6px; }
.adm-props { min-width: 1100px; }
.adm-col-check { width: 36px; }
.adm-props input[type="checkbox"] { width: 16px; height: 16px; margin: 4px 0 0; }
.adm-thumb { position: relative; width: 96px; height: 72px; border-radius: 10px; overflow: hidden; background: var(--rp-surface); display: flex; align-items: center; justify-content: center; }
.adm-thumb img, .adm-thumb video { width: 100%; height: 100%; object-fit: cover; display: block; }
.adm-thumb-empty .rp-i { width: 22px; height: 22px; color: var(--rp-text-3); }
.adm-thumb-play { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; color: #fff; pointer-events: none; }
.adm-thumb-play .rp-i { width: 22px; height: 22px; filter: drop-shadow(0 1px 2px rgba(0,0,0,.5)); }
.adm-thumb-n { position: absolute; right: 4px; bottom: 4px; background: rgba(0,0,0,.65); color: #fff; font-size: 11px; font-weight: 700; padding: 1px 6px; border-radius: 8px; }
.adm-price { font-weight: 800; font-variant-numeric: tabular-nums; white-space: nowrap; }
.adm-price span { font-weight: 500; color: var(--rp-text-2); font-size: var(--rp-fs-12); }
.adm-link { display: inline-flex; align-items: center; gap: 4px; padding: 0; border: 0; background: none; font: inherit; font-size: var(--rp-fs-13); color: var(--rp-accent); cursor: pointer; margin-top: 4px; }
.adm-link .rp-i { width: 14px; height: 14px; }
.pt-badge.adm-st-active { background: var(--rp-success-soft); color: var(--rp-success); }
.pt-badge.adm-st-pending { background: #FEF3C7; color: #92400E; }
.pt-badge.adm-st-inactive { background: #FEE2E2; color: #B91C1C; }
.adm-props td.pt-row-actions { width: 200px; min-width: 200px; }
.adm-pag { display: flex; justify-content: space-between; align-items: center; gap: 16px; flex-wrap: wrap; }
.adm-pag .rp-pagination { padding-top: 0; }

/* ---------- v2: login ---------- */
.adm-login { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 24px; }
.adm-login-card { width: 100%; max-width: 400px; gap: 8px; }
.adm-login-card .pt-form { margin-top: 12px; }
.adm-login-card .rp-btn { margin-top: 4px; }
.login-form.shake { animation: adm-shake .4s; }
@keyframes adm-shake { 0%, 100% { transform: translateX(0); } 25% { transform: translateX(-6px); } 75% { transform: translateX(6px); } }

/* ---------- v2: edit page ---------- */
.adm-edit-head .pt-h1 { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.adm-edit-layout { display: grid; grid-template-columns: minmax(0, 1fr) 360px; gap: 20px; align-items: start; }
.adm-edit-main, .adm-edit-side { display: flex; flex-direction: column; gap: 20px; min-width: 0; }
.adm-edit-side { position: sticky; top: 76px; }
.edit-section .section-header { display: flex; justify-content: space-between; align-items: center; gap: 12px; }
.edit-section .section-content { display: flex; flex-direction: column; gap: 14px; }
.edit-section .section-content[style*="block"] { display: flex !important; }
.pt-h2 { margin: 0; font-size: var(--rp-fs-17); font-weight: 800; letter-spacing: -.02em; }
.pt-h3 { margin: 0; font-size: var(--rp-fs-14); font-weight: 700; }
.adm-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px 14px; }
.adm-grid .rp-field, .edit-section .rp-field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.adm-grid .rp-field-label, .edit-section .rp-field-label { font-size: var(--rp-fs-13); font-weight: 600; }
.edit-section .rp-input, .edit-section .rp-select { width: 100%; }
.edit-section .rp-input[readonly] { background: var(--rp-surface); color: var(--rp-text-2); }
.adm-span2 { grid-column: 1 / -1; }
.adm-sub { display: flex; flex-direction: column; gap: 12px; padding-top: 14px; border-top: 1px solid var(--rp-border); }
/* [2026-09-13] .adm-sub was written for a DIV of rows (edit.php) and is used on 40 paragraphs across
   the board — where the flex column turned every inline <em>, <b>, <code> and <strong> into a line of
   its own: «…applied by the supplier / inside / the price they quote». A paragraph is a paragraph. */
p.adm-sub { display: block; }
.adm-sub .pt-row-actions { justify-content: flex-start; }
.adm-features { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 14px; }
.adm-features .pt-check { align-items: center; }
.adm-features .pt-check input { margin-top: 0; }
.adm-dl { display: grid; grid-template-columns: auto 1fr; gap: 6px 12px; margin: 0; font-size: var(--rp-fs-13); }
.adm-dl dt { color: var(--rp-text-2); }
.adm-dl dd { margin: 0; font-variant-numeric: tabular-nums; }
.adm-stack { gap: 8px; }
.adm-stack .rp-btn { width: 100%; }
.adm-media { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.adm-media .no-media { grid-column: 1 / -1; padding: 20px; }
.adm-media-item { border: 1px solid var(--rp-border); border-radius: 12px; overflow: hidden; display: flex; flex-direction: column; }
.adm-media-item.is-off .adm-media-pic { opacity: .45; }
.adm-media-pic { position: relative; aspect-ratio: 4 / 3; background: var(--rp-surface); }
.adm-media-pic img, .adm-media-pic video { width: 100%; height: 100%; object-fit: cover; display: block; cursor: zoom-in; }
.adm-media-bar { display: flex; justify-content: space-between; align-items: center; gap: 6px; padding: 8px; }
.adm-media-bar .pt-badge { height: 22px; padding: 0 8px; font-size: 11px; }
.adm-media-acts { display: flex; gap: 4px; }
.adm-media-acts .rp-btn-sm { height: 28px; padding: 0 8px; }
.adm-media-acts .rp-i { width: 14px; height: 14px; }
.btn-danger:hover { color: var(--rp-danger); border-color: var(--rp-danger); }

/* ---------- v2: modals (shown by scripts via inline display) ---------- */
.modal { position: fixed; inset: 0; z-index: 100; background: rgba(15, 23, 42, .55); display: none; align-items: center; justify-content: center; padding: 16px; }
.modal[style*="display: block"], .modal[style*="display: flex"] { display: flex !important; }
.modal-content { width: 100%; max-width: 560px; max-height: calc(100vh - 32px); overflow: auto; background: var(--rp-bg); border-radius: 20px; box-shadow: var(--rp-sh-lg); display: flex; flex-direction: column; }
.modal-content.modal-large { max-width: 960px; }
.modal-header { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 18px 24px; border-bottom: 1px solid var(--rp-border); }
.modal-header h3 { margin: 0; font-size: var(--rp-fs-17); font-weight: 800; letter-spacing: -.02em; }
.modal-close { width: 36px; height: 36px; border: 0; border-radius: 50%; background: var(--rp-surface); font-size: 22px; line-height: 1; color: var(--rp-text-2); cursor: pointer; flex: none; }
.modal-close:hover { background: var(--rp-n200); color: var(--rp-text); }
.modal-body { padding: 20px 24px 24px; display: flex; flex-direction: column; gap: 14px; }
.adm-modal-actions { justify-content: flex-end; }
.image-modal .modal-body { align-items: center; }
.image-modal img { border-radius: 12px; }

/* upload */
.upload-area { border: 2px dashed var(--rp-border); border-radius: 16px; padding: 32px 20px; text-align: center; transition: border-color var(--rp-t-fast), background var(--rp-t-fast); }
.upload-area.drag-over { border-color: var(--rp-accent); background: var(--rp-accent-soft); }
.upload-content { display: flex; flex-direction: column; gap: 8px; align-items: center; }
.upload-content h3 { margin: 0; font-size: var(--rp-fs-17); font-weight: 800; }
.adm-upload-icon { width: 32px; height: 32px; color: var(--rp-text-3); }
.upload-progress { display: flex; flex-direction: column; gap: 6px; }
.progress-bar { height: 8px; border-radius: 4px; background: var(--rp-surface); overflow: hidden; }
.progress-fill { height: 100%; width: 0; background: var(--rp-accent); transition: width .2s; }
.progress-text { font-size: var(--rp-fs-13); color: var(--rp-text-2); }
.upload-preview { display: grid; grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); gap: 8px; }
.upload-preview img, .upload-preview video { width: 100%; aspect-ratio: 1; object-fit: cover; border-radius: 10px; display: block; }

/* ---------- v2: toasts (markup built by script.js / edit.js) ---------- */
.toast-container { position: fixed; right: 16px; bottom: 16px; z-index: 200; display: flex; flex-direction: column; gap: 8px; max-width: min(380px, calc(100vw - 32px)); }
.toast { display: flex; align-items: flex-start; gap: 10px; padding: 12px 14px; border-radius: 14px; background: var(--rp-ink); color: var(--rp-on-ink); box-shadow: var(--rp-sh-md); font-size: var(--rp-fs-14); line-height: 1.4; animation: adm-toast-in .25s var(--rp-ease); }
.toast.toast-success, .toast.success { background: var(--rp-success); color: #fff; }
.toast.toast-error, .toast.error { background: var(--rp-danger); color: #fff; }
.toast.toast-warning, .toast.warning { background: #92400E; color: #fff; }
.toast-icon { flex: none; }
.toast-content { flex: 1; min-width: 0; }
.toast-close { border: 0; background: none; color: inherit; opacity: .7; font-size: 18px; line-height: 1; cursor: pointer; padding: 0; }
.toast-close:hover { opacity: 1; }
@keyframes adm-toast-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@keyframes slideOutRight { to { opacity: 0; transform: translateX(24px); } }

/* ---------- v2: responsive ---------- */
@media (max-width: 1279px) { .adm-filters-row { grid-template-columns: repeat(3, minmax(0, 1fr)); } .adm-filters-actions { grid-column: 1 / -1; } }
@media (max-width: 1023px) { .adm-edit-layout { grid-template-columns: minmax(0, 1fr); } .adm-edit-side { position: static; } .adm-nav { order: 3; flex-basis: 100%; overflow-x: auto; } .adm-user { margin-left: auto; } }
@media (max-width: 767px) { .adm-filters-row { grid-template-columns: repeat(2, minmax(0, 1fr)); } .adm-f-search { grid-column: 1 / -1; } .adm-grid, .adm-features, .adm-media { grid-template-columns: minmax(0, 1fr); } .adm-edit-head .pt-head-actions { width: 100%; } .adm-edit-head .pt-head-actions .rp-btn { flex: 1; } .modal { padding: 0; align-items: flex-end; } .modal-content { max-height: 92vh; border-radius: 20px 20px 0 0; } .modal-header, .modal-body { padding-left: 16px; padding-right: 16px; } .toast-container { left: 16px; right: 16px; max-width: none; } }
@media (prefers-reduced-motion: reduce) { .toast, .login-form.shake { animation: none; } }

/* ---------- v2: ranking page ---------- */
.adm-formula { margin: 0; padding: 14px 16px; border-radius: 12px; background: var(--rp-surface); font-size: var(--rp-fs-14); line-height: 1.6; }
.adm-rank-grid { display: grid; grid-template-columns: minmax(0, 1fr) 380px; gap: 20px; align-items: start; }
.adm-rank-side { display: flex; flex-direction: column; gap: 20px; }
.adm-rank-field small { display: block; line-height: 1.4; }
.adm-dist { display: flex; flex-direction: column; gap: 6px; }
.adm-dist-row { display: grid; grid-template-columns: 28px minmax(0, 1fr) 110px; gap: 10px; align-items: center; font-size: var(--rp-fs-13); }
.adm-dist-q { font-weight: 800; text-align: right; }
.adm-dist-bar { height: 10px; border-radius: 5px; background: var(--rp-surface); overflow: hidden; }
.adm-dist-bar i { display: block; height: 100%; background: var(--rp-accent); border-radius: 5px; }
.adm-dist-n { text-align: right; white-space: nowrap; }
.adm-dl-wide { grid-template-columns: 90px 1fr; }
@media (max-width: 1023px) { .adm-rank-grid { grid-template-columns: minmax(0, 1fr); } }
.adm-thumb-flag { position: absolute; left: 4px; top: 4px; background: #FEF3C7; color: #92400E; font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 8px; }
.adm-media-ext { display: flex; align-items: center; justify-content: center; gap: 6px; height: 100%; font-size: var(--rp-fs-13); font-weight: 600; color: var(--rp-accent); }
.adm-media-ext .rp-i { width: 18px; height: 18px; }

/* ---------- v4: AI moderation ---------- */
.adm-ai { margin-top: 6px; display: flex; flex-direction: column; gap: 4px; }
.pt-badge.adm-ai-10 { background: var(--rp-surface); color: var(--rp-text-2); }
.pt-badge.adm-ai-20 { background: var(--rp-success-soft); color: var(--rp-success); }
.pt-badge.adm-ai-30 { background: #FEE2E2; color: #B91C1C; }
.pt-badge.adm-ai-40 { background: #FEF3C7; color: #92400E; }
.adm-ai-card { border-color: var(--rp-ink); }
.adm-ai-summary { margin: 0; font-size: var(--rp-fs-14); line-height: 1.5; font-weight: 600; }
.adm-issues { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 8px; font-size: var(--rp-fs-13); line-height: 1.45; }
.adm-issues li { padding: 8px 10px 8px 12px; border-left: 3px solid var(--rp-border); background: var(--rp-surface); border-radius: 0 10px 10px 0; }
.adm-issues li.is-reject { border-left-color: var(--rp-danger); }
.adm-issues li.is-fix, .adm-issues li.is-review { border-left-color: #D97706; }
.adm-issues li.is-fixed { border-left-color: var(--rp-success); }
.adm-issues li b { display: block; font-size: var(--rp-fs-12); text-transform: uppercase; letter-spacing: .04em; color: var(--rp-text-2); margin-bottom: 2px; }
.adm-issues li small { display: block; color: var(--rp-text-2); margin-top: 3px; }
.adm-ai-actions { justify-content: flex-start; }

/* Revive inactive scans (Properties page) */
.adm-revive { padding: 16px 20px; margin-top: 12px; display: flex; flex-direction: column; gap: 8px; }
.adm-revive-row { display: flex; align-items: flex-end; gap: 16px; flex-wrap: wrap; }
.adm-revive-switch { display: inline-flex; align-items: center; gap: 8px; height: var(--rp-h-md); cursor: pointer; }
.adm-revive-switch input { width: 18px; height: 18px; accent-color: var(--rp-accent); }
.adm-revive-cap { display: flex; flex-direction: column; gap: 6px; width: 180px; }
.adm-revive-cap .rp-field-label { font-size: var(--rp-fs-12); font-weight: 600; color: var(--rp-text-2); }
.adm-revive-stats { margin: 0; font-variant-numeric: tabular-nums; }
.adm-revive-help { margin: 0; font-size: var(--rp-fs-12); max-width: 900px; }

/* [2026-09-09] Suppliers page (web_board/suppliers.php). Only what the shared classes do not
   already cover: the page itself is .adm-main + .pt-table + .rp-input, like every other one. */
.adm-sup-flash { margin: 0 0 16px; padding: 10px 14px; border-radius: 10px; background: var(--rp-success-soft, #E6F6EC); color: var(--rp-success-text, #1E7A46); font-size: var(--rp-fs-14, 14px); }
.adm-sup-table td { vertical-align: top; }
.adm-sup-table td small { display: block; margin-top: 4px; line-height: 1.4; }
.adm-sup-dim { color: var(--rp-text-2, #6B7280); font-size: var(--rp-fs-12, 12px); }
.adm-sup-check { display: inline-flex; align-items: center; gap: 8px; font-size: var(--rp-fs-14, 14px); cursor: pointer; }
/* [2026-09-13] TWO CLASSES, NOT ONE. This sheet is linked BEFORE ui_head.php's components.css, whose
   `.rp-input { width: 100%; max-width: 100% }` has the same specificity and therefore the last word:
   the old `.adm-sup-margin { max-width: 7rem }` never applied, and the margin field has been as
   wide as its column since the day it was written. Scoped to the table, the rule outranks it. */
.adm-sup-table .adm-sup-margin, .adm-sup-table .adm-sup-cap-input { width: 5.5rem; max-width: 5.5rem; flex: none; }
/* the paid calendar's daily cap: a short field and three words on one line under the switch */
.adm-sup-cap { display: flex; align-items: center; gap: 8px; margin-top: 8px; white-space: nowrap; cursor: text; }
/* [2026-09-13] THE SWITCH IS THE STATE. A checkbox drawn as a toggle: grey track = off, green track
   = on, the knob slides; the form still posts an ordinary checkbox. Disabled: pale, no hand. */
.adm-switch { -webkit-appearance: none; appearance: none; flex: none; position: relative; width: 38px; height: 22px; margin: 0; border-radius: 11px; background: var(--rp-n300, #C9CED6); border: 0; cursor: pointer; transition: background .15s; }
.adm-switch::before { content: ''; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px; border-radius: 50%; background: #fff; box-shadow: 0 1px 2px rgba(0, 0, 0, .25); transition: left .15s; }
.adm-switch:checked { background: var(--rp-success, #1E9E5A); }
.adm-switch:checked::before { left: 18px; }
.adm-switch:focus-visible { outline: 2px solid var(--rp-accent, #C8102E); outline-offset: 2px; }
.adm-switch[disabled] { opacity: .45; cursor: not-allowed; }
.adm-sup-check input[disabled] + span { color: var(--rp-text-3, #9CA3AF); cursor: not-allowed; }
.adm-sup-check span { font-weight: 600; font-size: var(--rp-fs-13, 13px); }
/* the readiness report: the verdict column is one glyph, so the eye finds the failures first */
.adm-chk-mark { width: 2.2rem; text-align: center; font-weight: 700; font-size: var(--rp-fs-17, 17px); }
.adm-chk-mark.is-ok { color: var(--rp-success, #1E9E5A); }
.adm-chk-mark.is-bad { color: var(--rp-danger, #E0442E); }
.adm-chk-mark.is-na { color: var(--rp-text-3, #9CA3AF); }
/* the switch says one thing and the catalogue another: shown as a contradiction, not as a number */
.adm-sup-drift { color: var(--rp-danger-text, #A3301F); font-weight: 600; font-size: var(--rp-fs-12, 12px); }
/* the explanation of the switches, once, under the table — see the note in suppliers.php */
.adm-sup-legend { margin: 0 0 24px; }
.adm-sup-legend dt { font-weight: 700; font-size: var(--rp-fs-14, 14px); color: var(--rp-text, #16181D); margin-top: 12px; }
.adm-sup-legend dd { margin: 2px 0 0; max-width: 70ch; color: var(--rp-text-2, #6B7280); font-size: var(--rp-fs-14, 14px); line-height: 1.5; }

/* ============================================================================================
   [2026-09-09] BOARD PAGES BORROWED THE PARTNER THEME'S CLASSES AND NEVER GOT ITS STYLESHEET.
   ranking.php, clients.php, partners.php, budget.php and codes.php are all written with pt-card,
   pt-flash, pt-muted, pt-head and friends — which live in web_partner/assets/partner-v1.css and are
   never loaded on board.rentoplan.com. So those blocks have been rendering as bare HTML: a flash
   message with no background, cards with no border, «muted» text the same weight as everything
   around it. It was easy to miss because the pages still worked.

   These are the SAME definitions, copied from the partner theme rather than reinvented, so the two
   surfaces do not drift into looking like different products. Only the classes the board actually
   uses are here; the partner theme keeps its own copy and is untouched.
   ============================================================================================ */
.pt-lead { margin: 0; font-size: var(--rp-fs-15); color: var(--rp-text-2); line-height: 1.5; }
.pt-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; flex-wrap: wrap; }
.pt-back { display: inline-flex; align-items: center; gap: 6px; font-size: var(--rp-fs-13); color: var(--rp-text-2); margin-bottom: 8px; }
.pt-back .rp-i { width: 14px; height: 14px; }
.pt-flash { border-radius: 14px; padding: 12px 16px; font-size: var(--rp-fs-14); line-height: 1.5; background: var(--rp-surface); }
.pt-flash.is-success { background: var(--rp-success-soft); color: var(--rp-success); }
.pt-flash.is-error { background: var(--rp-danger-soft, #FEE2E2); color: var(--rp-danger); }
.pt-flash.is-warn { background: #FEF3C7; color: #92400E; }
.pt-flash a { font-weight: 700; color: inherit; text-decoration: underline; }
.pt-muted { margin: 0; font-size: var(--rp-fs-14); color: var(--rp-text-2); line-height: 1.5; }
.pt-muted a, .pt-links a { text-decoration: underline; }
.pt-ok { color: var(--rp-success); font-weight: 700; }
.pt-warn { color: #B45309; font-weight: 700; }
.pt-mono { font-variant-numeric: tabular-nums; font-size: var(--rp-fs-13); color: var(--rp-text-2); }
.pt-grid-2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
.pt-card { display: flex; flex-direction: column; gap: 14px; border: 1px solid var(--rp-border); border-radius: 20px; padding: 24px; background: var(--rp-bg); min-width: 0; }
.pt-card h2 { margin: 0; font-size: var(--rp-fs-17); font-weight: 800; letter-spacing: -.02em; }
.pt-stats { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 10px; }
.pt-stat { display: flex; flex-direction: column; gap: 2px; border: 1px solid var(--rp-border); border-radius: 16px; padding: 14px 16px; color: inherit; }
.pt-stat b { font-size: var(--rp-fs-24); font-weight: 800; letter-spacing: -.02em; }
.pt-stat span { font-size: var(--rp-fs-13); color: var(--rp-text-2); }
.pt-stat.is-active { border-color: var(--rp-ink); }
.pt-stat.is-warn b { color: #B45309; }
.pt-empty { display: flex; flex-direction: column; gap: 10px; align-items: flex-start; border: 1px dashed var(--rp-border); border-radius: 20px; padding: 32px; }
.pt-empty h2 { margin: 0; font-size: var(--rp-fs-20); font-weight: 800; }
.pt-empty p { margin: 0; color: var(--rp-text-2); max-width: 60ch; line-height: 1.5; }
.pt-table-wrap { overflow-x: auto; border: 1px solid var(--rp-border); border-radius: 16px; }
.pt-item-title { font-weight: 700; }
.pt-item-meta { font-size: var(--rp-fs-13); color: var(--rp-text-2); }
.pt-pagination { display: flex; gap: 6px; flex-wrap: wrap; }
.pt-leads { display: flex; flex-direction: column; gap: 12px; }
.pt-lead { border: 1px solid var(--rp-border); border-radius: 16px; padding: 16px 20px; display: flex; flex-direction: column; gap: 10px; }
.pt-lead-head { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
.pt-kv { margin: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 8px 16px; }
.pt-kv > div { display: flex; flex-direction: column; gap: 2px; }
.pt-kv dt { font-size: var(--rp-fs-12); text-transform: uppercase; letter-spacing: .04em; color: var(--rp-text-2); }
.pt-kv dd { margin: 0; font-size: var(--rp-fs-15); }
.pt-kv .is-contact dd { font-weight: 700; }
.lp-api .pt-card h2 { font-size: var(--rp-fs-20); }
.pt-grid-2, .lp-api, .lp-rules { grid-template-columns: minmax(0, 1fr); }
.pt-stats { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.pt-card { padding: 18px; border-radius: 16px; }
.pt-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.pt-stat { padding: 12px 14px; }
.pt-stat b { font-size: var(--rp-fs-20); }

/* [2026-09-09] Classes the board's own pages invented and never defined anywhere: the client feed
   (web_board/clients.php) and the budget grid (web_board/budget.php). Same treatment as above —
   the markup was written, the rules were not, and both pages have been rendering unstyled. */

/* clients: the kind filter reads as a row of chips, and the active one is obvious at a glance */
.cl-kinds { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 12px; }
.cl-kind { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: 999px;
	border: 1px solid var(--rp-border, #E5E7EB); background: var(--rp-bg, #FFF); color: var(--rp-text-2, #6B7280);
	font-size: var(--rp-fs-13, 13px); text-decoration: none; }
.cl-kind:hover { border-color: var(--rp-ink, #16181D); color: var(--rp-text, #16181D); }
.cl-kind.is-active { background: var(--rp-ink, #16181D); border-color: var(--rp-ink, #16181D); color: var(--rp-on-ink, #FFF); }
.cl-kind b { font-variant-numeric: tabular-nums; opacity: .7; font-weight: 600; }
.cl-kind.is-active b { opacity: .85; }
.cl-filters { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 0 0 16px; }
.cl-filters .rp-input, .cl-filters select { max-width: 14rem; }
.cl-data { display: flex; flex-direction: column; gap: 2px; font-size: var(--rp-fs-13, 13px); line-height: 1.45; }
/* a notification that never went out: this is the one cell on the page that must catch the eye */
.cl-ping { margin-top: 4px; display: inline-block; padding: 1px 7px; border-radius: 999px;
	background: var(--rp-danger-soft, #FCE8E4); color: var(--rp-danger-text, #A3301F);
	font-size: var(--rp-fs-12, 12px); font-weight: 600; }

/* budget: a table of prices, so the numbers line up and the type headings break it into blocks */
.bd-grid { width: 100%; border-collapse: collapse; font-size: var(--rp-fs-14, 14px); }
.bd-grid th, .bd-grid td { padding: 8px 10px; border-bottom: 1px solid var(--rp-border, #E5E7EB); text-align: left; vertical-align: top; }
.bd-type { background: var(--rp-surface, #F7F7F8); font-weight: 700; color: var(--rp-text, #16181D); }
.bd-desc { color: var(--rp-text-2, #6B7280); font-size: var(--rp-fs-13, 13px); }
.bd-w { color: var(--rp-text-2, #6B7280); font-size: var(--rp-fs-13, 13px); }
.bd-num { max-width: 9rem; font-variant-numeric: tabular-nums; }


/* ---------- v3: dashboard (dashboard.php) and the listings totals ----------
   [2026-09-10] One rule runs this whole block: colour marks what needs a person. A large number is
   not by itself a problem — 130 000 published listings is the business working — so numbers are
   printed in plain text and amber is spent only on a queue that has stopped moving. Everything is
   built from .pt-card and the rp-* tokens the rest of the board already uses; nothing here invents
   a second design language. */

.adm-dash-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.adm-period { display: inline-flex; gap: 2px; padding: 3px; border: 1px solid var(--rp-border); border-radius: var(--rp-r-pill); }
.adm-period a { padding: 6px 14px; border-radius: var(--rp-r-pill); font-size: var(--rp-fs-13); font-weight: 600; color: var(--rp-text-2); white-space: nowrap; }
.adm-period a.is-active { background: var(--rp-ink); color: var(--rp-on-ink); }

/* The only element allowed to raise its voice, and only when it has something to say. */
.adm-health { border: 1px solid var(--rp-border); border-radius: 20px; padding: 18px 24px; }
.adm-health h2 { margin: 0; font-size: var(--rp-fs-15); font-weight: 800; letter-spacing: -.01em; }
.adm-health ul { margin: 12px 0 0; padding-left: 18px; display: flex; flex-direction: column; gap: 6px; font-size: var(--rp-fs-14); line-height: 1.5; }
.adm-health.is-ok { border-color: var(--rp-success); background: var(--rp-success-soft); }
.adm-health.is-ok h2 { color: var(--rp-success); }
.adm-health.is-bad { border-color: #FCA5A5; background: #FEF2F2; }
.adm-health.is-bad h2 { color: #B91C1C; }

.adm-kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 12px; }
.adm-kpi { display: flex; flex-direction: column; gap: 2px; border: 1px solid var(--rp-border); border-radius: 16px; padding: 16px 18px; background: var(--rp-bg); color: inherit; min-width: 0; }
a.adm-kpi:hover { border-color: var(--rp-ink); }
.adm-kpi-v { font-size: var(--rp-fs-28); font-weight: 800; letter-spacing: -.03em; font-variant-numeric: tabular-nums; line-height: 1.1; }
.adm-kpi-l { font-size: var(--rp-fs-13); color: var(--rp-text-2); font-weight: 600; }
.adm-kpi-n { font-size: var(--rp-fs-12); color: var(--rp-text-2); }
.adm-kpi.is-warn { border-color: #FDE68A; background: #FFFBEB; }
.adm-kpi.is-warn .adm-kpi-v { color: #92400E; }

.adm-dash-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 20px; align-items: start; }
.adm-dash-grid .pt-card { gap: 0; padding: 20px 24px; }
.adm-dash-grid .pt-card h2 { margin-bottom: 8px; }

/* A label and its number on one baseline, separated by a hairline rather than by empty space:
   twelve rows of padding read as twelve unrelated things. */
.adm-row { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; padding: 9px 0; border-top: 1px solid var(--rp-border); font-size: var(--rp-fs-14); }
.adm-row:first-of-type { border-top: 0; }
.adm-row span { color: var(--rp-text-2); min-width: 0; }
.adm-row b { font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }
.adm-row.is-warn b { color: #92400E; }
.adm-row a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }

.adm-list { margin-top: 14px; }
.adm-list h3 { margin: 0 0 2px; font-size: var(--rp-fs-12); text-transform: uppercase; letter-spacing: .04em; color: var(--rp-text-2); font-weight: 700; }

.adm-crons { padding: 20px 24px; }
.adm-crons table { width: 100%; }
.adm-crons td, .adm-crons th { padding: 8px 0; }

/* Listings page: the totals the header used to carry, next to the filter that selects them. */
.adm-totals { display: flex; flex-wrap: wrap; gap: 8px; }
.adm-totals a { display: inline-flex; align-items: baseline; gap: 6px; padding: 8px 14px; border: 1px solid var(--rp-border); border-radius: var(--rp-r-pill); font-size: var(--rp-fs-13); color: var(--rp-text-2); }
.adm-totals a:hover { border-color: var(--rp-ink); }
.adm-totals a.is-active { border-color: var(--rp-ink); background: var(--rp-ink); color: var(--rp-on-ink); }
.adm-totals b { font-size: var(--rp-fs-15); font-weight: 800; color: var(--rp-text); font-variant-numeric: tabular-nums; }
.adm-totals a.is-active b { color: var(--rp-on-ink); }

@media (max-width: 767px) { .adm-dash-grid { grid-template-columns: minmax(0, 1fr); } .adm-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* [2026-09-12] The bar on the Audience page. It sits under the period switcher and looks like it,
   because it is the same kind of control — one says which days, the other says who counts. */
.adm-bar { margin: -4px 0 18px; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.adm-bar .adm-sup-dim { font-weight: 600; }

/* [2026-09-12] The Audience page's own bar rows. It was using .adm-dist-row, whose label column is
   28px because on the Dashboard the labels are single digits. Here they are «11 and more» and
   «10-29 s», so every one of them wrapped onto three lines and the number collided with its own
   percentage. Same mistake as reusing a half-width panel at full width: the component was right,
   the content was not the content it was built for.
   Four columns now, and the share is separated from the count because they are different facts —
   one is how many, the other is how many out of what. */
.aud-dist { display: flex; flex-direction: column; gap: 7px; }
.aud-row { display: grid; grid-template-columns: 78px minmax(0, 1fr) 64px 46px; gap: 12px; align-items: center; font-size: var(--rp-fs-13); }
.aud-label { font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.aud-bar { height: 10px; border-radius: 5px; background: var(--rp-surface); overflow: hidden; }
.aud-bar i { display: block; height: 100%; background: var(--rp-accent); border-radius: 5px; }
.aud-n { text-align: right; font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }
.aud-note { text-align: right; color: var(--rp-text-2); font-size: var(--rp-fs-12); font-variant-numeric: tabular-nums; white-space: nowrap; }
/* the country card carries a name rather than a share, so it needs the room a percentage does not */
.aud-dist.is-wide .aud-row { grid-template-columns: 44px minmax(0, 1fr) 56px 110px; }
.aud-dist.is-wide .aud-note { text-align: left; overflow: hidden; text-overflow: ellipsis; }
@media (max-width: 1279px) { .aud-row { grid-template-columns: 70px minmax(0, 1fr) 56px 42px; gap: 8px; } }

/* [2026-09-11] The Audience trend. Two rows of bars, each scaled to its own maximum, because the
   audience and the crawl differ by about a hundred times and a shared scale would render the row
   that matters as a line of pixels. Drawn as plain SVG on the server: a bar chart is four numbers
   and a rectangle, and a charting library on an admin page is a dependency to keep alive forever. */
.aud-trend { padding: 20px 22px; margin-bottom: 18px; }
.aud-trend-row { margin-top: 14px; }
.aud-trend-h { display: flex; align-items: baseline; gap: 8px; font-size: var(--rp-fs-13); margin-bottom: 6px; }
.aud-chart { display: block; width: 100%; height: 132px; }
.aud-chart rect { fill: var(--rp-accent); }
.aud-trend-row.is-muted .aud-chart rect { fill: var(--rp-text-3, #9CA3AF); }
.aud-chart-t { fill: var(--rp-text-2); font-size: 11px; font-family: inherit; }
