solfaces 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/LICENSE +21 -0
- package/README.md +518 -0
- package/dist/agent/index.cjs +51 -0
- package/dist/agent/index.cjs.map +1 -0
- package/dist/agent/index.d.cts +65 -0
- package/dist/agent/index.d.ts +65 -0
- package/dist/agent/index.js +6 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/mcp-server.cjs +836 -0
- package/dist/chunk-2DIKGLXZ.cjs +126 -0
- package/dist/chunk-2DIKGLXZ.cjs.map +1 -0
- package/dist/chunk-A6N3RPEA.cjs +111 -0
- package/dist/chunk-A6N3RPEA.cjs.map +1 -0
- package/dist/chunk-CVFO7YHY.cjs +97 -0
- package/dist/chunk-CVFO7YHY.cjs.map +1 -0
- package/dist/chunk-H3SK3MNX.cjs +409 -0
- package/dist/chunk-H3SK3MNX.cjs.map +1 -0
- package/dist/chunk-KSGFMW33.js +401 -0
- package/dist/chunk-KSGFMW33.js.map +1 -0
- package/dist/chunk-LQWJRHGC.js +86 -0
- package/dist/chunk-LQWJRHGC.js.map +1 -0
- package/dist/chunk-RX6D5FGH.js +211 -0
- package/dist/chunk-RX6D5FGH.js.map +1 -0
- package/dist/chunk-SNJABBAT.js +107 -0
- package/dist/chunk-SNJABBAT.js.map +1 -0
- package/dist/chunk-VMNATBH3.cjs +222 -0
- package/dist/chunk-VMNATBH3.cjs.map +1 -0
- package/dist/chunk-WURY4QGH.js +117 -0
- package/dist/chunk-WURY4QGH.js.map +1 -0
- package/dist/core/index.cjs +82 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +104 -0
- package/dist/core/index.d.ts +104 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/index.cjs +100 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.cjs +543 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +28 -0
- package/dist/react/index.d.ts +28 -0
- package/dist/react/index.js +541 -0
- package/dist/react/index.js.map +1 -0
- package/dist/solfaces.cdn.global.js +3 -0
- package/dist/solfaces.cdn.global.js.map +1 -0
- package/dist/themes/index.cjs +48 -0
- package/dist/themes/index.cjs.map +1 -0
- package/dist/themes/index.d.cts +14 -0
- package/dist/themes/index.d.ts +14 -0
- package/dist/themes/index.js +3 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/traits-DAFZnXeS.d.cts +61 -0
- package/dist/traits-DAFZnXeS.d.ts +61 -0
- package/dist/vanilla/index.cjs +43 -0
- package/dist/vanilla/index.cjs.map +1 -0
- package/dist/vanilla/index.d.cts +7 -0
- package/dist/vanilla/index.d.ts +7 -0
- package/dist/vanilla/index.js +39 -0
- package/dist/vanilla/index.js.map +1 -0
- package/package.json +100 -0
- package/python/solfaces.py +475 -0
- package/skill.md +463 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/core/traits.ts
|
|
4
|
+
var SKIN_COLORS = [
|
|
5
|
+
"#ffd5b0",
|
|
6
|
+
"#f4c794",
|
|
7
|
+
"#e0a370",
|
|
8
|
+
"#c68642",
|
|
9
|
+
"#8d5524",
|
|
10
|
+
"#4a2c17"
|
|
11
|
+
];
|
|
12
|
+
var EYE_COLORS = [
|
|
13
|
+
"#3d2b1f",
|
|
14
|
+
// dark brown
|
|
15
|
+
"#4a80c4",
|
|
16
|
+
// blue
|
|
17
|
+
"#5a9a5a",
|
|
18
|
+
// green
|
|
19
|
+
"#c89430",
|
|
20
|
+
// amber
|
|
21
|
+
"#8a8a8a"
|
|
22
|
+
// gray
|
|
23
|
+
];
|
|
24
|
+
var HAIR_COLORS = [
|
|
25
|
+
"#1a1a1a",
|
|
26
|
+
// black
|
|
27
|
+
"#6b3a2a",
|
|
28
|
+
// brown
|
|
29
|
+
"#d4a844",
|
|
30
|
+
// blonde
|
|
31
|
+
"#c44a20",
|
|
32
|
+
// ginger
|
|
33
|
+
"#c8e64a",
|
|
34
|
+
// neon lime
|
|
35
|
+
"#6090e0",
|
|
36
|
+
// neon blue
|
|
37
|
+
"#14F195",
|
|
38
|
+
// neon mint
|
|
39
|
+
"#e040c0"
|
|
40
|
+
// neon magenta
|
|
41
|
+
];
|
|
42
|
+
var BG_COLORS = [
|
|
43
|
+
"#c8e64a",
|
|
44
|
+
"#6090e0",
|
|
45
|
+
"#14F195",
|
|
46
|
+
"#e8dcc8",
|
|
47
|
+
"#f85149"
|
|
48
|
+
];
|
|
49
|
+
function djb2(str) {
|
|
50
|
+
let hash = 5381;
|
|
51
|
+
for (let i = 0; i < str.length; i++) {
|
|
52
|
+
hash = (hash << 5) + hash + str.charCodeAt(i) | 0;
|
|
53
|
+
}
|
|
54
|
+
return hash >>> 0;
|
|
55
|
+
}
|
|
56
|
+
function mulberry32(seed) {
|
|
57
|
+
let s = seed | 0;
|
|
58
|
+
return () => {
|
|
59
|
+
s = s + 1831565813 | 0;
|
|
60
|
+
let t = Math.imul(s ^ s >>> 15, 1 | s);
|
|
61
|
+
t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
|
|
62
|
+
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function generateTraits(walletAddress, overrides) {
|
|
66
|
+
const seed = djb2(walletAddress);
|
|
67
|
+
const rand = mulberry32(seed);
|
|
68
|
+
const traits = {
|
|
69
|
+
faceShape: Math.floor(rand() * 4),
|
|
70
|
+
skinColor: Math.floor(rand() * 6),
|
|
71
|
+
eyeStyle: Math.floor(rand() * 8),
|
|
72
|
+
eyeColor: Math.floor(rand() * 5),
|
|
73
|
+
eyebrows: Math.floor(rand() * 5),
|
|
74
|
+
nose: Math.floor(rand() * 4),
|
|
75
|
+
mouth: Math.floor(rand() * 6),
|
|
76
|
+
hairStyle: Math.floor(rand() * 8),
|
|
77
|
+
hairColor: Math.floor(rand() * 8),
|
|
78
|
+
accessory: Math.floor(rand() * 6),
|
|
79
|
+
bgColor: Math.floor(rand() * 5)
|
|
80
|
+
};
|
|
81
|
+
return overrides ? { ...traits, ...overrides } : traits;
|
|
82
|
+
}
|
|
83
|
+
var FACE_LABELS = ["Round", "Square", "Oval", "Hexagon"];
|
|
84
|
+
var SKIN_LABELS = ["Light Peach", "Warm Tan", "Golden Brown", "Medium Brown", "Deep Brown", "Rich Dark Brown"];
|
|
85
|
+
var EYE_STYLE_LABELS = ["Round", "Dots", "Almond", "Wide", "Sleepy", "Winking", "Lashes", "Narrow"];
|
|
86
|
+
var EYE_COLOR_LABELS = ["Dark Brown", "Blue", "Green", "Amber", "Gray"];
|
|
87
|
+
var BROW_LABELS = ["None", "Thin", "Thick", "Arched", "Angled"];
|
|
88
|
+
var NOSE_LABELS = ["None", "Dot", "Triangle", "Button"];
|
|
89
|
+
var MOUTH_LABELS = ["Smile", "Neutral", "Grin", "Open", "Smirk", "Wide Smile"];
|
|
90
|
+
var HAIR_STYLE_LABELS = ["Bald", "Short", "Spiky", "Swept", "Mohawk", "Long", "Bob", "Buzz"];
|
|
91
|
+
var HAIR_COLOR_LABELS = ["Black", "Brown", "Blonde", "Ginger", "Neon Lime", "Neon Blue", "Solana Mint", "Neon Magenta"];
|
|
92
|
+
var ACCESSORY_LABELS = ["None", "None", "Round Glasses", "Square Glasses", "Earring", "Bandana"];
|
|
93
|
+
var BG_COLOR_LABELS = ["Lime", "Blue", "Mint", "Sand", "Red"];
|
|
94
|
+
function getTraitLabels(traits) {
|
|
95
|
+
return {
|
|
96
|
+
faceShape: FACE_LABELS[traits.faceShape] ?? "Round",
|
|
97
|
+
skinColor: SKIN_LABELS[traits.skinColor] ?? "Warm Tan",
|
|
98
|
+
eyeStyle: EYE_STYLE_LABELS[traits.eyeStyle] ?? "Round",
|
|
99
|
+
eyeColor: EYE_COLOR_LABELS[traits.eyeColor] ?? "Dark Brown",
|
|
100
|
+
eyebrows: BROW_LABELS[traits.eyebrows] ?? "None",
|
|
101
|
+
nose: NOSE_LABELS[traits.nose] ?? "None",
|
|
102
|
+
mouth: MOUTH_LABELS[traits.mouth] ?? "Smile",
|
|
103
|
+
hairStyle: HAIR_STYLE_LABELS[traits.hairStyle] ?? "Bald",
|
|
104
|
+
hairColor: HAIR_COLOR_LABELS[traits.hairColor] ?? "Black",
|
|
105
|
+
accessory: ACCESSORY_LABELS[traits.accessory] ?? "None",
|
|
106
|
+
bgColor: BG_COLOR_LABELS[traits.bgColor] ?? "Lime"
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function traitHash(walletAddress) {
|
|
110
|
+
return (djb2(walletAddress) >>> 0).toString(16).padStart(8, "0");
|
|
111
|
+
}
|
|
112
|
+
function resolveTheme(themeName, themes) {
|
|
113
|
+
if (!themeName || !themes) return void 0;
|
|
114
|
+
return themes[themeName];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
exports.BG_COLORS = BG_COLORS;
|
|
118
|
+
exports.EYE_COLORS = EYE_COLORS;
|
|
119
|
+
exports.HAIR_COLORS = HAIR_COLORS;
|
|
120
|
+
exports.SKIN_COLORS = SKIN_COLORS;
|
|
121
|
+
exports.generateTraits = generateTraits;
|
|
122
|
+
exports.getTraitLabels = getTraitLabels;
|
|
123
|
+
exports.resolveTheme = resolveTheme;
|
|
124
|
+
exports.traitHash = traitHash;
|
|
125
|
+
//# sourceMappingURL=chunk-2DIKGLXZ.cjs.map
|
|
126
|
+
//# sourceMappingURL=chunk-2DIKGLXZ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/traits.ts"],"names":[],"mappings":"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","file":"chunk-2DIKGLXZ.cjs","sourcesContent":["// ═══════════════════════════════════════════════════\n// SOLFACES — Deterministic avatar trait engine\n// ═══════════════════════════════════════════════════\n\n// ─── Types ────────────────────────────────────────\n\nexport interface SolFaceTraits {\n faceShape: number; // 0-3\n skinColor: number; // 0-5\n eyeStyle: number; // 0-7\n eyeColor: number; // 0-4\n eyebrows: number; // 0-4\n nose: number; // 0-3\n mouth: number; // 0-5\n hairStyle: number; // 0-7\n hairColor: number; // 0-7\n accessory: number; // 0-5 (0-1 = none, 2-5 = items)\n bgColor: number; // 0-4\n}\n\nexport interface SolFaceTheme {\n skinColors?: string[];\n eyeColors?: string[];\n hairColors?: string[];\n bgColors?: string[];\n mouthColor?: string;\n eyebrowColor?: string;\n accessoryColor?: string;\n eyeWhiteColor?: string;\n noseColor?: string;\n bgOpacity?: number;\n bgRadius?: number;\n border?: { color: string; width: number };\n}\n\nexport interface RenderOptions {\n size?: number;\n theme?: SolFaceTheme;\n traitOverrides?: Partial<SolFaceTraits>;\n enableBlink?: boolean | {\n duration?: number;\n delay?: number;\n };\n className?: string;\n colorOverrides?: {\n skin?: string;\n eyes?: string;\n hair?: string;\n bg?: string;\n mouth?: string;\n eyebrow?: string;\n accessory?: string;\n nose?: string;\n eyeWhite?: string;\n };\n}\n\n// ─── Color Palettes ──────────────────────────────\n\nexport const SKIN_COLORS = [\n \"#ffd5b0\", \"#f4c794\", \"#e0a370\",\n \"#c68642\", \"#8d5524\", \"#4a2c17\",\n];\n\nexport const EYE_COLORS = [\n \"#3d2b1f\", // dark brown\n \"#4a80c4\", // blue\n \"#5a9a5a\", // green\n \"#c89430\", // amber\n \"#8a8a8a\", // gray\n];\n\nexport const HAIR_COLORS = [\n \"#1a1a1a\", // black\n \"#6b3a2a\", // brown\n \"#d4a844\", // blonde\n \"#c44a20\", // ginger\n \"#c8e64a\", // neon lime\n \"#6090e0\", // neon blue\n \"#14F195\", // neon mint\n \"#e040c0\", // neon magenta\n];\n\nexport const BG_COLORS = [\n \"#c8e64a\", \"#6090e0\", \"#14F195\", \"#e8dcc8\", \"#f85149\",\n];\n\n// ─── Hashing (djb2) ─────────────────────────────\n\nfunction djb2(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0;\n}\n\n// ─── PRNG (mulberry32) ──────────────────────────\n\nfunction mulberry32(seed: number): () => number {\n let s = seed | 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n// ─── Trait Generation ───────────────────────────\n\nexport function generateTraits(\n walletAddress: string,\n overrides?: Partial<SolFaceTraits>\n): SolFaceTraits {\n const seed = djb2(walletAddress);\n const rand = mulberry32(seed);\n\n const traits: SolFaceTraits = {\n faceShape: Math.floor(rand() * 4),\n skinColor: Math.floor(rand() * 6),\n eyeStyle: Math.floor(rand() * 8),\n eyeColor: Math.floor(rand() * 5),\n eyebrows: Math.floor(rand() * 5),\n nose: Math.floor(rand() * 4),\n mouth: Math.floor(rand() * 6),\n hairStyle: Math.floor(rand() * 8),\n hairColor: Math.floor(rand() * 8),\n accessory: Math.floor(rand() * 6),\n bgColor: Math.floor(rand() * 5),\n };\n\n return overrides ? { ...traits, ...overrides } : traits;\n}\n\n// ─── Trait Labels ───────────────────────────────\n\nconst FACE_LABELS = [\"Round\", \"Square\", \"Oval\", \"Hexagon\"];\nconst SKIN_LABELS = [\"Light Peach\", \"Warm Tan\", \"Golden Brown\", \"Medium Brown\", \"Deep Brown\", \"Rich Dark Brown\"];\nconst EYE_STYLE_LABELS = [\"Round\", \"Dots\", \"Almond\", \"Wide\", \"Sleepy\", \"Winking\", \"Lashes\", \"Narrow\"];\nconst EYE_COLOR_LABELS = [\"Dark Brown\", \"Blue\", \"Green\", \"Amber\", \"Gray\"];\nconst BROW_LABELS = [\"None\", \"Thin\", \"Thick\", \"Arched\", \"Angled\"];\nconst NOSE_LABELS = [\"None\", \"Dot\", \"Triangle\", \"Button\"];\nconst MOUTH_LABELS = [\"Smile\", \"Neutral\", \"Grin\", \"Open\", \"Smirk\", \"Wide Smile\"];\nconst HAIR_STYLE_LABELS = [\"Bald\", \"Short\", \"Spiky\", \"Swept\", \"Mohawk\", \"Long\", \"Bob\", \"Buzz\"];\nconst HAIR_COLOR_LABELS = [\"Black\", \"Brown\", \"Blonde\", \"Ginger\", \"Neon Lime\", \"Neon Blue\", \"Solana Mint\", \"Neon Magenta\"];\nconst ACCESSORY_LABELS = [\"None\", \"None\", \"Round Glasses\", \"Square Glasses\", \"Earring\", \"Bandana\"];\nconst BG_COLOR_LABELS = [\"Lime\", \"Blue\", \"Mint\", \"Sand\", \"Red\"];\n\nexport function getTraitLabels(traits: SolFaceTraits): Record<string, string> {\n return {\n faceShape: FACE_LABELS[traits.faceShape] ?? \"Round\",\n skinColor: SKIN_LABELS[traits.skinColor] ?? \"Warm Tan\",\n eyeStyle: EYE_STYLE_LABELS[traits.eyeStyle] ?? \"Round\",\n eyeColor: EYE_COLOR_LABELS[traits.eyeColor] ?? \"Dark Brown\",\n eyebrows: BROW_LABELS[traits.eyebrows] ?? \"None\",\n nose: NOSE_LABELS[traits.nose] ?? \"None\",\n mouth: MOUTH_LABELS[traits.mouth] ?? \"Smile\",\n hairStyle: HAIR_STYLE_LABELS[traits.hairStyle] ?? \"Bald\",\n hairColor: HAIR_COLOR_LABELS[traits.hairColor] ?? \"Black\",\n accessory: ACCESSORY_LABELS[traits.accessory] ?? \"None\",\n bgColor: BG_COLOR_LABELS[traits.bgColor] ?? \"Lime\",\n };\n}\n\n// ─── Trait Hash ─────────────────────────────────\n\nexport function traitHash(walletAddress: string): string {\n return (djb2(walletAddress) >>> 0).toString(16).padStart(8, \"0\");\n}\n\n// ─── Theme Resolution ───────────────────────────\n\nexport function resolveTheme(\n themeName?: string,\n themes?: Record<string, SolFaceTheme>\n): SolFaceTheme | undefined {\n if (!themeName || !themes) return undefined;\n return themes[themeName];\n}\n"]}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkH3SK3MNX_cjs = require('./chunk-H3SK3MNX.cjs');
|
|
4
|
+
|
|
5
|
+
// src/core/rasterize.ts
|
|
6
|
+
async function renderSolFacePNG(walletAddress, options) {
|
|
7
|
+
const { pngSize = 256, ...renderOpts } = options ?? {};
|
|
8
|
+
const svg = chunkH3SK3MNX_cjs.renderSolFaceSVG(walletAddress, {
|
|
9
|
+
...renderOpts,
|
|
10
|
+
size: pngSize
|
|
11
|
+
});
|
|
12
|
+
const svgBuffer = Buffer.from(svg);
|
|
13
|
+
try {
|
|
14
|
+
const sharp = await import('sharp');
|
|
15
|
+
return await sharp.default(svgBuffer).resize(pngSize, pngSize).png().toBuffer();
|
|
16
|
+
} catch {
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const { Resvg } = await import('@resvg/resvg-js');
|
|
20
|
+
const resvg = new Resvg(svg, {
|
|
21
|
+
fitTo: { mode: "width", value: pngSize }
|
|
22
|
+
});
|
|
23
|
+
const pngData = resvg.render();
|
|
24
|
+
return Buffer.from(pngData.asPng());
|
|
25
|
+
} catch {
|
|
26
|
+
}
|
|
27
|
+
throw new Error(
|
|
28
|
+
"[SolFaces] PNG rasterization requires either `sharp` or `@resvg/resvg-js`. Install one: npm install sharp OR npm install @resvg/resvg-js"
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
async function renderSolFacePNGBrowser(walletAddress, options) {
|
|
32
|
+
const { pngSize = 256, ...renderOpts } = options ?? {};
|
|
33
|
+
const svg = chunkH3SK3MNX_cjs.renderSolFaceSVG(walletAddress, {
|
|
34
|
+
...renderOpts,
|
|
35
|
+
size: pngSize
|
|
36
|
+
});
|
|
37
|
+
const svgBlob = new Blob([svg], { type: "image/svg+xml;charset=utf-8" });
|
|
38
|
+
const url = URL.createObjectURL(svgBlob);
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
const img = new Image();
|
|
41
|
+
img.onload = () => {
|
|
42
|
+
let canvas;
|
|
43
|
+
let ctx;
|
|
44
|
+
if (typeof OffscreenCanvas !== "undefined") {
|
|
45
|
+
canvas = new OffscreenCanvas(pngSize, pngSize);
|
|
46
|
+
ctx = canvas.getContext("2d");
|
|
47
|
+
} else {
|
|
48
|
+
canvas = document.createElement("canvas");
|
|
49
|
+
canvas.width = pngSize;
|
|
50
|
+
canvas.height = pngSize;
|
|
51
|
+
ctx = canvas.getContext("2d");
|
|
52
|
+
}
|
|
53
|
+
if (!ctx) {
|
|
54
|
+
URL.revokeObjectURL(url);
|
|
55
|
+
reject(new Error("[SolFaces] Could not get canvas context"));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
ctx.drawImage(img, 0, 0, pngSize, pngSize);
|
|
59
|
+
URL.revokeObjectURL(url);
|
|
60
|
+
if (canvas instanceof OffscreenCanvas) {
|
|
61
|
+
canvas.convertToBlob({ type: "image/png" }).then(resolve).catch(reject);
|
|
62
|
+
} else {
|
|
63
|
+
canvas.toBlob((blob) => {
|
|
64
|
+
if (blob) resolve(blob);
|
|
65
|
+
else reject(new Error("[SolFaces] Canvas toBlob failed"));
|
|
66
|
+
}, "image/png");
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
img.onerror = () => {
|
|
70
|
+
URL.revokeObjectURL(url);
|
|
71
|
+
reject(new Error("[SolFaces] Failed to load SVG into image"));
|
|
72
|
+
};
|
|
73
|
+
img.src = url;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async function renderSolFacePNGDataURL(walletAddress, options) {
|
|
77
|
+
const { pngSize = 256, ...renderOpts } = options ?? {};
|
|
78
|
+
const svg = chunkH3SK3MNX_cjs.renderSolFaceSVG(walletAddress, {
|
|
79
|
+
...renderOpts,
|
|
80
|
+
size: pngSize
|
|
81
|
+
});
|
|
82
|
+
const svgBlob = new Blob([svg], { type: "image/svg+xml;charset=utf-8" });
|
|
83
|
+
const url = URL.createObjectURL(svgBlob);
|
|
84
|
+
return new Promise((resolve, reject) => {
|
|
85
|
+
const img = new Image();
|
|
86
|
+
img.onload = () => {
|
|
87
|
+
const canvas = document.createElement("canvas");
|
|
88
|
+
canvas.width = pngSize;
|
|
89
|
+
canvas.height = pngSize;
|
|
90
|
+
const ctx = canvas.getContext("2d");
|
|
91
|
+
if (!ctx) {
|
|
92
|
+
reject(new Error("[SolFaces] No canvas context"));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
ctx.drawImage(img, 0, 0, pngSize, pngSize);
|
|
96
|
+
URL.revokeObjectURL(url);
|
|
97
|
+
resolve(canvas.toDataURL("image/png"));
|
|
98
|
+
};
|
|
99
|
+
img.onerror = () => {
|
|
100
|
+
URL.revokeObjectURL(url);
|
|
101
|
+
reject(new Error("[SolFaces] SVG load failed"));
|
|
102
|
+
};
|
|
103
|
+
img.src = url;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
exports.renderSolFacePNG = renderSolFacePNG;
|
|
108
|
+
exports.renderSolFacePNGBrowser = renderSolFacePNGBrowser;
|
|
109
|
+
exports.renderSolFacePNGDataURL = renderSolFacePNGDataURL;
|
|
110
|
+
//# sourceMappingURL=chunk-A6N3RPEA.cjs.map
|
|
111
|
+
//# sourceMappingURL=chunk-A6N3RPEA.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/rasterize.ts"],"names":["renderSolFaceSVG"],"mappings":"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","file":"chunk-A6N3RPEA.cjs","sourcesContent":["// ═══════════════════════════════════════════════════════════════\n// SOLFACES — PNG Rasterizer\n// Converts SolFace SVGs to PNG buffers for use in bots, APIs,\n// Discord embeds, Telegram, emails, and non-SVG contexts.\n//\n// Works in:\n// - Node.js (via sharp or canvas fallback)\n// - Browser (via OffscreenCanvas or <canvas>)\n// - Edge functions (via resvg-wasm)\n// ═══════════════════════════════════════════════════════════════\n\nimport { renderSolFaceSVG, type RenderOptions } from \"./renderer\";\n\nexport interface PNGOptions extends RenderOptions {\n /** Output pixel size (both width and height). Default: 256 */\n pngSize?: number;\n /** PNG quality (0-1, only affects some renderers). Default: 1 */\n quality?: number;\n}\n\n// ─── Node.js Rasterization ───────────────────────────────────\n\n/**\n * Render a SolFace as a PNG Buffer using `sharp`.\n * Requires: `npm install sharp`\n *\n * @returns PNG buffer\n *\n * @example\n * ```ts\n * import { renderSolFacePNG } from \"solfaces/core/rasterize\";\n *\n * const png = await renderSolFacePNG(\"7xKXq...\", { pngSize: 256 });\n * fs.writeFileSync(\"avatar.png\", png);\n * ```\n */\nexport async function renderSolFacePNG(\n walletAddress: string,\n options?: PNGOptions\n): Promise<Buffer> {\n const { pngSize = 256, ...renderOpts } = options ?? {};\n\n // Generate SVG at the target resolution\n const svg = renderSolFaceSVG(walletAddress, {\n ...renderOpts,\n size: pngSize,\n });\n const svgBuffer = Buffer.from(svg);\n\n // Try sharp first (best quality, most common in Node)\n try {\n const sharp = await import(\"sharp\");\n return await sharp\n .default(svgBuffer)\n .resize(pngSize, pngSize)\n .png()\n .toBuffer();\n } catch {\n // sharp not installed — fall through\n }\n\n // Try @resvg/resvg-js (good for edge/serverless)\n try {\n const { Resvg } = await import(\"@resvg/resvg-js\");\n const resvg = new Resvg(svg, {\n fitTo: { mode: \"width\", value: pngSize },\n });\n const pngData = resvg.render();\n return Buffer.from(pngData.asPng());\n } catch {\n // resvg not installed\n }\n\n throw new Error(\n \"[SolFaces] PNG rasterization requires either `sharp` or `@resvg/resvg-js`. \" +\n \"Install one: npm install sharp OR npm install @resvg/resvg-js\"\n );\n}\n\n// ─── Browser Rasterization ───────────────────────────────────\n\n/**\n * Render a SolFace as a PNG Blob in the browser.\n * Uses Canvas API — works in all modern browsers.\n *\n * @returns PNG Blob\n *\n * @example\n * ```ts\n * const blob = await renderSolFacePNGBrowser(\"7xKXq...\", { pngSize: 256 });\n * const url = URL.createObjectURL(blob);\n * img.src = url;\n * ```\n */\nexport async function renderSolFacePNGBrowser(\n walletAddress: string,\n options?: PNGOptions\n): Promise<Blob> {\n const { pngSize = 256, ...renderOpts } = options ?? {};\n\n const svg = renderSolFaceSVG(walletAddress, {\n ...renderOpts,\n size: pngSize,\n });\n\n // Create image from SVG data URI\n const svgBlob = new Blob([svg], { type: \"image/svg+xml;charset=utf-8\" });\n const url = URL.createObjectURL(svgBlob);\n\n return new Promise<Blob>((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n // Use OffscreenCanvas if available (better perf)\n let canvas: HTMLCanvasElement | OffscreenCanvas;\n let ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n\n if (typeof OffscreenCanvas !== \"undefined\") {\n canvas = new OffscreenCanvas(pngSize, pngSize);\n ctx = canvas.getContext(\"2d\");\n } else {\n canvas = document.createElement(\"canvas\");\n canvas.width = pngSize;\n canvas.height = pngSize;\n ctx = canvas.getContext(\"2d\");\n }\n\n if (!ctx) {\n URL.revokeObjectURL(url);\n reject(new Error(\"[SolFaces] Could not get canvas context\"));\n return;\n }\n\n ctx.drawImage(img, 0, 0, pngSize, pngSize);\n URL.revokeObjectURL(url);\n\n if (canvas instanceof OffscreenCanvas) {\n canvas.convertToBlob({ type: \"image/png\" }).then(resolve).catch(reject);\n } else {\n canvas.toBlob((blob) => {\n if (blob) resolve(blob);\n else reject(new Error(\"[SolFaces] Canvas toBlob failed\"));\n }, \"image/png\");\n }\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error(\"[SolFaces] Failed to load SVG into image\"));\n };\n\n img.src = url;\n });\n}\n\n/**\n * Render a SolFace as a PNG data URL in the browser.\n * Convenient for directly setting img.src without blob URLs.\n */\nexport async function renderSolFacePNGDataURL(\n walletAddress: string,\n options?: PNGOptions\n): Promise<string> {\n const { pngSize = 256, ...renderOpts } = options ?? {};\n\n const svg = renderSolFaceSVG(walletAddress, {\n ...renderOpts,\n size: pngSize,\n });\n\n const svgBlob = new Blob([svg], { type: \"image/svg+xml;charset=utf-8\" });\n const url = URL.createObjectURL(svgBlob);\n\n return new Promise<string>((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = pngSize;\n canvas.height = pngSize;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n reject(new Error(\"[SolFaces] No canvas context\"));\n return;\n }\n ctx.drawImage(img, 0, 0, pngSize, pngSize);\n URL.revokeObjectURL(url);\n resolve(canvas.toDataURL(\"image/png\"));\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error(\"[SolFaces] SVG load failed\"));\n };\n img.src = url;\n });\n}\n"]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/themes/presets.ts
|
|
4
|
+
var solanaTheme = {
|
|
5
|
+
bgColors: ["#14F195", "#9945FF", "#00C2FF", "#FFD700", "#FF6B6B"],
|
|
6
|
+
bgOpacity: 0.2,
|
|
7
|
+
bgRadius: 4
|
|
8
|
+
};
|
|
9
|
+
var darkTheme = {
|
|
10
|
+
bgColors: ["#1a1b23", "#2d1b69", "#0a2463", "#1b2838", "#2a0a3a"],
|
|
11
|
+
mouthColor: "#e06070",
|
|
12
|
+
eyebrowColor: "#aaa",
|
|
13
|
+
accessoryColor: "#888",
|
|
14
|
+
eyeWhiteColor: "#e0e0e0",
|
|
15
|
+
bgOpacity: 1,
|
|
16
|
+
bgRadius: 4
|
|
17
|
+
};
|
|
18
|
+
var lightTheme = {
|
|
19
|
+
bgColors: ["#f0f4ff", "#fff0f5", "#f0fff0", "#fffff0", "#f5f0ff"],
|
|
20
|
+
bgOpacity: 1,
|
|
21
|
+
bgRadius: 8
|
|
22
|
+
};
|
|
23
|
+
var monoTheme = {
|
|
24
|
+
skinColors: ["#e0e0e0", "#c0c0c0", "#a0a0a0", "#808080", "#606060", "#404040"],
|
|
25
|
+
eyeColors: ["#333", "#555", "#777", "#999", "#bbb"],
|
|
26
|
+
hairColors: ["#1a1a1a", "#333", "#555", "#777", "#999", "#bbb", "#ddd", "#eee"],
|
|
27
|
+
bgColors: ["#f0f0f0", "#e0e0e0", "#d0d0d0", "#c0c0c0", "#b0b0b0"],
|
|
28
|
+
mouthColor: "#666",
|
|
29
|
+
eyebrowColor: "#555",
|
|
30
|
+
accessoryColor: "#777",
|
|
31
|
+
eyeWhiteColor: "#f0f0f0",
|
|
32
|
+
bgOpacity: 0.3,
|
|
33
|
+
bgRadius: 4
|
|
34
|
+
};
|
|
35
|
+
var neonTheme = {
|
|
36
|
+
bgColors: ["#0d0d0d", "#1a0a2e", "#0a1628", "#0d1a0d", "#1a0a0a"],
|
|
37
|
+
hairColors: ["#ff00ff", "#00ffff", "#ff6600", "#39ff14", "#ff3366", "#6600ff", "#ffff00", "#00ff99"],
|
|
38
|
+
eyeColors: ["#ff00ff", "#00ffff", "#39ff14", "#ff6600", "#ffff00"],
|
|
39
|
+
mouthColor: "#ff3366",
|
|
40
|
+
eyebrowColor: "#ccc",
|
|
41
|
+
accessoryColor: "#00ffff",
|
|
42
|
+
eyeWhiteColor: "#1a1a1a",
|
|
43
|
+
bgOpacity: 1,
|
|
44
|
+
bgRadius: 4,
|
|
45
|
+
border: { color: "#39ff14", width: 1 }
|
|
46
|
+
};
|
|
47
|
+
var jupiterTheme = {
|
|
48
|
+
bgColors: ["#131b2e", "#1b2540", "#0f1926", "#1e2d4a", "#162033"],
|
|
49
|
+
mouthColor: "#c7d4e8",
|
|
50
|
+
eyebrowColor: "#8899aa",
|
|
51
|
+
accessoryColor: "#6882a0",
|
|
52
|
+
eyeWhiteColor: "#d0d8e8",
|
|
53
|
+
bgOpacity: 1,
|
|
54
|
+
bgRadius: 6,
|
|
55
|
+
border: { color: "#3a5a8c", width: 0.5 }
|
|
56
|
+
};
|
|
57
|
+
var phantomTheme = {
|
|
58
|
+
bgColors: ["#1c0e30", "#2a1548", "#1e0f36", "#251240", "#20103a"],
|
|
59
|
+
mouthColor: "#d4a0e8",
|
|
60
|
+
eyebrowColor: "#9966cc",
|
|
61
|
+
accessoryColor: "#ab8dd6",
|
|
62
|
+
eyeWhiteColor: "#d8c8e8",
|
|
63
|
+
bgOpacity: 1,
|
|
64
|
+
bgRadius: 6,
|
|
65
|
+
border: { color: "#ab8dd6", width: 0.5 }
|
|
66
|
+
};
|
|
67
|
+
var circleTheme = {
|
|
68
|
+
bgRadius: 999
|
|
69
|
+
};
|
|
70
|
+
var PRESET_THEMES = {
|
|
71
|
+
solana: solanaTheme,
|
|
72
|
+
dark: darkTheme,
|
|
73
|
+
light: lightTheme,
|
|
74
|
+
mono: monoTheme,
|
|
75
|
+
neon: neonTheme,
|
|
76
|
+
jupiter: jupiterTheme,
|
|
77
|
+
phantom: phantomTheme,
|
|
78
|
+
circle: circleTheme
|
|
79
|
+
};
|
|
80
|
+
function getPresetTheme(name, overrides) {
|
|
81
|
+
const base = PRESET_THEMES[name];
|
|
82
|
+
if (!base) return overrides ?? {};
|
|
83
|
+
return overrides ? { ...base, ...overrides } : base;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
exports.PRESET_THEMES = PRESET_THEMES;
|
|
87
|
+
exports.circleTheme = circleTheme;
|
|
88
|
+
exports.darkTheme = darkTheme;
|
|
89
|
+
exports.getPresetTheme = getPresetTheme;
|
|
90
|
+
exports.jupiterTheme = jupiterTheme;
|
|
91
|
+
exports.lightTheme = lightTheme;
|
|
92
|
+
exports.monoTheme = monoTheme;
|
|
93
|
+
exports.neonTheme = neonTheme;
|
|
94
|
+
exports.phantomTheme = phantomTheme;
|
|
95
|
+
exports.solanaTheme = solanaTheme;
|
|
96
|
+
//# sourceMappingURL=chunk-CVFO7YHY.cjs.map
|
|
97
|
+
//# sourceMappingURL=chunk-CVFO7YHY.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/themes/presets.ts"],"names":[],"mappings":"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","file":"chunk-CVFO7YHY.cjs","sourcesContent":["// ═══════════════════════════════════════════════════════════════\n// SOLFACES — Preset Themes\n// ═══════════════════════════════════════════════════════════════\n\nimport type { SolFaceTheme } from \"../core/traits\";\n\n// ─── Presets ────────────────────────────────────\n\nexport const solanaTheme: SolFaceTheme = {\n bgColors: [\"#14F195\", \"#9945FF\", \"#00C2FF\", \"#FFD700\", \"#FF6B6B\"],\n bgOpacity: 0.2,\n bgRadius: 4,\n};\n\nexport const darkTheme: SolFaceTheme = {\n bgColors: [\"#1a1b23\", \"#2d1b69\", \"#0a2463\", \"#1b2838\", \"#2a0a3a\"],\n mouthColor: \"#e06070\",\n eyebrowColor: \"#aaa\",\n accessoryColor: \"#888\",\n eyeWhiteColor: \"#e0e0e0\",\n bgOpacity: 1,\n bgRadius: 4,\n};\n\nexport const lightTheme: SolFaceTheme = {\n bgColors: [\"#f0f4ff\", \"#fff0f5\", \"#f0fff0\", \"#fffff0\", \"#f5f0ff\"],\n bgOpacity: 1,\n bgRadius: 8,\n};\n\nexport const monoTheme: SolFaceTheme = {\n skinColors: [\"#e0e0e0\", \"#c0c0c0\", \"#a0a0a0\", \"#808080\", \"#606060\", \"#404040\"],\n eyeColors: [\"#333\", \"#555\", \"#777\", \"#999\", \"#bbb\"],\n hairColors: [\"#1a1a1a\", \"#333\", \"#555\", \"#777\", \"#999\", \"#bbb\", \"#ddd\", \"#eee\"],\n bgColors: [\"#f0f0f0\", \"#e0e0e0\", \"#d0d0d0\", \"#c0c0c0\", \"#b0b0b0\"],\n mouthColor: \"#666\",\n eyebrowColor: \"#555\",\n accessoryColor: \"#777\",\n eyeWhiteColor: \"#f0f0f0\",\n bgOpacity: 0.3,\n bgRadius: 4,\n};\n\nexport const neonTheme: SolFaceTheme = {\n bgColors: [\"#0d0d0d\", \"#1a0a2e\", \"#0a1628\", \"#0d1a0d\", \"#1a0a0a\"],\n hairColors: [\"#ff00ff\", \"#00ffff\", \"#ff6600\", \"#39ff14\", \"#ff3366\", \"#6600ff\", \"#ffff00\", \"#00ff99\"],\n eyeColors: [\"#ff00ff\", \"#00ffff\", \"#39ff14\", \"#ff6600\", \"#ffff00\"],\n mouthColor: \"#ff3366\",\n eyebrowColor: \"#ccc\",\n accessoryColor: \"#00ffff\",\n eyeWhiteColor: \"#1a1a1a\",\n bgOpacity: 1,\n bgRadius: 4,\n border: { color: \"#39ff14\", width: 1 },\n};\n\nexport const jupiterTheme: SolFaceTheme = {\n bgColors: [\"#131b2e\", \"#1b2540\", \"#0f1926\", \"#1e2d4a\", \"#162033\"],\n mouthColor: \"#c7d4e8\",\n eyebrowColor: \"#8899aa\",\n accessoryColor: \"#6882a0\",\n eyeWhiteColor: \"#d0d8e8\",\n bgOpacity: 1,\n bgRadius: 6,\n border: { color: \"#3a5a8c\", width: 0.5 },\n};\n\nexport const phantomTheme: SolFaceTheme = {\n bgColors: [\"#1c0e30\", \"#2a1548\", \"#1e0f36\", \"#251240\", \"#20103a\"],\n mouthColor: \"#d4a0e8\",\n eyebrowColor: \"#9966cc\",\n accessoryColor: \"#ab8dd6\",\n eyeWhiteColor: \"#d8c8e8\",\n bgOpacity: 1,\n bgRadius: 6,\n border: { color: \"#ab8dd6\", width: 0.5 },\n};\n\nexport const circleTheme: SolFaceTheme = {\n bgRadius: 999,\n};\n\n// ─── Theme Map ──────────────────────────────────\n\nexport const PRESET_THEMES: Record<string, SolFaceTheme> = {\n solana: solanaTheme,\n dark: darkTheme,\n light: lightTheme,\n mono: monoTheme,\n neon: neonTheme,\n jupiter: jupiterTheme,\n phantom: phantomTheme,\n circle: circleTheme,\n};\n\nexport function getPresetTheme(\n name: string,\n overrides?: Partial<SolFaceTheme>\n): SolFaceTheme {\n const base = PRESET_THEMES[name];\n if (!base) return (overrides as SolFaceTheme) ?? {};\n return overrides ? { ...base, ...overrides } : base;\n}\n"]}
|