micro-canvas-confetti-native 0.1.0 → 1.0.0
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 +158 -142
- package/lib/commonjs/api.js +3 -3
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/coins.js.map +1 -1
- package/lib/commonjs/constants.js +6 -6
- package/lib/commonjs/constants.js.map +1 -1
- package/lib/commonjs/core.js.map +1 -1
- package/lib/commonjs/engine.js +3 -3
- package/lib/commonjs/engine.js.map +1 -1
- package/lib/commonjs/hooks/useReducedMotion.js +3 -3
- package/lib/commonjs/hooks/useReducedMotion.js.map +1 -1
- package/lib/commonjs/host/ParticleHost.js +3 -3
- package/lib/commonjs/host/ParticleHost.js.map +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/physics/collect.js.map +1 -1
- package/lib/commonjs/physics/drag.js.map +1 -1
- package/lib/commonjs/physics/spawn.js.map +1 -1
- package/lib/commonjs/physics/wobble.js.map +1 -1
- package/lib/commonjs/sequence.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/utils/math.js.map +1 -1
- package/lib/commonjs/utils/validation.js +3 -3
- package/lib/commonjs/utils/validation.js.map +1 -1
- package/lib/module/api.js +3 -3
- package/lib/module/api.js.map +1 -1
- package/lib/module/coins.js.map +1 -1
- package/lib/module/constants.js +6 -6
- package/lib/module/constants.js.map +1 -1
- package/lib/module/core.js +3 -3
- package/lib/module/core.js.map +1 -1
- package/lib/module/engine.js +3 -3
- package/lib/module/engine.js.map +1 -1
- package/lib/module/hooks/useReducedMotion.js +3 -3
- package/lib/module/hooks/useReducedMotion.js.map +1 -1
- package/lib/module/host/ParticleHost.js +3 -3
- package/lib/module/host/ParticleHost.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/physics/collect.js.map +1 -1
- package/lib/module/physics/drag.js.map +1 -1
- package/lib/module/physics/spawn.js.map +1 -1
- package/lib/module/physics/wobble.js.map +1 -1
- package/lib/module/sequence.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/utils/math.js.map +1 -1
- package/lib/module/utils/validation.js +3 -3
- package/lib/module/utils/validation.js.map +1 -1
- package/package.json +118 -118
- package/src/api.ts +78 -78
- package/src/coins.ts +8 -8
- package/src/constants.ts +187 -187
- package/src/core.ts +18 -18
- package/src/engine.ts +354 -354
- package/src/hooks/useReducedMotion.ts +26 -26
- package/src/host/ParticleHost.tsx +181 -181
- package/src/index.ts +33 -33
- package/src/physics/collect.ts +100 -100
- package/src/physics/drag.ts +15 -15
- package/src/physics/spawn.ts +139 -139
- package/src/physics/wobble.ts +11 -11
- package/src/sequence.ts +39 -39
- package/src/types.ts +243 -243
- package/src/utils/math.ts +49 -49
- package/src/utils/validation.ts +203 -203
package/package.json
CHANGED
|
@@ -1,118 +1,118 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "micro-canvas-confetti-native",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Tiny React Native confetti and coin bursts — same physics as micro-canvas-confetti-physics, plus image coins and a collect flight into a target. Views + Image only, no native modules.",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"author": "Moshe Hatab",
|
|
7
|
-
"keywords": [
|
|
8
|
-
"react-native",
|
|
9
|
-
"expo",
|
|
10
|
-
"confetti",
|
|
11
|
-
"coins",
|
|
12
|
-
"rewards",
|
|
13
|
-
"celebration",
|
|
14
|
-
"animation",
|
|
15
|
-
"particles",
|
|
16
|
-
"typescript"
|
|
17
|
-
],
|
|
18
|
-
"repository": {
|
|
19
|
-
"type": "git",
|
|
20
|
-
"url": "git+https://github.com/MosheHatab/micro-canvas-confetti-native.git"
|
|
21
|
-
},
|
|
22
|
-
"homepage": "https://github.com/MosheHatab/micro-canvas-confetti-native#readme",
|
|
23
|
-
"bugs": {
|
|
24
|
-
"url": "https://github.com/MosheHatab/micro-canvas-confetti-native/issues"
|
|
25
|
-
},
|
|
26
|
-
"main": "lib/commonjs/index.js",
|
|
27
|
-
"module": "lib/module/index.js",
|
|
28
|
-
"types": "lib/typescript/index.d.ts",
|
|
29
|
-
"react-native": "src/index.ts",
|
|
30
|
-
"source": "src/index.ts",
|
|
31
|
-
"exports": {
|
|
32
|
-
".": {
|
|
33
|
-
"types": "./lib/typescript/index.d.ts",
|
|
34
|
-
"react-native": "./src/index.ts",
|
|
35
|
-
"import": "./lib/module/index.js",
|
|
36
|
-
"require": "./lib/commonjs/index.js"
|
|
37
|
-
},
|
|
38
|
-
"./core": {
|
|
39
|
-
"types": "./lib/typescript/core.d.ts",
|
|
40
|
-
"react-native": "./src/core.ts",
|
|
41
|
-
"import": "./lib/module/core.js",
|
|
42
|
-
"require": "./lib/commonjs/core.js"
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
"files": [
|
|
46
|
-
"src",
|
|
47
|
-
"lib",
|
|
48
|
-
"!**/__tests__",
|
|
49
|
-
"!**/*.test.*"
|
|
50
|
-
],
|
|
51
|
-
"sideEffects": false,
|
|
52
|
-
"engines": {
|
|
53
|
-
"node": ">=18"
|
|
54
|
-
},
|
|
55
|
-
"scripts": {
|
|
56
|
-
"typecheck": "tsc --noEmit",
|
|
57
|
-
"build": "bob build",
|
|
58
|
-
"clean": "rimraf lib",
|
|
59
|
-
"lint": "eslint .",
|
|
60
|
-
"lint:fix": "eslint . --fix",
|
|
61
|
-
"test": "vitest run",
|
|
62
|
-
"test:watch": "vitest",
|
|
63
|
-
"changeset": "changeset",
|
|
64
|
-
"version": "changeset version",
|
|
65
|
-
"release": "npm run build && node scripts/publish.mjs",
|
|
66
|
-
"check:package": "publint",
|
|
67
|
-
"prepublishOnly": "npm run build"
|
|
68
|
-
},
|
|
69
|
-
"peerDependencies": {
|
|
70
|
-
"react": ">=18.0.0",
|
|
71
|
-
"react-native": ">=0.72.0"
|
|
72
|
-
},
|
|
73
|
-
"devDependencies": {
|
|
74
|
-
"@changesets/cli": "^2.31.0",
|
|
75
|
-
"@eslint/js": "^9.39.4",
|
|
76
|
-
"@types/react": "^18.3.12",
|
|
77
|
-
"eslint": "^9.39.4",
|
|
78
|
-
"eslint-config-prettier": "^10.1.8",
|
|
79
|
-
"eslint-plugin-react-hooks": "^7.1.1",
|
|
80
|
-
"eslint-plugin-simple-import-sort": "^13.0.0",
|
|
81
|
-
"eslint-plugin-unused-imports": "^4.4.1",
|
|
82
|
-
"publint": "^0.3.21",
|
|
83
|
-
"react": "18.3.1",
|
|
84
|
-
"react-native": "0.76.5",
|
|
85
|
-
"react-native-builder-bob": "^0.32.1",
|
|
86
|
-
"rimraf": "^6.0.1",
|
|
87
|
-
"typescript": "^5.6.3",
|
|
88
|
-
"typescript-eslint": "^8.62.1",
|
|
89
|
-
"vitest": "^4.1.9"
|
|
90
|
-
},
|
|
91
|
-
"react-native-builder-bob": {
|
|
92
|
-
"source": "src",
|
|
93
|
-
"output": "lib",
|
|
94
|
-
"targets": [
|
|
95
|
-
[
|
|
96
|
-
"module",
|
|
97
|
-
{
|
|
98
|
-
"esm": true
|
|
99
|
-
}
|
|
100
|
-
],
|
|
101
|
-
[
|
|
102
|
-
"commonjs",
|
|
103
|
-
{
|
|
104
|
-
"esm": true
|
|
105
|
-
}
|
|
106
|
-
],
|
|
107
|
-
[
|
|
108
|
-
"typescript",
|
|
109
|
-
{
|
|
110
|
-
"project": "tsconfig.build.json"
|
|
111
|
-
}
|
|
112
|
-
]
|
|
113
|
-
]
|
|
114
|
-
},
|
|
115
|
-
"publishConfig": {
|
|
116
|
-
"access": "public"
|
|
117
|
-
}
|
|
118
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "micro-canvas-confetti-native",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Tiny React Native confetti and coin bursts — same physics as micro-canvas-confetti-physics, plus image coins and a collect flight into a target. Views + Image only, no native modules.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Moshe Hatab",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"react-native",
|
|
9
|
+
"expo",
|
|
10
|
+
"confetti",
|
|
11
|
+
"coins",
|
|
12
|
+
"rewards",
|
|
13
|
+
"celebration",
|
|
14
|
+
"animation",
|
|
15
|
+
"particles",
|
|
16
|
+
"typescript"
|
|
17
|
+
],
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/MosheHatab/micro-canvas-confetti-native.git"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://github.com/MosheHatab/micro-canvas-confetti-native#readme",
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/MosheHatab/micro-canvas-confetti-native/issues"
|
|
25
|
+
},
|
|
26
|
+
"main": "lib/commonjs/index.js",
|
|
27
|
+
"module": "lib/module/index.js",
|
|
28
|
+
"types": "lib/typescript/index.d.ts",
|
|
29
|
+
"react-native": "src/index.ts",
|
|
30
|
+
"source": "src/index.ts",
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./lib/typescript/index.d.ts",
|
|
34
|
+
"react-native": "./src/index.ts",
|
|
35
|
+
"import": "./lib/module/index.js",
|
|
36
|
+
"require": "./lib/commonjs/index.js"
|
|
37
|
+
},
|
|
38
|
+
"./core": {
|
|
39
|
+
"types": "./lib/typescript/core.d.ts",
|
|
40
|
+
"react-native": "./src/core.ts",
|
|
41
|
+
"import": "./lib/module/core.js",
|
|
42
|
+
"require": "./lib/commonjs/core.js"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"files": [
|
|
46
|
+
"src",
|
|
47
|
+
"lib",
|
|
48
|
+
"!**/__tests__",
|
|
49
|
+
"!**/*.test.*"
|
|
50
|
+
],
|
|
51
|
+
"sideEffects": false,
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=18"
|
|
54
|
+
},
|
|
55
|
+
"scripts": {
|
|
56
|
+
"typecheck": "tsc --noEmit",
|
|
57
|
+
"build": "bob build",
|
|
58
|
+
"clean": "rimraf lib",
|
|
59
|
+
"lint": "eslint .",
|
|
60
|
+
"lint:fix": "eslint . --fix",
|
|
61
|
+
"test": "vitest run",
|
|
62
|
+
"test:watch": "vitest",
|
|
63
|
+
"changeset": "changeset",
|
|
64
|
+
"version": "changeset version",
|
|
65
|
+
"release": "npm run build && node scripts/publish.mjs",
|
|
66
|
+
"check:package": "publint",
|
|
67
|
+
"prepublishOnly": "npm run build"
|
|
68
|
+
},
|
|
69
|
+
"peerDependencies": {
|
|
70
|
+
"react": ">=18.0.0",
|
|
71
|
+
"react-native": ">=0.72.0"
|
|
72
|
+
},
|
|
73
|
+
"devDependencies": {
|
|
74
|
+
"@changesets/cli": "^2.31.0",
|
|
75
|
+
"@eslint/js": "^9.39.4",
|
|
76
|
+
"@types/react": "^18.3.12",
|
|
77
|
+
"eslint": "^9.39.4",
|
|
78
|
+
"eslint-config-prettier": "^10.1.8",
|
|
79
|
+
"eslint-plugin-react-hooks": "^7.1.1",
|
|
80
|
+
"eslint-plugin-simple-import-sort": "^13.0.0",
|
|
81
|
+
"eslint-plugin-unused-imports": "^4.4.1",
|
|
82
|
+
"publint": "^0.3.21",
|
|
83
|
+
"react": "18.3.1",
|
|
84
|
+
"react-native": "0.76.5",
|
|
85
|
+
"react-native-builder-bob": "^0.32.1",
|
|
86
|
+
"rimraf": "^6.0.1",
|
|
87
|
+
"typescript": "^5.6.3",
|
|
88
|
+
"typescript-eslint": "^8.62.1",
|
|
89
|
+
"vitest": "^4.1.9"
|
|
90
|
+
},
|
|
91
|
+
"react-native-builder-bob": {
|
|
92
|
+
"source": "src",
|
|
93
|
+
"output": "lib",
|
|
94
|
+
"targets": [
|
|
95
|
+
[
|
|
96
|
+
"module",
|
|
97
|
+
{
|
|
98
|
+
"esm": true
|
|
99
|
+
}
|
|
100
|
+
],
|
|
101
|
+
[
|
|
102
|
+
"commonjs",
|
|
103
|
+
{
|
|
104
|
+
"esm": true
|
|
105
|
+
}
|
|
106
|
+
],
|
|
107
|
+
[
|
|
108
|
+
"typescript",
|
|
109
|
+
{
|
|
110
|
+
"project": "tsconfig.build.json"
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
]
|
|
114
|
+
},
|
|
115
|
+
"publishConfig": {
|
|
116
|
+
"access": "public"
|
|
117
|
+
}
|
|
118
|
+
}
|
package/src/api.ts
CHANGED
|
@@ -1,78 +1,78 @@
|
|
|
1
|
-
import { createBatch, ParticleEngine } from "./engine";
|
|
2
|
-
import { createSequenceRunner } from "./sequence";
|
|
3
|
-
import type {
|
|
4
|
-
CollectOptions,
|
|
5
|
-
ConfettiFn,
|
|
6
|
-
ConfettiHandle,
|
|
7
|
-
ConfettiOptions,
|
|
8
|
-
ConfettiOrigin,
|
|
9
|
-
ConfettiSequenceFn,
|
|
10
|
-
} from "./types";
|
|
11
|
-
|
|
12
|
-
/** Shared store the `ParticleHost` draws. One per app. */
|
|
13
|
-
export const engine = new ParticleEngine();
|
|
14
|
-
|
|
15
|
-
/** Stops every burst and flight, clears the screen, and resolves pending promises. */
|
|
16
|
-
export function reset(): void {
|
|
17
|
-
engine.reset();
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function launchBurst(options?: ConfettiOptions): { handle: ConfettiHandle; promise: Promise<void> } {
|
|
21
|
-
const { batch, promise } = createBatch();
|
|
22
|
-
engine.burst(options, batch);
|
|
23
|
-
return {
|
|
24
|
-
handle: { reset, isActive: () => batch.remaining !== 0 },
|
|
25
|
-
promise,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** Flies pieces from `origin` into `target`, shrinking as they land. Resolves when all have landed. */
|
|
30
|
-
export function collect(options: CollectOptions): Promise<void> {
|
|
31
|
-
const { batch, promise } = createBatch(options?.onArrive);
|
|
32
|
-
try {
|
|
33
|
-
engine.collect(options, batch);
|
|
34
|
-
} catch (error) {
|
|
35
|
-
return Promise.reject(error);
|
|
36
|
-
}
|
|
37
|
-
return promise;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/** Main API — trigger a burst, await it, or run a collect flight. */
|
|
41
|
-
export const confetti: ConfettiFn = Object.assign(
|
|
42
|
-
(options?: ConfettiOptions): ConfettiHandle => launchBurst(options).handle,
|
|
43
|
-
{
|
|
44
|
-
promise: (options?: ConfettiOptions): Promise<void> => launchBurst(options).promise,
|
|
45
|
-
collect,
|
|
46
|
-
},
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
/** Fires a series of bursts on a timeline. Returns a handle to cancel or await. */
|
|
50
|
-
export const confettiSequence: ConfettiSequenceFn = createSequenceRunner(confetti);
|
|
51
|
-
|
|
52
|
-
/** Number of pieces currently on screen. */
|
|
53
|
-
export function getActiveParticleCount(): number {
|
|
54
|
-
return engine.activeCount;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** Anything with React Native's `measureInWindow` — a `View`, `Text`, or `Pressable` ref. */
|
|
58
|
-
export interface Measurable {
|
|
59
|
-
measureInWindow(callback: (x: number, y: number, width: number, height: number) => void): void;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Center of a mounted view in window coordinates — use it as a collect `target`
|
|
64
|
-
* (or a burst `origin`). Accepts the ref object or the instance.
|
|
65
|
-
*/
|
|
66
|
-
export function measureCenter(
|
|
67
|
-
ref: Measurable | { readonly current: Measurable | null } | null,
|
|
68
|
-
): Promise<ConfettiOrigin> {
|
|
69
|
-
const node = ref !== null && "current" in ref ? ref.current : ref;
|
|
70
|
-
if (node === null || typeof node.measureInWindow !== "function") {
|
|
71
|
-
return Promise.reject(new TypeError("measureCenter: the ref is not attached to a view yet."));
|
|
72
|
-
}
|
|
73
|
-
return new Promise((resolve) => {
|
|
74
|
-
node.measureInWindow((x, y, width, height) => {
|
|
75
|
-
resolve({ x: x + width / 2, y: y + height / 2 });
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
}
|
|
1
|
+
import { createBatch, ParticleEngine } from "./engine";
|
|
2
|
+
import { createSequenceRunner } from "./sequence";
|
|
3
|
+
import type {
|
|
4
|
+
CollectOptions,
|
|
5
|
+
ConfettiFn,
|
|
6
|
+
ConfettiHandle,
|
|
7
|
+
ConfettiOptions,
|
|
8
|
+
ConfettiOrigin,
|
|
9
|
+
ConfettiSequenceFn,
|
|
10
|
+
} from "./types";
|
|
11
|
+
|
|
12
|
+
/** Shared store the `ParticleHost` draws. One per app. */
|
|
13
|
+
export const engine = new ParticleEngine();
|
|
14
|
+
|
|
15
|
+
/** Stops every burst and flight, clears the screen, and resolves pending promises. */
|
|
16
|
+
export function reset(): void {
|
|
17
|
+
engine.reset();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function launchBurst(options?: ConfettiOptions): { handle: ConfettiHandle; promise: Promise<void> } {
|
|
21
|
+
const { batch, promise } = createBatch();
|
|
22
|
+
engine.burst(options, batch);
|
|
23
|
+
return {
|
|
24
|
+
handle: { reset, isActive: () => batch.remaining !== 0 },
|
|
25
|
+
promise,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Flies pieces from `origin` into `target`, shrinking as they land. Resolves when all have landed. */
|
|
30
|
+
export function collect(options: CollectOptions): Promise<void> {
|
|
31
|
+
const { batch, promise } = createBatch(options?.onArrive);
|
|
32
|
+
try {
|
|
33
|
+
engine.collect(options, batch);
|
|
34
|
+
} catch (error) {
|
|
35
|
+
return Promise.reject(error);
|
|
36
|
+
}
|
|
37
|
+
return promise;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Main API — trigger a burst, await it, or run a collect flight. */
|
|
41
|
+
export const confetti: ConfettiFn = Object.assign(
|
|
42
|
+
(options?: ConfettiOptions): ConfettiHandle => launchBurst(options).handle,
|
|
43
|
+
{
|
|
44
|
+
promise: (options?: ConfettiOptions): Promise<void> => launchBurst(options).promise,
|
|
45
|
+
collect,
|
|
46
|
+
},
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
/** Fires a series of bursts on a timeline. Returns a handle to cancel or await. */
|
|
50
|
+
export const confettiSequence: ConfettiSequenceFn = createSequenceRunner(confetti);
|
|
51
|
+
|
|
52
|
+
/** Number of pieces currently on screen. */
|
|
53
|
+
export function getActiveParticleCount(): number {
|
|
54
|
+
return engine.activeCount;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Anything with React Native's `measureInWindow` — a `View`, `Text`, or `Pressable` ref. */
|
|
58
|
+
export interface Measurable {
|
|
59
|
+
measureInWindow(callback: (x: number, y: number, width: number, height: number) => void): void;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Center of a mounted view in window coordinates — use it as a collect `target`
|
|
64
|
+
* (or a burst `origin`). Accepts the ref object or the instance.
|
|
65
|
+
*/
|
|
66
|
+
export function measureCenter(
|
|
67
|
+
ref: Measurable | { readonly current: Measurable | null } | null,
|
|
68
|
+
): Promise<ConfettiOrigin> {
|
|
69
|
+
const node = ref !== null && "current" in ref ? ref.current : ref;
|
|
70
|
+
if (node === null || typeof node.measureInWindow !== "function") {
|
|
71
|
+
return Promise.reject(new TypeError("measureCenter: the ref is not attached to a view yet."));
|
|
72
|
+
}
|
|
73
|
+
return new Promise((resolve) => {
|
|
74
|
+
node.measureInWindow((x, y, width, height) => {
|
|
75
|
+
resolve({ x: x + width / 2, y: y + height / 2 });
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
package/src/coins.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { ImageSourcePropType } from "react-native";
|
|
2
|
-
|
|
3
|
-
import type { CoinType } from "./types";
|
|
4
|
-
|
|
5
|
-
/** Built-in coin artwork, 256×256 transparent PNGs. */
|
|
6
|
-
export const COIN_IMAGES: Record<CoinType, ImageSourcePropType> = {
|
|
7
|
-
"h-keystone": require("./assets/coins/h-keystone.png"),
|
|
8
|
-
};
|
|
1
|
+
import type { ImageSourcePropType } from "react-native";
|
|
2
|
+
|
|
3
|
+
import type { CoinType } from "./types";
|
|
4
|
+
|
|
5
|
+
/** Built-in coin artwork, 256×256 transparent PNGs. */
|
|
6
|
+
export const COIN_IMAGES: Record<CoinType, ImageSourcePropType> = {
|
|
7
|
+
"h-keystone": require("./assets/coins/h-keystone.png"),
|
|
8
|
+
};
|