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
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 個未定義變數,已全數補回定義並複驗。
915 lines
29 KiB
CSS
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; }
|