Creating a dictionary type object with ES6 Symbols is easy. Yes we have Maps and WeakMaps but this is still interesting for a variety of reasons… Being able to use objects as keys in another object (dictionary) has many great uses…. So how do you use Symbols like this?

1
2
3
4
5
6
7
8
9
10
11
12
13
14

let a ={ id: Symbol('key')},
b ={ id: Symbol('key')};
let dictionary ={[a.id]:'value by obj a',[b.id]:'value by obj b'};
console.log(dictionary[a.id]);
console.log(dictionary[b.id]);// outputs:// 'value by obj a'// 'value by obj b'

By using either object a or object b’s `id` symbol, our dictionary points to another value. This old AS3 snippet is similar:

Being able to draw smooth lines that connect arbitrary points is something that I find myself needing very frequently. This is a port of an old snippet that does just that. By averaging control points of a quadratic bezier curve we ensure that our resulting Bezier curves are always smooth.

The key can be seen here with the `bezierSkin` function. It draws either a closed or open curve.

Awhile back I thought it would be interesting to add some quick fake lighting to a personal project of mine - that for lack of a better description is a windows management system.

Here is a screenshot of the windows management system with lighting turned on:

Here is a video of me using the system:

I whipped up this prototype (don’t mind the jQuery)

There are really two keys that make this work. Getting the shadow in place and adjusting the gradient. All we really need is the angle and distance from a given `div` in relation to the “light”:

1
2
3
4
5
6
7
8
9
10
11
12
13

let calcAng =function(x, y){
let lightPos = light.position()
let dx = lightPos.left- x;
let dy = lightPos.top- y;return-Math.atan2(dy, dx)/ Math.PI*180;};
let calcDist =function(x, y){
let lightPos = light.position()
let dx = lightPos.left- x;
let dy = lightPos.top- y;return Math.sqrt(dx * dx, dy * dy);};

Standard `atan2` and the pythagorean theorem get us this. Once we have those - we can use them to set our gradient and shadow values:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

// warning (apparently this function is slightly speed coded)
let calcShade =function(x, y){
let angle = calcAng(x, y);
let dist = calcDist(x, y);
let sx = dist * Math.cos(-angle * Math.PI/180)*-1;
let sy = dist * Math.sin(-angle * Math.PI/180)*-1;
sx = Math.min(20, Math.max(sx,-20));
sy = Math.min(20, Math.max(sy,-20));
let blur= Math.min(100, dist);
let hBlur = Math.min(50,blur)*0.5;// consider distance in the eq?return{
bg: `-webkit-linear-gradient(${angle}deg, rgba(0,0,0,0.2), rgba(255,255,255,0.4) ${blur}%)`,
shadow: `${sx}px ${sy}px ${hBlur}px rgba(0,0,0,0.15)`
};};

There are more videos of the windows management system on my youtube channel. Here’s another from a much earlier version of the system.