Skip to content

Document is not defined  #112

Open
@ironmanu

Description

@ironmanu

Details

Details
Description:
I'm encountering an error with particle rendering in an Angular 18 environment. Despite having the error, the particles are rendering, but it would be nicer not having that error

Error:
Screenshot 2024-06-06 at 22 04 09

Steps to Reproduce:
Set up an Angular 18 project environment.
Integrate particle rendering functionality.

Environment:
Angular CLI: 18.0.2
Node: 18.19.33
TS 5.4.5
OS: macOS x64

Angular: 17.3.0
... animations, cdk, common, compiler, compiler-cli, core, forms
... material, platform-browser, platform-browser-dynamic, router

Package Version
@angular-devkit/build-angular@18.0.2
@angular/animations@18.0.1
@angular/cli@18.0.2
@angular/common@18.0.1
@angular/compiler-cli@18.0.1
@angular/compiler@18.0.1
@angular/core@18.0.1
@angular/forms@18.0.1
@angular/platform-browser-dynamic@18.0.1
@angular/platform-browser@18.0.1
@angular/platform-server@18.0.1
@angular/router@18.0.1
@angular/ssr@18.0.2

Particle rendering library/version: @tsparticles/angular
Additional Information:
These are the libraries and versions used:
@tsparticles/angular@3.0.0
@tsparticles/engine@3.4.0
@tsparticles/slim@3.4.0

My component:

import { AfterViewInit, Component, Inject, PLATFORM_ID } from '@angular/core';
import {
  MoveDirection,
  OutMode,
  CollisionMode,
  LimitMode,
  DestroyType,
  AnimationMode,
  StartValueType,
  InteractivityDetect,
  DivType,
  PixelMode,
  Move,
} from '@tsparticles/engine';
import { NgParticlesService, NgxParticlesModule } from '@tsparticles/angular';
import { loadSlim } from '@tsparticles/slim';
import { isPlatformBrowser } from '@angular/common';

@Component({
  selector: 'app-home',
  standalone: true,
  imports: [NgxParticlesModule],
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.scss'],
})
export class HomeComponent implements AfterViewInit {
  id = 'tsparticles';

