Most data employees who need to make shows don’t consider
themselves as designers. It’s honest to say the visible design of
shows is daunting sufficient to devour most presenters’ psychological
area. Maybe that’s why we equate the slides with the presentation.
Visible design is a broad topic, so we will’t cowl it in its
entirety. Nevertheless, it’s vital sufficient that the following few articles in
this sequence will give attention to slide design. I’ll start with some
fundamentals. Think about I needed to create a presentation in regards to the content material
of this text. If I needed to create a title slide for that deck, I
may make it seem like the one beneath. It juxtaposes a couple of parts —
a picture, textual content and a few colors — right into a structure.

Determine 1: A easy title slide
combines a picture, some textual content and light-handed colors.
If I had been to proceed constructing these slides, I’d should make some
recurring design choices. As a substitute, I embed these choices right into a
template. We’ll talk about what it takes to arrange your personal template, however
first let’s deal with an elephant within the room.
The company template
For those who work at a big sufficient company, your employer might have
supplied a company slide template. There are good causes for this.
Most individuals aren’t adept at assembling slides, so it helps to codify
some default layouts in a template. Individuals usually use colors and fonts
which will conflict with the model’s aesthetic, and a template can place
some guardrails to keep away from these errors.
The difficulty with customary templates is that everybody makes use of the
defaults. Earlier than you understand it, everybody’s slides look the identical. Individuals
ignore boring issues, so there’s worth in breaking that monotony.
Now, should you can perceive what your advertising and marketing colleagues are
attempting to realize with their prescribed templates, you may adhere to
your company model and assemble slides that look distinctive.
By means of the remainder of this text, I’ll present you the best way to construct your personal
template, however you too can use that recommendation to unpack the important thing parts
of any company slide template.
Begin with a color palette
As a self-taught designer, I’ve usually struggled with making
colors play nicely with one another. For some individuals, color alternative is
intuitive. If you reuse the identical colors in all slides of your
presentation, the visuals achieve a cohesive identification.
It’s useful to grasp the fundamentals of color concept, so you understand
which color palette may work in your presentation type. The
color wheel is an efficient start line. Consider it as an summary
illustration of the color spectrum that helps you perceive which
colors work nicely collectively.

Determine 2: A primary color wheel.
If you study the wheel, you’ll discover that the nearer the
colors are to the centre, the much less intense they’re. Colors on the
periphery are extra saturated. There lies lesson one. In case your
slide background will likely be white or mild, select colors that sit at
the periphery. If you need your slide background darkish, select colors
that sit near the centre.

Determine 3: Colors on the periphery
work nicely with mild slides. These in the direction of the centre work nicely with
darker backgrounds.
There are various methods to decide on colors and construct your palette.
Adobe offers you with a free,
interactive color palette generator to mess around with the
color wheel and land on a theme you want. You’ll be able to construct your palette
from scratch, browse trending palettes, and even generate them from a
{photograph} that represents the content material you need to current.

