@pezkuwi/ui-shared 3.16.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/build/LICENSE +201 -0
- package/build/README.md +3 -0
- package/build/bundle.d.ts +2 -0
- package/build/bundle.js +2 -0
- package/build/cjs/bundle.d.ts +2 -0
- package/build/cjs/bundle.js +7 -0
- package/build/cjs/icons/beachball/colors.d.ts +2 -0
- package/build/cjs/icons/beachball/colors.js +16 -0
- package/build/cjs/icons/beachball/container.d.ts +1 -0
- package/build/cjs/icons/beachball/container.js +22 -0
- package/build/cjs/icons/beachball/defaults.d.ts +2 -0
- package/build/cjs/icons/beachball/defaults.js +8 -0
- package/build/cjs/icons/beachball/demo.d.ts +1 -0
- package/build/cjs/icons/beachball/demo.js +21 -0
- package/build/cjs/icons/beachball/index.d.ts +2 -0
- package/build/cjs/icons/beachball/index.js +24 -0
- package/build/cjs/icons/beachball/seeder.d.ts +2 -0
- package/build/cjs/icons/beachball/seeder.js +21 -0
- package/build/cjs/icons/beachball/shape/circle.d.ts +2 -0
- package/build/cjs/icons/beachball/shape/circle.js +16 -0
- package/build/cjs/icons/beachball/shape/square.d.ts +2 -0
- package/build/cjs/icons/beachball/shape/square.js +19 -0
- package/build/cjs/icons/beachball/svg/circle.d.ts +1 -0
- package/build/cjs/icons/beachball/svg/circle.js +11 -0
- package/build/cjs/icons/beachball/svg/element.d.ts +1 -0
- package/build/cjs/icons/beachball/svg/element.js +12 -0
- package/build/cjs/icons/beachball/svg/rect.d.ts +1 -0
- package/build/cjs/icons/beachball/svg/rect.js +10 -0
- package/build/cjs/icons/beachball/svg/svg.d.ts +1 -0
- package/build/cjs/icons/beachball/svg/svg.js +7 -0
- package/build/cjs/icons/beachball/types.d.ts +2 -0
- package/build/cjs/icons/beachball/types.js +2 -0
- package/build/cjs/icons/index.d.ts +2 -0
- package/build/cjs/icons/index.js +7 -0
- package/build/cjs/icons/polkadot.d.ts +5 -0
- package/build/cjs/icons/polkadot.js +116 -0
- package/build/cjs/icons/types.d.ts +10 -0
- package/build/cjs/icons/types.js +2 -0
- package/build/cjs/index.d.ts +2 -0
- package/build/cjs/index.js +5 -0
- package/build/cjs/package.json +3 -0
- package/build/cjs/packageDetect.d.ts +1 -0
- package/build/cjs/packageDetect.js +5 -0
- package/build/cjs/packageInfo.d.ts +6 -0
- package/build/cjs/packageInfo.js +4 -0
- package/build/icons/beachball/README.md +19 -0
- package/build/icons/beachball/colors.d.ts +2 -0
- package/build/icons/beachball/colors.js +13 -0
- package/build/icons/beachball/container.d.ts +1 -0
- package/build/icons/beachball/container.js +19 -0
- package/build/icons/beachball/defaults.d.ts +2 -0
- package/build/icons/beachball/defaults.js +5 -0
- package/build/icons/beachball/demo.d.ts +1 -0
- package/build/icons/beachball/demo.js +19 -0
- package/build/icons/beachball/index.d.ts +2 -0
- package/build/icons/beachball/index.js +21 -0
- package/build/icons/beachball/seeder.d.ts +2 -0
- package/build/icons/beachball/seeder.js +18 -0
- package/build/icons/beachball/shape/circle.d.ts +2 -0
- package/build/icons/beachball/shape/circle.js +13 -0
- package/build/icons/beachball/shape/square.d.ts +2 -0
- package/build/icons/beachball/shape/square.js +16 -0
- package/build/icons/beachball/svg/circle.d.ts +1 -0
- package/build/icons/beachball/svg/circle.js +8 -0
- package/build/icons/beachball/svg/element.d.ts +1 -0
- package/build/icons/beachball/svg/element.js +9 -0
- package/build/icons/beachball/svg/rect.d.ts +1 -0
- package/build/icons/beachball/svg/rect.js +7 -0
- package/build/icons/beachball/svg/svg.d.ts +1 -0
- package/build/icons/beachball/svg/svg.js +4 -0
- package/build/icons/beachball/types.d.ts +2 -0
- package/build/icons/beachball/types.js +1 -0
- package/build/icons/index.d.ts +2 -0
- package/build/icons/index.js +2 -0
- package/build/icons/polkadot.d.ts +5 -0
- package/build/icons/polkadot.js +113 -0
- package/build/icons/types.d.ts +10 -0
- package/build/icons/types.js +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +2 -0
- package/build/package.json +336 -0
- package/build/packageDetect.d.ts +1 -0
- package/build/packageDetect.js +3 -0
- package/build/packageInfo.d.ts +6 -0
- package/build/packageInfo.js +1 -0
- package/build-tsc/bundle.d.ts +2 -0
- package/build-tsc/icons/beachball/colors.d.ts +2 -0
- package/build-tsc/icons/beachball/container.d.ts +1 -0
- package/build-tsc/icons/beachball/defaults.d.ts +2 -0
- package/build-tsc/icons/beachball/demo.d.ts +1 -0
- package/build-tsc/icons/beachball/index.d.ts +2 -0
- package/build-tsc/icons/beachball/seeder.d.ts +2 -0
- package/build-tsc/icons/beachball/shape/circle.d.ts +2 -0
- package/build-tsc/icons/beachball/shape/square.d.ts +2 -0
- package/build-tsc/icons/beachball/svg/circle.d.ts +1 -0
- package/build-tsc/icons/beachball/svg/element.d.ts +1 -0
- package/build-tsc/icons/beachball/svg/rect.d.ts +1 -0
- package/build-tsc/icons/beachball/svg/svg.d.ts +1 -0
- package/build-tsc/icons/beachball/types.d.ts +2 -0
- package/build-tsc/icons/index.d.ts +2 -0
- package/build-tsc/icons/polkadot.d.ts +5 -0
- package/build-tsc/icons/types.d.ts +10 -0
- package/build-tsc/index.d.ts +2 -0
- package/build-tsc/packageDetect.d.ts +1 -0
- package/build-tsc/packageInfo.d.ts +6 -0
- package/build-tsc-cjs/bundle.js +7 -0
- package/build-tsc-cjs/icons/beachball/colors.js +16 -0
- package/build-tsc-cjs/icons/beachball/container.js +22 -0
- package/build-tsc-cjs/icons/beachball/defaults.js +8 -0
- package/build-tsc-cjs/icons/beachball/demo.js +21 -0
- package/build-tsc-cjs/icons/beachball/index.js +24 -0
- package/build-tsc-cjs/icons/beachball/seeder.js +21 -0
- package/build-tsc-cjs/icons/beachball/shape/circle.js +16 -0
- package/build-tsc-cjs/icons/beachball/shape/square.js +19 -0
- package/build-tsc-cjs/icons/beachball/svg/circle.js +11 -0
- package/build-tsc-cjs/icons/beachball/svg/element.js +12 -0
- package/build-tsc-cjs/icons/beachball/svg/rect.js +10 -0
- package/build-tsc-cjs/icons/beachball/svg/svg.js +7 -0
- package/build-tsc-cjs/icons/beachball/types.js +2 -0
- package/build-tsc-cjs/icons/index.js +7 -0
- package/build-tsc-cjs/icons/polkadot.js +116 -0
- package/build-tsc-cjs/icons/types.js +2 -0
- package/build-tsc-cjs/index.js +5 -0
- package/build-tsc-cjs/packageDetect.js +5 -0
- package/build-tsc-cjs/packageInfo.js +4 -0
- package/build-tsc-esm/bundle.js +2 -0
- package/build-tsc-esm/icons/beachball/colors.js +13 -0
- package/build-tsc-esm/icons/beachball/container.js +19 -0
- package/build-tsc-esm/icons/beachball/defaults.js +5 -0
- package/build-tsc-esm/icons/beachball/demo.js +19 -0
- package/build-tsc-esm/icons/beachball/index.js +21 -0
- package/build-tsc-esm/icons/beachball/seeder.js +18 -0
- package/build-tsc-esm/icons/beachball/shape/circle.js +13 -0
- package/build-tsc-esm/icons/beachball/shape/square.js +16 -0
- package/build-tsc-esm/icons/beachball/svg/circle.js +8 -0
- package/build-tsc-esm/icons/beachball/svg/element.js +9 -0
- package/build-tsc-esm/icons/beachball/svg/rect.js +7 -0
- package/build-tsc-esm/icons/beachball/svg/svg.js +4 -0
- package/build-tsc-esm/icons/beachball/types.js +1 -0
- package/build-tsc-esm/icons/index.js +2 -0
- package/build-tsc-esm/icons/polkadot.js +113 -0
- package/build-tsc-esm/icons/types.js +1 -0
- package/build-tsc-esm/index.js +2 -0
- package/build-tsc-esm/packageDetect.js +3 -0
- package/build-tsc-esm/packageInfo.js +1 -0
- package/package.json +37 -0
- package/src/bundle.ts +5 -0
- package/src/icons/beachball/LICENSE +16 -0
- package/src/icons/beachball/README.md +19 -0
- package/src/icons/beachball/colors.spec.ts +67 -0
- package/src/icons/beachball/colors.ts +28 -0
- package/src/icons/beachball/container.spec.ts +46 -0
- package/src/icons/beachball/container.ts +27 -0
- package/src/icons/beachball/defaults.ts +11 -0
- package/src/icons/beachball/demo.ts +35 -0
- package/src/icons/beachball/index.spec.ts +36 -0
- package/src/icons/beachball/index.ts +33 -0
- package/src/icons/beachball/seeder.spec.ts +30 -0
- package/src/icons/beachball/seeder.ts +30 -0
- package/src/icons/beachball/shape/circle.spec.ts +20 -0
- package/src/icons/beachball/shape/circle.ts +23 -0
- package/src/icons/beachball/shape/square.ts +26 -0
- package/src/icons/beachball/svg/circle.spec.ts +19 -0
- package/src/icons/beachball/svg/circle.ts +14 -0
- package/src/icons/beachball/svg/element.spec.ts +19 -0
- package/src/icons/beachball/svg/element.ts +17 -0
- package/src/icons/beachball/svg/rect.spec.ts +19 -0
- package/src/icons/beachball/svg/rect.ts +13 -0
- package/src/icons/beachball/svg/svg.spec.ts +19 -0
- package/src/icons/beachball/svg/svg.ts +10 -0
- package/src/icons/beachball/types.ts +6 -0
- package/src/icons/index.ts +5 -0
- package/src/icons/polkadot.spec.ts +35 -0
- package/src/icons/polkadot.ts +154 -0
- package/src/icons/types.ts +14 -0
- package/src/index.ts +6 -0
- package/src/packageDetect.ts +11 -0
- package/src/packageInfo.ts +6 -0
- package/tsconfig.build.json +12 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.spec.json +16 -0
- package/tsconfig.spec.tsbuildinfo +1 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.polkadotIcon = exports.beachballIcon = void 0;
|
|
4
|
+
var index_js_1 = require("./beachball/index.js");
|
|
5
|
+
Object.defineProperty(exports, "beachballIcon", { enumerable: true, get: function () { return index_js_1.beachballIcon; } });
|
|
6
|
+
var polkadot_js_1 = require("./polkadot.js");
|
|
7
|
+
Object.defineProperty(exports, "polkadotIcon", { enumerable: true, get: function () { return polkadot_js_1.polkadotIcon; } });
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.polkadotIcon = polkadotIcon;
|
|
4
|
+
const util_crypto_1 = require("@pezkuwi/util-crypto");
|
|
5
|
+
const S = 64;
|
|
6
|
+
const C = S / 2;
|
|
7
|
+
const Z = S / 64 * 5;
|
|
8
|
+
const SCHEMES = [
|
|
9
|
+
/* target */ { colors: [0, 28, 0, 0, 28, 0, 0, 28, 0, 0, 28, 0, 0, 28, 0, 0, 28, 0, 1], freq: 1 },
|
|
10
|
+
/* cube */ { colors: [0, 1, 3, 2, 4, 3, 0, 1, 3, 2, 4, 3, 0, 1, 3, 2, 4, 3, 5], freq: 20 },
|
|
11
|
+
/* quazar */ { colors: [1, 2, 3, 1, 2, 4, 5, 5, 4, 1, 2, 3, 1, 2, 4, 5, 5, 4, 0], freq: 16 },
|
|
12
|
+
/* flower */ { colors: [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 3], freq: 32 },
|
|
13
|
+
/* cyclic */ { colors: [0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6], freq: 32 },
|
|
14
|
+
/* vmirror */ { colors: [0, 1, 2, 3, 4, 5, 3, 4, 2, 0, 1, 6, 7, 8, 9, 7, 8, 6, 10], freq: 128 },
|
|
15
|
+
/* hmirror */ { colors: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 6, 7, 5, 3, 4, 2, 11], freq: 128 }
|
|
16
|
+
];
|
|
17
|
+
const SCHEMES_TOTAL = SCHEMES
|
|
18
|
+
.map((s) => s.freq)
|
|
19
|
+
.reduce((a, b) => a + b);
|
|
20
|
+
const OUTER_CIRCLE = {
|
|
21
|
+
cx: C,
|
|
22
|
+
cy: C,
|
|
23
|
+
fill: '#eee',
|
|
24
|
+
r: C
|
|
25
|
+
};
|
|
26
|
+
let zeroHash = new Uint8Array();
|
|
27
|
+
function getRotation(isSixPoint) {
|
|
28
|
+
const r = isSixPoint
|
|
29
|
+
? (C / 8 * 5)
|
|
30
|
+
: (C / 4 * 3);
|
|
31
|
+
const rroot3o2 = r * Math.sqrt(3) / 2;
|
|
32
|
+
const ro2 = r / 2;
|
|
33
|
+
const rroot3o4 = r * Math.sqrt(3) / 4;
|
|
34
|
+
const ro4 = r / 4;
|
|
35
|
+
const r3o4 = r * 3 / 4;
|
|
36
|
+
return { r, r3o4, ro2, ro4, rroot3o2, rroot3o4 };
|
|
37
|
+
}
|
|
38
|
+
function getCircleXY(isSixPoint = false) {
|
|
39
|
+
const { r, r3o4, ro2, ro4, rroot3o2, rroot3o4 } = getRotation(isSixPoint);
|
|
40
|
+
return [
|
|
41
|
+
[C, C - r],
|
|
42
|
+
[C, C - ro2],
|
|
43
|
+
[C - rroot3o4, C - r3o4],
|
|
44
|
+
[C - rroot3o2, C - ro2],
|
|
45
|
+
[C - rroot3o4, C - ro4],
|
|
46
|
+
[C - rroot3o2, C],
|
|
47
|
+
[C - rroot3o2, C + ro2],
|
|
48
|
+
[C - rroot3o4, C + ro4],
|
|
49
|
+
[C - rroot3o4, C + r3o4],
|
|
50
|
+
[C, C + r],
|
|
51
|
+
[C, C + ro2],
|
|
52
|
+
[C + rroot3o4, C + r3o4],
|
|
53
|
+
[C + rroot3o2, C + ro2],
|
|
54
|
+
[C + rroot3o4, C + ro4],
|
|
55
|
+
[C + rroot3o2, C],
|
|
56
|
+
[C + rroot3o2, C - ro2],
|
|
57
|
+
[C + rroot3o4, C - ro4],
|
|
58
|
+
[C + rroot3o4, C - r3o4],
|
|
59
|
+
[C, C]
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
function findScheme(d) {
|
|
63
|
+
let cum = 0;
|
|
64
|
+
const schema = SCHEMES.find((schema) => {
|
|
65
|
+
cum += schema.freq;
|
|
66
|
+
return d < cum;
|
|
67
|
+
});
|
|
68
|
+
if (!schema) {
|
|
69
|
+
throw new Error('Unable to find schema');
|
|
70
|
+
}
|
|
71
|
+
return schema;
|
|
72
|
+
}
|
|
73
|
+
function addressToId(address) {
|
|
74
|
+
if (!zeroHash.length) {
|
|
75
|
+
zeroHash = (0, util_crypto_1.blake2AsU8a)(new Uint8Array(32), 512);
|
|
76
|
+
}
|
|
77
|
+
return (0, util_crypto_1.blake2AsU8a)((0, util_crypto_1.decodeAddress)(address), 512).map((x, i) => (x + 256 - zeroHash[i]) % 256);
|
|
78
|
+
}
|
|
79
|
+
function getColors(address) {
|
|
80
|
+
const id = addressToId(address);
|
|
81
|
+
const d = Math.floor((id[30] + id[31] * 256) % SCHEMES_TOTAL);
|
|
82
|
+
const rot = (id[28] % 6) * 3;
|
|
83
|
+
const sat = (Math.floor(id[29] * 70 / 256 + 26) % 80) + 30;
|
|
84
|
+
const scheme = findScheme(d);
|
|
85
|
+
const palette = Array.from(id).map((x, i) => {
|
|
86
|
+
const b = (x + i % 28 * 58) % 256;
|
|
87
|
+
if (b === 0) {
|
|
88
|
+
return '#444';
|
|
89
|
+
}
|
|
90
|
+
else if (b === 255) {
|
|
91
|
+
return 'transparent';
|
|
92
|
+
}
|
|
93
|
+
const h = Math.floor(b % 64 * 360 / 64);
|
|
94
|
+
const l = [53, 15, 35, 75][Math.floor(b / 64)];
|
|
95
|
+
return `hsl(${h}, ${sat}%, ${l}%)`;
|
|
96
|
+
});
|
|
97
|
+
return scheme.colors.map((_, i) => palette[scheme.colors[i < 18 ? (i + rot) % 18 : 18]]);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* @description Generates an array of the circles that make up an identicon
|
|
101
|
+
*/
|
|
102
|
+
function polkadotIcon(address, { isAlternative }) {
|
|
103
|
+
const xy = getCircleXY(isAlternative);
|
|
104
|
+
let colors;
|
|
105
|
+
try {
|
|
106
|
+
// in some cases, e.g. RN where crypto may not be initialized, chaos can
|
|
107
|
+
// happen when hashing, in these cases we just fill with a placeholder
|
|
108
|
+
colors = getColors(address);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
colors = new Array(xy.length).fill('#ddd');
|
|
112
|
+
}
|
|
113
|
+
return [OUTER_CIRCLE].concat(xy.map(([cx, cy], index) => ({
|
|
114
|
+
cx, cy, fill: colors[index], r: Z
|
|
115
|
+
})));
|
|
116
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { colord } from 'colord';
|
|
2
|
+
import { COLORS } from './defaults.js';
|
|
3
|
+
const WOBBLE = 30;
|
|
4
|
+
export function colors(seeder) {
|
|
5
|
+
const amount = (seeder() * WOBBLE) - (WOBBLE / 2);
|
|
6
|
+
const all = COLORS.map((hex) => colord(hex).rotate(amount));
|
|
7
|
+
return (alpha = 1) => {
|
|
8
|
+
const index = Math.floor(all.length * seeder());
|
|
9
|
+
return all.splice(index, 1)[0]
|
|
10
|
+
.alpha(alpha)
|
|
11
|
+
.toHslString();
|
|
12
|
+
};
|
|
13
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function container(diameter, background = 'white', className = '', _style = {}) {
|
|
2
|
+
const element = document.createElement('div');
|
|
3
|
+
const style = Object.assign({
|
|
4
|
+
background,
|
|
5
|
+
borderRadius: `${diameter / 2}px`,
|
|
6
|
+
display: 'inline-block',
|
|
7
|
+
height: `${diameter}px`,
|
|
8
|
+
margin: '0px',
|
|
9
|
+
overflow: 'hidden',
|
|
10
|
+
padding: '0px',
|
|
11
|
+
width: `${diameter}px`
|
|
12
|
+
}, _style);
|
|
13
|
+
element.className = className;
|
|
14
|
+
element.style.background = background;
|
|
15
|
+
Object.keys(style).forEach((key) => {
|
|
16
|
+
element.style[key] = style[key];
|
|
17
|
+
});
|
|
18
|
+
return element;
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { isNull } from '@pezkuwi/util';
|
|
2
|
+
import { encodeAddress, randomAsU8a } from '@pezkuwi/util-crypto';
|
|
3
|
+
import { beachballIcon } from './index.js';
|
|
4
|
+
const element = document.getElementById('demo');
|
|
5
|
+
function generateIcon(seed = encodeAddress(randomAsU8a(32))) {
|
|
6
|
+
const start = Date.now();
|
|
7
|
+
if (isNull(element)) {
|
|
8
|
+
throw new Error('Unable to find #demo element');
|
|
9
|
+
}
|
|
10
|
+
element.appendChild(beachballIcon(seed, { isAlternative: false, size: 100 }, 'padded'));
|
|
11
|
+
console.log(`Icon generated in ${(Date.now() - start)}ms`);
|
|
12
|
+
}
|
|
13
|
+
function generateIcons(count = 512) {
|
|
14
|
+
generateIcon(encodeAddress(new Uint8Array(32)));
|
|
15
|
+
for (let index = 1; index < count; index++) {
|
|
16
|
+
generateIcon();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
generateIcons();
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { circle } from './shape/circle.js';
|
|
2
|
+
import { element } from './svg/element.js';
|
|
3
|
+
import { colors } from './colors.js';
|
|
4
|
+
import { container as newContainer } from './container.js';
|
|
5
|
+
import { SHAPE_COUNT } from './defaults.js';
|
|
6
|
+
import { seeder as newSeeder } from './seeder.js';
|
|
7
|
+
export function beachballIcon(seed, { size = 256 }, className = '', style) {
|
|
8
|
+
const seeder = newSeeder(seed);
|
|
9
|
+
const colorGen = colors(seeder);
|
|
10
|
+
const outer = newContainer(size, 'white', className, style);
|
|
11
|
+
const container = newContainer(size, colorGen());
|
|
12
|
+
const svg = element(size);
|
|
13
|
+
outer.appendChild(container);
|
|
14
|
+
container.appendChild(svg);
|
|
15
|
+
for (let count = 0; count < SHAPE_COUNT; count++) {
|
|
16
|
+
const fill = colorGen();
|
|
17
|
+
const shape = circle(seeder, fill, size, count);
|
|
18
|
+
svg.appendChild(shape);
|
|
19
|
+
}
|
|
20
|
+
return outer;
|
|
21
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { isU8a, stringToU8a } from '@pezkuwi/util';
|
|
2
|
+
const DIVISOR = 256 * 256;
|
|
3
|
+
export function seeder(_seed = new Uint8Array(32)) {
|
|
4
|
+
const seed = isU8a(_seed)
|
|
5
|
+
? _seed
|
|
6
|
+
: stringToU8a(_seed);
|
|
7
|
+
let index = (seed[Math.floor(seed.length / 2)] % seed.length) - 1;
|
|
8
|
+
const next = () => {
|
|
9
|
+
index += 1;
|
|
10
|
+
if (index === seed.length) {
|
|
11
|
+
index = 0;
|
|
12
|
+
}
|
|
13
|
+
return seed[index];
|
|
14
|
+
};
|
|
15
|
+
return () => {
|
|
16
|
+
return ((next() * 256) + next()) / DIVISOR;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SHAPE_COUNT } from '../defaults.js';
|
|
2
|
+
import { circle as newCircle } from '../svg/circle.js';
|
|
3
|
+
export function circle(seeder, fill, diameter, count) {
|
|
4
|
+
const center = diameter / 2;
|
|
5
|
+
const angle = seeder() * 360;
|
|
6
|
+
const radius = (((SHAPE_COUNT - count) / SHAPE_COUNT) * (diameter / 2)) + ((diameter / 8) * seeder());
|
|
7
|
+
const offset = (diameter / 4) * (seeder() + ((count + 1) / SHAPE_COUNT));
|
|
8
|
+
const cx = (offset * Math.sin(angle)) + center;
|
|
9
|
+
const cy = (offset * Math.cos(angle)) + center;
|
|
10
|
+
const svg = newCircle(radius, cx, cy);
|
|
11
|
+
svg.setAttributeNS('', 'fill', fill);
|
|
12
|
+
return svg;
|
|
13
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SHAPE_COUNT } from '../defaults.js';
|
|
2
|
+
import { rect as newRect } from '../svg/rect.js';
|
|
3
|
+
export function square(seeder, fill, diameter, count) {
|
|
4
|
+
const center = diameter / 2;
|
|
5
|
+
const svg = newRect(diameter);
|
|
6
|
+
const firstRot = seeder();
|
|
7
|
+
const angle = Math.PI * 2 * firstRot;
|
|
8
|
+
const scale = count / SHAPE_COUNT;
|
|
9
|
+
const velocity = ((diameter / SHAPE_COUNT) * seeder()) + (scale * diameter);
|
|
10
|
+
const tx = (Math.cos(angle) * velocity).toFixed(3);
|
|
11
|
+
const ty = (Math.sin(angle) * velocity).toFixed(3);
|
|
12
|
+
const rot = ((firstRot * 360) + (seeder() * 180)).toFixed(1);
|
|
13
|
+
svg.setAttributeNS('', 'transform', `translate(${tx} ${ty}) rotate(${rot} ${center} ${center})`);
|
|
14
|
+
svg.setAttributeNS('', 'fill', fill);
|
|
15
|
+
return svg;
|
|
16
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { svg } from './svg.js';
|
|
2
|
+
export function element(size, type = 'svg', x = 0, y = 0) {
|
|
3
|
+
const elem = svg(type);
|
|
4
|
+
elem.setAttributeNS('', 'x', `${x}`);
|
|
5
|
+
elem.setAttributeNS('', 'y', `${y}`);
|
|
6
|
+
elem.setAttributeNS('', 'width', `${size}`);
|
|
7
|
+
elem.setAttributeNS('', 'height', `${size}`);
|
|
8
|
+
return elem;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { blake2AsU8a, decodeAddress } from '@pezkuwi/util-crypto';
|
|
2
|
+
const S = 64;
|
|
3
|
+
const C = S / 2;
|
|
4
|
+
const Z = S / 64 * 5;
|
|
5
|
+
const SCHEMES = [
|
|
6
|
+
/* target */ { colors: [0, 28, 0, 0, 28, 0, 0, 28, 0, 0, 28, 0, 0, 28, 0, 0, 28, 0, 1], freq: 1 },
|
|
7
|
+
/* cube */ { colors: [0, 1, 3, 2, 4, 3, 0, 1, 3, 2, 4, 3, 0, 1, 3, 2, 4, 3, 5], freq: 20 },
|
|
8
|
+
/* quazar */ { colors: [1, 2, 3, 1, 2, 4, 5, 5, 4, 1, 2, 3, 1, 2, 4, 5, 5, 4, 0], freq: 16 },
|
|
9
|
+
/* flower */ { colors: [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 3], freq: 32 },
|
|
10
|
+
/* cyclic */ { colors: [0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6], freq: 32 },
|
|
11
|
+
/* vmirror */ { colors: [0, 1, 2, 3, 4, 5, 3, 4, 2, 0, 1, 6, 7, 8, 9, 7, 8, 6, 10], freq: 128 },
|
|
12
|
+
/* hmirror */ { colors: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 6, 7, 5, 3, 4, 2, 11], freq: 128 }
|
|
13
|
+
];
|
|
14
|
+
const SCHEMES_TOTAL = SCHEMES
|
|
15
|
+
.map((s) => s.freq)
|
|
16
|
+
.reduce((a, b) => a + b);
|
|
17
|
+
const OUTER_CIRCLE = {
|
|
18
|
+
cx: C,
|
|
19
|
+
cy: C,
|
|
20
|
+
fill: '#eee',
|
|
21
|
+
r: C
|
|
22
|
+
};
|
|
23
|
+
let zeroHash = new Uint8Array();
|
|
24
|
+
function getRotation(isSixPoint) {
|
|
25
|
+
const r = isSixPoint
|
|
26
|
+
? (C / 8 * 5)
|
|
27
|
+
: (C / 4 * 3);
|
|
28
|
+
const rroot3o2 = r * Math.sqrt(3) / 2;
|
|
29
|
+
const ro2 = r / 2;
|
|
30
|
+
const rroot3o4 = r * Math.sqrt(3) / 4;
|
|
31
|
+
const ro4 = r / 4;
|
|
32
|
+
const r3o4 = r * 3 / 4;
|
|
33
|
+
return { r, r3o4, ro2, ro4, rroot3o2, rroot3o4 };
|
|
34
|
+
}
|
|
35
|
+
function getCircleXY(isSixPoint = false) {
|
|
36
|
+
const { r, r3o4, ro2, ro4, rroot3o2, rroot3o4 } = getRotation(isSixPoint);
|
|
37
|
+
return [
|
|
38
|
+
[C, C - r],
|
|
39
|
+
[C, C - ro2],
|
|
40
|
+
[C - rroot3o4, C - r3o4],
|
|
41
|
+
[C - rroot3o2, C - ro2],
|
|
42
|
+
[C - rroot3o4, C - ro4],
|
|
43
|
+
[C - rroot3o2, C],
|
|
44
|
+
[C - rroot3o2, C + ro2],
|
|
45
|
+
[C - rroot3o4, C + ro4],
|
|
46
|
+
[C - rroot3o4, C + r3o4],
|
|
47
|
+
[C, C + r],
|
|
48
|
+
[C, C + ro2],
|
|
49
|
+
[C + rroot3o4, C + r3o4],
|
|
50
|
+
[C + rroot3o2, C + ro2],
|
|
51
|
+
[C + rroot3o4, C + ro4],
|
|
52
|
+
[C + rroot3o2, C],
|
|
53
|
+
[C + rroot3o2, C - ro2],
|
|
54
|
+
[C + rroot3o4, C - ro4],
|
|
55
|
+
[C + rroot3o4, C - r3o4],
|
|
56
|
+
[C, C]
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
function findScheme(d) {
|
|
60
|
+
let cum = 0;
|
|
61
|
+
const schema = SCHEMES.find((schema) => {
|
|
62
|
+
cum += schema.freq;
|
|
63
|
+
return d < cum;
|
|
64
|
+
});
|
|
65
|
+
if (!schema) {
|
|
66
|
+
throw new Error('Unable to find schema');
|
|
67
|
+
}
|
|
68
|
+
return schema;
|
|
69
|
+
}
|
|
70
|
+
function addressToId(address) {
|
|
71
|
+
if (!zeroHash.length) {
|
|
72
|
+
zeroHash = blake2AsU8a(new Uint8Array(32), 512);
|
|
73
|
+
}
|
|
74
|
+
return blake2AsU8a(decodeAddress(address), 512).map((x, i) => (x + 256 - zeroHash[i]) % 256);
|
|
75
|
+
}
|
|
76
|
+
function getColors(address) {
|
|
77
|
+
const id = addressToId(address);
|
|
78
|
+
const d = Math.floor((id[30] + id[31] * 256) % SCHEMES_TOTAL);
|
|
79
|
+
const rot = (id[28] % 6) * 3;
|
|
80
|
+
const sat = (Math.floor(id[29] * 70 / 256 + 26) % 80) + 30;
|
|
81
|
+
const scheme = findScheme(d);
|
|
82
|
+
const palette = Array.from(id).map((x, i) => {
|
|
83
|
+
const b = (x + i % 28 * 58) % 256;
|
|
84
|
+
if (b === 0) {
|
|
85
|
+
return '#444';
|
|
86
|
+
}
|
|
87
|
+
else if (b === 255) {
|
|
88
|
+
return 'transparent';
|
|
89
|
+
}
|
|
90
|
+
const h = Math.floor(b % 64 * 360 / 64);
|
|
91
|
+
const l = [53, 15, 35, 75][Math.floor(b / 64)];
|
|
92
|
+
return `hsl(${h}, ${sat}%, ${l}%)`;
|
|
93
|
+
});
|
|
94
|
+
return scheme.colors.map((_, i) => palette[scheme.colors[i < 18 ? (i + rot) % 18 : 18]]);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* @description Generates an array of the circles that make up an identicon
|
|
98
|
+
*/
|
|
99
|
+
export function polkadotIcon(address, { isAlternative }) {
|
|
100
|
+
const xy = getCircleXY(isAlternative);
|
|
101
|
+
let colors;
|
|
102
|
+
try {
|
|
103
|
+
// in some cases, e.g. RN where crypto may not be initialized, chaos can
|
|
104
|
+
// happen when hashing, in these cases we just fill with a placeholder
|
|
105
|
+
colors = getColors(address);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
colors = new Array(xy.length).fill('#ddd');
|
|
109
|
+
}
|
|
110
|
+
return [OUTER_CIRCLE].concat(xy.map(([cx, cy], index) => ({
|
|
111
|
+
cx, cy, fill: colors[index], r: Z
|
|
112
|
+
})));
|
|
113
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const packageInfo = { name: '@pezkuwi/ui-shared', path: (import.meta && import.meta.url) ? new URL(import.meta.url).pathname.substring(0, new URL(import.meta.url).pathname.lastIndexOf('/') + 1) : 'auto', type: 'esm', version: '3.16.6' };
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"author": "Jaco Greeff <jacogr@gmail.com>",
|
|
3
|
+
"bugs": "https://github.com/pezkuwichain/ui/issues",
|
|
4
|
+
"description": "Shared logic that is usable accross all frameworks-specific areas",
|
|
5
|
+
"engines": {
|
|
6
|
+
"node": ">=18"
|
|
7
|
+
},
|
|
8
|
+
"homepage": "https://github.com/pezkuwichain/ui/tree/master/packages/ui-shared#readme",
|
|
9
|
+
"license": "Apache-2.0",
|
|
10
|
+
"name": "@pezkuwi/ui-shared",
|
|
11
|
+
"repository": {
|
|
12
|
+
"directory": "packages/ui-shared",
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "https://github.com/pezkuwichain/ui.git"
|
|
15
|
+
},
|
|
16
|
+
"sideEffects": [
|
|
17
|
+
"./packageDetect.js",
|
|
18
|
+
"./packageDetect.cjs"
|
|
19
|
+
],
|
|
20
|
+
"type": "module",
|
|
21
|
+
"version": "3.16.6",
|
|
22
|
+
"main": "index.js",
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"colord": "^2.9.3",
|
|
25
|
+
"tslib": "^2.8.1"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@pezkuwi/util": "^14.0.5",
|
|
29
|
+
"@pezkuwi/util-crypto": "^14.0.5",
|
|
30
|
+
"@types/xmlserializer": "^0.6.6",
|
|
31
|
+
"xmlserializer": "^0.6.1"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"@pezkuwi/util": "*",
|
|
35
|
+
"@pezkuwi/util-crypto": "*"
|
|
36
|
+
}
|
|
37
|
+
}
|
package/src/bundle.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Apache-2.0 License (Apache-2.0)
|
|
2
|
+
|
|
3
|
+
Copyright 2016 Dan Finlay
|
|
4
|
+
Copyright 2017-2025 @polkadot/ui-shared authors & contributors
|
|
5
|
+
|
|
6
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
7
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
8
|
+
copyright notice and this permission notice appear in all copies.
|
|
9
|
+
|
|
10
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DApache-2.0LAIMS ALL WARRANTIES WITH
|
|
11
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
12
|
+
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
13
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
14
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
15
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
16
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# @pezkuwi/ui-shared/beachball
|
|
2
|
+
|
|
3
|
+
Adapted from [Jazzicon](https://github.com/danfinlay/jazzicon) by Dan Finlay with the following changes -
|
|
4
|
+
|
|
5
|
+
- Random values now is read from the Uint8Array supplied (as opposed to having the seed as a number). This allows us to give an publicKey/address as an input and use those values in the pattern generation.
|
|
6
|
+
- Upgrade to the underlying [color](https://github.com/Qix-/color) library
|
|
7
|
+
- Generate circles as shapes (instead of rectangles)
|
|
8
|
+
- Interface updated to take in optional className & style
|
|
9
|
+
- Update everywhere to use ES6
|
|
10
|
+
- Split source into self-contained functions (TODO: future testing)
|
|
11
|
+
- Everything has been updated to use flow
|
|
12
|
+
- Test the library functions
|
|
13
|
+
- Copyright headers added (original also under Apache-2.0)
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
Also see [src/demo.js](src/demo.js) for a randomly generated example.
|
|
18
|
+
|
|
19
|
+

|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Copyright 2017-2025 @pezkuwi/ui-shared authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/// <reference types="@pezkuwi/dev-test/globals.d.ts" />
|
|
5
|
+
|
|
6
|
+
import type { ColorGen } from './types.js';
|
|
7
|
+
|
|
8
|
+
import { colors as newColors } from './colors.js';
|
|
9
|
+
import { seeder as newSeeder } from './seeder.js';
|
|
10
|
+
|
|
11
|
+
describe('colors', (): void => {
|
|
12
|
+
let colors: ColorGen;
|
|
13
|
+
|
|
14
|
+
beforeEach((): void => {
|
|
15
|
+
colors = newColors(newSeeder());
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('generates using default alpha', (): void => {
|
|
19
|
+
expect(
|
|
20
|
+
colors()
|
|
21
|
+
).toEqual(
|
|
22
|
+
// with original color ...
|
|
23
|
+
// 'hsl(37.19999999999999, 100%, 54.9%)'
|
|
24
|
+
'hsl(37, 100%, 55%)'
|
|
25
|
+
);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('applies specified alpha', (): void => {
|
|
29
|
+
expect(
|
|
30
|
+
colors(0.5)
|
|
31
|
+
).toEqual(
|
|
32
|
+
// with original color ...
|
|
33
|
+
// 'hsla(37.19999999999999, 100%, 54.9%, 0.5)'
|
|
34
|
+
'hsla(37, 100%, 55%, 0.5)'
|
|
35
|
+
);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('rolates colors', (): void => {
|
|
39
|
+
const orig = colors();
|
|
40
|
+
|
|
41
|
+
expect(
|
|
42
|
+
orig
|
|
43
|
+
).toEqual('hsl(37, 100%, 55%)');
|
|
44
|
+
|
|
45
|
+
expect(
|
|
46
|
+
colors()
|
|
47
|
+
).not.toEqual(orig);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('works in edge conditions (0xff)', (): void => {
|
|
51
|
+
const u8a = new Uint8Array(32);
|
|
52
|
+
|
|
53
|
+
u8a.fill(255);
|
|
54
|
+
|
|
55
|
+
expect(
|
|
56
|
+
colors = newColors(newSeeder(u8a))
|
|
57
|
+
).not.toThrow();
|
|
58
|
+
|
|
59
|
+
expect(
|
|
60
|
+
colors()
|
|
61
|
+
).toEqual(
|
|
62
|
+
// with original color ...
|
|
63
|
+
// 'hsl(15, 0%, 100%)'
|
|
64
|
+
'hsl(0, 0%, 100%)'
|
|
65
|
+
);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Copyright 2017-2025 @pezkuwi/ui-shared authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// Copyright 2016 Dan Finlay
|
|
5
|
+
|
|
6
|
+
import type { Colord } from 'colord';
|
|
7
|
+
import type { ColorGen, Seeder } from './types.js';
|
|
8
|
+
|
|
9
|
+
import { colord } from 'colord';
|
|
10
|
+
|
|
11
|
+
import { COLORS } from './defaults.js';
|
|
12
|
+
|
|
13
|
+
const WOBBLE = 30;
|
|
14
|
+
|
|
15
|
+
export function colors (seeder: Seeder): ColorGen {
|
|
16
|
+
const amount = (seeder() * WOBBLE) - (WOBBLE / 2);
|
|
17
|
+
const all = COLORS.map((hex): Colord =>
|
|
18
|
+
colord(hex).rotate(amount)
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
return (alpha = 1): string => {
|
|
22
|
+
const index = Math.floor(all.length * seeder());
|
|
23
|
+
|
|
24
|
+
return all.splice(index, 1)[0]
|
|
25
|
+
.alpha(alpha)
|
|
26
|
+
.toHslString();
|
|
27
|
+
};
|
|
28
|
+
}
|