/** * project.theme.ts — HOST-OWNED config for THIS project / organisation (FHC). * * ┌─────────────────────────────────────────────────────────────────────────┐ * │ Lives in app-config/, OUTSIDE the user-management module. The module │ * │ never imports this file — the host passes it in via │ * │ (see ../src/main.tsx). │ * │ At submodule-split time, this whole folder moves to the host repo. │ * └─────────────────────────────────────────────────────────────────────────┘ * * Every field is optional — remove lines you don't need to override. * * Flow: * project.theme.ts → design.config.ts (module engine) → CSS vars + Mantine theme * TenantConfig.ts → overrides --primary at runtime per hostname * * The TenantConfig layer runs AFTER this, so per-hostname primary-color overrides * still work on top of whatever you set here. */ import type { DesignConfig } from "@/config/design.config"; import { fhcMantineTheme } from "./fhc.theme"; export const projectTheme: DesignConfig = { // ───────────────────────────────────────────────────────────────────────── // BRANDING // Replace with your organisation's assets. // ───────────────────────────────────────────────────────────────────────── brand: { appName: "Federal Housing Corporation", // FHC — shown in the browser tab // Drop the FHC logo at this path in /public to show it in the sidebar brand // and as the favicon. Until then the sidebar falls back to a building icon. // logoUrl: "/assets/logo/fhc.png", // faviconUrl: "/favicon.ico", // optional — defaults to logoUrl }, // ───────────────────────────────────────────────────────────────────────── // COLORS // Change `primary` to your brand hex and everything cascades automatically. // Shades primary-50 → primary-950 are computed via CSS color-mix in index.css. // TenantConfig overrides this per-hostname, so localhost vs edrsc.com can // still have different colors. // ───────────────────────────────────────────────────────────────────────── colors: { primary: "#357ABD", // FHC blue (fhcBlue-6) — buttons, links, active states // // "#5D2E1F" brick (FHC chrome) is used by the sidebar/modal skin below // // "#2563eb" blue | "#7c3aed" purple // // "#16a34a" green | "#dc2626" red // // "#f59e0b" amber | "#0284c7" sky // primaryForeground: "#ffffff", // text on primary-colored bg — rarely needs changing // secondary: "#f1f5f9", // TODO: subtle secondary UI color // background: "#ffffff", // TODO: page background // foreground: "#0f172a", // TODO: main text color // border: "#e2e8f0", // TODO: input / card borders // muted: "#f8fafc", // TODO: disabled input / tag backgrounds // mutedForeground: "#94a3b8", // TODO: placeholder / helper text // card: "#ffffff", // TODO: card background (if different from page) // sidebar: "#f8fafc", // TODO: sidebar background // danger: "#dc2626", // TODO: error / destructive color }, // ───────────────────────────────────────────────────────────────────────── // TYPOGRAPHY // Load the font FIRST in index.html (Google Fonts link or @font-face) then // set fontFamily here. The fallback chain is used if the custom font fails. // ───────────────────────────────────────────────────────────────────────── typography: { fontFamily: "Plus Jakarta Sans, Inter, ui-sans-serif, system-ui, sans-serif", // // TODO: "Poppins, Inter, sans-serif" // // TODO: "Cairo, Inter, sans-serif" (Arabic) // // TODO: "Noto Serif Ethiopic, serif" (Amharic) // headingFontFamily: undefined, // TODO: separate heading font if desired // baseFontSize: "16px", // TODO: "14px" for compact dashboards }, // ───────────────────────────────────────────────────────────────────────── // SHAPE // ───────────────────────────────────────────────────────────────────────── shape: { radius: "0.625rem", // TODO: "0" sharp | "0.5rem" subtle | "1rem" very rounded }, // ───────────────────────────────────────────────────────────────────────── // SHADOWS // Leave commented to use Mantine/Tailwind defaults. // ───────────────────────────────────────────────────────────────────────── // shadows: { // card: "0 1px 3px rgba(0,0,0,0.08), 0 4px 16px rgba(0,0,0,0.06)", // dropdown: "0 8px 30px rgba(0,0,0,0.12)", // modal: "0 20px 60px rgba(0,0,0,0.16)", // }, // ───────────────────────────────────────────────────────────────────────── // MANTINE COMPONENT DEFAULTS // These become the defaults for every component. // ───────────────────────────────────────────────────────────────────────── components: { buttonDefaultVariant: "filled", // TODO: "light" | "outline" | "subtle" inputDefaultSize: "sm", // TODO: "xs" | "md" | "lg" inputRadius: "md", // TODO: "xs" | "lg" | "xl" modalRadius: "lg", // TODO: "md" | "xl" tableHighlightOnHover: true, tableStriped: false, // TODO: "odd" | "even" | true }, // ───────────────────────────────────────────────────────────────────────── // USER-MANAGEMENT LAYOUT / NAVIGATION // Pick the navigation chrome and style the side menu — all from here. // "classic" → app-wide SIDE MENU, no top tabs // "legacy" → top TAB bar, no side menu // Each value is also exposed as a --um-* CSS var, so tweaks apply instantly. // ───────────────────────────────────────────────────────────────────────── layout: { userManagementView: "classic", // TODO: "legacy" for the top-tab UI // showTopBar: false, // TODO: overrides VITE_SHOW_TOP_BAR // ── Dimensions ────────────────────────────────────────────────────────── sidebarWidth: "288px", // TODO: expanded side-menu width sidebarCollapsedWidth: "80px", // TODO: icon-only width headerHeight: "64px", // TODO: top bar height // contentMaxWidth: "1440px", // TODO: cap the content column // ── Side-menu skin (defaults follow the FHC brick theme) ─────────────── sidebarBackground: "linear-gradient(180deg, #5D2E1F 0%, #3D1E14 100%)", sidebarColor: "rgba(255,255,255,0.76)", sidebarMutedColor: "rgba(255,255,255,0.42)", sidebarActiveBackground: "rgba(255,255,255,0.15)", sidebarActiveColor: "#FFFFFF", sidebarHoverBackground: "rgba(255,255,255,0.08)", sidebarBorder: "rgba(255,255,255,0.10)", sidebarRail: "linear-gradient(180deg, #FFD700 0%, #4A90E2 100%)", sidebarBrandLabel: "User Management", sidebarBrandSublabel: "Federal Housing", // ── THE MENU (data, shared by the side menu AND the top tabs) ────────── // Edit/add/remove freely. `icon` is a name from the registry in // navConfig.tsx (users, dashboard, content, position, settings, excel, // archive, units, activity, organizations, …). `label` is an i18n key // under "organization.