A -
Frontend Development
Pixel-perfect implementations with Astro, React, and Tailwind. Performance budgets, accessibility, and responsive design baked in.

Scroll-synced list with sticky media
Live preview
Scroll through each capability — the preview stays pinned while the active item updates as you move down the list.






A -
Pixel-perfect implementations with Astro, React, and Tailwind. Performance budgets, accessibility, and responsive design baked in.

B -
High-converting landing pages and multi-page marketing sites. SEO-ready, CMS-connected, and easy for your team to update.
C -
Sanity, Contentful, or Markdown — structured content models, preview workflows, and editor-friendly Studio setups.
D -
Core Web Vitals optimization, semantic markup, structured data, and sitemaps. Sites that rank and load fast.
E -
Sanity, Contentful, or Markdown — structured content models, preview workflows, and editor-friendly Studio setups.
F -
Core Web Vitals optimization, semantic markup, structured data, and sitemaps. Sites that rank and load fast.
File: src/blocks/at-a-glance/AtAGlance02.astro
Scroll-synced list with sticky media. As the page scrolls, the nearest list item becomes active and updates the media panel.
Mobile: sticky media is hidden; each item shows its own image.
blocks.ts → atAGlanceScroller)atAGlanceScroller: {
define: "alphabetical",
width: "wide",
imageBleed: false,
imagePosition: "left",
heading: "How it works",
subheading:
"Scroll through each capability — the preview stays pinned while the active item updates as you move down the list.",
stickyTop: 150,
activeTrigger: 60, // viewport height % where the active item switches (0–100)
items: [
{
image: photos.interior,
imageAlt: "Developer workspace with laptop",
meta: "Core skill",
title: "Frontend Development",
description:
"Pixel-perfect implementations with Astro, React, and Tailwind. Performance budgets, accessibility, and responsive design baked in.",
},
{
image: photos.karla,
imageAlt: "Marketing site preview",
meta: "Deliverable",
title: "Marketing Sites",
description:
"High-converting landing pages and multi-page marketing sites. SEO-ready, CMS-connected, and easy for your team to update.",
},
{
image: photos.edgar,
imageAlt: "Headless CMS workflow",
meta: "Integration",
title: "Headless CMS",
description:
"Sanity, Contentful, or Markdown — structured content models, preview workflows, and editor-friendly Studio setups.",
},
{
image: photos.interior,
imageAlt: "Performance and SEO metrics",
meta: "Outcome",
title: "Performance & SEO",
description:
"Core Web Vitals optimization, semantic markup, structured data, and sitemaps. Sites that rank and load fast.",
},
{
image: photos.edgar,
imageAlt: "Headless CMS workflow",
meta: "Integration",
title: "Headless CMS",
description:
"Sanity, Contentful, or Markdown — structured content models, preview workflows, and editor-friendly Studio setups.",
},
{
image: photos.interior,
imageAlt: "Performance and SEO metrics",
meta: "Outcome",
title: "Performance & SEO",
description:
"Core Web Vitals optimization, semantic markup, structured data, and sitemaps. Sites that rank and load fast.",
},
],
},
---
import AtAGlance02 from "@/blocks/at-a-glance/AtAGlance02.astro";
---
<AtAGlance02 />
Props override matching keys from config:
<AtAGlance02
width="wide"
imagePosition="left"
heading="Custom headline"
/>
| Prop | Config key | Type / values | Default / notes |
|---|---|---|---|
sectionId |
atAGlanceScroller.sectionId |
string |
Default "at-a-glance"; DOM id for the section; not in config |
define |
atAGlanceScroller.define |
numerical | alphabetical | none |
Item label prefixes (1, 2… / A, B… / none) |
width |
atAGlanceScroller.width |
standard | narrow | wide |
Wrapper max-width |
imageBleed |
atAGlanceScroller.imageBleed |
boolean |
Bleed media past the content container |
imagePosition |
atAGlanceScroller.imagePosition |
left | right (desktop) |
Desktop image side; mobile stacking varies by block |
heading |
atAGlanceScroller.heading |
string |
— |
subheading |
atAGlanceScroller.subheading |
string |
— |
stickyTop |
atAGlanceScroller.stickyTop |
number |
Sticky media offset from viewport top (px) |
activeTrigger |
atAGlanceScroller.activeTrigger |
number |
Viewport height % (0–100) for scroll-sync activation on desktop; mobile uses 20% |
items |
atAGlanceScroller.items |
Array of { image?, imageAlt?, meta?, title?, description? } — image is LocalImageSource |
Content list for this block |
Also include: AtAGlanceLayout.astro. Returns null if items is empty.