feat: establish GeoIntel and ITWorx branding
GeoIntel release gates / Compile, test, contracts and builds (push) Canceled after 0s
GeoIntel release gates / Python and npm vulnerability policy (push) Canceled after 0s
GeoIntel release gates / GIS image, SBOM and container scan (push) Canceled after 0s

This commit is contained in:
Jens
2026-07-26 02:51:58 +02:00
parent b65db69bfc
commit d79f751773
18 changed files with 126 additions and 45 deletions
+1 -1
View File
@@ -812,7 +812,7 @@ function WorkbenchApp({ username, loggingOut, onLogout }: WorkbenchAppProps): JS
<div className="workbench-stage">
<header className="workbench-topbar">
<div className="mobile-brand">
<span className="brand-mark" aria-hidden="true">GI</span>
<img className="brand-mark geointel-mark" src="/geointel-icon.svg" alt="" aria-hidden="true" />
<strong>GeoIntel</strong>
</div>
<div className="context-bar" aria-label="Actieve werkcontext">
@@ -27,6 +27,7 @@ describe('LandingPage', () => {
render(<LandingPage onAuthenticated={onAuthenticated} />)
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])
+7 -2
View File
@@ -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
<a className="landing-skip-link" href="#login-panel">Ga naar aanmelden</a>
<header className="landing-header">
<a className="landing-brand" href="#top" aria-label="GeoIntel Atlas startpagina">
<span className="landing-brand-mark" aria-hidden="true">GI</span>
<GeoIntelMark className="landing-brand-mark" />
<span>GeoIntel Atlas</span>
</a>
<button
@@ -222,7 +224,10 @@ export function LandingPage({ onAuthenticated, serviceError = null }: LandingPag
<footer className="landing-footer">
<div><strong>GeoIntel Atlas Workbench</strong><p>Operationele GIS-analyse voor België en de Belgische Noordzee.</p></div>
<p>© {new Date().getFullYear()} GeoIntel · Interne operatoromgeving</p>
<div className="landing-footer-ownership">
<ItWorxSignature />
<p>© {new Date().getFullYear()} GeoIntel · Interne operatoromgeving</p>
</div>
</footer>
</div>
)
@@ -0,0 +1,14 @@
interface GeoIntelMarkProps {
className?: string
}
export function GeoIntelMark({ className = '' }: GeoIntelMarkProps): JSX.Element {
return (
<img
className={`geointel-mark ${className}`.trim()}
src="/geointel-icon.svg"
alt=""
aria-hidden="true"
/>
)
}
@@ -0,0 +1,8 @@
export function ItWorxSignature(): JSX.Element {
return (
<div className="itworx-signature" aria-label="Ontwikkeld door Jens van ITWorx.tech">
<span>Ontwikkeld door Jens</span>
<img src="/itworx-wordmark.png" alt="ITWorx.tech" />
</div>
)
}
@@ -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 (
<aside className="workbench-sidebar" aria-label="Navigatie van de werkruimte">
<div className="sidebar-brand" aria-label="GeoIntel">
<span className="brand-mark" aria-hidden="true">GI</span>
<GeoIntelMark className="brand-mark" />
<span className="sidebar-brand-copy">
<strong>GeoIntel</strong>
<small>Atlas Workbench</small>
@@ -85,6 +87,7 @@ export function WorkbenchNavigation({
</div>
))}
</nav>
<ItWorxSignature />
</aside>
)
}
+33 -2
View File
@@ -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;
+7 -6
View File
@@ -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) {