Determine 4: Producing a color palette from a
consultant picture.
The benefit of working with palettes is that software program like
PowerPoint helps you to swap themes throughout your total presentation
with out updating each diagram. Select a brand new theme, and PowerPoint
recolours all of your diagrams and slides. The interactive demo beneath
reveals you how one can swap your color palettes in PowerPoint.
<div class=”demo-wrap”>
<div class=”body” id=”body”>
<div class=”stage” id=”stage”>
<img id=”stage-img” src=”” alt=””>
<div class=”highlight-box” id=”highlight-box”></div>
<div class=”click-target” id=”click-target”></div>
<div class=”callout” id=”callout”></div>
<canvas class=”confetti-canvas” id=”confetti”></canvas>
<span class=”step-counter” id=”step-counter”></span>
<div class=”toast” id=”toast”>
<p id=”toast-text”></p>
<button class=”restart-btn” id=”restart-btn” sort=”button”>Restart demo</button>
</div>
</div>
</div>
<p class=”trace”>Click on the highlighted space on the screenshot to strive the demo.</p>
</div>
<script>
var IMAGE_RATIO = 2500 / 1492;
// field coordinates are % of the picture’s width/top
var steps = [
{
img: “https://images.squarespace-cdn.com/content/62877916852eaf2a047a9095/52870cfe-8638-470b-88ec-a35ba1e36476/Base+diagram.jpg”,
box: {left: 75.4, top: 8.0, width: 3.6, height: 4.6},
text: “Click the colours button in the toolbar.”,
side: “left”
},
{
img: “https://images.squarespace-cdn.com/content/62877916852eaf2a047a9095/c0538587-62b1-4b9d-9fcc-e60b0e8eaf25/Click+the+colours+button.jpg”,
box: {left: 75.7, top: 19.6, width: 13.8, height: 2.7},
text: “Select the ThoughtWorks Palette.”,
side: “left”
},
{
img: “https://images.squarespace-cdn.com/content/62877916852eaf2a047a9095/018d74c9-0502-4883-943b-5b228fc2a5b8/Recoloured+image.jpg?content-type=image%2Fjpeg”,
final: true,
toast: “Congratulations! PowerPoint has recoloured your entire diagram.”
}
];
var present = 0;
var body = doc.getElementById(‘body’);
var stage = doc.getElementById(‘stage’);
var img = doc.getElementById(‘stage-img’);
var highlightBox = doc.getElementById(‘highlight-box’);
var clickTarget = doc.getElementById(‘click-target’);
var callout = doc.getElementById(‘callout’);
var toast = doc.getElementById(‘toast’);
var toastText = doc.getElementById(‘toast-text’);
var restartBtn = doc.getElementById(‘restart-btn’);
var stepCounter = doc.getElementById(‘step-counter’);
var confettiCanvas = doc.getElementById(‘confetti’);
var ctx = confettiCanvas.getContext(‘second’);
perform fitStage() {
var fw = body.clientWidth;
var fh = body.clientHeight;
if (!fw || !fh) return;
var w = fw;
var h = w / IMAGE_RATIO;
if (h > fh) {
h = fh;
w = h * IMAGE_RATIO;
}
stage.type.width = w + ‘px’;
stage.type.top = h + ‘px’;
confettiCanvas.width = w;
confettiCanvas.top = h;
positionHighlight();
}
if (window.ResizeObserver) {
new ResizeObserver(fitStage).observe(body);
} else {
window.addEventListener(‘resize’, fitStage);
}
perform positionHighlight() {
var step = steps[current];
var w = stage.clientWidth;
var h = stage.clientHeight;
if (step.closing || !w || !h) return;
var bx = (step.field.left / 100) * w;
var by = (step.field.high / 100) * h;
var bw = (step.field.width / 100) * w;
var bh = (step.field.top / 100) * h;
var pad = Math.max(6, w * 0.006);
highlightBox.type.left = (bx – pad) + ‘px’;
highlightBox.type.high = (by – pad) + ‘px’;
highlightBox.type.width = (bw + pad * 2) + ‘px’;
highlightBox.type.top = (bh + pad * 2) + ‘px’;
var clickPad = Math.max(18, w * 0.02);
clickTarget.type.left = (bx – clickPad) + ‘px’;
clickTarget.type.high = (by – clickPad) + ‘px’;
clickTarget.type.width = (bw + clickPad * 2) + ‘px’;
clickTarget.type.top = (bh + clickPad * 2) + ‘px’;
var calloutGap = 20;
var boxCenterY = by + bh / 2;
callout.className = ‘callout point-‘ + (step.facet === ‘left’ ? ‘proper’ : ‘left’);
callout.type.high = boxCenterY + ‘px’;
if (step.facet === ‘left’) {
callout.type.left = ‘auto’;
callout.type.proper = (w – (bx – pad) + calloutGap) + ‘px’;
} else {
callout.type.proper = ‘auto’;
callout.type.left = (bx + bw + pad + calloutGap) + ‘px’;
}
}
perform render() {
var step = steps[current];
img.src = step.img;
stepCounter.textContent = (present + 1) + ‘ / ‘ + steps.size;
var isFinal = !!step.closing;
highlightBox.type.opacity = isFinal ? ‘0’ : ‘1’;
callout.type.opacity = isFinal ? ‘0’ : ‘1’;
clickTarget.type.show = isFinal ? ‘none’ : ‘block’;
toast.classList.toggle(‘present’, isFinal);
if (!isFinal) {
callout.textContent = ”;
var span = doc.createElement(‘span’);
span.textContent = step.textual content;
callout.appendChild(span);
} else {
toastText.textContent = step.toast;
launchConfetti();
}
requestAnimationFrame(positionHighlight);
}
clickTarget.addEventListener(‘click on’, perform () {
if (present < steps.size – 1) {
present++;
render();
}
});
restartBtn.addEventListener(‘click on’, perform () {
toast.classList.take away(‘present’);
present = 0;
render();
});
// — light-weight confetti burst, no exterior library —
var confettiColors = [‘#F2617A’, ‘#47A1AD’, ‘#634F7D’, ‘#6B9E78’, ‘#CC850A’, ‘#003D4F’];
var confettiPieces = [];
var confettiRunning = false;
perform launchConfetti() {
var w = confettiCanvas.width;
var h = confettiCanvas.top;
confettiPieces = [];
var depend = Math.spherical(w / 6);
for (var i = 0; i < depend; i++) {
confettiPieces.push({
x: Math.random() * w,
y: -20 – Math.random() * h * 0.5,
measurement: 5 + Math.random() * 6,
colour: confettiColors[i % confettiColors.length],
speedY: 2 + Math.random() * 3,
speedX: (Math.random() – 0.5) * 2.2,
rotation: Math.random() * Math.PI * 2,
spin: (Math.random() – 0.5) * 0.3,
life: 0,
maxLife: 180 + Math.random() * 60
});
}
if (!confettiRunning) {
confettiRunning = true;
requestAnimationFrame(stepConfetti);
}
}
perform stepConfetti() {
var w = confettiCanvas.width;
var h = confettiCanvas.top;
ctx.clearRect(0, 0, w, h);
var alive = false;
for (var i = 0; i < confettiPieces.size; i++) {
var p = confettiPieces[i];
p.life++;
if (p.life > p.maxLife) proceed;
alive = true;
p.x += p.speedX;
p.y += p.speedY;
p.rotation += p.spin;
var fade = 1 – Math.max(0, (p.life – p.maxLife * 0.7) / (p.maxLife * 0.3));
ctx.save();
ctx.globalAlpha = Math.max(0, Math.min(1, fade));
ctx.translate(p.x, p.y);
ctx.rotate(p.rotation);
ctx.fillStyle = p.colour;
ctx.fillRect(-p.measurement / 2, -p.measurement / 3, p.measurement, p.measurement * 0.66);
ctx.restore();
}
if (alive) {
requestAnimationFrame(stepConfetti);
} else {
confettiRunning = false;
ctx.clearRect(0, 0, w, h);
}
}
fitStage();
render();
</script>
” title=”Swapping color palettes in PowerPoint”>
However right here’s a phrase of warning. Resist the temptation to invent a
new color palette for each presentation. As a company presenter,
I’ve discovered it useful to seek out or create a palette that I like and
then keep it up for months, usually years.
For those who work for a big company, another person has possible
already outlined a color palette. For instance, at Thoughtworks, our
company palette has six colors, plus black and a lightweight gray shade.
Since most of those colors are darkish, I take advantage of them on a lightweight
background.

Determine 5: The Thoughtworks color palette.
Through the years, I’ve constructed a diagram library that reuses the identical
color palette, so if a presentation references considered one of my core
concepts, I incorporate a consultant diagram right into a Thoughtworks
slide deck. It’s the compounding good thing about utilizing the identical, boring
color palette.
Novice designers usually use too many colors within the quest to construct
vibrant slides. Now that you understand a bit about color concept, you’ll
realise that should you choose too many colors from the wheel, you’ll
wrestle to ascertain a theme and a visible identification that’s evident
throughout your slides. So, select a restricted color palette as an alternative.
Restrict your self to 6 colors, then add black and white to the
palette. Much less is extra. As a bonus, think about all shades of gray as
free additions.
Subsequent, choose the fonts you’ll use
As presenters, we needn’t be specialists at nighttime artwork of
typography. Most shows want solely two or three fonts.
Generally, one font face is loads. Consistency beats selection.
However listed here are the fundamentals. There are two sorts of fonts, every with
its personal deserves — serif and sans-serif. Serif fonts have little toes,
i.e. the serifs. Sans-serif fonts actually lack serifs. The picture
beneath reveals the distinction.

Determine 7: Serif fonts have little toes and
extensions. Sans-serif fonts don’t have them.
For those who’re studying this text on martinfowler.com,
you’ll discover the web site’s serif typeface. And that’s an ideal use of
serif fonts. They’re extra suited to studying and paragraph textual content. This
can also be why newspapers nonetheless use serif fonts.
Sans-serif fonts, however, go well with billboards and signage
higher. If you drive round your city, have a look at the fonts on massive
ads. It’s possible they make use of sans-serif fonts. Presentation
slides are extra like billboards than journal pages.
So, should you needed to default to at least one type of typeface in your
shows, I’d suggest choosing a sans-serif font. They work
nicely for on-line shows, the place the decision is usually a
most of 1080p or 720p, and simply as nicely for keynotes in massive
auditoriums with state-of-the-art projectors.
Nevertheless, there’s no hurt in mixing and matching fonts. You could possibly
use a serif font for titles and a sans-serif font for the remainder of the textual content. The
secret is to remain constant and keep away from what Neal Ford calls the
“fontaholic” antipattern.
A Fontaholic is somebody who believes utilizing a cacophony of fonts
will “jazz up” a presentation. Disharmonic fonts are jarring. They
make shows ugly and harder to learn.
Right here’s an instance of a slide that makes use of a serif font for the title
and a sans-serif font for the whole lot else.

Determine 8: Mixing and matching serif and
sans-serif fonts.
Limiting the variety of fonts in your presentation shouldn’t restrict
your creativity. Fashionable, variable-weight fonts enable you a lot
variations for a similar typeface.

Determine 9: Variable-weight fonts provide
you quite a lot of versatility.
Except for serif and sans-serif fonts, I’ll advocate for 2 extra
font sorts.
Handwritten fonts
I counsel utilizing these fonts just for annotations. They’re
glorious at breaking the sample and monotony of your customary
fonts, and that’s useful if you need to draw your viewers’s
consideration to a selected a part of your presentation. For instance, in
the slide beneath, the purple, handwritten font seems after every half
of the diagram builds, drawing the viewers’s consideration to the
compounding advantages of the AI flywheel.

Determine 10: You should utilize a handwritten font for
annotations and break the visible monotony.
Monospace fonts
For those who’re a developer and also you usually present code snippets in
shows, I counsel including a monospace font to your
repertoire. In code, spacing is a part of the that means. A monospace
font offers each character equal width and helps you preserve
indentation, columns, and construction. Your code is simpler to scan
and much simpler to clarify on a slide. Right here’s an instance from
Phillip
Schmid’s presentation on the AI Engineer convention, the place he
explains the best way to invoke Antigravity as a distant agent.

Determine 11: Utilizing monospace
fonts to indicate code (credit score: Phillip Schmid).
Even non-technical presenters can use monospace fonts to
clarify some ideas. For instance, when explaining Slack channel
naming conventions, I take advantage of the next slide.

Determine 12: Even non-technical
presenters can leverage monospace fonts.
For these of you who’re curious, listed here are a few of my favorite
fonts.
Font alternative apart, take note of how you employ fonts. Generally fonts
don’t work nicely out of the field. To make them look proper, you could
have to regulate kerning (a.okay.a. character spacing) and main (a.okay.a.
line spacing).
Within the instance beneath, discover the additional gaps between the letters A
and V, V and A and T and A. Now drag the slider to see how I’ve
adjusted the kerning between the letters, so the characters have an
even distance between them.
<div class=”ba-wrap”>
<div class=”body” id=”body”>
<div class=”examine” id=”examine”>
<img class=”earlier than” src=”https://photographs.squarespace-cdn.com/content material/62877916852eaf2a047a9095/de25ec7e-915c-48e5-a54c-e77a80ed9311/Earlier than.jpeg” alt=”Poor kerning: uneven area between characters”>
<img class=”after” src=”https://photographs.squarespace-cdn.com/content material/62877916852eaf2a047a9095/5bf85e37-3419-424d-acbd-4150675a416d/After.jpeg” alt=”Improved kerning: even area between characters”>
<span class=”label earlier than” id=”label-before”>Poor kerning</span>
<span class=”label after” id=”label-after”>Improved kerning</span>
<div class=”divider” id=”divider”></div>
<div class=”deal with” id=”deal with” position=”slider” tabindex=”0″ aria-label=”Poor kerning / improved kerning comparability slider” aria-valuemin=”0″ aria-valuemax=”100″ aria-valuenow=”0″>✥</div>
</div>
</div>
<p class=”trace”>Drag the slider to see how adjusting the kerning evens out the area between characters</p>
</div>
<script>
var body = doc.getElementById(‘body’);
var examine = doc.getElementById(‘examine’);
var deal with = doc.getElementById(‘deal with’);
var labelBefore = doc.getElementById(‘label-before’);
var labelAfter = doc.getElementById(‘label-after’);
var pos = 0;
// Actual pixel dimensions of the supply photographs — used to contain-fit the
// stage inside no matter area .body has, at any measurement.
var IMAGE_RATIO = 3840 / 2160;
perform fitStage() {
var fw = body.clientWidth;
var fh = body.clientHeight;
if (!fw || !fh) return;
var w = fw;
var h = w / IMAGE_RATIO;
if (h > fh) {
h = fh;
w = h * IMAGE_RATIO;
}
examine.type.width = w + ‘px’;
examine.type.top = h + ‘px’;
}
if (window.ResizeObserver) {
new ResizeObserver(fitStage).observe(body);
} else {
window.addEventListener(‘resize’, fitStage);
}
fitStage();
perform setPos(p) {
pos = Math.max(0, Math.min(100, p));
examine.type.setProperty(‘–pos’, pos + ‘%’);
deal with.setAttribute(‘aria-valuenow’, Math.spherical(pos));
// “poor kerning” is roofed by “improved kerning” from the left as much as pos%, so
// it is solely seen to the appropriate of the deal with; “improved kerning” solely to the left.
labelBefore.type.opacity = pos < 99.5 ? 1 : 0;
labelAfter.type.opacity = pos > 0.5 ? 1 : 0;
deal with.classList.toggle(‘pulse’, pos <= 2);
}
perform posFromClientX(clientX) {
var rect = examine.getBoundingClientRect();
var x = clientX – rect.left;
return (x / rect.width) * 100;
}
var dragging = false;
perform onPointerDown(e) {
dragging = true;
deal with.setPointerCapture && e.pointerId != null && deal with.setPointerCapture(e.pointerId);
setPos(posFromClientX(e.clientX));
e.preventDefault();
}
perform onPointerMove(e) {
if (!dragging) return;
setPos(posFromClientX(e.clientX));
}
perform onPointerUp() {
dragging = false;
}
examine.addEventListener(‘pointerdown’, onPointerDown);
window.addEventListener(‘pointermove’, onPointerMove);
window.addEventListener(‘pointerup’, onPointerUp);
deal with.addEventListener(‘keydown’, perform (e) {
if (e.key === ‘ArrowLeft’) { setPos(pos – 4); e.preventDefault(); }
if (e.key === ‘ArrowRight’) { setPos(pos + 4); e.preventDefault(); }
if (e.key === ‘Residence’) { setPos(0); e.preventDefault(); }
if (e.key === ‘Finish’) { setPos(100); e.preventDefault(); }
});
setPos(0);
</script>
” title=”Adjusting kerning so characters sit an excellent distance aside”>
If you’re exhibiting quotes in a presentation, you’ll usually run
into points with main. Within the instance beneath, you’ll discover that
the hole between every line is simply too large. If you drag the slider,
you’ll see how a number one adjustment brings the strains collectively and
makes the quote look cohesive.
<div class=”ba-wrap”>
<div class=”body” id=”body”>
<div class=”examine” id=”examine”>
<img class=”earlier than” src=”https://photographs.squarespace-cdn.com/content material/62877916852eaf2a047a9095/ed397a3e-d691-43c6-ab64-01c4f842649f/Earlier than.jpeg” alt=”Poor main: cramped line spacing makes the textual content laborious to learn”>
<img class=”after” src=”https://photographs.squarespace-cdn.com/content material/62877916852eaf2a047a9095/07c71cc2-7e55-4c6d-b646-dff1e27bf0a1/After.jpeg” alt=”Higher main: beneficiant line spacing makes the textual content simple to learn”>
<span class=”label earlier than” id=”label-before”>Poor main</span>
<span class=”label after” id=”label-after”>Higher main</span>
<div class=”divider” id=”divider”></div>
<div class=”deal with” id=”deal with” position=”slider” tabindex=”0″ aria-label=”Poor main / higher main comparability slider” aria-valuemin=”0″ aria-valuemax=”100″ aria-valuenow=”50″>✥</div>
</div>
</div>
<p class=”trace”>Drag the slider to see how lowering the main makes the slide simpler to learn.</p>
</div>
<script>
var body = doc.getElementById(‘body’);
var examine = doc.getElementById(‘examine’);
var deal with = doc.getElementById(‘deal with’);
var labelBefore = doc.getElementById(‘label-before’);
var labelAfter = doc.getElementById(‘label-after’);
var pos = 0;
// Actual pixel dimensions of the supply photographs — used to contain-fit the
// stage inside no matter area .body has, at any measurement.
var IMAGE_RATIO = 3840 / 2160;
// The photograph occupies the left ~52% of the body and is equivalent in each
// photographs, so revealing it does not reveal something. Solely present the
// “Higher main” label as soon as the slider has moved previous the photograph and
// into the textual content column, the place the lowered main is definitely seen.
var TEXT_REVEAL_THRESHOLD = 52;
perform fitStage() {
var fw = body.clientWidth;
var fh = body.clientHeight;
if (!fw || !fh) return;
var w = fw;
var h = w / IMAGE_RATIO;
if (h > fh) {
h = fh;
w = h * IMAGE_RATIO;
}
examine.type.width = w + ‘px’;
examine.type.top = h + ‘px’;
}
if (window.ResizeObserver) {
new ResizeObserver(fitStage).observe(body);
} else {
window.addEventListener(‘resize’, fitStage);
}
fitStage();
perform setPos(p) {
pos = Math.max(0, Math.min(100, p));
examine.type.setProperty(‘–pos’, pos + ‘%’);
deal with.setAttribute(‘aria-valuenow’, Math.spherical(pos));
// “poor main” is roofed by “higher main” from the left as much as pos%, so
// it is solely seen to the appropriate of the deal with. “higher main” solely seems
// as soon as the slider has moved previous the photograph and revealed the textual content column.
labelBefore.type.opacity = pos < 99.5 ? 1 : 0;
labelAfter.type.opacity = pos > TEXT_REVEAL_THRESHOLD ? 1 : 0;
deal with.classList.toggle(‘pulse’, pos <= 2);
}
perform posFromClientX(clientX) {
var rect = examine.getBoundingClientRect();
var x = clientX – rect.left;
return (x / rect.width) * 100;
}
var dragging = false;
perform onPointerDown(e) {
dragging = true;
deal with.setPointerCapture && e.pointerId != null && deal with.setPointerCapture(e.pointerId);
setPos(posFromClientX(e.clientX));
e.preventDefault();
}
perform onPointerMove(e) {
if (!dragging) return;
setPos(posFromClientX(e.clientX));
}
perform onPointerUp() {
dragging = false;
}
examine.addEventListener(‘pointerdown’, onPointerDown);
window.addEventListener(‘pointermove’, onPointerMove);
window.addEventListener(‘pointerup’, onPointerUp);
deal with.addEventListener(‘keydown’, perform (e) {
if (e.key === ‘ArrowLeft’) { setPos(pos – 4); e.preventDefault(); }
if (e.key === ‘ArrowRight’) { setPos(pos + 4); e.preventDefault(); }
if (e.key === ‘Residence’) { setPos(0); e.preventDefault(); }
if (e.key === ‘Finish’) { setPos(100); e.preventDefault(); }
});
setPos(50);
</script>
” title=”Adjusting main so strains of textual content sit nearer collectively”>
For those who perceive these fundamentals of font alternative and
typographic spacing, you may have sufficient typography data to construct a
slide template. All that continues to be is your slide layouts.
No structure is the perfect structure
I’ve struggled to undertake slide layouts and failed. Within the final
decade or so, I’ve discovered myself rejecting cookie-cutter layouts and
beginning with a clean slide every time. I comply with some slide
building rules, which I’ll present you in a future article,
however my template itself is kind of easy. If you see my slides,
you’ll discover why it’s troublesome for me to comply with the usual
layouts that include slide templates.

Determine 13: I discover it troublesome
to adapt my design method to straightforward slide layouts.
So, I’ve deleted all prescribed layouts that include our
company template. My template has three layouts, and I take advantage of the
clean slide virtually on a regular basis. I’ve arrange the Thoughtworks
company palette on my system, so I can select the colors once I
want them for diagrams. I’ve additionally arrange a couple of font kinds primarily based on
a serif-and-sans-serif font mixture. I take advantage of handwritten fonts and
monospace fonts on a case-by-case foundation, so that you gained’t see font
kinds for them. The interplay beneath will present you completely different
elements of my customary presentation theme.
<div class=”hs-wrap”>
<div class=”body” id=”body”>
<div class=”stage” id=”stage”>
<img src=”https://photographs.squarespace-cdn.com/content material/62877916852eaf2a047a9095/f1f74df0-42dd-4b11-9ae0-d79ac8768b50/My+company+template.jpg” alt=”My company slide template”>
<div class=”dim-band” id=”band-top”></div>
<div class=”dim-band” id=”band-bottom”></div>
<div class=”dim-band” id=”band-left”></div>
<div class=”dim-band” id=”band-right”></div>
<div class=”hl-box” id=”hl-box”></div>
<button sort=”button” class=”ring marker” id=”ring-1″ aria-label=”3 layouts” data-id=”1″ type=”left:5.8%; high:45.95%;”>1</button>
<button sort=”button” class=”ring marker” id=”ring-2″ aria-label=”My color palette” data-id=”2″ type=”left:65.05%; high:77.65%;”>2</button>
<button sort=”button” class=”ring marker” id=”ring-3″ aria-label=”Just a few font kinds” data-id=”3″ type=”left:85.25%; high:63.49%;”>3</button>
<div class=”card” id=”card”>
<span class=”ring card-ring” id=”card-ring”>1</span>
<div class=”card-header”>
<h3 class=”card-title” id=”card-title”></h3>
</div>
<p class=”card-text” id=”card-text”></p>
</div>
</div>
</div>
</div>
<script>
var HOTSPOTS = {
‘1’: {
title: ‘3 layouts’,
textual content: ‘Of those, I take advantage of the clean structure more often than not. On my lazy days, I take advantage of one of many inventory title slides.’,
rect: { left: 5.8, high: 13.33, width: 57.8, top: 30.62 }
},
‘2’: {
title: ‘My color palette’,
textual content: ‘Since I work at Thoughtworks, I take advantage of the company palette for all shows in my skilled life. That call permits me to reuse diagrams and slides throughout completely different decks.’,
rect: { left: 65.05, high: 11.97, width: 15.15, top: 63.68 }
},
‘3’: {
title: ‘Just a few font kinds’,
textual content: ‘Most of my slides use the next font kinds, which mix a serif and sans-serif font. I take advantage of handwritten and monospace fonts on a case-by-case foundation.’,
rect: { left: 85.25, high: 11.97, width: 11.75, top: 49.52 }
}
};
var body = doc.getElementById(‘body’);
var stage = doc.getElementById(‘stage’);
var bandTop = doc.getElementById(‘band-top’);
var bandBottom = doc.getElementById(‘band-bottom’);
var bandLeft = doc.getElementById(‘band-left’);
var bandRight = doc.getElementById(‘band-right’);
var hlBox = doc.getElementById(‘hl-box’);
var card = doc.getElementById(‘card’);
var cardRing = doc.getElementById(‘card-ring’);
var cardTitle = doc.getElementById(‘card-title’);
var cardText = doc.getElementById(‘card-text’);
var rings = Array.prototype.slice.name(doc.querySelectorAll(‘.ring.marker’));
var activeId = null;
// Actual pixel dimensions of the supply picture — used to contain-fit the
// stage inside no matter area .body has, at any measurement.
var IMAGE_RATIO = 4614 / 1696;
perform fitStage() {
var fw = body.clientWidth;
var fh = body.clientHeight;
if (!fw || !fh) return;
var w = fw;
var h = w / IMAGE_RATIO;
if (h > fh) {
h = fh;
w = h * IMAGE_RATIO;
}
stage.type.width = w + ‘px’;
stage.type.top = h + ‘px’;
}
if (window.ResizeObserver) {
new ResizeObserver(fitStage).observe(body);
} else {
window.addEventListener(‘resize’, fitStage);
}
fitStage();
// Place the 4 dimming bands so collectively they cowl the whole lot
// besides `rect`. With a zero-size rect (idle state) the highest+backside bands
// alone already cowl 100% of the stage, so nothing wants a particular case.
perform setDim(rect) {
var proper = rect.left + rect.width;
var backside = rect.high + rect.top;
bandTop.type.left = ‘0%’;
bandTop.type.high = ‘0%’;
bandTop.type.width = ‘100%’;
bandTop.type.top = rect.high + ‘%’;
bandBottom.type.left = ‘0%’;
bandBottom.type.high = backside + ‘%’;
bandBottom.type.width = ‘100%’;
bandBottom.type.top = (100 – backside) + ‘%’;
bandLeft.type.left = ‘0%’;
bandLeft.type.high = rect.high + ‘%’;
bandLeft.type.width = rect.left + ‘%’;
bandLeft.type.top = rect.top + ‘%’;
bandRight.type.left = proper + ‘%’;
bandRight.type.high = rect.high + ‘%’;
bandRight.type.width = (100 – proper) + ‘%’;
bandRight.type.top = rect.top + ‘%’;
}
var IDLE_RECT = { left: 0, high: 50, width: 0, top: 0 };
setDim(IDLE_RECT);
perform activate(id) {
if (activeId === id) {
deactivate();
return;
}
activeId = id;
var hotspot = HOTSPOTStag:martinfowler.com,2026-10-14:Construct-your-slide-template;
var rect = hotspot.rect;
setDim(rect);
hlBox.type.left = rect.left + ‘%’;
hlBox.type.high = rect.high + ‘%’;
hlBox.type.width = rect.width + ‘%’;
hlBox.type.top = rect.top + ‘%’;
hlBox.classList.add(‘seen’);
var ring = doc.getElementById(‘ring-‘ + id);
var anchorLeft = parseFloat(ring.type.left);
var anchorTop = parseFloat(ring.type.high);
// Playing cards rising rightward from a hotspot in the appropriate half of the picture
// would run off the body, so anchor these to the appropriate edge as an alternative
// and allow them to develop leftward, the place there’s really room.
var anchorRight = anchorLeft > 55;
card.classList.toggle(‘anchor-right’, anchorRight);
if (anchorRight) {
card.type.left = ‘auto’;
card.type.proper = (100 – anchorLeft) + ‘%’;
card.type.maxWidth = ‘min(58cqw, calc(‘ + anchorLeft + ‘% – 3%))’;
} else {
card.type.proper = ‘auto’;
card.type.left = anchorLeft + ‘%’;
card.type.maxWidth = ‘min(58cqw, calc(‘ + (100 – anchorLeft) + ‘% – 3%))’;
}
// Likewise, playing cards rising downward from a hotspot within the decrease half of
// the picture would run off the underside of the body, so anchor these to
// develop upward as an alternative.
var anchorBottom = anchorTop > 50;
card.classList.toggle(‘anchor-bottom’, anchorBottom);
if (anchorBottom) {
card.type.high = ‘auto’;
card.type.backside = (100 – anchorTop) + ‘%’;
card.type.maxHeight = ‘calc(‘ + anchorTop + ‘% – 3%)’;
} else {
card.type.backside = ‘auto’;
card.type.high = anchorTop + ‘%’;
card.type.maxHeight = ‘calc(‘ + (100 – anchorTop) + ‘% – 3%)’;
}
cardRing.textContent = id;
cardTitle.textContent = hotspot.title;
cardText.textContent = hotspot.textual content;
card.classList.add(‘seen’);
rings.forEach(perform (r) { r.classList.add(‘hidden’); });
}
perform deactivate() {
activeId = null;
setDim(IDLE_RECT);
hlBox.classList.take away(‘seen’);
card.classList.take away(‘seen’);
rings.forEach(perform (r) { r.classList.take away(‘hidden’); });
}
rings.forEach(perform (ring) {
ring.addEventListener(‘click on’, perform (e) {
e.stopPropagation();
activate(ring.getAttribute(‘data-id’));
});
});
cardRing.addEventListener(‘click on’, perform (e) {
e.stopPropagation();
deactivate();
});
// Clicking anyplace else on the picture whereas a hotspot is open closes it
// and brings again all three markers, identical as clicking the open ring does.
stage.addEventListener(‘click on’, perform (e) {
if (activeId !== null && !card.comprises(e.goal)) {
deactivate();
}
});
doc.addEventListener(‘keydown’, perform (e) {
if (e.key === ‘Escape’) deactivate();
});
</script>
” title=”The elements of my customary presentation theme”>
You’ll discover that my template is uncomplicated, and that
simplicity lends me quite a lot of flexibility and energy when establishing
slides. My slides don’t have web page numbers, copyright notices, and even
firm logos, besides on the title slides. Slides aren’t paperwork,
so slide numbers are irrelevant to my shows. I don’t need to
sue anybody for copying my slides, so I normally omit the copyright
discover. And I need to introduce myself and my employer as soon as at first and
depart it there. From that time on, the brand is an avoidable visible
distraction. Taking away these floodmarks
(credit score: Neal Ford) affords me the posh of designing an empty
slide.
A observe about conferences
At conferences, individuals usually {photograph} your slides. You could possibly
add a copyright discover to every slide, however individuals can take away these
floodmarks utilizing phone-based modifying apps. I’m not fussed in the event that they
reuse the content material or design, or in the event that they attribute it to me. So, in
the
spirit of minimalism, I don’t add a copyright discover. I do
announce at first of the discuss that I’ll share a complete bunch of
leave-behinds. After I’m taking questions on the finish of a chat, I
throw up a slide with QR codes (instance beneath), so individuals who want
associated assets can entry them.

Determine 14: Use QR codes to share assets
together with your viewers.
For those who’re involved about copyright, you may present a set of
watermarked slides by your QR codes. Your slides will likely be
ineffective with out you, however those that need to reference them can have
them. The watermarked obtain will obviate the necessity for
floodmarks in your slides. Win!
A reusable color palette, a set of fonts and a clean slide —
that’s all it’s essential to deal with the primary determination area in your
shows — that of your template. Upon getting that template in
place, you may layer elements on high of it.

Determine 15: Templates — the primary determination
area for slide design.
Since we’ve already mentioned textual content and typography on this article,
we’ll soar to pictures and illustrations within the subsequent submit. I’ll
present you the best way to supply photographs and the best way to give them a constant look
in your presentation. You’ll additionally learn to make textual content play nicely
with photographs and how one can keep away from a few of the most typical antipatterns
when utilizing photographs in your slides. See you there.
