</> ConvertAtlas Developer Tools
Portfolio & Resume · Advanced

Sofia Lindqvist — Photographer Portfolio

A large, image-led photographer portfolio with a full-screen hero, shoot categories, a masonry gallery with hover captions, an about section with stats, pricing packages, client stories, an Instagram grid and a booking form — elegant serif type on a warm dark palette.

Uses Bootstrap 5. Bootstrap 5 plus the CDN tag below. The downloaded file already includes everything.
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<nav class="ph-nav" data-rv>
  <a class="ph-brand" href="#top">SOFIA L</a>
  <div class="ph-links"><a href="#categories">Work</a><a href="#gallery">Gallery</a><a href="#about">About</a><a href="#packages">Packages</a><a href="#book">Book</a></div>
</nav>

<header id="top" class="ph-hero">
  <div class="ph-hero-bg"></div>
  <div class="ph-hero-inner">
    <span class="ph-eyebrow" data-rv>Photographer · Riga &amp; worldwide</span>
    <h1 data-rv>Sofia Lindqvist</h1>
    <p data-rv>Capturing light, emotion and the quiet moments in between. Weddings, portraits and editorial stories told with honesty.</p>
    <a class="ph-btn" data-rv href="#gallery">Explore the gallery</a>
  </div>
  <div class="ph-scroll" data-rv>scroll</div>
</header>

<section id="categories" class="ph-sec">
  <div class="ph-head" data-rv><span class="ph-kick">What I shoot</span><h2>Categories</h2></div>
  <div class="ph-cats">
    <a class="ph-cat" data-rv href="#" style="background:linear-gradient(160deg,#3a4a5a,#1a232c)"><span class="ph-cat-tag">48 stories</span><h3>Weddings</h3></a>
    <a class="ph-cat" data-rv href="#" style="background:linear-gradient(160deg,#6b4a3a,#2c211a)"><span class="ph-cat-tag">120 sessions</span><h3>Portraits</h3></a>
    <a class="ph-cat" data-rv href="#" style="background:linear-gradient(160deg,#4a3a5a,#221a2c)"><span class="ph-cat-tag">30 features</span><h3>Editorial</h3></a>
    <a class="ph-cat" data-rv href="#" style="background:linear-gradient(160deg,#3a5a4a,#1a2c22)"><span class="ph-cat-tag">60 trips</span><h3>Travel</h3></a>
  </div>
</section>

<section id="gallery" class="ph-sec">
  <div class="ph-head" data-rv><span class="ph-kick">Portfolio</span><h2>Selected frames</h2></div>
  <div class="ph-masonry">
    <figure class="ph-shot" data-rv><div style="height:320px;background:linear-gradient(135deg,#e8a87c,#c38d6b)"></div><figcaption>Golden hour · Liepāja</figcaption></figure>
    <figure class="ph-shot" data-rv><div style="height:240px;background:linear-gradient(135deg,#5c7a8a,#374a56)"></div><figcaption>Coastal portrait</figcaption></figure>
    <figure class="ph-shot" data-rv><div style="height:380px;background:linear-gradient(135deg,#8a6c8c,#5a4560)"></div><figcaption>Eva &amp; Mark · wedding</figcaption></figure>
    <figure class="ph-shot" data-rv><div style="height:260px;background:linear-gradient(135deg,#7a8a5c,#4a5637)"></div><figcaption>Forest light study</figcaption></figure>
    <figure class="ph-shot" data-rv><div style="height:300px;background:linear-gradient(135deg,#b08968,#7d5e44)"></div><figcaption>Editorial · Vogue LV</figcaption></figure>
    <figure class="ph-shot" data-rv><div style="height:230px;background:linear-gradient(135deg,#687a8a,#3f4d57)"></div><figcaption>City evening</figcaption></figure>
  </div>
</section>

