[CLAUDE] FE-Admin+FE-User: brand-accent polish x2 app - stripe dinh app + logo zone tint + PageHeader accent bar + thead brand (S58, anh yeu cau trang tri ro hon)
Some checks failed
Deploy SOLUTION_ERP / build-deploy (push) Has been cancelled
Some checks failed
Deploy SOLUTION_ERP / build-deploy (push) Has been cancelled
This commit is contained in:
@ -82,8 +82,10 @@ export function DataTable<T>({
|
|||||||
// Density-first: rounded-lg + crisp border (no decorative shadow).
|
// Density-first: rounded-lg + crisp border (no decorative shadow).
|
||||||
<div className="overflow-auto rounded-lg border border-slate-200 bg-white">
|
<div className="overflow-auto rounded-lg border border-slate-200 bg-white">
|
||||||
<table className="w-full text-[12px]">
|
<table className="w-full text-[12px]">
|
||||||
<thead className="sticky top-0 z-10 bg-slate-50 text-slate-500">
|
{/* thead tint brand — đậm nhận diện hơn slate (mirror fe-user S58);
|
||||||
<tr className="border-b border-slate-200">
|
brand-700 semibold uppercase 11px đạt AA trên nền nhạt. */}
|
||||||
|
<thead className="sticky top-0 z-10 bg-brand-50/60 text-brand-700">
|
||||||
|
<tr className="border-b border-brand-100">
|
||||||
{columns.map(c => (
|
{columns.map(c => (
|
||||||
<th
|
<th
|
||||||
key={c.key}
|
key={c.key}
|
||||||
|
|||||||
@ -257,12 +257,16 @@ export function Layout() {
|
|||||||
const { menu } = useAuth()
|
const { menu } = useAuth()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex h-screen">
|
// Brand stripe — dải nhận diện #1F7DC1 đỉnh app (mirror fe-user S58,
|
||||||
|
// anh yêu cầu "trang trí lên 1 tý"; guide accent sparing).
|
||||||
|
<div className="flex h-screen flex-col">
|
||||||
|
<div className="h-1 shrink-0 bg-gradient-to-r from-brand-700 via-brand-500 to-brand-600" />
|
||||||
|
<div className="flex min-h-0 flex-1">
|
||||||
<aside className="flex w-72 flex-col border-r border-slate-200 bg-white xl:w-80">
|
<aside className="flex w-72 flex-col border-r border-slate-200 bg-white xl:w-80">
|
||||||
<div className="flex h-16 items-center border-b border-slate-200 px-5">
|
<div className="flex h-16 items-center border-b border-brand-100 bg-gradient-to-b from-brand-50/70 to-transparent px-5">
|
||||||
<Link to="/dashboard" className="flex items-center gap-2.5">
|
<Link to="/dashboard" className="flex items-center gap-2.5">
|
||||||
<img src="/logo.png" alt="Solutions" className="h-8 w-auto" />
|
<img src="/logo.png" alt="Solutions" className="h-8 w-auto" />
|
||||||
<span className="text-[11px] font-semibold uppercase tracking-wider text-slate-400">Admin</span>
|
<span className="text-[11px] font-semibold uppercase tracking-wider text-brand-600/80">Admin</span>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<nav className="flex-1 space-y-1 overflow-y-auto p-3">
|
<nav className="flex-1 space-y-1 overflow-y-auto p-3">
|
||||||
@ -278,5 +282,6 @@ export function Layout() {
|
|||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,10 +13,14 @@ export function PageHeader({
|
|||||||
// Density-first (NAMGROUP): compact one-line header, text-[15px] semibold,
|
// Density-first (NAMGROUP): compact one-line header, text-[15px] semibold,
|
||||||
// tighter bottom rule. Toolbar/actions sit inline on the right.
|
// tighter bottom rule. Toolbar/actions sit inline on the right.
|
||||||
<div className="mb-5 flex items-start justify-between gap-6 border-b border-slate-200 pb-3.5">
|
<div className="mb-5 flex items-start justify-between gap-6 border-b border-slate-200 pb-3.5">
|
||||||
|
<div className="flex min-w-0 items-start gap-2.5">
|
||||||
|
{/* Brand accent bar — nhận diện #1F7DC1 per-page (mirror fe-user S58) */}
|
||||||
|
<span aria-hidden className="mt-0.5 h-4 w-1 shrink-0 rounded-full bg-gradient-to-b from-brand-500 to-brand-700" />
|
||||||
<div className="min-w-0">
|
<div className="min-w-0">
|
||||||
<h1 className="text-[15px] font-semibold leading-tight text-slate-800">{title}</h1>
|
<h1 className="text-[15px] font-semibold leading-tight text-slate-800">{title}</h1>
|
||||||
{description && <p className="mt-1 text-xs leading-relaxed text-slate-500">{description}</p>}
|
{description && <p className="mt-1 text-xs leading-relaxed text-slate-500">{description}</p>}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
{actions && <div className="flex shrink-0 items-center gap-2">{actions}</div>}
|
{actions && <div className="flex shrink-0 items-center gap-2">{actions}</div>}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@ -69,7 +69,7 @@ function UserMenu() {
|
|||||||
export function TopBar({ title }: { title?: string }) {
|
export function TopBar({ title }: { title?: string }) {
|
||||||
return (
|
return (
|
||||||
<header className="flex h-14 items-center justify-between border-b border-slate-200 bg-white px-6">
|
<header className="flex h-14 items-center justify-between border-b border-slate-200 bg-white px-6">
|
||||||
<div className="text-sm font-medium text-slate-500">{title}</div>
|
<div className="text-sm font-semibold text-slate-700">{title}</div>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<NotificationBell />
|
<NotificationBell />
|
||||||
<UserMenu />
|
<UserMenu />
|
||||||
|
|||||||
@ -82,8 +82,10 @@ export function DataTable<T>({
|
|||||||
// Density-first: rounded-lg + crisp border (no decorative shadow).
|
// Density-first: rounded-lg + crisp border (no decorative shadow).
|
||||||
<div className="overflow-auto rounded-lg border border-slate-200 bg-white">
|
<div className="overflow-auto rounded-lg border border-slate-200 bg-white">
|
||||||
<table className="w-full text-[12px]">
|
<table className="w-full text-[12px]">
|
||||||
<thead className="sticky top-0 z-10 bg-slate-50 text-slate-500">
|
{/* thead tint brand — đậm nhận diện hơn slate (anh yêu cầu "trang trí
|
||||||
<tr className="border-b border-slate-200">
|
lên 1 tý" 06-11); brand-700 semibold uppercase 11px đạt AA trên nền nhạt. */}
|
||||||
|
<thead className="sticky top-0 z-10 bg-brand-50/60 text-brand-700">
|
||||||
|
<tr className="border-b border-brand-100">
|
||||||
{columns.map(c => (
|
{columns.map(c => (
|
||||||
<th
|
<th
|
||||||
key={c.key}
|
key={c.key}
|
||||||
|
|||||||
@ -385,12 +385,16 @@ export function Layout() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<AccordionContext.Provider value={accordionValue}>
|
<AccordionContext.Provider value={accordionValue}>
|
||||||
<div className="flex h-screen">
|
{/* Brand stripe — dải nhận diện #1F7DC1 chạy suốt đỉnh app (anh yêu cầu
|
||||||
|
"trang trí lên 1 tý" 06-11; guide cho accent sparing — đây là 1 chỗ). */}
|
||||||
|
<div className="flex h-screen flex-col">
|
||||||
|
<div className="h-1 shrink-0 bg-gradient-to-r from-brand-700 via-brand-500 to-brand-600" />
|
||||||
|
<div className="flex min-h-0 flex-1">
|
||||||
<aside className="flex w-72 flex-col border-r border-slate-200 bg-white xl:w-80">
|
<aside className="flex w-72 flex-col border-r border-slate-200 bg-white xl:w-80">
|
||||||
<div className="flex h-16 items-center border-b border-slate-200 px-5">
|
<div className="flex h-16 items-center border-b border-brand-100 bg-gradient-to-b from-brand-50/70 to-transparent px-5">
|
||||||
<Link to="/dashboard" className="flex items-center gap-2.5">
|
<Link to="/dashboard" className="flex items-center gap-2.5">
|
||||||
<img src="/logo.png" alt="Solutions" className="h-8 w-auto" />
|
<img src="/logo.png" alt="Solutions" className="h-8 w-auto" />
|
||||||
<span className="text-[11px] font-semibold uppercase tracking-wider text-slate-400">ERP</span>
|
<span className="text-[11px] font-semibold uppercase tracking-wider text-brand-600/80">ERP</span>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<nav className="flex-1 space-y-1 overflow-y-auto p-3">
|
<nav className="flex-1 space-y-1 overflow-y-auto p-3">
|
||||||
@ -407,6 +411,7 @@ export function Layout() {
|
|||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</AccordionContext.Provider>
|
</AccordionContext.Provider>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,10 +13,14 @@ export function PageHeader({
|
|||||||
// Density-first (NAMGROUP): compact one-line header, text-[15px] semibold,
|
// Density-first (NAMGROUP): compact one-line header, text-[15px] semibold,
|
||||||
// tighter bottom rule. Toolbar/actions sit inline on the right.
|
// tighter bottom rule. Toolbar/actions sit inline on the right.
|
||||||
<div className="mb-5 flex items-start justify-between gap-6 border-b border-slate-200 pb-3.5">
|
<div className="mb-5 flex items-start justify-between gap-6 border-b border-slate-200 pb-3.5">
|
||||||
|
<div className="flex min-w-0 items-start gap-2.5">
|
||||||
|
{/* Brand accent bar — nhận diện #1F7DC1 per-page (anh yêu cầu 06-11) */}
|
||||||
|
<span aria-hidden className="mt-0.5 h-4 w-1 shrink-0 rounded-full bg-gradient-to-b from-brand-500 to-brand-700" />
|
||||||
<div className="min-w-0">
|
<div className="min-w-0">
|
||||||
<h1 className="text-[15px] font-semibold leading-tight text-slate-800">{title}</h1>
|
<h1 className="text-[15px] font-semibold leading-tight text-slate-800">{title}</h1>
|
||||||
{description && <p className="mt-1 text-xs leading-relaxed text-slate-500">{description}</p>}
|
{description && <p className="mt-1 text-xs leading-relaxed text-slate-500">{description}</p>}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
{actions && <div className="flex shrink-0 items-center gap-2">{actions}</div>}
|
{actions && <div className="flex shrink-0 items-center gap-2">{actions}</div>}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@ -69,7 +69,7 @@ function UserMenu() {
|
|||||||
export function TopBar({ title }: { title?: string }) {
|
export function TopBar({ title }: { title?: string }) {
|
||||||
return (
|
return (
|
||||||
<header className="flex h-14 items-center justify-between border-b border-slate-200 bg-white px-6">
|
<header className="flex h-14 items-center justify-between border-b border-slate-200 bg-white px-6">
|
||||||
<div className="text-sm font-medium text-slate-500">{title}</div>
|
<div className="text-sm font-semibold text-slate-700">{title}</div>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<NotificationBell />
|
<NotificationBell />
|
||||||
<UserMenu />
|
<UserMenu />
|
||||||
|
|||||||
Reference in New Issue
Block a user