AETumi — AI-native 3D web platform for Three.js, WebGL and interactive websites
News & Guides

Component Reuse in Agency Web Design: The DRY System

September 8, 2026 · AETumi

Key answer: Component reuse in agency web design is the practice of building client sites from one owned, versioned library of framework-native components — configured per client through props and design tokens — instead of rebuilding the same hero, card, nav, and 3D scene from scratch on every project. Done well it removes the repeated mechanical build, so a studio ships faster and fixes bugs once for every client at the same time. Done badly it makes every client site look identical and buries the team in a rigid abstraction. The line between the two is variant design and a token layer: reuse the structure and behavior, vary the surface and the one signature moment per project.

Table of contents

What component reuse means for an agency

Component reuse in agency web design is a delivery discipline: instead of writing a new hero, card grid, pricing table, navigation, and 3D scene for every client, a studio maintains one owned library of components and configures them per project. The component defines structure, behavior, accessibility, and performance once. The client-specific parts — palette, type, imagery, copy, and the model in a 3D scene — arrive through props and design tokens, not through a rewrite. That separation is the whole idea: the reusable part is the engineering, the varying part is the art direction.

One connected systemAETumi technical diagram — One connected systemUI YOUOWNTyped propsAccessibleThemableServer/ClientStatesSource
One connected system
Image Stream Hero
Image Stream Hero — live preview from the AETumi library

This is different from "using a template." A template is a finished page you fill in and can barely change. A reusable component is a parameterized building block you compose into a new layout each time. An agency running component reuse well can produce two client sites that share zero visible resemblance while sharing ninety percent of their code. The value shows up on the second, tenth, and fiftieth project, when the mechanical build that used to eat a week is a day of composition and theming. The agency workflow guide puts this stage in the context of the full brief-to-ship pipeline.

Why reuse decides agency margin

Agency profit lives in the gap between what a build should cost and what it actually costs. The invisible cost is repetition — rebuilding the same accordion, the same responsive card, the same WebGL hero for the third client this quarter, each time reintroducing the same bugs and the same accessibility gaps. Component reuse in agency web design attacks that cost directly: the repeated build becomes a configuration, and a fix to the shared card fixes it for every site that consumes it.

Scroll Morph Hero
Scroll Morph Hero — live preview from the AETumi library

There is a second, quieter payoff. A shared library concentrates quality. When accessibility, keyboard handling, focus order, reduced-motion, and a performance budget live inside the component, every client site inherits them by default. A junior composing a page from the library cannot easily ship an inaccessible card, because the accessibility is not their decision — it is already in the part. That is how a small team holds a senior quality bar across many projects without a senior touching every line. The risk, covered below, is that reuse taken too far produces sameness and rigidity; the system exists to prevent exactly that.

The workflow, end to endAETumi technical diagram — The workflow, end to endStartfrom owned sourceAdaptprops & variantsWireserver/client boundaryHandleloading/empty/errorShip& reuse
The workflow, end to end

The reuse system model

A healthy reuse system is three layers, and only the top layer changes per client:

Colonnade
Colonnade — live preview from the AETumi library

1. Primitives — buttons, inputs, typography, layout grid, a canvas wrapper. Highly reused, rarely varied, heavily tested. 2. Composites — hero sections, card grids, pricing tables, a scroll-scrub 3D sequence. Reused, varied through props and slots. 3. Client skin — the design-token layer plus content and the one bespoke signature moment. This is where distinctiveness is manufactured on purpose.

The property that keeps the system alive is that variation flows downward through configuration, never through forking. When a client needs a different look, you change tokens and props at layer three, not the component at layer one. If a client genuinely needs behavior no component supports, you add a variant to the component so the whole library gains the capability, rather than copy-pasting a one-off. Forking is the failure mode: two divergent copies of the same card is how a reuse system quietly rots back into per-project rebuilds.

Implementation: structure, tokens, variants

Concretely, three mechanisms carry the load. Design tokens externalize every client-varying value — color, radius, spacing scale, motion timing, font — into CSS custom properties or a theme object, so re-skinning is a data change, not a code change. Variant props let one component express its legitimate shapes: a card that is elevated | flat | bordered, a hero that is left | center | split. Composition — slots and children — lets you assemble a unique layout from shared parts without the parts knowing about each other.

