Brik Design System
Motion

Vocabulary

Animation Tier and Image Mood — locked enums the portal captures, the source of truth for which motion tier a mockup worker is allowed to use.

Two locked enums pair the Motion system to the client portal. When a client's animation tier or image mood is captured during onboarding, it carries forward into every mockup variant — the motion worker reads the tier to decide which libraries to load and which effects Claude is allowed to generate.

Animation Tier

The animation_tier field captured in the client portal's Visual Direction intel topic. It is a single-select — the client picks exactly one. The tier carries forward from onboarding through design preflight into every mockup variant.

This value is the source of truth for which motion tier a mockup worker is allowed to use. It is imported from content-system/vocabularies/animation-tier.ts and consumed by the portal via company_profiles.animation_tier (migration 00127). Never hardcode these values in consumer code — import ANIMATION_TIER_VALUES from this source.

Values

ValueMotion TierWhat it unlocks
subtleLightweight.fade-up IntersectionObserver only. No GSAP. No premium effects. Transitions exist but do not call attention to themselves. Appropriate for professional services, law, healthcare contexts where motion confidence is low.
moderateGSAPFade-ups, SplitText hero H1, stat counters, hover lifts, CSS animated gradient. Motion is present and intentional but not the lead design element. Appropriate for most service businesses and small practices.
expressivePremiumSplitText, ScrollTrigger parallax, staggered card entrances, Granim.js gradient, Lenis smooth scroll. Motion is a design material, not a finishing coat. Appropriate for clients who reference brands like Daylight Computer or Legend.xyz.

Programmatic access

import {
  ANIMATION_TIER_VALUES,
  type AnimationTier,
  isAnimationTier,
} from '@brikdesigns/bds/content-system';

// The 3 valid values at runtime
console.log(ANIMATION_TIER_VALUES); // ['subtle', 'moderate', 'expressive']

// Type-safe guard
function resolveMotionConfig(tier: string) {
  if (!isAnimationTier(tier)) throw new Error(`Unknown tier: ${tier}`);
  // tier is narrowed to AnimationTier here
}

The portal reads company_profiles.animation_tier (type text, constrained by app-level validation to ANIMATION_TIER_VALUES). The mockup worker's resolveAnimationTierNote() resolver reads this field and decides:

  • Which CDN libraries to include in the mockup head
  • Which BDS CSS files to reference
  • Which effect classes Claude is permitted to generate in the mockup HTML

Drift warning: if the tier values here and the portal's intake form get out of sync, clients pick a value that silently resolves to nothing in the worker. isAnimationTier() is the runtime guard — use it at the API boundary before persisting.

Tier-to-page cross-reference

Each value maps directly to a tier documentation page:

Image Mood

The image_mood field captured in the client portal's Visual Direction intel topic. Multi-select 1–3 — a brand often blends moods (e.g. editorial × clinical for a luxury medical practice, or lifestyle × documentary for real estate). Stored on company_profiles.image_mood (text[], migration 00127).

This vocabulary is distinct from VISUAL_STYLE_VALUES — visual style describes overall aesthetic (typographic, structural), image mood describes how imagery is composed and lit. It is imported from content-system/vocabularies/image-mood.ts and consumed by the portal via client-facts.imageMoods (the field that downstream services read). Never hardcode these values in consumer code — import IMAGE_MOOD_VALUES from this source.

Values

ValueConnotationTypical fit
editorialMagazine-styled, composed, aspirationalLuxury hospitality, high-end services, design-forward brands
clinicalClean, precise, sterileMedical, dental, legal, pharmaceutical
photojournalisticCandid, moment-in-time, real eventsEditorial publications, event-driven brands, agencies
lifestylePeople in context, warm, aspirational daily lifeReal estate, wellness, hospitality, consumer brands
abstractNon-representational, textural, artisticTech, creative agencies, brands de-emphasizing literal imagery
documentaryUnposed, real, environmental portraitureNonprofits, healthcare with authenticity focus, MHC/RV / housing

Programmatic access

import {
  IMAGE_MOOD_VALUES,
  type ImageMood,
  isImageMood,
} from '@brikdesigns/bds/content-system';

// The 6 valid values at runtime
console.log(IMAGE_MOOD_VALUES);
// ['editorial', 'clinical', 'photojournalistic', 'lifestyle', 'abstract', 'documentary']

// Type-safe guard
function tagStockAsset(mood: string) {
  if (!isImageMood(mood)) throw new Error(`Unknown mood: ${mood}`);
  // mood is narrowed to ImageMood here
}

The portal reads company_profiles.image_mood (type text[]) and exposes it to:

  • The mockup generator's image prompts
  • The stock-asset picker (which photos to source)
  • The design preflight (image-approach validation)

Drift warning: if the values here and the portal's intake form get out of sync, clients pick a value that silently resolves to nothing in downstream image-direction logic. isImageMood() is the runtime guard — use it at the API boundary before persisting, and at any free-text ingestion point (e.g. stock-asset library tags) before storing.

Mood-to-atmosphere natural pairings

Image mood pairs with atmosphere choice — each atmosphere reinforces a mood without locking it. These are suggestions, not constraints; clients can mix:

Image moodNatural atmosphere pairing
editorialeditorial-luxury
clinicalminimal-clinical
lifestylewarm-soft
documentaryclean-bright or none
photojournalisticatmosphere-agnostic (leans none or clean-bright)
abstractatmosphere-agnostic (often pairs with cinematic-dramatic for theatrical brands)

On this page