@signals-protocol/v1-sdk 1.5.0 → 1.6.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/dist/index.d.ts CHANGED
@@ -10,4 +10,4 @@ export * as MathUtils from "./utils/math";
10
10
  export { toWAD, toMicroUSDC } from "./clmsr-sdk";
11
11
  export { createCLMSRSDK, createSignalsSDK } from "./clmsr-sdk";
12
12
  export * from "./share";
13
- export declare const VERSION = "1.5.0";
13
+ export declare const VERSION = "1.6.0";
package/dist/index.js CHANGED
@@ -67,4 +67,4 @@ Object.defineProperty(exports, "createSignalsSDK", { enumerable: true, get: func
67
67
  // Share image VNode templates
68
68
  __exportStar(require("./share"), exports);
69
69
  // Version (keep in sync with package.json)
70
- exports.VERSION = "1.5.0";
70
+ exports.VERSION = "1.6.0";
@@ -0,0 +1,2 @@
1
+ export { buildProfileContextVNode } from "./profile-context-image";
2
+ export type { ProfileContextImageInput, ProfileContextTier } from "./types";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildProfileContextVNode = void 0;
4
+ var profile_context_image_1 = require("./profile-context-image");
5
+ Object.defineProperty(exports, "buildProfileContextVNode", { enumerable: true, get: function () { return profile_context_image_1.buildProfileContextVNode; } });
@@ -0,0 +1,3 @@
1
+ import type { SatoriNode } from "../share/types";
2
+ import type { ProfileContextImageInput } from "./types";
3
+ export declare function buildProfileContextVNode(input: ProfileContextImageInput): SatoriNode;
@@ -0,0 +1,227 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildProfileContextVNode = buildProfileContextVNode;
4
+ const h_1 = require("../share/h");
5
+ const assets_1 = require("../share/assets");
6
+ const avatar_1 = require("../share/avatar");
7
+ const tier_theme_shared_1 = require("../share/tier-theme-shared");
8
+ const tier_badges_1 = require("./tier-badges");
9
+ const CARD_WIDTH = 1200;
10
+ const CARD_HEIGHT = 630;
11
+ const PAGE_BG = "#eef7ff";
12
+ const PRIMARY = "#1444c2";
13
+ const INK = "#242424";
14
+ const INK_MUTED = "#737373";
15
+ const AVATAR_BG = "#ffffff";
16
+ const AVATAR_BORDER = "#d9e6f5";
17
+ const AVATAR_SIZE = 240;
18
+ const HERO_LEFT = 80;
19
+ const HERO_RIGHT = 80;
20
+ const HERO_GAP = 48;
21
+ const IDENTITY_WIDTH = CARD_WIDTH - HERO_LEFT - HERO_RIGHT - AVATAR_SIZE - HERO_GAP;
22
+ function shortenAddress(address) {
23
+ const normalized = address.trim();
24
+ return `${normalized.slice(0, 6)}…${normalized.slice(-4)}`;
25
+ }
26
+ function resolveHandle(realHandle) {
27
+ const resolved = realHandle?.trim();
28
+ return resolved ? resolved : null;
29
+ }
30
+ function ellipsizeLongHandle(handle) {
31
+ if (handle.length <= 32)
32
+ return handle;
33
+ return `${handle.slice(0, 16)}…${handle.slice(-14)}`;
34
+ }
35
+ function buildIdentityText(input) {
36
+ const address = shortenAddress(input.address);
37
+ const handle = resolveHandle(input.realHandle);
38
+ if (!handle) {
39
+ return {
40
+ handle: address,
41
+ addressLine: null,
42
+ isAddressFallback: true,
43
+ sourceLength: address.length,
44
+ };
45
+ }
46
+ return {
47
+ handle: ellipsizeLongHandle(handle),
48
+ addressLine: address,
49
+ isAddressFallback: false,
50
+ sourceLength: handle.length,
51
+ };
52
+ }
53
+ function getHandleFontSize(identity) {
54
+ if (identity.isAddressFallback)
55
+ return 88;
56
+ if (identity.sourceLength <= 14)
57
+ return 116;
58
+ if (identity.sourceLength <= 20)
59
+ return 96;
60
+ if (identity.sourceLength <= 26)
61
+ return 80;
62
+ if (identity.sourceLength <= 32)
63
+ return 64;
64
+ return 56;
65
+ }
66
+ function buildBrandStamp() {
67
+ return (0, h_1.h)("div", {
68
+ style: {
69
+ position: "absolute",
70
+ top: 56,
71
+ left: 64,
72
+ display: "flex",
73
+ alignItems: "center",
74
+ gap: 16,
75
+ },
76
+ }, (0, h_1.h)("img", {
77
+ src: (0, assets_1.buildLogoSquaresSVG)("light"),
78
+ width: 56,
79
+ height: 52,
80
+ style: { display: "flex", flexShrink: 0 },
81
+ }), (0, h_1.h)("div", {
82
+ style: {
83
+ display: "flex",
84
+ fontSize: 52,
85
+ fontWeight: 700,
86
+ color: PRIMARY,
87
+ letterSpacing: "-0.01em",
88
+ },
89
+ }, "Signals"));
90
+ }
91
+ function buildAvatar(address) {
92
+ const avatar = (0, avatar_1.getAvatarData)(address, "light");
93
+ return (0, h_1.h)("div", {
94
+ style: {
95
+ width: AVATAR_SIZE,
96
+ height: AVATAR_SIZE,
97
+ borderRadius: 36,
98
+ background: AVATAR_BG,
99
+ border: `1px solid ${AVATAR_BORDER}`,
100
+ display: "flex",
101
+ flexDirection: "column",
102
+ overflow: "hidden",
103
+ flexShrink: 0,
104
+ },
105
+ }, ...avatar.pattern.map((row, y) => (0, h_1.h)("div", {
106
+ style: {
107
+ display: "flex",
108
+ width: "100%",
109
+ height: "20%",
110
+ },
111
+ }, ...row.map((isFilled, x) => (0, h_1.h)("div", {
112
+ style: {
113
+ width: "20%",
114
+ height: "100%",
115
+ backgroundColor: isFilled
116
+ ? (y + x) % 2 === 0
117
+ ? avatar.primary
118
+ : avatar.secondary
119
+ : "transparent",
120
+ },
121
+ })))));
122
+ }
123
+ function buildTierChip(tier) {
124
+ const tierTheme = tier_theme_shared_1.TIER_CHIP_THEMES[tier].light;
125
+ return (0, h_1.h)("div", {
126
+ style: {
127
+ display: "flex",
128
+ alignItems: "center",
129
+ gap: 10,
130
+ padding: "10px 20px",
131
+ borderRadius: 999,
132
+ border: `1px solid ${tierTheme.border}`,
133
+ background: `linear-gradient(135deg, ${tierTheme.from}, ${tierTheme.to})`,
134
+ color: INK,
135
+ fontSize: 28,
136
+ fontWeight: 500,
137
+ lineHeight: 1,
138
+ marginBottom: 16,
139
+ alignSelf: "flex-start",
140
+ flexShrink: 0,
141
+ },
142
+ }, (0, h_1.h)("img", {
143
+ src: tier_badges_1.TIER_BADGE_DATA_URIS[tier],
144
+ width: 32,
145
+ height: 32,
146
+ style: { display: "flex", flexShrink: 0 },
147
+ }), (0, h_1.h)("div", { style: { display: "flex" } }, (0, tier_theme_shared_1.formatTierName)(tier)));
148
+ }
149
+ function buildHandle(identity) {
150
+ return (0, h_1.h)("div", {
151
+ style: {
152
+ display: "flex",
153
+ maxWidth: IDENTITY_WIDTH,
154
+ fontFamily: identity.isAddressFallback ? "JetBrains Mono" : "Inter",
155
+ fontSize: getHandleFontSize(identity),
156
+ fontWeight: 700,
157
+ color: PRIMARY,
158
+ letterSpacing: identity.isAddressFallback ? "-0.005em" : "-0.025em",
159
+ lineHeight: 0.95,
160
+ whiteSpace: "nowrap",
161
+ overflow: "hidden",
162
+ textOverflow: "ellipsis",
163
+ },
164
+ }, identity.handle);
165
+ }
166
+ function buildAddressLine(identity) {
167
+ if (!identity.addressLine)
168
+ return null;
169
+ return (0, h_1.h)("div", {
170
+ style: {
171
+ display: "flex",
172
+ fontFamily: "JetBrains Mono",
173
+ fontSize: 30,
174
+ color: INK_MUTED,
175
+ fontWeight: 500,
176
+ marginTop: 18,
177
+ letterSpacing: "0.01em",
178
+ },
179
+ }, identity.addressLine);
180
+ }
181
+ function buildIdentityColumn(input) {
182
+ const identity = buildIdentityText(input);
183
+ const children = [];
184
+ // Guard against runtime tier values outside the declared union (e.g. a
185
+ // future "UNRANKED" snapshot that downstream pushes through unchecked).
186
+ // Skip the chip rather than throw so the OG render keeps working.
187
+ if (input.tier && tier_theme_shared_1.TIER_CHIP_THEMES[input.tier]) {
188
+ children.push(buildTierChip(input.tier));
189
+ }
190
+ children.push(buildHandle(identity));
191
+ const addressLine = buildAddressLine(identity);
192
+ if (addressLine) {
193
+ children.push(addressLine);
194
+ }
195
+ return (0, h_1.h)("div", {
196
+ style: {
197
+ display: "flex",
198
+ flexDirection: "column",
199
+ minWidth: 0,
200
+ flex: 1,
201
+ },
202
+ }, ...children);
203
+ }
204
+ function buildProfileContextVNode(input) {
205
+ return (0, h_1.h)("div", {
206
+ style: {
207
+ width: CARD_WIDTH,
208
+ height: CARD_HEIGHT,
209
+ display: "flex",
210
+ position: "relative",
211
+ overflow: "hidden",
212
+ fontFamily: "Inter",
213
+ background: PAGE_BG,
214
+ },
215
+ }, buildBrandStamp(), (0, h_1.h)("div", {
216
+ style: {
217
+ position: "absolute",
218
+ top: "50%",
219
+ left: HERO_LEFT,
220
+ right: HERO_RIGHT,
221
+ transform: "translateY(-50%)",
222
+ display: "flex",
223
+ alignItems: "center",
224
+ gap: HERO_GAP,
225
+ },
226
+ }, buildAvatar(input.address), buildIdentityColumn(input)));
227
+ }
@@ -0,0 +1,2 @@
1
+ import type { ProfileContextTier } from "./types";
2
+ export declare const TIER_BADGE_DATA_URIS: Record<ProfileContextTier, string>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TIER_BADGE_DATA_URIS = void 0;
4
+ const BRONZE_BADGE_DATA_URI = "data:image/png;base64,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";
5
+ const SILVER_BADGE_DATA_URI = "data:image/png;base64,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";
6
+ const GOLD_BADGE_DATA_URI = "data:image/png;base64,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";
7
+ const PLATINUM_BADGE_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAQzUlEQVR42u1baZBc1XX+7lu7e7aeRdIsGrSMdgkUMBiEq6AgxsExppxUfqScpAqIcVH6ETAKJLbBVDARKUgccDl2cNkuqhIDWUhsXOWFxQaEkJA1MrKQNJpVGmZX7/P6bffde/Lj9fJ6JHAjZqRUiStVdb/p2++e853vLPe828BH4+Ie7EILsBQj0Z6subbTufecq1xoYS/0+AiACy3AR+MCj/MaBK995F60r+1DwH3EGhuhGQaIAO778Kx5aGYMc4MDOPDQN8+bTOr5Wui6Jx/Cbfc9itHhI3AKecOIxS8jKW+QQmyHlIZXtNJ6Ii7+cueDmG0O8O6Le86LXEvOgOv+6atIdnUj4D6SXd2w87l1uhn7ChTlViJqlUQMkrJSBC/4rvP38eaW4fzMNFRdhzU9g71ffmxJ5VvSIPjJp3ajkM9Ai5k4deiA4hWLtxjxxPNM025XFKU9mUgo7YkEU1WljanqbUY8/rxXtG6ZOnZM0WMxSIXw+0/txq3PPLFkMi46A65+5F6s3LYNxWwWDckkutZvwsTxd/r0WGynomp3ECGZMHRc2duLvuUdAICTqTT2j44h5zhgRDkpxdPC59/u3nrp0PTAUTiFAlo6O3Hy0CEceujJCwvArU9/A4wxMAYUMhnMTEygdXknmjvaEWtqgmoYMOIJTJ8Y0Np6ejYqmv4niqp+HoxtIABdTU24du0a9LQmQSAQEQjAdC6PN4dHaDyTDWUiGpFSPCM4f76YSR9vv2SV7xaLEJ4Hz7Zh5/LIz51Gc1sSbV2d0GImBOf42e33LQ0An/7+4wg8F8nuHphNTdAMAyAg1tiMf73iBnz6e4+Z8ZZkC9PUXkVRP8ZU9ZNMUT4BxrpBhEbTwJYVnbispxsNMROSqAKAJAIA2L6PoxNTODI5hYLrogTEnJTiTZLyZRGIgzLgJ13Lyr+68wHv9gO/oPl0GiQFhB8CY6VSUHUDr+58YPEAuOk7X4emG/jtj/6HXXP7F65QDfN6xlgzGFOIKA6gjTHWzRjrBWPdBCSJiKlMQXPMRF97OzZ3dqKjqQEASsojAgAibCBkLBsD0zMYOX0aeduBoHA2I+SJaIqIJkBymojSACsSkQDJguD89bH9+/o7t24j7vl4896v/07dtHoAcOfnsf2zf4REW/uf6rHYN8DUzlCFBQgyBl1R0GAYWN7YiFWtrehtbUVzPAbGULE0AwvVp6oVKHKbtsYErlm3Blt7ujCZzeHdTIbmCvPM8rwWLmQLEW0GMbASkCACA4PK2Oyaa3bs6tm65YeHf/aLxWPA5/7jOwDRCrOx6UWmqpc1mSbaEgkwxqAyBlPT0GiYaInHkEwkkIzH0WAYUBUWWrosaMXqpdcSG6LuUGUIVeYLSbA9H3nbRt5xUHBc2J4HLwggpISUhPT8PAqOC5LiiFcs3gSG2V9+4W8WhwGqroGIOqEoK1Wm4Lq1a7F++XIQQuSVUlBkrBy/qgpGkaYF97V9H0SEmK5HAKqOMnAMQMI0kDB1dLa2QEoJQRQqXwJtdPY0Xj82AAH0KJraCbDZenSrsw5gYGAqAEVVFDTHY9BUBaqiQFUYwFCxJpX89XcNSYSD705g39gYhJRRtRfMpDIaIVtKShNRBXTGgLihgzEGAhhR/fVNXRNZuFLFX6K+W35lqPUntuDzmkUZMGdZmC5aGE2lMVMoLJhDNW8rbCKgBl6qnVuVoz4j1A0AFt7wQ5RPDEAgJYbTGQQk4QYBjk/PQEgZqllWshwXIopSRY5yDqlbzw8HQJTV4aLsPedVxCOc1a8BhlmriJmiBcYUMABj6TTmCvNgJdvVQk+V+1XWoPI1nW2BklvUZ6X6XKBmldDLoraofHqWNcuRvTwCKTGcSSMgqkx3OMex6RkIkqHKtEBpUI39EVnzTF6UuEGL6gILgKYzVWXv+4XwLWPArGVh2rLCzBGZOpZK4XRhPpwU+XKNHpGLWvpHKVp1o0UDoLoOvf/n7zMYAwIRWl8QhZmDVcGzfR8D07NUTmsRL1+oYo3Na5gY+W69o84YUK3XF4TgGgGrUThMTWChTFxIuDzAeC5Hoe+ziuJVqjOMplJsMpODywMEQkayTelfxK9rlY5a/b2c8eyjrkKo5tYVUFAphADACwJYng8n4HB5AJtzOAGHXbr2hIArAhZIqhZMEQUYAzwh8MboGBKGDkPTYGoqYpqGmK7DLF0bmoYG04CmKhUQGKp+XwmOddKgTgCqQNRUeAQQC0E4PjuLt2emwRQFYLXRnKFasNRG50gOZwyxmIkAhLznAZ5XG0BLRVAQBNi+shsbuzurlD9LMljcGFCqvKJRuWrB8PPeZBKNqoaCZcFxXAgehJuUSLVWZmYVguo70zSgqSoUxioVpqooABG476NYtJHPF9Ck6+hKtlT3F2fEJQIR1U2B+hhQSexUBWNBmGpNJHDj+vX41dAQxnM5eL4fKqOq0HUNmqZBVdVSuVpyndI9dV2DoevhjlESAiHAfQ7OOYIgCMtfSehtb8W1m9ajMWZClsrnhc5JJYMsqgvISmpZsFAtTdCSiOPGDRvwq6EhnMpmQaUNi899MKZAUxXoul4BBCCoqgJN18A5h885uM8RCAGSsoZxq5e1Y8fGdUiYRtU1FrhIjS/UGQbrAiBEVBIIJCncnpa3tVGXJgKa4zHcuGEDXhsawmgmjXIMlyThBxI+D8AUBl3ToCgMnHPYjgspZDWQRZUgQt+KZbhmfR9ihl5TIpc5yIiFpTRVcoqsRy+g3kIo9H+biDwpBLyAV3frVM0IhDBdNpgGrl+/Hn3tHRWXqSyoKtA1DaqqwHE8BEIi4DykNEXiSqkiXNe5/EzlS3pWewuAHwRlproAbKJFjAEi4ABYjkjmAsk6rXKEJgCMyoYqQwIASBg6rlu3DgpjGE6loCgKNE2FpqlQFAWO48LzPOi6DikkOOfVQBn+x8auTly1bg2MsB9RQ/2aTRIBluNBSgIRZYXv5+oFoC4GuNY83Hw2T1JMSJJIWRbVdm3KqlepKYkQN3Rc3rsSjfEYTNMgXdegMAWcc1hFG7KUJUzTgKoqFSZJGbJo++reM5Svbo6q+wVJhGyxCEkSUsqTTj6b5469eADkpqex5Q9ucaWQh0GEucI884OgpgkiI+8rwoFQ9H2IsNBhACCkgGXZEEKUKQNFYTBNs6ZC9IMAHucob44qytcE4/DV4xyZeSv8i5S/6dl+hZ8eO7l4ABjxON493A8ZBHtA5J+2LKSt0oLlnl4lOBEkqkCkikUISZW5tu3A57xy77JFVU2FbuiV1OLxABmrWJ1HVEP5SixgQNYqomA7YESOFMGe+dkZxJPJRQRA1+FZRQS+9xZJOehwH8Ozc2e0t6N7dQIhkBIZ2y5rANf14DjumQuUvmQYOlRNDRuhREjPW2dtqCIS/IgI43Mp8CAAkRwIXOeQb1lYvnLF4gHw2q5HkT41jI03f3YmCPhPQITB2TnkbLsilIzs2stWdYMAedcFYwAPAhRtp6axwViEQaExYRpG6AolALgo9QjKOKG2JZcvOhg/nQ7vI8SPO7ddlpodHsLLOx9ePAAAIN7SisGXforAdZ8jKaYyto2jk5NhozJSF0Yfd827Lmzug6REsehAClFxj2XNjfjE+nX42KpeNBoGhBCQkqCoSggCGAqOA8f3K/aPvpZT7tDUNCzXBYjGhe/9Z2rwBJo6OupVq34AsjOnUZidwc+/eO8RwfkzRBJHJiYxk8uVLBo+4Yk+5cnaDrgQcBwXvu9DEqHJNHHVmlW4adsWbOhajk3dnbhh8wZs7loBQ1UghISma9B1DbbnY952KoyJBkEGYC6Xx/DUbMn6wQ//5a4HjtvpNPq/Vv8Bi7oPSMy+0Y++z30KG/74FgjfH1F07SZfyGWW69Lqjg6mqmo1LZaEHEmlMJnJomg7MHUdm7pW0I71fWz1sg7omlIJnoauYUWyBSuamyCEgOV5IMbAeYC2xgSWJZurMaa0huv7eOvECLJWESTlkcCxd/20/408JH2gwxUfqCU2OTiIF2/bheau7tHA83YTSWcslWYHR8dISFGzUQqkRGp+Hp7rYU1HOz516Rbs2LCOJRsTVUtGAhlAaGtqwMf7VmPHujXobmmGpqvIWEUiGSkRAQgpcXhsnKazOYDIFtzfHW9rP/XqXV+F+QHPvHzgBvfHd9+LeHMLnEJBb1u16nFF1+/WFRXXbVxP2y7pZWUPlQQMz8wSEbFLOtqhayokycpurezDlZ1lhOKMhWlwIp2FoanobkvWRP+j4xPoHw4fqAju/3P21Kn748lk4FsW+j/g+aJz6vDf8NRuqLoOyfkys6npaaZqfxjTNVy/aSNt6O5iJVFRtpmUsrJ3j9YI0dr+bCmu3OmJ/n1wchq/HhoNa38R/MQt5O9QdSMlgwB7764v8kfHOR2RcTMpmA0NMBoaTnPHuYeE2O9wjtcGTrCByamSZUsPPmX0MSeAKPWB91QeEYYAYXA9MTmNXw+PwQ8CkBR7A8f5ktnQmNJjMWSHRs9FlXM7JTbxyj7ol7Rjy2c+AzubyXDbPqCo6pWBpJ6JTBa6qqC9uRFKqflRW8dTRNEzH3qgPLPyniGQAkdPTeDQyEnwIACk3C9c907VNAdbVq7EqTf34tg3//38AQAAp/cdBjUa2HPPw3juxNtzvGjvUzR1uwBdMpHJgfOAOpqbmFbODjVprEyF0iuqYEQrfcYAx/fRPzSGd8YnIKQASfGqcN071Vjs+KV/8ec49twzOPwP3ztXNT7cOcGZvf14gc/h0bv/Dm8c75/jjvOqoqprCWzjbD7PMpZFrQ0JFjeMmmaHLLfX3sP/KyDnC9g3MISxuRSIiKQI/psXizv1eHyk7+absf8fH0f/w9/+MCp8+IOSM3sO4jdiDj2XXw5/fj7rF4svKaoWZ4qyPWfb+kQ6A01R0NKQgKIqEeXP7v+MhTvBExNTeGtwBOl5CwywBedP8qJ1vxaLzcZbW3HkuWfx28d+8GHFX5yTojOvH4S6Monmzi5IKe35udlXjFh8iinKdk+I5EQ6g3yxSI1mjMVNAwBqMkDUDWazBRwYHMHA5DR8HgBSjgrf++vcyMiTsdY2WzV0nNyzBwPfenYxRF+8o7Kzr/dD62pCw7IVUDVNLNu09ZA1M/26oiidxNi6bNFWx0+n4focjTETpq7XnCjJFos4PDaOQyMnkZ4vAkRciuB/A9fe2dTV8xJ3HQkCpg71Y+i7zy+W2EtzVHbHY/ejmE5h+aatcPK5pnhzy58pun4PFGUjCGiKx7Bm+TJ0tSUhSWIylcHJuRTmHbfUXpNHJfefcHO5Z2MtLcXx/fvRunoNDn7tiUWXdcnOCm/edTu6Nm9G4LpoW7sWuXfH+zTTvJOp2ufBWC+AyoOPQIhSo1OekkHwb8Jzv5/oWH7SmpmCZsYw+84RHF8kyi8cS3ZaPLXvbYy98BJWXHs5jv/4R+jYtCn7yh33vfyD/b/8uaIoKQY0SynjQkoXRMdlwL8beO7fXvnFXf813b8v98qDX0bn9sux90uPIHXgnaUS8/z8XuD3vnIX4skkuG2jqacbHRu3YO7o4XZF1VdJkpCcj/dcdXVq+u1DsKanoCca0BDT8cpfPbLkstUPQMysvXa9c1rw6t274BXyaFm1Goqug6SE4Bz5UydhNDXj4INPLLnSFxSA/2/jov/R1EUPwEU/zuuvxpo3rKy5LgxOvO98o6Ol5tpP5RddpoveBS56AP4PhdQDkMdjL8QAAAAASUVORK5CYII=";
8
+ const DIAMOND_BADGE_DATA_URI = "data:image/png;base64,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";
9
+ exports.TIER_BADGE_DATA_URIS = {
10
+ BRONZE: BRONZE_BADGE_DATA_URI,
11
+ SILVER: SILVER_BADGE_DATA_URI,
12
+ GOLD: GOLD_BADGE_DATA_URI,
13
+ PLATINUM: PLATINUM_BADGE_DATA_URI,
14
+ DIAMOND: DIAMOND_BADGE_DATA_URI,
15
+ };
@@ -0,0 +1,7 @@
1
+ import type { ProfileTier } from "../share/tier-theme-shared";
2
+ export type ProfileContextTier = ProfileTier;
3
+ export interface ProfileContextImageInput {
4
+ address: string;
5
+ realHandle: string | null;
6
+ tier: ProfileContextTier | null;
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,3 +1,5 @@
1
1
  import type { SatoriNode } from "./types";
2
- export declare const SIGNALS_LOGO_URI = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNyAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB4PSI4LjUwMDI0IiB5PSIwIiB3aWR0aD0iNCIgaGVpZ2h0PSI0IiBmaWxsPSIjMTQ0NGMyIi8+PHJlY3QgeD0iOC41MDAyNCIgeT0iNC4wMDAwNiIgd2lkdGg9IjQiIGhlaWdodD0iNCIgZmlsbD0iIzE0NDRjMiIvPjxyZWN0IHg9IjAuNSIgeT0iMTIiIHdpZHRoPSI0IiBoZWlnaHQ9IjQiIGZpbGw9IiMxNDQ0YzIiLz48cmVjdCB4PSIxMi41IiB5PSI4LjAwMDA2IiB3aWR0aD0iNCIgaGVpZ2h0PSI0IiBmaWxsPSIjMTQ0NGMyIi8+PHJlY3QgeD0iMTIuNSIgeT0iMCIgd2lkdGg9IjQiIGhlaWdodD0iNCIgZmlsbD0iIzE0NDRjMiIvPjxyZWN0IHg9IjQuNTAwMjQiIHk9IjAiIHdpZHRoPSI0IiBoZWlnaHQ9IjQiIGZpbGw9IiMxNDQ0YzIiLz48cmVjdCB4PSIxMi41IiB5PSI0LjAwMDA2IiB3aWR0aD0iNCIgaGVpZ2h0PSI0IiBmaWxsPSIjMTQ0NGMyIi8+PHJlY3QgeD0iNC41MDAyNCIgeT0iOC4wMDAwNiIgd2lkdGg9IjQiIGhlaWdodD0iNCIgZmlsbD0iIzE0NDRjMiIvPjwvc3ZnPg==";
2
+ export declare function buildLogoSquaresSVG(theme: "light" | "dark"): string;
3
+ /** @deprecated Use buildLogoSquaresSVG("light") for theme-aware rendering. */
4
+ export declare const SIGNALS_LOGO_URI: string;
3
5
  export declare function buildLogoStrokeSVG(size: number, theme: "light" | "dark"): SatoriNode;
@@ -1,10 +1,30 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SIGNALS_LOGO_URI = void 0;
4
+ exports.buildLogoSquaresSVG = buildLogoSquaresSVG;
4
5
  exports.buildLogoStrokeSVG = buildLogoStrokeSVG;
5
6
  const h_1 = require("./h");
7
+ const LOGO_SQUARES = [
8
+ { x: "8.50024", y: "0" },
9
+ { x: "8.50024", y: "4.00006" },
10
+ { x: "0.5", y: "12" },
11
+ { x: "12.5", y: "8.00006" },
12
+ { x: "12.5", y: "0" },
13
+ { x: "4.50024", y: "0" },
14
+ { x: "12.5", y: "4.00006" },
15
+ { x: "4.50024", y: "8.00006" },
16
+ ];
17
+ function buildLogoSquaresSVG(theme) {
18
+ const fill = theme === "dark" ? "#FFFFFF" : "#1444c2";
19
+ const rects = LOGO_SQUARES.map(({ x, y }) => `<rect x="${x}" y="${y}" width="4" height="4" fill="${fill}"/>`).join("");
20
+ const svg = `<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">${rects}</svg>`;
21
+ // Use btoa for cross-platform compatibility (browser + Node 16+).
22
+ // SVG is ASCII only so direct btoa is safe (no UTF-8 escape needed).
23
+ return `data:image/svg+xml;base64,${btoa(svg)}`;
24
+ }
6
25
  // Signals logo SVG (pixel block pattern) as base64 data URI
7
- exports.SIGNALS_LOGO_URI = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNyAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB4PSI4LjUwMDI0IiB5PSIwIiB3aWR0aD0iNCIgaGVpZ2h0PSI0IiBmaWxsPSIjMTQ0NGMyIi8+PHJlY3QgeD0iOC41MDAyNCIgeT0iNC4wMDAwNiIgd2lkdGg9IjQiIGhlaWdodD0iNCIgZmlsbD0iIzE0NDRjMiIvPjxyZWN0IHg9IjAuNSIgeT0iMTIiIHdpZHRoPSI0IiBoZWlnaHQ9IjQiIGZpbGw9IiMxNDQ0YzIiLz48cmVjdCB4PSIxMi41IiB5PSI4LjAwMDA2IiB3aWR0aD0iNCIgaGVpZ2h0PSI0IiBmaWxsPSIjMTQ0NGMyIi8+PHJlY3QgeD0iMTIuNSIgeT0iMCIgd2lkdGg9IjQiIGhlaWdodD0iNCIgZmlsbD0iIzE0NDRjMiIvPjxyZWN0IHg9IjQuNTAwMjQiIHk9IjAiIHdpZHRoPSI0IiBoZWlnaHQ9IjQiIGZpbGw9IiMxNDQ0YzIiLz48cmVjdCB4PSIxMi41IiB5PSI0LjAwMDA2IiB3aWR0aD0iNCIgaGVpZ2h0PSI0IiBmaWxsPSIjMTQ0NGMyIi8+PHJlY3QgeD0iNC41MDAyNCIgeT0iOC4wMDAwNiIgd2lkdGg9IjQiIGhlaWdodD0iNCIgZmlsbD0iIzE0NDRjMiIvPjwvc3ZnPg==";
26
+ /** @deprecated Use buildLogoSquaresSVG("light") for theme-aware rendering. */
27
+ exports.SIGNALS_LOGO_URI = buildLogoSquaresSVG("light");
8
28
  function buildLogoStrokeSVG(size, theme) {
9
29
  const stroke = theme === "dark" ? "white" : "#1444c2";
10
30
  return (0, h_1.h)("svg", {
@@ -4,13 +4,14 @@ exports.buildProfileVNode = buildProfileVNode;
4
4
  const h_1 = require("./h");
5
5
  const assets_1 = require("./assets");
6
6
  const avatar_1 = require("./avatar");
7
+ const tier_theme_shared_1 = require("./tier-theme-shared");
7
8
  const CARD_WIDTH = 1200;
8
9
  const CARD_HEIGHT = 630;
9
10
  const OUTER_PADDING = 24;
10
11
  const CARD_PADDING_X = 32;
11
12
  const CARD_PADDING_Y = 28;
12
13
  const CHART_WIDTH = CARD_WIDTH - OUTER_PADDING * 2 - CARD_PADDING_X * 2;
13
- const CHART_HEIGHT = 228;
14
+ const CHART_HEIGHT = 308;
14
15
  const PLOT_LEFT = 56;
15
16
  const PLOT_RIGHT = 18;
16
17
  const PLOT_TOP = 14;
@@ -45,78 +46,6 @@ const OG_THEMES = {
45
46
  neutralBg: "#27272A", // surface-muted
46
47
  },
47
48
  };
48
- const TIER_CHIP_THEMES = {
49
- BRONZE: {
50
- light: {
51
- from: "#FFE6CC",
52
- to: "#FFC999",
53
- border: "#C97E3D",
54
- icon: "#8B4513",
55
- },
56
- dark: {
57
- from: "#3D2B1A",
58
- to: "#5C3A1E",
59
- border: "#8B5E2B",
60
- icon: "#F5E5D4",
61
- },
62
- },
63
- SILVER: {
64
- light: {
65
- from: "#F2F5F8",
66
- to: "#E2E7EE",
67
- border: "#BFC6CE",
68
- icon: "#6B7280",
69
- },
70
- dark: {
71
- from: "#2A2D31",
72
- to: "#363A40",
73
- border: "#6B7280",
74
- icon: "#F3F4F6",
75
- },
76
- },
77
- GOLD: {
78
- light: {
79
- from: "#FFF0B8",
80
- to: "#FFD875",
81
- border: "#D9A441",
82
- icon: "#DA9100",
83
- },
84
- dark: {
85
- from: "#3D3520",
86
- to: "#4A3D1A",
87
- border: "#B8892E",
88
- icon: "#FFE9B3",
89
- },
90
- },
91
- PLATINUM: {
92
- light: {
93
- from: "#E4FFF7",
94
- to: "#CDEFE5",
95
- border: "#8FD7C6",
96
- icon: "#059669",
97
- },
98
- dark: {
99
- from: "#1A3D33",
100
- to: "#1F3B31",
101
- border: "#4DAE96",
102
- icon: "#BAEBD9",
103
- },
104
- },
105
- DIAMOND: {
106
- light: {
107
- from: "#E2F4FF",
108
- to: "#C9E9FF",
109
- border: "#89D0FF",
110
- icon: "#0284C7",
111
- },
112
- dark: {
113
- from: "#1A2F3D",
114
- to: "#1E3545",
115
- border: "#5AAFE0",
116
- icon: "#5EC0F2",
117
- },
118
- },
119
- };
120
49
  const PRICE_TICK_STEPS = [
121
50
  10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000, 25000, 50000, 100000,
122
51
  250000, 500000, 1000000,
@@ -188,8 +117,6 @@ function buildMainText(input) {
188
117
  const handle = resolveDisplayName(input.realHandle ?? null);
189
118
  if (handle)
190
119
  return handle;
191
- if (input.hideWallet)
192
- return "A Signals trader";
193
120
  return resolveDisplayName(input.displayName) ?? shortenAddress(input.address);
194
121
  }
195
122
  function formatCallCopy(totalCalls) {
@@ -197,8 +124,6 @@ function formatCallCopy(totalCalls) {
197
124
  }
198
125
  function buildSubline(input) {
199
126
  const callCopy = formatCallCopy(input.totalCalls);
200
- if (input.hideWallet)
201
- return `${callCopy} on Signals`;
202
127
  if (resolveDisplayName(input.realHandle ?? null) !== null) {
203
128
  return `${shortenAddress(input.address)} with ${callCopy}`;
204
129
  }
@@ -371,11 +296,8 @@ function buildHistoryPath(btcHistory, scaleX, scaleY) {
371
296
  function clamp(value, min, max) {
372
297
  return Math.min(Math.max(value, min), max);
373
298
  }
374
- function formatTierName(tier) {
375
- return `${tier[0]}${tier.slice(1).toLowerCase()}`;
376
- }
377
299
  function buildTierChip(tier, themeName, theme) {
378
- const tierTheme = TIER_CHIP_THEMES[tier][themeName];
300
+ const tierTheme = tier_theme_shared_1.TIER_CHIP_THEMES[tier][themeName];
379
301
  return (0, h_1.h)("div", {
380
302
  style: {
381
303
  display: "flex",
@@ -399,7 +321,7 @@ function buildTierChip(tier, themeName, theme) {
399
321
  }, (0, h_1.h)("polygon", {
400
322
  points: "8 1 15 8 8 15 1 8",
401
323
  fill: tierTheme.icon,
402
- })), (0, h_1.h)("div", { style: { display: "flex" } }, formatTierName(tier)));
324
+ })), (0, h_1.h)("div", { style: { display: "flex" } }, (0, tier_theme_shared_1.formatTierName)(tier)));
403
325
  }
404
326
  function buildAddressAvatar(address, themeName, theme) {
405
327
  const avatar = (0, avatar_1.getAvatarData)(address, themeName);
@@ -433,44 +355,10 @@ function buildAddressAvatar(address, themeName, theme) {
433
355
  },
434
356
  })))));
435
357
  }
