Case Study · In Progress Constant Contact 2026 – Present

Summit: One System for Every Surface Constant Contact Ships

How I’m leading component standardization for Constant Contact’s unified design system — defining the Sheet and List Control building blocks that every mobile and web surface builds on, and building the documentation, prototypes, and decision records that make the system legible at scale.

5 → 1
Legacy systems consolidated into one platform
20+
Designers on one source of truth
60+
Engineers aligned to one implementation
mweb + mapp
Components designed across mobile web and native app
Convergence diagram showing five legacy design systems — Rise Design, Legacy UI, Mobile DS, Component Lib, and Product Fork — flowing into Summit, Constant Contact's unified design system.
Five legacy systems. One unified platform. Summit is the foundation every Constant Contact surface is built on.

Five systems, zero shared truth

Constant Contact is consolidating five fragmented design systems into Summit — one Figma library, one Storybook, one token system that 20+ designers and 60+ engineers can both trust. The mandate is consolidation. The opportunity is bigger: to build the system in an AI-native way from the start, so Summit’s naming, structure, and documentation are as legible to an AI agent as to a new designer.

My role in Summit is component design lead — owning the specification, documentation, and cross-functional alignment for the components that every mobile web and native app surface builds on. The two major active workstreams are Sheet and bottom sheet standardization and List Control Building Blocks. This case study covers both, along with the architectural principles that shape how I approach every component in the system.

Five systems. Zero truth.

Before Summit, auditing the Constant Contact component landscape meant confronting a matrix of contradictions: the same component — a button, a form input, a data table — designed and implemented five different ways across five different teams. No shared tokens. No accessibility standards. No single answer to “what does a primary button look like?”

The audit was where I earned the right to make architectural decisions. It revealed not just inconsistency but the structural root cause: there was no agreed-upon information architecture for the system itself — no shared naming conventions, no component hierarchy, no documentation standard. Before we could build one unified system, we had to define what that system’s own structure should be.

Design System Audit · Component Coverage Matrix
Component Area Rise ① Legacy UI ② Mobile DS ③ Comp. Lib ④ Product Fork ⑤
Buttons & CTAs ⚠ Inconsistent ⚠ Inconsistent ✓ Aligned ✕ Inaccessible ⚠ Forked
Typography ✓ Aligned ✕ Inaccessible ⚠ Inconsistent ⚠ Inconsistent ✕ Legacy
Form Inputs ⚠ Inconsistent ⚠ Inconsistent — Missing ✓ Aligned ⚠ Forked
Data Visualization — Missing ✕ Inaccessible — Missing ⚠ Inconsistent ✕ Color-only
Color Tokens ⚠ Primitives only ✕ Hardcoded ✕ Hardcoded ✕ Hardcoded ✕ Hardcoded

“The gap between design specification and production implementation wasn’t a process failure. It was a structural one. We didn’t need better handoff — we needed a system designers and engineers could both trust.”

What I’m building in Summit

Summit is not a side project — it’s the system every team at Constant Contact ships against. My contribution is in the hardest part: the components that show up everywhere, on every surface, across mweb and mapp. Getting those right requires more than good design. It requires written decisions, interactive specifications, stakeholder alignment, and documentation that doesn’t become stale the sprint after it’s published.

The two workstreams below represent that work in practice.

One rule, one component, every contextual overlay in the product

Before this initiative, Summit had two separate component sets — Sheet and Bottom Sheet — with inconsistent usage guidance, conflicting anatomy, and no clear rule for when to reach for one versus the other. Different product teams had made different calls, and the result was a fragmented overlay experience across mweb and mapp.

I led the standardization effort: a unified Sheet organism covering both surfaces, a single set of usage rules, and the documentation and prototypes that give teams a clear answer at the point of design rather than in review.

The one rule

Brief task → sheet. Sustained workflow → full page. If the interaction requires sustained attention, complex navigation, or more than three steps of drill-down, it belongs on its own page — not in a sheet.

That single rule resolved the majority of ambiguous cases. The rest of the guidelines — anatomy, drill-down behavior, sizing, keyboard handling, dismissal, adaptive layout — build from it.

Key decisions documented

Required ✕ Close on every sheet, every step — Not replaced by a footer Cancel button. Persists through drill-down so users always have a clear exit, regardless of where they are in the flow.
No stacked sheets — Drill-down replaces the body content in the same sheet rather than opening a second one. Recommended ceiling of three steps; beyond that, the flow takes over the full page.
Scrim is non-dismissible by default — Tapping the scrim does not close the sheet. The ✕ Close is the only guaranteed dismissal path, which prevents accidental data loss in form-heavy sheets.
Adaptive layout at 640px — The same component transitions between bottom sheet (mobile) and fixed 400px right panel (desktop) at the 640px breakpoint — in place, while open, without remounting.
Keyboard behavior specified — On mobile, the sheet resizes when the software keyboard opens. This is documented with a prototype toggle so engineering has a testable reference, not just a written spec.
Unified Figma organism — Deprecated the previously separate Bottom Sheet Figma set. One component set with 25 mobile variants and 1 desktop variant, all breakpoint-driven.