  particlesOptions = {
    autoPlay: true,
    background: {
      color: {
        value: '#11294D',
      },
      opacity: 1,
    },
    clear: true,
    delay: 0,
    fullScreen: {
      enable: true,
      zIndex: 0,
    },
    detectRetina: true,
    duration: 0,
    fpsLimit: 120,
    interactivity: {
      detectsOn: InteractivityDetect.window,
      events: {
        onClick: {
          enable: false,
          mode: 'push',
        },
        onDiv: {
          enable: false,
          type: DivType.circle,
        },
        onHover: {
          enable: true,
          mode: 'bubble',
          parallax: {
            enable: false,
            force: 2,
            smooth: 10,
          },
        },
        resize: {
          delay: 0.5,
          enable: true,
        },
      },
      modes: {
        trail: {
          delay: 1,
          pauseOnStop: false,
          quantity: 1,
        },
        attract: {
          distance: 200,
          duration: 0.4,
          easing: 'ease-out-quad',
          factor: 1,
          maxSpeed: 30,
          speed: 0.3,
        },
        bounce: {
          distance: 200,
        },
        bubble: {
          distance: 400,
          duration: 2,
          mix: true,
          opacity: 0.8,
          color: {
            value: '#ff0000',
          },
          size: 40,
          divs: {
            distance: 200,
            duration: 0.4,
            mix: false,
          },
        },
        connect: {
          distance: 80,
          links: {
            opacity: 0.5,
          },
          radius: 60,
        },
        grab: {
          distance: 400,
          links: {
            blink: false,
            consent: false,
            opacity: 1,
          },
        },
        push: {
          default: true,
          quantity: 4,
        },
        remove: {
          quantity: 2,
        },
        repulse: {
          distance: 200,
          duration: 0.4,
          factor: 100,
          speed: 1,
          maxSpeed: 30,
          easing: 'ease-out-quad',
          divs: {
            distance: 200,
            duration: 0.4,
            factor: 100,
            speed: 1,
            maxSpeed: 30,
            easing: 'ease-out-quad',
            selectors: {},
          },
        },
        slow: {
          factor: 3,
          radius: 200,
        },
        light: {
          area: {
            gradient: {
              start: {
                value: '#ffffff',
              },
              stop: {
                value: '#000000',
              },
            },
            radius: 1000,
          },
          shadow: {
            color: {
              value: '#000000',
            },
            length: 2000,
          },
        },
      },
    },
    particles: {
      bounce: {
        horizontal: {
          value: 1,
        },
        vertical: {
          value: 1,
        },
      },
      collisions: {
        absorb: {
          speed: 2,
        },
        bounce: {
          horizontal: {
            value: 1,
          },
          vertical: {
            value: 1,
          },
        },
        enable: false,
        maxSpeed: 30,
        mode: CollisionMode.bounce,
        overlap: {
          enable: true,
          retries: 0,
        },
      },
      color: {
        value: '#f56e0f',
        animation: {
          h: {
            count: 0,
            enable: false,
            speed: 1,
            decay: 0,
            delay: 0,
            sync: true,
            offset: 0,
          },
          s: {
            count: 0,
            enable: false,
            speed: 1,
            decay: 0,
            delay: 0,
            sync: true,
            offset: 0,
          },
          l: {
            count: 0,
            enable: false,
            speed: 1,
            decay: 0,
            delay: 0,
            sync: true,
            offset: 0,
          },
        },
      },
      effect: {
        close: true,
        fill: true,
      },
      move: {
        angle: {
          offset: 0,
          value: 90,
        },
        attract: {
          distance: 200,
          enable: false,
          rotate: {
            x: 3000,
            y: 3000,
          },
        },
        center: {
          x: 50,
          y: 50,
          mode: PixelMode.percent,
          radius: 0,
        },
        decay: 0,
        direction: MoveDirection.none,
        drift: 0,
        enable: true,
        gravity: {
          acceleration: 9.81,
          enable: false,
          inverse: false,
          maxSpeed: 50,
        },
        path: {
          clamp: true,
          delay: {
            value: 0,
          },
          enable: false,
        },
        outModes: {
          default: OutMode.out,
        },
        random: false,
        size: false,
        speed: 5,
        spin: {
          acceleration: 0,
          enable: false,
        },
        straight: false,
        trail: {
          enable: false,
          length: 10,
          fill: {},
        },
        vibrate: false,
        warp: false,
      },
      number: {
        density: {
          enable: true,
          width: 1920,
          height: 1080,
        },
        limit: {
          mode: LimitMode.delete,
          value: 0,
        },
        value: 6,
      },
      opacity: {
        value: {
          min: 0.3,
          max: 0.7,
        },
        animation: {
          count: 0,
          enable: false,
          speed: 2,
          decay: 0,
          delay: 0,
          sync: false,
          mode: AnimationMode.auto,
          startValue: StartValueType.random,
          destroy: DestroyType.none,
        },
      },
      reduceDuplicates: false,
      shadow: {
        blur: 0,
        color: {
          value: '#000',
        },
        enable: false,
        offset: {
          x: 0,
          y: 0,
        },
      },
      shape: {
        close: true,
        fill: true,
        options: {
          polygon: {
            sides: 6,
          },
        },
        type: 'polygon',
      },
      size: {
        value: {
          min: 100,
          max: 150,
        },
        animation: {
          count: 0,
          enable: false,
          speed: 3,
          decay: 0,
          delay: 0,
          sync: false,
          mode: AnimationMode.auto,
          startValue: StartValueType.random,
          destroy: DestroyType.none,
        },
      },
      stroke: {
        width: 0,
      },
      zIndex: {
        value: 0,
        opacityRate: 1,
        sizeRate: 1,
        velocityRate: 1,
      },
      destroy: {
        bounds: {},
        mode: 'none',
        split: {
          count: 1,
          factor: {
            value: 3,
          },
          rate: {
            value: {
              min: 4,
              max: 9,
            },
          },
          sizeOffset: true,
        },
      },
      roll: {
        darken: {
          enable: false,
          value: 0,
        },
        enable: false,
        enlighten: {
          enable: false,
          value: 0,
        },
        mode: 'vertical',
        speed: 25,
      },
      tilt: {
        value: 0,
        animation: {
          enable: false,
          speed: 0,
          decay: 0,
          sync: false,
        },
        direction: -90,
        enable: false,
      },
      twinkle: {
        lines: {
          enable: false,
          frequency: 0.05,
          opacity: 1,
        },
        particles: {
          enable: false,
          frequency: 0.05,
          opacity: 1,
        },
      },
      wobble: {
        distance: 5,
        enable: false,
        speed: {
          angle: 50,
          move: 10,
        },
      },
      life: {
        count: 0,
        delay: {
          value: 0,
          sync: false,
        },
        duration: {
          value: 0,
          sync: false,
        },
      },
      rotate: {
        value: 0,
        animation: {
          enable: false,
          speed: 0,
          decay: 0,
          sync: false,
        },
        direction: -90,
        path: false,
      },
      orbit: {
        animation: {
          count: 0,
          enable: false,
          speed: 1,
          decay: 0,
          delay: 0,
          sync: false,
        },
        enable: false,
        opacity: 1,
        rotation: {
          value: 45,
        },
        width: 1,
      },
      links: {
        blink: false,
        color: {
          value: '#ffffff',
        },
        consent: false,
        distance: 200,
        enable: false,
        frequency: 1,
        opacity: 1,
        shadow: {
          blur: 5,
          color: {
            value: '#000',
          },
          enable: false,
        },
        triangles: {
          enable: false,
          frequency: 1,
        },
        width: 2,
        warp: false,
      },
      repulse: {
        value: 0,
        enabled: false,
        distance: 1,
        duration: 1,
        factor: 1,
        speed: 1,
      },
    },
    pauseOnBlur: true,
    pauseOnOutsideViewport: true,
    smooth: false,
    zLayers: 100,
    name: 'Bubble',
    motion: {
      disable: false,
      reduce: {
        factor: 4,
        value: true,
      },
    },
  };
  constructor(
    private readonly ngParticlesService: NgParticlesService,
    @Inject(PLATFORM_ID) private platformId: Object
  ) {}

  ngAfterViewInit(): void {
    if (isPlatformBrowser(this.platformId)) {
      import('@tsparticles/angular').then(() => {
        this.ngParticlesService.init(async (engine) => {
          await loadSlim(engine);
        });
      });
    }
  }
}

The HTML is just

  <ngx-particles [id]="id" [options]="particlesOptions"></ngx-particles>

Thanks in advance to anyone willing to help!

Metadata

Metadata

Assignees

No one assigned

    Labels

    sweepAssigns Sweep to an issue or pull request.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions