Files
wpdev d52d604d7a
Anti-EAV Lint + Quality Gate / anti-eav-lint (push) Successful in 8s
Tests / Unit Tests (push) Successful in 10s
Tests / Integration Tests (push) Successful in 35s
Tests / PHP Lint (push) Successful in 7s
Tests / PHPCS (push) Successful in 19s
Tests / PHPStan (push) Successful in 24s
style(admin): inline style 全面改用 CSS class(PR-H)
admin/ 的 inline style= 由 348 處降到 9 處,剩下的 9 處全是 CSS custom
property 載體(--wpdo-bar-width / --wpdo-cov-pct 等動態數值),與來源外掛的
設計一致。

- wpdo-admin.css 543 → 911 行:補上 148 個 class(來源檔在 selector 與
  rule-block 層級都是既有內容的超集,逐條核對過),另加 .wpdo-form-inline
- 5 個變數改為 class 版本:$mode_cls / $badge_mode_cls / $diffs_cls /
  $ap_cls / $e_mode_cls;3 個 stress-test template 補 $mode_text_cls /
  $mode_card_cls
- 刪掉因此變成孤兒的 $mode_badge / $style / $mode_style / $badge_style /
  $e_mode_bg / $badge_bg
- entity card 改 .wpdo-eb-card、pipeline dot 改 .wpdo-stage-pill、demote 按鈕
  改 .wpdo-eb-btn-dim;.wpdo-native-counts / .wpdo-recommendation /
  .wpdo-setup-banner-btn 的重複 inline style 移除
- dashboard 的 top-views 查詢一併改用上一個 commit 的 TMDO_Zone_Warm::VIEW_KEY

PHPStan 抓出自動轉換造成的 11 個未定義變數,已全數補回定義並複驗。
2026-07-31 10:34:57 +08:00

915 lines
29 KiB
CSS

