Skip to content
BaseLayer Themes

At A Glance 02

Scroll-synced list with sticky media

Live preview

How it works

Scroll through each capability — the preview stays pinned while the active item updates as you move down the list.

Developer workspace with laptopMarketing site previewHeadless CMS workflowPerformance and SEO metricsHeadless CMS workflowPerformance and SEO metrics

A - Core skill

Frontend Development

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

Developer workspace with laptop

B - Deliverable

Marketing Sites

High-converting landing pages and multi-page marketing sites. SEO-ready, CMS-connected, and easy for your team to update.

C - Integration

Headless CMS

Sanity, Contentful, or Markdown — structured content models, preview workflows, and editor-friendly Studio setups.

D - Outcome

Performance & SEO

Core Web Vitals optimization, semantic markup, structured data, and sitemaps. Sites that rank and load fast.

E - Integration

Headless CMS

Sanity, Contentful, or Markdown — structured content models, preview workflows, and editor-friendly Studio setups.

F - Outcome

Performance & SEO

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.

Config (blocks.tsatAGlanceScroller)

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.",
      },
    ],
  },

Add to a page

---
import AtAGlance02 from "@/blocks/at-a-glance/AtAGlance02.astro";
---

<AtAGlance02 />

Props override matching keys from config:

<AtAGlance02
  width="wide"
  imagePosition="left"
  heading="Custom headline"
/>

Props

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.

← At a glance versions · Images · Blocks overview