From dcc4b10f00e9f8c05953f4ce4c094c1080a36b4b Mon Sep 17 00:00:00 2001 From: Admin Date: Fri, 8 May 2026 13:56:33 +0330 Subject: [PATCH] improvement: badge & card components colour pallete updated so their text become more readable in light mode. --- frontend/src/app/(dashboard)/billing/page.tsx | 15 +- frontend/src/app/(dashboard)/today/page.tsx | 42 +++--- .../appointments/AppointmentScheduleGrid.tsx | 7 +- .../appointments/appointmentPurposeStyles.ts | 23 +-- frontend/src/components/ui/common/Badge.tsx | 8 +- frontend/src/components/ui/common/Card.tsx | 36 +++++ .../ui/treatment/AppointmentsStrip.tsx | 17 ++- frontend/src/styles/globals.css | 138 +++++++++++++++++- 8 files changed, 231 insertions(+), 55 deletions(-) create mode 100644 frontend/src/components/ui/common/Card.tsx diff --git a/frontend/src/app/(dashboard)/billing/page.tsx b/frontend/src/app/(dashboard)/billing/page.tsx index 6464010..b28de1c 100644 --- a/frontend/src/app/(dashboard)/billing/page.tsx +++ b/frontend/src/app/(dashboard)/billing/page.tsx @@ -4,6 +4,7 @@ import { useState } from 'react'; import { Pencil } from 'lucide-react'; import { Button } from '@/components/ui/common/Button'; import { Badge } from '@/components/ui/common/Badge'; +import { Card } from '@/components/ui/common/Card'; import { Table } from '@/components/ui/common/Table'; import { SearchBar } from '@/components/ui/common/SearchBar'; import { useAuth } from '@/lib/hooks/useAuth'; @@ -195,19 +196,19 @@ export default function BillingPage() { } function StatCard({ title, count, amount, color }: StatCardProps) { const colors: Record = { - blue: 'bg-sky-900/30 text-sky-300 border-sky-700/60', - yellow: 'bg-amber-900/30 text-amber-300 border-amber-700/60', - green: 'bg-emerald-900/30 text-emerald-300 border-emerald-700/60', - red: 'bg-red-950/30 text-red-300 border-red-700/60', + blue: '!bg-purpose-visit-bg !text-purpose-visit-fg !border-purpose-visit-border', + yellow: '!bg-badge-warning-bg !text-badge-warning-fg !border-badge-warning-border', + green: '!bg-badge-success-bg !text-badge-success-fg !border-badge-success-border', + red: '!bg-badge-danger-bg !text-badge-danger-fg !border-badge-danger-border', }; return ( -
-

{title}

+ +

{title}

{count}

${amount.toLocaleString()}

-
+ ); } diff --git a/frontend/src/app/(dashboard)/today/page.tsx b/frontend/src/app/(dashboard)/today/page.tsx index 5ac0d34..7ac754e 100644 --- a/frontend/src/app/(dashboard)/today/page.tsx +++ b/frontend/src/app/(dashboard)/today/page.tsx @@ -2,6 +2,7 @@ import Link from 'next/link'; import { useAuth } from '@/lib/hooks/useAuth'; +import { Card } from '@/components/ui/common/Card'; export default function TodayPage() { const { currentOrganization } = useAuth(); @@ -27,29 +28,26 @@ export default function TodayPage() { )}
- - - - + +

Today's Appointments

+

12

+

Monday 2/5/2026

+
+ +

Active Patients

+

675

+
+ +

New Lab Case

+

5

+

35 ↑

+
+ +

Today invoices

+

1200$

+

21,300 $