436
- function buildGenericAvatar(theme) {
437
- return (0, h_1.h)("div", {
438
- style: {
439
- width: AVATAR_SIZE,
440
- height: AVATAR_SIZE,
441
- display: "flex",
442
- alignItems: "center",
443
- justifyContent: "center",
444
- overflow: "hidden",
445
- borderRadius: 22,
446
- border: `1px solid ${theme.border}`,
447
- background: theme.primary,
448
- flexShrink: 0,
449
- },
450
- }, (0, h_1.h)("div", {
451
- style: {
452
- width: 58,
453
- height: 58,
454
- display: "flex",
455
- alignItems: "center",
456
- justifyContent: "center",
457
- borderRadius: 999,
458
- background: theme.card,
459
- },
460
- }, (0, h_1.h)("img", {
461
- src: assets_1.SIGNALS_LOGO_URI,
462
- width: 34,
463
- height: 32,
464
- style: { display: "flex" },
465
- })));
466
- }
467
358
  function buildAvatar(input, theme) {
468
- if (input.hideWallet) {
469
- return buildGenericAvatar(theme);
470
- }
471
359
  return buildAddressAvatar(input.address, input.theme, theme);
472
360
  }
473
- function buildBrandWordmark(theme) {
361
+ function buildBrandWordmark(themeName, theme) {
474
362
  return (0, h_1.h)("div", {
475
363
  style: {
476
364
  display: "flex",
@@ -479,7 +367,7 @@ function buildBrandWordmark(theme) {
479
367
  flexShrink: 0,
480
368
  },
481
369
  }, (0, h_1.h)("img", {
482
- src: assets_1.SIGNALS_LOGO_URI,
370
+ src: (0, assets_1.buildLogoSquaresSVG)(themeName),
483
371
  width: 34,
484
372
  height: 32,
485
373
  style: { display: "flex" },
@@ -496,7 +384,7 @@ function buildHeader(input, theme, mainText, subline) {
496
384
  return (0, h_1.h)("div", {
497
385
  style: {
498
386
  display: "flex",
499
- alignItems: "center",
387
+ alignItems: "flex-start",
500
388
  justifyContent: "space-between",
501
389
  gap: 24,
502
390
  minHeight: AVATAR_SIZE,
@@ -546,7 +434,7 @@ function buildHeader(input, theme, mainText, subline) {
546
434
  textOverflow: "ellipsis",
547
435
  whiteSpace: "nowrap",
548
436
  },
549
- }, subline))), buildBrandWordmark(theme));
437
+ }, subline))), buildBrandWordmark(input.theme, theme));
550
438
  }
