Template Blocks
Icons
We reduce to the max.
A free opensource gallery from Phosphor Icons, adapted to the Energyology System.
All the Icons are in the Download Area
Buttons
Primary and Secondary
Container 900px. Label 18px, padding 16px on 40px, minimum width 200px. Buttons sit left on the body text axis.
Primary and Secondary
Container 768px. Size and spacing identical to desktop.
Primary and Secondary
Container fluid. Buttons go full width, label drops to 16px, padding to 14px on 24px.
Rules
- Primary Outline in the signal colour. One per screen or per message. On hover it fills with Kline Blue in both modes and the label turns off white.
- Secondary Outline in the text colour. It fills with the text colour on hover and the label takes the background colour.
- Shape No corner radius anywhere. Both buttons keep an identical box height.
- Hover Guarded behind a pointer query, so touch devices never get a stuck hover state.
- Focus Visible outline on keyboard focus only, 2px with 3px offset. Never removed.
- Ripple Web only, on pointer and on keyboard activation. It has no meaning in mail.
- Label Names the action. It never wraps, and never carries a full stop.
- Scope All styles are namespaced under the container id. Nothing leaks into the host page.
- Source of truth Custom properties on the container carry both modes. Never fork this file into two colour variants.
Colour Tokens
| Token | Light | Dark |
|---|---|---|
| Background | #FAFAFA | #141414 |
| Text | #141414 | #FAFAFA |
| Signal, primary outline | #002FA7 | #6B93FF |
| Signal fill on hover | #002FA7 | #002FA7 |
| Label on fill | #FAFAFA | #FAFAFA |
| Ripple, primary | #141414 | #FAFAFA |
| Ripple, secondary | #FAFAFA | #141414 |
Geometry
| Token | Desktop and Tablet | Mobile |
|---|---|---|
| Label size | 18px | 16px |
| Label weight, web | 400 | 400 |
| Label weight, mail | 700 | 700 |
| Padding | 16px on 40px | 14px on 24px |
| Minimum width | 200px | full width |
| Border | 1px | 1px |
| Corner radius | 0 | 0 |
| Gap between buttons | 32px | 32px |
Production CSS, web only
.rib-btn {
position: relative;
overflow: hidden;
background: transparent;
padding: 16px 40px;
min-width: 200px;
font-family: 'Geist', Helvetica, Arial, sans-serif;
font-size: 18px;
line-height: 1.6;
letter-spacing: 0.014em;
font-weight: 400;
border-radius: 0;
cursor: pointer;
display: inline-flex;
align-items: center;
justify-content: center;
transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.rib-btn .rib-label { position: relative; z-index: 2; pointer-events: none; }
.rib-btn .rib-ripple {
position: absolute;
border-radius: 50%;
transform: scale(0);
animation: ribRipple 0.5s cubic-bezier(0.4, 0, 0.2, 1) forwards;
pointer-events: none;
z-index: 1;
opacity: 1;
transition: opacity 0.3s ease;
}
@keyframes ribRipple { to { transform: scale(3.5); } }
.rib-btn-primary { border: 1px solid #002FA7; color: #002FA7; }
.rib-btn-primary .rib-ripple { background-color: #141414; }
.rib-btn-primary:focus-visible { outline: 2px solid #002FA7; outline-offset: 3px; }
@media (hover: hover) and (pointer: fine) {
.rib-btn-primary:hover { background: #002FA7; border-color: #002FA7; color: #FAFAFA; }
}
.rib-btn-primary.is-pressed .rib-label { color: #FAFAFA; }
.rib-btn-secondary { border: 1px solid #141414; color: #141414; }
.rib-btn-secondary .rib-ripple { background-color: #FAFAFA; }
.rib-btn-secondary:focus-visible { outline: 2px solid #141414; outline-offset: 3px; }
@media (hover: hover) and (pointer: fine) {
.rib-btn-secondary:hover { background: #141414; border-color: #141414; color: #FAFAFA; }
}
.rib-btn-secondary.is-pressed .rib-label { color: #141414; }
@media (max-width: 767px) {
.rib-btn { width: 100%; font-size: 16px; padding: 14px 24px; }
}
.rib-btn {
position: relative;
overflow: hidden;
background: transparent;
padding: 16px 40px;
min-width: 200px;
font-family: 'Geist', Helvetica, Arial, sans-serif;
font-size: 18px;
line-height: 1.6;
letter-spacing: 0.014em;
font-weight: 400;
border-radius: 0;
cursor: pointer;
display: inline-flex;
align-items: center;
justify-content: center;
transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.rib-btn .rib-label { position: relative; z-index: 2; pointer-events: none; }
.rib-btn .rib-ripple {
position: absolute;
border-radius: 50%;
transform: scale(0);
animation: ribRipple 0.5s cubic-bezier(0.4, 0, 0.2, 1) forwards;
pointer-events: none;
z-index: 1;
opacity: 1;
transition: opacity 0.3s ease;
}
@keyframes ribRipple { to { transform: scale(3.5); } }
.rib-btn-primary { border: 1px solid #6B93FF; color: #6B93FF; }
.rib-btn-primary .rib-ripple { background-color: #FAFAFA; }
.rib-btn-primary:focus-visible { outline: 2px solid #6B93FF; outline-offset: 3px; }
@media (hover: hover) and (pointer: fine) {
.rib-btn-primary:hover { background: #002FA7; border-color: #002FA7; color: #FAFAFA; }
}
.rib-btn-primary.is-pressed .rib-label { color: #141414; }
.rib-btn-secondary { border: 1px solid #FAFAFA; color: #FAFAFA; }
.rib-btn-secondary .rib-ripple { background-color: #141414; }
.rib-btn-secondary:focus-visible { outline: 2px solid #FAFAFA; outline-offset: 3px; }
@media (hover: hover) and (pointer: fine) {
.rib-btn-secondary:hover { background: #FAFAFA; border-color: #FAFAFA; color: #141414; }
}
.rib-btn-secondary.is-pressed .rib-label { color: #FAFAFA; }
@media (max-width: 767px) {
.rib-btn { width: 100%; font-size: 16px; padding: 14px 24px; }
}
Production HTML, mail
Mail carries no button element, no hover, no focus ring and no ripple. The mail button is a table with a bordered cell and a block level link. The label runs bold, because Arial has no reliable medium weight.
<table role="presentation" cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="center" style="border:1px solid #002FA7; background-color:#FAFAFA;">
<a href="{{action_url}}" style="display:inline-block; min-width:200px; padding:16px 40px; font-family:Arial,Helvetica,sans-serif; font-size:18px; line-height:24px; font-weight:bold; color:#002FA7; text-decoration:none;">Primary Action</a>
</td>
</tr>
</table>
<table role="presentation" cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="center" style="border:1px solid #141414; background-color:#FAFAFA;">
<a href="{{secondary_url}}" style="display:inline-block; min-width:200px; padding:16px 40px; font-family:Arial,Helvetica,sans-serif; font-size:18px; line-height:24px; font-weight:bold; color:#141414; text-decoration:none;">Secondary Action</a>
</td>
</tr>
</table>
<table role="presentation" cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="center" style="border:1px solid #6B93FF; background-color:#141414;">
<a href="{{action_url}}" style="display:inline-block; min-width:200px; padding:16px 40px; font-family:Arial,Helvetica,sans-serif; font-size:18px; line-height:24px; font-weight:bold; color:#6B93FF; text-decoration:none;">Primary Action</a>
</td>
</tr>
</table>
<table role="presentation" cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="center" style="border:1px solid #FAFAFA; background-color:#141414;">
<a href="{{secondary_url}}" style="display:inline-block; min-width:200px; padding:16px 40px; font-family:Arial,Helvetica,sans-serif; font-size:18px; line-height:24px; font-weight:bold; color:#FAFAFA; text-decoration:none;">Secondary Action</a>
</td>
</tr>
</table>
CTA & Button
Variant 1, stacked
Text and action centred, action below the text. Use when the card stands alone.
Passt dir dieser Termin?
Du hast 48 Stunden Zeit, deinen Termin zu bestätigen.
Variant 2, two columns
Text left, action right on the same line. Use inside a longer message.
Passt dir dieser Termin?
Du hast 48 Stunden Zeit, deinen Termin zu bestätigen.
Variant 1, stacked
Identical to desktop at 768px.
Passt dir dieser Termin?
Du hast 48 Stunden Zeit, deinen Termin zu bestätigen.
Variant 2, two columns
Still two columns at 768px. Below that the layout collapses.
Passt dir dieser Termin?
Du hast 48 Stunden Zeit, deinen Termin zu bestätigen.
Single variant
Both variants collapse into this. Text left aligned, action full width, padding 24px.
Passt dir dieser Termin?
Du hast 48 Stunden Zeit, deinen Termin zu bestätigen.
Rules
- Purpose One card carries one action. A second action turns the card into a decision, and a decision belongs in the appointment block, not here.
- Border 1px in the signal colour. This is the only component where the signal colour outlines a whole surface.
- Glow Web only. Mail clients drop box shadow, so the mail card carries the border alone.
- Layout Stacked when the card stands alone, two columns when it sits inside a longer message. Below 768px both collapse to stacked and left aligned.
- Button Outline in the signal colour, fills with Kline Blue on hover in both modes. Identical to the primary button of the button component.
- Sub line States the deadline in plain numbers. It is the only place in the message where the deadline appears twice, and both places must agree.
- Scope All styles are namespaced under the container id. Nothing leaks into the host page.
- Source of truth Custom properties on the container carry both modes. Never fork this file into two colour variants.
Colour Tokens
| Token | Light | Dark |
|---|---|---|
| Background | #FAFAFA | #141414 |
| Headline | #141414 | #FAFAFA |
| Sub line | #5A5A5A | #9CA3AF |
| Card border, button outline | #002FA7 | #6B93FF |
| Button fill on hover | #002FA7 | #002FA7 |
| Label on fill | #FAFAFA | #FAFAFA |
| Glow opacity | 0.18 and 0.10 | 0.35 and 0.20 |
Geometry
| Token | Desktop | Tablet | Mobile |
|---|---|---|---|
| Stage width | 900px | 768px | fluid |
| Card padding | 40px | 40px | 24px |
| Headline | 24px on 30px | 24px on 30px | 24px on 30px |
| Sub line | 16px on 26px | 16px on 26px | 16px on 26px |
| Text to button | 32px | 32px | 32px |
| Column gap | 40px | 40px | collapsed |
| Button width | 200px minimum | 200px minimum | full width |
| Corner radius | 0 | 0 | 0 |
Production CSS, web only
.rib-card {
background-color: #FAFAFA;
border: 1px solid #002FA7;
border-radius: 0;
padding: 40px;
box-shadow: 0 4px 20px rgba(0, 47, 167, 0.18), 0 0 40px rgba(0, 47, 167, 0.10);
}
.rib-card-h { margin: 0 0 16px 0; font-size: 24px; font-weight: 600; color: #141414; }
.rib-card-p { margin: 0; font-size: 16px; line-height: 1.6; color: #5A5A5A; }
.rib-cta {
background: transparent;
border: 1px solid #002FA7;
color: #002FA7;
border-radius: 0;
padding: 16px 40px;
min-width: 200px;
font-size: 18px;
line-height: 1.6;
letter-spacing: 0.014em;
font-weight: 400;
cursor: pointer;
transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
@media (hover: hover) and (pointer: fine) {
.rib-cta:hover { background: #002FA7; border-color: #002FA7; color: #FAFAFA; }
}
.rib-cta:focus-visible { outline: 2px solid #002FA7; outline-offset: 3px; }
.rib-card {
background-color: #141414;
border: 1px solid #6B93FF;
border-radius: 0;
padding: 40px;
box-shadow: 0 4px 20px rgba(107, 147, 255, 0.35), 0 0 40px rgba(107, 147, 255, 0.20);
}
.rib-card-h { margin: 0 0 16px 0; font-size: 24px; font-weight: 600; color: #FAFAFA; }
.rib-card-p { margin: 0; font-size: 16px; line-height: 1.6; color: #9CA3AF; }
.rib-cta {
background: transparent;
border: 1px solid #6B93FF;
color: #6B93FF;
border-radius: 0;
padding: 16px 40px;
min-width: 200px;
font-size: 18px;
line-height: 1.6;
letter-spacing: 0.014em;
font-weight: 400;
cursor: pointer;
transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
@media (hover: hover) and (pointer: fine) {
.rib-cta:hover { background: #002FA7; border-color: #002FA7; color: #FAFAFA; }
}
.rib-cta:focus-visible { outline: 2px solid #6B93FF; outline-offset: 3px; }
Production HTML, mail
Mail carries no box shadow and no hover. The card is a bordered table, the button a bordered cell with a block level link. The glow is dropped, the border stays.
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="background-color:#FAFAFA;">
<tr>
<td align="center" style="padding:0 24px;">
<table role="presentation" width="552" cellpadding="0" cellspacing="0" border="0" class="rib-container" style="width:552px; max-width:552px; border:1px solid #002FA7;">
<tr>
<td align="center" class="rib-cell" style="padding:40px;">
<p style="margin:0 0 16px 0; font-family:Arial,Helvetica,sans-serif; font-size:24px; line-height:30px; font-weight:bold; color:#141414;">Passt dir dieser Termin?</p>
<p style="margin:0 0 32px 0; font-family:Arial,Helvetica,sans-serif; font-size:16px; line-height:26px; color:#5A5A5A;">Du hast 48 Stunden Zeit, deinen Termin zu bestätigen.</p>
<table role="presentation" cellpadding="0" cellspacing="0" border="0" align="center">
<tr>
<td align="center" style="border:1px solid #002FA7;">
<a href="{{confirm_url}}" style="display:inline-block; min-width:200px; padding:16px 40px; font-family:Arial,Helvetica,sans-serif; font-size:18px; line-height:24px; font-weight:bold; color:#002FA7; text-decoration:none;">Termin bestätigen</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="background-color:#FAFAFA;">
<tr>
<td align="center" style="padding:0 24px;">
<table role="presentation" width="552" cellpadding="0" cellspacing="0" border="0" class="rib-container" style="width:552px; max-width:552px; border:1px solid #6B93FF;">
<tr>
<td align="center" class="rib-cell" style="padding:40px;">
<p style="margin:0 0 16px 0; font-family:Arial,Helvetica,sans-serif; font-size:24px; line-height:30px; font-weight:bold; color:#FAFAFA;">Passt dir dieser Termin?</p>
<p style="margin:0 0 32px 0; font-family:Arial,Helvetica,sans-serif; font-size:16px; line-height:26px; color:#9CA3AF;">Du hast 48 Stunden Zeit, deinen Termin zu bestätigen.</p>
<table role="presentation" cellpadding="0" cellspacing="0" border="0" align="center">
<tr>
<td align="center" style="border:1px solid #6B93FF;">
<a href="{{confirm_url}}" style="display:inline-block; min-width:200px; padding:16px 40px; font-family:Arial,Helvetica,sans-serif; font-size:18px; line-height:24px; font-weight:bold; color:#6B93FF; text-decoration:none;">Termin bestätigen</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
CTA & Link
Variant 1, inside running text
Container 900px. Text 16px on 26px. The link sits in the sentence and keeps the reading flow.
Du hast 48 Stunden Zeit, deinen Termin zu bestätigen. Bitte lies dir unsere Stornierungsbedingungen sorgfältig durch, bevor du fortfährst. Bei Fragen steht dir unser Support Team jederzeit zur Verfügung.
Variant 2, at the end of the text
The link closes the paragraph and carries no full stop after it.
Wir haben unsere Plattform aktualisiert, um dir ein noch besseres Erlebnis zu bieten. Entdecke alle neuen Features im aktuellen Changelog. Jetzt mehr erfahren
Variant 1, inside running text
Container 768px. Type and spacing identical to desktop.
Du hast 48 Stunden Zeit, deinen Termin zu bestätigen. Bitte lies dir unsere Stornierungsbedingungen sorgfältig durch, bevor du fortfährst. Bei Fragen steht dir unser Support Team jederzeit zur Verfügung.
Variant 2, at the end of the text
The link closes the paragraph and carries no full stop after it.
Wir haben unsere Plattform aktualisiert, um dir ein noch besseres Erlebnis zu bieten. Entdecke alle neuen Features im aktuellen Changelog. Jetzt mehr erfahren
Variant 1, inside running text
Container fluid, padding 24px. Sentences are shortened so the link does not land alone on the last line.
Du hast 48 Stunden Zeit, deinen Termin zu bestätigen. Bitte lies dir unsere Stornierungsbedingungen sorgfältig durch, bevor du fortfährst.
Variant 2, at the end of the text
The link closes the paragraph and carries no full stop after it.
Entdecke alle neuen Features im aktuellen Changelog. Jetzt mehr erfahren
Usage Guidelines
- Inline link or button An inline link carries a secondary action, a reference or a legal document. The primary action of a message is always a button. A message has one primary action, never two.
- Placement Either inside the sentence or appended to the end of a thought. Never as a standalone line, that is a button.
- Colour Signal colour of the active mode. In dark mode the signal is the brightened blue, because Kline Blue on a dark ground is unreadable.
- Hover Both modes move to the primary text colour. The underline follows the text colour, the link never loses its underline.
- Underline Mandatory. Colour alone is not a link marker and fails for readers who cannot separate the two hues.
- Label Names its destination. Click here and read more are not labels.
- Scope All styles are namespaced under the container id. Nothing leaks into the host page.
- Source of truth Custom properties on the container carry both modes. Never fork this file into two colour variants.
Colour Tokens
| Token | Light | Dark |
|---|---|---|
| Background | #FAFAFA | #141414 |
| Body text | #141414 | #FAFAFA |
| Secondary text | #5A5A5A | #9CA3AF |
| Rule | #E1E1E1 | #374151 |
| Link | #002FA7 | #6B93FF |
| Link hover | #141414 | #FAFAFA |
Geometry
| Token | Web | |
|---|---|---|
| Text size | 16px | 16px |
| Line height | 26px | 26px |
| Link weight | 700 | 700 |
| Underline | 1px, offset 4px | client default |
| Hover | text colour | not available |
| Corner radius | 0 | 0 |
Production CSS, web only
.rib-link {
color: #002FA7;
text-decoration: underline;
text-underline-offset: 4px;
text-decoration-thickness: 1px;
font-weight: 500;
transition: color 0.2s ease, text-decoration-color 0.2s ease;
}
.rib-link:hover {
color: #141414;
text-decoration-color: #141414;
}
.rib-link {
color: #6B93FF;
text-decoration: underline;
text-underline-offset: 4px;
text-decoration-thickness: 1px;
font-weight: 500;
transition: color 0.2s ease, text-decoration-color 0.2s ease;
}
.rib-link:hover {
color: #FAFAFA;
text-decoration-color: #FAFAFA;
}
Production HTML, mail
Mail clients ignore underline offset, underline thickness and hover. The mail version therefore carries colour, underline and bold weight only, all inline.
<p style="margin:0; font-family:Arial,Helvetica,sans-serif; font-size:16px; line-height:26px; color:#141414;">
Bitte lies dir unsere
<a href="https://rico-brunner.com/agb" style="color:#002FA7; text-decoration:underline; font-weight:bold;">Stornierungsbedingungen</a>
sorgfältig durch.
</p>
<p style="margin:0; font-family:Arial,Helvetica,sans-serif; font-size:16px; line-height:26px; color:#FAFAFA;">
Bitte lies dir unsere
<a href="https://rico-brunner.com/agb" style="color:#6B93FF; text-decoration:underline; font-weight:bold;">Stornierungsbedingungen</a>
sorgfältig durch.
</p>
Lists & Bulletpoints
Lists and Bullet Points
Table based list at 900px. Bullet cell 20px, item text 16px on 24px.
| • | Erster Punkt der Aufzählung mit der Markenfarbe. |
| • | Zweiter strukturierter Punkt im exakten Fliesstext Grid. |
| • | Dritter Punkt ohne störenden Einzug auf Mobilgeräten. |
Lists and Bullet Points
Fluid container up to 768px. Bullet cell and type stay identical to desktop.
| • | Erster Punkt der Aufzählung mit der Markenfarbe. |
| • | Zweiter strukturierter Punkt im exakten Fliesstext Grid. |
| • | Dritter Punkt ohne störenden Einzug auf Mobilgeräten. |
Lists and Bullet Points
Fluid container. Card padding drops to 24px. The bullet cell does not shrink.
| • | Erster Punkt der Aufzählung mit der Markenfarbe. |
| • | Zweiter strukturierter Punkt im exakten Fliesstext Grid. |
| • | Dritter Punkt ohne störenden Einzug auf Mobilgeräten. |
IT Implementation Rule
Standard <ul> and <li> tags render unpredictably across Outlook and mobile clients. Bullet lists are built as tables with a dedicated bullet cell.
- Bullet cell width Fixed at 20px in every viewport. Shrinking it breaks the text axis on the second line.
- Bullet colour Signal colour of the active mode. This is the only place the signal colour appears in a list.
- Item spacing 8px bottom padding per row, zero on the last row.
- Vertical alignment Top on both cells, so multi line items keep the bullet at the first line.
- Nesting Not supported. A second level means the list should be split into two blocks with a heading.
- Scope All styles are namespaced under the container id. Nothing leaks into the host page.
- Source of truth Custom properties on the container carry both modes. Never fork this file into two colour variants.
Colour Tokens
| Token | Light | Dark |
|---|---|---|
| Background | #FAFAFA | #141414 |
| Item text | #141414 | #FAFAFA |
| Secondary text | #5A5A5A | #9CA3AF |
| Rule | #E1E1E1 | #374151 |
| Signal, bullet and card border | #002FA7 | #6B93FF |
Geometry
| Token | Desktop | Tablet | Mobile |
|---|---|---|---|
| Card width | 900px | 768px | fluid |
| Card padding | 40px | 40px | 24px |
| Bullet cell width | 20px | 20px | 20px |
| Bullet size | 20px | 20px | 20px |
| Item size | 16px | 16px | 16px |
| Item line height | 24px | 24px | 24px |
| Row spacing | 8px | 8px | 8px |
| Corner radius | 0 | 0 | 0 |
Production HTML
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="width:100%;">
<tr>
<td width="20" style="width:20px; vertical-align:top; color:#002FA7; font-family:Arial,Helvetica,sans-serif; font-size:20px; line-height:24px;">•</td>
<td style="padding-bottom:8px; color:#141414; font-family:Arial,Helvetica,sans-serif; font-size:16px; line-height:24px;">List item text goes here.</td>
</tr>
<tr>
<td width="20" style="width:20px; vertical-align:top; color:#002FA7; font-family:Arial,Helvetica,sans-serif; font-size:20px; line-height:24px;">•</td>
<td style="padding-bottom:0; color:#141414; font-family:Arial,Helvetica,sans-serif; font-size:16px; line-height:24px;">Last item carries no bottom padding.</td>
</tr>
</table>
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="width:100%;">
<tr>
<td width="20" style="width:20px; vertical-align:top; color:#6B93FF; font-family:Arial,Helvetica,sans-serif; font-size:20px; line-height:24px;">•</td>
<td style="padding-bottom:8px; color:#FAFAFA; font-family:Arial,Helvetica,sans-serif; font-size:16px; line-height:24px;">List item text goes here.</td>
</tr>
<tr>
<td width="20" style="width:20px; vertical-align:top; color:#6B93FF; font-family:Arial,Helvetica,sans-serif; font-size:20px; line-height:24px;">•</td>
<td style="padding-bottom:0; color:#FAFAFA; font-family:Arial,Helvetica,sans-serif; font-size:16px; line-height:24px;">Last item carries no bottom padding.</td>
</tr>
</table>
Header Email
Header Block
Fixed container at 600px. Logo 220px. Title 48px on 53px.
|
|
Dein Termin steht |
Header Block
Fluid container up to 600px. Logo 200px. Title 40px on 44px.
|
|
Dein Termin steht |
Header Block
Fluid container. Logo 160px. Title 36px on 40px.
|
|
Dein Termin steht |
Rules
- Logo Black positive in light mode, white negative in dark mode. Two separate hosted assets, never a CSS filter applied to one file. Never on a contrasting patch, never inside a box.
- Alignment Logo and title centred on all viewports.
- Colors Primary text on background, nothing else. No blue in the header.
- Font Arial is the sending font. Geist is not available in mail clients.
- Spacing 32px between logo and title on desktop and tablet, 24px on mobile.
- Alt Text Rico Brunner. The header must stay readable when images are blocked.
- Scope All styles are namespaced under the container id. Nothing leaks into the host page.
- Source of truth Custom properties on the container carry both modes. Never fork this file into two colour variants.
Colour Tokens
| Token | Light | Dark |
|---|---|---|
| Background | #FAFAFA | #141414 |
| Primary text | #141414 | #FAFAFA |
| Secondary text | #5A5A5A | #9CA3AF |
| Rule | #E1E1E1 | #374151 |
| Logo asset | black positive | white negative |
| Font smoothing | default | antialiased |
Geometry
| Token | Desktop | Tablet | Mobile |
|---|---|---|---|
| Container | 600px | fluid | fluid |
| Logo width | 220px | 200px | 160px |
| Logo min width | 120px | 120px | 120px |
| Title size | 48px | 40px | 36px |
| Title line height | 53px | 44px | 40px |
| Title weight | 700 | 700 | 700 |
| Padding top | 48px | 48px | 32px |
| Gap | 32px | 32px | 24px |
| Padding bottom | 40px | 40px | 32px |
| Side padding | 24px | 24px | 20px |
Production HTML
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="background-color:#FAFAFA;">
<tr>
<td align="center" style="padding:0;">
<table role="presentation" width="600" cellpadding="0" cellspacing="0" border="0" class="rib-container" style="width:600px; max-width:600px;">
<tr>
<td align="center" class="rib-logo-cell" style="padding:48px 24px 0 24px;">
<img src="https://yourdomain.com/assets/rib-logo-black.png"
alt="Rico Brunner"
width="220"
class="rib-logo"
style="display:block; width:220px; max-width:220px; height:auto; border:0; outline:none; text-decoration:none;">
</td>
</tr>
<tr>
<td height="32" style="height:32px; line-height:32px; font-size:0;" class="rib-gap"> </td>
</tr>
<tr>
<td align="center" class="rib-title-cell" style="padding:0 24px 40px 24px;">
<h1 class="rib-title" style="margin:0; font-family:Arial,Helvetica,sans-serif; font-size:48px; line-height:53px; font-weight:700; letter-spacing:0.7px; color:#141414;">
Dein Termin steht
</h1>
</td>
</tr>
</table>
</td>
</tr>
</table>
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="background-color:#FAFAFA;">
<tr>
<td align="center" style="padding:0;">
<table role="presentation" width="600" cellpadding="0" cellspacing="0" border="0" class="rib-container" style="width:600px; max-width:600px;">
<tr>
<td align="center" class="rib-logo-cell" style="padding:48px 24px 0 24px;">
<img src="https://yourdomain.com/assets/rib-logo-white.png"
alt="Rico Brunner"
width="220"
class="rib-logo"
style="display:block; width:220px; max-width:220px; height:auto; border:0; outline:none; text-decoration:none;">
</td>
</tr>
<tr>
<td height="32" style="height:32px; line-height:32px; font-size:0;" class="rib-gap"> </td>
</tr>
<tr>
<td align="center" class="rib-title-cell" style="padding:0 24px 40px 24px;">
<h1 class="rib-title" style="margin:0; font-family:Arial,Helvetica,sans-serif; font-size:48px; line-height:53px; font-weight:700; letter-spacing:0.7px; color:#FAFAFA;">
Dein Termin steht
</h1>
</td>
</tr>
</table>
</td>
</tr>
</table>
Media Queries
@media only screen and (max-width:620px) {
.rib-container { width:100% !important; max-width:100% !important; }
.rib-logo { width:200px !important; max-width:200px !important; }
.rib-title { font-size:40px !important; line-height:44px !important; }
}
@media only screen and (max-width:480px) {
.rib-logo-cell { padding:32px 20px 0 20px !important; }
.rib-logo { width:160px !important; max-width:160px !important; }
.rib-gap { height:24px !important; line-height:24px !important; }
.rib-title-cell { padding:0 20px 32px 20px !important; }
.rib-title { font-size:36px !important; line-height:40px !important; letter-spacing:0.5px !important; }
}
Footer Email
Footer and Legal Information
Fixed container at 600px. Left aligned on the body text axis. Body 14px on 22px.
|
Rico Brunner AG |
|
Du erhältst diese E-Mail als Bestätigung deiner Anfrage. |
Footer and Legal Information
Fluid container up to 600px. Padding and type stay identical to desktop.
|
Rico Brunner AG |
|
Du erhältst diese E-Mail als Bestätigung deiner Anfrage. |
Footer and Legal Information
Fluid container. Side padding drops to 20px. Type size stays at 14px.
|
Rico Brunner AG |
|
Du erhältst diese E-Mail als Bestätigung deiner Anfrage. |
Mandatory Content
- Company Details Legal entity name, full postal address, phone number and a direct contact address. Rico Brunner AG, Zürcherstrasse 170, CH-9014 St. Gallen.
- Legal Links Inline links to AGB and Datenschutzerklärung, underlined, in the link colour of the active mode.
- Reason for Receipt One line stating why this message was sent. Not optional in Swiss practice.
- Unsubscribe Explicit opt out for marketing mail, rendered as a link, never as an image.
- Alignment Strict left alignment on the vertical body text axis defined in the Web and Email Grid System TDS.
- Type Arial 14px on 22px. Never smaller. Legal text that cannot be read is not a disclosure.
- Scope All styles are namespaced under the container id. Nothing leaks into the host page.
Token Table
| Token | Light | Dark |
|---|---|---|
| Background | #FAFAFA | #141414 |
| Primary text | #141414 | #FAFAFA |
| Secondary text | #5C5C5C | #9CA3AF |
| Rule | #E1E1E1 | #374151 |
| Link | #002FA7 | #6B93FF |
Spacing
| Token | Desktop | Tablet | Mobile |
|---|---|---|---|
| Container | 600px | fluid | fluid |
| Side padding | 24px | 24px | 20px |
| Rule to address | 32px | 32px | 32px |
| Address to links | 24px | 24px | 24px |
| Links to reason | 24px | 24px | 24px |
| Padding bottom | 40px | 40px | 32px |
| Body size | 14px | 14px | 14px |
| Body line height | 22px | 22px | 22px |
Production HTML Light Mode
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="background-color:#FAFAFA;">
<tr>
<td align="center" style="padding:0;">
<table role="presentation" width="600" cellpadding="0" cellspacing="0" border="0" class="rib-container" style="width:600px; max-width:600px;">
<tr>
<td class="rib-rule" style="padding:0 24px; font-size:0; line-height:0;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0">
<tr><td height="1" style="height:1px; line-height:1px; font-size:0; background-color:#E1E1E1;"> </td></tr>
</table>
</td>
</tr>
<tr>
<td align="left" class="rib-cell" style="padding:32px 24px 0 24px; font-family:Arial,Helvetica,sans-serif; font-size:14px; line-height:22px; color:#5C5C5C;">
<strong style="color:#141414; font-weight:700;">Rico Brunner AG</strong><br>
Zürcherstrasse 170<br>
CH-9014 St. Gallen<br>
Tel: +41 (0)71 220 90 64<br>
E-Mail: <a href="mailto:[email protected]" style="color:#002FA7; text-decoration:underline;">[email protected]</a>
</td>
</tr>
<tr>
<td align="left" class="rib-cell" style="padding:24px 24px 0 24px; font-family:Arial,Helvetica,sans-serif; font-size:14px; line-height:22px; color:#5C5C5C;">
<a href="https://rico-brunner.com/agb" style="color:#002FA7; text-decoration:underline;">AGB</a>
<span style="color:#5C5C5C; padding:0 8px;">|</span>
<a href="https://rico-brunner.com/datenschutz" style="color:#002FA7; text-decoration:underline;">Datenschutzerklärung</a>
</td>
</tr>
<tr>
<td align="left" class="rib-cell" style="padding:24px 24px 40px 24px; font-family:Arial,Helvetica,sans-serif; font-size:14px; line-height:22px; color:#5C5C5C;">
Du erhältst diese E-Mail als Bestätigung deiner Anfrage.<br>
<a href="{unsubscribe_url}" style="color:#002FA7; text-decoration:underline;">Marketing-Mails abmelden</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
Production HTML Dark Mode
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="background-color:#141414;">
<tr>
<td align="center" style="padding:0;">
<table role="presentation" width="600" cellpadding="0" cellspacing="0" border="0" class="rib-container" style="width:600px; max-width:600px;">
<tr>
<td class="rib-rule" style="padding:0 24px; font-size:0; line-height:0;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0">
<tr><td height="1" style="height:1px; line-height:1px; font-size:0; background-color:#374151;"> </td></tr>
</table>
</td>
</tr>
<tr>
<td align="left" class="rib-cell" style="padding:32px 24px 0 24px; font-family:Arial,Helvetica,sans-serif; font-size:14px; line-height:22px; color:#9CA3AF;">
<strong style="color:#FAFAFA; font-weight:700;">Rico Brunner AG</strong><br>
Zürcherstrasse 170<br>
CH-9014 St. Gallen<br>
Tel: +41 (0)71 220 90 64<br>
E-Mail: <a href="mailto:[email protected]" style="color:#6B93FF; text-decoration:underline;">[email protected]</a>
</td>
</tr>
<tr>
<td align="left" class="rib-cell" style="padding:24px 24px 0 24px; font-family:Arial,Helvetica,sans-serif; font-size:14px; line-height:22px; color:#9CA3AF;">
<a href="https://rico-brunner.com/agb" style="color:#6B93FF; text-decoration:underline;">AGB</a>
<span style="color:#9CA3AF; padding:0 8px;">|</span>
<a href="https://rico-brunner.com/datenschutz" style="color:#6B93FF; text-decoration:underline;">Datenschutzerklärung</a>
</td>
</tr>
<tr>
<td align="left" class="rib-cell" style="padding:24px 24px 40px 24px; font-family:Arial,Helvetica,sans-serif; font-size:14px; line-height:22px; color:#9CA3AF;">
Du erhältst diese E-Mail als Bestätigung deiner Anfrage.<br>
<a href="{unsubscribe_url}" style="color:#6B93FF; text-decoration:underline;">Marketing-Mails abmelden</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
Media Queries
@media only screen and (max-width:620px) {
.rib-container { width:100% !important; max-width:100% !important; }
}
@media only screen and (max-width:480px) {
.rib-rule { padding:0 20px !important; }
.rib-cell { padding-left:20px !important; padding-right:20px !important; }
.rib-cell:last-child { padding-bottom:32px !important; }
}
Appointement Bubble Email
Appointment Block
Fixed container at 600px. Bubble 172px on the left, details on the right, actions below.
Du hast 48 Stunden Zeit, deinen Termin zu bestätigen. Andernfalls verfällt er. |
Appointment Block
Fluid container up to 600px. Layout and type identical to desktop.
Du hast 48 Stunden Zeit, deinen Termin zu bestätigen. Andernfalls verfällt er. |
Appointment Block
Everything stacks. Bubble stays 172px, buttons go full width, title drops to 20px.
Du hast 48 Stunden Zeit, deinen Termin zu bestätigen. Andernfalls verfällt er. |
Rules
- Bubble Taken over unchanged. 172px outer circle, 2px dotted ring in link colour, 1px solid inner ring in text colour, three lines centred. Weekday muted, date in text colour, time in link colour.
- Buttons Rectangular. No border radius anywhere in the block. Primary is a solid fill in text colour, secondary is a 1px outline in text colour. Both keep an identical box height.
- Chips Rectangular for the same reason. Format chip carries the link colour, duration chip stays neutral.
- Alignment Left aligned on the body text axis. The bubble does not centre on mobile.
- Signal colour The link colour appears exactly twice, on the time and on the format chip. Adding a third use flattens the hierarchy.
- Fine print 14px on 22px, directly below the actions, never above them.
- Scope All styles are namespaced under the container id. Nothing leaks into the host page.
Colour Tokens
| Token | Light | Dark |
|---|---|---|
| Background | #FAFAFA | #141414 |
| Card border | #E1E1E1 | #374151 |
| Primary text | #141414 | #FAFAFA |
| Secondary text | #5C5C5C | #9CA3AF |
| Signal | #002FA7 | #6B93FF |
| Label on fill | #FAFAFA | #141414 |
Geometry
| Token | Desktop | Tablet | Mobile |
|---|---|---|---|
| Container | 600px | fluid | fluid |
| Card padding | 32px | 32px | 24px on 20px |
| Bubble outer | 172px | 172px | 172px |
| Bubble inner | 152px | 152px | 152px |
| Bubble ring | 2px dotted | 2px dotted | 2px dotted |
| Bubble to details | 24px | 24px | 24px stacked |
| Title size | 24px | 24px | 20px |
| Button padding | 16px on 32px | 16px on 32px | 16px full width |
| Button radius | 0 | 0 | 0 |
| Details to actions | 32px | 32px | 32px |
| Actions to fine print | 24px | 24px | 24px |
Merge Variables
| Variable | Example |
|---|---|
| weekday | DIENSTAG |
| date | 25. August 2026 |
| time | 08:30 Uhr |
| appointment_type | Persönlicher Termin |
| format | Live Beratung |
| duration | 60 Minuten |
| host | Rico Brunner |
| guest | Silv Graf |
| confirm_url | tokenised, single use |
| cancel_url | tokenised, single use |
Production HTML Light Mode
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="background-color:#FAFAFA;">
<tr>
<td align="center" style="padding:0 24px;">
<table role="presentation" width="552" cellpadding="0" cellspacing="0" border="0" class="rib-container" style="width:552px; max-width:552px; border:1px solid #E1E1E1;">
<tr>
<td style="padding:32px;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="172" valign="top" class="rib-stack" style="width:172px; padding:0 24px 0 0;">
<table role="presentation" width="172" cellpadding="0" cellspacing="0" border="0" style="width:172px; height:172px; border:2px dotted #002FA7; border-radius:86px;">
<tr>
<td align="center" valign="middle" style="height:172px; font-family:Arial,Helvetica,sans-serif;">
<table role="presentation" width="152" cellpadding="0" cellspacing="0" border="0" style="width:152px; height:152px; border:1px solid #141414; border-radius:76px;">
<tr>
<td align="center" valign="middle" style="height:152px; padding:0 12px;">
<div style="font-size:11px; line-height:16px; letter-spacing:1.5px; color:#5C5C5C;">{{weekday}}</div>
<div style="font-size:16px; line-height:24px; font-weight:700; color:#141414;">{{date}}</div>
<div style="font-size:16px; line-height:24px; font-weight:700; color:#002FA7;">{{time}}</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
<td valign="top" class="rib-stack" style="font-family:Arial,Helvetica,sans-serif;">
<div style="font-size:11px; line-height:16px; letter-spacing:1.5px; color:#5C5C5C; padding-bottom:8px;">TERMIN</div>
<div style="font-size:24px; line-height:30px; font-weight:600; color:#141414; padding-bottom:16px;">{{appointment_type}}</div>
<table role="presentation" cellpadding="0" cellspacing="0" border="0">
<tr>
<td style="border:1px solid #002FA7; padding:8px 14px; font-size:14px; line-height:18px; color:#002FA7;">{{format}}</td>
<td width="8" style="width:8px;"> </td>
<td style="border:1px solid #E1E1E1; padding:8px 14px; font-size:14px; line-height:18px; color:#5C5C5C;">{{duration}}</td>
</tr>
</table>
<div style="font-size:14px; line-height:22px; color:#5C5C5C; padding-top:16px;">
MIT <strong style="color:#141414;">{{host}}</strong>
FÜR <strong style="color:#141414;">{{guest}}</strong>
</div>
</td>
</tr>
</table>
<table role="presentation" cellpadding="0" cellspacing="0" border="0" style="padding-top:32px;">
<tr>
<td class="rib-stack" style="background-color:#141414;">
<a href="{{confirm_url}}" style="display:block; padding:16px 32px; font-family:Arial,Helvetica,sans-serif; font-size:16px; line-height:20px; font-weight:700; color:#FAFAFA; text-decoration:none;">Termin bestätigen</a>
</td>
<td width="12" class="rib-stack" style="width:12px;"> </td>
<td class="rib-stack" style="border:1px solid #141414;">
<a href="{{cancel_url}}" style="display:block; padding:15px 32px; font-family:Arial,Helvetica,sans-serif; font-size:16px; line-height:20px; font-weight:700; color:#141414; text-decoration:none;">Termin absagen</a>
</td>
</tr>
</table>
<div style="font-family:Arial,Helvetica,sans-serif; font-size:14px; line-height:22px; color:#5C5C5C; padding-top:24px;">
Du hast 48 Stunden Zeit, deinen Termin zu bestätigen. Andernfalls verfällt er.<br>
Beim Absagen kannst du angeben, wann es dir besser passt.
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
Media Queries
@media only screen and (max-width:620px) {
.rib-container { width:100% !important; max-width:100% !important; }
}
@media only screen and (max-width:480px) {
.rib-stack {
display:block !important;
width:100% !important;
padding:0 0 12px 0 !important;
}
}