diff --git a/src/App.tsx b/src/App.tsx index 255acc0..8f7b5b7 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,5 @@ import { Routes, Route, NavLink } from 'react-router-dom' +import { BRAND_COLOR } from './config/constants' import Dashboard from './pages/Dashboard' import Configuration from './pages/Configuration' import Consultants from './pages/Consultants' @@ -13,7 +14,7 @@ import Evaluation from './pages/Evaluation' export default function App() { return (
-
+
Assignment Monitor
@@ -42,8 +43,9 @@ export default function App() { to={to} end className={({ isActive }) => - `text-xs px-3 py-1 rounded ${isActive ? 'text-[#0070AD] font-semibold' : 'text-gray-500'}` + `text-xs px-3 py-1 rounded ${isActive ? 'font-semibold' : 'text-gray-500'}` } + style={({ isActive }) => isActive ? { color: BRAND_COLOR } : undefined} > {label} diff --git a/src/config/constants.ts b/src/config/constants.ts new file mode 100644 index 0000000..59d44f5 --- /dev/null +++ b/src/config/constants.ts @@ -0,0 +1,46 @@ +import type { FeedbackRating } from '../db' + +export const BRAND_COLOR = '#0070AD' + +/** + * Kanonische Reihenfolge der Rating-Skala (nicht ändern — DB-Werte sind stabil). + * `color` = Badge/Display-State (inaktiv) + * `active` = ausgewählter Button-State + */ +export const RATING_OPTIONS: ReadonlyArray<{ + value: FeedbackRating + short: string + label: string + color: string + active: string +}> = [ + { value: 'na', short: 'N/A', label: 'N/A (0)', color: 'bg-gray-100 text-gray-500 border-gray-300', active: 'bg-gray-400 text-white border-gray-400' }, + { value: 'not_client_ready', short: 'Not', label: 'Not (1)', color: 'bg-red-100 text-red-700 border-red-300', active: 'bg-red-500 text-white border-red-500' }, + { value: 'partially_client_ready', short: 'Partially', label: 'Partially (2)', color: 'bg-orange-100 text-orange-700 border-orange-300', active: 'bg-orange-500 text-white border-orange-500' }, + { value: 'nearly_client_ready', short: 'Nearly', label: 'Nearly (3)', color: 'bg-green-100 text-green-600 border-green-300', active: 'bg-green-400 text-white border-green-400' }, + { value: 'client_ready', short: 'Fully', label: 'Fully (4)', color: 'bg-green-100 text-green-800 border-green-400', active: 'bg-green-700 text-white border-green-700' }, +] + +/** Farb-Schemata für Teilnehmer-Badges (Index = Reihenfolge im Assignment). */ +export const INST_COLORS = [ + { bg: 'bg-blue-50', border: 'border-blue-300', tag: 'bg-blue-500', text: 'text-blue-700' }, + { bg: 'bg-purple-50', border: 'border-purple-300', tag: 'bg-purple-500', text: 'text-purple-700' }, + { bg: 'bg-emerald-50', border: 'border-emerald-300', tag: 'bg-emerald-500', text: 'text-emerald-700' }, + { bg: 'bg-orange-50', border: 'border-orange-300', tag: 'bg-orange-500', text: 'text-orange-700' }, +] as const + +export const AI_CONFIG = { + localStorageKeyApiKey: 'ai_api_key', + localStorageKeyModel: 'ai_model', + defaultModel: 'openai/gpt-4o-mini', + openRouterBaseUrl: 'https://openrouter.ai/api/v1', +} as const + +/** Numerische Gewichte für Rating-Aggregation. N/A wird aus Berechnungen ausgeschlossen. */ +export const RATING_NUM_MAP: Record = { + na: 0, + not_client_ready: 1, + partially_client_ready: 2, + nearly_client_ready: 3, + client_ready: 4, +} diff --git a/src/index.css b/src/index.css index f1d8c73..b8d449d 100644 --- a/src/index.css +++ b/src/index.css @@ -1 +1,6 @@ @import "tailwindcss"; + +@theme { + --color-brand: #0070AD; + --color-brand-dark: #005a8e; +} diff --git a/src/pages/AssignmentCreate.tsx b/src/pages/AssignmentCreate.tsx index 253b80f..9ac807c 100644 --- a/src/pages/AssignmentCreate.tsx +++ b/src/pages/AssignmentCreate.tsx @@ -88,13 +88,13 @@ export default function AssignmentCreate() { {/* Basisdaten */}
- setForm(p => ({ ...p, title: e.target.value }))} /> - setForm(p => ({ ...p, client: e.target.value }))} /> - setForm(p => ({ ...p, leadName: e.target.value }))} /> setNewFirst(e.target.value)} onKeyDown={e => e.key === 'Enter' && addInstituteeInline()} /> - setNewLast(e.target.value)} onKeyDown={e => e.key === 'Enter' && addInstituteeInline()} /> @@ -155,7 +155,7 @@ export default function AssignmentCreate() {
diff --git a/src/pages/AssignmentDetail.tsx b/src/pages/AssignmentDetail.tsx index 66a103e..2c606dd 100644 --- a/src/pages/AssignmentDetail.tsx +++ b/src/pages/AssignmentDetail.tsx @@ -150,17 +150,17 @@ export default function AssignmentDetail() { return (
- +
{assignment.assignmentNumber && ( -
{assignment.assignmentNumber}
+
{assignment.assignmentNumber}
)}

{assignment.title}

@@ -175,7 +175,7 @@ export default function AssignmentDetail() {
Ad-hoc Meeting starten
@@ -187,7 +187,7 @@ export default function AssignmentDetail() { const count = phaseRows.find(r => r.template.id === t.id)?.instances.length ?? 0 startMeeting(t.id!, count) }} - className="py-2.5 px-3 text-left rounded-lg border border-gray-200 hover:border-[#0070AD] hover:bg-blue-50 transition"> + className="py-2.5 px-3 text-left rounded-lg border border-gray-200 hover:border-brand hover:bg-blue-50 transition">
{t.label}
{t.withWhom === 'client' ? 'Kundentermin' : 'Lead-intern'} @@ -237,7 +237,7 @@ export default function AssignmentDetail() { + className="text-sm text-brand mb-2 block">← Zurück

Assignment bearbeiten

@@ -105,7 +105,7 @@ export default function AssignmentEdit() {
setAssignmentNumber(e.target.value)} @@ -114,7 +114,7 @@ export default function AssignmentEdit() {
setTitle(e.target.value)} /> @@ -122,7 +122,7 @@ export default function AssignmentEdit() {
setClient(e.target.value)} /> @@ -130,7 +130,7 @@ export default function AssignmentEdit() {