551
439
  function buildStatItem(label, value, valueColor, theme) {
552
440
  return (0, h_1.h)("div", {
@@ -885,14 +773,5 @@ function buildProfileVNode(input) {
885
773
  style: {
886
774
  display: "flex",
887
775
  },
888
- }, buildChartArea(theme, input.btcHistory, input.positions)), buildStatRow(input, theme, pnlValue, roiValue, bestMultValue), (0, h_1.h)("div", {
889
- style: {
890
- display: "flex",
891
- justifyContent: "flex-end",
892
- marginTop: 16,
893
- fontSize: 13,
894
- fontWeight: 500,
895
- color: theme.inkMuted,
896
- },
897
- }, "signals.wtf · Pick your range"))));
776
+ }, buildChartArea(theme, input.btcHistory, input.positions)), buildStatRow(input, theme, pnlValue, roiValue, bestMultValue))));
898
777
  }
@@ -0,0 +1,10 @@
1
+ export type ProfileTier = "BRONZE" | "SILVER" | "GOLD" | "PLATINUM" | "DIAMOND";
2
+ export type TierThemeName = "light" | "dark";
3
+ export interface TierChipTheme {
4
+ from: string;
5
+ to: string;
6
+ border: string;
7
+ icon: string;
8
+ }
9
+ export declare const TIER_CHIP_THEMES: Record<ProfileTier, Record<TierThemeName, TierChipTheme>>;
10
+ export declare function formatTierName(tier: ProfileTier): string;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TIER_CHIP_THEMES = void 0;
4
+ exports.formatTierName = formatTierName;
5
+ exports.TIER_CHIP_THEMES = {
6
+ BRONZE: {
7
+ light: {
8
+ from: "#FFE6CC",
9
+ to: "#FFC999",
10
+ border: "#C97E3D",
11
+ icon: "#8B4513",
12
+ },
13
+ dark: {
14
+ from: "#3D2B1A",
15
+ to: "#5C3A1E",
16
+ border: "#8B5E2B",
17
+ icon: "#F5E5D4",
18
+ },
19
+ },
20
+ SILVER: {
21
+ light: {
22
+ from: "#F2F5F8",
23
+ to: "#E2E7EE",
24
+ border: "#BFC6CE",
25
+ icon: "#6B7280",
26
+ },
27
+ dark: {
28
+ from: "#2A2D31",
29
+ to: "#363A40",
30
+ border: "#6B7280",
31
+ icon: "#F3F4F6",
32
+ },
33
+ },
34
+ GOLD: {
35
+ light: {
36
+ from: "#FFF0B8",
37
+ to: "#FFD875",
38
+ border: "#D9A441",
39
+ icon: "#DA9100",
40
+ },
41
+ dark: {
42
+ from: "#3D3520",
43
+ to: "#4A3D1A",
44
+ border: "#B8892E",
45
+ icon: "#FFE9B3",
46
+ },
47
+ },
48
+ PLATINUM: {
49
+ light: {
50
+ from: "#E4FFF7",
51
+ to: "#CDEFE5",
52
+ border: "#8FD7C6",
53
+ icon: "#059669",
54
+ },
55
+ dark: {
56
+ from: "#1A3D33",
57
+ to: "#1F3B31",
58
+ border: "#4DAE96",
59
+ icon: "#BAEBD9",
60
+ },
61
+ },
62
+ DIAMOND: {
63
+ light: {
64
+ from: "#E2F4FF",
65
+ to: "#C9E9FF",
66
+ border: "#89D0FF",
67
+ icon: "#0284C7",
68
+ },
69
+ dark: {
70
+ from: "#1A2F3D",
71
+ to: "#1E3545",
72
+ border: "#5AAFE0",
73
+ icon: "#5EC0F2",
74
+ },
75
+ },
76
+ };
77
+ function formatTierName(tier) {
78
+ return `${tier[0]}${tier.slice(1).toLowerCase()}`;
79
+ }
@@ -31,19 +31,16 @@ export interface ProfileChartPosition {
31
31
  }
