Skip to content

Commit a950c8b

Browse files
.
1 parent 850242b commit a950c8b

8 files changed

Lines changed: 123 additions & 107 deletions

File tree

.eslintignore

Lines changed: 0 additions & 2 deletions
This file was deleted.

.flowconfig

Lines changed: 0 additions & 15 deletions
This file was deleted.

.stylelintrc.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
}
3535
],
3636
"selector-type-no-unknown": null,
37-
"string-quotes": "double",
37+
"string-quotes": "single",
3838
"value-keyword-case": [
3939
"lower",
4040
{

.vscode/extensions.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"dbaeumer.vscode-eslint",
44
"editorconfig.editorconfig",
55
"esbenp.prettier-vscode",
6+
"mkaufman.htmlhint",
67
"stylelint.vscode-stylelint"
78
]
89
}

.vscode/settings.json

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
"less.validate": false,
1616
"javascript.validate.enable": false,
1717
"stylelint.enable": true,
18-
"flow.pathToFlow": "${workspaceRoot}/node_modules/.bin/flow",
1918
"htmlhint.documentSelector": [
2019
"html"
2120
],
@@ -39,5 +38,20 @@
3938
},
4039
"[markdown]": {
4140
"editor.acceptSuggestionOnEnter": "off"
42-
}
41+
},
42+
"[typescript]": {
43+
"editor.defaultFormatter": "esbenp.prettier-vscode",
44+
"editor.codeActionsOnSave": {
45+
"source.fixAll.eslint": true
46+
}
47+
},
48+
"spellright.language": [
49+
"en"
50+
],
51+
"spellright.documentTypes": [
52+
"markdown",
53+
"latex",
54+
"plaintext",
55+
"javascript"
56+
]
4357
}

package.json

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,23 @@
1313
},
1414
"dependencies": {},
1515
"devDependencies": {
16+
"@typescript-eslint/eslint-plugin": "^2.34.0",
17+
"@typescript-eslint/parser": "^2.34.0",
18+
"@types/node": "^12.12.53",
1619
"eslint": "^7.11.0",
1720
"eslint-config-airbnb": "^18.2.0",
1821
"eslint-config-prettier": "^6.14.0",
19-
"eslint-plugin-flowtype": "^4.7.0",
2022
"eslint-plugin-import": "^2.22.1",
2123
"eslint-plugin-prettier": "^3.1.4",
22-
"flow-bin": "^0.119.1",
23-
"flow-typed": "^3.2.1",
2424
"htmlhint": "^0.14.1",
2525
"prettier": "^2.1.2",
26+
"eslint-import-resolver-typescript": "^2.0.0",
2627
"prettier-eslint": "^11.0.0",
2728
"stylelint": "^13.6.1",
2829
"stylelint-config-prettier": "^8.0.2",
2930
"stylelint-config-standard": "^20.0.0",
30-
"stylelint-scss": "^3.18.0"
31+
"stylelint-scss": "^3.18.0",
32+
"tslib": "^2.0.1",
33+
"typescript": "^3.9.7"
3134
}
3235
}

src/canvas-animated-svg-filter/babel.js

Lines changed: 0 additions & 83 deletions
This file was deleted.
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
window.onload = () => {
2+
'use strict';
3+
4+
const canvas = document.getElementById('canvas') as HTMLCanvasElement;
5+
const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;
6+
7+
const effectDisplacement = document.querySelector('filter feDisplacementMap') as SVGFEDisplacementMapElement;
8+
const effectOffset = document.querySelector('filter feOffset') as SVGFEOffsetElement;
9+
10+
const centerX: number = canvas.width / 2;
11+
const centerY: number = canvas.height / 2;
12+
let offsetFactor: number = 0;
13+
let radians: number = 0;
14+
let i: number = 0;
15+
16+
/**
17+
* Bad math - Values are ok for this screen size.
18+
* Moving mouse to center (on X) increases factor; boundaries will become close to 0.
19+
*
20+
* - scaleFactor: Determines max. possible result.
21+
* - offset: Left or right from center (must be positive).
22+
* Higher offset will cancel out with scale factor and become close to 0.
23+
*/
24+
function onMouseMove(event: MouseEvent) {
25+
const scaleFactor = centerX / 100;
26+
const offset = (event.offsetX - centerX) / 100;
27+
28+
offsetFactor = Math.abs(Math.abs(offset) - scaleFactor);
29+
}
30+
31+
/**
32+
* Frame-by-frame render process.
33+
*/
34+
function loop() {
35+
// Artificial delay for better visibility:
36+
// To render every N-th frame only; change expression 'i % 1' to higher numbers.
37+
const renderFrame = i === 0 || i % 1 === 0;
38+
39+
if (renderFrame) {
40+
update();
41+
reset();
42+
draw();
43+
}
44+
45+
window.requestAnimationFrame(loop);
46+
i++;
47+
}
48+
49+
/**
50+
* Update effect values.
51+
*/
52+
function update() {
53+
let scale: string = effectDisplacement.getAttribute('scale') + '';
54+
let rnd: string = Math.random().toString();
55+
56+
// Effect size - Added random values = Stronger distortion and 'vibration' effect
57+
scale = (16 + Math.sin(+scale) * offsetFactor).toString();
58+
59+
// Rotation speed
60+
radians += 0.05;
61+
62+
effectOffset.setAttribute('dx', rnd);
63+
effectOffset.setAttribute('dy', rnd);
64+
effectDisplacement.setAttribute('scale', scale);
65+
}
66+
67+
/**
68+
* Reset screen by partly transparent filling for a fading effect.
69+
*/
70+
function reset() {
71+
ctx.fillStyle = 'rgba(255, 255, 255, 0.25)';
72+
73+
ctx.fillRect(0, 0, canvas.width, canvas.height);
74+
}
75+
76+
/**
77+
* Draw rectangle at screen center.
78+
*/
79+
function draw() {
80+
ctx.save();
81+
82+
ctx.lineWidth = 24;
83+
ctx.strokeStyle = 'rgba(255, 192, 0, 1)';
84+
85+
ctx.translate(centerX, centerY);
86+
ctx.rotate(radians);
87+
ctx.beginPath();
88+
ctx.rect(-100, -100, 200, 200);
89+
ctx.stroke();
90+
91+
ctx.restore();
92+
}
93+
94+
// Start
95+
canvas.addEventListener('mousemove', onMouseMove);
96+
97+
loop();
98+
};

0 commit comments

Comments
 (0)