Skip to content

ADR-0002 — Primitive neutrality: fulldev/ui carries an aesthetic fingerprint

Status: Accepted (finding); decision on tier-2/3 primitive layer deferred Date: 2026-05-03 Deciders: Cathal Dempsey Related: ADR-0001 (component library foundation: fulldev/ui)

Context

ADR-0001 chose fulldev/ui as the FCR section-library foundation. An open risk noted in that decision: do fulldev's ~35 primitives (Button, Badge, Input, Field, Avatar, Tile, Card) carry an aesthetic fingerprint that survives token swaps? If yes, every FCR client site shares a visual DNA regardless of brand colours, which is a problem for tier-2/3 distinctive redesigns.

This was tested with three deployed pages, identical primitives, three brand palettes (navy #1A3258, orange #D86E1A, red #C8102E). Only the CSS variables --primary, --secondary, --accent, --ring differ; no component-level overrides.

Pages: - https://master.wcp-fulldev.pages.dev/primitives/navy/ - https://master.wcp-fulldev.pages.dev/primitives/orange/ - https://master.wcp-fulldev.pages.dev/primitives/red/

Finding

Confirmed: fulldev's primitives carry an aesthetic fingerprint. With colours genuinely different across the three pages, the user's read was unambiguous: "same brand wearing different paint."

The aesthetic identity is being carried by: - Border-radius (uniform rounded-md and rounded-4xl across components) - Focus ring (consistent ring-3 thickness and spread) - Shadow language on cards / tiles (same elevation depth) - Hover state (consistent bg-primary/80 darken behaviour) - Field/input borders and label/description typography - Button proportions (height, padding, gap)

These are largely hard-coded Tailwind class compositions, not exposed as overridable CSS variables. Token swaps at the colour level cannot override them without forking each primitive.

Decision

Accept fulldev primitives for tier-1 work; defer tier-2/3 decision.

Tier-1 (the bulk of the FCR pipeline — 1800 replatformed Wix sites)

Keep fulldev primitives. A consistent, professional house style across the FCR portfolio is acceptable and arguably desirable for this segment: - Small-business clients (painters, electricians, dentists) want professional and on-brand-colour, not distinctive. - Maintainability across 1800 sites favours a uniform primitive layer. - Fork rate to date is 1 component (cta-wcp.astro) per site.

Tier-2/3 (premium redesigns, distinctive verticals)

Defer the decision. No premium client is currently in flight. When one materialises, three paths are available:

  1. Expand fulldev's primitive token surface. Lift hard-coded values (radius, shadow elevation, focus ring thickness, button proportions) into CSS variables on a per-site basis. Cheapest if it works; ~1 day to widen the token contract on Button/Card/Input/Tile. Worth a quick A/B test before committing to path 2 or 3 — a fourth primitive page swapping colour AND --radius would tell us how much of the fingerprint is radius alone.
  2. bejamas/ui as primitive base. Write our own section blocks on top of bejamas primitives (or fulldev's blocks adapted to bejamas primitives). More work; only viable if path 1 fails.
  3. Hand-rolled primitives. Most control, most effort. Reserved for high-margin distinctive client work where the design budget warrants it.

The tier-2/3 path will be picked when a real premium client comes in, not pre-emptively.

Consequences

Positive

  • Tier-1 work proceeds on fulldev with full confidence.
  • Tier-2/3 path is documented and ready when needed.
  • The finding itself was cheap to surface (~1 hour) — saves an expensive surprise mid-project.

Negative / risks

  • Tier-2/3 work blocks on the primitive-layer decision when it lands. Mitigation: the three paths above are scoped; landing the decision shouldn't take more than a week of work.
  • Sites within the FCR portfolio will share a visual fingerprint. For small-business replatform work this is acceptable; if FCR markets itself as a "distinctive design" agency, it's a positioning conflict.

When to revisit

  • A premium client lands (>£30k design budget). Pick a tier-2/3 path before kickoff.
  • The fork rate from ADR-0001 (custom variants per site) exceeds 20% across 5+ sites. May indicate the primitive layer is the wrong base even for tier-1.
  • fulldev/ui releases a major version that widens its primitive token surface (radius/shadow/etc. as overridable vars). Could cheap-fix the fingerprint without a primitive swap.

References

  • Test: pilots/wcp-fulldev/src/pages/primitives/{navy,orange,red}.astro
  • Showcase: pilots/wcp-fulldev/src/components/PrimitiveShowcase.astro
  • ADR-0001 (foundation choice)
  • Memory: feedback_fulldev_chosen.md, feedback_visual_variation_as_props.md, feedback_primitive_fingerprint.md