Skip to content

Brand Lockup

The web expression of the division lockup. The Bildmarke and the wordmark stay artwork; only the division name is real text — which keeps it selectable, translatable and searchable without ever re-typesetting the protected wordmark.

Preview

Specification

PropertyValueOrigin
Control knob--bg-lockup-sizeBildmarke height, drives everything else
Default size40pxalso the minimum size
Gap mark → text0.1616 × size0.3583 X
Wordmark height0.3046 × sizeink height 18.191 / 59.72
Division font size0.29 × sizeyields a 0.45 X cap height
Line gap0.0785 × sizefrom the wordmark ink box's bottom edge
Clear space0.451 × size1 × X, enforced as padding

HTML

html
<a class="bg-lockup" href="/" aria-label="BAUER GROUP Compliance — home">
  <img class="mark" src="/brand/bauer-group-icon.svg"
       alt="" width="60" height="60" decoding="async" fetchpriority="high">
  <span class="text">
    <img class="wordmark wordmark-light" src="/brand/bauer-group-wordmark.svg"
         alt="" width="1003" height="91" decoding="async" fetchpriority="high">
    <img class="wordmark wordmark-dark" src="/brand/bauer-group-wordmark-white.svg"
         alt="" width="1003" height="91" decoding="async">
    <span class="division">Compliance</span>
  </span>
</a>

The accessible name sits on the link as aria-label; every image carries alt="". That is the right call here because the light and dark wordmarks are swapped — an alt on both would be announced twice or not at all depending on the theme. The visible text is contained in the label (WCAG 2.5.3).

CSS

css
.bg-lockup {
  --bg-lockup-size: 40px;              /* the only knob: height of the Bildmarke */
  display: inline-flex;
  align-items: center;
  gap: calc(var(--bg-lockup-size) * 0.1616);
  padding: calc(var(--bg-lockup-size) * 0.451);   /* clear space = 1 × X */
  text-decoration: none;
  color: inherit;
}

.bg-lockup .mark {
  inline-size: var(--bg-lockup-size);
  block-size: var(--bg-lockup-size);
  min-block-size: 40px;                /* minimum size, hard */
  flex: none;
}

.bg-lockup .text {
  display: flex;
  flex-direction: column;
  gap: calc(var(--bg-lockup-size) * 0.0785);
}

.bg-lockup .wordmark {
  block-size: calc(var(--bg-lockup-size) * 0.3046);
  inline-size: auto;
}

.bg-lockup .division {
  font-family: var(--bg-font-body);
  font-size: calc(var(--bg-lockup-size) * 0.29);
  font-size-adjust: cap-height 0.7;    /* pins the cap height across platforms */
  font-synthesis: none;
  font-weight: 600;
  letter-spacing: 0.08em;
  line-height: 1;
  text-transform: uppercase;
  color: var(--bg-orange-600);
}

@supports (text-box: trim-both cap alphabetic) {
  .bg-lockup .division { text-box: trim-both cap alphabetic; }
}

.bg-lockup .wordmark-dark { display: none; }
.dark .bg-lockup .wordmark-light { display: none; }
.dark .bg-lockup .wordmark-dark { display: block; }
/* The division line keeps the same ink in dark mode — like the Bildmarke. */

.bg-lockup:focus-visible {
  outline: 3px solid var(--bg-orange-500);
  outline-offset: 2px;
  border-radius: 8px;
}

@media (forced-colors: active) {
  .bg-lockup:focus-visible { outline-color: CanvasText; }
}

@media print {
  .bg-lockup { padding: 0; }
  .bg-lockup .mark { block-size: 12mm; inline-size: 12mm; }
  .bg-lockup .division { color: #000; print-color-adjust: exact; }
}

Why font-size-adjust is not optional

System fonts differ substantially in cap height per font size. Without correction the division line drifts by up to 13 % depending on the operating system:

FontCap height per em
Segoe UI (Windows)0.7002
Arial0.7163
Calibri0.6318

font-size-adjust: cap-height 0.7 scales every font so its cap height is exactly 0.7 × font size, making the line identical everywhere. Supported from Chrome 127, Firefox 92 and Safari 17.

text-box: trim-both cap alphabetic additionally trims the line box to the cap top and baseline, driving the residual offset to zero. Available from Chrome 133 and Safari 18.2; without support the deviation stays below one pixel.

Astro component

astro
---
interface Props {
  division?: string
  href?: string | null
  size?: string
  label?: string
  base?: string
}
const {
  division,
  href = '/',
  size,
  label = division ? `BAUER GROUP ${division}` : 'BAUER GROUP',
  base = '/brand',
} = Astro.props

const Tag = href ? 'a' : 'span'
const attrs = href ? { href } : { role: 'img' }
const style = size ? `--bg-lockup-size: ${size}` : undefined
---

<Tag class="bg-lockup" aria-label={label} style={style} {...attrs}>
  <img class="mark" src={`${base}/bauer-group-icon.svg`}
       alt="" width="60" height="60" decoding="async" fetchpriority="high" />
  <span class="text">
    <img class="wordmark wordmark-light" src={`${base}/bauer-group-wordmark.svg`}
         alt="" width="1003" height="91" decoding="async" fetchpriority="high" />
    <img class="wordmark wordmark-dark" src={`${base}/bauer-group-wordmark-white.svg`}
         alt="" width="1003" height="91" decoding="async" />
    {division && <span class="division">{division}</span>}
  </span>
</Tag>

Without division the component renders the plain wordmark lockup — so a page can adopt it before its division is decided. With href={null} it emits a <span role="img"> instead of a link, for footers and PDF exports.

No default slot

The component deliberately has no default slot. Foreign content inside would land in the clear space. Additional elements belong beside the lockup, not within it.

States

StateBehaviour
DefaultWordmark dark, division line Orange 600
Dark modeWordmark white, division line Orange 600 — unchanged
HoverNo change — the logo is not a button
Focus3 px ring in Orange 500, 2 px offset
Forced colorsRing in CanvasText
PrintClear space dropped, Bildmarke 12 mm, division line black
Below 40 pxmin-block-size visibly breaks the layout

The minimum size breaks on purpose

min-block-size: 40px overrides a --bg-lockup-size that is too small. The layout then visibly shifts — deliberately: a loud failure in development beats an undersized mark in production.

Accessibility

aria-label on the link, alt="" on every image. The division line carries Orange 600 in both tones: 5.21–6.69:1 on dark, which is WCAG 2.1 AA, and 2.69–3.14:1 on light, where the logotype exception under WCAG 2.1 SC 1.4.3 applies. As an interface text colour Orange 600 remains excluded, see Contrast Checks.

Documentation licensed under CC BY-NC 4.0 · Code licensed under MIT