32
32
  export interface ProfileImageInput {
33
33
  /**
34
- * User-facing display fallback used when `realHandle` is empty and
35
- * `hideWallet` is false. This may include an address fallback supplied by
36
- * legacy callers; it is never shown while `hideWallet` is true.
34
+ * User-facing display fallback used when `realHandle` is empty. This may
35
+ * include an address fallback supplied by legacy callers.
37
36
  */
38
37
  displayName: string | null;
39
38
  /**
40
- * Real, human-friendly handle (e.g. Namoshi name) that is safe to show
41
- * even when `hideWallet` is true.
39
+ * Real, human-friendly handle (e.g. Namoshi name).
42
40
  *
43
41
  * Pass null when no real handle exists. Do not pass a truncated address
44
42
  * fallback here; that belongs in `displayName`. Optional for backward
45
- * compatibility, so callers that omit it get the existing hideWallet
46
- * fallback semantics.
43
+ * compatibility.
47
44
  */
48
45
  realHandle?: string | null;
49
46
  address: string;
@@ -67,6 +64,7 @@ export interface ProfileImageInput {
67
64
  }>;
68
65
  positions: ProfileChartPosition[];
69
66
  theme: "light" | "dark";
67
+ /** @deprecated Has no effect since 1.5.1. */
70
68
  hideWallet: boolean;
71
69
  hideAmounts: boolean;
72
70
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signals-protocol/v1-sdk",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "Signals v1 SDK for CLMSR market calculations and utilities",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -59,6 +59,11 @@
59
59
  "require": "./dist/index.js",
60
60
  "types": "./dist/index.d.ts"
61
61
  },
62
+ "./profile-context": {
63
+ "import": "./dist/profile-context/index.js",
64
+ "require": "./dist/profile-context/index.js",
65
+ "types": "./dist/profile-context/index.d.ts"
66
+ },
62
67
  "./package.json": "./package.json"
63
68
  }
64
69
  }