Some checks failed
Deploy SOLUTION_ERP / build-deploy (push) Has been cancelled
SUA-1..6b tron 6/6, acceptance C1-C6b 12/12. Vong-2 sua chinh vong-1 sau reviewer C7 (PASS-WITH-8, 3 MAJOR):
- Doi ba-cham -> hai-cham la REGRESSION co dieu-kien, KHONG phai cosmetic: chi tuong-duong khi origin/main
con ancestor; cay phan-ky thi hai-cham liet ca file CHI CO tren origin/main (= DA PRODUCTION) vao "phan MOI".
Thu pham that = git diff mu untracked. Sandbox 2 chieu CONFIRMED.
- git status --porcelain | cut -c4- de path RAC (rename in MOT dong "R old -> new"; path co dau cach bi quote).
Sandbox: 2/2 MISS; thuoc moi 2/2 OK.
- Thuoc CHOT 4/4 site: { git diff --name-only origin/main...HEAD; git diff --name-only HEAD;
git ls-files -o --exclude-standard; } | sort -u
Bai: chan-doan sai VAN pass acceptance — acceptance do HINH-DANG chuoi, khong do HANH-VI.
Lop mo-neo TU-VO-HIEU: con-tro so-dong tro vao CHINH tep chua no tu thoi moi lan sua dau tep
(112->118->121 trong 1 phien) => neo TEN, khong neo SO DONG. Ap cho index.css, gotchas.md, PipelineStageFolders.
Con-tro verbatim _mind doi ve commit DA PUSH (ee21056/d081681) — ban truoc tro 727a512 nam trong dai squash
=> tu de con-tro mo-coi.
H24 light-audit 9 FLAG, flush 8 o canonical: Mig 71->72 - Gotchas 86->87 - Tests 644->645 (chay that
dotnet test: 45 Domain + 600 Infra, 0 fail) - user-mem 59->60 - header S168->S179 - roster 23->26 (go han so
theo B1) - HANDOFF dong 4 slot (68)-(71) + E4.
"So noi doi theo huong BI QUAN" x3 ca/1 phien (4 slot - E4 - run.md S173) => leo thang lan 3 phai DO LAI TIEN-DE.
Kem: 2 NO vong-3 - 2 synthesis ORPHAN (run-chua-gom 2->0) - di-tru cua-so 6 vao _context - keo+ap 2 thu
loi-do-luong (BAC Lop 8 CO SO: mtime cum SE 0,7% vs hub 69%) - drift-audit thang PASS_WITH_FLAGS-8 (va 2, con 6)
- _mind 99,67%->84,2% - don 9 dir rong - archive-gate strike 1/2.
#53: 4/4 vai garble return dau, vot tron 4/4 bang resume-in-session. Mat 0 byte.
0 file code nghiep-vu. Build 2/2 app PASS. Test 645/645.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
186 lines
7.2 KiB
CSS
186 lines
7.2 KiB
CSS
/* 🔴 File MIRROR — `fe-admin/src/index.css` ⟂ `fe-user/src/index.css` phải SHA256 IDENTICAL.
|
|
Sửa 1 bên PHẢI copy sang bên kia. Đo: `sha256sum fe-admin/src/index.css fe-user/src/index.css`.
|
|
Vì sao phải TỰ KHAI: luật mirror của `front-end-reviewer-style` §2 CHỈ soi file TỰ KHAI là mirror.
|
|
2 tệp này khớp byte từ lâu nhưng KHÔNG khai ⇒ vai style KHÔNG gác ⇒ lệch một bên là trôi IM LẶNG.
|
|
Khai @S179 — NỢ vòng-3 ① "khung thẻ 2 nguồn sự-thật" (`.card-accent` sống ở cả 2 app).
|
|
🔴 CỐ Ý KHÔNG ghi SỐ DÒNG ở đây. Bản đầu @S179 ghi ":112" rồi chính 6 dòng header này đẩy nó
|
|
thành 118; vá thành ":118" thì 3 dòng vá lại đẩy tiếp thành 121 — **mỏ-neo số-dòng trỏ vào
|
|
CHÍNH tệp chứa nó thì tự vô-hiệu mỗi lần sửa đầu tệp**. Neo đúng = TÊN SELECTOR:
|
|
`grep -n '^\.card-accent {' fe-admin/src/index.css`. */
|
|
|
|
@import "tailwindcss";
|
|
|
|
@import url("https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;600&display=swap");
|
|
|
|
@theme {
|
|
/* Solutions brand palette (derived from logo #1F7DC1) — PRIMARY, unchanged */
|
|
--color-brand-50: #f0f7fc;
|
|
--color-brand-100: #dbeaf7;
|
|
--color-brand-200: #b8d5ef;
|
|
--color-brand-300: #8bbae3;
|
|
--color-brand-400: #5499d3;
|
|
--color-brand-500: #2e85c7;
|
|
--color-brand-600: #1f7dc1; /* exact logo blue */
|
|
--color-brand-700: #1b6aa3;
|
|
--color-brand-800: #175685;
|
|
--color-brand-900: #144868;
|
|
|
|
/* Accent red from ® mark */
|
|
--color-accent-500: #dc2626;
|
|
--color-accent-600: #b91c1c;
|
|
|
|
/* ───────────────────────────────────────────────────────────────────
|
|
ACCENT PALETTE (anh chốt 2026-06-16 "nâng màu, giữ nền xanh brand").
|
|
These ADD to the brand — primary stays brand-600. Used for KPI cards,
|
|
status badges, multi-tone affordances. Each ships a 50/500/600/700 stop
|
|
so `bg-{x}-50` chip + `text-{x}-700` label both clear WCAG-AA.
|
|
─────────────────────────────────────────────────────────────────── */
|
|
/* teal — info / secondary metric */
|
|
--color-teal-50: #e9faf9;
|
|
--color-teal-100: #ccf3f1;
|
|
--color-teal-500: #0ea5a4;
|
|
--color-teal-600: #0c8e8d;
|
|
--color-teal-700: #0a7170;
|
|
/* amber/cam — warning / pending */
|
|
--color-amberx-50: #fef6e7;
|
|
--color-amberx-100: #fce8c2;
|
|
--color-amberx-500: #f59e0b;
|
|
--color-amberx-600: #d98306;
|
|
--color-amberx-700: #b16708;
|
|
/* violet/tím — neutral-highlight / value */
|
|
--color-violet-50: #f1effe;
|
|
--color-violet-100: #e0dcfc;
|
|
--color-violet-500: #7c6ff0;
|
|
--color-violet-600: #6354e4;
|
|
--color-violet-700: #5042c4;
|
|
/* green/lục — success / done */
|
|
--color-greenx-50: #e8f8ee;
|
|
--color-greenx-100: #c7eed5;
|
|
--color-greenx-500: #16a34a;
|
|
--color-greenx-600: #128a3f;
|
|
--color-greenx-700: #0f7034;
|
|
|
|
--font-sans: "Be Vietnam Pro", "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
|
--font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
}
|
|
|
|
html, body, #root {
|
|
height: 100%;
|
|
}
|
|
|
|
body {
|
|
margin: 0;
|
|
background-color: #f8fafc;
|
|
color: #0f172a;
|
|
font-family: var(--font-sans);
|
|
font-size: 14px;
|
|
line-height: 1.55;
|
|
letter-spacing: -0.003em;
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
text-rendering: optimizeLegibility;
|
|
}
|
|
|
|
/* Heading hierarchy with Be Vietnam Pro.
|
|
2026-06-16: anh phản hồi "đơn điệu / có thấy khác gì đâu" → bump weight to
|
|
700 + tighter tracking so headings read BOLD and high-contrast (was 600
|
|
semibold = too quiet). Hierarchy now carried by both weight AND a darker
|
|
ink (#0b1220 vs body #0f172a). */
|
|
h1, h2, h3, h4 {
|
|
letter-spacing: -0.018em;
|
|
color: #0b1220;
|
|
font-weight: 700;
|
|
}
|
|
h1 { letter-spacing: -0.022em; }
|
|
|
|
/* Section / form labels — uppercase scan-pattern shared across the app.
|
|
Use class="label-eyebrow" for the dense ERP label treatment. Brand-tinted
|
|
(was plain slate) so eyebrows carry the identity colour at a glance. */
|
|
.label-eyebrow {
|
|
font-size: 11px;
|
|
font-weight: 700;
|
|
letter-spacing: 0.07em;
|
|
text-transform: uppercase;
|
|
color: var(--color-brand-600);
|
|
}
|
|
|
|
/* ─────────────────────────────────────────────────────────────────────────
|
|
REUSABLE VISUAL UTILITIES (anh chốt 2026-06-16). Component-classes so the
|
|
whole app picks up the richer look without touching 65 leaf pages — any
|
|
page can add class="card-accent" / "icon-chip" etc.
|
|
───────────────────────────────────────────────────────────────────────── */
|
|
|
|
/* Brand gradient surface — page/section headers, hero strips.
|
|
xanh → xanh đậm theo hướng anh chốt. Text on top must be white. */
|
|
.app-gradient-brand {
|
|
background-image: linear-gradient(120deg, var(--color-brand-600) 0%, var(--color-brand-700) 55%, var(--color-brand-800) 100%);
|
|
}
|
|
|
|
/* KPI / metric card — colored LEFT border + soft lift. Pair with a
|
|
--accent custom property to recolour the rail per card, e.g.
|
|
style={{ ['--accent' as any]: 'var(--color-teal-500)' }}. Defaults brand. */
|
|
.card-accent {
|
|
position: relative;
|
|
border-radius: 0.75rem;
|
|
border: 1px solid #e9eef4;
|
|
background: #fff;
|
|
border-left: 3px solid var(--accent, var(--color-brand-500));
|
|
box-shadow: 0 1px 2px rgb(15 23 42 / 0.04), 0 1px 3px rgb(15 23 42 / 0.06);
|
|
transition: box-shadow .18s ease, transform .18s ease;
|
|
}
|
|
.card-accent:hover {
|
|
box-shadow: 0 4px 10px rgb(15 23 42 / 0.08), 0 2px 4px rgb(15 23 42 / 0.06);
|
|
transform: translateY(-1px);
|
|
}
|
|
|
|
/* Icon chip — soft tinted square behind a lucide icon. Recolour via --chip-bg
|
|
/ --chip-fg, defaults brand. Used in KPI cards + section headers. */
|
|
.icon-chip {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
height: 2.25rem;
|
|
width: 2.25rem;
|
|
border-radius: 0.625rem;
|
|
background: var(--chip-bg, var(--color-brand-50));
|
|
color: var(--chip-fg, var(--color-brand-600));
|
|
}
|
|
|
|
/* Big stat number — tabular, tight, dark. */
|
|
.stat-value {
|
|
font-variant-numeric: tabular-nums;
|
|
font-weight: 700;
|
|
letter-spacing: -0.02em;
|
|
color: #0b1220;
|
|
line-height: 1.1;
|
|
}
|
|
|
|
@media (prefers-reduced-motion: reduce) {
|
|
.card-accent { transition: none; }
|
|
.card-accent:hover { transform: none; }
|
|
}
|
|
|
|
/* Tabular numbers in tables + stat cards for better alignment */
|
|
table, .tabular-nums {
|
|
font-variant-numeric: tabular-nums;
|
|
}
|
|
|
|
input:focus-visible, textarea:focus-visible, select:focus-visible, button:focus-visible {
|
|
outline: none;
|
|
}
|
|
|
|
::-webkit-scrollbar {
|
|
width: 8px;
|
|
height: 8px;
|
|
}
|
|
::-webkit-scrollbar-track {
|
|
background: transparent;
|
|
}
|
|
::-webkit-scrollbar-thumb {
|
|
background: #cbd5e1;
|
|
border-radius: 4px;
|
|
}
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: #94a3b8;
|
|
}
|