<section id="about" class="ph-about">
  <div class="ph-about-grid">
    <div class="ph-about-img" data-rv></div>
    <div class="ph-about-text" data-rv>
      <span class="ph-kick">About me</span>
      <h2>Behind the lens</h2>
      <p>I've spent the last 11 years chasing light across 9 countries. My work lives in the honest, unposed moments — a held breath before a kiss, the laugh nobody planned.</p>
      <p>Featured in Vogue Latvia, published in three photo books, and trusted by 300+ couples to tell the story of their day.</p>
      <div class="ph-about-stats"><div data-count="300"><b>0</b><span>Weddings</span></div><div data-count="11"><b>0</b><span>Years</span></div><div data-count="9"><b>0</b><span>Countries</span></div></div>
    </div>
  </div>
</section>

<section id="packages" class="ph-sec">
  <div class="ph-head" data-rv><span class="ph-kick">Investment</span><h2>Packages</h2></div>
  <div class="ph-packs">
    <div class="ph-pack" data-rv><h3>Portrait</h3><div class="ph-amt">€280</div><ul><li>1.5-hour session</li><li>1 location</li><li>30 edited photos</li><li>Online gallery</li></ul><a class="ph-btn ph-btn-out" href="#book">Book portrait</a></div>
    <div class="ph-pack ph-pack-pop" data-rv><span class="ph-pop">Signature</span><h3>Wedding</h3><div class="ph-amt">€1,900</div><ul><li>Full-day coverage</li><li>Second shooter</li><li>400+ edited photos</li><li>Premium album</li><li>Engagement session</li></ul><a class="ph-btn ph-btn-fill" href="#book">Book wedding</a></div>
    <div class="ph-pack" data-rv><h3>Editorial</h3><div class="ph-amt">€650</div><ul><li>Half-day shoot</li><li>Concept &amp; styling</li><li>50 edited photos</li><li>Commercial license</li></ul><a class="ph-btn ph-btn-out" href="#book">Book editorial</a></div>
  </div>
</section>

<section id="stories" class="ph-sec ph-sec-dark">
  <div class="ph-head" data-rv><span class="ph-kick ph-kick-l">Client stories</span><h2 class="ph-h2-l">In their words</h2></div>
  <div class="ph-tests">
    <figure class="ph-test" data-rv><blockquote>"Sofia captured our wedding exactly as it felt — not how it looked. We cry happy tears every time we open the album."</blockquote><figcaption><span class="ph-av" style="background:#e8a87c">EM</span><div><b>Eva &amp; Mark</b><em>Wedding, 2025</em></div></figcaption></figure>
    <figure class="ph-test" data-rv><blockquote>"The most relaxed photo session I've ever had. Somehow she made me forget the camera was even there."</blockquote><figcaption><span class="ph-av" style="background:#8a6c8c">LR</span><div><b>Liene R.</b><em>Portrait, 2025</em></div></figcaption></figure>
    <figure class="ph-test" data-rv><blockquote>"Professional, punctual and wildly talented. Our editorial shoot exceeded every expectation."</blockquote><figcaption><span class="ph-av" style="background:#5c7a8a">VK</span><div><b>Vogue LV</b><em>Editorial team</em></div></figcaption></figure>
  </div>
</section>

<section id="instagram" class="ph-sec">
  <div class="ph-head" data-rv><span class="ph-kick">Follow along</span><h2>@sofia.captures</h2></div>
  <div class="ph-ig">
    <a class="ph-ig-cell" data-rv href="#" style="background:linear-gradient(135deg,#e8a87c,#c38d6b)"></a>
    <a class="ph-ig-cell" data-rv href="#" style="background:linear-gradient(135deg,#5c7a8a,#374a56)"></a>
    <a class="ph-ig-cell" data-rv href="#" style="background:linear-gradient(135deg,#8a6c8c,#5a4560)"></a>
    <a class="ph-ig-cell" data-rv href="#" style="background:linear-gradient(135deg,#7a8a5c,#4a5637)"></a>
    <a class="ph-ig-cell" data-rv href="#" style="background:linear-gradient(135deg,#b08968,#7d5e44)"></a>
    <a class="ph-ig-cell" data-rv href="#" style="background:linear-gradient(135deg,#687a8a,#3f4d57)"></a>
  </div>
</section>

