makeables 0.5.0 → 0.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/README.md +1 -1
- package/dist/assets/stickers/community/brew-fx.webp +0 -0
- package/dist/assets/stickers/community/brew.webp +0 -0
- package/dist/assets/stickers/community/crafter-fx.webp +0 -0
- package/dist/assets/stickers/community/crafter.webp +0 -0
- package/dist/assets/stickers/community/friday-fx.webp +0 -0
- package/dist/assets/stickers/community/friday.webp +0 -0
- package/dist/assets/stickers/community/provenance.json +43 -0
- package/dist/assets/stickers/typingmind/absolutely-right-fx.webp +0 -0
- package/dist/assets/stickers/typingmind/absolutely-right.webp +0 -0
- package/dist/assets/stickers/typingmind/agi-disco-fx.webp +0 -0
- package/dist/assets/stickers/typingmind/agi-disco.webp +0 -0
- package/dist/assets/stickers/typingmind/agi-is-coming-fx.webp +0 -0
- package/dist/assets/stickers/typingmind/agi-is-coming.webp +0 -0
- package/dist/assets/stickers/typingmind/cmd-enter-fx.webp +0 -0
- package/dist/assets/stickers/typingmind/cmd-enter.webp +0 -0
- package/dist/assets/stickers/typingmind/emotional-support-fx.webp +0 -0
- package/dist/assets/stickers/typingmind/emotional-support.webp +0 -0
- package/dist/assets/stickers/typingmind/energy-fx.webp +0 -0
- package/dist/assets/stickers/typingmind/energy.webp +0 -0
- package/dist/assets/stickers/typingmind/motion-fx.webp +0 -0
- package/dist/assets/stickers/typingmind/motion.webp +0 -0
- package/dist/assets/stickers/typingmind/provenance.json +97 -0
- package/dist/assets/stickers/typingmind/typingmind-fx.webp +0 -0
- package/dist/assets/stickers/typingmind/typingmind.webp +0 -0
- package/dist/assets/stickers/typingmind/youre-cooked-fx.webp +0 -0
- package/dist/assets/stickers/typingmind/youre-cooked.webp +0 -0
- package/dist/{chunk-WVXA65H6.js → chunk-4AJQBAFB.js} +2757 -293
- package/dist/cli.js +75 -18
- package/dist/{mcp-LKLESPJC.js → mcp-LXTO7XOO.js} +11 -2
- package/package.json +3 -3
|
@@ -267,7 +267,7 @@ var shaderGenerationSchema = z.object({
|
|
|
267
267
|
})
|
|
268
268
|
}).strict();
|
|
269
269
|
|
|
270
|
-
// ../design/dist/chunk-
|
|
270
|
+
// ../design/dist/chunk-FCSPT2UX.js
|
|
271
271
|
import { z as z3 } from "zod";
|
|
272
272
|
import { z as z2 } from "zod";
|
|
273
273
|
import { z as z22 } from "zod";
|
|
@@ -331,9 +331,9 @@ function networkMarkup(network, mode, visaVariant) {
|
|
|
331
331
|
const foreground = mode === "black" ? "#ffffff" : mode === "white" ? "#111111" : "#ffffff";
|
|
332
332
|
return `<rect width="142" height="94" rx="4" fill="${background}"/><text x="71" y="42" text-anchor="middle" fill="${foreground}" font-family="Arial,Helvetica,sans-serif" font-size="23" font-weight="900" letter-spacing="-1.5">AMERICAN</text><text x="71" y="70" text-anchor="middle" fill="${foreground}" font-family="Arial,Helvetica,sans-serif" font-size="27" font-weight="900" letter-spacing="-1.8">EXPRESS</text>`;
|
|
333
333
|
}
|
|
334
|
-
const
|
|
334
|
+
const ink = mode === "brand" ? "#202024" : mono;
|
|
335
335
|
const sun = mode === "brand" ? "#f58220" : mono;
|
|
336
|
-
return `<g transform="scale(.88)"><g font-family="Arial,Helvetica,sans-serif" font-size="44" font-weight="900" letter-spacing="-2" fill="${
|
|
336
|
+
return `<g transform="scale(.88)"><g font-family="Arial,Helvetica,sans-serif" font-size="44" font-weight="900" letter-spacing="-2" fill="${ink}"><text x="0" y="63">DISC</text><text x="153" y="63">VER</text></g><circle cx="132" cy="46" r="19" fill="none" stroke="${sun}" stroke-width="10"/></g>`;
|
|
337
337
|
}
|
|
338
338
|
function cardDetailsSvg(details) {
|
|
339
339
|
const [chipX, chipY] = CHIP_OFFSET[details.chipSlot];
|
|
@@ -434,8 +434,28 @@ var stickerMaterialSchema = z2.object({
|
|
|
434
434
|
finish: z2.enum(["glitter", "holographic", "vinyl"]),
|
|
435
435
|
border: z2.number().min(0).max(40),
|
|
436
436
|
sparkle: z2.number().min(0).max(1),
|
|
437
|
-
gloss: z2.number().min(0).max(1),
|
|
438
|
-
seed: z2.number().int().min(0).max(4294967295)
|
|
437
|
+
gloss: z2.number().min(0).max(1.5),
|
|
438
|
+
seed: z2.number().int().min(0).max(4294967295),
|
|
439
|
+
holography: z2.number().min(0).max(1).optional(),
|
|
440
|
+
relief: z2.number().min(0).max(1.5).optional(),
|
|
441
|
+
flakes: z2.number().min(40).max(500).optional(),
|
|
442
|
+
stock: z2.enum(["white", "holographic", "holo-glitter"]).optional(),
|
|
443
|
+
laminate: z2.enum(["gloss", "matte"]).optional(),
|
|
444
|
+
liner: z2.string().min(1).max(40).optional(),
|
|
445
|
+
/** RGB = foil, glitter, relief. Follow the named image layer's placement and alpha. */
|
|
446
|
+
effectMap: z2.object({
|
|
447
|
+
asset: z2.string().regex(/^[a-z][a-z0-9-]{0,39}$/),
|
|
448
|
+
layer: z2.string().min(1).max(80)
|
|
449
|
+
}).optional(),
|
|
450
|
+
/** Optical overrides follow editable layer geometry, including later transforms. */
|
|
451
|
+
regions: z2.record(
|
|
452
|
+
z2.string().min(1).max(80),
|
|
453
|
+
z2.object({
|
|
454
|
+
foil: z2.number().min(0).max(1),
|
|
455
|
+
glitter: z2.number().min(0).max(1),
|
|
456
|
+
relief: z2.number().min(0).max(1)
|
|
457
|
+
})
|
|
458
|
+
).optional()
|
|
439
459
|
});
|
|
440
460
|
var defaultStickerMaterial = {
|
|
441
461
|
finish: "glitter",
|
|
@@ -751,6 +771,15 @@ var ART_ASSET = "art";
|
|
|
751
771
|
var assetId = z3.string().regex(/^[a-z][a-z0-9-]{0,39}$/);
|
|
752
772
|
var credit = z3.object({ label: z3.string().min(1).max(120), url: z3.string().url() });
|
|
753
773
|
var designAssetSchema = z3.discriminatedUnion("source", [
|
|
774
|
+
// Unchanged artwork and optical maps from an attributed bundled sticker collection.
|
|
775
|
+
z3.object({
|
|
776
|
+
source: z3.literal("sticker"),
|
|
777
|
+
collection: z3.enum(["typingmind", "community"]),
|
|
778
|
+
slug: z3.string().regex(/^[a-z0-9-]{1,80}$/),
|
|
779
|
+
file: z3.enum(["artwork", "effects"]),
|
|
780
|
+
name: z3.string().min(1).max(80),
|
|
781
|
+
credit
|
|
782
|
+
}),
|
|
754
783
|
// A Petdex sprite bundled with Makeables, served from /stickers/petdex/<slug>.webp.
|
|
755
784
|
z3.object({
|
|
756
785
|
source: z3.literal("petdex"),
|
|
@@ -887,6 +916,15 @@ function designIssues(design2) {
|
|
|
887
916
|
const profile = designProfile(design2);
|
|
888
917
|
const badge = profile.id === "badge";
|
|
889
918
|
const assets = design2.assets ?? {};
|
|
919
|
+
if (design2.sticker?.effectMap) {
|
|
920
|
+
const { asset, layer } = design2.sticker.effectMap;
|
|
921
|
+
if (!assets[asset]) issues2.push(`sticker.effectMap: missing asset ${asset}`);
|
|
922
|
+
if (!design2.front.layers.some((value) => value.id === layer && value.kind === "image"))
|
|
923
|
+
issues2.push(`sticker.effectMap: ${layer} must name a front image layer`);
|
|
924
|
+
}
|
|
925
|
+
for (const id of Object.keys(design2.sticker?.regions ?? {}))
|
|
926
|
+
if (!design2.front.layers.some((layer) => layer.id === id))
|
|
927
|
+
issues2.push(`sticker.regions: missing front layer ${id}`);
|
|
890
928
|
if (profile.id === "sticker" && design2.back.layers.length)
|
|
891
929
|
issues2.push("Stickers have one editable face; keep back layers empty.");
|
|
892
930
|
if (Object.keys(assets).length > 24) issues2.push("assets: 24 como m\xE1ximo");
|
|
@@ -921,9 +959,9 @@ function designIssues(design2) {
|
|
|
921
959
|
if ((layer.kind === "portrait" || layer.kind === "image") && layer.channel === "ink")
|
|
922
960
|
issues2.push(`${side2}.${layer.id}: las im\xE1genes pertenecen a la impresi\xF3n`);
|
|
923
961
|
if (layer.kind === "graphic" && layer.pattern === "path") {
|
|
924
|
-
const
|
|
925
|
-
const numbers2 =
|
|
926
|
-
if (!/^[Mm]/.test(
|
|
962
|
+
const path2 = layer.path?.trim() ?? "";
|
|
963
|
+
const numbers2 = path2.match(/[-+]?(?:\d*\.?\d+)(?:[eE][-+]?\d+)?/g) ?? [];
|
|
964
|
+
if (!/^[Mm]/.test(path2) || numbers2.some(
|
|
927
965
|
(value) => !Number.isFinite(Number(value)) || Math.abs(Number(value)) > 16384
|
|
928
966
|
))
|
|
929
967
|
issues2.push(`${side2}.${layer.id}: trazado inv\xE1lido o fuera de rango`);
|
|
@@ -996,6 +1034,33 @@ function preserveDesignLocks(current, next, locks) {
|
|
|
996
1034
|
}
|
|
997
1035
|
return badgeDesignSchema.parse(output);
|
|
998
1036
|
}
|
|
1037
|
+
function referencedDesignAssets(design2) {
|
|
1038
|
+
return [
|
|
1039
|
+
.../* @__PURE__ */ new Set([
|
|
1040
|
+
...["front", "back"].flatMap(
|
|
1041
|
+
(side2) => design2[side2].layers.flatMap((layer) => layer.kind === "image" ? [layer.asset] : [])
|
|
1042
|
+
),
|
|
1043
|
+
...design2.sticker?.effectMap ? [design2.sticker.effectMap.asset] : []
|
|
1044
|
+
])
|
|
1045
|
+
];
|
|
1046
|
+
}
|
|
1047
|
+
function pruneAssets(design2) {
|
|
1048
|
+
if (design2.sticker) {
|
|
1049
|
+
const ids = new Set(design2.front.layers.map((layer) => layer.id));
|
|
1050
|
+
design2 = {
|
|
1051
|
+
...design2,
|
|
1052
|
+
sticker: {
|
|
1053
|
+
...design2.sticker,
|
|
1054
|
+
effectMap: design2.sticker.effectMap && ids.has(design2.sticker.effectMap.layer) ? design2.sticker.effectMap : void 0,
|
|
1055
|
+
regions: design2.sticker.regions ? Object.fromEntries(Object.entries(design2.sticker.regions).filter(([id]) => ids.has(id))) : void 0
|
|
1056
|
+
}
|
|
1057
|
+
};
|
|
1058
|
+
}
|
|
1059
|
+
if (!design2.assets) return design2;
|
|
1060
|
+
const used = new Set(referencedDesignAssets(design2));
|
|
1061
|
+
const assets = Object.fromEntries(Object.entries(design2.assets).filter(([id]) => used.has(id)));
|
|
1062
|
+
return { ...design2, assets };
|
|
1063
|
+
}
|
|
999
1064
|
var STICKER_SIZE = 280;
|
|
1000
1065
|
var STICKER_SLOTS = [
|
|
1001
1066
|
[0.74, 0.3],
|
|
@@ -1103,7 +1168,7 @@ function createCardDesign(gallery) {
|
|
|
1103
1168
|
});
|
|
1104
1169
|
}
|
|
1105
1170
|
|
|
1106
|
-
// ../design/dist/chunk-
|
|
1171
|
+
// ../design/dist/chunk-P4CPFXJM.js
|
|
1107
1172
|
var t = (id, value, x, baseline, w, size, font, color3, extra = {}) => ({
|
|
1108
1173
|
id,
|
|
1109
1174
|
kind: "text",
|
|
@@ -1382,9 +1447,9 @@ var archive = design(
|
|
|
1382
1447
|
q(92, 931, 336)
|
|
1383
1448
|
]
|
|
1384
1449
|
);
|
|
1385
|
-
function classic(id, event, title, subtitle, base,
|
|
1450
|
+
function classic(id, event, title, subtitle, base, ink, accent, font, layout) {
|
|
1386
1451
|
const variant = layout === "winter" ? "snow" : layout === "postage" ? "postal" : "grid";
|
|
1387
|
-
const decoration = () => [g("paper", "paper", 0, 0, 1024, 1536, base, accent, { variant, ink
|
|
1452
|
+
const decoration = () => [g("paper", "paper", 0, 0, 1024, 1536, base, accent, { variant, ink })];
|
|
1388
1453
|
const x = layout === "terminal" ? 102 : layout === "postage" ? 160 : 140;
|
|
1389
1454
|
const y = layout === "winter" ? 397 : layout === "postage" ? 412 : 367;
|
|
1390
1455
|
const w = 1024 - x * 2;
|
|
@@ -1428,34 +1493,34 @@ function classic(id, event, title, subtitle, base, ink2, accent, font, layout) {
|
|
|
1428
1493
|
layout === "postage" ? 695 : 866,
|
|
1429
1494
|
title.length > 1 ? 85 : 105,
|
|
1430
1495
|
font,
|
|
1431
|
-
|
|
1496
|
+
ink
|
|
1432
1497
|
)
|
|
1433
1498
|
),
|
|
1434
|
-
t("name", "$name", 78, 1280, 850, 95, font,
|
|
1499
|
+
t("name", "$name", 78, 1280, 850, 95, font, ink, upper),
|
|
1435
1500
|
t("role", "$role", 84, 1338, 390, 27, "mono", accent, { ...upper, prefix: "\u2197 " }),
|
|
1436
|
-
t("organization", "$organization", 548, 1338, 390, 23, "mono",
|
|
1437
|
-
s("footer-rule", 82, 1380, 860, 1.5, `${
|
|
1438
|
-
t("location", "$location", 84, 1444, 700, 20, "mono",
|
|
1501
|
+
t("organization", "$organization", 548, 1338, 390, 23, "mono", ink, { align: "right" }),
|
|
1502
|
+
s("footer-rule", 82, 1380, 860, 1.5, `${ink}70`),
|
|
1503
|
+
t("location", "$location", 84, 1444, 700, 20, "mono", ink),
|
|
1439
1504
|
t("number", "$number", 765, 1476, 175, 18, "mono", accent, { prefix: "N\xBA ", align: "right" })
|
|
1440
1505
|
];
|
|
1441
1506
|
const back = [
|
|
1442
1507
|
...decoration(),
|
|
1443
1508
|
{ ...s("back-panel", 54, 110, 916, 1278, `${base}e8`), channel: "print" },
|
|
1444
|
-
g("back-motif", "grid", 0, 0, 1024, 1536, base, accent, { variant, ink
|
|
1445
|
-
t("event", "$event", 82, 176, 710, 40, font,
|
|
1509
|
+
g("back-motif", "grid", 0, 0, 1024, 1536, base, accent, { variant, ink, reverse: true }),
|
|
1510
|
+
t("event", "$event", 82, 176, 710, 40, font, ink, upper),
|
|
1446
1511
|
t("reverse", "REVERSE", 770, 173, 170, 17, "mono", accent, { align: "right" }),
|
|
1447
|
-
s("header-rule", 82, 217, 860, 1.5, `${
|
|
1512
|
+
s("header-rule", 82, 217, 860, 1.5, `${ink}65`),
|
|
1448
1513
|
t("person-label", "THE PERSON", 84, 280, 850, 20, "mono", accent),
|
|
1449
|
-
t("name", "$name", 79, 380, 850, 95, font,
|
|
1450
|
-
t("role", "{role} / {organization}", 84, 436, 840, 29, "mono",
|
|
1451
|
-
s("identity-rule", 82, 483, 860, 1.5, `${
|
|
1514
|
+
t("name", "$name", 79, 380, 850, 95, font, ink, upper),
|
|
1515
|
+
t("role", "{role} / {organization}", 84, 436, 840, 29, "mono", ink, { binding: "template" }),
|
|
1516
|
+
s("identity-rule", 82, 483, 860, 1.5, `${ink}55`),
|
|
1452
1517
|
t("edition-label", "THE EDITION", 84, 546, 850, 20, "mono", accent),
|
|
1453
|
-
t("subtitle", subtitle, 80, 622, 850, 51, font,
|
|
1454
|
-
t("location", "$location", 84, 674, 850, 26, "mono",
|
|
1455
|
-
s("meeting-rule", 82, 720, 860, 1.5, `${
|
|
1518
|
+
t("subtitle", subtitle, 80, 622, 850, 51, font, ink),
|
|
1519
|
+
t("location", "$location", 84, 674, 850, 26, "mono", ink),
|
|
1520
|
+
s("meeting-rule", 82, 720, 860, 1.5, `${ink}55`),
|
|
1456
1521
|
t("explore", "KEEP EXPLORING", 84, 786, 850, 20, "mono", accent),
|
|
1457
|
-
t("ideas", "Ideas travel.", 502, 905, 410, 48, font,
|
|
1458
|
-
t("further", "Take yours further.", 502, 969, 410, 33, "serif",
|
|
1522
|
+
t("ideas", "Ideas travel.", 502, 905, 410, 48, font, ink),
|
|
1523
|
+
t("further", "Take yours further.", 502, 969, 410, 33, "serif", ink),
|
|
1459
1524
|
t("website", "$website", 502, 1040, 405, 19, "mono", accent),
|
|
1460
1525
|
g("stamp", "stamp", 594, 1076, 128, 128, accent),
|
|
1461
1526
|
t("stamp-label", "BUILDER", 609, 1134, 98, 15, "mono", accent, {
|
|
@@ -1470,11 +1535,11 @@ function classic(id, event, title, subtitle, base, ink2, accent, font, layout) {
|
|
|
1470
1535
|
x: 610.8281764208984,
|
|
1471
1536
|
y: 1143.8534330767354
|
|
1472
1537
|
}),
|
|
1473
|
-
s("footer-rule", 82, 1260, 860, 1.5, `${
|
|
1474
|
-
t("closing", "Una persona. Muchas formas de crear.", 84, 1324, 850, 31, font,
|
|
1538
|
+
s("footer-rule", 82, 1260, 860, 1.5, `${ink}55`),
|
|
1539
|
+
t("closing", "Una persona. Muchas formas de crear.", 84, 1324, 850, 31, font, ink),
|
|
1475
1540
|
t("signature", "$signature", 84, 1380, 840, 20, "mono", accent, { prefix: "ID " }),
|
|
1476
|
-
s("bottom-rule", 82, 1418, 860, 1.5, `${
|
|
1477
|
-
t("footer", "BADGE STUDY / INSPIRED EDITION", 84, 1468, 730, 17, "mono",
|
|
1541
|
+
s("bottom-rule", 82, 1418, 860, 1.5, `${ink}55`),
|
|
1542
|
+
t("footer", "BADGE STUDY / INSPIRED EDITION", 84, 1468, 730, 17, "mono", ink),
|
|
1478
1543
|
t("number", "$number", 790, 1468, 150, 20, "mono", accent, { prefix: "N\xBA ", align: "right" }),
|
|
1479
1544
|
{ ...q(84, 823, 374), foreground: "#141414", maxCellSize: 10 }
|
|
1480
1545
|
];
|
|
@@ -2140,7 +2205,7 @@ var cardDirections = {
|
|
|
2140
2205
|
}
|
|
2141
2206
|
};
|
|
2142
2207
|
function cardReverse(slug, original) {
|
|
2143
|
-
const { base, ink
|
|
2208
|
+
const { base, ink, accent } = cardDirections[slug];
|
|
2144
2209
|
const motif2 = (index, box2, opacity = 1) => {
|
|
2145
2210
|
const source = original[index - 1];
|
|
2146
2211
|
const scale = Math.min(box2[2] / source.w, box2[3] / source.h);
|
|
@@ -2156,9 +2221,9 @@ function cardReverse(slug, original) {
|
|
|
2156
2221
|
opacity
|
|
2157
2222
|
};
|
|
2158
2223
|
};
|
|
2159
|
-
const label = (id, value, x, y, w = 900, color3 =
|
|
2160
|
-
const title = (value, x = 80, y = 260, w = 900, size = 88, font = "sans") => text3("reverse-title", value, [x, y, w, size * 2.5],
|
|
2161
|
-
const line2 = (id, y, color3 =
|
|
2224
|
+
const label = (id, value, x, y, w = 900, color3 = ink) => text3(id, value, [x, y, w, 28], color3, 14);
|
|
2225
|
+
const title = (value, x = 80, y = 260, w = 900, size = 88, font = "sans") => text3("reverse-title", value, [x, y, w, size * 2.5], ink, size, font, "600");
|
|
2226
|
+
const line2 = (id, y, color3 = ink) => path(id, [80, y, 1040, 2], "M0 1H1040", color3, 1, 0.5);
|
|
2162
2227
|
const frame = () => field("reverse-frame", "M40 40H1160V716H40Z", accent, 1, 0.5);
|
|
2163
2228
|
let layers;
|
|
2164
2229
|
switch (slug) {
|
|
@@ -2207,7 +2272,7 @@ function cardReverse(slug, original) {
|
|
|
2207
2272
|
rect("save-panel-shadow", [105, 156, 990, 400], "#130e29"),
|
|
2208
2273
|
rect("save-panel", [92, 143, 990, 400], "#684369"),
|
|
2209
2274
|
rect("save-inset", [104, 155, 966, 376], "#2c2047"),
|
|
2210
|
-
text3("save-title", "SAVE COMPLETE", [158, 211, 820, 85],
|
|
2275
|
+
text3("save-title", "SAVE COMPLETE", [158, 211, 820, 85], ink, 53, "pixel"),
|
|
2211
2276
|
label("save-message", "A GOOD PLACE TO BEGIN AGAIN.", 161, 323, 860),
|
|
2212
2277
|
...Array.from(
|
|
2213
2278
|
{ length: 12 },
|
|
@@ -2224,13 +2289,13 @@ function cardReverse(slug, original) {
|
|
|
2224
2289
|
rect("obsidian-veil", [0, 0, 1200, 756], "#070909", 0, 0.58),
|
|
2225
2290
|
frame(),
|
|
2226
2291
|
field("inner-gold-rim", "M58 58H1142V698H58Z", accent, 1, 0.2),
|
|
2227
|
-
text3("private-reverse", "PRIVATE EDITION", [80, 79, 1030, 30],
|
|
2292
|
+
text3("private-reverse", "PRIVATE EDITION", [80, 79, 1030, 30], ink, 17),
|
|
2228
2293
|
motif2(8, [442, 175, 318, 137]),
|
|
2229
2294
|
text3(
|
|
2230
2295
|
"builders-manifesto",
|
|
2231
2296
|
"BUILD. SHIP. REPEAT.",
|
|
2232
2297
|
[180, 389, 850, 75],
|
|
2233
|
-
|
|
2298
|
+
ink,
|
|
2234
2299
|
43,
|
|
2235
2300
|
"sans",
|
|
2236
2301
|
"500"
|
|
@@ -2249,13 +2314,13 @@ function cardReverse(slug, original) {
|
|
|
2249
2314
|
"dream-letter",
|
|
2250
2315
|
"see you on\nthe other side.",
|
|
2251
2316
|
[96, 224, 970, 235],
|
|
2252
|
-
|
|
2317
|
+
ink,
|
|
2253
2318
|
86,
|
|
2254
2319
|
"serif",
|
|
2255
2320
|
"400"
|
|
2256
2321
|
),
|
|
2257
2322
|
label("dream-index", "DREAM SEQUENCE / AN AFTERNOON NOTE", 99, 85),
|
|
2258
|
-
path("postcard-line", [99, 556, 606, 2], "M0 1H606",
|
|
2323
|
+
path("postcard-line", [99, 556, 606, 2], "M0 1H606", ink, 1, 0.5),
|
|
2259
2324
|
label("dream-address", "SOMEWHERE, AT 4:07 PM.", 99, 592, 710),
|
|
2260
2325
|
motif2(31, [844, 90, 238, 72])
|
|
2261
2326
|
];
|
|
@@ -2280,7 +2345,7 @@ function cardReverse(slug, original) {
|
|
|
2280
2345
|
gradient2("arcade-panel", ["#120d20", "#341136"]),
|
|
2281
2346
|
grid("arcade-grid", [0, 0, 1200, 756], "#a653b8", 28, 0.07),
|
|
2282
2347
|
label("arcade-index", "EXTRA LIFE / PLAYER ONE", 82, 77),
|
|
2283
|
-
text3("continue-question", "CONTINUE?", [79, 203, 1050, 111],
|
|
2348
|
+
text3("continue-question", "CONTINUE?", [79, 203, 1050, 111], ink, 77, "pixel"),
|
|
2284
2349
|
...[0, 1, 2].map((i) => ({
|
|
2285
2350
|
...motif2(20, [88 + i * 126, 376, 92, 85], i < 2 ? 1 : 0.22),
|
|
2286
2351
|
id: `life-${i}`
|
|
@@ -2301,25 +2366,25 @@ function cardReverse(slug, original) {
|
|
|
2301
2366
|
path("blue-quarter", [738, 395, 302, 302], "M0 0H302V302A302 302 0 0 1 0 0Z", "#29455a"),
|
|
2302
2367
|
title("FORM &\nFUNCTION", 84, 222, 855, 79),
|
|
2303
2368
|
label("study-caption", "COMPOSITION STUDY / 02", 88, 83),
|
|
2304
|
-
path("study-rule", [86, 542, 550, 2], "M0 1H550",
|
|
2369
|
+
path("study-rule", [86, 542, 550, 2], "M0 1H550", ink, 1),
|
|
2305
2370
|
label("study-note", "BALANCE, WITH ROOM TO PLAY.", 88, 593, 660),
|
|
2306
|
-
circle("registration-mark", 89, 683, 4,
|
|
2371
|
+
circle("registration-mark", 89, 683, 4, ink)
|
|
2307
2372
|
];
|
|
2308
2373
|
break;
|
|
2309
2374
|
case "garra-29":
|
|
2310
2375
|
layers = [
|
|
2311
2376
|
gradient2("maroon-enamel", ["#8d1828", "#b02138"]),
|
|
2312
2377
|
film("heritage-grain", "grain", ["#a6192e", "#d49a9a", "#5b1120"], 0.04),
|
|
2313
|
-
field("cream-frame", "M38 38H1162V718H38Z",
|
|
2314
|
-
text3("heritage-number", "29", [83, 257, 534, 302],
|
|
2315
|
-
text3("one-legacy", "ONE\nLEGACY.", [704, 390, 438, 151],
|
|
2378
|
+
field("cream-frame", "M38 38H1162V718H38Z", ink, 1.5, 0.8),
|
|
2379
|
+
text3("heritage-number", "29", [83, 257, 534, 302], ink, 218, "sans", "800"),
|
|
2380
|
+
text3("one-legacy", "ONE\nLEGACY.", [704, 390, 438, 151], ink, 57, "sans", "700"),
|
|
2316
2381
|
...Array.from(
|
|
2317
2382
|
{ length: 29 },
|
|
2318
2383
|
(_, i) => path(
|
|
2319
2384
|
`championship-star-${i + 1}`,
|
|
2320
2385
|
[90 + i % 15 * 48, 126 + Math.floor(i / 15) * 43, 22, 22],
|
|
2321
2386
|
smallStar(11, 11, 10),
|
|
2322
|
-
|
|
2387
|
+
ink
|
|
2323
2388
|
)
|
|
2324
2389
|
),
|
|
2325
2390
|
label("heritage-origin", "GARRA CREMA / LIMA, 1924", 87, 79),
|
|
@@ -2372,13 +2437,13 @@ function cardReverse(slug, original) {
|
|
|
2372
2437
|
gradient2("warm-paper", ["#f7f2e8", "#e7e2d8"]),
|
|
2373
2438
|
grid("measuring-field", [81, 135, 1038, 479], "#bbb2a2", 39, 0.17),
|
|
2374
2439
|
rect("vermilion-spine", [80, 135, 21, 478], accent),
|
|
2375
|
-
text3("second-interval", "02", [786, 364, 337, 238],
|
|
2440
|
+
text3("second-interval", "02", [786, 364, 337, 238], ink, 180, "sans", "400"),
|
|
2376
2441
|
label("interval-title", "INTERVAL / THE SPACE BETWEEN", 81, 79),
|
|
2377
2442
|
title("ROOM\nTO THINK.", 130, 221, 700, 73),
|
|
2378
2443
|
field(
|
|
2379
2444
|
"calibration-ticks",
|
|
2380
2445
|
Array.from({ length: 27 }, (_, i) => `M${83 + i * 39} 641v${i % 3 ? 9 : 22}`).join(""),
|
|
2381
|
-
|
|
2446
|
+
ink,
|
|
2382
2447
|
1,
|
|
2383
2448
|
0.65
|
|
2384
2449
|
),
|
|
@@ -2500,10 +2565,10 @@ function cardReverse(slug, original) {
|
|
|
2500
2565
|
rect("status-titlebar", [166, 151, 864, 53], "#304976"),
|
|
2501
2566
|
text3("status-title", "REVERSE SIDE", [192, 166, 788, 37], "#ffffff", 23),
|
|
2502
2567
|
...["LAYERS : OPEN", "MATERIAL : LIVE", "STATUS : READY"].map(
|
|
2503
|
-
(value, i) => text3(`status-row-${i}`, value, [238, 266 + i * 69, 745, 47],
|
|
2568
|
+
(value, i) => text3(`status-row-${i}`, value, [238, 266 + i * 69, 745, 47], ink, 28)
|
|
2504
2569
|
),
|
|
2505
2570
|
rect("status-button", [790, 480, 194, 57], "#dfe5ee"),
|
|
2506
|
-
text3("status-ok", "OK", [858, 495, 92, 36],
|
|
2571
|
+
text3("status-ok", "OK", [858, 495, 92, 36], ink, 24),
|
|
2507
2572
|
label("local-note", "SYSTEM DIALOG / LOCAL SESSION", 154, 654)
|
|
2508
2573
|
];
|
|
2509
2574
|
break;
|
|
@@ -2512,8 +2577,8 @@ function cardReverse(slug, original) {
|
|
|
2512
2577
|
gradient2("brushed-silver", ["#eceee7", "#c9d1c8"]),
|
|
2513
2578
|
grid("maker-grid", [40, 40, 1120, 676], "#839589", 40, 0.13),
|
|
2514
2579
|
label("maker-index", "VIBECODERS / REVERSE ENGINEERING", 85, 84),
|
|
2515
|
-
path("opening-bracket", [81, 244, 82, 231], "M82 0L0 115L82 231",
|
|
2516
|
-
path("closing-bracket", [1037, 244, 82, 231], "M0 0L82 115L0 231",
|
|
2580
|
+
path("opening-bracket", [81, 244, 82, 231], "M82 0L0 115L82 231", ink, 3),
|
|
2581
|
+
path("closing-bracket", [1037, 244, 82, 231], "M0 0L82 115L0 231", ink, 3),
|
|
2517
2582
|
title("MAKE\nIT REAL.", 234, 216, 760, 97),
|
|
2518
2583
|
rect("cursor", [787, 422, 20, 75], "#476953"),
|
|
2519
2584
|
line2("maker-rule", 571),
|
|
@@ -2593,7 +2658,7 @@ function line(id, x, y, w, color3) {
|
|
|
2593
2658
|
function effect2(id, kind, colors, opacity) {
|
|
2594
2659
|
return { id, kind: "effect", effect: kind, ...canvas, colors, scale: 1.3, opacity };
|
|
2595
2660
|
}
|
|
2596
|
-
function style(id, name, description, palette2,
|
|
2661
|
+
function style(id, name, description, palette2, ink, material, layers) {
|
|
2597
2662
|
return badgeDesignSchema.parse({
|
|
2598
2663
|
version: 1,
|
|
2599
2664
|
product: "card",
|
|
@@ -2618,18 +2683,18 @@ function style(id, name, description, palette2, ink2, material, layers) {
|
|
|
2618
2683
|
]
|
|
2619
2684
|
},
|
|
2620
2685
|
...layers,
|
|
2621
|
-
text22("wordmark", "makeables", 74, 62, 570, 38,
|
|
2622
|
-
text22("edition", "MATERIAL STUDIES", 76, 123, 570, 16,
|
|
2623
|
-
text22("title", name.toUpperCase(), 76, 500, 760, 25,
|
|
2624
|
-
text22("series", "DESIGNED TO BE YOURS", 78, 542, 660, 13,
|
|
2625
|
-
line("title-rule", 76, 589, 1028,
|
|
2686
|
+
text22("wordmark", "makeables", 74, 62, 570, 38, ink),
|
|
2687
|
+
text22("edition", "MATERIAL STUDIES", 76, 123, 570, 16, ink),
|
|
2688
|
+
text22("title", name.toUpperCase(), 76, 500, 760, 25, ink),
|
|
2689
|
+
text22("series", "DESIGNED TO BE YOURS", 78, 542, 660, 13, ink),
|
|
2690
|
+
line("title-rule", 76, 589, 1028, ink),
|
|
2626
2691
|
cardMarkLayer("chip", { mark: "chip", slot: "middle-left", color: "#c7d0d9" }),
|
|
2627
|
-
cardMarkLayer("contactless", { mark: "contactless", slot: "upper-right", color:
|
|
2692
|
+
cardMarkLayer("contactless", { mark: "contactless", slot: "upper-right", color: ink }),
|
|
2628
2693
|
cardMarkLayer("network", {
|
|
2629
2694
|
mark: "network",
|
|
2630
2695
|
slot: "lower-right",
|
|
2631
2696
|
network: "visa",
|
|
2632
|
-
colorMode:
|
|
2697
|
+
colorMode: ink === "#ffffff" ? "white" : "black",
|
|
2633
2698
|
visaVariant: "plain"
|
|
2634
2699
|
})
|
|
2635
2700
|
]
|
|
@@ -2646,16 +2711,16 @@ function style(id, name, description, palette2, ink2, material, layers) {
|
|
|
2646
2711
|
y: 90,
|
|
2647
2712
|
w: 1200,
|
|
2648
2713
|
h: 130,
|
|
2649
|
-
color:
|
|
2714
|
+
color: ink,
|
|
2650
2715
|
radius: 0,
|
|
2651
2716
|
stroke: 0,
|
|
2652
2717
|
opacity: 0.9
|
|
2653
2718
|
},
|
|
2654
|
-
text22("reverse-wordmark", "makeables / material studies", 76, 310, 1040, 24,
|
|
2655
|
-
line("reverse-rule", 76, 380, 1048,
|
|
2656
|
-
text22("reverse-title", name.toUpperCase(), 76, 430, 1e3, 46,
|
|
2657
|
-
text22("reverse-caption", "A SMALL CANVAS. ENDLESS POSSIBILITIES.", 78, 524, 1020, 16,
|
|
2658
|
-
text22("reverse-footer", "ORIGINAL ARTWORK / MAKEABLES", 78, 658, 1e3, 13,
|
|
2719
|
+
text22("reverse-wordmark", "makeables / material studies", 76, 310, 1040, 24, ink),
|
|
2720
|
+
line("reverse-rule", 76, 380, 1048, ink),
|
|
2721
|
+
text22("reverse-title", name.toUpperCase(), 76, 430, 1e3, 46, ink),
|
|
2722
|
+
text22("reverse-caption", "A SMALL CANVAS. ENDLESS POSSIBILITIES.", 78, 524, 1020, 16, ink),
|
|
2723
|
+
text22("reverse-footer", "ORIGINAL ARTWORK / MAKEABLES", 78, 658, 1e3, 13, ink)
|
|
2659
2724
|
]
|
|
2660
2725
|
}
|
|
2661
2726
|
});
|
|
@@ -2752,183 +2817,2403 @@ var materialCardStyles = [
|
|
|
2752
2817
|
]
|
|
2753
2818
|
)
|
|
2754
2819
|
];
|
|
2755
|
-
var curatedCardStyles = originalCards();
|
|
2756
|
-
var cardStyles = [...materialCardStyles, ...curatedCardStyles];
|
|
2757
|
-
function findCardStyle(id) {
|
|
2758
|
-
return cardStyles.find((design2) => design2.source === id);
|
|
2759
|
-
}
|
|
2760
|
-
var faceEdits = z4.object({
|
|
2761
|
-
background: badgeDesignObjectSchema.shape.front.shape.background.optional(),
|
|
2762
|
-
upsert: z4.array(badgeLayerSchema).max(96).optional(),
|
|
2763
|
-
remove: z4.array(z4.string()).max(96).optional(),
|
|
2764
|
-
order: z4.array(z4.string()).max(96).optional()
|
|
2765
|
-
});
|
|
2766
|
-
var designEditsSchema = z4.object({
|
|
2767
|
-
name: badgeDesignObjectSchema.shape.name.optional(),
|
|
2768
|
-
event: badgeDesignObjectSchema.shape.event.optional(),
|
|
2769
|
-
description: badgeDesignObjectSchema.shape.description.optional(),
|
|
2770
|
-
artPrompt: badgeDesignObjectSchema.shape.artPrompt.optional(),
|
|
2771
|
-
material: badgeDesignObjectSchema.shape.material.partial().optional(),
|
|
2772
|
-
sticker: stickerMaterialSchema.partial().optional(),
|
|
2773
|
-
front: faceEdits.optional(),
|
|
2774
|
-
back: faceEdits.optional()
|
|
2775
|
-
});
|
|
2776
|
-
function applyDesignEdits(base, input, locks) {
|
|
2777
|
-
const edits = designEditsSchema.parse(input);
|
|
2778
|
-
const next = structuredClone(base);
|
|
2779
|
-
if (edits.name !== void 0) next.name = edits.name;
|
|
2780
|
-
if (edits.event !== void 0) next.event = edits.event;
|
|
2781
|
-
if (edits.description !== void 0) next.description = edits.description;
|
|
2782
|
-
if (edits.artPrompt !== void 0) next.artPrompt = edits.artPrompt;
|
|
2783
|
-
if (edits.sticker)
|
|
2784
|
-
next.sticker = { ...next.sticker ?? defaultStickerMaterial, ...edits.sticker };
|
|
2785
|
-
if (edits.material) next.material = { ...next.material, ...edits.material };
|
|
2786
|
-
for (const side2 of ["front", "back"]) {
|
|
2787
|
-
const change = edits[side2];
|
|
2788
|
-
if (!change) continue;
|
|
2789
|
-
const face2 = next[side2];
|
|
2790
|
-
if (change.background) face2.background = change.background;
|
|
2791
|
-
for (const id of change.remove ?? []) {
|
|
2792
|
-
if (!face2.layers.some((layer) => layer.id === id))
|
|
2793
|
-
throw new Error(`No existe ${side2}.${id}.`);
|
|
2794
|
-
face2.layers = face2.layers.filter((layer) => layer.id !== id);
|
|
2795
|
-
}
|
|
2796
|
-
const replacements = /* @__PURE__ */ new Set();
|
|
2797
|
-
for (const layer of change.upsert ?? []) {
|
|
2798
|
-
if (replacements.has(layer.id)) throw new Error(`Cambio repetido ${side2}.${layer.id}.`);
|
|
2799
|
-
replacements.add(layer.id);
|
|
2800
|
-
const index = face2.layers.findIndex((item) => item.id === layer.id);
|
|
2801
|
-
if (index >= 0) face2.layers[index] = layer;
|
|
2802
|
-
else {
|
|
2803
|
-
const qr2 = face2.layers.findIndex((item) => item.kind === "qr");
|
|
2804
|
-
face2.layers.splice(qr2 < 0 ? face2.layers.length : qr2, 0, layer);
|
|
2820
|
+
var curatedCardStyles = originalCards();
|
|
2821
|
+
var cardStyles = [...materialCardStyles, ...curatedCardStyles];
|
|
2822
|
+
function findCardStyle(id) {
|
|
2823
|
+
return cardStyles.find((design2) => design2.source === id);
|
|
2824
|
+
}
|
|
2825
|
+
var faceEdits = z4.object({
|
|
2826
|
+
background: badgeDesignObjectSchema.shape.front.shape.background.optional(),
|
|
2827
|
+
upsert: z4.array(badgeLayerSchema).max(96).optional(),
|
|
2828
|
+
remove: z4.array(z4.string()).max(96).optional(),
|
|
2829
|
+
order: z4.array(z4.string()).max(96).optional()
|
|
2830
|
+
});
|
|
2831
|
+
var designEditsSchema = z4.object({
|
|
2832
|
+
name: badgeDesignObjectSchema.shape.name.optional(),
|
|
2833
|
+
event: badgeDesignObjectSchema.shape.event.optional(),
|
|
2834
|
+
description: badgeDesignObjectSchema.shape.description.optional(),
|
|
2835
|
+
artPrompt: badgeDesignObjectSchema.shape.artPrompt.optional(),
|
|
2836
|
+
material: badgeDesignObjectSchema.shape.material.partial().optional(),
|
|
2837
|
+
sticker: stickerMaterialSchema.partial().optional(),
|
|
2838
|
+
front: faceEdits.optional(),
|
|
2839
|
+
back: faceEdits.optional()
|
|
2840
|
+
});
|
|
2841
|
+
function applyDesignEdits(base, input, locks) {
|
|
2842
|
+
const edits = designEditsSchema.parse(input);
|
|
2843
|
+
const next = structuredClone(base);
|
|
2844
|
+
if (edits.name !== void 0) next.name = edits.name;
|
|
2845
|
+
if (edits.event !== void 0) next.event = edits.event;
|
|
2846
|
+
if (edits.description !== void 0) next.description = edits.description;
|
|
2847
|
+
if (edits.artPrompt !== void 0) next.artPrompt = edits.artPrompt;
|
|
2848
|
+
if (edits.sticker)
|
|
2849
|
+
next.sticker = { ...next.sticker ?? defaultStickerMaterial, ...edits.sticker };
|
|
2850
|
+
if (edits.material) next.material = { ...next.material, ...edits.material };
|
|
2851
|
+
for (const side2 of ["front", "back"]) {
|
|
2852
|
+
const change = edits[side2];
|
|
2853
|
+
if (!change) continue;
|
|
2854
|
+
const face2 = next[side2];
|
|
2855
|
+
if (change.background) face2.background = change.background;
|
|
2856
|
+
for (const id of change.remove ?? []) {
|
|
2857
|
+
if (!face2.layers.some((layer) => layer.id === id))
|
|
2858
|
+
throw new Error(`No existe ${side2}.${id}.`);
|
|
2859
|
+
face2.layers = face2.layers.filter((layer) => layer.id !== id);
|
|
2860
|
+
}
|
|
2861
|
+
const replacements = /* @__PURE__ */ new Set();
|
|
2862
|
+
for (const layer of change.upsert ?? []) {
|
|
2863
|
+
if (replacements.has(layer.id)) throw new Error(`Cambio repetido ${side2}.${layer.id}.`);
|
|
2864
|
+
replacements.add(layer.id);
|
|
2865
|
+
const index = face2.layers.findIndex((item) => item.id === layer.id);
|
|
2866
|
+
if (index >= 0) face2.layers[index] = layer;
|
|
2867
|
+
else {
|
|
2868
|
+
const qr2 = face2.layers.findIndex((item) => item.kind === "qr");
|
|
2869
|
+
face2.layers.splice(qr2 < 0 ? face2.layers.length : qr2, 0, layer);
|
|
2870
|
+
}
|
|
2871
|
+
}
|
|
2872
|
+
if (change.order) {
|
|
2873
|
+
if (change.order.length !== face2.layers.length || new Set(change.order).size !== face2.layers.length)
|
|
2874
|
+
throw new Error(`El orden debe incluir todas las capas de ${side2} exactamente una vez.`);
|
|
2875
|
+
face2.layers = change.order.map((id) => {
|
|
2876
|
+
const layer = face2.layers.find((item) => item.id === id);
|
|
2877
|
+
if (!layer) throw new Error(`No existe ${side2}.${id}.`);
|
|
2878
|
+
return layer;
|
|
2879
|
+
});
|
|
2880
|
+
}
|
|
2881
|
+
}
|
|
2882
|
+
return locks ? preserveDesignLocks(base, next, locks) : badgeDesignSchema.parse(next);
|
|
2883
|
+
}
|
|
2884
|
+
var community_sticker_sources_default = {
|
|
2885
|
+
crafter: {
|
|
2886
|
+
artPrompt: "Original editable graphic. Crafter.run typographic direction, official white Crafter icon, Peruvian red-white-red accents, Andean stepped outline, abstract mountain terraces and geometric textile. Three-color vinyl.",
|
|
2887
|
+
back: {
|
|
2888
|
+
background: "#00000000",
|
|
2889
|
+
layers: []
|
|
2890
|
+
},
|
|
2891
|
+
description: "Sticker troquelado con tipograf\xEDa contundente, s\xEDmbolo Crafter, monta\xF1as y franja andina en negro, crema y rojo.",
|
|
2892
|
+
event: "Crafter Station \xB7 Per\xFA",
|
|
2893
|
+
front: {
|
|
2894
|
+
background: "#00000000",
|
|
2895
|
+
layers: [
|
|
2896
|
+
{
|
|
2897
|
+
h: 1024,
|
|
2898
|
+
id: "diecut",
|
|
2899
|
+
kind: "svg",
|
|
2900
|
+
name: "Silueta escalonada y ribete crema",
|
|
2901
|
+
nodes: [
|
|
2902
|
+
{
|
|
2903
|
+
attrs: {
|
|
2904
|
+
d: "M250 122H390V78H634V122H774V174H868Q890 174 890 196V786Q890 808 868 808H802V864H666V918H358V864H222V808H156Q134 808 134 786V196Q134 174 156 174H250Z",
|
|
2905
|
+
fill: "#171715",
|
|
2906
|
+
stroke: "#f5f1e5",
|
|
2907
|
+
"stroke-linecap": "round",
|
|
2908
|
+
"stroke-linejoin": "round",
|
|
2909
|
+
"stroke-width": "26"
|
|
2910
|
+
},
|
|
2911
|
+
tag: "path"
|
|
2912
|
+
}
|
|
2913
|
+
],
|
|
2914
|
+
sourceBox: {
|
|
2915
|
+
h: 1024,
|
|
2916
|
+
w: 1024,
|
|
2917
|
+
x: 0,
|
|
2918
|
+
y: 0
|
|
2919
|
+
},
|
|
2920
|
+
w: 1024,
|
|
2921
|
+
x: 0,
|
|
2922
|
+
y: 0
|
|
2923
|
+
},
|
|
2924
|
+
{
|
|
2925
|
+
h: 1024,
|
|
2926
|
+
id: "inner-keyline",
|
|
2927
|
+
kind: "svg",
|
|
2928
|
+
name: "Filete interior rojo",
|
|
2929
|
+
nodes: [
|
|
2930
|
+
{
|
|
2931
|
+
attrs: {
|
|
2932
|
+
d: "M250 122H390V78H634V122H774V174H868Q890 174 890 196V786Q890 808 868 808H802V864H666V918H358V864H222V808H156Q134 808 134 786V196Q134 174 156 174H250Z",
|
|
2933
|
+
fill: "none",
|
|
2934
|
+
stroke: "#d92d3a",
|
|
2935
|
+
"stroke-linecap": "round",
|
|
2936
|
+
"stroke-linejoin": "round",
|
|
2937
|
+
"stroke-width": "3"
|
|
2938
|
+
},
|
|
2939
|
+
tag: "path"
|
|
2940
|
+
}
|
|
2941
|
+
],
|
|
2942
|
+
sourceBox: {
|
|
2943
|
+
h: 1024,
|
|
2944
|
+
w: 1024,
|
|
2945
|
+
x: 0,
|
|
2946
|
+
y: 0
|
|
2947
|
+
},
|
|
2948
|
+
w: 1024,
|
|
2949
|
+
x: 0,
|
|
2950
|
+
y: 0
|
|
2951
|
+
},
|
|
2952
|
+
{
|
|
2953
|
+
h: 1024,
|
|
2954
|
+
id: "sun",
|
|
2955
|
+
kind: "svg",
|
|
2956
|
+
name: "Sol rojo",
|
|
2957
|
+
nodes: [
|
|
2958
|
+
{
|
|
2959
|
+
attrs: {
|
|
2960
|
+
cx: "512",
|
|
2961
|
+
cy: "225",
|
|
2962
|
+
fill: "#d92d3a",
|
|
2963
|
+
r: "99"
|
|
2964
|
+
},
|
|
2965
|
+
tag: "circle"
|
|
2966
|
+
}
|
|
2967
|
+
],
|
|
2968
|
+
sourceBox: {
|
|
2969
|
+
h: 1024,
|
|
2970
|
+
w: 1024,
|
|
2971
|
+
x: 0,
|
|
2972
|
+
y: 0
|
|
2973
|
+
},
|
|
2974
|
+
w: 1024,
|
|
2975
|
+
x: 0,
|
|
2976
|
+
y: 0
|
|
2977
|
+
},
|
|
2978
|
+
{
|
|
2979
|
+
h: 114,
|
|
2980
|
+
id: "crafter-mark",
|
|
2981
|
+
kind: "svg",
|
|
2982
|
+
name: "S\xEDmbolo original de Crafter Station",
|
|
2983
|
+
nodes: [
|
|
2984
|
+
{
|
|
2985
|
+
attrs: {
|
|
2986
|
+
d: "M116.419 16.3268C109.59 11.5679 97.9222 5.96914 90.2388 3.72965C72.8798 -1.58913 59.1794 1.40491 50.114 4.56947C32.4704 10.7281 21.3721 18.8462 11.412 33.6828C-4.23949 56.6375 -1.96292 93.869 17.1035 114.864C21.3721 119.903 23.6487 119.063 40.1539 107.026C40.723 106.466 38.4465 102.827 35.0316 98.6278C27.3481 89.11 22.7949 71.754 25.0715 61.9563C32.4704 31.1634 70.3187 14.6472 94.7919 31.4433C100.199 35.0825 117.273 50.199 132.64 65.0356C155.691 86.8706 162.52 91.9094 168.212 91.3496C173.903 90.7897 175.895 88.8301 176.464 82.6715C177.318 75.9531 174.757 72.034 161.667 60.2767C152.845 52.1585 145.731 44.8802 145.731 43.4805C145.731 42.3608 151.707 37.6019 159.105 33.1229C206.914 3.1698 258.421 62.7961 218.581 101.987C213.459 107.026 204.353 112.345 198.377 114.024C191.547 115.704 159.959 117.104 120.688 117.104C47.2683 117.104 43.2842 117.943 23.9332 135.02C-0.824636 157.134 -6.51609 194.926 10.8429 222.359C33.3241 258.191 81.7016 267.149 115.85 241.675L128.372 232.157L142.885 241.675C166.504 257.351 185.571 260.431 208.621 252.872C254.722 237.476 271.796 179.809 241.916 141.178C238.501 136.979 236.794 136.699 232.241 138.939C218.297 146.777 218.581 146.217 226.834 163.013C233.094 175.89 234.233 180.929 232.81 190.727C228.826 215.361 210.044 231.877 186.14 231.877C167.643 231.877 161.667 228.238 127.518 195.486C109.59 178.689 93.0845 164.693 90.8079 164.693C86.5393 164.693 77.433 173.371 77.433 177.57C77.433 178.689 85.1165 187.647 94.7919 197.165L112.151 214.241L101.906 222.08C65.7655 249.233 14.2578 216.761 26.2098 174.211C29.9093 161.333 42.9996 147.057 55.5209 142.578C60.3586 140.618 90.2388 139.498 130.648 139.498C204.922 139.498 213.744 138.099 230.818 123.542C281.757 80.9919 252.161 0.930299 185.571 1.21023C166.22 1.21023 155.691 5.12933 137.762 18.2863L128.656 25.0048L116.419 16.3268Z",
|
|
2987
|
+
fill: "#ffffff"
|
|
2988
|
+
},
|
|
2989
|
+
tag: "path"
|
|
2990
|
+
}
|
|
2991
|
+
],
|
|
2992
|
+
sourceBox: {
|
|
2993
|
+
h: 257,
|
|
2994
|
+
w: 257,
|
|
2995
|
+
x: 0,
|
|
2996
|
+
y: 0
|
|
2997
|
+
},
|
|
2998
|
+
w: 114,
|
|
2999
|
+
x: 455,
|
|
3000
|
+
y: 166
|
|
3001
|
+
},
|
|
3002
|
+
{
|
|
3003
|
+
h: 1024,
|
|
3004
|
+
id: "mountain-mass",
|
|
3005
|
+
kind: "svg",
|
|
3006
|
+
name: "Monta\xF1as de los Andes",
|
|
3007
|
+
nodes: [
|
|
3008
|
+
{
|
|
3009
|
+
attrs: {
|
|
3010
|
+
d: "M185 344L253 261L284 296L344 222L408 318L446 298L502 349L550 309L597 333L671 226L738 305L775 267L840 344Z",
|
|
3011
|
+
fill: "#f5f1e5"
|
|
3012
|
+
},
|
|
3013
|
+
tag: "path"
|
|
3014
|
+
}
|
|
3015
|
+
],
|
|
3016
|
+
sourceBox: {
|
|
3017
|
+
h: 1024,
|
|
3018
|
+
w: 1024,
|
|
3019
|
+
x: 0,
|
|
3020
|
+
y: 0
|
|
3021
|
+
},
|
|
3022
|
+
w: 1024,
|
|
3023
|
+
x: 0,
|
|
3024
|
+
y: 0
|
|
3025
|
+
},
|
|
3026
|
+
{
|
|
3027
|
+
h: 1024,
|
|
3028
|
+
id: "mountain-shadows",
|
|
3029
|
+
kind: "svg",
|
|
3030
|
+
name: "Caras rojas de las monta\xF1as",
|
|
3031
|
+
nodes: [
|
|
3032
|
+
{
|
|
3033
|
+
attrs: {
|
|
3034
|
+
d: "M284 296L344 222L331 301L380 344H311L293 318Z M597 333L671 226L651 314L685 344H617Z M738 305L775 267L765 326L791 344H760Z",
|
|
3035
|
+
fill: "#d92d3a"
|
|
3036
|
+
},
|
|
3037
|
+
tag: "path"
|
|
3038
|
+
}
|
|
3039
|
+
],
|
|
3040
|
+
sourceBox: {
|
|
3041
|
+
h: 1024,
|
|
3042
|
+
w: 1024,
|
|
3043
|
+
x: 0,
|
|
3044
|
+
y: 0
|
|
3045
|
+
},
|
|
3046
|
+
w: 1024,
|
|
3047
|
+
x: 0,
|
|
3048
|
+
y: 0
|
|
3049
|
+
},
|
|
3050
|
+
{
|
|
3051
|
+
h: 1024,
|
|
3052
|
+
id: "snowcaps",
|
|
3053
|
+
kind: "svg",
|
|
3054
|
+
name: "Cumbres claras",
|
|
3055
|
+
nodes: [
|
|
3056
|
+
{
|
|
3057
|
+
attrs: {
|
|
3058
|
+
d: "M326 245L344 222L367 256L347 248L339 263Z M653 252L671 226L691 250L671 247L661 263Z",
|
|
3059
|
+
fill: "#f5f1e5"
|
|
3060
|
+
},
|
|
3061
|
+
tag: "path"
|
|
3062
|
+
}
|
|
3063
|
+
],
|
|
3064
|
+
sourceBox: {
|
|
3065
|
+
h: 1024,
|
|
3066
|
+
w: 1024,
|
|
3067
|
+
x: 0,
|
|
3068
|
+
y: 0
|
|
3069
|
+
},
|
|
3070
|
+
w: 1024,
|
|
3071
|
+
x: 0,
|
|
3072
|
+
y: 0
|
|
3073
|
+
},
|
|
3074
|
+
{
|
|
3075
|
+
h: 1024,
|
|
3076
|
+
id: "terraces",
|
|
3077
|
+
kind: "svg",
|
|
3078
|
+
name: "Andenes geom\xE9tricos",
|
|
3079
|
+
nodes: [
|
|
3080
|
+
{
|
|
3081
|
+
attrs: {
|
|
3082
|
+
d: "M215 355H394V342H447 M630 355H809 M254 367H442V354H482 M563 367H770",
|
|
3083
|
+
fill: "none",
|
|
3084
|
+
stroke: "#f5f1e5",
|
|
3085
|
+
"stroke-linecap": "round",
|
|
3086
|
+
"stroke-linejoin": "round",
|
|
3087
|
+
"stroke-width": "4"
|
|
3088
|
+
},
|
|
3089
|
+
tag: "path"
|
|
3090
|
+
}
|
|
3091
|
+
],
|
|
3092
|
+
sourceBox: {
|
|
3093
|
+
h: 1024,
|
|
3094
|
+
w: 1024,
|
|
3095
|
+
x: 0,
|
|
3096
|
+
y: 0
|
|
3097
|
+
},
|
|
3098
|
+
w: 1024,
|
|
3099
|
+
x: 0,
|
|
3100
|
+
y: 0
|
|
3101
|
+
},
|
|
3102
|
+
{
|
|
3103
|
+
align: "center",
|
|
3104
|
+
baseline: "top",
|
|
3105
|
+
binding: "none",
|
|
3106
|
+
color: "#f5f1e5",
|
|
3107
|
+
fit: "shrink",
|
|
3108
|
+
font: "sans",
|
|
3109
|
+
h: 136,
|
|
3110
|
+
id: "crafter",
|
|
3111
|
+
kind: "text",
|
|
3112
|
+
lineHeight: 1,
|
|
3113
|
+
name: "CRAFTER",
|
|
3114
|
+
size: 140,
|
|
3115
|
+
text: "CRAFTER",
|
|
3116
|
+
tracking: -5,
|
|
3117
|
+
w: 694,
|
|
3118
|
+
weight: "900",
|
|
3119
|
+
x: 165,
|
|
3120
|
+
y: 384
|
|
3121
|
+
},
|
|
3122
|
+
{
|
|
3123
|
+
align: "center",
|
|
3124
|
+
baseline: "top",
|
|
3125
|
+
binding: "none",
|
|
3126
|
+
color: "#f5f1e5",
|
|
3127
|
+
fit: "shrink",
|
|
3128
|
+
font: "sans",
|
|
3129
|
+
h: 136,
|
|
3130
|
+
id: "station",
|
|
3131
|
+
kind: "text",
|
|
3132
|
+
lineHeight: 1,
|
|
3133
|
+
name: "STATION",
|
|
3134
|
+
size: 140,
|
|
3135
|
+
text: "STATION",
|
|
3136
|
+
tracking: -5,
|
|
3137
|
+
w: 692,
|
|
3138
|
+
weight: "900",
|
|
3139
|
+
x: 166,
|
|
3140
|
+
y: 508
|
|
3141
|
+
},
|
|
3142
|
+
{
|
|
3143
|
+
h: 1024,
|
|
3144
|
+
id: "andean-weave",
|
|
3145
|
+
kind: "svg",
|
|
3146
|
+
name: "Franja textil de rombos escalonados",
|
|
3147
|
+
nodes: [
|
|
3148
|
+
{
|
|
3149
|
+
attrs: {
|
|
3150
|
+
d: "M191 666H204V653H216V640H228V653H241V666H228V679H216V692H204V679H191Z",
|
|
3151
|
+
fill: "#d92d3a"
|
|
3152
|
+
},
|
|
3153
|
+
tag: "path"
|
|
3154
|
+
},
|
|
3155
|
+
{
|
|
3156
|
+
attrs: {
|
|
3157
|
+
d: "M216 657L225 666L216 675L207 666Z",
|
|
3158
|
+
fill: "#f5f1e5"
|
|
3159
|
+
},
|
|
3160
|
+
tag: "path"
|
|
3161
|
+
},
|
|
3162
|
+
{
|
|
3163
|
+
attrs: {
|
|
3164
|
+
d: "M265 666H278V653H290V640H302V653H315V666H302V679H290V692H278V679H265Z",
|
|
3165
|
+
fill: "#d92d3a"
|
|
3166
|
+
},
|
|
3167
|
+
tag: "path"
|
|
3168
|
+
},
|
|
3169
|
+
{
|
|
3170
|
+
attrs: {
|
|
3171
|
+
d: "M290 657L299 666L290 675L281 666Z",
|
|
3172
|
+
fill: "#f5f1e5"
|
|
3173
|
+
},
|
|
3174
|
+
tag: "path"
|
|
3175
|
+
},
|
|
3176
|
+
{
|
|
3177
|
+
attrs: {
|
|
3178
|
+
d: "M339 666H352V653H364V640H376V653H389V666H376V679H364V692H352V679H339Z",
|
|
3179
|
+
fill: "#d92d3a"
|
|
3180
|
+
},
|
|
3181
|
+
tag: "path"
|
|
3182
|
+
},
|
|
3183
|
+
{
|
|
3184
|
+
attrs: {
|
|
3185
|
+
d: "M364 657L373 666L364 675L355 666Z",
|
|
3186
|
+
fill: "#f5f1e5"
|
|
3187
|
+
},
|
|
3188
|
+
tag: "path"
|
|
3189
|
+
},
|
|
3190
|
+
{
|
|
3191
|
+
attrs: {
|
|
3192
|
+
d: "M413 666H426V653H438V640H450V653H463V666H450V679H438V692H426V679H413Z",
|
|
3193
|
+
fill: "#d92d3a"
|
|
3194
|
+
},
|
|
3195
|
+
tag: "path"
|
|
3196
|
+
},
|
|
3197
|
+
{
|
|
3198
|
+
attrs: {
|
|
3199
|
+
d: "M438 657L447 666L438 675L429 666Z",
|
|
3200
|
+
fill: "#f5f1e5"
|
|
3201
|
+
},
|
|
3202
|
+
tag: "path"
|
|
3203
|
+
},
|
|
3204
|
+
{
|
|
3205
|
+
attrs: {
|
|
3206
|
+
d: "M487 666H500V653H512V640H524V653H537V666H524V679H512V692H500V679H487Z",
|
|
3207
|
+
fill: "#d92d3a"
|
|
3208
|
+
},
|
|
3209
|
+
tag: "path"
|
|
3210
|
+
},
|
|
3211
|
+
{
|
|
3212
|
+
attrs: {
|
|
3213
|
+
d: "M512 657L521 666L512 675L503 666Z",
|
|
3214
|
+
fill: "#f5f1e5"
|
|
3215
|
+
},
|
|
3216
|
+
tag: "path"
|
|
3217
|
+
},
|
|
3218
|
+
{
|
|
3219
|
+
attrs: {
|
|
3220
|
+
d: "M561 666H574V653H586V640H598V653H611V666H598V679H586V692H574V679H561Z",
|
|
3221
|
+
fill: "#d92d3a"
|
|
3222
|
+
},
|
|
3223
|
+
tag: "path"
|
|
3224
|
+
},
|
|
3225
|
+
{
|
|
3226
|
+
attrs: {
|
|
3227
|
+
d: "M586 657L595 666L586 675L577 666Z",
|
|
3228
|
+
fill: "#f5f1e5"
|
|
3229
|
+
},
|
|
3230
|
+
tag: "path"
|
|
3231
|
+
},
|
|
3232
|
+
{
|
|
3233
|
+
attrs: {
|
|
3234
|
+
d: "M635 666H648V653H660V640H672V653H685V666H672V679H660V692H648V679H635Z",
|
|
3235
|
+
fill: "#d92d3a"
|
|
3236
|
+
},
|
|
3237
|
+
tag: "path"
|
|
3238
|
+
},
|
|
3239
|
+
{
|
|
3240
|
+
attrs: {
|
|
3241
|
+
d: "M660 657L669 666L660 675L651 666Z",
|
|
3242
|
+
fill: "#f5f1e5"
|
|
3243
|
+
},
|
|
3244
|
+
tag: "path"
|
|
3245
|
+
},
|
|
3246
|
+
{
|
|
3247
|
+
attrs: {
|
|
3248
|
+
d: "M709 666H722V653H734V640H746V653H759V666H746V679H734V692H722V679H709Z",
|
|
3249
|
+
fill: "#d92d3a"
|
|
3250
|
+
},
|
|
3251
|
+
tag: "path"
|
|
3252
|
+
},
|
|
3253
|
+
{
|
|
3254
|
+
attrs: {
|
|
3255
|
+
d: "M734 657L743 666L734 675L725 666Z",
|
|
3256
|
+
fill: "#f5f1e5"
|
|
3257
|
+
},
|
|
3258
|
+
tag: "path"
|
|
3259
|
+
},
|
|
3260
|
+
{
|
|
3261
|
+
attrs: {
|
|
3262
|
+
d: "M783 666H796V653H808V640H820V653H833V666H820V679H808V692H796V679H783Z",
|
|
3263
|
+
fill: "#d92d3a"
|
|
3264
|
+
},
|
|
3265
|
+
tag: "path"
|
|
3266
|
+
},
|
|
3267
|
+
{
|
|
3268
|
+
attrs: {
|
|
3269
|
+
d: "M808 657L817 666L808 675L799 666Z",
|
|
3270
|
+
fill: "#f5f1e5"
|
|
3271
|
+
},
|
|
3272
|
+
tag: "path"
|
|
3273
|
+
}
|
|
3274
|
+
],
|
|
3275
|
+
sourceBox: {
|
|
3276
|
+
h: 1024,
|
|
3277
|
+
w: 1024,
|
|
3278
|
+
x: 0,
|
|
3279
|
+
y: 0
|
|
3280
|
+
},
|
|
3281
|
+
w: 1024,
|
|
3282
|
+
x: 0,
|
|
3283
|
+
y: 0
|
|
3284
|
+
},
|
|
3285
|
+
{
|
|
3286
|
+
h: 1024,
|
|
3287
|
+
id: "textile-lines",
|
|
3288
|
+
kind: "svg",
|
|
3289
|
+
name: "L\xEDneas de la franja",
|
|
3290
|
+
nodes: [
|
|
3291
|
+
{
|
|
3292
|
+
attrs: {
|
|
3293
|
+
d: "M192 630H832 M192 700H832",
|
|
3294
|
+
fill: "none",
|
|
3295
|
+
stroke: "#f5f1e5",
|
|
3296
|
+
"stroke-linecap": "round",
|
|
3297
|
+
"stroke-linejoin": "round",
|
|
3298
|
+
"stroke-width": "3"
|
|
3299
|
+
},
|
|
3300
|
+
tag: "path"
|
|
3301
|
+
}
|
|
3302
|
+
],
|
|
3303
|
+
sourceBox: {
|
|
3304
|
+
h: 1024,
|
|
3305
|
+
w: 1024,
|
|
3306
|
+
x: 0,
|
|
3307
|
+
y: 0
|
|
3308
|
+
},
|
|
3309
|
+
w: 1024,
|
|
3310
|
+
x: 0,
|
|
3311
|
+
y: 0
|
|
3312
|
+
},
|
|
3313
|
+
{
|
|
3314
|
+
align: "center",
|
|
3315
|
+
baseline: "top",
|
|
3316
|
+
binding: "none",
|
|
3317
|
+
color: "#f5f1e5",
|
|
3318
|
+
fit: "shrink",
|
|
3319
|
+
font: "mono",
|
|
3320
|
+
h: 35,
|
|
3321
|
+
id: "made-in",
|
|
3322
|
+
kind: "text",
|
|
3323
|
+
lineHeight: 1,
|
|
3324
|
+
name: "Hecho en",
|
|
3325
|
+
size: 26,
|
|
3326
|
+
text: "HECHO EN",
|
|
3327
|
+
tracking: 3,
|
|
3328
|
+
w: 340,
|
|
3329
|
+
weight: "500",
|
|
3330
|
+
x: 342,
|
|
3331
|
+
y: 713
|
|
3332
|
+
},
|
|
3333
|
+
{
|
|
3334
|
+
align: "center",
|
|
3335
|
+
baseline: "alphabetic",
|
|
3336
|
+
baselineOffset: 92,
|
|
3337
|
+
binding: "none",
|
|
3338
|
+
color: "#f5f1e5",
|
|
3339
|
+
fit: "shrink",
|
|
3340
|
+
font: "sans",
|
|
3341
|
+
h: 115,
|
|
3342
|
+
id: "peru",
|
|
3343
|
+
kind: "text",
|
|
3344
|
+
lineHeight: 1,
|
|
3345
|
+
name: "PER\xDA",
|
|
3346
|
+
size: 101,
|
|
3347
|
+
text: "PER\xDA",
|
|
3348
|
+
tracking: -2,
|
|
3349
|
+
w: 352,
|
|
3350
|
+
weight: "900",
|
|
3351
|
+
x: 336,
|
|
3352
|
+
y: 741
|
|
3353
|
+
},
|
|
3354
|
+
{
|
|
3355
|
+
h: 1024,
|
|
3356
|
+
id: "peru-flag",
|
|
3357
|
+
kind: "svg",
|
|
3358
|
+
name: "Rojo \xB7 blanco \xB7 rojo",
|
|
3359
|
+
nodes: [
|
|
3360
|
+
{
|
|
3361
|
+
attrs: {
|
|
3362
|
+
fill: "#d92d3a",
|
|
3363
|
+
height: "53",
|
|
3364
|
+
width: "18",
|
|
3365
|
+
x: "244",
|
|
3366
|
+
y: "748"
|
|
3367
|
+
},
|
|
3368
|
+
tag: "rect"
|
|
3369
|
+
},
|
|
3370
|
+
{
|
|
3371
|
+
attrs: {
|
|
3372
|
+
fill: "#f5f1e5",
|
|
3373
|
+
height: "53",
|
|
3374
|
+
width: "18",
|
|
3375
|
+
x: "262",
|
|
3376
|
+
y: "748"
|
|
3377
|
+
},
|
|
3378
|
+
tag: "rect"
|
|
3379
|
+
},
|
|
3380
|
+
{
|
|
3381
|
+
attrs: {
|
|
3382
|
+
fill: "#d92d3a",
|
|
3383
|
+
height: "53",
|
|
3384
|
+
width: "18",
|
|
3385
|
+
x: "280",
|
|
3386
|
+
y: "748"
|
|
3387
|
+
},
|
|
3388
|
+
tag: "rect"
|
|
3389
|
+
},
|
|
3390
|
+
{
|
|
3391
|
+
attrs: {
|
|
3392
|
+
fill: "#d92d3a",
|
|
3393
|
+
height: "53",
|
|
3394
|
+
width: "18",
|
|
3395
|
+
x: "726",
|
|
3396
|
+
y: "748"
|
|
3397
|
+
},
|
|
3398
|
+
tag: "rect"
|
|
3399
|
+
},
|
|
3400
|
+
{
|
|
3401
|
+
attrs: {
|
|
3402
|
+
fill: "#f5f1e5",
|
|
3403
|
+
height: "53",
|
|
3404
|
+
width: "18",
|
|
3405
|
+
x: "744",
|
|
3406
|
+
y: "748"
|
|
3407
|
+
},
|
|
3408
|
+
tag: "rect"
|
|
3409
|
+
},
|
|
3410
|
+
{
|
|
3411
|
+
attrs: {
|
|
3412
|
+
fill: "#d92d3a",
|
|
3413
|
+
height: "53",
|
|
3414
|
+
width: "18",
|
|
3415
|
+
x: "762",
|
|
3416
|
+
y: "748"
|
|
3417
|
+
},
|
|
3418
|
+
tag: "rect"
|
|
3419
|
+
}
|
|
3420
|
+
],
|
|
3421
|
+
sourceBox: {
|
|
3422
|
+
h: 1024,
|
|
3423
|
+
w: 1024,
|
|
3424
|
+
x: 0,
|
|
3425
|
+
y: 0
|
|
3426
|
+
},
|
|
3427
|
+
w: 1024,
|
|
3428
|
+
x: 0,
|
|
3429
|
+
y: 0
|
|
3430
|
+
},
|
|
3431
|
+
{
|
|
3432
|
+
align: "center",
|
|
3433
|
+
baseline: "top",
|
|
3434
|
+
binding: "none",
|
|
3435
|
+
color: "#f5f1e5",
|
|
3436
|
+
fit: "shrink",
|
|
3437
|
+
font: "mono",
|
|
3438
|
+
h: 34,
|
|
3439
|
+
id: "website",
|
|
3440
|
+
kind: "text",
|
|
3441
|
+
lineHeight: 1,
|
|
3442
|
+
name: "crafter.run",
|
|
3443
|
+
size: 27,
|
|
3444
|
+
text: "crafter.run",
|
|
3445
|
+
tracking: 1,
|
|
3446
|
+
w: 274,
|
|
3447
|
+
weight: "500",
|
|
3448
|
+
x: 375,
|
|
3449
|
+
y: 870
|
|
3450
|
+
}
|
|
3451
|
+
]
|
|
3452
|
+
},
|
|
3453
|
+
material: {
|
|
3454
|
+
iridescence: 0,
|
|
3455
|
+
roughness: 0.7,
|
|
3456
|
+
speed: 0.16,
|
|
3457
|
+
surface: "satin"
|
|
3458
|
+
},
|
|
3459
|
+
name: "Crafter Station \xB7 Hecho en Per\xFA",
|
|
3460
|
+
product: "sticker",
|
|
3461
|
+
sticker: {
|
|
3462
|
+
border: 12,
|
|
3463
|
+
finish: "vinyl",
|
|
3464
|
+
gloss: 0.22,
|
|
3465
|
+
seed: 290926,
|
|
3466
|
+
sparkle: 0
|
|
3467
|
+
},
|
|
3468
|
+
svgSource: {
|
|
3469
|
+
attribution: "Original vector composition. Crafter Station icon from https://crafter.run/brand/crafter-station-icon-dark.svg; https://crafter.run/en/brand.",
|
|
3470
|
+
definitions: [],
|
|
3471
|
+
originalSha256: "dcacebe110b4727433572cd8360e65ef13d3f1a159cf7a759f6a5c4e6ca2b7d4"
|
|
3472
|
+
},
|
|
3473
|
+
version: 1
|
|
3474
|
+
},
|
|
3475
|
+
friday: {
|
|
3476
|
+
artPrompt: "Original developer die-cut sticker. Warm cream, black ink, yellow and orange. Chunky condensed lettering, a cheerful retro CRT engulfed in cartoon flames, a coffee cup and a 17:59 tag. Spanish copy with the intentional spoonerism \u201C\xBFQu\xE9 podr\xEDa malir sal?\u201D.",
|
|
3477
|
+
back: {
|
|
3478
|
+
background: "#00000000",
|
|
3479
|
+
layers: []
|
|
3480
|
+
},
|
|
3481
|
+
description: "Un deploy a las 17:59, una terminal en llamas y demasiada confianza. \xBFQu\xE9 podr\xEDa malir sal?",
|
|
3482
|
+
event: "Friday Ship Club",
|
|
3483
|
+
front: {
|
|
3484
|
+
background: "#00000000",
|
|
3485
|
+
layers: [
|
|
3486
|
+
{
|
|
3487
|
+
h: 1024,
|
|
3488
|
+
id: "flame-outer",
|
|
3489
|
+
kind: "svg",
|
|
3490
|
+
name: "Fuego \xB7 naranja",
|
|
3491
|
+
nodes: [
|
|
3492
|
+
{
|
|
3493
|
+
attrs: {
|
|
3494
|
+
d: "M266 562 C211 507 215 447 250 407 C277 375 294 351 278 310 C332 333 343 360 342 389 C370 357 391 303 361 247 C421 260 463 294 463 335 C497 295 481 239 532 206 C516 274 578 286 569 351 C615 332 639 291 627 260 C688 287 716 341 695 389 C739 369 749 338 747 316 C819 361 849 451 791 514 C768 549 750 575 745 610 L292 615Z",
|
|
3495
|
+
fill: "#ff6638",
|
|
3496
|
+
stroke: "#171916",
|
|
3497
|
+
"stroke-linecap": "round",
|
|
3498
|
+
"stroke-linejoin": "round",
|
|
3499
|
+
"stroke-width": "13"
|
|
3500
|
+
},
|
|
3501
|
+
tag: "path"
|
|
3502
|
+
}
|
|
3503
|
+
],
|
|
3504
|
+
sourceBox: {
|
|
3505
|
+
h: 1024,
|
|
3506
|
+
w: 1024,
|
|
3507
|
+
x: 0,
|
|
3508
|
+
y: 0
|
|
3509
|
+
},
|
|
3510
|
+
w: 1024,
|
|
3511
|
+
x: 0,
|
|
3512
|
+
y: 0
|
|
3513
|
+
},
|
|
3514
|
+
{
|
|
3515
|
+
h: 1024,
|
|
3516
|
+
id: "flame-inner",
|
|
3517
|
+
kind: "svg",
|
|
3518
|
+
name: "Fuego \xB7 amarillo",
|
|
3519
|
+
nodes: [
|
|
3520
|
+
{
|
|
3521
|
+
attrs: {
|
|
3522
|
+
d: "M309 545 C273 486 316 459 311 415 C345 438 353 457 348 482 C405 451 420 385 398 335 C445 355 469 397 459 429 C510 398 503 348 537 296 C528 357 579 391 565 441 C605 421 627 375 638 337 C672 395 670 446 682 459 C713 436 734 417 735 387 C777 460 755 495 723 535 L701 600 L334 605Z",
|
|
3523
|
+
fill: "#ffdb42",
|
|
3524
|
+
stroke: "#171916",
|
|
3525
|
+
"stroke-linecap": "round",
|
|
3526
|
+
"stroke-linejoin": "round",
|
|
3527
|
+
"stroke-width": "8"
|
|
3528
|
+
},
|
|
3529
|
+
tag: "path"
|
|
3530
|
+
}
|
|
3531
|
+
],
|
|
3532
|
+
sourceBox: {
|
|
3533
|
+
h: 1024,
|
|
3534
|
+
w: 1024,
|
|
3535
|
+
x: 0,
|
|
3536
|
+
y: 0
|
|
3537
|
+
},
|
|
3538
|
+
w: 1024,
|
|
3539
|
+
x: 0,
|
|
3540
|
+
y: 0
|
|
3541
|
+
},
|
|
3542
|
+
{
|
|
3543
|
+
h: 1024,
|
|
3544
|
+
id: "embers",
|
|
3545
|
+
kind: "svg",
|
|
3546
|
+
name: "Chispas",
|
|
3547
|
+
nodes: [
|
|
3548
|
+
{
|
|
3549
|
+
attrs: {
|
|
3550
|
+
d: "M198 343 Q164 305 184 276 Q210 297 198 343Z",
|
|
3551
|
+
fill: "#ff6638",
|
|
3552
|
+
stroke: "#171916",
|
|
3553
|
+
"stroke-linecap": "round",
|
|
3554
|
+
"stroke-linejoin": "round",
|
|
3555
|
+
"stroke-width": "8"
|
|
3556
|
+
},
|
|
3557
|
+
tag: "path"
|
|
3558
|
+
},
|
|
3559
|
+
{
|
|
3560
|
+
attrs: {
|
|
3561
|
+
d: "M829 275 Q807 240 830 219 Q851 244 829 275Z",
|
|
3562
|
+
fill: "#ffdb42",
|
|
3563
|
+
stroke: "#171916",
|
|
3564
|
+
"stroke-linecap": "round",
|
|
3565
|
+
"stroke-linejoin": "round",
|
|
3566
|
+
"stroke-width": "8"
|
|
3567
|
+
},
|
|
3568
|
+
tag: "path"
|
|
3569
|
+
}
|
|
3570
|
+
],
|
|
3571
|
+
sourceBox: {
|
|
3572
|
+
h: 1024,
|
|
3573
|
+
w: 1024,
|
|
3574
|
+
x: 0,
|
|
3575
|
+
y: 0
|
|
3576
|
+
},
|
|
3577
|
+
w: 1024,
|
|
3578
|
+
x: 0,
|
|
3579
|
+
y: 0
|
|
3580
|
+
},
|
|
3581
|
+
{
|
|
3582
|
+
h: 1024,
|
|
3583
|
+
id: "monitor-depth",
|
|
3584
|
+
kind: "svg",
|
|
3585
|
+
name: "Monitor \xB7 lateral",
|
|
3586
|
+
nodes: [
|
|
3587
|
+
{
|
|
3588
|
+
attrs: {
|
|
3589
|
+
transform: "translate(61 84) scale(0.88)"
|
|
3590
|
+
},
|
|
3591
|
+
children: [
|
|
3592
|
+
{
|
|
3593
|
+
attrs: {
|
|
3594
|
+
d: "M719 326 L787 354 Q809 363 809 389 L809 568 Q809 592 785 602 L719 626 L690 583 L692 363Z",
|
|
3595
|
+
fill: "#8fa99b",
|
|
3596
|
+
stroke: "#171916",
|
|
3597
|
+
"stroke-linecap": "round",
|
|
3598
|
+
"stroke-linejoin": "round",
|
|
3599
|
+
"stroke-width": "12"
|
|
3600
|
+
},
|
|
3601
|
+
tag: "path"
|
|
3602
|
+
},
|
|
3603
|
+
{
|
|
3604
|
+
attrs: {
|
|
3605
|
+
d: "M767 388 L788 396 M767 416 L788 424 M767 444 L788 452 M767 472 L788 480",
|
|
3606
|
+
fill: "none",
|
|
3607
|
+
stroke: "#171916",
|
|
3608
|
+
"stroke-linecap": "round",
|
|
3609
|
+
"stroke-linejoin": "round",
|
|
3610
|
+
"stroke-width": "7"
|
|
3611
|
+
},
|
|
3612
|
+
tag: "path"
|
|
3613
|
+
}
|
|
3614
|
+
],
|
|
3615
|
+
tag: "g"
|
|
3616
|
+
}
|
|
3617
|
+
],
|
|
3618
|
+
sourceBox: {
|
|
3619
|
+
h: 1024,
|
|
3620
|
+
w: 1024,
|
|
3621
|
+
x: 0,
|
|
3622
|
+
y: 0
|
|
3623
|
+
},
|
|
3624
|
+
w: 1024,
|
|
3625
|
+
x: 0,
|
|
3626
|
+
y: 0
|
|
3627
|
+
},
|
|
3628
|
+
{
|
|
3629
|
+
h: 1024,
|
|
3630
|
+
id: "monitor-front",
|
|
3631
|
+
kind: "svg",
|
|
3632
|
+
name: "Monitor \xB7 carcasa",
|
|
3633
|
+
nodes: [
|
|
3634
|
+
{
|
|
3635
|
+
attrs: {
|
|
3636
|
+
transform: "translate(61 84) scale(0.88)"
|
|
3637
|
+
},
|
|
3638
|
+
children: [
|
|
3639
|
+
{
|
|
3640
|
+
attrs: {
|
|
3641
|
+
d: "M286 323 L701 323 Q741 323 741 363 L741 580 Q741 615 701 620 L280 620 Q246 620 246 584 L246 365 Q246 326 286 323Z",
|
|
3642
|
+
fill: "#fff4d8",
|
|
3643
|
+
stroke: "#171916",
|
|
3644
|
+
"stroke-linecap": "round",
|
|
3645
|
+
"stroke-linejoin": "round",
|
|
3646
|
+
"stroke-width": "13"
|
|
3647
|
+
},
|
|
3648
|
+
tag: "path"
|
|
3649
|
+
},
|
|
3650
|
+
{
|
|
3651
|
+
attrs: {
|
|
3652
|
+
d: "M270 366 Q273 345 294 345 L691 345",
|
|
3653
|
+
fill: "none",
|
|
3654
|
+
stroke: "#ffffff",
|
|
3655
|
+
"stroke-linecap": "round",
|
|
3656
|
+
"stroke-linejoin": "round",
|
|
3657
|
+
"stroke-width": "6"
|
|
3658
|
+
},
|
|
3659
|
+
tag: "path"
|
|
3660
|
+
}
|
|
3661
|
+
],
|
|
3662
|
+
tag: "g"
|
|
3663
|
+
}
|
|
3664
|
+
],
|
|
3665
|
+
sourceBox: {
|
|
3666
|
+
h: 1024,
|
|
3667
|
+
w: 1024,
|
|
3668
|
+
x: 0,
|
|
3669
|
+
y: 0
|
|
3670
|
+
},
|
|
3671
|
+
w: 1024,
|
|
3672
|
+
x: 0,
|
|
3673
|
+
y: 0
|
|
3674
|
+
},
|
|
3675
|
+
{
|
|
3676
|
+
h: 1024,
|
|
3677
|
+
id: "monitor-screen",
|
|
3678
|
+
kind: "svg",
|
|
3679
|
+
name: "Pantalla CRT",
|
|
3680
|
+
nodes: [
|
|
3681
|
+
{
|
|
3682
|
+
attrs: {
|
|
3683
|
+
transform: "translate(61 84) scale(0.88)"
|
|
3684
|
+
},
|
|
3685
|
+
children: [
|
|
3686
|
+
{
|
|
3687
|
+
attrs: {
|
|
3688
|
+
d: "M303 365 Q491 351 683 365 Q701 367 703 387 L703 538 Q703 557 683 560 Q486 574 303 560 Q284 557 283 538 L283 388 Q285 367 303 365Z",
|
|
3689
|
+
fill: "#19302b",
|
|
3690
|
+
stroke: "#171916",
|
|
3691
|
+
"stroke-linecap": "round",
|
|
3692
|
+
"stroke-linejoin": "round",
|
|
3693
|
+
"stroke-width": "11"
|
|
3694
|
+
},
|
|
3695
|
+
tag: "path"
|
|
3696
|
+
},
|
|
3697
|
+
{
|
|
3698
|
+
attrs: {
|
|
3699
|
+
d: "M305 393 Q464 380 675 393",
|
|
3700
|
+
fill: "none",
|
|
3701
|
+
stroke: "#345449",
|
|
3702
|
+
"stroke-linecap": "round",
|
|
3703
|
+
"stroke-linejoin": "round",
|
|
3704
|
+
"stroke-width": "5"
|
|
3705
|
+
},
|
|
3706
|
+
tag: "path"
|
|
3707
|
+
}
|
|
3708
|
+
],
|
|
3709
|
+
tag: "g"
|
|
3710
|
+
}
|
|
3711
|
+
],
|
|
3712
|
+
sourceBox: {
|
|
3713
|
+
h: 1024,
|
|
3714
|
+
w: 1024,
|
|
3715
|
+
x: 0,
|
|
3716
|
+
y: 0
|
|
3717
|
+
},
|
|
3718
|
+
w: 1024,
|
|
3719
|
+
x: 0,
|
|
3720
|
+
y: 0
|
|
3721
|
+
},
|
|
3722
|
+
{
|
|
3723
|
+
h: 1024,
|
|
3724
|
+
id: "screen-face",
|
|
3725
|
+
kind: "svg",
|
|
3726
|
+
name: "La confianza antes del deploy",
|
|
3727
|
+
nodes: [
|
|
3728
|
+
{
|
|
3729
|
+
attrs: {
|
|
3730
|
+
transform: "translate(61 84) scale(0.88)"
|
|
3731
|
+
},
|
|
3732
|
+
children: [
|
|
3733
|
+
{
|
|
3734
|
+
attrs: {
|
|
3735
|
+
d: "M376 451 Q399 426 422 451 M559 451 Q582 426 605 451",
|
|
3736
|
+
fill: "none",
|
|
3737
|
+
stroke: "#b6f287",
|
|
3738
|
+
"stroke-linecap": "round",
|
|
3739
|
+
"stroke-linejoin": "round",
|
|
3740
|
+
"stroke-width": "13"
|
|
3741
|
+
},
|
|
3742
|
+
tag: "path"
|
|
3743
|
+
},
|
|
3744
|
+
{
|
|
3745
|
+
attrs: {
|
|
3746
|
+
d: "M439 469 Q488 507 539 469 Q495 547 439 469Z",
|
|
3747
|
+
fill: "#b6f287",
|
|
3748
|
+
stroke: "#171916",
|
|
3749
|
+
"stroke-linecap": "round",
|
|
3750
|
+
"stroke-linejoin": "round",
|
|
3751
|
+
"stroke-width": "0"
|
|
3752
|
+
},
|
|
3753
|
+
tag: "path"
|
|
3754
|
+
},
|
|
3755
|
+
{
|
|
3756
|
+
attrs: {
|
|
3757
|
+
d: "M442 471 Q493 493 536 471",
|
|
3758
|
+
fill: "none",
|
|
3759
|
+
stroke: "#19302b",
|
|
3760
|
+
"stroke-linecap": "round",
|
|
3761
|
+
"stroke-linejoin": "round",
|
|
3762
|
+
"stroke-width": "5"
|
|
3763
|
+
},
|
|
3764
|
+
tag: "path"
|
|
3765
|
+
},
|
|
3766
|
+
{
|
|
3767
|
+
attrs: {
|
|
3768
|
+
d: "M343 472 H360 M620 472 H637",
|
|
3769
|
+
fill: "none",
|
|
3770
|
+
stroke: "#67895d",
|
|
3771
|
+
"stroke-linecap": "round",
|
|
3772
|
+
"stroke-linejoin": "round",
|
|
3773
|
+
"stroke-width": "6"
|
|
3774
|
+
},
|
|
3775
|
+
tag: "path"
|
|
3776
|
+
}
|
|
3777
|
+
],
|
|
3778
|
+
tag: "g"
|
|
3779
|
+
}
|
|
3780
|
+
],
|
|
3781
|
+
sourceBox: {
|
|
3782
|
+
h: 1024,
|
|
3783
|
+
w: 1024,
|
|
3784
|
+
x: 0,
|
|
3785
|
+
y: 0
|
|
3786
|
+
},
|
|
3787
|
+
w: 1024,
|
|
3788
|
+
x: 0,
|
|
3789
|
+
y: 0
|
|
3790
|
+
},
|
|
3791
|
+
{
|
|
3792
|
+
align: "left",
|
|
3793
|
+
binding: "none",
|
|
3794
|
+
color: "#b6f287",
|
|
3795
|
+
fit: "shrink",
|
|
3796
|
+
font: "mono",
|
|
3797
|
+
h: 31.68,
|
|
3798
|
+
id: "terminal-command",
|
|
3799
|
+
kind: "text",
|
|
3800
|
+
lineHeight: 1,
|
|
3801
|
+
name: "Comando de terminal",
|
|
3802
|
+
rotation: 0,
|
|
3803
|
+
size: 24.64,
|
|
3804
|
+
text: "> deploy --prod",
|
|
3805
|
+
w: 309.76,
|
|
3806
|
+
weight: "700",
|
|
3807
|
+
x: 342.6,
|
|
3808
|
+
y: 544.24
|
|
3809
|
+
},
|
|
3810
|
+
{
|
|
3811
|
+
h: 1024,
|
|
3812
|
+
id: "monitor-details",
|
|
3813
|
+
kind: "svg",
|
|
3814
|
+
name: "Botones e indicador",
|
|
3815
|
+
nodes: [
|
|
3816
|
+
{
|
|
3817
|
+
attrs: {
|
|
3818
|
+
transform: "translate(61 84) scale(0.88)"
|
|
3819
|
+
},
|
|
3820
|
+
children: [
|
|
3821
|
+
{
|
|
3822
|
+
attrs: {
|
|
3823
|
+
cx: "288",
|
|
3824
|
+
cy: "590",
|
|
3825
|
+
fill: "#b6f287",
|
|
3826
|
+
r: "8",
|
|
3827
|
+
stroke: "#171916",
|
|
3828
|
+
"stroke-width": "5"
|
|
3829
|
+
},
|
|
3830
|
+
tag: "circle"
|
|
3831
|
+
},
|
|
3832
|
+
{
|
|
3833
|
+
attrs: {
|
|
3834
|
+
fill: "#171916",
|
|
3835
|
+
height: "14",
|
|
3836
|
+
rx: "6",
|
|
3837
|
+
stroke: "#171916",
|
|
3838
|
+
"stroke-width": "0",
|
|
3839
|
+
width: "58",
|
|
3840
|
+
x: "641",
|
|
3841
|
+
y: "583"
|
|
3842
|
+
},
|
|
3843
|
+
tag: "rect"
|
|
3844
|
+
},
|
|
3845
|
+
{
|
|
3846
|
+
attrs: {
|
|
3847
|
+
d: "M332 590 H430",
|
|
3848
|
+
fill: "none",
|
|
3849
|
+
stroke: "#a89e83",
|
|
3850
|
+
"stroke-linecap": "round",
|
|
3851
|
+
"stroke-linejoin": "round",
|
|
3852
|
+
"stroke-width": "5"
|
|
3853
|
+
},
|
|
3854
|
+
tag: "path"
|
|
3855
|
+
}
|
|
3856
|
+
],
|
|
3857
|
+
tag: "g"
|
|
3858
|
+
}
|
|
3859
|
+
],
|
|
3860
|
+
sourceBox: {
|
|
3861
|
+
h: 1024,
|
|
3862
|
+
w: 1024,
|
|
3863
|
+
x: 0,
|
|
3864
|
+
y: 0
|
|
3865
|
+
},
|
|
3866
|
+
w: 1024,
|
|
3867
|
+
x: 0,
|
|
3868
|
+
y: 0
|
|
3869
|
+
},
|
|
3870
|
+
{
|
|
3871
|
+
h: 1024,
|
|
3872
|
+
id: "computer-stand",
|
|
3873
|
+
kind: "svg",
|
|
3874
|
+
name: "Soporte del monitor",
|
|
3875
|
+
nodes: [
|
|
3876
|
+
{
|
|
3877
|
+
attrs: {
|
|
3878
|
+
transform: "translate(61 84) scale(0.88)"
|
|
3879
|
+
},
|
|
3880
|
+
children: [
|
|
3881
|
+
{
|
|
3882
|
+
attrs: {
|
|
3883
|
+
d: "M431 621 L570 621 L586 657 L413 657Z",
|
|
3884
|
+
fill: "#c9c1a8",
|
|
3885
|
+
stroke: "#171916",
|
|
3886
|
+
"stroke-linecap": "round",
|
|
3887
|
+
"stroke-linejoin": "round",
|
|
3888
|
+
"stroke-width": "10"
|
|
3889
|
+
},
|
|
3890
|
+
tag: "path"
|
|
3891
|
+
}
|
|
3892
|
+
],
|
|
3893
|
+
tag: "g"
|
|
3894
|
+
}
|
|
3895
|
+
],
|
|
3896
|
+
sourceBox: {
|
|
3897
|
+
h: 1024,
|
|
3898
|
+
w: 1024,
|
|
3899
|
+
x: 0,
|
|
3900
|
+
y: 0
|
|
3901
|
+
},
|
|
3902
|
+
w: 1024,
|
|
3903
|
+
x: 0,
|
|
3904
|
+
y: 0
|
|
3905
|
+
},
|
|
3906
|
+
{
|
|
3907
|
+
h: 1024,
|
|
3908
|
+
id: "keyboard",
|
|
3909
|
+
kind: "svg",
|
|
3910
|
+
name: "Teclado retro",
|
|
3911
|
+
nodes: [
|
|
3912
|
+
{
|
|
3913
|
+
attrs: {
|
|
3914
|
+
transform: "translate(61 84) scale(0.88)"
|
|
3915
|
+
},
|
|
3916
|
+
children: [
|
|
3917
|
+
{
|
|
3918
|
+
attrs: {
|
|
3919
|
+
d: "M297 638 L729 638 L792 684 Q801 699 778 706 L236 706 Q217 701 231 684Z",
|
|
3920
|
+
fill: "#fff4d8",
|
|
3921
|
+
stroke: "#171916",
|
|
3922
|
+
"stroke-linecap": "round",
|
|
3923
|
+
"stroke-linejoin": "round",
|
|
3924
|
+
"stroke-width": "12"
|
|
3925
|
+
},
|
|
3926
|
+
tag: "path"
|
|
3927
|
+
},
|
|
3928
|
+
{
|
|
3929
|
+
attrs: {
|
|
3930
|
+
d: "M301 657 L722 657 L752 683 L275 683Z",
|
|
3931
|
+
fill: "#b7b49f",
|
|
3932
|
+
stroke: "#171916",
|
|
3933
|
+
"stroke-linecap": "round",
|
|
3934
|
+
"stroke-linejoin": "round",
|
|
3935
|
+
"stroke-width": "5"
|
|
3936
|
+
},
|
|
3937
|
+
tag: "path"
|
|
3938
|
+
},
|
|
3939
|
+
{
|
|
3940
|
+
attrs: {
|
|
3941
|
+
d: "M333 658 L319 683 M385 658 L377 683 M437 658 L433 683 M490 658 V683 M542 658 L547 683 M594 658 L603 683 M646 658 L659 683 M698 658 L716 683 M290 671 H738",
|
|
3942
|
+
fill: "none",
|
|
3943
|
+
stroke: "#171916",
|
|
3944
|
+
"stroke-linecap": "round",
|
|
3945
|
+
"stroke-linejoin": "round",
|
|
3946
|
+
"stroke-width": "4"
|
|
3947
|
+
},
|
|
3948
|
+
tag: "path"
|
|
3949
|
+
}
|
|
3950
|
+
],
|
|
3951
|
+
tag: "g"
|
|
3952
|
+
}
|
|
3953
|
+
],
|
|
3954
|
+
sourceBox: {
|
|
3955
|
+
h: 1024,
|
|
3956
|
+
w: 1024,
|
|
3957
|
+
x: 0,
|
|
3958
|
+
y: 0
|
|
3959
|
+
},
|
|
3960
|
+
w: 1024,
|
|
3961
|
+
x: 0,
|
|
3962
|
+
y: 0
|
|
3963
|
+
},
|
|
3964
|
+
{
|
|
3965
|
+
h: 1024,
|
|
3966
|
+
id: "coffee-handle",
|
|
3967
|
+
kind: "svg",
|
|
3968
|
+
name: "Taza \xB7 asa",
|
|
3969
|
+
nodes: [
|
|
3970
|
+
{
|
|
3971
|
+
attrs: {
|
|
3972
|
+
d: "M178 557 C115 526 103 606 154 618 L192 606Z",
|
|
3973
|
+
fill: "#fff4d8",
|
|
3974
|
+
stroke: "#171916",
|
|
3975
|
+
"stroke-linecap": "round",
|
|
3976
|
+
"stroke-linejoin": "round",
|
|
3977
|
+
"stroke-width": "11"
|
|
3978
|
+
},
|
|
3979
|
+
tag: "path"
|
|
3980
|
+
},
|
|
3981
|
+
{
|
|
3982
|
+
attrs: {
|
|
3983
|
+
d: "M171 571 C143 555 132 592 160 596 L179 589Z",
|
|
3984
|
+
fill: "#19302b",
|
|
3985
|
+
stroke: "#171916",
|
|
3986
|
+
"stroke-linecap": "round",
|
|
3987
|
+
"stroke-linejoin": "round",
|
|
3988
|
+
"stroke-width": "5"
|
|
3989
|
+
},
|
|
3990
|
+
tag: "path"
|
|
3991
|
+
}
|
|
3992
|
+
],
|
|
3993
|
+
sourceBox: {
|
|
3994
|
+
h: 1024,
|
|
3995
|
+
w: 1024,
|
|
3996
|
+
x: 0,
|
|
3997
|
+
y: 0
|
|
3998
|
+
},
|
|
3999
|
+
w: 1024,
|
|
4000
|
+
x: 0,
|
|
4001
|
+
y: 0
|
|
4002
|
+
},
|
|
4003
|
+
{
|
|
4004
|
+
h: 1024,
|
|
4005
|
+
id: "coffee-cup",
|
|
4006
|
+
kind: "svg",
|
|
4007
|
+
name: "Caf\xE9 para producci\xF3n",
|
|
4008
|
+
nodes: [
|
|
4009
|
+
{
|
|
4010
|
+
attrs: {
|
|
4011
|
+
d: "M165 538 L268 538 L259 636 Q210 665 174 637Z",
|
|
4012
|
+
fill: "#fff4d8",
|
|
4013
|
+
stroke: "#171916",
|
|
4014
|
+
"stroke-linecap": "round",
|
|
4015
|
+
"stroke-linejoin": "round",
|
|
4016
|
+
"stroke-width": "11"
|
|
4017
|
+
},
|
|
4018
|
+
tag: "path"
|
|
4019
|
+
},
|
|
4020
|
+
{
|
|
4021
|
+
attrs: {
|
|
4022
|
+
cx: "217",
|
|
4023
|
+
cy: "540",
|
|
4024
|
+
fill: "#916844",
|
|
4025
|
+
rx: "52",
|
|
4026
|
+
ry: "17",
|
|
4027
|
+
stroke: "#171916",
|
|
4028
|
+
"stroke-width": "9"
|
|
4029
|
+
},
|
|
4030
|
+
tag: "ellipse"
|
|
4031
|
+
},
|
|
4032
|
+
{
|
|
4033
|
+
attrs: {
|
|
4034
|
+
d: "M184 624 Q214 637 248 625",
|
|
4035
|
+
fill: "none",
|
|
4036
|
+
stroke: "#c9c1a8",
|
|
4037
|
+
"stroke-linecap": "round",
|
|
4038
|
+
"stroke-linejoin": "round",
|
|
4039
|
+
"stroke-width": "5"
|
|
4040
|
+
},
|
|
4041
|
+
tag: "path"
|
|
4042
|
+
},
|
|
4043
|
+
{
|
|
4044
|
+
attrs: {
|
|
4045
|
+
d: "M211 489 C186 465 232 460 212 436 M241 498 C223 482 253 472 246 457",
|
|
4046
|
+
fill: "none",
|
|
4047
|
+
stroke: "#fff4d8",
|
|
4048
|
+
"stroke-linecap": "round",
|
|
4049
|
+
"stroke-linejoin": "round",
|
|
4050
|
+
"stroke-width": "10"
|
|
4051
|
+
},
|
|
4052
|
+
tag: "path"
|
|
4053
|
+
},
|
|
4054
|
+
{
|
|
4055
|
+
attrs: {
|
|
4056
|
+
d: "M194 588 L184 598 L194 608 M234 588 L244 598 L234 608 M223 583 L214 614",
|
|
4057
|
+
fill: "none",
|
|
4058
|
+
stroke: "#171916",
|
|
4059
|
+
"stroke-linecap": "round",
|
|
4060
|
+
"stroke-linejoin": "round",
|
|
4061
|
+
"stroke-width": "6"
|
|
4062
|
+
},
|
|
4063
|
+
tag: "path"
|
|
4064
|
+
}
|
|
4065
|
+
],
|
|
4066
|
+
sourceBox: {
|
|
4067
|
+
h: 1024,
|
|
4068
|
+
w: 1024,
|
|
4069
|
+
x: 0,
|
|
4070
|
+
y: 0
|
|
4071
|
+
},
|
|
4072
|
+
w: 1024,
|
|
4073
|
+
x: 0,
|
|
4074
|
+
y: 0
|
|
4075
|
+
},
|
|
4076
|
+
{
|
|
4077
|
+
h: 1024,
|
|
4078
|
+
id: "time-tag",
|
|
4079
|
+
kind: "svg",
|
|
4080
|
+
name: "Viernes a \xFAltima hora",
|
|
4081
|
+
nodes: [
|
|
4082
|
+
{
|
|
4083
|
+
attrs: {
|
|
4084
|
+
transform: "rotate(7 791 604)"
|
|
4085
|
+
},
|
|
4086
|
+
children: [
|
|
4087
|
+
{
|
|
4088
|
+
attrs: {
|
|
4089
|
+
fill: "#ffdb42",
|
|
4090
|
+
height: "77",
|
|
4091
|
+
rx: "12",
|
|
4092
|
+
stroke: "#171916",
|
|
4093
|
+
"stroke-width": "10",
|
|
4094
|
+
width: "171",
|
|
4095
|
+
x: "715",
|
|
4096
|
+
y: "565"
|
|
4097
|
+
},
|
|
4098
|
+
tag: "rect"
|
|
4099
|
+
},
|
|
4100
|
+
{
|
|
4101
|
+
attrs: {
|
|
4102
|
+
d: "M734 566 V553 M863 566 V553",
|
|
4103
|
+
fill: "none",
|
|
4104
|
+
stroke: "#171916",
|
|
4105
|
+
"stroke-linecap": "round",
|
|
4106
|
+
"stroke-linejoin": "round",
|
|
4107
|
+
"stroke-width": "9"
|
|
4108
|
+
},
|
|
4109
|
+
tag: "path"
|
|
4110
|
+
}
|
|
4111
|
+
],
|
|
4112
|
+
tag: "g"
|
|
4113
|
+
}
|
|
4114
|
+
],
|
|
4115
|
+
sourceBox: {
|
|
4116
|
+
h: 1024,
|
|
4117
|
+
w: 1024,
|
|
4118
|
+
x: 0,
|
|
4119
|
+
y: 0
|
|
4120
|
+
},
|
|
4121
|
+
w: 1024,
|
|
4122
|
+
x: 0,
|
|
4123
|
+
y: 0
|
|
4124
|
+
},
|
|
4125
|
+
{
|
|
4126
|
+
align: "center",
|
|
4127
|
+
binding: "none",
|
|
4128
|
+
color: "#171916",
|
|
4129
|
+
fit: "shrink",
|
|
4130
|
+
font: "mono",
|
|
4131
|
+
h: 49,
|
|
4132
|
+
id: "time",
|
|
4133
|
+
kind: "text",
|
|
4134
|
+
lineHeight: 1,
|
|
4135
|
+
name: "Hora del deploy",
|
|
4136
|
+
rotation: 7,
|
|
4137
|
+
size: 40,
|
|
4138
|
+
text: "17:59",
|
|
4139
|
+
w: 140,
|
|
4140
|
+
weight: "700",
|
|
4141
|
+
x: 730,
|
|
4142
|
+
y: 583
|
|
4143
|
+
},
|
|
4144
|
+
{
|
|
4145
|
+
h: 1024,
|
|
4146
|
+
id: "headline-plaque",
|
|
4147
|
+
kind: "svg",
|
|
4148
|
+
name: "Cabecera negra",
|
|
4149
|
+
nodes: [
|
|
4150
|
+
{
|
|
4151
|
+
attrs: {
|
|
4152
|
+
transform: "rotate(-4 512 163)"
|
|
4153
|
+
},
|
|
4154
|
+
children: [
|
|
4155
|
+
{
|
|
4156
|
+
attrs: {
|
|
4157
|
+
fill: "#171916",
|
|
4158
|
+
height: "163",
|
|
4159
|
+
rx: "20",
|
|
4160
|
+
stroke: "#fff4d8",
|
|
4161
|
+
"stroke-width": "4",
|
|
4162
|
+
width: "786",
|
|
4163
|
+
x: "119",
|
|
4164
|
+
y: "84"
|
|
4165
|
+
},
|
|
4166
|
+
tag: "rect"
|
|
4167
|
+
}
|
|
4168
|
+
],
|
|
4169
|
+
tag: "g"
|
|
4170
|
+
}
|
|
4171
|
+
],
|
|
4172
|
+
sourceBox: {
|
|
4173
|
+
h: 1024,
|
|
4174
|
+
w: 1024,
|
|
4175
|
+
x: 0,
|
|
4176
|
+
y: 0
|
|
4177
|
+
},
|
|
4178
|
+
w: 1024,
|
|
4179
|
+
x: 0,
|
|
4180
|
+
y: 0
|
|
4181
|
+
},
|
|
4182
|
+
{
|
|
4183
|
+
align: "center",
|
|
4184
|
+
binding: "none",
|
|
4185
|
+
color: "#fff4d8",
|
|
4186
|
+
fit: "shrink",
|
|
4187
|
+
font: "display",
|
|
4188
|
+
h: 163,
|
|
4189
|
+
id: "headline",
|
|
4190
|
+
kind: "text",
|
|
4191
|
+
lineHeight: 1,
|
|
4192
|
+
name: "Yo shipeo",
|
|
4193
|
+
rotation: -4,
|
|
4194
|
+
size: 173,
|
|
4195
|
+
text: "YO SHIPEO",
|
|
4196
|
+
tracking: 1,
|
|
4197
|
+
w: 726,
|
|
4198
|
+
weight: "900",
|
|
4199
|
+
x: 149,
|
|
4200
|
+
y: 88
|
|
4201
|
+
},
|
|
4202
|
+
{
|
|
4203
|
+
h: 1024,
|
|
4204
|
+
id: "friday-plaque",
|
|
4205
|
+
kind: "svg",
|
|
4206
|
+
name: "Franja del viernes",
|
|
4207
|
+
nodes: [
|
|
4208
|
+
{
|
|
4209
|
+
attrs: {
|
|
4210
|
+
d: "M94 711 Q511 689 930 711 L927 852 Q511 882 96 852Z",
|
|
4211
|
+
fill: "#171916",
|
|
4212
|
+
stroke: "#171916",
|
|
4213
|
+
"stroke-linecap": "round",
|
|
4214
|
+
"stroke-linejoin": "round",
|
|
4215
|
+
"stroke-width": "12"
|
|
4216
|
+
},
|
|
4217
|
+
tag: "path"
|
|
4218
|
+
},
|
|
4219
|
+
{
|
|
4220
|
+
attrs: {
|
|
4221
|
+
d: "M116 727 Q507 708 908 728",
|
|
4222
|
+
fill: "none",
|
|
4223
|
+
stroke: "#ffdb42",
|
|
4224
|
+
"stroke-linecap": "round",
|
|
4225
|
+
"stroke-linejoin": "round",
|
|
4226
|
+
"stroke-width": "4"
|
|
4227
|
+
},
|
|
4228
|
+
tag: "path"
|
|
4229
|
+
}
|
|
4230
|
+
],
|
|
4231
|
+
sourceBox: {
|
|
4232
|
+
h: 1024,
|
|
4233
|
+
w: 1024,
|
|
4234
|
+
x: 0,
|
|
4235
|
+
y: 0
|
|
4236
|
+
},
|
|
4237
|
+
w: 1024,
|
|
4238
|
+
x: 0,
|
|
4239
|
+
y: 0
|
|
4240
|
+
},
|
|
4241
|
+
{
|
|
4242
|
+
align: "center",
|
|
4243
|
+
binding: "none",
|
|
4244
|
+
color: "#ffdb42",
|
|
4245
|
+
fit: "shrink",
|
|
4246
|
+
font: "display",
|
|
4247
|
+
h: 145,
|
|
4248
|
+
id: "friday",
|
|
4249
|
+
kind: "text",
|
|
4250
|
+
lineHeight: 1,
|
|
4251
|
+
name: "Los viernes",
|
|
4252
|
+
rotation: 0,
|
|
4253
|
+
size: 159,
|
|
4254
|
+
text: "LOS VIERNES",
|
|
4255
|
+
tracking: 0,
|
|
4256
|
+
w: 790,
|
|
4257
|
+
weight: "900",
|
|
4258
|
+
x: 117,
|
|
4259
|
+
y: 730
|
|
4260
|
+
},
|
|
4261
|
+
{
|
|
4262
|
+
h: 1024,
|
|
4263
|
+
id: "punchline-plaque",
|
|
4264
|
+
kind: "svg",
|
|
4265
|
+
name: "Remate en crema",
|
|
4266
|
+
nodes: [
|
|
4267
|
+
{
|
|
4268
|
+
attrs: {
|
|
4269
|
+
d: "M177 866 Q512 886 849 866 L843 935 Q512 953 181 935Z",
|
|
4270
|
+
fill: "#fff4d8",
|
|
4271
|
+
stroke: "#171916",
|
|
4272
|
+
"stroke-linecap": "round",
|
|
4273
|
+
"stroke-linejoin": "round",
|
|
4274
|
+
"stroke-width": "10"
|
|
4275
|
+
},
|
|
4276
|
+
tag: "path"
|
|
4277
|
+
}
|
|
4278
|
+
],
|
|
4279
|
+
sourceBox: {
|
|
4280
|
+
h: 1024,
|
|
4281
|
+
w: 1024,
|
|
4282
|
+
x: 0,
|
|
4283
|
+
y: 0
|
|
4284
|
+
},
|
|
4285
|
+
w: 1024,
|
|
4286
|
+
x: 0,
|
|
4287
|
+
y: 0
|
|
4288
|
+
},
|
|
4289
|
+
{
|
|
4290
|
+
align: "center",
|
|
4291
|
+
binding: "none",
|
|
4292
|
+
color: "#171916",
|
|
4293
|
+
fit: "shrink",
|
|
4294
|
+
font: "sans",
|
|
4295
|
+
h: 46,
|
|
4296
|
+
id: "punchline",
|
|
4297
|
+
kind: "text",
|
|
4298
|
+
lineHeight: 1,
|
|
4299
|
+
name: "Qu\xE9 podr\xEDa malir sal",
|
|
4300
|
+
rotation: 0,
|
|
4301
|
+
size: 38,
|
|
4302
|
+
text: "\xBFQU\xC9 PODR\xCDA MALIR SAL?",
|
|
4303
|
+
tracking: -0.6,
|
|
4304
|
+
w: 642,
|
|
4305
|
+
weight: "900",
|
|
4306
|
+
x: 191,
|
|
4307
|
+
y: 886
|
|
4308
|
+
}
|
|
4309
|
+
]
|
|
4310
|
+
},
|
|
4311
|
+
material: {
|
|
4312
|
+
iridescence: 0,
|
|
4313
|
+
roughness: 0.68,
|
|
4314
|
+
speed: 0.15,
|
|
4315
|
+
surface: "satin"
|
|
4316
|
+
},
|
|
4317
|
+
name: "Yo shipeo los viernes",
|
|
4318
|
+
product: "sticker",
|
|
4319
|
+
source: "friday-ship-original",
|
|
4320
|
+
sticker: {
|
|
4321
|
+
border: 18,
|
|
4322
|
+
finish: "vinyl",
|
|
4323
|
+
gloss: 0.25,
|
|
4324
|
+
seed: 175905,
|
|
4325
|
+
sparkle: 0
|
|
4326
|
+
},
|
|
4327
|
+
svgSource: {
|
|
4328
|
+
attribution: "Original vector illustration created for this sticker.",
|
|
4329
|
+
definitions: [],
|
|
4330
|
+
originalSha256: "e79f76108a8bafa83a32c44323bbdf3c7cf368860c813f6f0f8539739068fb36"
|
|
4331
|
+
},
|
|
4332
|
+
version: 1
|
|
4333
|
+
},
|
|
4334
|
+
brew: {
|
|
4335
|
+
artPrompt: "A sculptural espresso mug with code-shaped crema, steam ribbons and the original Crafter Station symbol. Bold condensed editorial type carries the exact phrase from crafter.run: Built fast, built well. Warm ivory print, ink-black contour and espresso accents; transparent canvas, fine holographic die-cut stock, fully editable text, shapes and vectors. Original interpretation; screenshot was not attached.",
|
|
4336
|
+
back: {
|
|
4337
|
+
background: "#00000000",
|
|
4338
|
+
layers: []
|
|
4339
|
+
},
|
|
4340
|
+
description: "Crafter Station coffee terminal. Editable typography and original vector mark; warm ivory, espresso and a quiet holographic die-cut edge.",
|
|
4341
|
+
event: "Code Brew \xB7 Crafter Station",
|
|
4342
|
+
front: {
|
|
4343
|
+
background: "#00000000",
|
|
4344
|
+
layers: [
|
|
4345
|
+
{
|
|
4346
|
+
accent: "#24221f",
|
|
4347
|
+
color: "#24221f",
|
|
4348
|
+
density: 1,
|
|
4349
|
+
h: 1024,
|
|
4350
|
+
id: "steam-left-contour",
|
|
4351
|
+
kind: "graphic",
|
|
4352
|
+
name: "Steam / left silhouette",
|
|
4353
|
+
path: "M302 321 C340 281 352 246 322 213 C294 184 295 167 317 146 C329 134 329 116 315 105 C301 94 285 101 273 114 C232 156 244 197 270 227 C296 255 283 277 263 303 Z",
|
|
4354
|
+
pattern: "path",
|
|
4355
|
+
seed: 1,
|
|
4356
|
+
stroke: 0,
|
|
4357
|
+
viewBox: {
|
|
4358
|
+
height: 1024,
|
|
4359
|
+
width: 1024
|
|
4360
|
+
},
|
|
4361
|
+
w: 1024,
|
|
4362
|
+
x: 0,
|
|
4363
|
+
y: 0
|
|
4364
|
+
},
|
|
4365
|
+
{
|
|
4366
|
+
accent: "#f3ead6",
|
|
4367
|
+
color: "#f3ead6",
|
|
4368
|
+
density: 1,
|
|
4369
|
+
h: 1024,
|
|
4370
|
+
id: "steam-left-cream",
|
|
4371
|
+
kind: "graphic",
|
|
4372
|
+
name: "Steam / left cream",
|
|
4373
|
+
path: "M287 314 C323 279 334 250 308 222 C272 184 274 164 304 133 C309 128 309 123 305 120 C300 117 296 121 291 126 C257 164 267 194 292 222 C322 255 310 282 282 310 Z",
|
|
4374
|
+
pattern: "path",
|
|
4375
|
+
seed: 1,
|
|
4376
|
+
stroke: 0,
|
|
4377
|
+
viewBox: {
|
|
4378
|
+
height: 1024,
|
|
4379
|
+
width: 1024
|
|
4380
|
+
},
|
|
4381
|
+
w: 1024,
|
|
4382
|
+
x: 0,
|
|
4383
|
+
y: 0
|
|
4384
|
+
},
|
|
4385
|
+
{
|
|
4386
|
+
accent: "#24221f",
|
|
4387
|
+
color: "#24221f",
|
|
4388
|
+
density: 1,
|
|
4389
|
+
h: 1024,
|
|
4390
|
+
id: "steam-right-contour",
|
|
4391
|
+
kind: "graphic",
|
|
4392
|
+
name: "Steam / right silhouette",
|
|
4393
|
+
path: "M487 317 C522 280 532 251 510 224 C492 202 493 187 517 167 C531 155 532 139 520 128 C507 117 491 122 480 132 C444 166 439 197 466 230 C488 256 474 277 454 300 Z",
|
|
4394
|
+
pattern: "path",
|
|
4395
|
+
seed: 1,
|
|
4396
|
+
stroke: 0,
|
|
4397
|
+
viewBox: {
|
|
4398
|
+
height: 1024,
|
|
4399
|
+
width: 1024
|
|
4400
|
+
},
|
|
4401
|
+
w: 1024,
|
|
4402
|
+
x: 0,
|
|
4403
|
+
y: 0
|
|
4404
|
+
},
|
|
4405
|
+
{
|
|
4406
|
+
accent: "#f3ead6",
|
|
4407
|
+
color: "#f3ead6",
|
|
4408
|
+
density: 1,
|
|
4409
|
+
h: 1024,
|
|
4410
|
+
id: "steam-right-cream",
|
|
4411
|
+
kind: "graphic",
|
|
4412
|
+
name: "Steam / right cream",
|
|
4413
|
+
path: "M473 309 C505 277 514 253 493 228 C467 196 474 172 504 148 C509 144 511 138 506 135 C502 132 497 136 491 141 C460 170 456 194 480 224 C506 256 492 283 468 305 Z",
|
|
4414
|
+
pattern: "path",
|
|
4415
|
+
seed: 1,
|
|
4416
|
+
stroke: 0,
|
|
4417
|
+
viewBox: {
|
|
4418
|
+
height: 1024,
|
|
4419
|
+
width: 1024
|
|
4420
|
+
},
|
|
4421
|
+
w: 1024,
|
|
4422
|
+
x: 0,
|
|
4423
|
+
y: 0
|
|
4424
|
+
},
|
|
4425
|
+
{
|
|
4426
|
+
h: 301,
|
|
4427
|
+
id: "cup-handle",
|
|
4428
|
+
kind: "svg",
|
|
4429
|
+
name: "Cup / hollow handle",
|
|
4430
|
+
nodes: [
|
|
4431
|
+
{
|
|
4432
|
+
attrs: {
|
|
4433
|
+
d: "M53 0 H116 C210 0 259 49 259 139 C259 233 204 287 99 301 L0 264 L24 202 L90 224 C155 216 185 190 185 140 C185 96 162 75 112 75 H34 Z",
|
|
4434
|
+
fill: "#24221f"
|
|
4435
|
+
},
|
|
4436
|
+
tag: "path"
|
|
4437
|
+
},
|
|
4438
|
+
{
|
|
4439
|
+
attrs: {
|
|
4440
|
+
d: "M58 19 H114 C194 19 239 61 239 139 C239 224 188 269 103 281 L26 254 L35 226 L93 244 C172 235 205 201 205 140 C205 84 173 54 112 54 H46 Z",
|
|
4441
|
+
fill: "#f3ead6"
|
|
4442
|
+
},
|
|
4443
|
+
tag: "path"
|
|
4444
|
+
}
|
|
4445
|
+
],
|
|
4446
|
+
sourceBox: {
|
|
4447
|
+
h: 301,
|
|
4448
|
+
w: 259,
|
|
4449
|
+
x: 0,
|
|
4450
|
+
y: 0
|
|
4451
|
+
},
|
|
4452
|
+
w: 259,
|
|
4453
|
+
x: 683,
|
|
4454
|
+
y: 341
|
|
4455
|
+
},
|
|
4456
|
+
{
|
|
4457
|
+
accent: "#24221f",
|
|
4458
|
+
color: "#24221f",
|
|
4459
|
+
density: 1,
|
|
4460
|
+
h: 1024,
|
|
4461
|
+
id: "cup-outline",
|
|
4462
|
+
kind: "graphic",
|
|
4463
|
+
name: "Cup / silhouette",
|
|
4464
|
+
path: "M156 268 C115 268 99 294 106 339 L159 754 C168 827 205 859 289 862 H606 C687 862 727 825 738 752 L796 340 C803 295 782 268 740 268 Z",
|
|
4465
|
+
pattern: "path",
|
|
4466
|
+
seed: 1,
|
|
4467
|
+
stroke: 0,
|
|
4468
|
+
viewBox: {
|
|
4469
|
+
height: 1024,
|
|
4470
|
+
width: 1024
|
|
4471
|
+
},
|
|
4472
|
+
w: 1024,
|
|
4473
|
+
x: 0,
|
|
4474
|
+
y: 0
|
|
4475
|
+
},
|
|
4476
|
+
{
|
|
4477
|
+
accent: "#f3ead6",
|
|
4478
|
+
color: "#f3ead6",
|
|
4479
|
+
density: 1,
|
|
4480
|
+
h: 1024,
|
|
4481
|
+
id: "cup-ivory",
|
|
4482
|
+
kind: "graphic",
|
|
4483
|
+
name: "Cup / warm ivory ink",
|
|
4484
|
+
path: "M132 332 L184 747 C192 810 220 835 290 837 H604 C669 837 704 809 714 744 L770 332 Z",
|
|
4485
|
+
pattern: "path",
|
|
4486
|
+
protectMaterial: true,
|
|
4487
|
+
seed: 1,
|
|
4488
|
+
stroke: 0,
|
|
4489
|
+
viewBox: {
|
|
4490
|
+
height: 1024,
|
|
4491
|
+
width: 1024
|
|
4492
|
+
},
|
|
4493
|
+
w: 1024,
|
|
4494
|
+
x: 0,
|
|
4495
|
+
y: 0
|
|
4496
|
+
},
|
|
4497
|
+
{
|
|
4498
|
+
accent: "#dbc6a6",
|
|
4499
|
+
color: "#dbc6a6",
|
|
4500
|
+
density: 1,
|
|
4501
|
+
h: 1024,
|
|
4502
|
+
id: "cup-right-shade",
|
|
4503
|
+
kind: "graphic",
|
|
4504
|
+
name: "Cup / coffee-tinted edge",
|
|
4505
|
+
path: "M746 350 L692 743 C681 810 653 824 609 836 C669 836 703 808 714 744 L769 350 Z",
|
|
4506
|
+
pattern: "path",
|
|
4507
|
+
seed: 1,
|
|
4508
|
+
stroke: 0,
|
|
4509
|
+
viewBox: {
|
|
4510
|
+
height: 1024,
|
|
4511
|
+
width: 1024
|
|
4512
|
+
},
|
|
4513
|
+
w: 1024,
|
|
4514
|
+
x: 0,
|
|
4515
|
+
y: 0
|
|
4516
|
+
},
|
|
4517
|
+
{
|
|
4518
|
+
color: "#a95735",
|
|
4519
|
+
h: 77,
|
|
4520
|
+
id: "coffee-oval",
|
|
4521
|
+
kind: "shape",
|
|
4522
|
+
name: "Coffee / espresso surface",
|
|
4523
|
+
opacity: 1,
|
|
4524
|
+
radius: 0,
|
|
4525
|
+
shape: "ellipse",
|
|
4526
|
+
stroke: 0,
|
|
4527
|
+
w: 647,
|
|
4528
|
+
x: 127,
|
|
4529
|
+
y: 287
|
|
4530
|
+
},
|
|
4531
|
+
{
|
|
4532
|
+
h: 80,
|
|
4533
|
+
id: "rim",
|
|
4534
|
+
kind: "svg",
|
|
4535
|
+
name: "Cup / rim highlight",
|
|
4536
|
+
nodes: [
|
|
4537
|
+
{
|
|
4538
|
+
attrs: {
|
|
4539
|
+
d: "M12 35 C116 3 526 3 638 35",
|
|
4540
|
+
fill: "none",
|
|
4541
|
+
stroke: "#fff9eb",
|
|
4542
|
+
"stroke-linecap": "round",
|
|
4543
|
+
"stroke-width": "9"
|
|
4544
|
+
},
|
|
4545
|
+
tag: "path"
|
|
4546
|
+
}
|
|
4547
|
+
],
|
|
4548
|
+
sourceBox: {
|
|
4549
|
+
h: 80,
|
|
4550
|
+
w: 651,
|
|
4551
|
+
x: 0,
|
|
4552
|
+
y: 0
|
|
4553
|
+
},
|
|
4554
|
+
w: 651,
|
|
4555
|
+
x: 124,
|
|
4556
|
+
y: 281
|
|
4557
|
+
},
|
|
4558
|
+
{
|
|
4559
|
+
h: 37,
|
|
4560
|
+
id: "coffee-brackets",
|
|
4561
|
+
kind: "svg",
|
|
4562
|
+
name: "Coffee / code crema",
|
|
4563
|
+
nodes: [
|
|
4564
|
+
{
|
|
4565
|
+
attrs: {
|
|
4566
|
+
d: "M45 6 L22 18 L45 30 M111 0 L91 36 M157 6 L180 18 L157 30",
|
|
4567
|
+
fill: "none",
|
|
4568
|
+
stroke: "#fff9eb",
|
|
4569
|
+
"stroke-linecap": "round",
|
|
4570
|
+
"stroke-linejoin": "round",
|
|
4571
|
+
"stroke-width": "7"
|
|
4572
|
+
},
|
|
4573
|
+
tag: "path"
|
|
4574
|
+
},
|
|
4575
|
+
{
|
|
4576
|
+
attrs: {
|
|
4577
|
+
d: "M211 26 H250",
|
|
4578
|
+
fill: "none",
|
|
4579
|
+
stroke: "#fff9eb",
|
|
4580
|
+
"stroke-linecap": "round",
|
|
4581
|
+
"stroke-width": "6"
|
|
4582
|
+
},
|
|
4583
|
+
tag: "path"
|
|
4584
|
+
}
|
|
4585
|
+
],
|
|
4586
|
+
sourceBox: {
|
|
4587
|
+
h: 37,
|
|
4588
|
+
w: 288,
|
|
4589
|
+
x: 0,
|
|
4590
|
+
y: 0
|
|
4591
|
+
},
|
|
4592
|
+
w: 288,
|
|
4593
|
+
x: 304,
|
|
4594
|
+
y: 308
|
|
4595
|
+
},
|
|
4596
|
+
{
|
|
4597
|
+
accent: "#24221f",
|
|
4598
|
+
color: "#24221f",
|
|
4599
|
+
density: 1,
|
|
4600
|
+
h: 1024,
|
|
4601
|
+
id: "logo-stem",
|
|
4602
|
+
kind: "graphic",
|
|
4603
|
+
name: "Crafter / medallion connection",
|
|
4604
|
+
path: "M619 262 L631 300 L652 290 L643 241 Z",
|
|
4605
|
+
pattern: "path",
|
|
4606
|
+
seed: 1,
|
|
4607
|
+
stroke: 0,
|
|
4608
|
+
viewBox: {
|
|
4609
|
+
height: 1024,
|
|
4610
|
+
width: 1024
|
|
4611
|
+
},
|
|
4612
|
+
w: 1024,
|
|
4613
|
+
x: 0,
|
|
4614
|
+
y: 0
|
|
4615
|
+
},
|
|
4616
|
+
{
|
|
4617
|
+
color: "#24221f",
|
|
4618
|
+
h: 166,
|
|
4619
|
+
id: "logo-round",
|
|
4620
|
+
kind: "shape",
|
|
4621
|
+
name: "Crafter / ink medallion",
|
|
4622
|
+
opacity: 1,
|
|
4623
|
+
radius: 0,
|
|
4624
|
+
shape: "ellipse",
|
|
4625
|
+
stroke: 0,
|
|
4626
|
+
w: 166,
|
|
4627
|
+
x: 547,
|
|
4628
|
+
y: 121
|
|
4629
|
+
},
|
|
4630
|
+
{
|
|
4631
|
+
color: "#f3ead6",
|
|
4632
|
+
h: 144,
|
|
4633
|
+
id: "logo-ring",
|
|
4634
|
+
kind: "shape",
|
|
4635
|
+
name: "Crafter / cream ring",
|
|
4636
|
+
opacity: 1,
|
|
4637
|
+
radius: 0,
|
|
4638
|
+
shape: "ellipse",
|
|
4639
|
+
stroke: 0,
|
|
4640
|
+
w: 144,
|
|
4641
|
+
x: 558,
|
|
4642
|
+
y: 132
|
|
4643
|
+
},
|
|
4644
|
+
{
|
|
4645
|
+
color: "#a95735",
|
|
4646
|
+
h: 128,
|
|
4647
|
+
id: "logo-inner",
|
|
4648
|
+
kind: "shape",
|
|
4649
|
+
name: "Crafter / espresso medallion",
|
|
4650
|
+
opacity: 1,
|
|
4651
|
+
radius: 0,
|
|
4652
|
+
shape: "ellipse",
|
|
4653
|
+
stroke: 0,
|
|
4654
|
+
w: 128,
|
|
4655
|
+
x: 566,
|
|
4656
|
+
y: 140
|
|
4657
|
+
},
|
|
4658
|
+
{
|
|
4659
|
+
h: 79,
|
|
4660
|
+
id: "crafter-symbol",
|
|
4661
|
+
kind: "svg",
|
|
4662
|
+
name: "Crafter / original vector symbol",
|
|
4663
|
+
nodes: [
|
|
4664
|
+
{
|
|
4665
|
+
attrs: {
|
|
4666
|
+
d: "M116.419 16.3268C109.59 11.5679 97.9222 5.96914 90.2388 3.72965C72.8798 -1.58913 59.1794 1.40491 50.114 4.56947C32.4704 10.7281 21.3721 18.8462 11.412 33.6828C-4.23949 56.6375 -1.96292 93.869 17.1035 114.864C21.3721 119.903 23.6487 119.063 40.1539 107.026C40.723 106.466 38.4465 102.827 35.0316 98.6278C27.3481 89.11 22.7949 71.754 25.0715 61.9563C32.4704 31.1634 70.3187 14.6472 94.7919 31.4433C100.199 35.0825 117.273 50.199 132.64 65.0356C155.691 86.8706 162.52 91.9094 168.212 91.3496C173.903 90.7897 175.895 88.8301 176.464 82.6715C177.318 75.9531 174.757 72.034 161.667 60.2767C152.845 52.1585 145.731 44.8802 145.731 43.4805C145.731 42.3608 151.707 37.6019 159.105 33.1229C206.914 3.1698 258.421 62.7961 218.581 101.987C213.459 107.026 204.353 112.345 198.377 114.024C191.547 115.704 159.959 117.104 120.688 117.104C47.2683 117.104 43.2842 117.943 23.9332 135.02C-0.824636 157.134 -6.51609 194.926 10.8429 222.359C33.3241 258.191 81.7016 267.149 115.85 241.675L128.372 232.157L142.885 241.675C166.504 257.351 185.571 260.431 208.621 252.872C254.722 237.476 271.796 179.809 241.916 141.178C238.501 136.979 236.794 136.699 232.241 138.939C218.297 146.777 218.581 146.217 226.834 163.013C233.094 175.89 234.233 180.929 232.81 190.727C228.826 215.361 210.044 231.877 186.14 231.877C167.643 231.877 161.667 228.238 127.518 195.486C109.59 178.689 93.0845 164.693 90.8079 164.693C86.5393 164.693 77.433 173.371 77.433 177.57C77.433 178.689 85.1165 187.647 94.7919 197.165L112.151 214.241L101.906 222.08C65.7655 249.233 14.2578 216.761 26.2098 174.211C29.9093 161.333 42.9996 147.057 55.5209 142.578C60.3586 140.618 90.2388 139.498 130.648 139.498C204.922 139.498 213.744 138.099 230.818 123.542C281.757 80.9919 252.161 0.930299 185.571 1.21023C166.22 1.21023 155.691 5.12933 137.762 18.2863L128.656 25.0048L116.419 16.3268Z",
|
|
4667
|
+
fill: "#fff9eb"
|
|
4668
|
+
},
|
|
4669
|
+
tag: "path"
|
|
4670
|
+
}
|
|
4671
|
+
],
|
|
4672
|
+
sourceBox: {
|
|
4673
|
+
h: 257,
|
|
4674
|
+
w: 257,
|
|
4675
|
+
x: 0,
|
|
4676
|
+
y: 0
|
|
4677
|
+
},
|
|
4678
|
+
w: 79,
|
|
4679
|
+
x: 591,
|
|
4680
|
+
y: 165
|
|
4681
|
+
},
|
|
4682
|
+
{
|
|
4683
|
+
align: "center",
|
|
4684
|
+
baseline: "top",
|
|
4685
|
+
binding: "none",
|
|
4686
|
+
color: "#24221f",
|
|
4687
|
+
fit: "shrink",
|
|
4688
|
+
font: "mono",
|
|
4689
|
+
h: 49,
|
|
4690
|
+
id: "code-brew",
|
|
4691
|
+
kind: "text",
|
|
4692
|
+
lineHeight: 1,
|
|
4693
|
+
name: "Event / Code Brew",
|
|
4694
|
+
size: 34,
|
|
4695
|
+
text: "CODE BREW",
|
|
4696
|
+
tracking: 5,
|
|
4697
|
+
w: 480,
|
|
4698
|
+
weight: "700",
|
|
4699
|
+
x: 207,
|
|
4700
|
+
y: 387
|
|
4701
|
+
},
|
|
4702
|
+
{
|
|
4703
|
+
color: "#24221f",
|
|
4704
|
+
h: 3,
|
|
4705
|
+
id: "label-rule-left",
|
|
4706
|
+
kind: "shape",
|
|
4707
|
+
name: "Print / left rule",
|
|
4708
|
+
opacity: 1,
|
|
4709
|
+
radius: 0,
|
|
4710
|
+
shape: "rectangle",
|
|
4711
|
+
stroke: 0,
|
|
4712
|
+
w: 261,
|
|
4713
|
+
x: 190,
|
|
4714
|
+
y: 441
|
|
4715
|
+
},
|
|
4716
|
+
{
|
|
4717
|
+
color: "#24221f",
|
|
4718
|
+
h: 3,
|
|
4719
|
+
id: "label-rule-right",
|
|
4720
|
+
kind: "shape",
|
|
4721
|
+
name: "Print / right rule",
|
|
4722
|
+
opacity: 1,
|
|
4723
|
+
radius: 0,
|
|
4724
|
+
shape: "rectangle",
|
|
4725
|
+
stroke: 0,
|
|
4726
|
+
w: 223,
|
|
4727
|
+
x: 486,
|
|
4728
|
+
y: 441
|
|
4729
|
+
},
|
|
4730
|
+
{
|
|
4731
|
+
color: "#a95735",
|
|
4732
|
+
h: 13,
|
|
4733
|
+
id: "status-dot",
|
|
4734
|
+
kind: "shape",
|
|
4735
|
+
name: "Print / warm status light",
|
|
4736
|
+
opacity: 1,
|
|
4737
|
+
radius: 0,
|
|
4738
|
+
shape: "ellipse",
|
|
4739
|
+
stroke: 0,
|
|
4740
|
+
w: 13,
|
|
4741
|
+
x: 463,
|
|
4742
|
+
y: 436
|
|
4743
|
+
},
|
|
4744
|
+
{
|
|
4745
|
+
align: "left",
|
|
4746
|
+
baseline: "top",
|
|
4747
|
+
binding: "none",
|
|
4748
|
+
color: "#24221f",
|
|
4749
|
+
fit: "shrink",
|
|
4750
|
+
font: "display",
|
|
4751
|
+
h: 133,
|
|
4752
|
+
id: "built-fast",
|
|
4753
|
+
kind: "text",
|
|
4754
|
+
lineHeight: 1,
|
|
4755
|
+
name: "Phrase / Built fast,",
|
|
4756
|
+
size: 133,
|
|
4757
|
+
text: "BUILT FAST,",
|
|
4758
|
+
tracking: -1,
|
|
4759
|
+
w: 525,
|
|
4760
|
+
weight: "800",
|
|
4761
|
+
x: 188,
|
|
4762
|
+
y: 458
|
|
4763
|
+
},
|
|
4764
|
+
{
|
|
4765
|
+
align: "left",
|
|
4766
|
+
baseline: "top",
|
|
4767
|
+
binding: "none",
|
|
4768
|
+
color: "#a95735",
|
|
4769
|
+
fit: "shrink",
|
|
4770
|
+
font: "display",
|
|
4771
|
+
h: 133,
|
|
4772
|
+
id: "built-well",
|
|
4773
|
+
kind: "text",
|
|
4774
|
+
lineHeight: 1,
|
|
4775
|
+
name: "Phrase / built well.",
|
|
4776
|
+
size: 133,
|
|
4777
|
+
text: "BUILT WELL.",
|
|
4778
|
+
tracking: -1,
|
|
4779
|
+
w: 525,
|
|
4780
|
+
weight: "800",
|
|
4781
|
+
x: 188,
|
|
4782
|
+
y: 585
|
|
4783
|
+
},
|
|
4784
|
+
{
|
|
4785
|
+
color: "#24221f",
|
|
4786
|
+
h: 3,
|
|
4787
|
+
id: "footer-rule",
|
|
4788
|
+
kind: "shape",
|
|
4789
|
+
name: "Print / footer rule",
|
|
4790
|
+
opacity: 1,
|
|
4791
|
+
radius: 0,
|
|
4792
|
+
shape: "rectangle",
|
|
4793
|
+
stroke: 0,
|
|
4794
|
+
w: 488,
|
|
4795
|
+
x: 201,
|
|
4796
|
+
y: 733
|
|
4797
|
+
},
|
|
4798
|
+
{
|
|
4799
|
+
align: "center",
|
|
4800
|
+
baseline: "top",
|
|
4801
|
+
binding: "none",
|
|
4802
|
+
color: "#24221f",
|
|
4803
|
+
fit: "shrink",
|
|
4804
|
+
font: "mono",
|
|
4805
|
+
h: 34,
|
|
4806
|
+
id: "crafter-wordmark",
|
|
4807
|
+
kind: "text",
|
|
4808
|
+
lineHeight: 1,
|
|
4809
|
+
name: "Brand / Crafter Station",
|
|
4810
|
+
size: 26,
|
|
4811
|
+
text: "CRAFTER STATION",
|
|
4812
|
+
tracking: 2,
|
|
4813
|
+
w: 482,
|
|
4814
|
+
weight: "700",
|
|
4815
|
+
x: 204,
|
|
4816
|
+
y: 755
|
|
4817
|
+
},
|
|
4818
|
+
{
|
|
4819
|
+
align: "center",
|
|
4820
|
+
baseline: "top",
|
|
4821
|
+
binding: "none",
|
|
4822
|
+
color: "#776755",
|
|
4823
|
+
fit: "shrink",
|
|
4824
|
+
font: "mono",
|
|
4825
|
+
h: 27,
|
|
4826
|
+
id: "brand-domain",
|
|
4827
|
+
kind: "text",
|
|
4828
|
+
lineHeight: 1,
|
|
4829
|
+
name: "Brand / editable domain",
|
|
4830
|
+
size: 21,
|
|
4831
|
+
text: "crafter.run",
|
|
4832
|
+
tracking: 2,
|
|
4833
|
+
w: 462,
|
|
4834
|
+
weight: "500",
|
|
4835
|
+
x: 212,
|
|
4836
|
+
y: 797
|
|
4837
|
+
},
|
|
4838
|
+
{
|
|
4839
|
+
h: 1024,
|
|
4840
|
+
id: "paper-flecks",
|
|
4841
|
+
kind: "svg",
|
|
4842
|
+
name: "Texture / subtle coffee-paper flecks",
|
|
4843
|
+
nodes: [
|
|
4844
|
+
{
|
|
4845
|
+
attrs: {
|
|
4846
|
+
cx: "197",
|
|
4847
|
+
cy: "367",
|
|
4848
|
+
fill: "#24221f",
|
|
4849
|
+
opacity: "0.25",
|
|
4850
|
+
r: "0.55"
|
|
4851
|
+
},
|
|
4852
|
+
tag: "circle"
|
|
4853
|
+
},
|
|
4854
|
+
{
|
|
4855
|
+
attrs: {
|
|
4856
|
+
cx: "280",
|
|
4857
|
+
cy: "446",
|
|
4858
|
+
fill: "#24221f",
|
|
4859
|
+
opacity: "0.25",
|
|
4860
|
+
r: "0.75"
|
|
4861
|
+
},
|
|
4862
|
+
tag: "circle"
|
|
4863
|
+
},
|
|
4864
|
+
{
|
|
4865
|
+
attrs: {
|
|
4866
|
+
cx: "695",
|
|
4867
|
+
cy: "394",
|
|
4868
|
+
fill: "#24221f",
|
|
4869
|
+
opacity: "0.25",
|
|
4870
|
+
r: "0.9500000000000001"
|
|
4871
|
+
},
|
|
4872
|
+
tag: "circle"
|
|
4873
|
+
},
|
|
4874
|
+
{
|
|
4875
|
+
attrs: {
|
|
4876
|
+
cx: "691",
|
|
4877
|
+
cy: "421",
|
|
4878
|
+
fill: "#24221f",
|
|
4879
|
+
opacity: "0.25",
|
|
4880
|
+
r: "0.55"
|
|
4881
|
+
},
|
|
4882
|
+
tag: "circle"
|
|
4883
|
+
},
|
|
4884
|
+
{
|
|
4885
|
+
attrs: {
|
|
4886
|
+
cx: "604",
|
|
4887
|
+
cy: "369",
|
|
4888
|
+
fill: "#24221f",
|
|
4889
|
+
opacity: "0.25",
|
|
4890
|
+
r: "0.75"
|
|
4891
|
+
},
|
|
4892
|
+
tag: "circle"
|
|
4893
|
+
},
|
|
4894
|
+
{
|
|
4895
|
+
attrs: {
|
|
4896
|
+
cx: "687",
|
|
4897
|
+
cy: "448",
|
|
4898
|
+
fill: "#24221f",
|
|
4899
|
+
opacity: "0.25",
|
|
4900
|
+
r: "0.9500000000000001"
|
|
4901
|
+
},
|
|
4902
|
+
tag: "circle"
|
|
4903
|
+
},
|
|
4904
|
+
{
|
|
4905
|
+
attrs: {
|
|
4906
|
+
cx: "600",
|
|
4907
|
+
cy: "396",
|
|
4908
|
+
fill: "#24221f",
|
|
4909
|
+
opacity: "0.25",
|
|
4910
|
+
r: "1.1500000000000001"
|
|
4911
|
+
},
|
|
4912
|
+
tag: "circle"
|
|
4913
|
+
},
|
|
4914
|
+
{
|
|
4915
|
+
attrs: {
|
|
4916
|
+
cx: "596",
|
|
4917
|
+
cy: "423",
|
|
4918
|
+
fill: "#24221f",
|
|
4919
|
+
opacity: "0.25",
|
|
4920
|
+
r: "0.75"
|
|
4921
|
+
},
|
|
4922
|
+
tag: "circle"
|
|
4923
|
+
},
|
|
4924
|
+
{
|
|
4925
|
+
attrs: {
|
|
4926
|
+
cx: "509",
|
|
4927
|
+
cy: "371",
|
|
4928
|
+
fill: "#24221f",
|
|
4929
|
+
opacity: "0.25",
|
|
4930
|
+
r: "0.9500000000000001"
|
|
4931
|
+
},
|
|
4932
|
+
tag: "circle"
|
|
4933
|
+
},
|
|
4934
|
+
{
|
|
4935
|
+
attrs: {
|
|
4936
|
+
cx: "505",
|
|
4937
|
+
cy: "398",
|
|
4938
|
+
fill: "#24221f",
|
|
4939
|
+
opacity: "0.25",
|
|
4940
|
+
r: "0.55"
|
|
4941
|
+
},
|
|
4942
|
+
tag: "circle"
|
|
4943
|
+
},
|
|
4944
|
+
{
|
|
4945
|
+
attrs: {
|
|
4946
|
+
cx: "501",
|
|
4947
|
+
cy: "425",
|
|
4948
|
+
fill: "#24221f",
|
|
4949
|
+
opacity: "0.25",
|
|
4950
|
+
r: "0.9500000000000001"
|
|
4951
|
+
},
|
|
4952
|
+
tag: "circle"
|
|
4953
|
+
},
|
|
4954
|
+
{
|
|
4955
|
+
attrs: {
|
|
4956
|
+
cx: "414",
|
|
4957
|
+
cy: "373",
|
|
4958
|
+
fill: "#24221f",
|
|
4959
|
+
opacity: "0.25",
|
|
4960
|
+
r: "1.1500000000000001"
|
|
4961
|
+
},
|
|
4962
|
+
tag: "circle"
|
|
4963
|
+
}
|
|
4964
|
+
],
|
|
4965
|
+
sourceBox: {
|
|
4966
|
+
h: 1024,
|
|
4967
|
+
w: 1024,
|
|
4968
|
+
x: 0,
|
|
4969
|
+
y: 0
|
|
4970
|
+
},
|
|
4971
|
+
w: 1024,
|
|
4972
|
+
x: 0,
|
|
4973
|
+
y: 0
|
|
4974
|
+
}
|
|
4975
|
+
]
|
|
4976
|
+
},
|
|
4977
|
+
material: {
|
|
4978
|
+
iridescence: 0.23,
|
|
4979
|
+
roughness: 0.52,
|
|
4980
|
+
speed: 0.18,
|
|
4981
|
+
surface: "prism"
|
|
4982
|
+
},
|
|
4983
|
+
name: "Code Brew \u2014 Built fast, built well.",
|
|
4984
|
+
product: "sticker",
|
|
4985
|
+
sticker: {
|
|
4986
|
+
border: 12,
|
|
4987
|
+
finish: "holographic",
|
|
4988
|
+
gloss: 0.26,
|
|
4989
|
+
seed: 290926,
|
|
4990
|
+
sparkle: 0.1
|
|
4991
|
+
},
|
|
4992
|
+
svgSource: {
|
|
4993
|
+
attribution: "Original coffee artwork created for Code Brew. Crafter Station symbol and wording: https://crafter.run/",
|
|
4994
|
+
definitions: [],
|
|
4995
|
+
originalSha256: "b8f38868dc3bf578b540c60b10c84cb1d168f9f90e49b2de653f4014ad53a917"
|
|
4996
|
+
},
|
|
4997
|
+
version: 1
|
|
4998
|
+
}
|
|
4999
|
+
};
|
|
5000
|
+
var collection = [
|
|
5001
|
+
["crafter", "12dd5570-2154-4f85-a6e4-f1459854bd43"],
|
|
5002
|
+
["friday", "9539473f-c73a-4898-a140-2585ddfbc158"],
|
|
5003
|
+
["brew", "cf3f2e1a-4a31-42de-ad6c-8825303b2f09"]
|
|
5004
|
+
];
|
|
5005
|
+
var communityStickerIds = collection.map(
|
|
5006
|
+
([, id]) => `community-${id}`
|
|
5007
|
+
);
|
|
5008
|
+
var communityStickerStyles = collection.map(([slug, id]) => {
|
|
5009
|
+
const original = badgeDesignSchema.parse(community_sticker_sources_default[slug]);
|
|
5010
|
+
const credit2 = { label: "Railly Hugo", url: `https://makeables.dev/submissions/${id}` };
|
|
5011
|
+
return badgeDesignSchema.parse({
|
|
5012
|
+
...original,
|
|
5013
|
+
source: `community-${id}`,
|
|
5014
|
+
artPrompt: "Adapted from the original Community artwork with real Ann Nguyen / TypingMind image references: simple contemporary shapes, integrated lettering, calm negative space and selective optical finish. Keep the exact identity and wording. GPT Image 2 via Vercel AI Gateway; prompts and provenance in sticker-revisions/2026-09-30. Original editable layers are retained hidden; the new illustration is a raster layer.",
|
|
5015
|
+
assets: {
|
|
5016
|
+
...original.assets,
|
|
5017
|
+
artwork: {
|
|
5018
|
+
source: "sticker",
|
|
5019
|
+
collection: "community",
|
|
5020
|
+
slug,
|
|
5021
|
+
file: "artwork",
|
|
5022
|
+
name: original.name,
|
|
5023
|
+
credit: credit2
|
|
5024
|
+
},
|
|
5025
|
+
"optical-map": {
|
|
5026
|
+
source: "sticker",
|
|
5027
|
+
collection: "community",
|
|
5028
|
+
slug,
|
|
5029
|
+
file: "effects",
|
|
5030
|
+
name: "Foil \xB7 glitter \xB7 relief",
|
|
5031
|
+
credit: credit2
|
|
2805
5032
|
}
|
|
5033
|
+
},
|
|
5034
|
+
front: {
|
|
5035
|
+
...original.front,
|
|
5036
|
+
background: "#00000000",
|
|
5037
|
+
layers: [
|
|
5038
|
+
...original.front.layers.map((layer) => ({
|
|
5039
|
+
...layer,
|
|
5040
|
+
visible: false,
|
|
5041
|
+
name: `Original \xB7 ${layer.name ?? layer.id}`.slice(0, 80)
|
|
5042
|
+
})),
|
|
5043
|
+
{
|
|
5044
|
+
id: "artwork",
|
|
5045
|
+
kind: "image",
|
|
5046
|
+
name: "Refined illustration",
|
|
5047
|
+
asset: "artwork",
|
|
5048
|
+
x: 0,
|
|
5049
|
+
y: 0,
|
|
5050
|
+
w: 1024,
|
|
5051
|
+
h: 1024,
|
|
5052
|
+
fit: "contain",
|
|
5053
|
+
opacity: 1,
|
|
5054
|
+
radius: 0
|
|
5055
|
+
}
|
|
5056
|
+
]
|
|
5057
|
+
},
|
|
5058
|
+
sticker: {
|
|
5059
|
+
finish: slug === "friday" ? "glitter" : "holographic",
|
|
5060
|
+
border: 0,
|
|
5061
|
+
seed: 0,
|
|
5062
|
+
holography: 0.85,
|
|
5063
|
+
sparkle: slug === "friday" ? 0.85 : 0.6,
|
|
5064
|
+
gloss: 1,
|
|
5065
|
+
relief: 0.5,
|
|
5066
|
+
flakes: 170,
|
|
5067
|
+
stock: slug === "friday" ? "holo-glitter" : "holographic",
|
|
5068
|
+
laminate: "gloss",
|
|
5069
|
+
liner: "Crafter Station",
|
|
5070
|
+
effectMap: { asset: "optical-map", layer: "artwork" }
|
|
2806
5071
|
}
|
|
2807
|
-
|
|
2808
|
-
|
|
2809
|
-
|
|
2810
|
-
|
|
2811
|
-
|
|
2812
|
-
|
|
2813
|
-
|
|
2814
|
-
|
|
2815
|
-
|
|
2816
|
-
|
|
2817
|
-
|
|
2818
|
-
|
|
2819
|
-
|
|
2820
|
-
|
|
2821
|
-
|
|
2822
|
-
|
|
2823
|
-
|
|
2824
|
-
|
|
2825
|
-
|
|
2826
|
-
|
|
2827
|
-
|
|
2828
|
-
|
|
2829
|
-
|
|
2830
|
-
|
|
2831
|
-
|
|
2832
|
-
|
|
2833
|
-
|
|
2834
|
-
|
|
2835
|
-
|
|
2836
|
-
|
|
2837
|
-
|
|
2838
|
-
|
|
2839
|
-
|
|
2840
|
-
|
|
2841
|
-
|
|
2842
|
-
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
2867
|
-
|
|
2868
|
-
|
|
2869
|
-
|
|
2870
|
-
|
|
2871
|
-
|
|
2872
|
-
|
|
2873
|
-
|
|
5072
|
+
});
|
|
5073
|
+
});
|
|
5074
|
+
var collection2 = [
|
|
5075
|
+
[
|
|
5076
|
+
"absolutely-right",
|
|
5077
|
+
"You're Absolutely Right",
|
|
5078
|
+
"Holo glitter border",
|
|
5079
|
+
1,
|
|
5080
|
+
1,
|
|
5081
|
+
1,
|
|
5082
|
+
0.55,
|
|
5083
|
+
"holo-glitter",
|
|
5084
|
+
"gloss"
|
|
5085
|
+
],
|
|
5086
|
+
[
|
|
5087
|
+
"cmd-enter",
|
|
5088
|
+
"Cmd + Enter",
|
|
5089
|
+
"Chrome locket \xB7 pink enamel",
|
|
5090
|
+
1.1,
|
|
5091
|
+
0.3,
|
|
5092
|
+
0.4,
|
|
5093
|
+
0.55,
|
|
5094
|
+
"white",
|
|
5095
|
+
"gloss"
|
|
5096
|
+
],
|
|
5097
|
+
[
|
|
5098
|
+
"energy",
|
|
5099
|
+
"TypingMind Energy",
|
|
5100
|
+
"Glitter vapour \xB7 gloss laminate",
|
|
5101
|
+
1,
|
|
5102
|
+
1,
|
|
5103
|
+
1,
|
|
5104
|
+
0.5,
|
|
5105
|
+
"holo-glitter",
|
|
5106
|
+
"gloss"
|
|
5107
|
+
],
|
|
5108
|
+
[
|
|
5109
|
+
"agi-is-coming",
|
|
5110
|
+
"AGI Is Coming",
|
|
5111
|
+
"Gloss laminate \xB7 sunset print",
|
|
5112
|
+
1,
|
|
5113
|
+
0.45,
|
|
5114
|
+
0.25,
|
|
5115
|
+
0.45,
|
|
5116
|
+
"white",
|
|
5117
|
+
"gloss"
|
|
5118
|
+
],
|
|
5119
|
+
["motion", "TypingMind Motion", "Holographic glitter", 1, 1, 1, 0.6, "holo-glitter", "gloss"],
|
|
5120
|
+
[
|
|
5121
|
+
"typingmind",
|
|
5122
|
+
"TypingMind",
|
|
5123
|
+
"Oil-slick holo on black",
|
|
5124
|
+
1.1,
|
|
5125
|
+
1,
|
|
5126
|
+
0.35,
|
|
5127
|
+
0.4,
|
|
5128
|
+
"holographic",
|
|
5129
|
+
"gloss"
|
|
5130
|
+
],
|
|
5131
|
+
["agi-disco", "AGI Disco", "Mirror-ball holo", 1, 1, 1, 0.5, "holo-glitter", "gloss"],
|
|
5132
|
+
["youre-cooked", "You're Cooked", "Matte vinyl print", 0.7, 0, 0, 0.35, "white", "matte"],
|
|
5133
|
+
[
|
|
5134
|
+
"emotional-support",
|
|
5135
|
+
"Emotional AI Support",
|
|
5136
|
+
"Pastel glitter jar",
|
|
5137
|
+
1,
|
|
5138
|
+
1,
|
|
5139
|
+
1,
|
|
5140
|
+
0.5,
|
|
5141
|
+
"holo-glitter",
|
|
5142
|
+
"gloss"
|
|
5143
|
+
]
|
|
5144
|
+
];
|
|
5145
|
+
var referenceStickerIds = collection2.map(
|
|
5146
|
+
([slug]) => `typingmind-${slug}`
|
|
5147
|
+
);
|
|
5148
|
+
var referenceStickerCredit = {
|
|
5149
|
+
label: "Ann Nguyen \xB7 TypingMind",
|
|
5150
|
+
url: "https://www.bubbbly.com/sticker-pack"
|
|
5151
|
+
};
|
|
5152
|
+
var referenceStickerStyles = collection2.map(
|
|
5153
|
+
([slug, name, description, gloss, holography, sparkle, relief, stock, laminate]) => ({
|
|
2874
5154
|
version: 1,
|
|
2875
5155
|
product: "sticker",
|
|
2876
|
-
source:
|
|
2877
|
-
name
|
|
2878
|
-
description
|
|
2879
|
-
event: "
|
|
5156
|
+
source: `typingmind-${slug}`,
|
|
5157
|
+
name,
|
|
5158
|
+
description,
|
|
5159
|
+
event: "TypingMind",
|
|
2880
5160
|
artPrompt: "",
|
|
2881
5161
|
material: { surface: "prism", roughness: 0.35, iridescence: 0.4, speed: 0.2 },
|
|
2882
5162
|
sticker: {
|
|
2883
|
-
|
|
2884
|
-
|
|
5163
|
+
finish: sparkle === 1 ? "glitter" : stock === "holographic" ? "holographic" : "vinyl",
|
|
5164
|
+
border: 0,
|
|
5165
|
+
gloss,
|
|
5166
|
+
holography,
|
|
5167
|
+
sparkle,
|
|
5168
|
+
relief,
|
|
5169
|
+
flakes: 170,
|
|
5170
|
+
stock,
|
|
5171
|
+
laminate,
|
|
5172
|
+
liner: "TypingMind",
|
|
5173
|
+
seed: 0,
|
|
5174
|
+
effectMap: { asset: "optical-map", layer: "artwork" }
|
|
5175
|
+
},
|
|
5176
|
+
assets: {
|
|
5177
|
+
artwork: {
|
|
5178
|
+
source: "sticker",
|
|
5179
|
+
collection: "typingmind",
|
|
5180
|
+
slug,
|
|
5181
|
+
file: "artwork",
|
|
5182
|
+
name,
|
|
5183
|
+
credit: referenceStickerCredit
|
|
5184
|
+
},
|
|
5185
|
+
"optical-map": {
|
|
5186
|
+
source: "sticker",
|
|
5187
|
+
collection: "typingmind",
|
|
5188
|
+
slug,
|
|
5189
|
+
file: "effects",
|
|
5190
|
+
name: `${name} optical map`,
|
|
5191
|
+
credit: referenceStickerCredit
|
|
5192
|
+
}
|
|
2885
5193
|
},
|
|
2886
5194
|
front: {
|
|
2887
5195
|
background: "#00000000",
|
|
2888
5196
|
layers: [
|
|
2889
|
-
|
|
2890
|
-
|
|
2891
|
-
"
|
|
2892
|
-
|
|
2893
|
-
|
|
2894
|
-
|
|
2895
|
-
|
|
2896
|
-
|
|
2897
|
-
|
|
2898
|
-
|
|
2899
|
-
|
|
2900
|
-
|
|
2901
|
-
|
|
2902
|
-
"star-left-outline",
|
|
2903
|
-
"M77 442L111 492L168 478L144 532L183 573L122 575L103 635L77 580L17 592L45 542L11 500L68 502Z",
|
|
2904
|
-
ink
|
|
2905
|
-
),
|
|
2906
|
-
path2(
|
|
2907
|
-
"star-left",
|
|
2908
|
-
"M77 463L106 508L148 497L128 537L160 562L113 565L101 608L82 566L38 578L58 541L33 512L78 513Z",
|
|
2909
|
-
"#ffe16a"
|
|
2910
|
-
),
|
|
2911
|
-
path2(
|
|
2912
|
-
"sparkle-right-outline",
|
|
2913
|
-
"M812 339L833 383L878 395L841 425L837 474L805 438L758 447L780 405L763 366L804 377Z",
|
|
2914
|
-
ink
|
|
2915
|
-
),
|
|
2916
|
-
path2(
|
|
2917
|
-
"sparkle-right",
|
|
2918
|
-
"M813 365L825 395L854 402L830 418L828 450L808 426L780 433L794 407L784 385L809 391Z",
|
|
2919
|
-
"#ffe16a"
|
|
2920
|
-
),
|
|
2921
|
-
path2(
|
|
2922
|
-
"sparkle-top",
|
|
2923
|
-
"M713 100L725 129L754 138L725 150L714 179L703 150L674 140L703 130Z",
|
|
2924
|
-
"#ffe16a"
|
|
2925
|
-
)
|
|
5197
|
+
{
|
|
5198
|
+
id: "artwork",
|
|
5199
|
+
name: "Original artwork",
|
|
5200
|
+
kind: "image",
|
|
5201
|
+
asset: "artwork",
|
|
5202
|
+
x: 0,
|
|
5203
|
+
y: 0,
|
|
5204
|
+
w: 1024,
|
|
5205
|
+
h: 1024,
|
|
5206
|
+
fit: "contain",
|
|
5207
|
+
opacity: 1,
|
|
5208
|
+
radius: 0
|
|
5209
|
+
}
|
|
2926
5210
|
]
|
|
2927
5211
|
},
|
|
2928
5212
|
back: { background: "#00000000", layers: [] }
|
|
2929
|
-
}
|
|
2930
|
-
|
|
2931
|
-
var
|
|
5213
|
+
})
|
|
5214
|
+
);
|
|
5215
|
+
var stickerStyleIds = [...referenceStickerIds, ...communityStickerIds];
|
|
5216
|
+
var stickerStyles = [...referenceStickerStyles, ...communityStickerStyles];
|
|
2932
5217
|
|
|
2933
5218
|
// ../design/dist/catalog.js
|
|
2934
5219
|
var catalog_default = [
|
|
@@ -16804,7 +19089,7 @@ function badgeQrLayout(destination, width, maxCellSize = 20) {
|
|
|
16804
19089
|
return { matrix, cell };
|
|
16805
19090
|
}
|
|
16806
19091
|
|
|
16807
|
-
// ../design/dist/chunk-
|
|
19092
|
+
// ../design/dist/chunk-Q7YTZKB2.js
|
|
16808
19093
|
import { z as z5 } from "zod";
|
|
16809
19094
|
var COMMUNITY_IMAGE_LIMIT = 3e6;
|
|
16810
19095
|
var COMMUNITY_JSON_LIMIT = 256e3;
|
|
@@ -17595,7 +19880,7 @@ var manifestSchema = z6.object({
|
|
|
17595
19880
|
if (m.product !== "sticker" && m.finish) issue("Only stickers have a sticker finish.");
|
|
17596
19881
|
if (m.product === "sticker" && (m.back || m.portrait))
|
|
17597
19882
|
issue("Stickers contain one face and no participant portrait.");
|
|
17598
|
-
for (const
|
|
19883
|
+
for (const path2 of [
|
|
17599
19884
|
m.document,
|
|
17600
19885
|
m.source,
|
|
17601
19886
|
m.front,
|
|
@@ -17604,7 +19889,7 @@ var manifestSchema = z6.object({
|
|
|
17604
19889
|
m.artwork,
|
|
17605
19890
|
...Object.values(m.assets)
|
|
17606
19891
|
])
|
|
17607
|
-
if (
|
|
19892
|
+
if (path2 && !paths.has(path2)) issue(`Missing asset: ${path2}.`);
|
|
17608
19893
|
for (const file of m.files) {
|
|
17609
19894
|
if (![
|
|
17610
19895
|
m.document,
|
|
@@ -17635,10 +19920,8 @@ function requiredAssets(design2) {
|
|
|
17635
19920
|
portrait: layers.some((l) => l.kind === "portrait"),
|
|
17636
19921
|
artwork: Boolean(design2.artwork) || layers.some((l) => l.kind === "image" && l.asset === "art"),
|
|
17637
19922
|
assets: [
|
|
17638
|
-
...
|
|
17639
|
-
|
|
17640
|
-
(l) => l.kind === "image" && l.asset !== "art" && design2.assets?.[l.asset]?.source !== "image" ? [l.asset] : []
|
|
17641
|
-
)
|
|
19923
|
+
...referencedDesignAssets(design2).filter(
|
|
19924
|
+
(id) => id !== "art" && design2.assets?.[id]?.source !== "image"
|
|
17642
19925
|
)
|
|
17643
19926
|
]
|
|
17644
19927
|
};
|
|
@@ -17664,10 +19947,10 @@ async function importDraft(value) {
|
|
|
17664
19947
|
for (const slot of ["portrait", "artwork"]) {
|
|
17665
19948
|
const image2 = bundle.images[slot];
|
|
17666
19949
|
if (!image2) continue;
|
|
17667
|
-
const
|
|
17668
|
-
draft[slot] =
|
|
17669
|
-
draft.files[
|
|
17670
|
-
draft.mime[
|
|
19950
|
+
const path2 = `${slot}.${image2.mimeType.split("/")[1]}`;
|
|
19951
|
+
draft[slot] = path2;
|
|
19952
|
+
draft.files[path2] = bundleImageBytes(image2);
|
|
19953
|
+
draft.mime[path2] = image2.mimeType;
|
|
17671
19954
|
}
|
|
17672
19955
|
return draft;
|
|
17673
19956
|
}
|
|
@@ -17682,9 +19965,9 @@ async function assemblePackage(input, files, mime) {
|
|
|
17682
19965
|
format: "makeables-package",
|
|
17683
19966
|
version: 1,
|
|
17684
19967
|
files: await Promise.all(
|
|
17685
|
-
Object.entries(files).map(async ([
|
|
17686
|
-
path:
|
|
17687
|
-
mime: mime[
|
|
19968
|
+
Object.entries(files).map(async ([path2, bytes]) => ({
|
|
19969
|
+
path: path2,
|
|
19970
|
+
mime: mime[path2],
|
|
17688
19971
|
bytes: bytes.length,
|
|
17689
19972
|
sha256: await hashBytes(bytes)
|
|
17690
19973
|
}))
|
|
@@ -17852,7 +20135,7 @@ function draftFromPackage(pkg) {
|
|
|
17852
20135
|
portrait: pkg.manifest.portrait,
|
|
17853
20136
|
artwork: pkg.manifest.artwork,
|
|
17854
20137
|
assets: pkg.manifest.assets,
|
|
17855
|
-
files: Object.fromEntries(Object.entries(pkg.files).filter(([
|
|
20138
|
+
files: Object.fromEntries(Object.entries(pkg.files).filter(([path2]) => paths.has(path2))),
|
|
17856
20139
|
mime: Object.fromEntries(
|
|
17857
20140
|
pkg.manifest.files.filter((f) => paths.has(f.path)).map((f) => [f.path, f.mime])
|
|
17858
20141
|
)
|
|
@@ -17864,10 +20147,10 @@ function packageJson(pkg) {
|
|
|
17864
20147
|
version: 1,
|
|
17865
20148
|
manifest: pkg.manifest,
|
|
17866
20149
|
files: Object.fromEntries(
|
|
17867
|
-
Object.entries(pkg.files).map(([
|
|
20150
|
+
Object.entries(pkg.files).map(([path2, bytes]) => {
|
|
17868
20151
|
let binary = "";
|
|
17869
20152
|
for (const byte of bytes) binary += String.fromCharCode(byte);
|
|
17870
|
-
return [
|
|
20153
|
+
return [path2, btoa(binary)];
|
|
17871
20154
|
})
|
|
17872
20155
|
)
|
|
17873
20156
|
};
|
|
@@ -17883,8 +20166,8 @@ async function readPackageJson(value) {
|
|
|
17883
20166
|
)
|
|
17884
20167
|
}).strict().parse(value);
|
|
17885
20168
|
const files = Object.fromEntries(
|
|
17886
|
-
Object.entries(input.files).map(([
|
|
17887
|
-
|
|
20169
|
+
Object.entries(input.files).map(([path2, base64]) => [
|
|
20170
|
+
path2,
|
|
17888
20171
|
Uint8Array.from(atob(base64), (c) => c.charCodeAt(0))
|
|
17889
20172
|
])
|
|
17890
20173
|
);
|
|
@@ -17894,7 +20177,7 @@ async function readPackageJson(value) {
|
|
|
17894
20177
|
}
|
|
17895
20178
|
|
|
17896
20179
|
// package.json
|
|
17897
|
-
var version = "0.
|
|
20180
|
+
var version = "0.6.0";
|
|
17898
20181
|
|
|
17899
20182
|
// src/errors.ts
|
|
17900
20183
|
var InputError = class extends Error {
|
|
@@ -17923,19 +20206,19 @@ async function listCardDesigns(assets = cardAssets()) {
|
|
|
17923
20206
|
);
|
|
17924
20207
|
}
|
|
17925
20208
|
async function writeAtomic(file, body, exclusive = false) {
|
|
17926
|
-
const
|
|
20209
|
+
const path2 = resolve(file);
|
|
17927
20210
|
if (exclusive) {
|
|
17928
|
-
const handle = await open(
|
|
20211
|
+
const handle = await open(path2, "wx", 420);
|
|
17929
20212
|
try {
|
|
17930
20213
|
await handle.writeFile(body);
|
|
17931
20214
|
await handle.sync();
|
|
17932
20215
|
} finally {
|
|
17933
20216
|
await handle.close();
|
|
17934
20217
|
}
|
|
17935
|
-
return
|
|
20218
|
+
return path2;
|
|
17936
20219
|
}
|
|
17937
|
-
const folder = await mkdtemp(join(dirname(
|
|
17938
|
-
const temporary = join(folder, basename(
|
|
20220
|
+
const folder = await mkdtemp(join(dirname(path2), ".makeables-"));
|
|
20221
|
+
const temporary = join(folder, basename(path2));
|
|
17939
20222
|
try {
|
|
17940
20223
|
const handle = await open(temporary, "wx", 420);
|
|
17941
20224
|
try {
|
|
@@ -17944,11 +20227,11 @@ async function writeAtomic(file, body, exclusive = false) {
|
|
|
17944
20227
|
} finally {
|
|
17945
20228
|
await handle.close();
|
|
17946
20229
|
}
|
|
17947
|
-
await rename(temporary,
|
|
20230
|
+
await rename(temporary, path2);
|
|
17948
20231
|
} finally {
|
|
17949
20232
|
await rm(folder, { recursive: true, force: true });
|
|
17950
20233
|
}
|
|
17951
|
-
return
|
|
20234
|
+
return path2;
|
|
17952
20235
|
}
|
|
17953
20236
|
async function newCard(design2, assets = cardAssets()) {
|
|
17954
20237
|
const found = (await listCardDesigns(assets)).find(({ slug }) => slug === design2);
|
|
@@ -18430,9 +20713,9 @@ function paintDesignGraphic(ctx, layer) {
|
|
|
18430
20713
|
}
|
|
18431
20714
|
} else if (pattern === "path") {
|
|
18432
20715
|
if (layer.viewBox) ctx.scale(w / layer.viewBox.width, h / layer.viewBox.height);
|
|
18433
|
-
const
|
|
18434
|
-
if (!layer.stroke || layer.fill) ctx.fill(
|
|
18435
|
-
if (layer.stroke) ctx.stroke(
|
|
20716
|
+
const path2 = new Path2D(layer.path || "");
|
|
20717
|
+
if (!layer.stroke || layer.fill) ctx.fill(path2);
|
|
20718
|
+
if (layer.stroke) ctx.stroke(path2);
|
|
18436
20719
|
} else if (pattern === "window") {
|
|
18437
20720
|
ctx.fillStyle = "#262626";
|
|
18438
20721
|
ctx.fillRect(0, 0, w, h);
|
|
@@ -19038,6 +21321,41 @@ function createDesignFace(data, side2, portrait2, images, channel) {
|
|
|
19038
21321
|
return canvas2;
|
|
19039
21322
|
}
|
|
19040
21323
|
|
|
21324
|
+
// ../renderer/src/sticker-outline.ts
|
|
21325
|
+
function measureStickerOutline(pixels, width, height) {
|
|
21326
|
+
let left = width;
|
|
21327
|
+
let right = -1;
|
|
21328
|
+
let top = height;
|
|
21329
|
+
let bottom = -1;
|
|
21330
|
+
const boundary = [];
|
|
21331
|
+
const solid = (x, y) => x >= 0 && y >= 0 && x < width && y < height && pixels[(y * width + x) * 4 + 3] > 20;
|
|
21332
|
+
for (let y = 0; y < height; y++) {
|
|
21333
|
+
for (let x = 0; x < width; x++) {
|
|
21334
|
+
if (!solid(x, y)) continue;
|
|
21335
|
+
left = Math.min(left, x);
|
|
21336
|
+
right = Math.max(right, x);
|
|
21337
|
+
top = Math.min(top, y);
|
|
21338
|
+
bottom = Math.max(bottom, y);
|
|
21339
|
+
if (!solid(x - 1, y) || !solid(x + 1, y) || !solid(x, y - 1) || !solid(x, y + 1))
|
|
21340
|
+
boundary.push([(x + 0.5) / width * 2 - 1, 1 - (y + 0.5) / height * 2]);
|
|
21341
|
+
}
|
|
21342
|
+
}
|
|
21343
|
+
if (right < left) return { center: [0, 0], scale: 1, size: [2, 2], points: [] };
|
|
21344
|
+
const center = [
|
|
21345
|
+
(left + right + 1) / width - 1,
|
|
21346
|
+
1 - (top + bottom + 1) / height
|
|
21347
|
+
];
|
|
21348
|
+
const w = (right - left + 1) / width;
|
|
21349
|
+
const h = (bottom - top + 1) / height;
|
|
21350
|
+
const scale = 1 / Math.max(w, h);
|
|
21351
|
+
return {
|
|
21352
|
+
center,
|
|
21353
|
+
scale,
|
|
21354
|
+
size: [w * 2 * scale, h * 2 * scale],
|
|
21355
|
+
points: boundary.map(([x, y]) => [(x - center[0]) * scale, (y - center[1]) * scale])
|
|
21356
|
+
};
|
|
21357
|
+
}
|
|
21358
|
+
|
|
19041
21359
|
// ../renderer/src/sticker.ts
|
|
19042
21360
|
var clamp = (value, min = 0, max2 = 1) => Math.min(max2, Math.max(min, value));
|
|
19043
21361
|
function hash(value) {
|
|
@@ -19046,7 +21364,7 @@ function hash(value) {
|
|
|
19046
21364
|
n = Math.imul(n ^ n >>> 16, 73244475);
|
|
19047
21365
|
return ((n ^ n >>> 16) >>> 0) / 4294967295;
|
|
19048
21366
|
}
|
|
19049
|
-
function
|
|
21367
|
+
function rainbow(hue) {
|
|
19050
21368
|
return [0, 2 / 3, 1 / 3].map(
|
|
19051
21369
|
(offset) => Math.round(160 + 88 * Math.cos((hue + offset) * Math.PI * 2))
|
|
19052
21370
|
);
|
|
@@ -19087,19 +21405,26 @@ function plate2(width, height) {
|
|
|
19087
21405
|
if (!ctx) throw new Error("Your browser could not prepare the sticker canvas.");
|
|
19088
21406
|
return { canvas: canvas2, ctx };
|
|
19089
21407
|
}
|
|
19090
|
-
function prepareSticker(art, material) {
|
|
21408
|
+
function prepareSticker(art, material, optical) {
|
|
19091
21409
|
const { width, height } = art;
|
|
19092
21410
|
const surface = plate2(width, height);
|
|
19093
21411
|
const mask = plate2(width, height);
|
|
19094
21412
|
const coating = plate2(width, height);
|
|
19095
21413
|
const reverse = plate2(width, height);
|
|
21414
|
+
const preview = plate2(width, height);
|
|
21415
|
+
const effects = plate2(width, height);
|
|
19096
21416
|
const source = art.getContext("2d")?.getImageData(0, 0, width, height);
|
|
19097
21417
|
if (!source) throw new Error("The sticker artwork could not be read.");
|
|
19098
21418
|
const contour = stickerContour(source.data, width, height);
|
|
19099
21419
|
const pixels = surface.ctx.createImageData(width, height);
|
|
19100
21420
|
const maskPixels = mask.ctx.createImageData(width, height);
|
|
21421
|
+
const previewPixels = preview.ctx.createImageData(width, height);
|
|
21422
|
+
const effectPixels = effects.ctx.createImageData(width, height);
|
|
19101
21423
|
const flakes = [];
|
|
19102
21424
|
const { seed, finish, border, sparkle } = material;
|
|
21425
|
+
const holography = material.holography ?? (finish === "vinyl" ? 0 : finish === "holographic" ? 1 : 0.4);
|
|
21426
|
+
const glitter = material.stock || finish !== "vinyl" ? sparkle : 0;
|
|
21427
|
+
const authored = optical?.canvas.getContext("2d")?.getImageData(0, 0, width, height).data;
|
|
19103
21428
|
for (let y = 0; y < height; y++)
|
|
19104
21429
|
for (let x = 0; x < width; x++) {
|
|
19105
21430
|
const i = y * width + x;
|
|
@@ -19110,37 +21435,61 @@ function prepareSticker(art, material) {
|
|
|
19110
21435
|
const r = hash(i + seed);
|
|
19111
21436
|
const crystal = hash(Math.floor(x / 2) + Math.floor(y / 2) * 997 + seed);
|
|
19112
21437
|
const hue = crystal * 0.65 + x / width * 0.9 - y / height * 0.45;
|
|
19113
|
-
const colors = finish === "vinyl" ? [249, 247, 242] :
|
|
21438
|
+
const colors = finish === "vinyl" ? [249, 247, 242] : rainbow(hue);
|
|
19114
21439
|
const rim = border > 0 && contour[i] > border - 2.4;
|
|
19115
21440
|
const printed = inkAlpha > 0.1;
|
|
19116
21441
|
const brightness = (source.data[p2] + source.data[p2 + 1] + source.data[p2 + 2]) / 765;
|
|
19117
21442
|
for (let c = 0; c < 3; c++) {
|
|
19118
21443
|
const grain = finish === "glitter" ? (crystal - 0.4) * (printed ? 18 : 110) * sparkle : 0;
|
|
19119
21444
|
const base = rim ? 235 + r * 20 : colors[c] + grain;
|
|
19120
|
-
pixels.data[p2 + c] = clamp((base * (1 - inkAlpha) + (source.data[p2 + c] + grain) * inkAlpha) / 255) * 255;
|
|
21445
|
+
pixels.data[p2 + c] = border === 0 ? source.data[p2 + c] : clamp((base * (1 - inkAlpha) + (source.data[p2 + c] + grain) * inkAlpha) / 255) * 255;
|
|
19121
21446
|
maskPixels.data[p2 + c] = 255;
|
|
21447
|
+
const stock = finish === "vinyl" || rim ? [249, 247, 242] : [202, 207, 218];
|
|
21448
|
+
previewPixels.data[p2 + c] = border === 0 ? source.data[p2 + c] : stock[c] * (1 - inkAlpha) + source.data[p2 + c] * inkAlpha;
|
|
19122
21449
|
}
|
|
19123
21450
|
pixels.data[p2 + 3] = maskPixels.data[p2 + 3] = coverage * 255;
|
|
19124
|
-
|
|
21451
|
+
previewPixels.data[p2 + 3] = effectPixels.data[p2 + 3] = coverage * 255;
|
|
21452
|
+
const foil = 1 - inkAlpha + inkAlpha * brightness ** 3 * 0.42;
|
|
21453
|
+
effectPixels.data[p2] = foil * 255;
|
|
21454
|
+
effectPixels.data[p2 + 1] = (1 - inkAlpha + inkAlpha * (0.08 + brightness * 0.22)) * 255;
|
|
21455
|
+
effectPixels.data[p2 + 2] = inkAlpha * (0.25 + (1 - brightness) * 0.65) * 255;
|
|
21456
|
+
if (authored) {
|
|
21457
|
+
const strength = Math.min(1, authored[p2 + 3] / Math.max(1, coverage * 255));
|
|
21458
|
+
for (let c = 0; c < 3; c++)
|
|
21459
|
+
effectPixels.data[p2 + c] = effectPixels.data[p2 + c] * (1 - strength) + authored[p2 + c] * strength;
|
|
21460
|
+
}
|
|
21461
|
+
if (glitter > 0 && coverage > 0.95 && r > (authored ? 0.965 : printed ? 0.989 : 0.951)) {
|
|
19125
21462
|
flakes.push({
|
|
19126
21463
|
x,
|
|
19127
21464
|
y,
|
|
19128
21465
|
phase: crystal * Math.PI * 2,
|
|
19129
21466
|
size: 0.6 + hash(i + 79) * 1.4,
|
|
19130
|
-
strength: printed ? brightness * 0.58 : 1
|
|
21467
|
+
strength: authored ? Math.max(effectPixels.data[p2 + 1], effectPixels.data[p2] * 0.3) / 255 : printed ? brightness * 0.58 : 1
|
|
19131
21468
|
});
|
|
19132
21469
|
}
|
|
19133
21470
|
}
|
|
19134
21471
|
surface.ctx.putImageData(pixels, 0, 0);
|
|
19135
21472
|
mask.ctx.putImageData(maskPixels, 0, 0);
|
|
19136
|
-
|
|
21473
|
+
preview.ctx.putImageData(previewPixels, 0, 0);
|
|
21474
|
+
effects.ctx.putImageData(effectPixels, 0, 0);
|
|
21475
|
+
const foilMask = authored ? plate2(width, height) : void 0;
|
|
21476
|
+
if (foilMask) {
|
|
21477
|
+
const foil = foilMask.ctx.createImageData(width, height);
|
|
21478
|
+
for (let p2 = 0; p2 < foil.data.length; p2 += 4) {
|
|
21479
|
+
foil.data[p2] = foil.data[p2 + 1] = foil.data[p2 + 2] = 255;
|
|
21480
|
+
foil.data[p2 + 3] = effectPixels.data[p2] * effectPixels.data[p2 + 3] / 255;
|
|
21481
|
+
}
|
|
21482
|
+
foilMask.ctx.putImageData(foil, 0, 0);
|
|
21483
|
+
}
|
|
21484
|
+
reverse.ctx.fillStyle = material.liner ? "#eeece6" : "#e9e3d9";
|
|
19137
21485
|
reverse.ctx.fillRect(0, 0, width, height);
|
|
19138
|
-
reverse.ctx.font = "500 16px sans-serif";
|
|
19139
|
-
reverse.ctx.fillStyle = "#b9b1a5";
|
|
21486
|
+
reverse.ctx.font = material.liner ? '700 25px "Helvetica Neue", Helvetica, Arial, sans-serif' : "500 16px sans-serif";
|
|
21487
|
+
reverse.ctx.fillStyle = material.liner ? "rgba(38, 58, 120, 0.2)" : "#b9b1a5";
|
|
19140
21488
|
reverse.ctx.save();
|
|
19141
21489
|
reverse.ctx.rotate(-0.35);
|
|
19142
21490
|
for (let y = 0; y < height * 1.5; y += 68)
|
|
19143
|
-
for (let x = -width; x < width * 1.5; x +=
|
|
21491
|
+
for (let x = -width; x < width * 1.5; x += material.liner ? 256 : 145)
|
|
21492
|
+
reverse.ctx.fillText(material.liner ?? "makeables", x + Math.floor(y / 68) % 2 * 128, y);
|
|
19144
21493
|
reverse.ctx.restore();
|
|
19145
21494
|
reverse.ctx.globalCompositeOperation = "destination-in";
|
|
19146
21495
|
reverse.ctx.drawImage(mask.canvas, 0, 0);
|
|
@@ -19157,15 +21506,21 @@ function prepareSticker(art, material) {
|
|
|
19157
21506
|
shift + width * 1.1,
|
|
19158
21507
|
height * 0.3
|
|
19159
21508
|
);
|
|
19160
|
-
if (
|
|
21509
|
+
if (holography > 0) {
|
|
19161
21510
|
["#edb2ef", "#aba5ef", "#96daea", "#d6efb0", "#ffe8bb", "#eab7e4", "#a3c6ed"].forEach(
|
|
19162
21511
|
(color3, i) => {
|
|
19163
21512
|
gradient3.addColorStop(i / 6, color3);
|
|
19164
21513
|
}
|
|
19165
21514
|
);
|
|
19166
21515
|
coat.fillStyle = gradient3;
|
|
19167
|
-
coat.globalAlpha = finish === "holographic" ? 0.3 : 0.12;
|
|
21516
|
+
coat.globalAlpha = authored ? holography * 0.3 : finish === "holographic" ? 0.3 : 0.12;
|
|
19168
21517
|
coat.fillRect(0, 0, width, height);
|
|
21518
|
+
if (foilMask) {
|
|
21519
|
+
coat.globalAlpha = 1;
|
|
21520
|
+
coat.globalCompositeOperation = "destination-in";
|
|
21521
|
+
coat.drawImage(foilMask.canvas, 0, 0);
|
|
21522
|
+
coat.globalCompositeOperation = "source-over";
|
|
21523
|
+
}
|
|
19169
21524
|
}
|
|
19170
21525
|
coat.globalAlpha = 1;
|
|
19171
21526
|
const gloss = coat.createLinearGradient(shift - width * 0.5, 0, shift + width, height);
|
|
@@ -19177,7 +21532,7 @@ function prepareSticker(art, material) {
|
|
|
19177
21532
|
gloss.addColorStop(1, "#ffffff00");
|
|
19178
21533
|
coat.fillStyle = gloss;
|
|
19179
21534
|
coat.fillRect(0, 0, width, height);
|
|
19180
|
-
if (
|
|
21535
|
+
if (glitter > 0) {
|
|
19181
21536
|
coat.fillStyle = "#ffffff";
|
|
19182
21537
|
for (const flake of flakes) {
|
|
19183
21538
|
const facing = Math.cos(flake.phase + light.x * 6 + light.y * 4);
|
|
@@ -19206,12 +21561,86 @@ function prepareSticker(art, material) {
|
|
|
19206
21561
|
surface: surface.canvas,
|
|
19207
21562
|
reverse: reverse.canvas,
|
|
19208
21563
|
mask: mask.canvas,
|
|
21564
|
+
preview: preview.canvas,
|
|
21565
|
+
effects: effects.canvas,
|
|
21566
|
+
effectTexel: optical?.texel ?? [1 / width, 1 / height],
|
|
21567
|
+
outline: measureStickerOutline(maskPixels.data, width, height),
|
|
19209
21568
|
material: { ...material },
|
|
19210
21569
|
width,
|
|
19211
21570
|
height
|
|
19212
21571
|
};
|
|
19213
21572
|
}
|
|
19214
21573
|
|
|
21574
|
+
// ../renderer/src/sticker-effects.ts
|
|
21575
|
+
async function createStickerEffects(data, images, renderIsolated) {
|
|
21576
|
+
const design2 = data.document;
|
|
21577
|
+
const material = design2?.sticker;
|
|
21578
|
+
if (!design2 || !material?.effectMap && !Object.keys(material?.regions ?? {}).length)
|
|
21579
|
+
return void 0;
|
|
21580
|
+
const canvas2 = document.createElement("canvas");
|
|
21581
|
+
canvas2.width = canvas2.height = 1024;
|
|
21582
|
+
const context = canvas2.getContext("2d");
|
|
21583
|
+
if (!context) throw new Error("Could not prepare optical channels.");
|
|
21584
|
+
const texel = [1 / 1024, 1 / 1024];
|
|
21585
|
+
for (const layer of design2.front.layers) {
|
|
21586
|
+
if (layer.visible === false) continue;
|
|
21587
|
+
const isolated = {
|
|
21588
|
+
...design2,
|
|
21589
|
+
front: { ...design2.front, background: "#00000000", layers: [layer] }
|
|
21590
|
+
};
|
|
21591
|
+
const alpha = layer.kind === "svg" ? await renderIsolated(isolated) : createDesignFace({ ...data, document: isolated }, "front", void 0, images);
|
|
21592
|
+
const region = material?.regions?.[layer.id];
|
|
21593
|
+
const binding = material?.effectMap;
|
|
21594
|
+
let optical;
|
|
21595
|
+
if (binding?.layer === layer.id && layer.kind === "image") {
|
|
21596
|
+
const map = images.get(binding.asset);
|
|
21597
|
+
const artwork = images.get(layer.asset);
|
|
21598
|
+
if (!map || !artwork) throw new Error("The optical map or its artwork is missing.");
|
|
21599
|
+
const registered = document.createElement("canvas");
|
|
21600
|
+
registered.width = artwork.width;
|
|
21601
|
+
registered.height = artwork.height;
|
|
21602
|
+
registered.getContext("2d")?.drawImage(map, 0, 0, artwork.width, artwork.height);
|
|
21603
|
+
const mapped = new Map(images);
|
|
21604
|
+
mapped.set(layer.asset, registered);
|
|
21605
|
+
optical = createDesignFace(
|
|
21606
|
+
{
|
|
21607
|
+
...data,
|
|
21608
|
+
document: {
|
|
21609
|
+
...isolated,
|
|
21610
|
+
front: { ...isolated.front, layers: [{ ...layer, opacity: 1 }] }
|
|
21611
|
+
}
|
|
21612
|
+
},
|
|
21613
|
+
"front",
|
|
21614
|
+
void 0,
|
|
21615
|
+
mapped
|
|
21616
|
+
);
|
|
21617
|
+
const scale = layer.fit === "contain" ? Math.min(layer.w / artwork.width, layer.h / artwork.height) : Math.max(layer.w / artwork.width, layer.h / artwork.height);
|
|
21618
|
+
texel[0] = artwork.width * scale / map.width / 1024;
|
|
21619
|
+
texel[1] = artwork.height * scale / map.height / 1024;
|
|
21620
|
+
} else if (region) {
|
|
21621
|
+
optical = document.createElement("canvas");
|
|
21622
|
+
optical.width = optical.height = 1024;
|
|
21623
|
+
const fill = optical.getContext("2d");
|
|
21624
|
+
if (fill) {
|
|
21625
|
+
fill.fillStyle = `rgb(${region.foil * 255}, ${region.glitter * 255}, ${region.relief * 255})`;
|
|
21626
|
+
fill.fillRect(0, 0, 1024, 1024);
|
|
21627
|
+
}
|
|
21628
|
+
}
|
|
21629
|
+
if (optical) {
|
|
21630
|
+
const mask = optical.getContext("2d");
|
|
21631
|
+
if (!mask) throw new Error("Could not mask optical channels.");
|
|
21632
|
+
mask.globalCompositeOperation = "destination-in";
|
|
21633
|
+
mask.drawImage(alpha, 0, 0);
|
|
21634
|
+
context.globalCompositeOperation = "source-over";
|
|
21635
|
+
context.drawImage(optical, 0, 0);
|
|
21636
|
+
} else {
|
|
21637
|
+
context.globalCompositeOperation = "destination-out";
|
|
21638
|
+
context.drawImage(alpha, 0, 0);
|
|
21639
|
+
}
|
|
21640
|
+
}
|
|
21641
|
+
return { canvas: canvas2, texel };
|
|
21642
|
+
}
|
|
21643
|
+
|
|
19215
21644
|
// ../renderer/src/node.ts
|
|
19216
21645
|
function installCanvasGlobals() {
|
|
19217
21646
|
const scope = globalThis;
|
|
@@ -19235,8 +21664,8 @@ var badgeFontFiles = [
|
|
|
19235
21664
|
];
|
|
19236
21665
|
function registerBadgeFonts(root) {
|
|
19237
21666
|
for (const [family, file] of badgeFontFiles) {
|
|
19238
|
-
const
|
|
19239
|
-
if (existsSync2(
|
|
21667
|
+
const path2 = join2(root, file);
|
|
21668
|
+
if (existsSync2(path2) && !GlobalFonts.has(family)) GlobalFonts.registerFromPath(path2, family);
|
|
19240
21669
|
}
|
|
19241
21670
|
}
|
|
19242
21671
|
async function renderBadgeFacePng(input) {
|
|
@@ -19279,9 +21708,27 @@ async function renderStickerPng(input) {
|
|
|
19279
21708
|
const canvas2 = createCanvas(artwork.width, artwork.height);
|
|
19280
21709
|
const context = canvas2.getContext("2d");
|
|
19281
21710
|
context.drawImage(artwork, 0, 0);
|
|
21711
|
+
const images = new Map(
|
|
21712
|
+
await Promise.all(
|
|
21713
|
+
Object.entries(input.images ?? {}).map(
|
|
21714
|
+
async ([id, bytes]) => [id, await loadImage(bytes)]
|
|
21715
|
+
)
|
|
21716
|
+
)
|
|
21717
|
+
);
|
|
21718
|
+
const effects = await createStickerEffects(
|
|
21719
|
+
{ ...input.person, document: input.design, eventName: input.design.event, portraitUrl: "" },
|
|
21720
|
+
images,
|
|
21721
|
+
async (design2) => {
|
|
21722
|
+
const image2 = await loadImage(await renderBadgeFacePng({ ...input, design: design2, side: "front" }));
|
|
21723
|
+
const isolated = createCanvas(image2.width, image2.height);
|
|
21724
|
+
isolated.getContext("2d").drawImage(image2, 0, 0);
|
|
21725
|
+
return isolated;
|
|
21726
|
+
}
|
|
21727
|
+
);
|
|
19282
21728
|
const sticker = prepareSticker(
|
|
19283
21729
|
canvas2,
|
|
19284
|
-
input.design.sticker ?? defaultStickerMaterial
|
|
21730
|
+
input.design.sticker ?? defaultStickerMaterial,
|
|
21731
|
+
effects
|
|
19285
21732
|
);
|
|
19286
21733
|
sticker.draw(context);
|
|
19287
21734
|
return canvas2.toBuffer("image/png");
|
|
@@ -19342,13 +21789,13 @@ function setBadgeLayer(design2, face2, id, changes) {
|
|
|
19342
21789
|
if (!merged.success) throw new InputError(issues(merged.error));
|
|
19343
21790
|
const next = merged.data;
|
|
19344
21791
|
layers[index] = next.kind === "card-mark" ? cardMarkLayer(next.id, next) : next;
|
|
19345
|
-
return parseBadge({ ...design2, [face2]: { ...design2[face2], layers } });
|
|
21792
|
+
return parseBadge(pruneAssets({ ...design2, [face2]: { ...design2[face2], layers } }));
|
|
19346
21793
|
}
|
|
19347
21794
|
function removeBadgeLayer(design2, face2, id) {
|
|
19348
21795
|
const layers = design2[face2].layers.filter((layer) => layer.id !== id);
|
|
19349
21796
|
if (layers.length === design2[face2].layers.length)
|
|
19350
21797
|
throw new InputError(`No ${face2} layer with id ${id}. Run makeables layer list.`);
|
|
19351
|
-
return parseBadge({ ...design2, [face2]: { ...design2[face2], layers } });
|
|
21798
|
+
return parseBadge(pruneAssets({ ...design2, [face2]: { ...design2[face2], layers } }));
|
|
19352
21799
|
}
|
|
19353
21800
|
async function renderBadge(design2, options) {
|
|
19354
21801
|
const root = badgeAssets();
|
|
@@ -19364,7 +21811,13 @@ async function renderBadge(design2, options) {
|
|
|
19364
21811
|
const stickers = cardAssets().stickers;
|
|
19365
21812
|
const canvas2 = designProfile(design2);
|
|
19366
21813
|
for (const [id, asset] of Object.entries(design2.assets ?? {}))
|
|
19367
|
-
images[id] = asset.source === "petdex" ? await readFile2(join3(stickers, "petdex", `${asset.slug}.webp`)) : asset.source === "
|
|
21814
|
+
images[id] = asset.source === "petdex" ? await readFile2(join3(stickers, "petdex", `${asset.slug}.webp`)) : asset.source === "sticker" ? await readFile2(
|
|
21815
|
+
join3(
|
|
21816
|
+
stickers,
|
|
21817
|
+
asset.collection,
|
|
21818
|
+
`${asset.slug}${asset.file === "effects" ? "-fx" : ""}.webp`
|
|
21819
|
+
)
|
|
21820
|
+
) : asset.source === "gallery" ? (
|
|
19368
21821
|
// Skia drops images embedded in SVG, so gallery artwork is rasterized with librsvg.
|
|
19369
21822
|
await sharp2(await readFile2(join3(cardAssets().designs, asset.slug, "artwork.svg"))).resize(canvas2.width, canvas2.height, { fit: "fill" }).png().toBuffer()
|
|
19370
21823
|
) : Buffer.from(asset.data.slice(asset.data.indexOf(",") + 1), "base64");
|
|
@@ -19663,8 +22116,8 @@ var credentialsSchema = z7.object({
|
|
|
19663
22116
|
function coordinatedCredentials(store, site, directory = join4(homedir(), ".config", "makeables", "credential-locks")) {
|
|
19664
22117
|
async function mutate(work) {
|
|
19665
22118
|
await mkdir(directory, { recursive: true, mode: 448 });
|
|
19666
|
-
const
|
|
19667
|
-
const release = await lock(
|
|
22119
|
+
const path2 = join4(directory, createHash("sha256").update(editorOrigin(site)).digest("hex"));
|
|
22120
|
+
const release = await lock(path2, {
|
|
19668
22121
|
realpath: false,
|
|
19669
22122
|
stale: 3e4,
|
|
19670
22123
|
update: 5e3,
|
|
@@ -19729,9 +22182,9 @@ async function responseJson(response) {
|
|
|
19729
22182
|
}
|
|
19730
22183
|
return value;
|
|
19731
22184
|
}
|
|
19732
|
-
async function cloudRequest(site,
|
|
22185
|
+
async function cloudRequest(site, path2, token, body, operation) {
|
|
19733
22186
|
return responseJson(
|
|
19734
|
-
await fetch(`${editorOrigin(site)}/api/community/cli${
|
|
22187
|
+
await fetch(`${editorOrigin(site)}/api/community/cli${path2}`, {
|
|
19735
22188
|
method: body === void 0 ? "GET" : "POST",
|
|
19736
22189
|
headers: {
|
|
19737
22190
|
...token ? { Authorization: `Bearer ${token}` } : {},
|
|
@@ -19952,8 +22405,11 @@ var design_default = '# Art direction, with room to invent\n\nThe catalog is a r
|
|
|
19952
22405
|
// skill-data/images.md
|
|
19953
22406
|
var images_default = '# Makeables images\n\nLocal reference tools need no generation service, account or repository checkout.\nUse these when `cards` needs measured geometry, preparation or selective tracing.\nParameters are a JSON object (or `@file`) passed through `--params`. Outputs use\nnew paths; originals are never overwritten. Read each generated preview.\n\n```sh\nmakeables image detect --file reference.png\nmakeables image prepare --file reference.png --out prepared --params \'{"crop":"20,30,1000,630","patch":["80,80,120,80,300,80,6,0"]}\'\nmakeables image trace --file prepared --out card.svg --params \'{"title":"My card","credit":"Source and author","tones":7}\'\nmakeables image sample --file reference.png --params \'{"points":["20,30","100,80"]}\'\nmakeables image measure --file reference.png --params \'{"rows":"100,200","cols":"80","dark":250}\'\nmakeables image map --file reference.png --params \'{"box":"10,20,100,80","colors":6}\'\nmakeables image glyphs --file reference.png --out glyph.svg --params \'{"box":"20,30,200,80","at":"100,200","fill":"#111111"}\'\nmakeables image rotate --file portrait.svg --out card.svg --params \'{"top":"left"}\'\nmakeables image compare --file card.svg --ref reference.png --out compare.png --params \'{"upright":"left","ref-box":"20,30,756,1200"}\'\nmakeables validate --file card.svg --out preview.png\n```\n\n`detect` suggests crop regions; inspect the image rather than trusting the\nheuristic. `prepare` uses source-pixel coordinates, crops near the 1200:756 ratio,\npatches from the untouched source and fills background at the crop border.\nA patch is `destinationX,destinationY,width,height,sourceX,sourceY,feather,flop`;\nonly remove details the user wants removed. Compare every patched area closely.\nOptional `edge-band` and `bg-tol` tune edge cleanup. A substantially different\ncrop ratio is rejected to avoid stretching; rotate portrait objects instead.\n\n`trace` uses 2\u201312 luminance bands and optional `ink` threshold (0\u20131). `raster:true`\nkeeps the prepared image under vector ink. Tracing and `glyphs` require the\noptional `potrace` executable; `makeables doctor` checks it. Install it only\nwithin the user\'s installation authorization (macOS: `brew install potrace`).\nOther operations do not need potrace. No automatic package install occurs.\n\n`sample` returns a local 3\xD73 color average and center pixel. `measure` returns\ndark runs in rows/columns; use these for borders, stroke slopes and barcodes.\n`map` produces a color legend and a small pixel map (at most 160 \xD7 200).\nFor flat reference objects, use measured shapes, shared geometry and original\ntext; trace unusual glyphs selectively. Keep counters with even-odd fill. Draw\nportrait objects upright, retain proportions, then rotate the entire card.\n\nWeb research is optional and uses tools available in the current agent session.\nPrefer official sources for assets and provenance, use community sources for\ncontext, and do not bypass bot checks or invent permission. Preserve attribution\nand distinguish an unofficial colorway from a documented variant. Respect no-web\nrequests; these CLI tools operate on local inputs.\n\n## Optional image generation\n\nUse this after the user chooses generation or requests a change that needs new image content. A style reference alone does not authorize transforming the portrait. Honor an original-photo or filters-only choice; editable monochrome, tint, thermal, crop and other native treatments do not require ai-cli.\n\nDistinguish transforming the person\'s photo from generating separate decorative artwork. A portrait transformation needs the actual portrait, not just the style reference. Keep the person\'s identity, framing, pose and proportions. For separate artwork, leave the portrait unchanged unless the user also requested its transformation.\n\nCheck `makeables doctor --json`. If ai-cli is missing, ask whether to install it for the requested transformation, then run:\n\n```sh\nnpm install --global ai-cli\nai image --help\nai models --type image --json\n```\n\nUse the installed CLI\'s setup instructions for the user\'s AI Gateway credentials. Never put keys in chat, files, prompts, page storage, WebMCP arguments or the session URL. Explain that generation sends the selected source images to an external provider and uses Gateway credits separately from the coding agent\'s subscription. Confirm that processing and spending if not already authorized. If declined, offer the original photo or editable filters and continue with the user\'s choice.\n\nUse the original local photo where available. To transform the current editor photo instead:\n\n```sh\nmakeables studio call badge_get_image --url "$MAKEABLES_URL" --params \'{"target":"portrait"}\' --json > portrait-response.json\nmakeables image extract --file portrait-response.json --out portrait.webp\n```\n\nThe extraction helper also accepts agent-browser\'s WebMCP JSON envelope and refuses to overwrite files. Keep image bytes out of the conversation.\n\nChoose a currently available model that accepts reference images. Verify the installed `ai image --help` flags, then use a prompt tailored to the design:\n\n```sh\nai image -m "$BADGE_IMAGE_MODEL" -i portrait.webp --output transformed.png --json \\\n "Transform only the supplied portrait into detailed pixel art. Preserve this person, head-and-shoulders framing, pose and proportions. No typography and no invented body."\n```\n\nFor a cutout, request background removal explicitly and inspect whether the output has real alpha. An opaque background is not transparency. Do not report an image as transformed if generation failed; keep the original and explain the failure.\n\nImport the result using a fresh state:\n\n```sh\nmakeables studio call badge_inspect --url "$MAKEABLES_URL" --params \'{"section":"state"}\' --json > state.json\nmakeables image params --file transformed.png --state state.json > image-params.json\nmakeables studio call badge_set_image --url "$MAKEABLES_URL" --params @image-params.json --json\n```\n\nFor artwork, add an image layer first, then pass `--target artwork` to `image params`. Inspect the resulting badge on both faces. Original and generated images stay separate so the user can return to the photograph.\n';
|
|
19954
22407
|
|
|
22408
|
+
// skill-data/sticker-art-direction.md
|
|
22409
|
+
var sticker_art_direction_default = '# Sticker art direction\n\nLoad this with `stickers` before creating or adapting a sticker. The studio\'s\nAnn Nguyen \xB7 TypingMind collection is the visual quality reference. The target is\nits considered illustration, typography and physical finish, with a new subject\nand its own identity. Do not paste TypingMind\'s name, slogans or signature into\nan unrelated design. Preserve every supplied creator credit.\n\n## The visual language\n\nStart with **one collectible object or one great typographic composition**:\na locket, a fizzy can, a tiny computer disaster, a keepsake from a place.\nThe idea should be recognizable as a silhouette before the text is read.\nGive it a particular personality, not a generic decorative container.\n\nLettering is part of the drawing. Use a confident, tightly composed hierarchy:\none large phrase, a supporting line, then small details. Chunky inked lettering,\nsoft corners and gently irregular spacing can feel human. Avoid stacking\nunrelated default-font labels in rectangles. Small type is a reward, not the\nmain story. Preserve supplied wording, accents, punctuation and intentional jokes.\n\nChoose a small palette for the subject. Warm cream, near-black contour and two\nor three intentional accents are a useful starting point, not a mandatory rainbow.\nThe reference collection has distinct personalities: silver/pink enamel,\nsunset vinyl, blue-violet energy, pastel vessels, oil-slick black. A family can\nshare craft and material quality without making every sticker the same color.\n\nUse five to seven major shapes and generous calm areas. Aim for mostly clean\nsolid color, smooth near-black contours and only broad, restrained shading.\nSimplify the scene before adding anything. Small type should never compete with\nthe main phrase. Zero to two supporting details are enough. Do not prescribe\nengraving, crosshatching, distressing, ceramic speckles, intricate scenery,\nmetallic bevels or decorative filler. A simpler drawing with good proportions\nis better than a crowded, over-rendered illustration. The live shader supplies\nreflections and glitter; do not bake that noise across the printed image.\n\nLet the materials explain the object. Keep dark outlines and most text solid;\nuse foil on a rim or metal hardware, glitter in selected highlights, raised ink\non enamel and lettering, gloss on glass, matte where the print should stay soft.\nThe white-vinyl designs should be just as considered as the holographic ones.\nFinish the real alpha edge cleanly, with intentional negative holes and enough\nspace around the complete die-cut shape.\n\n## Adapt an existing submission\n\n1. Read its editable package and inspect both its flat artwork and live material.\n Record exact text, logo geometry, concept, creator, submission ID and source\n bytes. Save the original package before revising.\n2. Write a direction specific to that object: what becomes the silhouette, what\n leads the typography, the palette, at most two supporting details, and where the\n material is allowed to shine. State the invariants before generating anything.\n3. Edit native vectors/text when that gives the best result. Use image generation\n for richer illustration when available and authorized. Give the current art\n as the edit target and two or three actual original collection images as visual\n references. Attach the image bytes: mentioning an artist or a URL in text is\n insufficient. Label each image\'s role. Compare against these same references\n after generating. Do not ask for a vague "make it premium".\n Use the original vector logo over the generated illustration when exact brand\n geometry matters; image models can distort even a clearly supplied mark.\n4. Keep the source document and original layers. If an illustrated replacement is\n raster, retain the original layers hidden with clear names; do not claim its\n baked lettering is independently editable. Keep the new artwork and optical\n map as distinct assets so finish changes never repaint the illustration.\n5. Use `material map` or native `regions`. Inspect the actual live reflection and\n separate surfaces. A still illustration with a sparkly border is insufficient.\n6. Compare at 64 px, normal editor size and enlarged. Reopen the portable package,\n test its alpha edge on light/dark backgrounds and test next/peel/layers on mobile.\n Preserve the public submission identity and creator when revising a publication.\n\n## Prompt scaffold\n\nReplace every bracket. Be specific about the object; keep the optical directions\nconsistent with the map you will author.\n\n> Use case: style-transfer for a printable die-cut collectible sticker.\n> Image 1 is the edit target: preserve [concept, identity, exact logo, exact text].\n> Images 2\u20134 are visual references for illustration, typography and material craft\n> only; do not copy their text or brands.\n> Direction: [one sentence with the distinctive object/story].\n> Silhouette/composition: [outline, visual center, lettering placement].\n> Typography: [large phrase, supporting text, tiny detail; custom visual character].\n> Palette: [warm/cool base, outline, 2\u20133 accents tied to the subject].\n> Restraint: five to seven major shapes, mostly clean solid color, generous calm\n> areas, smooth contours, at most two supporting details. Simplify, do not embellish.\n> Material hierarchy: [solid ink], [foil regions], [glitter accents], [raised ink],\n> [gloss or matte]. Keep text legible; do not apply sparkle uniformly.\n> Text verbatim: "[exact text including punctuation and accents]".\n> Flat head-on artwork, complete silhouette with generous margin, no perspective,\n> cast shadow, backdrop, mockup, watermark or surrounding labels. Real transparent\n> alpha when supported. If the selected model cannot output alpha, request a\n> strictly uniform chroma background absent from the artwork, extract a clean\n> alpha matte and inspect fine edges before importing.\n> Avoid: generic vector clipart, default-font plaques, random decoration, inflated\n> balloon shapes, engraving, distressing, crosshatching, intricate scenery,\n> extra ornaments, thick metallic bevels, noise, illegible letters, a white\n> rectangular background, baked stage\n> lighting, copied reference branding.\n\nFor AI Gateway, use the user\'s authorized key in the process environment; never\nstore it in a document, prompt, repository, log or frontend. GPT Image 2 is\navailable through Gateway\'s OpenAI-compatible image generation/edit endpoints.\nUse the environment\'s image-generation workflow rather than installing an\nunrelated provider. Keep the generation prompt and model with the local revision.\nDo not infer that image generation also produced a correctly registered FX map.\n\n## Get the real reference images\n\nRequires Makeables **0.6.0 or newer**. The shared catalog contains nine unchanged\nAnn Nguyen \xB7 TypingMind originals and three revised Community examples. Pick\nreferences by composition: `absolutely-right` for type, `youre-cooked` for a\nsimple comic object, `emotional-support` for a pastel vessel, `cmd-enter` for\nenamel, `energy` for a can, `agi-is-coming` for an illustrated scene.\n\nTheir original artwork is served at\n`https://makeables.dev/stickers/typingmind/<slug>.webp`; the authored numeric\nmap is `<slug>-fx.webp`. Download the artwork for the authorized generation\nrequest, inspect it, then attach those actual files as reference inputs. Never\nsend the RGB optical map as a style image. The CLI also bundles these files\nunder `dist/assets/stickers/typingmind/` for offline use.\n\nThe three Community examples retain their original editable layers hidden; their\nnew illustration and optical map are separate bitmap assets. Reuse their material\nsetup without claiming that lettering baked into a bitmap is editable text.\n\n## Optical recipe\n\n`red = foil`, `green = glitter`, `blue = height/relief`. Use a PNG or lossless WebP.\nA map is numeric data, not a pretty colored preview. Keep it registered to the\nwhole artwork, including transparent padding. Its black areas are plain print.\n\n| Region | Foil | Glitter | Relief |\n| --- | ---: | ---: | ---: |\n| Dark contour / small print | 0\u20130.05 | 0 | 0.3\u20130.65 |\n| Colored enamel / large lettering | 0.05\u20130.2 | 0.02\u20130.15 | 0.6\u20130.9 |\n| Exposed silver rim | 0.85\u20131 | 0.45\u20131 | 0.35\u20130.55 |\n| Glass or ceramic face | 0.05\u20130.15 | 0\u20130.08 | 0.2\u20130.45 |\n| Selected foil highlight | 0.65\u20131 | 0.2\u20130.5 | 0.4\u20130.7 |\n\nThese are starting ranges. Inspect at multiple angles before accepting them.\nUse `border: 0` for an already finished die-cut edge, `flakes: 170` as a reference\nscale, and modest relief. Too much relief makes flat print appear melted.\n\n```sh\nmakeables material map --file sticker.json --id artwork --ref optical.png\nmakeables material set --file sticker.json --params \'{"border":0,"holography":0.9,"sparkle":0.8,"gloss":1,"relief":0.5,"flakes":170,"stock":"holo-glitter","laminate":"gloss"}\'\nmakeables material set --file sticker.json --params \'{"regions":{"lettering":{"foil":0.08,"glitter":0.04,"relief":0.8}}}\'\n```\n\n## Acceptance before showing the result\n\n- The concept reads immediately at thumbnail size and is recognizably the user\'s.\n- All text and the logo are correct. No accidental reference branding appears.\n- The silhouette, letter spacing and supporting details feel deliberately drawn.\n- Foil/glitter are selective; ink remains readable during tilt.\n- The outline is clean on white and near-black, without a chroma halo or cut-off tips.\n- The same live material engine works in the editor, with pause, reduced motion,\n shuffle, curl, completed peel and separated layers.\n- Original layers/credits and both artwork/FX assets survive save/export/reopen.\n\nIf a check fails, make the smallest focused revision and inspect again.\nDo not guarantee taste from a prompt alone; the reference comparison and iteration\nare part of the workflow.\n';
|
|
22410
|
+
|
|
19955
22411
|
// skill-data/stickers.md
|
|
19956
|
-
var stickers_default = '# Makeables stickers\n\nStickers are the third profile of the shared design document: `product: "sticker"`,\na transparent 1024 \xD7 1024 canvas, and editable text, shapes, vectors and images.\nNo photo or personal information is required.\n\n```sh\nmakeables styles list --product sticker\nmakeables new sticker --style
|
|
22412
|
+
var stickers_default = '# Makeables stickers\n\nStickers are the third profile of the shared design document: `product: "sticker"`,\na transparent 1024 \xD7 1024 canvas, and editable text, shapes, vectors and images.\nNo photo or personal information is required. Before designing or adapting, also\nload `makeables skills get sticker-art-direction` for the visual language, prompt\nscaffold, material recipes and quality review.\n\n```sh\nmakeables styles list --product sticker\nmakeables new sticker --style typingmind-absolutely-right --out sticker.json\nmakeables layer set --file sticker.json --id artwork --params \'{"x":100,"y":100,"w":824,"h":824,"rotation":-5}\'\nmakeables material set --file sticker.json --params \'{"finish":"glitter","border":18,"sparkle":0.72,"gloss":0.5}\'\nmakeables render --file sticker.json --out artwork.png\n```\n\n`render` produces the flat artwork. Follow the core guide\'s preview order: embedded MCP App, built-in browser,\nthen CLI + inline PNG. The MCP preview includes the die-cut material. In the\nbuilt-in browser, open `/make/sticker` and import the same JSON. Use the shared Design Studio\'s PNG action\nfor a transparent PNG including the border, glitter and coating. PNG exports\nexclude the stage shadow, tilt and peel. Export JSON preserves editable layers,\nmaterial settings and embedded images. Save keeps the document in that browser.\n\nFinishes: `glitter`, `holographic`, `vinyl`. Border is 0\u201340 canvas pixels,\nsparkle is 0\u20131, gloss is 0\u20131.5, and the integer seed fixes the crystal positions.\nThe interactive preview is a flexible mesh: pointer movement changes studio\nreflections, dragging the center bends the sheet, and dragging a corner rolls\nthe paper reverse into view. Tap the sticker to advance. Flick horizontally to advance or go back. A complete\ncorner pull peels it away into the next sticker; an incomplete pull springs back.\nThe toolbar\u2019s Peel sticker action holds a peel. Glitter crystals keep their positions while their reflections change;\nholographic stock shifts with the light. Pause and reduced-motion preferences\nstop continuous motion. Pause still permits direct dragging; reduced motion keeps\npointer effects static. The preview frames the actual die-cut silhouette, and\nhovering an outer corner lifts it slightly before a drag. Devices without WebGL2\nretain a static material preview.\n\nThe bottom dock selects the same editable styles as the sidebar and retains the\nmost recently loaded community or imported sticker. Each style\nremembers its edits during this studio session; selecting the active thumbnail\ndoes not reset it. Save retains a version in the shared local library. The dock\'s\nMaterial layers control (or `L` while previewing, outside a text field) separates\nsix preview surfaces with a spring animation:\nlaminate, laminate adhesive, ink, stock, adhesive and liner. These describe the\nvisual material, not a manufacturing specification. Focus preview hides the\nside panels; Escape or the focus control brings them back. Save, PNG and Submit\nremain in the same studio. None of these view changes changes the document.\n\nThe sidebar gallery includes nine credited Ann Nguyen \xB7 TypingMind originals with\nunchanged artwork and authored optical maps, plus three refined Community designs\nwith their original source layers retained. All twelve are available in the sidebar,\ndock and offline CLI catalog. Search or filter by finish. The retired\nMakeables lettering presets are no longer offered. For imported artwork, use a\ntransparent PNG/WebP under 2 MB\nand 24 megapixels. Use the same Design Studio as Cards and Badges for layer edits, undo, material\nlocks and versioned local saving. Saved directions appear in the sidebar.\n\n```sh\nmakeables studio start --product sticker --no-open --json\n# Use the returned local session URL for badge_inspect, badge_edit and badge_library.\nmakeables studio save --url "$MAKEABLES_URL" --out sticker.makeables.json --json\nmakeables submit --file sticker.makeables.json --dry-run --json\n```\n\nThe shared studio tools retain their `badge_` names for compatibility. A material\npatch uses `edits.sticker`, for example `{"finish":"glitter","border":24}`.\nThe single editable face is `front`; the paper reverse is a preview interaction.\nDiscover `badge_view` for optional `sticker: {exploded, peeled, focused}` booleans,\nalongside the existing `moving` and `theme` controls. Supply the latest revision\nfrom `badge_inspect`. Exploded and peeled are mutually exclusive, and state reports\nthe active view under `view.sticker`. Exports and submissions always flatten the\nunchanged material document, even while its preview is peeled or separated.\n\nSubmit opens the same `/submit` preview, credit and consent flow as the other\nproducts. Portable packages include one transparent material PNG and editable\nlayers/assets, without participant data. `makeables submit --file sticker.json`\nalso prepares this package directly; `render` remains a flat artwork export.\nAfter the user approves the exact version, submit with `--yes`. A `pending`\nreceipt means admin review, not publication. Approved stickers appear in the\npublic gallery and the studio\'s Community collection and can be reopened for\nediting. Status recovery and author withdrawal use the shared submission service.\n\n\n## Detailed materials, for every sticker\n\nThe same renderer handles originals, imported artwork and generated designs. It uses\nlinear-light shading, HDR glitter reflections, bloom, relief normals and six flexible\nmaterial surfaces. A nice illustration alone is not an optical material: author the\nprint and its surface responses separately.\n\n1. Keep the artwork transparent at 1024 \xD7 1024. Design a clear die-cut silhouette,\n intentional negative space, crisp lettering and generous calm areas. Keep\n editable text/vector layers when creating native artwork. For a supplied original,\n preserve the source image; do not redraw its lettering or flatten away details.\n2. Choose the stock and laminate deliberately. `stock` is `white`, `holographic` or\n `holo-glitter`; `laminate` is `gloss` or `matte`. `holography` and `sparkle` are 0\u20131,\n `relief` is 0\u20131.5, `gloss` is 0\u20131.5, and `flakes` is 40\u2013500 (170 matches the reference).\n Set border to 0 when the supplied artwork already includes its die-cut edge.\n3. Author a lossless RGB map registered to the whole artwork image: red controls foil,\n green glitter, blue relief height. Black is plain print. Keep text readable: solid\n ink often wants little foil, the metallic rim strong foil, selected highlights\n glitter, and printed/enamel forms relief. Values can be graded, not only on/off.\n Half-resolution maps are supported. Keep the artwork\u2019s aspect and orientation.\n4. Bind the map to the artwork image layer, or define optical regions on native layers.\n Maps follow contain/cover, position, rotation, clipping, visibility and alpha.\n Regions follow the current editable geometry. Untagged layers above a mapped layer\n restore automatic material in their covered area. A map on a layer takes precedence\n over that layer\u2019s region. Removing the layer removes its optical binding.\n\n```sh\nmakeables material map --file sticker.json --id artwork --ref optical.png\nmakeables material set --file sticker.json --params \'{"border":0,"stock":"holo-glitter","laminate":"gloss","holography":1,"sparkle":1,"gloss":1,"relief":0.55,"flakes":170}\'\n# Or author regions without rasterizing editable text and vector layers:\nmakeables material set --file sticker.json --params \'{"regions":{"headline":{"foil":0.05,"glitter":0.1,"relief":0.85},"ribbon-pink":{"foil":0.9,"glitter":0.8,"relief":0.35}}}\'\n```\n\n5. Inspect the actual live material, not only a flat PNG: check frontal and tilted\n light, each layer, the rear liner, a partial peel, completed peel, shuffle and curl.\n Pause motion for a stable comparison. Use native browser recordings and contact\n sheets when matching a supplied interaction. Check touch-sized screens, reduced\n motion, transparent edges and preservation of unsaved edits.\n6. Export JSON or a portable package to retain both artwork and optical maps. The\n transparent material PNG is a deterministic flat rendition, without the stage or\n animated reflections. Keep creator credit on every supplied reference asset.\n Credit is attribution, not a new license or proof of rights-holder permission.\n\nDo not promise an arbitrary prompt will automatically reach the reference\u2019s detail.\nBuild the artwork and optical regions intentionally, inspect them, and iterate.\n';
|
|
19957
22413
|
|
|
19958
22414
|
// skill-data/wallet.md
|
|
19959
22415
|
var wallet_default = "# Makeables Wallet\n\nApply or switch the artwork of an existing iPhone Wallet card, or remove a\ncustom design by restoring its original issuer artwork. This changes artwork,\nnot payment credentials or enrollment. It uses experimental, unofficial device\nservices; compatibility depends on iOS. Artwork apply has been tested on a\nWallet card. Restoration of an actual Wallet card is still unverified; state\nthat limitation before the user's first requested device operation.\n\nLoad this guide when the user chooses installation after a card preview, asks\nto change an existing Wallet skin, or asks to restore it. Speak their language.\nCreating or approving a design alone does not authorize a phone write. A\nrequest to apply that exact design authorizes the write once its target is\nestablished; do not add a redundant confirmation.\n\n## Setup and complete artwork\n\nWallet work requires macOS and an iPhone connected over USB, unlocked and\ntrusted. Design/rendering still work on other platforms. Ask only for a missing\nimage or target; never request payment numbers, credentials or raw resource IDs.\n\n```sh\nmakeables wallet doctor\nmakeables wallet setup\n```\n\nSetup downloads a versioned, checksum-verified macOS companion from the public\nMakeables community releases. It includes its Python runtime, native bridges\nand image exporter; a source checkout, Python installation or Xcode is not\nneeded. Reuse the user's existing installation authorization.\n\nUse the saved card JSON, complete SVG, or a flat PNG. For a rendered preview of\nexactly what will be applied:\n\n```sh\nmakeables wallet prep --file card.json --out wallet-preview\n```\n\nOpen `wallet-preview/cardBackgroundCombined@3x.png` and inspect it. The command\nrenders the **entire composition** to opaque 1536 \xD7 969, then prepares the two\nPNGs and PDF. Never extract an SVG's embedded background and discard its vectors.\nKeep chip/logo/details the user requested, check Wallet's lower-left number\narea, and omit account numbers or cardholder names from the artwork. Use\n`--side back` only if that is the selected face. Wallet uses a static image;\nlive shader animation belongs to the studio.\n\n## Select the device and card\n\nTell the user to keep the phone connected, open Wallet, authenticate, and tap\nthe exact card during the scan:\n\n```sh\nmakeables wallet list\n```\n\nThe scan takes up to 45 seconds. Multiple phones produce device selection\nhandles; repeat with `--device d-...`. Cards receive local handles such as\n`c-...`, valid for ten minutes. These identify the cards observed during the\nscan, not an inferred bank or cardholder. If several cards appear, establish\nwhich tapped card the user intended. If redacted or ambiguous, repeat the\nread-only scan; never choose the first resource by default.\n\nReport observable milestones and elapsed time, not invented percentages.\nPreparation is usually 1\u20133 minutes and a device operation roughly 1\u20134 minutes;\nthe connection and iOS can vary. Keep the process alive while it works.\n\n## Apply or switch a design\n\nAfter inspecting the art and establishing the requested target:\n\n```sh\nmakeables wallet apply --file card.json --card c-SELECTION --yes\n```\n\n`--yes` records the user's request for this design on this card. It does not\nauthorize another card or a future design. The helper verifies the connected\ndevice, backs up the original artwork, checks hashes, saves a private visible\ncopy and only then applies the prepared artwork. A copy failure stops the write.\nFor an already customized card, it reuses its verified original instead of\nbacking up the custom skin as though it were the issuer artwork.\n\nTo switch the same card using an established original backup:\n\n```sh\nmakeables wallet backups\nmakeables wallet apply --file next-card.json --backup b-BACKUP --yes\n```\n\nChoose the matching backup explicitly when several exist. A reissued card needs\na fresh selection and original backup. An unresolved earlier operation must be\nrecovered before another apply. Device operations are serialized locally.\n\n## Restore and preserve backups\n\n```sh\nmakeables wallet backups\nmakeables wallet backups --backup \"/absolute/path/to/original-backup\"\nmakeables wallet restore --backup b-BACKUP --yes\n```\n\nRestore verifies the original files and the connected device before writing.\nIt restores issuer artwork, not an intermediate custom design. It does not\ndelete the bank card from Wallet.\n\nOriginal copies live in `~/Documents/Makeables/Wallet Backups/`, with private\noperational state under `~/Library/Application Support/Makeables/Wallet/`.\nThey survive CLI updates and companion reinstalls. Keep both locations private\nand retain originals until the user no longer needs restore. Do not attach\nbackups, IDs, device logs or their contents to chat, public issues or the repo.\n\nOld `makeables` or `drawr-helper` installations may have originals under their\nown `backups/cards/` directory. Use an explicit verified path with `--backup`;\ndo not assume that a new install owns the old backup. A missing original is not\npermission to invent one or treat the current custom skin as issuer artwork.\n\n## Check the result and stop on uncertainty\n\nOnly a receipt with `status: complete` or `status: restored` is success. Check\nthe returned backup path, then ask the user to force-close/reopen Wallet and\nconfirm the visible result. Keep the design document for future iterations.\n\nA timeout, disconnect or failed command may have changed the device. Preserve\nevery backup and inspect `wallet backups` plus the private diagnostic path in\nthe error receipt. Do not blindly retry a write. The installed companion\nincludes recovery notes. For a verified transaction snapshot from this version,\n`makeables wallet recover --backup \"/absolute/path/to/transaction\" --device d-SELECTION --yes`\nrestores recorded staging/Books state on the matching device. Inspect the private\nsnapshot and use this only for requested recovery, before another artwork write.\nLegacy transactions without device binding require their original helper. Report what completed and what remains uncertain.\n";
|
|
@@ -19980,6 +22436,10 @@ var skills = {
|
|
|
19980
22436
|
description: "Original die-cut stickers: editable layers, glitter, holographic and vinyl finishes.",
|
|
19981
22437
|
content: stickers_default
|
|
19982
22438
|
},
|
|
22439
|
+
"sticker-art-direction": {
|
|
22440
|
+
description: "Illustration, typography, optical maps and a repeatable quality review for collectible stickers.",
|
|
22441
|
+
content: sticker_art_direction_default
|
|
22442
|
+
},
|
|
19983
22443
|
wallet: {
|
|
19984
22444
|
description: "Apply, switch or restore artwork on an existing iPhone Wallet card over USB.",
|
|
19985
22445
|
content: wallet_default
|
|
@@ -20031,12 +22491,16 @@ async function localSubmissionDraft(value) {
|
|
|
20031
22491
|
for (const id of requiredAssets(draft.design).assets) {
|
|
20032
22492
|
const asset = draft.design.assets?.[id];
|
|
20033
22493
|
if (!asset || asset.source === "image") continue;
|
|
20034
|
-
const
|
|
20035
|
-
draft.files[
|
|
20036
|
-
asset.source === "gallery" ? join5(roots.designs, asset.slug, asset.file ?? "artwork.svg") :
|
|
22494
|
+
const path2 = `assets/${id}.${asset.source === "gallery" ? "svg" : "webp"}`;
|
|
22495
|
+
draft.files[path2] = await readFile3(
|
|
22496
|
+
asset.source === "gallery" ? join5(roots.designs, asset.slug, asset.file ?? "artwork.svg") : asset.source === "sticker" ? join5(
|
|
22497
|
+
roots.stickers,
|
|
22498
|
+
asset.collection,
|
|
22499
|
+
`${asset.slug}${asset.file === "effects" ? "-fx" : ""}.webp`
|
|
22500
|
+
) : join5(roots.stickers, "petdex", `${asset.slug}.webp`)
|
|
20037
22501
|
);
|
|
20038
|
-
draft.mime[
|
|
20039
|
-
draft.assets[id] =
|
|
22502
|
+
draft.mime[path2] = asset.source === "gallery" ? "image/svg+xml" : "image/webp";
|
|
22503
|
+
draft.assets[id] = path2;
|
|
20040
22504
|
}
|
|
20041
22505
|
if (missingAssets(draft).length)
|
|
20042
22506
|
throw new InputError(
|
|
@@ -20049,8 +22513,8 @@ async function renderSubmission(draft) {
|
|
|
20049
22513
|
const images = {};
|
|
20050
22514
|
for (const [id, asset] of Object.entries(draft.design.assets ?? {}))
|
|
20051
22515
|
if (asset.source === "image") images[id] = Buffer.from(asset.data.split(",")[1], "base64");
|
|
20052
|
-
for (const [id,
|
|
20053
|
-
images[id] = Buffer.from(draft.files[
|
|
22516
|
+
for (const [id, path2] of Object.entries(draft.assets))
|
|
22517
|
+
images[id] = Buffer.from(draft.files[path2]);
|
|
20054
22518
|
if (draft.artwork) images.art = Buffer.from(draft.files[draft.artwork]);
|
|
20055
22519
|
const input = {
|
|
20056
22520
|
design: draft.design,
|
|
@@ -20080,9 +22544,9 @@ function receipt(value, site) {
|
|
|
20080
22544
|
throw new CloudError("INVALID_RECEIPT", "Submission receipt URL does not match.");
|
|
20081
22545
|
return { ...result, url: `${site}${result.url}` };
|
|
20082
22546
|
}
|
|
20083
|
-
async function submissionRequest(site,
|
|
22547
|
+
async function submissionRequest(site, path2, token, body) {
|
|
20084
22548
|
return responseJson(
|
|
20085
|
-
await fetch(`${editorOrigin(site)}/api/submissions${
|
|
22549
|
+
await fetch(`${editorOrigin(site)}/api/submissions${path2}`, {
|
|
20086
22550
|
method: body === void 0 ? "GET" : "POST",
|
|
20087
22551
|
headers: {
|
|
20088
22552
|
Authorization: `Bearer ${token}`,
|