Showcase Equator
Showcase Equator — live preview from the AETumi library

The combination is what avoids the two failure modes at once. Tokens prevent the "everything looks the same" problem, because two clients with different token sets produce visibly different sites from identical components. Variants prevent the "fork everything" problem, because a new requirement extends the component instead of duplicating it. And composition prevents rigidity, because the page layout is assembled fresh each project even though the pieces are old. When you pair this with an AI coding assistant — the subject of the AI web design for agencies guide — the assistant does the composition and theming against your owned library, which is where its speed is safe.

Code: reuse without sameness

The demos below show the three mechanisms as real, framework-native code. Each is short because that is the point of reuse — the complexity lives in the library, not in the per-client work.

A variant-driven component. One card, several legitimate shapes, selected by prop — not by forking the file:

export function Card({ variant = 'flat', children }) {
  const styles = {
    flat:     'bg-[var(--surface)]',
    elevated: 'bg-[var(--surface)] border border-[var(--line)]',
    bordered: 'bg-transparent border border-[var(--brand)]',
  };
  return <div className={`rounded-[var(--radius)] p-6 ${styles[variant]}`}>{children}</div>;
}

Every visible value comes from a token, and every shape comes from a controlled variant. Expected behavior: three distinct looks from one tested component. Trade-off: keep the variant list short and meaningful — an open-ended variant string invites the sameness and the sprawl you were avoiding.

The client skin as tokens. Re-theming a whole site is editing this block, not the components:

:root {                     /* client A */
  --brand: #8a5cf6; --surface: #0b0b0f; --line: #232334;
  --radius: 16px; --motion: 240ms; --font: 'Söhne', system-ui;
}
[data-client="riva"] {      /* client B, same components */
  --brand: #c8a15a; --surface: #14110c; --line: #2c2618;
  --radius: 2px;  --motion: 500ms; --font: 'GT Sectra', serif;
}

Expected behavior: the same Card, hero, and nav render as two unrelated brands. Trade-off: tokens govern color, radius, and rhythm, but they cannot manufacture a signature moment — that still needs hand art direction, which is deliberate.

A shared 3D scene reused by props. The most valuable reuse is the expensive part — a Three.js hero — configured per client rather than rebuilt:

import { Canvas } from '@react-three/fiber';
import { HeroModel } from './HeroModel';

export function Hero3D({ model, accent, intensity = 1.2 }) {
  return (
    <Canvas dpr={[1, 2]} camera={{ position: [0, 0, 6] }}>
      <ambientLight intensity={0.4} />
      <directionalLight position={[3, 5, 2]} intensity={intensity} color={accent} />
      <HeroModel url={model} />
    </Canvas>
  );
}

One art-directed rig; the client supplies a model URL and an accent. Expected behavior: a bespoke-feeling 3D hero in one line of composition. Trade-off: a shared rig implies a shared lighting language — when a client needs a truly different mood, add a preset variant rather than editing the shared file. See the React Three Fiber collection for the underlying patterns.

Versioning the library so a fix reaches every client safely. Reuse only pays off if updates propagate under control. Pin the library as an internal package and use semver:

{
  "dependencies": {
    "@studio/ui": "^2.4.0"
  }
}

Expected behavior: a patch to the shared Card (2.4.1) flows to every site on ^2.4.0 on their next install; a breaking change becomes 3.0.0 and no client upgrades by accident. Trade-off: this demands discipline — a careless breaking change in a "patch" can regress ten client sites at once, so the shared library needs its own review bar and a changelog.

Real product evidence

The clearest proof that reuse produces distinctive, not generic, output is seeing the same component library rendered as two unrelated brands. The demo below shows a production 3D hero — the expensive composite from the code above — running in the browser, then re-skinned through nothing but its token layer and a swapped model. Watch what it proves: the structure, motion, and frame rate are identical because the engineering is shared, while the palette, type, material, and pacing read as a completely different studio's work because the client skin is not. That is the tell of a mature reuse system: one codebase, many identities. Rebuilding this hero per client would cost the same hours three times and drift in quality each time.