Prototypes as living specs

Written guidelines aren’t enough for complex interactive components. I built three interactive HTML prototypes that serve as executable references for engineering — not mockups, but functional demonstrations of the specified behavior:

Mobile sheet prototype — 9 scenarios covering short content, 90% max height, full-height expansion, persistent bar, truncated header, and drill-down through three steps with full-page handoff at step four. Includes a keyboard on/off toggle to demonstrate resize behavior.
Desktop panel prototype — Fixed 400px right panel with hover tooltip for truncated headers. No resize affordance on desktop.
Responsive transition prototype — Resize the viewport across the 640px breakpoint while the sheet is open; the component transitions between bottom sheet and right panel in place without closing.

Beyond the prototypes, I built a comprehensive guidelines document (Material 3–style, with sidebar navigation), a design review presentation deck for critique sessions, and a decision brief on drill-down step limits with industry comparisons. All artifacts are linked from the Summit documentation hub.

Two components, not one — and why the distinction matters

The second major workstream is Ninety’s — sorry, Constant Contact’s — list and row patterns. Before the audit, these were inconsistent across every surface: campaign lists, contact lists, settings rows, and navigation rows all made different structural decisions, with no shared anatomy or behavior model.

The audit surfaced a core architectural question that had never been explicitly answered: is a list row a single component, or is it two?

The core finding: Tile and List Item are two distinct, composable components. Tile is layout — it defines the three-zone structure (leading · content · trailing) and how those zones flex and truncate. List Item is behavior — it defines the interactive states (tap, hover, focus, selected, disabled). They compose together, but they’re not the same thing, and conflating them is what caused most of the inconsistency in production.

Audit findings

The layout rule is right; the application isn’t — The target anatomy (leading and trailing hug content; center column flexes and truncates; 16px gap) was the right call. But the campaign list violated it by putting an overflow menu in the center column, the highest-priority anti-pattern identified in the audit.
Three distinct interaction models — Navigate (tap → detail), Select (tap → toggle), and Checkbox (leading checkbox owns selection). These are not stylistic variants; they define fundamentally different behaviors and should not be mixed in the same list.
Not every row needs List Item — Three cases: row-level interactive (Tile + List Item), control-level interactive (Tile + child control), and static/display (Tile alone). Applying List Item to non-interactive rows was causing unnecessary complexity in engineering.
Contacts is the gold standard for responsive — Desktop DataTable → narrow card list at breakpoint, with truncation before layout swap. This pattern became the reference implementation for how list components should handle responsive behavior across mweb and mapp.

The audit findings were packaged into shareable visual guides (Tile vs. List Item, Three Interaction Models), an interactive prototype demonstrating the three-zone anatomy with live zone highlighting, a side-by-side campaign list comparison showing production vs. proposed Tile-based layout, and a generated PPTX stakeholder readout for the CPD-20568 epic review.

The most important decision in the project

I built Summit’s token system as the structural backbone — the layer that makes future rebranding, dark mode, and white-labeling possible without touching a single component. Two layers: primitives (raw values) and semantics (meaning).

A button doesn’t know it’s blue. It knows it uses color.action.primary. Change the primitive, and every surface updates. This distinction is the difference between a design system that stays current and one that needs a ground-up rebuild every two years.

The token architecture also creates a traceable pipeline: Figma variables → design tokens → Storybook-validated components. Changes flow in one direction. The semantic layer means a theme change or rebrand updates Figma and code simultaneously — not through a manual sync between two sources that are always slightly out of date with each other.

Impossible to fail by accident

Accessibility at most companies is a checklist — something audited after components ship. At Summit, I made it a design constraint at the token layer. Color contrast was enforced structurally: using semantic tokens correctly made it impossible to ship a non-compliant combination. The question shifted from “does this pass?” to “how do we make it structurally impossible to fail?”

This matters even more in an AI-assisted workflow. If an AI agent is generating UI from Summit components, accessibility should be guaranteed by the system itself — not dependent on the agent making the right color choice.

Before Summit
Save Changes 2.8:1 contrast
Save Changes No focus ring
Save Changes Hardcoded hex

Three buttons. Three visual languages. Zero shared tokens.

After Summit
Save Changes 4.5:1 AA ✓
Save Changes Focus ring ✓
color.action.primary Semantic ✓

One standard. Structurally impossible to fail.

Color-only charts fail 8% of users by design

Constant Contact’s reporting surfaces are data-dense: open rates, click rates, subscriber trends, benchmark comparisons. Before Summit, every team built its own charts. Color-only differentiation was endemic — fine for most users, invisible to roughly 1-in-12.

I built a data viz framework that addressed color-only differentiation structurally. Categorical palettes were designed with non-color encoding as a requirement, not an afterthought: line style and marker shape carry information independently of hue. The result is charts that pass WCAG without visual compromise.

Color-only differentiation
Color-only · Fails for ~8% of users
Summit accessible palette
Color + dash + shape · Accessible by construction

Built to be legible to agents, not just designers

As AI-assisted design and development workflows have become real at Constant Contact, a design system faces a new kind of consumer: AI agents that need to understand, select, and apply the right primitives without a human making every micro-decision. Summit was built with this in mind from the start.

