diff --git a/.claude/settings.local.json b/.claude/settings.local.json
index 636f2c9..494e663 100644
--- a/.claude/settings.local.json
+++ b/.claude/settings.local.json
@@ -12,7 +12,8 @@
"Bash(Format-Table FullName)",
"Bash(dir /b /s)",
"Bash(findstr \"^app\")",
- "PowerShell(cd \"d:\\\\Development\\\\PHP\\\\Campaign-Tracker\"; Get-ChildItem -Recurse -Directory | Select-Object -ExpandProperty FullName | Where-Object { $_ -notmatch '\\\\.git|\\\\.claude|node_modules' } | Sort-Object | Select-Object -First 30)"
+ "PowerShell(cd \"d:\\\\Development\\\\PHP\\\\Campaign-Tracker\"; Get-ChildItem -Recurse -Directory | Select-Object -ExpandProperty FullName | Where-Object { $_ -notmatch '\\\\.git|\\\\.claude|node_modules' } | Sort-Object | Select-Object -First 30)",
+ "Bash(git -C \"d:\\\\Development\\\\PHP\\\\Campaign-Tracker\" remote get-url origin)"
]
}
}
diff --git a/.env.example b/.env.example
index 7d2bd1c..1f72a6f 100644
--- a/.env.example
+++ b/.env.example
@@ -5,15 +5,15 @@ DB_HOST=sqlserver
DB_PORT=1433
DB_DATABASE=Campaign_Tracker
DB_USERNAME=sa
-DB_PASSWORD=Dev_Password123!
+DB_PASSWORD=
# ── Keycloak ───────────────────────────────────────────────────────────────────
# KEYCLOAK_BASE_URL: Base URL of your Keycloak server.
# Keycloak 17+ (no /auth prefix): http://localhost:8080
# Keycloak < 17 (has /auth prefix): http://localhost:8080/auth
-KEYCLOAK_BASE_URL=http://kci-app01.ntp.kentcommunications.com:8180/
-KEYCLOAK_REALM=KCI
-KEYCLOAK_CLIENT_ID=canopy-web
-KEYCLOAK_CLIENT_SECRET=LHWXp5UUuES00Dz2iCjTJJgX9su6co0y
+KEYCLOAK_BASE_URL=
+KEYCLOAK_REALM=
+KEYCLOAK_CLIENT_ID=
+KEYCLOAK_CLIENT_SECRET=
KEYCLOAK_REDIRECT_URI=http://localhost:8801/auth/callback
KEYCLOAK_LOGOUT_REDIRECT_URI=http://localhost:8801/login
diff --git a/AGENTS.md b/AGENTS.md
index 6a2d1a2..3f6550b 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -997,5 +997,318 @@ Visual rhythm:
- Dense-data readability:
- Preserve minimum font sizes and row heights that remain readable during long operational sessions
-# UI desgin
-- Refer to template info in the files docs\ux-color-themes.html and docs\ux-design-directions.html
\ No newline at end of file
+# UI Design
+- Refer to template info in the files docs\ux-color-themes.html and docs\ux-design-directions.html
+
+---
+
+## UI/UX Component Rules
+
+These rules define the established UI patterns for this project. Follow them exactly when building new pages, views, or components. Do not invent new patterns — extend the existing ones.
+
+---
+
+### Navigation
+
+**Link structure**
+Every nav link must be an `` with:
+- An inline SVG icon (14×14, `fill="none"`, `stroke="currentColor"`, `stroke-width="1.75"`, Heroicons-style path).
+- The label text immediately after the icon.
+- `aria-hidden="true"` on the SVG.
+
+```html
+
+
+ Campaigns
+
+```
+
+**Group separators**
+Nav links are divided into logical groups separated by ``:
+- Group 1: Home
+- Group 2: Campaigns, Campaign Types
+- Group 3: Jobs, Job Types
+- Then a separator before the logged-in user name and logout button.
+
+Add a separator between groups and before the auth area. Never put a separator at the very start or end of the nav.
+
+**Active state**
+Add `is-active` class to the current page's link. Use exact match for `/`, prefix match (`str_starts_with`) for all others.
+
+**Logout button**
+The logout button must use `class="nav-logout-btn"` — never `button button-secondary`. It is a ghost outlined button styled for the dark header background. Do not use the standard button classes here.
+
+**Contrast**
+Nav link text uses `rgba(255, 255, 255, 0.88)`. Never go below `0.85` — the minimum for WCAG AA on the `#1F4E79` header.
+
+**Focus rings**
+All nav links and the logout button have `outline: 2px solid rgba(255, 255, 255, 0.6)` on `:focus-visible`. Do not remove this.
+
+---
+
+### Page Layout
+
+**Every page content area** uses a `.content-stack` as its root element. This is a CSS grid with `gap: 24px` that stacks the page toolbar, panels, and other sections vertically.
+
+```html
+
+
...
+ ...
+
+```
+
+**Page toolbar** (`.page-toolbar`) always contains:
+- A `.section-heading` div with an `
` and optional `
` description on the left.
+- A primary action button (or back link) on the right.
+
+```html
+
+```
+
+**Page h1 size** is 32px / 40px line-height (set in `.section-heading h1`). Do not override this inline.
+
+---
+
+### Section Panels
+
+Every content block on a page must be wrapped in ``. Key rules:
+
+- The left edge always has `border-left: 3px solid var(--primary)` — this is set globally in CSS and must not be removed or overridden.
+- Every panel that has a header must use `.panel-header`, which automatically adds a `border-bottom` separator below it.
+- `.panel-header` contains a left `
` with `
` + optional `
`, and a right side for action buttons.
+- Panel `
` is 18px. Do not make it larger than the page `
`.
+
+```html
+
+
+
+
Section Title
+
Brief description of this section's content.
+
+
+
+
+
+
+```
+
+---
+
+### Stat Cards (Dashboard Metrics)
+
+Use `.stat-card` for any numeric summary. Rules:
+
+- When a stat card navigates somewhere, use `` — not a `