Performance of a shared library

A shared library is where you win or lose performance across the whole portfolio, because a budget encoded in the component is inherited by every site that uses it. Bake the discipline into the parts: cap device pixel ratio on the canvas wrapper, compress geometry with Draco or meshopt and textures to KTX2/Basis in the shared 3D composite, lazy-load heavy components behind a dynamic import, and pause any render loop when its canvas scrolls offscreen. The reuse advantage is compounding — optimize the shared hero once and every current and future client benefits, versus re-earning the same performance on each rebuild. The failure to avoid is a library that ships a heavy dependency into every bundle whether the page uses it or not; keep the 3D and animation code behind code-splitting so a simple page stays light.

Accessibility baked into the component

The strongest argument for component reuse in agency web design is that accessibility becomes structural rather than per-project heroics. When semantic markup, keyboard reachability, visible focus, real labelling, and a prefers-reduced-motion path live inside the component, every client site inherits WCAG-aligned behavior by default — which matters enormously for public-sector, finance, and enterprise clients whose contracts require it. A card that manages its own focus order, a canvas wrapper that renders a static poster under reduced-motion, a button that is a real <button> — these are decisions you make once in the library and never relitigate. Reuse turns accessibility from a line item you can forget into a property the components carry, though it still needs an audit pass per client because content and composition can introduce issues no component can prevent.

Production trade-offs

Reuse is not free leverage. Over-abstraction is the classic tax: a component so parameterized that using it is harder than writing fresh code, its props sprawling to cover every past client. Coupling risk is real too — a breaking change in a shared part can regress every consumer, so the library needs versioning, a changelog, and its own review discipline. Upfront cost is unavoidable: the first two or three projects on a new library are slower, not faster, because you are building the library while building the site; the payoff arrives later. And there is a distinctiveness tax if you lean on reuse for the signature element — the one bespoke moment per project must stay hand-directed, or your sites converge. Be honest about all four; reuse is a compounding investment, not an instant discount.

When to reuse a component

SituationWhy reuse fits
The same pattern appears across ≥3 client projectsBuild once, configure many; the fix propagates
Accessibility or performance must hold across a portfolioEncode it in the component; every site inherits it
A junior-heavy team needs a senior quality barQuality lives in the part, not the person
Client sites share structure but need distinct brandsTokens + variants manufacture difference safely
An expensive asset (3D hero) recursReuse the rig, swap model and accent per client

When NOT to reuse

SituationDo this instead
A pattern used exactly once, everBuild it inline; abstraction is premature
The project's whole value is bespoke craftHand-build the signature element; do not template it
Reuse would require 12 props to fitSplit into two components or accept two variants
A one-page throwaway landingA simple static build beats library overhead
The shared part would need a breaking forkAdd a variant, or the reuse system is rotting

Decision matrix: reuse strategies

StrategySpeed after rampDistinctivenessMaintenanceBest for
Rebuild every project from scratchLowHighHigh cost, driftsRare bespoke pieces
Rent one closed templateHighLow — sites convergeLocked, can't fixThrowaway pages
Copy-paste last project, editMediumMediumWorst — many forksNothing; it rots
Owned versioned library + tokens/variantsHighHigh (if skinned)Fix once, propagatesAgency client work at volume

The matrix isolates the winner: an owned, versioned library configured through tokens and variants is the only strategy that combines post-ramp speed, per-client distinctiveness, and fix-once maintenance. Copy-paste reuse looks like the same thing but is its opposite — it multiplies forks instead of consolidating them.

Expert Notes

Expert Note — Reuse the structure, hand-build the signature. The safe boundary is behavioral versus expressive. Reuse everything that is structure, behavior, accessibility, and performance; keep the one moment that makes a site memorable — the hero transition, the bespoke layout — as hand-directed work. Agencies that reuse the signature element are the ones whose sites start to look identical. Reuse is a floor for quality, not a ceiling for craft.

Expert Note — A shared component needs a stricter review than a client feature. A bug in a one-off section hurts one site; a bug in the shared Card hurts every client at once. Treat the library like production infrastructure: semver, a changelog, and a review pass on every change. The versioning is not bureaucracy — it is what lets a fix reach fifty sites without an accidental regression on any of them.