/**
* 2meet Data Optimizer — Admin Styles (Morandi Design System)
*
* Morandi tokens are provided via the 'morandi-design-system' CSS dependency
* registered in TMDO_Admin::enqueue_assets(). No @import needed.
*/
/* ── KPI Hero Strip (v2.16.0) ────────────────────────────────────────── */
.wpdo-kpi-hero {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: var(--space-4);
margin: var(--space-5) 0;
}
.wpdo-kpi-card {
background: var(--color-bg-secondary, #FAF9F6);
border: 1px solid var(--color-bg-divider, #E8E3D9);
border-radius: var(--radius-lg);
padding: var(--space-4) var(--space-5);
box-shadow: var(--shadow-sm, 0 1px 3px rgba(58,53,48,0.08));
position: relative;
overflow: hidden;
transition: transform var(--duration-normal, 200ms) var(--ease-default, ease-out),
box-shadow var(--duration-normal, 200ms) var(--ease-default, ease-out);
}
.wpdo-kpi-card::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: linear-gradient(90deg,
var(--color-accent-warm, #c4a986),
var(--color-accent-warm, #c4a986));
opacity: 0.6;
}
.wpdo-kpi-card:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-md, 0 4px 12px rgba(58,53,48,0.10));
}
.wpdo-kpi-label {
font-family: var(--font-family-body);
font-size: var(--text-sm, 13px);
color: var(--color-text-secondary, #6b6256);
font-weight: 500;
letter-spacing: 0.02em;
text-transform: uppercase;
margin-bottom: var(--space-2);
}
.wpdo-kpi-value {
font-family: var(--font-family-display);
font-size: 2.25rem;
line-height: 1.1;
font-weight: 700;
color: var(--color-text-primary, #3a3530);
margin-bottom: var(--space-2);
letter-spacing: -0.02em;
}
.wpdo-kpi-unit {
font-size: 1.1rem;
color: var(--color-text-secondary, #6b6256);
font-weight: 500;
margin-left: 2px;
}
.wpdo-kpi-empty {
color: var(--color-text-tertiary, #9a8e7e);
font-weight: 400;
}
.wpdo-kpi-sub {
font-family: var(--font-family-body);
font-size: var(--text-xs, 12px);
color: var(--color-text-secondary, #6b6256);
line-height: 1.4;
}
/* Per-KPI accent stripe color */
.wpdo-kpi--ratio::before { background: linear-gradient(90deg, #c4a986, #d4b89a); }
.wpdo-kpi--speedup::before { background: linear-gradient(90deg, #5a9a85, #7eb39e); }
.wpdo-kpi--coverage::before { background: linear-gradient(90deg, #8b7eb3, #a397c9); }
.wpdo-kpi--health-excellent::before { background: linear-gradient(90deg, #5a9a85, #7eb39e); }
.wpdo-kpi--health-good::before { background: linear-gradient(90deg, #c4a986, #d4b89a); }
.wpdo-kpi--health-warn::before { background: linear-gradient(90deg, #d4a574, #e0b888); }
.wpdo-kpi--health-crit::before { background: linear-gradient(90deg, #c47a7a, #d49090); }
.wpdo-kpi--health-excellent .wpdo-kpi-value { color: #4a8270; }
.wpdo-kpi--health-good .wpdo-kpi-value { color: #a8906f; }
.wpdo-kpi--health-warn .wpdo-kpi-value { color: #b88955; }
.wpdo-kpi--health-crit .wpdo-kpi-value { color: #a86060; }
@media (max-width: 600px) {
.wpdo-kpi-hero {
grid-template-columns: 1fr 1fr;
gap: var(--space-3);
}
.wpdo-kpi-value {
font-size: 1.75rem;
}
}
/* ── Grouped Tab Navigation (v2.16.0) ────────────────────────────────── */
.wpdo-tab-nav {
display: flex;
flex-wrap: wrap;
gap: var(--space-3) var(--space-4);
align-items: flex-end;
padding-bottom: 0;
border-bottom: 1px solid var(--color-bg-divider, #E8E3D9);
margin-bottom: var(--space-4);
}
.wpdo-tab-group {
display: inline-flex;
flex-direction: column;
gap: 4px;
margin-right: var(--space-2);
padding-right: var(--space-3);
position: relative;
}
.wpdo-tab-group:not(:last-child)::after {
content: "";
position: absolute;
right: 0;
top: 24px;
bottom: 4px;
width: 1px;
background: var(--color-bg-divider, #E8E3D9);
}
.wpdo-tab-group-label {
font-family: var(--font-family-body);
font-size: 11px;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--color-text-tertiary, #9a8e7e);
font-weight: 500;
padding-left: var(--space-2);
user-select: none;
pointer-events: none;
}
.wpdo-tab-group .nav-tab {
margin: 0 2px -1px 0;
transition: background-color var(--duration-fast, 120ms) ease,
color var(--duration-fast, 120ms) ease;
}
.wpdo-tab-group .nav-tab:hover {
background-color: var(--color-bg-tertiary, #F2EEE8);
color: var(--color-text-primary, #3a3530);
}
@media (max-width: 768px) {
.wpdo-tab-nav {
gap: var(--space-2);
}
.wpdo-tab-group {
margin-right: 0;
padding-right: var(--space-2);
}
.wpdo-tab-group-label {
font-size: 10px;
}
}
/* ── Layout ──────────────────────────────────────────────────────────── */
.wpdo-wrap .wpdo-tab-content {
margin-top: var(--space-5);
}
.wpdo-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
gap: var(--space-5);
margin-bottom: var(--space-5);
}
.wpdo-card {
background: var(--color-bg-secondary, #FAF9F6);
border: 1px solid var(--color-bg-divider, #E8E3D9);
border-radius: var(--radius-lg);
padding: var(--space-4) var(--space-5);
box-shadow: var(--shadow-sm, 0 1px 3px rgba(58,53,48,0.08));
overflow-x: auto; /* WCAG 1.4.10 Reflow: tables scroll within card, not page */
}
.wpdo-card h2 {
margin-top: 0;
padding-top: 0;
border-bottom: 1px solid var(--color-bg-divider, #E8E3D9);
padding-bottom: var(--space-3);
font-family: var(--font-family-display);
}
.wpdo-card h3,
.wpdo-card h4 {
margin-top: var(--space-3);
font-family: var(--font-family-display);
}
.wpdo-card-wide {
grid-column: 1 / -1;
}
/* Utility spacers replacing inline style="margin-top:N" */
.wpdo-mt-1 { margin-top: var(--space-2); }
.wpdo-mt-2 { margin-top: var(--space-3); }
.wpdo-mt-3 { margin-top: var(--space-5); }
.wpdo-mb-2 { margin-bottom: var(--space-3); }
.wpdo-table--narrow { max-width: 480px; }
.wpdo-table--medium { max-width: 700px; }
.wpdo-block--wide { max-width: 900px; }
.wpdo-col-param { width: 180px; }
/* Inline form row */
.wpdo-form-row {
display: flex;
align-items: center;
gap: var(--space-2);
flex-wrap: wrap;
margin: var(--space-3) 0;
}
/* ── Tables ──────────────────────────────────────────────────────────── */
.wpdo-table {
font-size: var(--text-sm);
font-family: var(--font-family-body);
}
.wpdo-table code,
.wpdo-wrap code {
font-size: var(--text-xs);
background: var(--color-bg-tertiary, #F2EEE8);
padding: 2px var(--space-1);
border-radius: var(--radius-sm);
font-family: var(--font-family-mono);
}
.wpdo-log-msg {
max-width: 400px;
word-break: break-word;
}
/* ── Touch targets (CLAUDE.md: 44px minimum) ─────────────────────────── */
.wpdo-wrap .button,
.wpdo-wrap .button-secondary,
.wpdo-wrap .button-primary,
.wpdo-wrap input[type="number"],
.wpdo-wrap input[type="text"],
.wpdo-wrap input[type="search"],
.wpdo-wrap select {
min-height: 44px;
line-height: 1.4;
}
.wpdo-wrap .button-small {
min-height: 40px; /* WCAG 2.2 AA: 24px min; 40px exceeds 2.5.8 while remaining compact */
padding: 0 var(--space-2);
}
.wpdo-wrap input[type="number"] {
padding: 6px var(--space-2);
}
.wpdo-wrap input[type="number"].wpdo-input--xs {
width: 72px; /* was inline 60px — bumped to fit 44px height without clipping digits */
}
.wpdo-wrap .button:focus-visible,
.wpdo-wrap input:focus-visible,
.wpdo-wrap select:focus-visible {
outline: 2px solid var(--color-terra-primary, #C4897A);
outline-offset: 2px;
}
/* ── Method pill for REST API tab (was inline #0073aa) ───────────────── */
.wpdo-method-pill {
background: var(--color-blue-primary, #9EB3C2);
color: var(--color-text-primary, #3A3530);
padding: 2px var(--space-2);
border-radius: var(--radius-sm);
font-size: var(--text-xs);
font-weight: var(--font-weight-semibold);
font-family: var(--font-family-mono);
}
/* Code block for curl examples (was inline #EFEFEF) */
.wpdo-wrap .wpdo-code-block {
background: var(--color-bg-tertiary, #F2EEE8);
color: var(--color-text-primary, #3A3530);
padding: var(--space-3);
border-radius: var(--radius-sm);
font-size: var(--text-xs);
font-family: var(--font-family-mono);
overflow: auto;
white-space: pre;
border: 1px solid var(--color-bg-divider, #E8E3D9);
}
/* ── Zone badges (icon + text, not colour alone — WCAG 1.4.1) ────────── */
.wpdo-zone {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px var(--space-2);
border-radius: var(--radius-sm);
font-size: var(--text-xs);
font-weight: var(--font-weight-semibold);
color: var(--color-text-primary, #3A3530);
line-height: 1.4;
}
.wpdo-zone::before {
font-family: var(--font-family-mono);
font-weight: var(--font-weight-bold);
}
.wpdo-zone-hot {
background: var(--color-terra-primary, #C4897A);
}
.wpdo-zone-hot::before { content: "🔥"; }
.wpdo-zone-warm {
background: var(--color-apricot-medium, #C8B090);
}
.wpdo-zone-warm::before { content: "◐"; }
.wpdo-zone-cold {
background: var(--color-blue-medium, #8AA0B2);
}
.wpdo-zone-cold::before { content: "❄"; }
.wpdo-zone-archive {
background: var(--color-gray-medium, #AFA8A0);
}
.wpdo-zone-archive::before { content: "▦"; }
/* ── State badges (shape-prefixed for colour-blind legibility) ───────── */
.wpdo-state {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px var(--space-2);
border-radius: var(--radius-sm);
font-size: var(--text-xs);
font-weight: var(--font-weight-semibold);
line-height: 1.4;
}
.wpdo-state::before {
font-family: var(--font-family-mono);
}
.wpdo-state-idle {
background: var(--color-bg-tertiary, #F2EEE8);
color: var(--color-text-primary, #3A3530);
}
.wpdo-state-idle::before { content: "○"; }
.wpdo-state-dual_write {
background: var(--color-apricot-lightest, #EDD9C0);
color: var(--color-text-primary, #3A3530);
}
.wpdo-state-dual_write::before { content: "⇄"; }
.wpdo-state-backfill {
background: var(--color-blue-lightest, #C8D6DE);
color: var(--color-text-primary, #3A3530);
}
.wpdo-state-backfill::before { content: "⟲"; }
.wpdo-state-verify {
background: var(--color-apricot-lightest, #EDD9C0);
color: var(--color-text-primary, #3A3530);
}
.wpdo-state-verify::before { content: "⚠"; }
.wpdo-state-cutover {
background: var(--color-green-lightest, #C8D5C4);
color: var(--color-text-primary, #3A3530);
}
.wpdo-state-cutover::before { content: "✓"; }
.wpdo-state-cleanup {
background: var(--color-blue-lightest, #C8D6DE);
color: var(--color-text-primary, #3A3530);
}
.wpdo-state-cleanup::before { content: "✂"; }
.wpdo-state-complete {
background: var(--color-green-primary, #A8B9A4);
color: var(--color-text-primary, #3A3530);
}
.wpdo-state-complete::before { content: "✔"; }
/* ── Generic badges ──────────────────────────────────────────────────── */
.wpdo-badge {
display: inline-block;
padding: 2px var(--space-2);
border-radius: var(--radius-sm);
font-size: var(--text-xs);
background: var(--color-bg-tertiary, #F2EEE8);
color: var(--color-text-primary, #3A3530);
}
.wpdo-badge-ok {
background: var(--color-green-lightest, #C8D5C4);
color: var(--color-text-primary, #3A3530);
}
.wpdo-badge-warn {
background: var(--color-apricot-lightest, #EDD9C0);
color: var(--color-text-primary, #3A3530);
}
/* ── Progress bars (transform-based — no layout-thrashing) ───────────── */
.wpdo-progress {
display: inline-block;
width: 120px;
height: 14px;
background: var(--color-bg-tertiary, #F2EEE8);
border-radius: var(--radius-full);
overflow: hidden;
vertical-align: middle;
margin-right: var(--space-2);
}
.wpdo-progress-bar {
height: 100%;
width: 100%;
background: var(--color-blue-primary, #9EB3C2);
border-radius: var(--radius-full);
transform-origin: left center;
transform: scaleX(var(--wpdo-progress, 0));
transition: transform var(--duration-slow, 0.4s) var(--ease-default, ease);
}
.wpdo-progress-text {
font-size: var(--text-xs);
color: var(--color-text-primary, #3A3530);
}
/* ── Confidence bar ──────────────────────────────────────────────────── */
.wpdo-confidence {
display: inline-block;
width: 60px;
height: 10px;
background: var(--color-bg-tertiary, #F2EEE8);
border-radius: var(--radius-full);
overflow: hidden;
vertical-align: middle;
margin-right: var(--space-1);
}
.wpdo-confidence-bar {
height: 100%;
width: 100%;
background: var(--color-green-primary, #A8B9A4);
border-radius: var(--radius-full);
transform-origin: left center;
transform: scaleX(var(--wpdo-confidence, 0));
}
/* ── Screen reader only ──────────────────────────────────────────────── */
.wpdo-sr-only {
position: absolute;
width: 1px;
height: 1px;
margin: -1px;
padding: 0;
overflow: hidden;
clip: rect(0 0 0 0);
border: 0;
}
/* ── Tab red-dot badge (v2.8.1) ──────────────────────────────────────── */
.nav-tab .wpdo-tab-dot {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
background: #dc3232;
margin-left: 6px;
vertical-align: middle;
box-shadow: 0 0 6px rgba(220, 50, 50, 0.6);
animation: wpdo-tab-dot-pulse 2s ease infinite;
}
@keyframes wpdo-tab-dot-pulse {
0% { box-shadow: 0 0 0 0 rgba(220, 50, 50, 0.7); }
70% { box-shadow: 0 0 0 6px rgba(220, 50, 50, 0); }
100% { box-shadow: 0 0 0 0 rgba(220, 50, 50, 0); }
}
/* ── Reduced motion ──────────────────────────────────────────────────── */
@media (prefers-reduced-motion: reduce) {
.wpdo-progress-bar {
transition-duration: 0.01ms;
}
.nav-tab .wpdo-tab-dot {
animation: none;
}
.wpdo-bar-fill,
.wpdo-eb-bar-fill,
.wpdo-setup-progress-fill { transition-duration: 0.01ms; }
}
/* ── v3.0.2 — Inline-style Elimination Utilities ────────────────────── */
/* Margin / visibility */
.wpdo-mt-0 { margin-top: 0; }
.wpdo-mt-24 { margin-top: 24px; }
.wpdo-hidden { display: none; }
/* Semantic text colours */
.wpdo-text-success { color: #155724; }
.wpdo-text-error { color: #721c24; }
.wpdo-text-muted { color: #999; }
.wpdo-text-warn { color: #856404; }
.wpdo-text-success-em { color: #46b450; font-weight: bold; }
.wpdo-text-warn-em { color: #dba617; font-weight: bold; }
.wpdo-text-neutral { color: #8c8f94; }
.wpdo-text-skip { color: #888; font-size: 0.9em; }
.wpdo-check-success { color: #155724; font-size: 12px; }
/* Mode badges — small pill (Entity Bridge status table) */
.wpdo-mode-sm {
display: inline-block;
padding: 2px 8px;
border-radius: 3px;
font-size: 12px;
}
/* Mode badges — round pill (Entity Bridge health cards) */
.wpdo-mode-pill {
display: inline-block;
padding: 2px 10px;
border-radius: 20px;
font-size: 12px;
font-weight: 600;
}
.wpdo-mode--disabled { background: #e0e0e0; color: #444; }
.wpdo-mode--dual-write { background: #d4edda; color: #155724; }
.wpdo-mode--shadow-read { background: #fff3cd; color: #856404; }
.wpdo-mode--aeav-only { background: #cce5ff; color: #004085; }
/* Entity Bridge grid */
.wpdo-eb-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(380px, 1fr));
gap: 20px;
margin-top: 20px;
}
.wpdo-eb-card {
padding: 20px;
border-radius: 8px;
background: #fff;
box-shadow: 0 1px 4px rgba(0,0,0,.1);
}
.wpdo-eb-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 12px;
}
.wpdo-eb-title { margin: 0 0 4px; font-size: 16px; }
.wpdo-mode-days { margin-left: 8px; font-size: 12px; color: var(--color-text-secondary, #666); }
.wpdo-mode-warn-sm { font-size: 12px; color: #856404; background: #fff3cd; padding: 2px 8px; border-radius: 4px; }
.wpdo-eb-pipeline { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 16px; font-size: 11px; }
.wpdo-pipeline-arrow { color: #999; }
.wpdo-stage-pill { padding: 2px 8px; border-radius: 3px; }
.wpdo-stage-pill--inactive { background: #f0f0f0; color: #666; }
.wpdo-eb-tables-row {
margin-bottom: 14px;
padding: 6px 10px;
background: #f8f9fa;
border-radius: 4px;
font-size: 12px;
color: #555;
display: flex;
flex-wrap: wrap;
gap: 4px;
align-items: center;
}
.wpdo-eb-tables-label { font-weight: 600; margin-right: 4px; }
.wpdo-eb-sep { color: #ccc; }
.wpdo-code-xs { font-size: 11px; }
.wpdo-eb-section { margin-bottom: 14px; }
.wpdo-eb-section-title { font-size: 12px; text-transform: uppercase; color: var(--color-text-secondary, #666); letter-spacing: .5px; font-weight: 600; }
.wpdo-eb-group { margin-top: 8px; }
.wpdo-eb-group-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 3px; }
.wpdo-eb-group-name { font-size: 13px; font-weight: 500; }
.wpdo-eb-group-meta { font-size: 12px; color: var(--color-text-secondary, #666); }
.wpdo-eb-group-bar-row { display: flex; align-items: center; gap: 8px; }
.wpdo-eb-bar-track { flex: 1; height: 8px; background: #e0e0e0; border-radius: 4px; overflow: hidden; }
.wpdo-eb-bar-fill { height: 100%; width: var(--wpdo-eb-pct, 0%); background: var(--wpdo-eb-color, #28a745); transition: width .4s ease; border-radius: 4px; }
.wpdo-eb-pct-label { font-size: 12px; min-width: 42px; text-align: right; color: #333; }
.wpdo-eb-key-hint { font-size: 11px; color: #888; margin-top: 2px; }
.wpdo-eb-actions { margin-top: 6px; }
.wpdo-eb-shadow-row { margin-bottom: 12px; padding: 8px; background: #f8f9fa; border-radius: 4px; font-size: 13px; }
.wpdo-eb-shadow-ok { color: #28a745; font-size: 12px; }
.wpdo-eb-shadow-warn { color: #dc3545; }
.wpdo-eb-promote-row { margin-bottom: 12px; font-size: 12px; color: var(--color-text-secondary, #666); }
.wpdo-eb-auto-ok { color: #155724; }
.wpdo-eb-auto-warn { color: #856404; }
.wpdo-eb-auto-badge { background: #d4edda; color: #155724; padding: 1px 5px; border-radius: 3px; margin-left: 4px; font-size: 11px; }
.wpdo-eb-info-row {
margin-bottom: 14px;
padding: 8px 10px;
background: #f0f4ff;
border-left: 3px solid #4f6ef7;
border-radius: 0 4px 4px 0;
font-size: 13px;
color: #333;
}
.wpdo-eb-button-row { display: flex; gap: 8px; flex-wrap: wrap; }
.wpdo-eb-btn-dim { opacity: .5; }
.wpdo-eb-footer { margin-top: 24px; padding: 20px; background: #fff; border-radius: 8px; box-shadow: 0 1px 4px rgba(0,0,0,.1); }
.wpdo-eb-ol { margin-left: 20px; line-height: 1.9; font-size: 13px; }
/* Stress-test table cells */
.wpdo-td { padding: 6px; }
.wpdo-td-muted { padding: 6px; color: var(--color-text-secondary, #666); }
.wpdo-td-val { padding: 6px; font-weight: 600; }
.wpdo-stats-table { width: 100%; font-size: 13px; margin-top: 10px; border-collapse: collapse; }
/* Full-width progress bar */
.wpdo-bar-track { height: 14px; background: var(--color-bg-tertiary, #e0e0e0); border-radius: 7px; overflow: hidden; }
.wpdo-bar-fill { height: 100%; background: linear-gradient(90deg, #28a745, #20c997); width: var(--wpdo-bar-width, 0%); transition: width 0.4s; }
.wpdo-bar-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px; font-size: 13px; }
.wpdo-bar-pct { font-weight: 600; }
.wpdo-bar-section { margin-bottom: 10px; }
/* Layouts */
.wpdo-grid-2col { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 20px; }
.wpdo-grid-4col { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; max-width: 720px; margin: 1rem 0; }
/* Notices */
.wpdo-notice-error {
margin: 14px 0;
padding: 12px 14px;
background: #f8d7da;
color: #721c24;
border-left: 4px solid #dc3545;
border-radius: 4px;
font-size: 13px;
line-height: 1.6;
}
.wpdo-notice-warn-inline { margin: 0; font-size: 12px; color: #856404; background: #fff3cd; padding: 6px 10px; border-radius: 4px; line-height: 1.6; }
/* Count badge */
.wpdo-count-danger { font-size: 18px; color: #dc3545; }
/* Form helpers */
.wpdo-th-main { width: 35%; }
.wpdo-label-block { display: block; margin-bottom: 6px; }
.wpdo-hr-section { margin: 18px 0; }
/* Lists */
.wpdo-list-disc { list-style: disc; padding-left: 1.5em; }
.wpdo-list-ol { margin-left: 20px; line-height: 1.9; font-size: 13px; }
.wpdo-list-ol-tight { margin: 6px 0 8px 22px; padding: 0; }
/* Max-width constraints */
.wpdo-max-520 { max-width: 520px; }
.wpdo-max-600 { max-width: 600px; }
.wpdo-max-720 { max-width: 720px; }
.wpdo-max-800 { max-width: 800px; }
/* Dashboard widget */
.wpdo-widget-intro { font-size: 1.1em; margin-bottom: 0.6em; }
.wpdo-widget-link-right { float: right; padding-top: 4px; }
.wpdo-widget-notice { margin: 0.6em 0; padding: 0.6em 0.8em; border-radius: 3px; }
.wpdo-widget-notice-warn { background: #fff8e5; border-left: 3px solid #dba617; }
.wpdo-widget-notice-error { background: #fef0f0; border-left: 3px solid #dc3232; }
.wpdo-widget-notice-info { background: #e5f5fa; border-left: 3px solid #00a0d2; }
.wpdo-widget-notice-neutral { background: #f6f7f7; border-left: 3px solid #2271b1; }
.wpdo-widget-notice-ok { background: #ecf7ed; border-left: 3px solid #46b450; }
/* Setup wizard */
.wpdo-setup-progress-track { background: #f0f0f1; height: 8px; border-radius: 4px; overflow: hidden; margin-bottom: 2em; }
.wpdo-setup-progress-fill { background: #2271b1; height: 100%; width: var(--wpdo-progress-pct, 0%); transition: width 0.3s; }
.wpdo-setup-card-full { max-width: none; padding: 2em; }
.wpdo-setup-banner {
background: #f0f6fc;
border-left: 4px solid #2271b1;
padding: 0.75em 1em;
margin-bottom: 1em;
display: flex;
align-items: center;
gap: 1em;
}
.wpdo-setup-banner-btn { white-space: nowrap; }
/* HivePress / WC tabs */
.wpdo-cli-block { background: #f6f7f7; padding: 12px; border-left: 4px solid #2271b1; }
.wpdo-opacity-60 { opacity: .6; }
/* Text colour — strong danger / amber (stress-test status) */
.wpdo-text-danger { color: #dc3545; }
.wpdo-text-amber { color: #dba617; }
/* Inline code on white bg (mode-card context) */
.wpdo-code-white { background: #fff; padding: 2px 6px; border-radius: 3px; }
/* Mode info card (stress-test modal-status section) */
.wpdo-mode-card {
border-left-width: 4px;
border-left-style: solid;
border-radius: 6px;
margin-top: 16px;
font-size: 13px;
line-height: 1.7;
}
.wpdo-mode-card--ok { background: #e8f5e9; border-left-color: #28a745; }
.wpdo-mode-card--warn { background: #fff3cd; border-left-color: #dba617; }
/* Settings link margin */
.wpdo-ml-2 { margin-left: 8px; }
/* Matrix / details table helpers */
.wpdo-summary-toggle { cursor: pointer; color: #0073aa; font-weight: 600; }
.wpdo-table-inset { background: #fff; font-size: 12px; }
.wpdo-tr-header th, .wpdo-tr-header td { background: #f0f0f0; }
.wpdo-tr-highlight { background: #fff8e1; }
.wpdo-tr-success { background: #e8f5e9; font-weight: 600; }
/* Entity Bridge JS-hook class static styles (admin.php, updated by wpdo-entity-bridge.js) */
.wpdo-entity-bridge-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(380px, 1fr));
gap: 20px;
margin-top: 20px;
}
.wpdo-mode-badge {
display: inline-block;
padding: 2px 10px;
border-radius: 20px;
font-size: 12px;
font-weight: 600;
transition: background-color var(--duration-normal, 200ms) var(--ease-default, ease),
color var(--duration-normal, 200ms) var(--ease-default, ease);
}
/* JS sets className = 'wpdo-mode-badge wpdo-mode-disabled' etc. */
.wpdo-mode-badge.wpdo-mode-disabled { background: #e0e0e0; color: #444; }
.wpdo-mode-badge.wpdo-mode-dual-write { background: #d4edda; color: #155724; }
.wpdo-mode-badge.wpdo-mode-shadow-read { background: #fff3cd; color: #856404; }
.wpdo-mode-badge.wpdo-mode-aeav-only { background: #cce5ff; color: #004085; }
.wpdo-pipeline {
display: flex;
align-items: center;
gap: 6px;
flex-wrap: wrap;
margin-bottom: 16px;
font-size: 11px;
}
.wpdo-pipeline-dot { padding: 2px 8px; border-radius: 3px; background: #f0f0f0; color: #666; }
.wpdo-pipeline-inactive { background: #f0f0f0; color: #666; }
.wpdo-native-counts {
margin-bottom: 14px;
padding: 6px 10px;
background: #f8f9fa;
border-radius: 4px;
font-size: 12px;
color: #555;
display: flex;
flex-wrap: wrap;
gap: 4px;
align-items: center;
}
.wpdo-native-counts-label { font-weight: 600; margin-right: 4px; }
.wpdo-native-sep { color: #ccc; }
.wpdo-mig-status { font-size: 11px; padding: 1px 6px; border-radius: 3px; background: #f0f0f0; }
.wpdo-cov-pct { font-size: 12px; min-width: 42px; text-align: right; color: #333; }
.wpdo-cov-bar-fill { height: 100%; width: var(--wpdo-cov-pct, 0%); background: var(--wpdo-cov-color, #28a745); transition: width .4s ease; border-radius: 4px; }
.wpdo-recommendation {
margin-bottom: 14px;
padding: 8px 10px;
background: #f0f4ff;
border-left: 3px solid #4f6ef7;
border-radius: 0 4px 4px 0;
font-size: 13px;
color: #333;
}
/* Settings tab helpers */
.wpdo-h3-section { margin-top: 2em; }
.wpdo-h4-mb { margin-bottom: 6px; }
.wpdo-table-mb { margin-bottom: 14px; }
.wpdo-table-mb-sm { margin-bottom: 8px; }
.wpdo-pre-code { background: #f0f0f1; padding: 1em; overflow: auto; max-height: 400px; }
.wpdo-details-section {
margin-top: 1.5em;
border: 1px solid #c3c4c7;
border-radius: 3px;
padding: 0.6em 1em;
}
.wpdo-label-inline { display: inline-block; margin-right: 1em; margin-bottom: 0.3em; }
.wpdo-description-mt { margin-top: 1em; }
.wpdo-description-sm { margin-top: 0.25em; }
.wpdo-description-xs { margin-top: 0.5em; font-size: 12px; }
.wpdo-text-ok { color: #46b450; font-weight: bold; }
.wpdo-text-err { color: #dc3232; font-weight: bold; }
.wpdo-text-muted { color: #666; font-size: 12px; }
.wpdo-text-green { color: #155724; }
.wpdo-text-olive { color: #856404; }
.wpdo-text-green-bold { color: #28a745; font-weight: 600; }
.wpdo-text-red-bold { color: #dc3545; font-weight: 600; }
.wpdo-code-sm { margin-left: 8px; font-size: 11px; }
.wpdo-badge-mode { display: inline-block; margin-left: 8px; padding: 2px 8px; border-radius: 3px; font-size: 11px; }
/* Advisor confidence bar (Classifier tab) */
.wpdo-advisor-bar-track {
display: inline-block;
background: #f0f0f1;
border-radius: 3px;
width: 80px;
height: 18px;
position: relative;
vertical-align: middle;
}
.wpdo-advisor-bar-fill {
position: absolute;
inset: 0 auto 0 0;
background: var(--wpdo-adv-color, #c3c4c7);
width: var(--wpdo-adv-width, 0%);
border-radius: 3px;
}
.wpdo-advisor-bar-label {
position: absolute;
inset: 0;
text-align: center;
font-size: 11px;
line-height: 18px;
}
/* EB card group section: empty state warning */
.wpdo-eb-warn-box {
margin: 0;
font-size: 12px;
color: #856404;
background: #fff3cd;
padding: 6px 10px;
border-radius: 4px;
line-height: 1.6;
}
/* Additional utilities */
.wpdo-text-dark-red { color: #721c24; }
.wpdo-text-red { color: #dc3545; }
.wpdo-ml-2 { margin-left: 8px; }
.wpdo-form-table-mt0 { margin-top: 0; }
.wpdo-badge-mode.wpdo-mode-disabled { background: #e0e0e0; color: #444; }
.wpdo-badge-mode.wpdo-mode-dual-write { background: #d4edda; color: #155724; }
.wpdo-badge-mode.wpdo-mode-shadow-read { background: #fff3cd; color: #856404; }
.wpdo-badge-mode.wpdo-mode-aeav-only { background: #cce5ff; color: #004085; }
.wpdo-summary-section { cursor: pointer; font-weight: 600; font-size: 1.1em; }
.wpdo-notice-warn-desc { margin-top: 8px; color: #856404; background: #fff3cd; padding: 8px 12px; border-radius: 4px; }
.wpdo-card--light { background: #f6f7f7; }
.wpdo-h3-sm { font-size: 14px; }
/* ── Settings section cards (task E) ─────────────────────────────── */
.wpdo-settings-section {
background: var(--color-surface-card, #fbf7f0);
border: 1px solid var(--color-border-soft, #e5dccd);
border-radius: var(--radius-md, 12px);
padding: var(--space-4, 16px) var(--space-6, 24px);
margin-bottom: var(--space-5, 20px);
}
.wpdo-section-save-row {
display: flex;
align-items: center;
gap: var(--space-3, 12px);
padding-top: var(--space-3, 12px);
}
.wpdo-section-save-status {
font-size: 0.9rem;
color: var(--color-success, #5a8c5a);
opacity: 0;
transition: opacity var(--duration-normal, 200ms) var(--ease-default, ease);
}
.wpdo-section-save-status.visible {
opacity: 1;
}
/* Inline form wrapper — the GET → POST hardening (v1.0.0) turned several
action links into single-button forms; they must not break the row flow. */
.wpdo-form-inline { display: inline; }