CelebrationScene.compose constructor

CelebrationScene.compose({
  1. ConfettiType? confettiType,
  2. AnimationConfetti? animation,
  3. ConfettiColorTheme? colorTheme,
  4. ConfettiStyle? style,
  5. ConfettiDensity? density,
})

Composes optional catalog knobs (ConfettiType, AnimationConfetti, ConfettiColorTheme, ConfettiStyle, ConfettiDensity) into one scene.

Layers merge in order: base type (or default Preset.nova) → animation tweak → shape style → density → color theme (explicit theme wins over type colors).

Implementation

factory CelebrationScene.compose({
  ConfettiType? confettiType,
  AnimationConfetti? animation,
  ConfettiColorTheme? colorTheme,
  ConfettiStyle? style,
  ConfettiDensity? density,
}) {
  final CelebrationScene base = confettiType != null
      ? CelebrationScene.fromConfettiType(confettiType)
      : const CelebrationScene(preset: Preset.nova);

  var preset = base.preset;
  ConfettiCustomization? cust = base.customization;

  if (animation != null) {
    preset = ConfettiAnimationMaps.presetFor(animation);
    cust = ConfettiCustomization.merge(
      cust,
      ConfettiAnimationMaps.extraCustomizationFor(animation),
    );
  }

  if (style != null) {
    cust = ConfettiCustomization.merge(
      cust,
      ConfettiCustomization(shapeMix: ConfettiStyleShapes.shapesFor(style)),
    );
  }

  if (density != null) {
    final scaled = ConfettiDensityScale.scaledCount(
      preset.defaultParticleCount,
      density,
    );
    cust = ConfettiCustomization.merge(
      cust,
      ConfettiCustomization(particleCount: scaled),
    );
  }

  if (colorTheme != null) {
    cust = ConfettiCustomization.merge(
      cust,
      ConfettiCustomization(colors: ConfettiColorThemes.palette(colorTheme)),
    );
  }

  return CelebrationScene(preset: preset, customization: cust);
}