Expert Note — Count props before you abstract. If fitting a new client to a component takes more than a handful of props, you have over-abstracted. Split the component or add one clean variant instead of growing a configuration monster. The goal of reuse is less work per project, and a twelve-prop component quietly costs more than the code it was meant to replace.

GitHub and technical proof

The owned-source pattern this article describes is demonstrated in the agency starter at github.com/AETumiApp/aetumi-agency-starter, part of the AETumiApp organization. It ships the reuse primitives concretely: a design-token layer for per-client theming, a variant-based component approach, a shared capped-DPR React Three Fiber canvas, and a GLTF hero-swap example that reuses one rig across clients — the exact mechanisms in the code demos above. The Three.js code targets r160 via ES modules, so it runs on a modern module setup rather than a legacy global build. Be honest about limits: the starter is a skeleton showing the reuse patterns and fallback plumbing, not a finished component library or a full page catalog — you bring art direction, client content, and the depth of the library over time. It is proof that the code is real, readable, and yours to extend, not a drop-in product.

How AETumi approaches it

AETumi is an AI-native 3D web platform built so component reuse is the default path. The library ships production-ready Three.js and WebGL scenes plus Next.js and React components as editable, framework-native source — the reusable parts an agency configures per client through tokens and props. Because you own the source, reuse never means renting one template every studio prints; it means composing a distinct site from parts you control. The commercial model fits agency reuse directly: buy once, own for life — Standard $19, Pro $39, Premium $99, and Full Stack $129, where Full Stack adds the complete source library plus the AETumi MCP so an AI coding assistant can compose and theme against your owned components inside your real project. Browse the 3D website library at aetumi.app and compare plans on the pricing page.

What to prioritizeAETumi technical diagram — What to prioritizeRecommended priority weighting90Editablesource you own85Accessibilitybuilt in75Themabletokens70Typed &documented80States handled
What to prioritize

FAQ

Does component reuse make every client site look the same? Only if you reuse the wrong layer. Reuse structure, behavior, accessibility, and performance; vary the surface through a design-token layer and keep one hand-directed signature moment per project. Two clients with different token sets and different bespoke moments produce visibly unrelated sites from identical components. Sameness comes from reusing the expressive layer, not the engineering.

How is a reusable component different from a template? A template is a finished page you fill in and can barely restructure. A reusable component is a parameterized building block you compose into a new layout each project, configured by props and tokens. Templates constrain the page; components constrain only the part, leaving you free to assemble a unique layout every time from shared, tested pieces.

When does component reuse stop paying off? When a pattern is genuinely used once, when fitting a client needs a dozen props, or when the value of the work is bespoke craft. Premature abstraction and over-parameterized components cost more than they save. Reuse pays off on patterns that recur across three or more projects; below that threshold, build it inline and abstract later if it repeats.

Can an AI assistant work with a reusable component library? Yes, and it is where the assistant is safest. Pointed at your owned, versioned library, an AI coding assistant composes pages and edits tokens against real, reviewable files rather than generating an opaque site. The library constrains its output to your tested parts, so speed does not cost quality. See the AI web design for agencies guide for the full workflow.

How do we update a shared component without breaking client sites? Version the library as an internal package with semantic versioning and a changelog. A patch propagates on the next install to every site on a compatible range; a breaking change becomes a new major version no client adopts by accident. The discipline that makes reuse safe is treating the library like production infrastructure, with a review pass on every change.

Conclusion

Component reuse in agency web design is the difference between charging for the same build repeatedly and building it once well, then selling the composition and the art direction. Reuse the structure, behavior, accessibility, and performance in an owned, versioned library; manufacture distinctiveness through a token layer, controlled variants, and one hand-directed signature moment per client. That system ships premium sites faster without convergence, and it concentrates quality where a small team can hold a senior bar across many projects. Start from the agency workflow, study the aetumi-agency-starter source, and compare plans at aetumi.app/pricing.

More from the AETumi library

Real, production-ready assets — preview the motion, grab the source.

Browse all 3D components →