UNPKG

4.71 kBJavaScriptView Raw
1import { getRangeValue, isSsr } from "../Utils";
2/**
3 * @category Core
4 */
5export class Retina {
6 constructor(container) {
7 this.container = container;
8 }
9 /**
10 * Initializes all the values needing a pixel ratio factor (sizes, widths, distances)
11 */
12 init() {
13 const container = this.container;
14 const options = container.actualOptions;
15 this.pixelRatio = !options.detectRetina || isSsr() ? 1 : window.devicePixelRatio;
16 const motionOptions = this.container.actualOptions.motion;
17 if (motionOptions && (motionOptions.disable || motionOptions.reduce.value)) {
18 if (isSsr() || typeof matchMedia === "undefined" || !matchMedia) {
19 this.reduceFactor = 1;
20 }
21 else {
22 const mediaQuery = matchMedia("(prefers-reduced-motion: reduce)");
23 if (mediaQuery) {
24 // Check if the media query matches or is not available.
25 this.handleMotionChange(mediaQuery);
26 // Ads an event listener to check for changes in the media query's value.
27 const handleChange = () => {
28 this.handleMotionChange(mediaQuery);
29 container.refresh().catch(() => {
30 // ignore
31 });
32 };
33 if (mediaQuery.addEventListener !== undefined) {
34 mediaQuery.addEventListener("change", handleChange);
35 }
36 else if (mediaQuery.addListener !== undefined) {
37 mediaQuery.addListener(handleChange);
38 }
39 }
40 }
41 }
42 else {
43 this.reduceFactor = 1;
44 }
45 const ratio = this.pixelRatio;
46 if (container.canvas.element) {
47 const element = container.canvas.element;
48 container.canvas.size.width = element.offsetWidth * ratio;
49 container.canvas.size.height = element.offsetHeight * ratio;
50 }
51 const particles = options.particles;
52 this.attractDistance = particles.move.attract.distance * ratio;
53 this.linksDistance = particles.links.distance * ratio;
54 this.linksWidth = particles.links.width * ratio;
55 this.sizeAnimationSpeed = particles.size.animation.speed * ratio;
56 this.maxSpeed = particles.move.gravity.maxSpeed * ratio;
57 if (particles.orbit.radius !== undefined) {
58 this.orbitRadius = particles.orbit.radius * this.container.retina.pixelRatio;
59 }
60 const modes = options.interactivity.modes;
61 this.connectModeDistance = modes.connect.distance * ratio;
62 this.connectModeRadius = modes.connect.radius * ratio;
63 this.grabModeDistance = modes.grab.distance * ratio;
64 this.repulseModeDistance = modes.repulse.distance * ratio;
65 this.bounceModeDistance = modes.bounce.distance * ratio;
66 this.attractModeDistance = modes.attract.distance * ratio;
67 this.slowModeRadius = modes.slow.radius * ratio;
68 this.bubbleModeDistance = modes.bubble.distance * ratio;
69 if (modes.bubble.size) {
70 this.bubbleModeSize = modes.bubble.size * ratio;
71 }
72 }
73 initParticle(particle) {
74 const options = particle.options;
75 const ratio = this.pixelRatio;
76 const moveDistance = options.move.distance;
77 const props = particle.retina;
78 props.attractDistance = options.move.attract.distance * ratio;
79 props.linksDistance = options.links.distance * ratio;
80 props.linksWidth = options.links.width * ratio;
81 props.moveDrift = getRangeValue(options.move.drift) * ratio;
82 props.moveSpeed = getRangeValue(options.move.speed) * ratio;
83 props.sizeAnimationSpeed = options.size.animation.speed * ratio;
84 if (particle.spin) {
85 props.spinAcceleration = getRangeValue(options.move.spin.acceleration) * ratio;
86 }
87 const maxDistance = props.maxDistance;
88 maxDistance.horizontal = moveDistance.horizontal !== undefined ? moveDistance.horizontal * ratio : undefined;
89 maxDistance.vertical = moveDistance.vertical !== undefined ? moveDistance.vertical * ratio : undefined;
90 props.maxSpeed = options.move.gravity.maxSpeed * ratio;
91 }
92 handleMotionChange(mediaQuery) {
93 const options = this.container.actualOptions;
94 if (mediaQuery.matches) {
95 const motion = options.motion;
96 this.reduceFactor = motion.disable ? 0 : motion.reduce.value ? 1 / motion.reduce.factor : 1;
97 }
98 else {
99 this.reduceFactor = 1;
100 }
101 }
102}