Fjord Bank’s app had 140 screens and five navigation patterns. Every team had added its feature where it fit at the time, and after ten years nobody could find anything.
The support team answered 4,200 questions a month, and most of them were the same: where is my card, how do I pay a bill, why can’t I see my savings?
02
The approach
We started with the people, not the screens. In two weeks we talked to 24 customers and listened to 60 support calls.
Mapped every task to its screen, and every screen to its traffic
Tested the navigation with paper prototypes in three branches
Agreed on one principle: one screen, one job
We didn’t need more features. We needed fewer, in the right place.
Jonas Berg, CPO
03
The solution
The new app has four tabs instead of eleven menus. The home screen shows the balance, the next payment and one clear action, and everything else is one tap away.
The spending overview replaced three separate reports.
04
The design system
To keep the app calm after we left, we built a small design system with the engineers: tokens, 32 components and the rules for using them, in Figma and in code.
Every component was tested with VoiceOver and TalkBack before it shipped, which is why the screen reader issues stayed at zero.
<sectionclass="story-block"aria-labelledby="story-title"data-story><divclass="container"><divclass="story-block__inner"><h2class="sr-only"id="story-title">The story</h2><navclass="story-block__nav"aria-labelledby="story-nav-title"><pclass="story-block__nav-title"id="story-nav-title">In this case study</p><olclass="story-block__toc"role="list"><li><aclass="story-block__toc-link"href="#challenge"data-story-link><spanclass="story-block__toc-number"aria-hidden="true">01</span>The challenge</a></li><li><aclass="story-block__toc-link"href="#approach"data-story-link><spanclass="story-block__toc-number"aria-hidden="true">02</span>The approach</a></li><li><aclass="story-block__toc-link"href="#solution"data-story-link><spanclass="story-block__toc-number"aria-hidden="true">03</span>The solution</a></li><li><aclass="story-block__toc-link"href="#system"data-story-link><spanclass="story-block__toc-number"aria-hidden="true">04</span>The design system</a></li></ol></nav><divclass="story-block__content"><articleclass="story-block__chapter"id="challenge"aria-labelledby="challenge-title"data-story-chapter><divclass="story-block__heading"><pclass="story-block__eyebrow"aria-hidden="true">01</p><h3class="story-block__title"id="challenge-title">The challenge</h3></div><p>Fjord Bank’s app had 140 screens and five navigation patterns. Every team had added its feature where it fit at the time, and after ten years nobody could find anything.</p><p>The support team answered 4,200 questions a month, and most of them were the same: where is my card, how do I pay a bill, why can’t I see my savings?</p></article><articleclass="story-block__chapter"id="approach"aria-labelledby="approach-title"data-story-chapter><divclass="story-block__heading"><pclass="story-block__eyebrow"aria-hidden="true">02</p><h3class="story-block__title"id="approach-title">The approach</h3></div><p>We started with the people, not the screens. In two weeks we talked to 24 customers and listened to 60 support calls.</p><ulclass="story-block__list"><li>Mapped every task to its screen, and every screen to its traffic</li><li>Tested the navigation with paper prototypes in three branches</li><li>Agreed on one principle: one screen, one job</li></ul><figureclass="story-block__quote"><blockquote><p>We didn’t need more features. We needed fewer, in the right place.</p></blockquote><figcaption>Jonas Berg, CPO</figcaption></figure></article><articleclass="story-block__chapter"id="solution"aria-labelledby="solution-title"data-story-chapter><divclass="story-block__heading"><pclass="story-block__eyebrow"aria-hidden="true">03</p><h3class="story-block__title"id="solution-title">The solution</h3></div><p>The new app has four tabs instead of eleven menus. The home screen shows the balance, the next payment and one clear action, and everything else is one tap away.</p><figureclass="story-block__figure"><imgsrc="https://images.unsplash.com/photo-1551288049-bebda4e38f71?auto=format&fit=crop&w=1400&q=70"alt="The spending overview with a chart of the monthly expenses."width="1400"height="900"loading="lazy"><figcaption>The spending overview replaced three separate reports.</figcaption></figure></article><articleclass="story-block__chapter"id="system"aria-labelledby="system-title"data-story-chapter><divclass="story-block__heading"><pclass="story-block__eyebrow"aria-hidden="true">04</p><h3class="story-block__title"id="system-title">The design system</h3></div><p>To keep the app calm after we left, we built a small design system with the engineers: tokens, 32 components and the rules for using them, in Figma and in code.</p><p>Every component was tested with VoiceOver and TalkBack before it shipped, which is why the screen reader issues stayed at zero.</p></article></div></div></div></section>
(()=>{
document.querySelectorAll('[data-story]').forEach((block)=>{const links =[...block.querySelectorAll('[data-story-link]')];const chapters =[...block.querySelectorAll('[data-story-chapter]')];if(!('IntersectionObserver'in window)||!links.length){return;}// Mark the link of the chapter that is in the reading area (the upper part of the viewport).constsetCurrent=(id)=>{
links.forEach((link)=>{if(link.hash ===`#${id}`){
link.setAttribute('aria-current','true');}else{
link.removeAttribute('aria-current');}});};const observer =newIntersectionObserver((entries)=>{
entries.forEach((entry)=>{if(entry.isIntersecting){setCurrent(entry.target.id);}});},{rootMargin:'-20% 0px -60% 0px'});
chapters.forEach((chapter)=> observer.observe(chapter));});})();
Story
On this page
The long-form part of a case study or a report: chapters with text, lists, a pull quote and figures, next to a chapter list that follows the reader.
Technical Details
The block has a visually hidden h2; every chapter is an article with an h3 and an id, so the chapter list (a nav with an ordered list) links to them and they can be shared.
On wide screens the chapter list is sticky. The script marks the chapter in the reading area with aria-current="true" (an IntersectionObserver, no scroll listener); without JavaScript the links still work.
The chapter numbers are decorative (aria-hidden); the order of the list carries them.
The text column is limited to about 44rem for a comfortable line length; the chapters use the lead font size.
Pull quotes are a figure with a blockquote and a figcaption for the source; figures always have a caption.
Override the content with storyBlock: every chapter takes paragraphs, and optionally a list, a quote and a figure.
Documentation
Learn about Spruce CSS through our extensive documentation.