The insight I kept returning to: naming is documentation. A token named color.action.primary tells an agent what the token is for. A component named InsightCard.dismissible carries its own usage context. The information architecture of the system itself — how things are named, organized, and described — determines whether an AI agent asked to “build the campaign results screen” reaches for the right primitives or invents new ones.

Naming as machine-readable intent — Every token, component, and pattern was named for its role and context, not its appearance. color.feedback.warning instead of color.yellow. Appearance changes. Intent doesn’t.
Structured documentation — Usage rationale, do/don’t examples, and decision records were written to be scannable by both humans and machine parsing. The goal was documentation that people — and agents — actually use, not documentation that exists to prove the system was documented.
Unambiguous component APIs — Components with well-defined props, explicit states, and documented variants reduce ambiguity for engineers and AI-assisted tooling alike. A component that requires interpretive judgment to use correctly is a component that will be used incorrectly at scale.
Human review gates, explicitly defined — AI can audit, tag, and surface inconsistencies in the system. What it shouldn’t do autonomously: make naming decisions, introduce new patterns, deprecate existing ones, or sign off on accessibility. Those gates exist for a reason, and Summit’s governance model defines them explicitly rather than assuming someone will catch it.

The test I apply: if a designer prompts an AI agent to build a screen using Summit, does the agent reach for InsightCard or does it reinvent it? If the system’s naming and documentation are good enough, the agent gets it right without a human correcting it afterward. That’s the bar Summit is designed to meet.

Low governance tax. High adoption.

A common failure mode: ship a beautiful system, publish it to Figma, and watch it fragment over the next eighteen months because the contribution process is too heavy and the workaround is easier. Summit’s governance model was designed around a core belief: if contributing to the system costs more than forking, people will fork.

That meant designing the process for real teams under real deadline pressure — not the idealized workflow those teams wish they had. Any designer, engineer, or PM can propose a new pattern. The intake process is lightweight: a brief that captures the problem statement, what alternatives were considered, and the intended adoption scope. No proposal committee. No lengthy review cycle.

Contribution must have a path
Open without becoming a bottleneck

Any designer, engineer, or PM can propose. A structured intake brief captures the problem, alternatives considered, and adoption scope — lightweight enough to complete in under an hour.

Component lifecycle end-to-end
Versioning, release notes, deprecations

Every change ships with release notes and a deprecation window. Nothing is removed without a migration path. Teams don’t fear updates because they’re never surprised by them.

Adoption is a design problem
Design for real behavior, not ideal behavior

The system has to be easier to use than whatever workaround a team would reach for. Every point of friction in the contribution or adoption process is a risk that someone forks instead.

The system must evolve
Architecture for the organization’s future

Summit v1 was a foundation, not a finalization. The token architecture supports rebrands, new platforms, and new AI interaction patterns without a ground-up rebuild.

What changes when the foundation is right

5 → 1
Systems consolidated into one platform
Single source
One Figma library, one Storybook, one token pipeline
A11y default
WCAG compliance built in — not audited after the fact
Rebrand-ready
Semantic tokens support rebranding without component rework
Velocity
Designers stopped rebuilding primitives and started shipping product work
Agent-ready
Named, documented, and structured for AI-assisted workflows

The impact of Summit isn’t visible in any single shipped screen. It’s visible in what stopped happening: the design review arguments over button styles, the accessibility tickets filed in production, the sprint delays from ambiguous specs, the onboarding friction of learning five systems before you could contribute to one.

And it’s visible in what’s now possible: AI-assisted design and development workflows that reach for Summit primitives and produce something shippable — not something that has to be rebuilt because it diverged from the system.

What I’d carry forward

Audit first, even under pressure

The audit is where you earn the right to make architectural decisions. The organizations most eager to skip it are the ones who most need it — because the politics of “we don’t have time” are exactly what created five systems in the first place. The audit also surfaces the highest-leverage consolidation opportunities, so you can sequence the work to build credibility through early visible impact rather than disappearing into a 12-month foundation project.

Naming is the system’s IA

The information architecture of the system itself — naming conventions, component hierarchy, documentation structure — is not a style preference. It determines whether the system is navigable by new designers, by AI agents, by engineers who weren’t in the room when it was built. Get the IA wrong and adoption becomes a training problem instead of a system quality problem.

Tokens are a strategy, not a setting

The semantic layer isn’t a theming convenience — it’s a decision about whether your system can support the business in ten years. That conversation belongs in design leadership, not a Figma file. Getting exec buy-in on the token architecture was as important as building it.

Governance is a product

Design the process for the actual behavior of real people under real constraints. If contributing to the system is heavier than copying a component and moving on, people will copy and move on. The governance model that survives is the one that’s easier to use than the workaround — and that has a defined lifecycle for every component, not just the ones that caused a problem.

Build for the next consumer, not just the current one

When we built Summit, the next consumer of the system was an AI agent. Naming, documentation structure, and component APIs that are unambiguous for a human are doubly important for an agent that can’t ask a clarifying question. The systems that will hold up over the next decade are the ones designed with that consumer in mind from the start.