Complete Non-Conformance Report system replacing the PowerApps/SharePoint prototype: FastAPI + SQLAlchemy 2 (async) + Alembic + MySQL 8 backend, React 18 + Vite + TypeScript + MUI frontend, Entra ID auth (MSAL / JWKS, group-gated), Microsoft Graph delegated Mail.Send notifications (OBO), six-stage workflow state machine with server-side enforcement, atomic NCR-YYYY-NNNN numbering, attachments with camera capture, immutable field-level audit trail, admin reopen, reports + CSV export, WeasyPrint PDF traveler, Power BI reporting views + read-only DB user, documented VISUAL ERP job-lookup stub, pytest suite (26 tests), docker-compose deployment. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
37 lines
1.1 KiB
TypeScript
37 lines
1.1 KiB
TypeScript
import { createTheme } from "@mui/material/styles";
|
|
|
|
export const theme = createTheme({
|
|
palette: {
|
|
primary: { main: "#1a5fb4" },
|
|
secondary: { main: "#e66100" },
|
|
background: { default: "#f4f6f9" },
|
|
},
|
|
typography: {
|
|
fontFamily: '"Segoe UI", Roboto, Helvetica, Arial, sans-serif',
|
|
h5: { fontWeight: 700 },
|
|
h6: { fontWeight: 700 },
|
|
},
|
|
components: {
|
|
// Shop-floor tablets: keep touch targets comfortable.
|
|
MuiButton: {
|
|
defaultProps: { size: "medium" },
|
|
styleOverrides: { root: { minHeight: 42, textTransform: "none", fontWeight: 600 } },
|
|
},
|
|
MuiTextField: { defaultProps: { size: "medium" } },
|
|
MuiCard: {
|
|
styleOverrides: {
|
|
root: { borderRadius: 10, boxShadow: "0 1px 4px rgba(20,40,80,0.10)" },
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
export const STAGE_COLORS: Record<string, { bg: string; fg: string }> = {
|
|
new_request: { bg: "#fdf1d9", fg: "#8a5a00" },
|
|
secondary_disposition: { bg: "#f3e5f5", fg: "#6a1b9a" },
|
|
operations: { bg: "#e3f2fd", fg: "#0d47a1" },
|
|
qc_inspection: { bg: "#e8f5e9", fg: "#1b5e20" },
|
|
costing: { bg: "#fff3e0", fg: "#b45309" },
|
|
closed: { bg: "#eceff1", fg: "#455a64" },
|
|
};
|