diff --git a/packages/web/src/components/RouteErrorBoundary.tsx b/packages/web/src/components/RouteErrorBoundary.tsx index 950a1ae0..e6c0fb32 100644 --- a/packages/web/src/components/RouteErrorBoundary.tsx +++ b/packages/web/src/components/RouteErrorBoundary.tsx @@ -35,16 +35,16 @@ export class RouteErrorBoundary extends Component
-

+

Something went wrong on this page

-

+

This page failed to render. The rest of the app is still available, try reloading, or pick another page from the menu.

@@ -52,7 +52,7 @@ export class RouteErrorBoundary extends Component window.location.reload()} style={{ - background: 'var(--color-primary, var(--color-primary))', + background: 'var(--color-primary)', border: 'none', borderRadius: 8, color: 'var(--color-surface)', diff --git a/packages/web/src/features/agency/AgencySetupPage.tsx b/packages/web/src/features/agency/AgencySetupPage.tsx index 4b838740..0a1a57ba 100644 --- a/packages/web/src/features/agency/AgencySetupPage.tsx +++ b/packages/web/src/features/agency/AgencySetupPage.tsx @@ -426,7 +426,7 @@ export function AgencySetupPage() {

Your billing-provider identity for X12 837P claims. Required fields (marked  - *) must be complete before an 837 can be generated + *) must be complete before an 837 can be generated for a payer or clearinghouse.

@@ -434,7 +434,7 @@ export function AgencySetupPage() { {BILLING_FIELDS.map(f => (
@@ -189,27 +189,27 @@ export function GoLiveReadinessPage() { return (
-

+

Onboarding

-

Go-Live Readiness

-

+

Go-Live Readiness

+

Everything an agency must finish before it can run verified visits and bill them. Each unfinished item links to where you fix it.

{error && ( -
{error}
+
{error}
)} - {items === null && !error &&

Checking your setup…

} + {items === null && !error &&

Checking your setup…

} {items !== null && ( <>
-

{item.title}

+

{item.title}

{!item.done && ( - + {item.fixLabel} → )}
-

{item.detail}

+

{item.detail}

))} diff --git a/packages/web/src/features/audit/AuditEventsPage.tsx b/packages/web/src/features/audit/AuditEventsPage.tsx index 32958178..1df8972e 100644 --- a/packages/web/src/features/audit/AuditEventsPage.tsx +++ b/packages/web/src/features/audit/AuditEventsPage.tsx @@ -1,5 +1,6 @@ import React, { useEffect, useMemo, useState } from 'react'; import { getJson } from '../../lib/api-client.js'; +import { tint } from '../../lib/color.js'; /** * Admin-only audit events timeline. @@ -325,7 +326,7 @@ export function AuditEventsPage() { display: 'inline-flex', alignItems: 'center', gap: '0.4rem', - background: 'rgba(16, 116, 128,0.2)', + background: tint('var(--color-primary)', 20), color: 'var(--color-primary-light)', borderRadius: '6px', padding: '0.3rem 0.75rem', diff --git a/packages/web/src/features/audit/AuditRetentionPage.tsx b/packages/web/src/features/audit/AuditRetentionPage.tsx index b27023e0..8d53f82e 100644 --- a/packages/web/src/features/audit/AuditRetentionPage.tsx +++ b/packages/web/src/features/audit/AuditRetentionPage.tsx @@ -1,5 +1,6 @@ import React, { useEffect, useState } from 'react'; import { getJson } from '../../lib/api-client.js'; +import { tint } from '../../lib/color.js'; /** * Admin-only HIPAA audit-retention evidence dashboard. @@ -139,7 +140,7 @@ export function AuditRetentionPage() { display: 'inline-flex', alignItems: 'center', gap: '0.4rem', - background: 'rgba(16, 116, 128,0.2)', + background: tint('var(--color-primary)', 20), color: 'var(--color-primary-light)', borderRadius: '6px', padding: '0.3rem 0.75rem', diff --git a/packages/web/src/features/auth/AcceptInvitePage.tsx b/packages/web/src/features/auth/AcceptInvitePage.tsx index 59a1bd2b..03b3c006 100644 --- a/packages/web/src/features/auth/AcceptInvitePage.tsx +++ b/packages/web/src/features/auth/AcceptInvitePage.tsx @@ -1,5 +1,6 @@ import React, { useEffect, useState } from 'react'; import { Link, useNavigate, useSearchParams } from 'react-router-dom'; +import { tint } from '../../lib/color.js'; interface InviteInfo { token: string; @@ -135,7 +136,7 @@ export function AcceptInvitePage() { right: '-20%', width: '60%', height: '60%', - background: 'radial-gradient(circle, rgba(16, 116, 128,0.18) 0%, transparent 70%)', + background: `radial-gradient(circle, ${tint('var(--color-primary)', 18)} 0%, transparent 70%)`, pointerEvents: 'none', }} /> diff --git a/packages/web/src/features/auth/CaregiverPortalPage.tsx b/packages/web/src/features/auth/CaregiverPortalPage.tsx index 3aa9fed3..3224c460 100644 --- a/packages/web/src/features/auth/CaregiverPortalPage.tsx +++ b/packages/web/src/features/auth/CaregiverPortalPage.tsx @@ -1,5 +1,6 @@ import { Navigate } from 'react-router-dom'; import { useAuth } from '../../lib/AuthContext.js'; +import { tint } from '../../lib/color.js'; const ADMIN_ROLES = new Set(['admin', 'coordinator']); @@ -53,8 +54,8 @@ export function CaregiverPortalPage() { width: '52px', height: '52px', borderRadius: '14px', - background: 'rgba(16, 116, 128,0.15)', - border: '1px solid rgba(16, 116, 128,0.25)', + background: tint('var(--color-primary)', 15), + border: `1px solid ${tint('var(--color-primary)', 25)}`, display: 'flex', alignItems: 'center', justifyContent: 'center', @@ -80,8 +81,8 @@ export function CaregiverPortalPage() {
diff --git a/packages/web/src/features/auth/ResetPasswordPage.tsx b/packages/web/src/features/auth/ResetPasswordPage.tsx index 30443b8b..ebde0102 100644 --- a/packages/web/src/features/auth/ResetPasswordPage.tsx +++ b/packages/web/src/features/auth/ResetPasswordPage.tsx @@ -37,7 +37,7 @@ export function ResetPasswordPage() { if (!token) { return (
-

+

Invalid reset link.{' '} Request a new one.

diff --git a/packages/web/src/features/auth/SignupPage.tsx b/packages/web/src/features/auth/SignupPage.tsx index a3c3de39..32b18d1f 100644 --- a/packages/web/src/features/auth/SignupPage.tsx +++ b/packages/web/src/features/auth/SignupPage.tsx @@ -1,5 +1,6 @@ import React, { useState } from 'react'; import { Link } from 'react-router-dom'; +import { tint } from '../../lib/color.js'; const steps = ['Agency info', 'Admin account']; @@ -82,7 +83,7 @@ export function SignupPage() { right: '-20%', width: '60%', height: '60%', - background: 'radial-gradient(circle, rgba(16, 116, 128,0.18) 0%, transparent 70%)', + background: `radial-gradient(circle, ${tint('var(--color-primary)', 18)} 0%, transparent 70%)`, pointerEvents: 'none', }} /> diff --git a/packages/web/src/features/caregiver/CaregiverDashboard.tsx b/packages/web/src/features/caregiver/CaregiverDashboard.tsx index 55b160ab..67cde270 100644 --- a/packages/web/src/features/caregiver/CaregiverDashboard.tsx +++ b/packages/web/src/features/caregiver/CaregiverDashboard.tsx @@ -52,7 +52,7 @@ function StatusBadge({ status }: { status: string }) { const map: Record = { verified: { bg: 'var(--color-success-bg)', color: 'var(--color-success)', border: 'var(--color-success-border)', label: 'Verified' }, pending: { bg: 'var(--color-warning-bg)', color: 'var(--color-warning)', border: 'var(--color-warning-border)', label: 'Pending' }, - flagged: { bg: 'var(--color-danger-bg)', color: 'var(--color-danger)', border: 'var(--color-danger-border)', label: 'Flagged' }, + flagged: { bg: 'var(--color-danger-bg)', color: 'var(--color-danger-text)', border: 'var(--color-danger-border)', label: 'Flagged' }, corrected: { bg: 'var(--color-info-bg)', color: 'var(--color-primary)', border: 'var(--color-info-border)', label: 'Corrected' }, }; const fallback = { bg: 'var(--color-surface-soft)', color: 'var(--color-text-secondary)', border: 'var(--color-border)', label: status || 'Unknown' }; diff --git a/packages/web/src/features/caregiver/CaregiverLearningHubPage.tsx b/packages/web/src/features/caregiver/CaregiverLearningHubPage.tsx index 77e0fa33..d95e5ede 100644 --- a/packages/web/src/features/caregiver/CaregiverLearningHubPage.tsx +++ b/packages/web/src/features/caregiver/CaregiverLearningHubPage.tsx @@ -39,8 +39,8 @@ const CADENCE_LABEL: Record = { const STATUS_MAP = { completed: { bg: 'var(--color-success-bg)', color: 'var(--color-success)', border: 'var(--color-success-border)', label: 'Completed' }, in_progress: { bg: 'var(--color-info-bg)', color: 'var(--color-primary)', border: 'var(--color-info-border)', label: 'In Progress' }, - overdue: { bg: 'var(--color-danger-bg)', color: 'var(--color-danger)', border: 'var(--color-danger-border)', label: 'Overdue' }, - expired: { bg: 'var(--color-danger-bg)', color: 'var(--color-danger)', border: 'var(--color-danger-border)', label: 'Expired' }, + overdue: { bg: 'var(--color-danger-bg)', color: 'var(--color-danger-text)', border: 'var(--color-danger-border)', label: 'Overdue' }, + expired: { bg: 'var(--color-danger-bg)', color: 'var(--color-danger-text)', border: 'var(--color-danger-border)', label: 'Expired' }, not_started: { bg: 'var(--color-bg)', color: 'var(--color-text-muted)', border: 'var(--color-border)', label: 'Not Started' }, }; @@ -123,7 +123,7 @@ export function CaregiverLearningHubPage() { borderRadius: '6px', border: 'none', cursor: 'pointer', - background: active ? 'var(--color-primary, var(--color-primary))' : 'transparent', + background: active ? 'var(--color-primary)' : 'transparent', color: active ? 'var(--color-surface)' : 'var(--color-text-muted)', }); @@ -140,7 +140,7 @@ export function CaregiverLearningHubPage() {
My Training → @@ -266,7 +266,7 @@ export function CaregiverLearningHubPage() { fontSize: '0.8125rem', fontWeight: 600, color: 'var(--color-surface)', - background: status === 'completed' ? 'var(--color-text-muted)' : 'var(--color-primary, var(--color-primary))', + background: status === 'completed' ? 'var(--color-text-muted)' : 'var(--color-primary)', borderRadius: '8px', textDecoration: 'none', whiteSpace: 'nowrap', diff --git a/packages/web/src/features/caregiver/CaregiverTrainingPage.tsx b/packages/web/src/features/caregiver/CaregiverTrainingPage.tsx index 5806a38b..8b338414 100644 --- a/packages/web/src/features/caregiver/CaregiverTrainingPage.tsx +++ b/packages/web/src/features/caregiver/CaregiverTrainingPage.tsx @@ -39,8 +39,8 @@ type TrainingTab = 'all' | 'required' | 'in_progress' | 'completed' | 'overdue'; const STATUS_CONFIG = { completed: { bg: 'var(--color-success-bg)', color: 'var(--color-success)', border: 'var(--color-success-border)', label: 'Completed' }, in_progress: { bg: 'var(--color-info-bg)', color: 'var(--color-primary)', border: 'var(--color-info-border)', label: 'In Progress' }, - overdue: { bg: 'var(--color-danger-bg)', color: 'var(--color-danger)', border: 'var(--color-danger-border)', label: 'Overdue' }, - expired: { bg: 'var(--color-danger-bg)', color: 'var(--color-danger)', border: 'var(--color-danger-border)', label: 'Expired' }, + overdue: { bg: 'var(--color-danger-bg)', color: 'var(--color-danger-text)', border: 'var(--color-danger-border)', label: 'Overdue' }, + expired: { bg: 'var(--color-danger-bg)', color: 'var(--color-danger-text)', border: 'var(--color-danger-border)', label: 'Expired' }, not_started: { bg: 'var(--color-bg)', color: 'var(--color-text-muted)', border: 'var(--color-border)', label: 'Not Started' }, }; @@ -64,7 +64,7 @@ function ProgressBar({ pct }: { pct: number }) {
@@ -141,7 +141,7 @@ export function CaregiverTrainingPage() { borderRadius: '6px', border: 'none', cursor: 'pointer', - background: active ? 'var(--color-primary, var(--color-primary))' : 'transparent', + background: active ? 'var(--color-primary)' : 'transparent', color: active ? 'var(--color-surface)' : 'var(--color-text-muted)', }); @@ -186,7 +186,7 @@ export function CaregiverTrainingPage() { )} {error && ( -
+
{error}
)} @@ -265,7 +265,7 @@ export function CaregiverTrainingPage() { fontSize: '0.8125rem', fontWeight: 600, color: isCompleted ? 'var(--color-text-muted)' : 'var(--color-surface)', - background: isCompleted ? 'var(--color-bg)' : 'var(--color-primary, var(--color-primary))', + background: isCompleted ? 'var(--color-bg)' : 'var(--color-primary)', border: isCompleted ? '1px solid var(--color-border)' : 'none', borderRadius: '6px', cursor: 'pointer', diff --git a/packages/web/src/features/caregiver/CaregiverVisitsPage.tsx b/packages/web/src/features/caregiver/CaregiverVisitsPage.tsx index d507e26c..bffcd683 100644 --- a/packages/web/src/features/caregiver/CaregiverVisitsPage.tsx +++ b/packages/web/src/features/caregiver/CaregiverVisitsPage.tsx @@ -30,7 +30,7 @@ function StatusBadge({ status }: { status: string }) { const map: Record = { verified: { bg: 'var(--color-success-bg)', color: 'var(--color-success)', border: 'var(--color-success-border)', label: 'Verified' }, pending: { bg: 'var(--color-warning-bg)', color: 'var(--color-warning)', border: 'var(--color-warning-border)', label: 'Pending' }, - flagged: { bg: 'var(--color-danger-bg)', color: 'var(--color-danger)', border: 'var(--color-danger-border)', label: 'Flagged' }, + flagged: { bg: 'var(--color-danger-bg)', color: 'var(--color-danger-text)', border: 'var(--color-danger-border)', label: 'Flagged' }, corrected: { bg: 'var(--color-info-bg)', color: 'var(--color-primary)', border: 'var(--color-info-border)', label: 'Corrected' }, }; const s = map[status] ?? { bg: 'var(--color-surface-soft)', color: 'var(--color-text-secondary)', border: 'var(--color-border)', label: status || 'Unknown' }; @@ -72,7 +72,7 @@ export function CaregiverVisitsPage() { borderRadius: '6px', border: 'none', cursor: 'pointer', - background: active ? 'var(--color-primary, var(--color-primary))' : 'transparent', + background: active ? 'var(--color-primary)' : 'transparent', color: active ? 'var(--color-surface)' : 'var(--color-text-muted)', }); @@ -104,7 +104,7 @@ export function CaregiverVisitsPage() {
{loading &&
Loading…
} - {error &&
{error}
} + {error &&
{error}
} {!loading && !error && filtered.length === 0 && (
diff --git a/packages/web/src/features/caregiver/CourseDetailPage.tsx b/packages/web/src/features/caregiver/CourseDetailPage.tsx index 7b3c1b12..4a2541c7 100644 --- a/packages/web/src/features/caregiver/CourseDetailPage.tsx +++ b/packages/web/src/features/caregiver/CourseDetailPage.tsx @@ -1,6 +1,7 @@ import { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { postJson, getJson } from '../../lib/api-client.js'; +import { tint } from '../../lib/color.js'; interface CourseSection { title: string; @@ -123,7 +124,7 @@ function VideoPlayer({ videoUrl, onPlay }: { videoUrl: string; onPlay?: () => vo }}>
@@ -256,7 +257,7 @@ function Quiz({ questions, onPass }: QuizProps) { {qi + 1}. {q.question} {isWrong && ( - + Correct: {q.options[q.correct]} )} @@ -402,7 +403,7 @@ export function CourseDetailPage() { -
+
Course not found or you are not enrolled.
@@ -476,7 +477,7 @@ export function CourseDetailPage() {
{error && ( -
+
{error}
)} @@ -543,7 +544,7 @@ export function CourseDetailPage() {
diff --git a/packages/web/src/features/clients/ClientsPage.tsx b/packages/web/src/features/clients/ClientsPage.tsx index 1a05fdba..e063f085 100644 --- a/packages/web/src/features/clients/ClientsPage.tsx +++ b/packages/web/src/features/clients/ClientsPage.tsx @@ -1,6 +1,7 @@ import React, { useCallback, useEffect, useState } from 'react'; import { getJson, postJson, putJson, deleteJson, ApiError } from '../../lib/api-client.js'; import { EmptyState, LoadingSkeleton, ErrorRetry } from '../../components/state/index.js'; +import { tint } from '../../lib/color.js'; interface Client { id: string; @@ -349,8 +350,8 @@ export function ClientsPage() { fontSize: '0.7rem', fontWeight: 700, color: 'var(--color-primary)', - background: 'rgba(16, 116, 128,0.1)', - border: '1px solid rgba(16, 116, 128,0.2)', + background: tint('var(--color-primary)', 10), + border: `1px solid ${tint('var(--color-primary)', 20)}`, borderRadius: '999px', padding: '0.2rem 0.65rem', letterSpacing: '0.04em', diff --git a/packages/web/src/features/compliance-engine/AuditDefensePage.tsx b/packages/web/src/features/compliance-engine/AuditDefensePage.tsx index caa22c9f..67a385b0 100644 --- a/packages/web/src/features/compliance-engine/AuditDefensePage.tsx +++ b/packages/web/src/features/compliance-engine/AuditDefensePage.tsx @@ -334,7 +334,7 @@ export function AuditDefensePage() { backgroundColor: 'var(--color-danger-bg)', border: '1px solid var(--color-danger-border)', borderRadius: 10, - color: 'var(--color-danger)', + color: 'var(--color-danger-text)', fontSize: '0.9rem', fontWeight: 700, marginTop: '1rem', diff --git a/packages/web/src/features/compliance-engine/AuditPacketPage.tsx b/packages/web/src/features/compliance-engine/AuditPacketPage.tsx index 5f87e6b5..d3981704 100644 --- a/packages/web/src/features/compliance-engine/AuditPacketPage.tsx +++ b/packages/web/src/features/compliance-engine/AuditPacketPage.tsx @@ -402,7 +402,7 @@ export function AuditPacketPage() { @@ -411,7 +411,7 @@ export function AuditPacketPage() { key={i} points={stroke.map(([x, y]) => `${x},${y}`).join(' ')} fill="none" - stroke="var(--color-text, var(--color-text))" + stroke="var(--color-text)" strokeWidth={2.5} strokeLinecap="round" strokeLinejoin="round" diff --git a/packages/web/src/features/compliance-engine/AuthorizationOversightPage.tsx b/packages/web/src/features/compliance-engine/AuthorizationOversightPage.tsx index ff76484f..611d1665 100644 --- a/packages/web/src/features/compliance-engine/AuthorizationOversightPage.tsx +++ b/packages/web/src/features/compliance-engine/AuthorizationOversightPage.tsx @@ -282,7 +282,7 @@ export function AuthorizationOversightPage() { backgroundColor: 'var(--color-danger-bg)', border: '1px solid var(--color-danger-border)', borderRadius: 10, - color: 'var(--color-danger)', + color: 'var(--color-danger-text)', fontSize: '0.9rem', fontWeight: 700, marginTop: '1rem', @@ -406,7 +406,7 @@ export function AuthorizationOversightPage() { backgroundColor: 'var(--color-danger-bg)', border: '1px solid var(--color-danger-border)', borderRadius: 8, - color: 'var(--color-danger)', + color: 'var(--color-danger-text)', fontSize: '0.85rem', margin: '0.75rem 0 0', padding: '0.5rem 0.75rem', diff --git a/packages/web/src/features/compliance-engine/ClaimMatchingPage.tsx b/packages/web/src/features/compliance-engine/ClaimMatchingPage.tsx index b004b91c..e3cfea94 100644 --- a/packages/web/src/features/compliance-engine/ClaimMatchingPage.tsx +++ b/packages/web/src/features/compliance-engine/ClaimMatchingPage.tsx @@ -407,7 +407,7 @@ export function ClaimMatchingPage() { backgroundColor: 'var(--color-danger-bg)', border: '1px solid var(--color-danger-border)', borderRadius: 10, - color: 'var(--color-danger)', + color: 'var(--color-danger-text)', fontSize: '0.9rem', fontWeight: 700, marginTop: '1rem', @@ -422,10 +422,10 @@ export function ClaimMatchingPage() {
{text}
; } @@ -159,7 +159,7 @@ export function ClearinghouseConfigPage() { {loadError && banner('error', loadError)} -

Configuration

+

Configuration

Credentials are encrypted at rest and never displayed. Leave the credential fields blank to keep the stored values.

@@ -215,8 +215,8 @@ export function ClearinghouseConfigPage() {
{!isSandbox && ( -
- +
+
An API key, or the SFTP username + password.
setApiKey(e.target.value)} placeholder="API key (optional)" autoComplete="off" type="password" /> @@ -228,8 +228,8 @@ export function ClearinghouseConfigPage() {
)} -