diff --git a/deploy/unraid/geointel-icon.png b/deploy/unraid/geointel-icon.png index a1ba3450..3284db52 100644 Binary files a/deploy/unraid/geointel-icon.png and b/deploy/unraid/geointel-icon.png differ diff --git a/deploy/unraid/geointel-icon.svg b/deploy/unraid/geointel-icon.svg index 46084f65..4139a1d6 100644 --- a/deploy/unraid/geointel-icon.svg +++ b/deploy/unraid/geointel-icon.svg @@ -1,20 +1,6 @@ - GeoIntel Kempen - Hexagonal map and intelligence mark for the GeoIntel workbench. - - - - - - - - - - - - - - - - + GeoIntel Atlas + Een geografische lens met contourlijnen, kompasrichting en locatiepunt. + + diff --git a/docs/CODEX_EXECUTION_LOG.md b/docs/CODEX_EXECUTION_LOG.md index e33c02ab..02755a12 100644 --- a/docs/CODEX_EXECUTION_LOG.md +++ b/docs/CODEX_EXECUTION_LOG.md @@ -11289,3 +11289,18 @@ Validation: - frontend TypeScript check and production build: passed; - frontend dependency audit: zero vulnerabilities at the high threshold; - React review: named isolated component, derived configuration, no new state/effects, decorative content hidden from assistive technology. + +## 2026-07-26 - GeoIntel and ITWorx brand system + +Implemented: + +- replaced the former letter-based and mountain icons with one original GeoIntel Atlas mark combining a geographic lens, contour lines, compass direction and a measured location point; +- applied the same source mark to the workbench rail, mobile header, landing header, SVG favicon, PNG browser fallback, Apple touch icon and Unraid application icon; +- added the approved ITWorx.tech wordmark as a restrained maker signature in the workbench rail and public landing footer, explicitly crediting Jens without competing with the GeoIntel product identity; +- kept the product icon vector-native for crisp rendering from favicon to server tile and generated matching PNG derivatives from that canonical SVG. + +Validation: + +- visually inspected the canonical 512 px render and the 32 px favicon derivative; +- verified desktop and mobile landing-page renders with the new GeoIntel and ITWorx assets present, meaningful page content and no Vite error overlay; expected API 500 responses remained limited to the absent local backend; +- React review confirmed named, isolated brand components and accessible decorative versus meaningful image semantics. diff --git a/docs/TODO.md b/docs/TODO.md index 0c2a5034..3befe644 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -890,3 +890,11 @@ This file now starts with the current implementation status. Older preparation/b selection-size budgets. - [ ] Provision additional national-scale baseline datasets before exposing more overview themes; do not synthesize regional detail at national scale. + +# Sprint 226 - GeoIntel and ITWorx brand system + +- [x] Replace the legacy GI/mountain artwork with a distinctive atlas and location mark. +- [x] Use one canonical SVG across in-product branding and the browser favicon. +- [x] Generate matching 32 px, Apple touch and Unraid PNG derivatives. +- [x] Add the approved ITWorx.tech identity as a subtle Jens maker signature. +- [ ] Revisit alternative lockups only when an approved GeoIntel brand guide exists. diff --git a/frontend/index.html b/frontend/index.html index 11e268a1..df3e5127 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,6 +4,8 @@ + + GeoIntel diff --git a/frontend/public/geointel-icon-180.png b/frontend/public/geointel-icon-180.png new file mode 100644 index 00000000..3fc0c3a7 Binary files /dev/null and b/frontend/public/geointel-icon-180.png differ diff --git a/frontend/public/geointel-icon-32.png b/frontend/public/geointel-icon-32.png new file mode 100644 index 00000000..15e2f986 Binary files /dev/null and b/frontend/public/geointel-icon-32.png differ diff --git a/frontend/public/geointel-icon.png b/frontend/public/geointel-icon.png index a1ba3450..3284db52 100644 Binary files a/frontend/public/geointel-icon.png and b/frontend/public/geointel-icon.png differ diff --git a/frontend/public/geointel-icon.svg b/frontend/public/geointel-icon.svg index 46084f65..32a026fa 100644 --- a/frontend/public/geointel-icon.svg +++ b/frontend/public/geointel-icon.svg @@ -1,20 +1,27 @@ - GeoIntel Kempen - Hexagonal map and intelligence mark for the GeoIntel workbench. + GeoIntel Atlas + Een geografische lens met contourlijnen, kompasrichting en locatiepunt. - - - - + + + + + + + + + + - - - - - - - - - + + + + + + + + + + diff --git a/frontend/public/itworx-wordmark.png b/frontend/public/itworx-wordmark.png new file mode 100644 index 00000000..d69f7b4e Binary files /dev/null and b/frontend/public/itworx-wordmark.png differ diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 12d18106..d7483259 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -812,7 +812,7 @@ function WorkbenchApp({ username, loggingOut, onLogout }: WorkbenchAppProps): JS
- + GeoIntel
diff --git a/frontend/src/components/auth/LandingPage.test.tsx b/frontend/src/components/auth/LandingPage.test.tsx index 9be26aa9..4de2f9d1 100644 --- a/frontend/src/components/auth/LandingPage.test.tsx +++ b/frontend/src/components/auth/LandingPage.test.tsx @@ -27,6 +27,7 @@ describe('LandingPage', () => { render() expect(screen.getByRole('heading', { name: /Operationele GIS-analyse/i })).toBeTruthy() + expect(screen.getByRole('img', { name: 'ITWorx.tech' })).toBeTruthy() fireEvent.change(screen.getByLabelText('Gebruikersnaam'), { target: { value: 'operator' } }) fireEvent.change(screen.getByLabelText('Wachtwoord'), { target: { value: 'correct' } }) fireEvent.click(screen.getAllByRole('button', { name: 'Inloggen' })[1]) diff --git a/frontend/src/components/auth/LandingPage.tsx b/frontend/src/components/auth/LandingPage.tsx index 34145d36..c1828d76 100644 --- a/frontend/src/components/auth/LandingPage.tsx +++ b/frontend/src/components/auth/LandingPage.tsx @@ -16,6 +16,8 @@ import { login } from '../../services/api/auth' import type { AuthSession } from '../../services/api/auth' import { formatError } from '../../lib/formatError' import '../../styles/landing.css' +import { GeoIntelMark } from '../brand/GeoIntelBrand' +import { ItWorxSignature } from '../brand/ItWorxSignature' interface LandingPageProps { onAuthenticated: (session: AuthSession) => void @@ -86,7 +88,7 @@ export function LandingPage({ onAuthenticated, serviceError = null }: LandingPag Ga naar aanmelden
- + GeoIntel Atlas
) diff --git a/frontend/src/components/brand/GeoIntelBrand.tsx b/frontend/src/components/brand/GeoIntelBrand.tsx new file mode 100644 index 00000000..66a4da0d --- /dev/null +++ b/frontend/src/components/brand/GeoIntelBrand.tsx @@ -0,0 +1,14 @@ +interface GeoIntelMarkProps { + className?: string +} + +export function GeoIntelMark({ className = '' }: GeoIntelMarkProps): JSX.Element { + return ( + + ) +} diff --git a/frontend/src/components/brand/ItWorxSignature.tsx b/frontend/src/components/brand/ItWorxSignature.tsx new file mode 100644 index 00000000..9b97f31f --- /dev/null +++ b/frontend/src/components/brand/ItWorxSignature.tsx @@ -0,0 +1,8 @@ +export function ItWorxSignature(): JSX.Element { + return ( +
+ Ontwikkeld door Jens + ITWorx.tech +
+ ) +} diff --git a/frontend/src/components/shell/WorkbenchNavigation.tsx b/frontend/src/components/shell/WorkbenchNavigation.tsx index 221f2270..e1aca439 100644 --- a/frontend/src/components/shell/WorkbenchNavigation.tsx +++ b/frontend/src/components/shell/WorkbenchNavigation.tsx @@ -10,6 +10,8 @@ import { type LucideIcon, } from 'lucide-react' import type { WorkspaceKey } from '../overview/OverviewWorkspace' +import { GeoIntelMark } from '../brand/GeoIntelBrand' +import { ItWorxSignature } from '../brand/ItWorxSignature' export interface WorkspaceNavigationItem { key: WorkspaceKey @@ -49,7 +51,7 @@ export function WorkbenchNavigation({ return ( ) } diff --git a/frontend/src/styles/atlas-premium-v2.css b/frontend/src/styles/atlas-premium-v2.css index f7e35847..d77643e5 100644 --- a/frontend/src/styles/atlas-premium-v2.css +++ b/frontend/src/styles/atlas-premium-v2.css @@ -74,6 +74,8 @@ body { /* Brand rail */ .workbench-sidebar { + display: flex; + flex-direction: column; border: 0; padding: 1rem 0.85rem 1.25rem; color: rgba(255, 255, 255, 0.76); @@ -100,13 +102,42 @@ body { height: 2.65rem; border: 1px solid rgba(173, 238, 227, 0.44); border-radius: 0.8rem; - color: #dffaf5; - background: rgba(255, 255, 255, 0.09); + object-fit: cover; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.14), 0 10px 24px rgba(0, 0, 0, 0.16); } +.workbench-sidebar > nav { + flex: 1 1 auto; +} + +.itworx-signature { + display: grid; + gap: 0.38rem; +} + +.itworx-signature > span { + color: rgba(223, 250, 245, 0.48); + font-size: 0.58rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.itworx-signature img { + display: block; + width: 7.4rem; + height: auto; +} + +.workbench-sidebar > .itworx-signature { + margin: 1.25rem 0.45rem 0; + border-top: 1px solid rgba(255, 255, 255, 0.09); + padding-top: 1rem; + opacity: 0.88; +} + .sidebar-brand-copy { display: grid; gap: 0.12rem; diff --git a/frontend/src/styles/landing.css b/frontend/src/styles/landing.css index 6bcaa77b..06563a25 100644 --- a/frontend/src/styles/landing.css +++ b/frontend/src/styles/landing.css @@ -71,14 +71,10 @@ body.landing-body { } .landing-brand-mark { - display: grid; width: 2rem; height: 2rem; - place-items: center; - border: 1px solid #8ec7bc; - border-radius: 4px; - background: #e7faf6; - font-size: 0.76rem; + border-radius: 0.48rem; + box-shadow: 0 5px 14px rgba(6, 40, 36, 0.19); } .landing-nav { @@ -321,6 +317,10 @@ body.landing-body { .landing-footer { display: flex; gap: 2rem; align-items: center; justify-content: space-between; padding: 2rem clamp(1.25rem, 4vw, 4.5rem); background: #061815; color: #fff; } .landing-footer strong { font-family: "Manrope", sans-serif; } .landing-footer p { margin: 0.35rem 0 0; color: rgba(255, 255, 255, 0.58); font-size: 0.7rem; } +.landing-footer-ownership { display: grid; gap: 0.65rem; justify-items: end; text-align: right; } +.landing-footer .itworx-signature { display: flex; gap: 0.7rem; align-items: center; } +.landing-footer .itworx-signature > span { color: rgba(255, 255, 255, 0.48); font-size: 0.58rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; } +.landing-footer .itworx-signature img { width: 7.7rem; height: auto; filter: drop-shadow(0 3px 8px rgba(0, 0, 0, 0.25)); } .landing-auth-loading { display: grid; @@ -363,6 +363,7 @@ body.landing-body { .landing-workflow { padding: 3.5rem 1rem; } .landing-workflow-map { min-height: 28rem; } .landing-footer { align-items: flex-start; flex-direction: column; } + .landing-footer-ownership { justify-items: start; text-align: left; } } @media (prefers-reduced-motion: reduce) {