<section id="book" class="ph-book" data-rv>
  <h2>Let's tell your story</h2>
  <p>Now booking weddings and sessions for 2026. Reach out and let's create something timeless.</p>
  <form class="ph-form" onsubmit="return false">
    <div class="ph-row"><input type="text" placeholder="Your name"><input type="email" placeholder="Email"></div>
    <input type="text" placeholder="Date &amp; type of shoot">
    <button class="ph-btn ph-btn-fill ph-btn-block">Request availability</button>
  </form>
</section>

<footer class="ph-foot">
  <div class="ph-foot-inner"><a class="ph-brand" href="#top">SOFIA L</a><div class="ph-social"><a href="#">Instagram</a><a href="#">Pinterest</a><a href="#">Email</a></div></div>
  <div class="ph-foot-bottom"><span>© 2026 Sofia Lindqvist Photography</span><span>Made with <a href="https://convertatlas.org" target="_blank" rel="noopener">convertatlas.org</a></span></div>
</footer>
*{box-sizing:border-box}
body{margin:0;background:#14110e;color:#ece5dc;font-family:'Inter',system-ui,-apple-system,'Segoe UI',sans-serif;overflow-x:hidden;line-height:1.6}
a{text-decoration:none;color:inherit}
.ph-serif{font-family:Georgia,'Times New Roman',serif}
.ph-btn{display:inline-block;padding:13px 28px;border-radius:0;font-weight:600;font-size:.9rem;letter-spacing:.06em;text-transform:uppercase;cursor:pointer;border:0;transition:.18s}
.ph-btn-fill{background:#ece5dc;color:#14110e}.ph-btn-fill:hover{background:#c9a063;color:#14110e}
.ph-btn-out{border:1px solid #5a5249;color:#ece5dc}.ph-btn-out:hover{border-color:#c9a063;color:#c9a063}
.ph-btn-block{width:100%}
.ph-kick{font-size:.76rem;font-weight:600;letter-spacing:.22em;text-transform:uppercase;color:#c9a063}
.ph-kick-l{color:#c9a063}
.ph-brand{font-weight:700;letter-spacing:.3em;font-size:1rem}
.ph-nav{position:fixed;top:0;left:0;right:0;z-index:60;display:flex;align-items:center;justify-content:space-between;padding:20px 36px;mix-blend-mode:difference}
.ph-links{display:flex;gap:28px}.ph-links a{color:#fff;font-size:.82rem;letter-spacing:.1em;text-transform:uppercase}.ph-links a:hover{color:#c9a063}
.ph-hero{position:relative;height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;overflow:hidden}
.ph-hero-bg{position:absolute;inset:0;background:linear-gradient(160deg,#2c2419,#14110e),radial-gradient(circle at 70% 30%,rgba(201,160,99,.25),transparent 55%);background-blend-mode:screen}
.ph-hero-bg::after{content:"";position:absolute;inset:0;background:linear-gradient(transparent,rgba(20,17,14,.6))}
.ph-hero-inner{position:relative;max-width:680px;padding:0 24px}
.ph-eyebrow{font-size:.78rem;letter-spacing:.24em;text-transform:uppercase;color:#c9a063}
.ph-hero h1{font-family:Georgia,serif;font-size:clamp(3rem,9vw,6rem);font-weight:400;line-height:1;margin:18px 0 18px;letter-spacing:.01em}
.ph-hero p{color:#bcb2a5;font-size:1.1rem;max-width:480px;margin:0 auto 30px}
.ph-scroll{position:absolute;bottom:28px;left:50%;transform:translateX(-50%);font-size:.72rem;letter-spacing:.2em;text-transform:uppercase;color:#8a8175;animation:phFloat 2s infinite}
@keyframes phFloat{0%,100%{transform:translate(-50%,0)}50%{transform:translate(-50%,8px)}}
.ph-sec{max-width:1140px;margin:0 auto;padding:80px 36px}
.ph-sec-dark{background:#0d0b09;max-width:none;padding-left:0;padding-right:0}
.ph-sec-dark .ph-head,.ph-sec-dark .ph-tests{max-width:1140px;margin-left:auto;margin-right:auto;padding-left:36px;padding-right:36px}
.ph-head{text-align:center;margin-bottom:46px}
.ph-head h2{font-family:Georgia,serif;font-size:clamp(2rem,5vw,3.2rem);font-weight:400;margin:10px 0 0}
.ph-h2-l{color:#ece5dc}
.ph-cats{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}
.ph-cat{height:300px;border-radius:4px;display:flex;flex-direction:column;justify-content:flex-end;padding:22px;position:relative;overflow:hidden;transition:.3s}
.ph-cat::after{content:"";position:absolute;inset:0;background:linear-gradient(transparent 40%,rgba(0,0,0,.5));transition:.3s}
.ph-cat:hover{transform:translateY(-6px)}
.ph-cat-tag{position:relative;z-index:1;font-size:.72rem;letter-spacing:.12em;text-transform:uppercase;color:#c9a063;margin-bottom:6px}
.ph-cat h3{position:relative;z-index:1;font-family:Georgia,serif;font-size:1.5rem;font-weight:400;margin:0}
.ph-masonry{column-count:3;column-gap:16px}
.ph-shot{break-inside:avoid;margin:0 0 16px;position:relative;overflow:hidden;border-radius:4px;cursor:pointer}
.ph-shot div{transition:transform .5s}.ph-shot:hover div{transform:scale(1.05)}
.ph-shot figcaption{position:absolute;left:0;right:0;bottom:0;padding:14px 16px;font-family:Georgia,serif;background:linear-gradient(transparent,rgba(0,0,0,.7));font-size:.9rem;opacity:0;transition:.3s}
.ph-shot:hover figcaption{opacity:1}
.ph-about{max-width:1140px;margin:0 auto;padding:60px 36px}
.ph-about-grid{display:grid;grid-template-columns:.9fr 1.1fr;gap:50px;align-items:center}
.ph-about-img{height:440px;border-radius:6px;background:linear-gradient(135deg,#6b5640,#2c241a),radial-gradient(circle at 30% 30%,rgba(201,160,99,.4),transparent 50%);background-blend-mode:screen}
.ph-about-text h2{font-family:Georgia,serif;font-size:clamp(2rem,4vw,2.8rem);font-weight:400;margin:10px 0 16px}
.ph-about-text p{color:#bcb2a5;margin:0 0 16px}
.ph-about-stats{display:flex;gap:40px;margin-top:24px}
.ph-about-stats b{font-family:Georgia,serif;font-size:2.4rem;color:#c9a063}
.ph-about-stats span{display:block;font-size:.78rem;letter-spacing:.1em;text-transform:uppercase;color:#8a8175}
.ph-packs{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;align-items:start}
.ph-pack{border:1px solid #2c2820;border-radius:4px;padding:32px 28px;transition:.22s}
.ph-pack:hover{border-color:#c9a063}
.ph-pack-pop{border-color:#c9a063;position:relative;background:rgba(201,160,99,.05)}
.ph-pop{position:absolute;top:-12px;left:50%;transform:translateX(-50%);background:#c9a063;color:#14110e;font-size:.7rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;padding:4px 14px}
.ph-pack h3{font-family:Georgia,serif;font-size:1.4rem;font-weight:400;margin:0 0 8px}
.ph-amt{font-family:Georgia,serif;font-size:2.4rem;color:#c9a063;margin-bottom:18px}
.ph-pack ul{list-style:none;padding:0;margin:0 0 24px}
.ph-pack li{padding:8px 0;font-size:.9rem;color:#bcb2a5;border-bottom:1px solid #221e17}
.ph-pack li::before{content:"— ";color:#c9a063}
.ph-tests{display:grid;grid-template-columns:repeat(3,1fr);gap:20px}
.ph-test{margin:0;border:1px solid #221e17;border-radius:4px;padding:28px;transition:.22s}
.ph-test:hover{border-color:#c9a063}
.ph-test blockquote{font-family:Georgia,serif;font-size:1.05rem;line-height:1.7;margin:0 0 20px;color:#d8cfc3}
.ph-test figcaption{display:flex;align-items:center;gap:12px}
.ph-av{width:42px;height:42px;border-radius:50%;display:grid;place-items:center;color:#14110e;font-weight:700;font-size:.84rem}
.ph-test figcaption b{display:block;font-size:.92rem}.ph-test figcaption em{font-style:normal;color:#8a8175;font-size:.8rem}
.ph-ig{display:grid;grid-template-columns:repeat(6,1fr);gap:10px}
.ph-ig-cell{aspect-ratio:1;border-radius:3px;transition:.25s}
.ph-ig-cell:hover{transform:scale(1.06);filter:brightness(1.15)}
.ph-book{max-width:680px;margin:40px auto;padding:60px 36px;text-align:center}
.ph-book h2{font-family:Georgia,serif;font-size:clamp(2rem,5vw,3rem);font-weight:400;margin:0 0 12px}
.ph-book p{color:#bcb2a5;margin:0 auto 28px;max-width:440px}
.ph-form{max-width:460px;margin:0 auto}
.ph-row{display:flex;gap:12px}
.ph-form input{width:100%;background:transparent;border:1px solid #2c2820;border-radius:0;padding:13px 16px;color:#fff;font-family:inherit;font-size:.92rem;outline:none;margin-bottom:12px}
.ph-form input:focus{border-color:#c9a063}
.ph-form input::placeholder{color:#6e665b}
.ph-foot{max-width:1140px;margin:0 auto;padding:40px 36px}
.ph-foot-inner{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:16px;padding-bottom:20px;border-bottom:1px solid #221e17}
.ph-social{display:flex;gap:22px}.ph-social a{color:#8a8175;font-size:.82rem;letter-spacing:.08em;text-transform:uppercase}.ph-social a:hover{color:#c9a063}
.ph-foot-bottom{display:flex;justify-content:space-between;flex-wrap:wrap;gap:10px;padding-top:18px;color:#6e665b;font-size:.84rem}
.ph-foot-bottom a{color:#c9a063}
@media(max-width:860px){.ph-cats,.ph-packs,.ph-tests{grid-template-columns:1fr 1fr}.ph-masonry{column-count:2}.ph-about-grid{grid-template-columns:1fr}.ph-ig{grid-template-columns:repeat(3,1fr)}}
@media(max-width:600px){.ph-links{display:none}.ph-cats,.ph-packs,.ph-tests{grid-template-columns:1fr}.ph-masonry{column-count:1}.ph-row{flex-direction:column}}
[data-rv]{opacity:0;transform:translateY(26px);transition:opacity .7s ease,transform .7s ease}[data-rv].in{opacity:1;transform:none}
var io=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){e.target.classList.add('in');if(e.target.hasAttribute('data-bar')){e.target.querySelectorAll('[data-w]').forEach(function(b){b.style.width=b.getAttribute('data-w')})}if(e.target.hasAttribute('data-count')){var t=+e.target.getAttribute('data-count'),el=e.target,s=null;requestAnimationFrame(function st(ts){if(!s)s=ts;var p=Math.min((ts-s)/1500,1);el.firstChild.textContent=Math.floor((1-Math.pow(1-p,3))*t).toLocaleString();if(p<1)requestAnimationFrame(st)})}io.unobserve(e.target)}})},{threshold:.18});
document.querySelectorAll('[data-rv],[data-bar],[data-count]').forEach(function(el){io.observe(el)});
Free to use — no attribution required. This is a complete, responsive Bootstrap 5 page. It uses Bootstrap 5 via CDN (linked above). Download a ready-to-open .html file with all CDN links included, or copy the HTML and drop it into your project.

What's included in this template

The Sofia Lindqvist — Photographer Portfolio is a complete portfolio & resume design with realistic demo content — ready to preview, copy or download as a single responsive HTML file. Key features:

  • Full-screen cinematic hero
  • Shoot category tiles
  • Masonry gallery with hover captions
  • Pricing packages
  • Client stories + Instagram grid
  • Booking form, serif/gold aesthetic

How to use it

Open the live preview above to see the full design at desktop, tablet and mobile widths. When you are happy with it, use Download to save a single photographer-portfolio.html file, or Copy to grab the source. All required libraries load from public CDNs, so the file works the moment you open it — just replace the demo content with your own and publish.