+
); -} - -function Card({ - title, - value, - sub, -}: { - title: string; - value: string; - sub?: string; -}) { - return ( -
-

{title}

-

{value}

- {sub &&

{sub}

} -
- ); } \ No newline at end of file diff --git a/frontend/src/components/ui/appointments/AppointmentScheduleGrid.tsx b/frontend/src/components/ui/appointments/AppointmentScheduleGrid.tsx index fd0a98f..ad515af 100644 --- a/frontend/src/components/ui/appointments/AppointmentScheduleGrid.tsx +++ b/frontend/src/components/ui/appointments/AppointmentScheduleGrid.tsx @@ -3,7 +3,10 @@ import { Trash2 } from 'lucide-react'; import type { AppointmentColumnProvider, AppointmentRecord } from '@/types/appointment'; import { formatHourLabel } from '@/lib/appointmentTime'; -import { purposeDeleteIconClass, purposeStyle } from '@/components/ui/appointments/appointmentPurposeStyles'; +import { + purposeDeleteIconClass, + purposeStyle, +} from '@/components/ui/appointments/appointmentPurposeStyles'; const HOUR_PX = 40; const HOURS = Array.from({ length: 24 }, (_, i) => i); @@ -133,7 +136,7 @@ export function AppointmentScheduleGrid({ {canDelete && onDeleteAppointment && ( - + ); } return ( -
+
@@ -89,12 +90,14 @@ export function AppointmentsStrip({ })}`; const palette = purposeStyle(a.purpose); return ( - + ); })}
-
+
); } diff --git a/frontend/src/styles/globals.css b/frontend/src/styles/globals.css index 27dc929..6205780 100644 --- a/frontend/src/styles/globals.css +++ b/frontend/src/styles/globals.css @@ -18,6 +18,40 @@ --color-border: #d2dcec; --color-border-strong: #aec0de; + --color-card-background: #ffffff; + --color-card-foreground: #0f172a; + --color-card-muted: #475569; + --color-card-border: #d2dcec; + + --color-badge-default-bg: #edf3fb; + --color-badge-default-fg: #1e293b; + --color-badge-default-border: #c9d8ec; + --color-badge-success-bg: #e6f7ef; + --color-badge-success-fg: #14532d; + --color-badge-success-border: #98d8b5; + --color-badge-warning-bg: #fff4df; + --color-badge-warning-fg: #92400e; + --color-badge-warning-border: #f6c88b; + --color-badge-danger-bg: #ffe8e8; + --color-badge-danger-fg: #991b1b; + --color-badge-danger-border: #f2b0b0; + + --color-purpose-consultation-bg: #f1eafe; + --color-purpose-consultation-fg: #5b21b6; + --color-purpose-consultation-border: #cfb8f7; + --color-purpose-filling-bg: #fff1e5; + --color-purpose-filling-fg: #9a3412; + --color-purpose-filling-border: #f8c9a6; + --color-purpose-endo-bg: #ffe9e9; + --color-purpose-endo-fg: #991b1b; + --color-purpose-endo-border: #f4b6b6; + --color-purpose-visit-bg: #e7f4ff; + --color-purpose-visit-fg: #0c4a6e; + --color-purpose-visit-border: #abd8f3; + --color-purpose-hygiene-bg: #effadf; + --color-purpose-hygiene-fg: #3f6212; + --color-purpose-hygiene-border: #cbe9a1; + --color-primary: #009cae; --color-primary-contrast: #031014; --color-primary-soft: rgba(0, 156, 174, 0.16); @@ -42,6 +76,40 @@ --color-border: #29456a; --color-border-strong: #3b5f8f; + --color-card-background: #14253d; + --color-card-foreground: #f5f9ff; + --color-card-muted: #b6c6dd; + --color-card-border: #29456a; + + --color-badge-default-bg: #1b2f4e; + --color-badge-default-fg: #b6c6dd; + --color-badge-default-border: #3b5f8f; + --color-badge-success-bg: rgba(6, 78, 59, 0.45); + --color-badge-success-fg: #86efac; + --color-badge-success-border: rgba(21, 128, 61, 0.5); + --color-badge-warning-bg: rgba(120, 53, 15, 0.48); + --color-badge-warning-fg: #fcd34d; + --color-badge-warning-border: rgba(180, 83, 9, 0.55); + --color-badge-danger-bg: rgba(127, 29, 29, 0.42); + --color-badge-danger-fg: #fca5a5; + --color-badge-danger-border: rgba(185, 28, 28, 0.52); + + --color-purpose-consultation-bg: rgba(139, 92, 246, 0.25); + --color-purpose-consultation-fg: #ddd6fe; + --color-purpose-consultation-border: rgba(167, 139, 250, 0.5); + --color-purpose-filling-bg: rgba(249, 115, 22, 0.25); + --color-purpose-filling-fg: #fed7aa; + --color-purpose-filling-border: rgba(251, 146, 60, 0.5); + --color-purpose-endo-bg: rgba(239, 68, 68, 0.25); + --color-purpose-endo-fg: #fecaca; + --color-purpose-endo-border: rgba(248, 113, 113, 0.5); + --color-purpose-visit-bg: rgba(14, 165, 233, 0.25); + --color-purpose-visit-fg: #bae6fd; + --color-purpose-visit-border: rgba(56, 189, 248, 0.5); + --color-purpose-hygiene-bg: rgba(132, 204, 22, 0.2); + --color-purpose-hygiene-fg: #d9f99d; + --color-purpose-hygiene-border: rgba(163, 230, 53, 0.45); + --color-primary: #09a9bc; --color-primary-contrast: #001117; --color-primary-soft: rgba(9, 169, 188, 0.2); @@ -66,6 +134,40 @@ --color-border: #29456a; --color-border-strong: #3b5f8f; + --color-card-background: #14253d; + --color-card-foreground: #f5f9ff; + --color-card-muted: #b6c6dd; + --color-card-border: #29456a; + + --color-badge-default-bg: #1b2f4e; + --color-badge-default-fg: #b6c6dd; + --color-badge-default-border: #3b5f8f; + --color-badge-success-bg: rgba(6, 78, 59, 0.45); + --color-badge-success-fg: #86efac; + --color-badge-success-border: rgba(21, 128, 61, 0.5); + --color-badge-warning-bg: rgba(120, 53, 15, 0.48); + --color-badge-warning-fg: #fcd34d; + --color-badge-warning-border: rgba(180, 83, 9, 0.55); + --color-badge-danger-bg: rgba(127, 29, 29, 0.42); + --color-badge-danger-fg: #fca5a5; + --color-badge-danger-border: rgba(185, 28, 28, 0.52); + + --color-purpose-consultation-bg: rgba(139, 92, 246, 0.25); + --color-purpose-consultation-fg: #ddd6fe; + --color-purpose-consultation-border: rgba(167, 139, 250, 0.5); + --color-purpose-filling-bg: rgba(249, 115, 22, 0.25); + --color-purpose-filling-fg: #fed7aa; + --color-purpose-filling-border: rgba(251, 146, 60, 0.5); + --color-purpose-endo-bg: rgba(239, 68, 68, 0.25); + --color-purpose-endo-fg: #fecaca; + --color-purpose-endo-border: rgba(248, 113, 113, 0.5); + --color-purpose-visit-bg: rgba(14, 165, 233, 0.25); + --color-purpose-visit-fg: #bae6fd; + --color-purpose-visit-border: rgba(56, 189, 248, 0.5); + --color-purpose-hygiene-bg: rgba(132, 204, 22, 0.2); + --color-purpose-hygiene-fg: #d9f99d; + --color-purpose-hygiene-border: rgba(163, 230, 53, 0.45); + --color-primary: #09a9bc; --color-primary-contrast: #001117; --color-primary-soft: rgba(9, 169, 188, 0.2); @@ -89,6 +191,37 @@ --color-border: var(--color-border); --color-border-strong: var(--color-border-strong); + --color-card: var(--color-card-background); + --color-card-foreground: var(--color-card-foreground); + --color-card-muted: var(--color-card-muted); + --color-card-border: var(--color-card-border); + --color-badge-default-bg: var(--color-badge-default-bg); + --color-badge-default-fg: var(--color-badge-default-fg); + --color-badge-default-border: var(--color-badge-default-border); + --color-badge-success-bg: var(--color-badge-success-bg); + --color-badge-success-fg: var(--color-badge-success-fg); + --color-badge-success-border: var(--color-badge-success-border); + --color-badge-warning-bg: var(--color-badge-warning-bg); + --color-badge-warning-fg: var(--color-badge-warning-fg); + --color-badge-warning-border: var(--color-badge-warning-border); + --color-badge-danger-bg: var(--color-badge-danger-bg); + --color-badge-danger-fg: var(--color-badge-danger-fg); + --color-badge-danger-border: var(--color-badge-danger-border); + --color-purpose-consultation-bg: var(--color-purpose-consultation-bg); + --color-purpose-consultation-fg: var(--color-purpose-consultation-fg); + --color-purpose-consultation-border: var(--color-purpose-consultation-border); + --color-purpose-filling-bg: var(--color-purpose-filling-bg); + --color-purpose-filling-fg: var(--color-purpose-filling-fg); + --color-purpose-filling-border: var(--color-purpose-filling-border); + --color-purpose-endo-bg: var(--color-purpose-endo-bg); + --color-purpose-endo-fg: var(--color-purpose-endo-fg); + --color-purpose-endo-border: var(--color-purpose-endo-border); + --color-purpose-visit-bg: var(--color-purpose-visit-bg); + --color-purpose-visit-fg: var(--color-purpose-visit-fg); + --color-purpose-visit-border: var(--color-purpose-visit-border); + --color-purpose-hygiene-bg: var(--color-purpose-hygiene-bg); + --color-purpose-hygiene-fg: var(--color-purpose-hygiene-fg); + --color-purpose-hygiene-border: var(--color-purpose-hygiene-border); --color-primary: var(--color-primary); --color-primary-contrast: var(--color-primary-contrast); --color-primary-soft: var(--color-primary-soft); @@ -115,8 +248,9 @@ body { } .surface-card { - background: color-mix(in srgb, var(--color-background-card) 92%, transparent); - border: 1px solid var(--color-border); + background: color-mix(in srgb, var(--color-card-background) 92%, transparent); + border: 1px solid var(--color-card-border); + color: var(--color-card-foreground); border-radius: var(--radius-lg); }