@pinepaper.studio/mcp-server 1.6.11 → 1.6.13
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 +219 -0
- package/dist/agent/export-manager.d.ts.map +1 -1
- package/dist/agent/export-manager.js +9 -7
- package/dist/agent/export-manager.js.map +1 -1
- package/dist/assets/repositories/iconify.d.ts +0 -5
- package/dist/assets/repositories/iconify.d.ts.map +1 -1
- package/dist/assets/repositories/iconify.js +17 -5
- package/dist/assets/repositories/iconify.js.map +1 -1
- package/dist/browser/puppeteer-controller.d.ts +16 -0
- package/dist/browser/puppeteer-controller.d.ts.map +1 -1
- package/dist/browser/puppeteer-controller.js +32 -2
- package/dist/browser/puppeteer-controller.js.map +1 -1
- package/dist/design/design-systems.d.ts +27 -2
- package/dist/design/design-systems.d.ts.map +1 -1
- package/dist/design/design-systems.js +20 -0
- package/dist/design/design-systems.js.map +1 -1
- package/dist/tools/compact-descriptions.js +1 -1
- package/dist/tools/compact-descriptions.js.map +1 -1
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +175 -52
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/engine-methods.d.ts.map +1 -1
- package/dist/tools/engine-methods.js +8 -0
- package/dist/tools/engine-methods.js.map +1 -1
- package/dist/tools/engine-surface.d.ts +1 -1
- package/dist/tools/engine-surface.d.ts.map +1 -1
- package/dist/tools/engine-surface.js +32 -12
- package/dist/tools/engine-surface.js.map +1 -1
- package/dist/tools/handlers.d.ts +13 -2
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +219 -13
- package/dist/tools/handlers.js.map +1 -1
- package/dist/tools/minimal-descriptions.js +1 -1
- package/dist/tools/minimal-descriptions.js.map +1 -1
- package/dist/tools/shape-params.d.ts +36 -0
- package/dist/tools/shape-params.d.ts.map +1 -0
- package/dist/tools/shape-params.js +159 -0
- package/dist/tools/shape-params.js.map +1 -0
- package/dist/tools/stick-vocabulary.d.ts +26 -0
- package/dist/tools/stick-vocabulary.d.ts.map +1 -0
- package/dist/tools/stick-vocabulary.js +102 -0
- package/dist/tools/stick-vocabulary.js.map +1 -0
- package/dist/tools/toolkits.d.ts.map +1 -1
- package/dist/tools/toolkits.js +10 -1
- package/dist/tools/toolkits.js.map +1 -1
- package/dist/types/code-generator.d.ts.map +1 -1
- package/dist/types/code-generator.js +865 -122
- package/dist/types/code-generator.js.map +1 -1
- package/dist/types/schemas.d.ts +191 -35
- package/dist/types/schemas.d.ts.map +1 -1
- package/dist/types/schemas.js +32 -16
- package/dist/types/schemas.js.map +1 -1
- package/dist/vendor/design/design-systems-dtcg.d.ts +9 -0
- package/dist/vendor/design/design-systems-dtcg.d.ts.map +1 -1
- package/dist/vendor/design/design-systems-dtcg.js +53 -1
- package/dist/vendor/design/design-systems-dtcg.js.map +1 -1
- package/dist/vendor/design/device-mockup-generator.d.ts +83 -0
- package/dist/vendor/design/device-mockup-generator.d.ts.map +1 -0
- package/dist/vendor/design/device-mockup-generator.js +634 -0
- package/dist/vendor/design/device-mockup-generator.js.map +1 -0
- package/dist/vendor/design/recursive-subdivision-generator.d.ts +79 -0
- package/dist/vendor/design/recursive-subdivision-generator.d.ts.map +1 -0
- package/dist/vendor/design/recursive-subdivision-generator.js +319 -0
- package/dist/vendor/design/recursive-subdivision-generator.js.map +1 -0
- package/dist/vendor/design/textile-weave-generator.d.ts +140 -0
- package/dist/vendor/design/textile-weave-generator.d.ts.map +1 -0
- package/dist/vendor/design/textile-weave-generator.js +568 -0
- package/dist/vendor/design/textile-weave-generator.js.map +1 -0
- package/manifest.json +1 -1
- package/package.json +8 -2
|
@@ -0,0 +1,568 @@
|
|
|
1
|
+
/* GENERATED — DO NOT EDIT.
|
|
2
|
+
*
|
|
3
|
+
* Source: mcp-cloud/src/services/textile-weave-generator.ts
|
|
4
|
+
* sha256: 1704c25e676721c9d78f0ce723e06d7f2969bd959940f93852eff056bdc78d6a
|
|
5
|
+
* Generator: scripts/sync-design-systems.mjs
|
|
6
|
+
*
|
|
7
|
+
* Edit the TypeScript upstream and re-run the generator. A hand edit here is
|
|
8
|
+
* the second copy of the same design vocabulary that the generator exists to
|
|
9
|
+
* prevent, and the provenance test will fail on it.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Vector textile and knot generation engine.
|
|
13
|
+
*
|
|
14
|
+
* Compiles declarative weave topologies (Plain/Tabby, Twill/Herringbone, Basketweave)
|
|
15
|
+
* and three-dimensional embroidered knots (French knots, bullion coils, rosette anchors)
|
|
16
|
+
* into mathematically clean, executable Paper.js vector geometry.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Generate Paper.js code for a Plain (Tabby) Weave.
|
|
20
|
+
* Warp and weft threads alternate over and under using complementary dashArray offsets.
|
|
21
|
+
*/
|
|
22
|
+
export function generatePlainWeaveCode(opts = {}) {
|
|
23
|
+
const x = opts.bounds?.x ?? 0;
|
|
24
|
+
const y = opts.bounds?.y ?? 0;
|
|
25
|
+
const w = opts.bounds?.width ?? 1280;
|
|
26
|
+
const h = opts.bounds?.height ?? 720;
|
|
27
|
+
const pitch = Math.max(4, opts.pitch ?? (opts.density ? Math.max(4, opts.density) : 16));
|
|
28
|
+
const threadWidth = opts.threadWidth ?? opts.threadThickness ?? 1.5;
|
|
29
|
+
const warpColor = opts.warpColor ?? "rgba(51, 65, 85, 0.4)";
|
|
30
|
+
const weftColor = opts.weftColor ?? "rgba(148, 163, 184, 0.4)";
|
|
31
|
+
const slubJitter = opts.slubJitter ?? 0;
|
|
32
|
+
const opacity = opts.opacity ?? 0.85;
|
|
33
|
+
const prefix = opts.idPrefix ?? "plain_weave";
|
|
34
|
+
return `// Plain Weave / Tabby Vector Generator
|
|
35
|
+
(function() {
|
|
36
|
+
const items = [];
|
|
37
|
+
const x0 = ${x}, y0 = ${y}, x1 = ${x + w}, y1 = ${y + h};
|
|
38
|
+
const pitch = ${pitch};
|
|
39
|
+
const strokeWidth = ${threadWidth};
|
|
40
|
+
const slubJitter = ${slubJitter};
|
|
41
|
+
|
|
42
|
+
// Vertical Warp threads
|
|
43
|
+
let colIdx = 0;
|
|
44
|
+
for (let vx = x0; vx <= x1; vx += pitch) {
|
|
45
|
+
const jitterX = slubJitter ? (Math.sin(colIdx * 1.7) * slubJitter * 2) : 0;
|
|
46
|
+
const warp = new paper.Path.Line({
|
|
47
|
+
from: [vx + jitterX, y0],
|
|
48
|
+
to: [vx + jitterX, y1],
|
|
49
|
+
strokeColor: "${warpColor}",
|
|
50
|
+
strokeWidth: strokeWidth,
|
|
51
|
+
strokeCap: "round",
|
|
52
|
+
dashArray: [pitch, pitch],
|
|
53
|
+
dashOffset: (colIdx % 2 === 0) ? 0 : pitch,
|
|
54
|
+
opacity: ${opacity}
|
|
55
|
+
});
|
|
56
|
+
const id = "${prefix}_warp_" + colIdx;
|
|
57
|
+
if (typeof app.registerItem === "function") app.registerItem(warp, id, { source: "weave_generator", weave: "plain", role: "warp" });
|
|
58
|
+
items.push(warp);
|
|
59
|
+
colIdx++;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Horizontal Weft threads
|
|
63
|
+
let rowIdx = 0;
|
|
64
|
+
for (let vy = y0; vy <= y1; vy += pitch) {
|
|
65
|
+
const jitterY = slubJitter ? (Math.cos(rowIdx * 1.7) * slubJitter * 2) : 0;
|
|
66
|
+
const weft = new paper.Path.Line({
|
|
67
|
+
from: [x0, vy + jitterY],
|
|
68
|
+
to: [x1, vy + jitterY],
|
|
69
|
+
strokeColor: "${weftColor}",
|
|
70
|
+
strokeWidth: strokeWidth,
|
|
71
|
+
strokeCap: "round",
|
|
72
|
+
dashArray: [pitch, pitch],
|
|
73
|
+
dashOffset: (rowIdx % 2 === 0) ? pitch : 0,
|
|
74
|
+
opacity: ${opacity}
|
|
75
|
+
});
|
|
76
|
+
const id = "${prefix}_weft_" + rowIdx;
|
|
77
|
+
if (typeof app.registerItem === "function") app.registerItem(weft, id, { source: "weave_generator", weave: "plain", role: "weft" });
|
|
78
|
+
items.push(weft);
|
|
79
|
+
rowIdx++;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const group = new paper.Group(items);
|
|
83
|
+
if (typeof app.registerItem === "function") app.registerItem(group, "${prefix}_group", { source: "weave_generator", weave: "plain" });
|
|
84
|
+
return group;
|
|
85
|
+
})();`;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Generate Paper.js code for a Twill / Herringbone Weave.
|
|
89
|
+
* Stepped float ratios produce diagonal ridges with optional chevron direction reversals.
|
|
90
|
+
*/
|
|
91
|
+
export function generateTwillWeaveCode(opts = {}) {
|
|
92
|
+
const x = opts.bounds?.x ?? 0;
|
|
93
|
+
const y = opts.bounds?.y ?? 0;
|
|
94
|
+
const w = opts.bounds?.width ?? 1280;
|
|
95
|
+
const h = opts.bounds?.height ?? 720;
|
|
96
|
+
const pitch = Math.max(4, opts.pitch ?? (opts.density ? Math.max(4, opts.density) : 14));
|
|
97
|
+
const threadWidth = opts.threadWidth ?? opts.threadThickness ?? 2;
|
|
98
|
+
const floatRatio = Math.max(1, opts.floatRatio ?? 2);
|
|
99
|
+
const floatLen = pitch * floatRatio;
|
|
100
|
+
const isHerringbone = Boolean(opts.herringbone || opts.twillVariant === "herringbone");
|
|
101
|
+
const chevronW = Math.max(40, opts.chevronWidth ?? 140);
|
|
102
|
+
const warpColor = opts.warpColor ?? "rgba(30, 58, 138, 0.45)";
|
|
103
|
+
const weftColor = opts.weftColor ?? "rgba(203, 213, 225, 0.5)";
|
|
104
|
+
const opacity = opts.opacity ?? 0.9;
|
|
105
|
+
const prefix = opts.idPrefix ?? (isHerringbone ? "herringbone_weave" : "twill_weave");
|
|
106
|
+
return `// Twill Weave & Herringbone Vector Generator
|
|
107
|
+
(function() {
|
|
108
|
+
const items = [];
|
|
109
|
+
const x0 = ${x}, y0 = ${y}, x1 = ${x + w}, y1 = ${y + h};
|
|
110
|
+
const pitch = ${pitch};
|
|
111
|
+
const floatLen = pitch * ${floatRatio};
|
|
112
|
+
const isHerringbone = ${isHerringbone};
|
|
113
|
+
const chevronWidth = ${chevronW};
|
|
114
|
+
|
|
115
|
+
// Warp lines (base grid)
|
|
116
|
+
let colIdx = 0;
|
|
117
|
+
for (let vx = x0; vx <= x1; vx += pitch) {
|
|
118
|
+
const warp = new paper.Path.Line({
|
|
119
|
+
from: [vx, y0],
|
|
120
|
+
to: [vx, y1],
|
|
121
|
+
strokeColor: "${warpColor}",
|
|
122
|
+
strokeWidth: ${threadWidth},
|
|
123
|
+
strokeCap: "round",
|
|
124
|
+
opacity: ${opacity * 0.7}
|
|
125
|
+
});
|
|
126
|
+
const id = "${prefix}_warp_" + colIdx;
|
|
127
|
+
if (typeof app.registerItem === "function") app.registerItem(warp, id, { source: "weave_generator", weave: "twill", role: "warp" });
|
|
128
|
+
items.push(warp);
|
|
129
|
+
colIdx++;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Weft float lines with diagonal stepped offsets
|
|
133
|
+
let rowIdx = 0;
|
|
134
|
+
for (let vy = y0; vy <= y1; vy += pitch) {
|
|
135
|
+
if (isHerringbone) {
|
|
136
|
+
// Split into chevron blocks with reversing slants
|
|
137
|
+
for (let bx = x0; bx < x1; bx += chevronWidth) {
|
|
138
|
+
const segEnd = Math.min(x1, bx + chevronWidth);
|
|
139
|
+
const blockIdx = Math.floor((bx - x0) / chevronWidth);
|
|
140
|
+
const dir = (blockIdx % 2 === 0) ? 1 : -1;
|
|
141
|
+
const phase = dir === 1 ? ((rowIdx * pitch) % (floatLen * 2)) : (((1000 - rowIdx) * pitch) % (floatLen * 2));
|
|
142
|
+
const weftSeg = new paper.Path.Line({
|
|
143
|
+
from: [bx, vy],
|
|
144
|
+
to: [segEnd, vy],
|
|
145
|
+
strokeColor: "${weftColor}",
|
|
146
|
+
strokeWidth: ${threadWidth},
|
|
147
|
+
strokeCap: "round",
|
|
148
|
+
dashArray: [floatLen, pitch],
|
|
149
|
+
dashOffset: phase,
|
|
150
|
+
opacity: ${opacity}
|
|
151
|
+
});
|
|
152
|
+
const id = "${prefix}_weft_" + rowIdx + "_" + blockIdx;
|
|
153
|
+
if (typeof app.registerItem === "function") app.registerItem(weftSeg, id, { source: "weave_generator", weave: "herringbone", role: "weft" });
|
|
154
|
+
items.push(weftSeg);
|
|
155
|
+
}
|
|
156
|
+
} else {
|
|
157
|
+
// Classic diagonal twill
|
|
158
|
+
const phase = (rowIdx * pitch) % (floatLen * 2);
|
|
159
|
+
const weft = new paper.Path.Line({
|
|
160
|
+
from: [x0, vy],
|
|
161
|
+
to: [x1, vy],
|
|
162
|
+
strokeColor: "${weftColor}",
|
|
163
|
+
strokeWidth: ${threadWidth},
|
|
164
|
+
strokeCap: "round",
|
|
165
|
+
dashArray: [floatLen, pitch],
|
|
166
|
+
dashOffset: phase,
|
|
167
|
+
opacity: ${opacity}
|
|
168
|
+
});
|
|
169
|
+
const id = "${prefix}_weft_" + rowIdx;
|
|
170
|
+
if (typeof app.registerItem === "function") app.registerItem(weft, id, { source: "weave_generator", weave: "twill", role: "weft" });
|
|
171
|
+
items.push(weft);
|
|
172
|
+
}
|
|
173
|
+
rowIdx++;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const group = new paper.Group(items);
|
|
177
|
+
if (typeof app.registerItem === "function") app.registerItem(group, "${prefix}_group", { source: "weave_generator", weave: isHerringbone ? "herringbone" : "twill" });
|
|
178
|
+
return group;
|
|
179
|
+
})();`;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Generate Paper.js code for a Basketweave (Panama) pattern.
|
|
183
|
+
* Groups of parallel threads interlace together as square blocks.
|
|
184
|
+
*/
|
|
185
|
+
export function generateBasketWeaveCode(opts = {}) {
|
|
186
|
+
const x = opts.bounds?.x ?? 0;
|
|
187
|
+
const y = opts.bounds?.y ?? 0;
|
|
188
|
+
const w = opts.bounds?.width ?? 1280;
|
|
189
|
+
const h = opts.bounds?.height ?? 720;
|
|
190
|
+
const bundleSize = Math.max(2, opts.bundleSize ?? opts.bundleThreads ?? 2);
|
|
191
|
+
const bundleGap = opts.bundleGap ?? 2;
|
|
192
|
+
const threadWidth = opts.threadWidth ?? opts.threadThickness ?? 1.8;
|
|
193
|
+
const pitch = Math.max(8, opts.pitch ?? (opts.density ? Math.max(8, opts.density) : 18));
|
|
194
|
+
const colorA = opts.colorA ?? opts.warpColor ?? "rgba(180, 83, 9, 0.6)";
|
|
195
|
+
const colorB = opts.colorB ?? opts.weftColor ?? "rgba(217, 119, 6, 0.6)";
|
|
196
|
+
const opacity = opts.opacity ?? 0.85;
|
|
197
|
+
const prefix = opts.idPrefix ?? "basket_weave";
|
|
198
|
+
return `// Basketweave Vector Generator
|
|
199
|
+
(function() {
|
|
200
|
+
const items = [];
|
|
201
|
+
const x0 = ${x}, y0 = ${y}, x1 = ${x + w}, y1 = ${y + h};
|
|
202
|
+
const pitch = ${pitch};
|
|
203
|
+
const bundleSize = ${bundleSize};
|
|
204
|
+
const bundleGap = ${bundleGap};
|
|
205
|
+
const blockSize = (bundleSize * pitch) + bundleGap;
|
|
206
|
+
const threadWidth = ${threadWidth};
|
|
207
|
+
|
|
208
|
+
let rIdx = 0;
|
|
209
|
+
for (let vy = y0; vy <= y1; vy += blockSize) {
|
|
210
|
+
let cIdx = 0;
|
|
211
|
+
for (let vx = x0; vx <= x1; vx += blockSize) {
|
|
212
|
+
const isHorizontal = (rIdx + cIdx) % 2 === 0;
|
|
213
|
+
for (let t = 0; t < bundleSize; t++) {
|
|
214
|
+
const offset = t * pitch + pitch / 2;
|
|
215
|
+
let line;
|
|
216
|
+
if (isHorizontal) {
|
|
217
|
+
line = new paper.Path.Line({
|
|
218
|
+
from: [vx, vy + offset],
|
|
219
|
+
to: [Math.min(x1, vx + blockSize - bundleGap), vy + offset],
|
|
220
|
+
strokeColor: "${colorA}",
|
|
221
|
+
strokeWidth: threadWidth,
|
|
222
|
+
strokeCap: "round",
|
|
223
|
+
opacity: ${opacity}
|
|
224
|
+
});
|
|
225
|
+
} else {
|
|
226
|
+
line = new paper.Path.Line({
|
|
227
|
+
from: [vx + offset, vy],
|
|
228
|
+
to: [vx + offset, Math.min(y1, vy + blockSize - bundleGap)],
|
|
229
|
+
strokeColor: "${colorB}",
|
|
230
|
+
strokeWidth: threadWidth,
|
|
231
|
+
strokeCap: "round",
|
|
232
|
+
opacity: ${opacity}
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
items.push(line);
|
|
236
|
+
}
|
|
237
|
+
cIdx++;
|
|
238
|
+
}
|
|
239
|
+
rIdx++;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
const group = new paper.Group(items);
|
|
243
|
+
if (typeof app.registerItem === "function") app.registerItem(group, "${prefix}_group", { source: "weave_generator", weave: "basket" });
|
|
244
|
+
return group;
|
|
245
|
+
})();`;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Generate Paper.js code for tactile 3D Embroidered Knots (French knots, bullion coils, knot anchors).
|
|
249
|
+
*/
|
|
250
|
+
export function generateKnotCode(opts = {}) {
|
|
251
|
+
const knots = opts.knots ?? opts.points ?? [];
|
|
252
|
+
const knotType = opts.knotType ?? "french_knot";
|
|
253
|
+
const defaultRadius = opts.defaultRadius ?? 5;
|
|
254
|
+
const defaultColor = opts.threadColor ?? opts.defaultColor ?? "#fbbf24";
|
|
255
|
+
const defaultHighlight = opts.highlightColor ?? opts.defaultHighlight ?? "#fef08a";
|
|
256
|
+
const defaultShadow = opts.shadowColor ?? opts.defaultShadow ?? "rgba(15, 23, 42, 0.4)";
|
|
257
|
+
const prefix = opts.idPrefix ?? "embroidery_knot";
|
|
258
|
+
const serializedKnots = JSON.stringify(knots);
|
|
259
|
+
return `// Embroidered Knots & Anchor Relief Vector Generator
|
|
260
|
+
(function() {
|
|
261
|
+
const items = [];
|
|
262
|
+
const knotList = ${serializedKnots};
|
|
263
|
+
const knotType = "${knotType}";
|
|
264
|
+
const defR = ${defaultRadius};
|
|
265
|
+
const defCol = "${defaultColor}";
|
|
266
|
+
const defHi = "${defaultHighlight}";
|
|
267
|
+
const defShadow = "${defaultShadow}";
|
|
268
|
+
|
|
269
|
+
knotList.forEach((k, idx) => {
|
|
270
|
+
const kx = k.x, ky = k.y;
|
|
271
|
+
const kr = k.radius || defR;
|
|
272
|
+
const col = k.color || defCol;
|
|
273
|
+
const hi = k.highlightColor || defHi;
|
|
274
|
+
const sh = k.shadowColor || defShadow;
|
|
275
|
+
const knotParts = [];
|
|
276
|
+
|
|
277
|
+
if (knotType === "bullion_roll") {
|
|
278
|
+
// Bullion roll coils along directional vector
|
|
279
|
+
const len = k.length || (kr * 4);
|
|
280
|
+
const angRad = ((k.angle || 0) * Math.PI) / 180;
|
|
281
|
+
const dx = Math.cos(angRad);
|
|
282
|
+
const dy = Math.sin(angRad);
|
|
283
|
+
const steps = Math.max(3, Math.round(len / (kr * 0.8)));
|
|
284
|
+
|
|
285
|
+
// Base shadow line
|
|
286
|
+
const baseShadow = new paper.Path.Line({
|
|
287
|
+
from: [kx + 1, ky + 1.5],
|
|
288
|
+
to: [kx + dx * len + 1, ky + dy * len + 1.5],
|
|
289
|
+
strokeColor: sh,
|
|
290
|
+
strokeWidth: kr * 1.8,
|
|
291
|
+
strokeCap: "round"
|
|
292
|
+
});
|
|
293
|
+
knotParts.push(baseShadow);
|
|
294
|
+
|
|
295
|
+
// Overlapping coil loops
|
|
296
|
+
for (let s = 0; s < steps; s++) {
|
|
297
|
+
const t = s / steps;
|
|
298
|
+
const cx = kx + dx * (len * t);
|
|
299
|
+
const cy = ky + dy * (len * t);
|
|
300
|
+
const coil = new paper.Path.Circle({
|
|
301
|
+
center: [cx, cy],
|
|
302
|
+
radius: kr,
|
|
303
|
+
fillColor: col,
|
|
304
|
+
strokeColor: hi,
|
|
305
|
+
strokeWidth: 0.8
|
|
306
|
+
});
|
|
307
|
+
knotParts.push(coil);
|
|
308
|
+
}
|
|
309
|
+
} else if (knotType === "knot_anchor") {
|
|
310
|
+
// Anchor tack cross stitches
|
|
311
|
+
const tackLen = kr * 1.5;
|
|
312
|
+
const line1 = new paper.Path.Line({
|
|
313
|
+
from: [kx - tackLen, ky - tackLen],
|
|
314
|
+
to: [kx + tackLen, ky + tackLen],
|
|
315
|
+
strokeColor: col,
|
|
316
|
+
strokeWidth: Math.max(1, kr * 0.4),
|
|
317
|
+
strokeCap: "round"
|
|
318
|
+
});
|
|
319
|
+
const line2 = new paper.Path.Line({
|
|
320
|
+
from: [kx - tackLen, ky + tackLen],
|
|
321
|
+
to: [kx + tackLen, ky - tackLen],
|
|
322
|
+
strokeColor: col,
|
|
323
|
+
strokeWidth: Math.max(1, kr * 0.4),
|
|
324
|
+
strokeCap: "round"
|
|
325
|
+
});
|
|
326
|
+
const centerDot = new paper.Path.Circle({
|
|
327
|
+
center: [kx, ky],
|
|
328
|
+
radius: kr * 0.6,
|
|
329
|
+
fillColor: hi
|
|
330
|
+
});
|
|
331
|
+
knotParts.push(line1, line2, centerDot);
|
|
332
|
+
} else {
|
|
333
|
+
// Standard tactile French knot relief
|
|
334
|
+
// 1. French knot shadow crescent anchor beneath knot
|
|
335
|
+
const shadow = new paper.Path.Circle({
|
|
336
|
+
center: [kx + 1, ky + 1.5],
|
|
337
|
+
radius: kr,
|
|
338
|
+
fillColor: sh,
|
|
339
|
+
strokeColor: null
|
|
340
|
+
});
|
|
341
|
+
knotParts.push(shadow);
|
|
342
|
+
|
|
343
|
+
// 2. French knot coil body outer thread
|
|
344
|
+
const body = new paper.Path.Circle({
|
|
345
|
+
center: [kx, ky],
|
|
346
|
+
radius: kr,
|
|
347
|
+
fillColor: col,
|
|
348
|
+
strokeColor: "#f8fafc",
|
|
349
|
+
strokeWidth: 1
|
|
350
|
+
});
|
|
351
|
+
knotParts.push(body);
|
|
352
|
+
|
|
353
|
+
// 3. Inner coiled thread wrap
|
|
354
|
+
const innerCoil = new paper.Path.Circle({
|
|
355
|
+
center: [kx + kr * 0.1, ky + kr * 0.1],
|
|
356
|
+
radius: Math.max(1, kr * 0.55),
|
|
357
|
+
fillColor: null,
|
|
358
|
+
strokeColor: col,
|
|
359
|
+
strokeWidth: Math.max(0.8, kr * 0.28)
|
|
360
|
+
});
|
|
361
|
+
knotParts.push(innerCoil);
|
|
362
|
+
|
|
363
|
+
// 4. Specular glint highlight
|
|
364
|
+
const glint = new paper.Path.Circle({
|
|
365
|
+
center: [kx - kr * 0.32, ky - kr * 0.32],
|
|
366
|
+
radius: Math.max(0.8, kr * 0.3),
|
|
367
|
+
fillColor: hi,
|
|
368
|
+
strokeColor: null
|
|
369
|
+
});
|
|
370
|
+
knotParts.push(glint);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const knotGroup = new paper.Group(knotParts);
|
|
374
|
+
const id = "${prefix}_" + idx;
|
|
375
|
+
if (typeof app.registerItem === "function") app.registerItem(knotGroup, id, { source: "knot_generator", x: kx, y: ky, radius: kr });
|
|
376
|
+
items.push(knotGroup);
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
const masterGroup = new paper.Group(items);
|
|
380
|
+
if (typeof app.registerItem === "function") app.registerItem(masterGroup, "${prefix}_collection", { source: "knot_generator", count: items.length });
|
|
381
|
+
return masterGroup;
|
|
382
|
+
})();`;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Generate Paper.js code for Japanese Sashiko geometric folk embroidery.
|
|
386
|
+
* Enforces authentic vertex gaps (running stitches do not collide at intersection nodes).
|
|
387
|
+
*/
|
|
388
|
+
export function generateSashikoCode(opts = {}) {
|
|
389
|
+
const x = opts.bounds?.x ?? 0;
|
|
390
|
+
const y = opts.bounds?.y ?? 0;
|
|
391
|
+
const w = opts.bounds?.width ?? 1280;
|
|
392
|
+
const h = opts.bounds?.height ?? 720;
|
|
393
|
+
const pattern = opts.pattern ?? opts.motif ?? "seigaiha";
|
|
394
|
+
const stitchLen = Math.max(3, opts.stitchLength ?? 8);
|
|
395
|
+
const gapLen = Math.max(2, opts.gapLength ?? 4);
|
|
396
|
+
const vertexGap = Math.max(1, opts.vertexGap ?? 3);
|
|
397
|
+
const threadWidth = opts.threadWidth ?? opts.threadThickness ?? 1.6;
|
|
398
|
+
const threadColor = opts.threadColor ?? "#ffffff";
|
|
399
|
+
const groundColor = opts.groundColor ?? "#1e3a8a";
|
|
400
|
+
const scale = Math.max(20, opts.scale ?? opts.gridSize ?? 42);
|
|
401
|
+
const concentricArcs = Math.max(1, opts.concentricArcs ?? 3);
|
|
402
|
+
const opacity = opts.opacity ?? 0.92;
|
|
403
|
+
const prefix = opts.idPrefix ?? `sashiko_${pattern}`;
|
|
404
|
+
return `// Sashiko Geometric Folk Embroidery Generator (${pattern})
|
|
405
|
+
(function() {
|
|
406
|
+
const items = [];
|
|
407
|
+
const x0 = ${x}, y0 = ${y}, x1 = ${x + w}, y1 = ${y + h};
|
|
408
|
+
const threadColor = "${threadColor}";
|
|
409
|
+
const threadWidth = ${threadWidth};
|
|
410
|
+
const stitchLen = ${stitchLen};
|
|
411
|
+
const gapLen = ${gapLen};
|
|
412
|
+
const vertexGap = ${vertexGap};
|
|
413
|
+
const scale = ${scale};
|
|
414
|
+
const concentricArcs = ${concentricArcs};
|
|
415
|
+
const opacity = ${opacity};
|
|
416
|
+
|
|
417
|
+
// 0. Ground cloth plate
|
|
418
|
+
const bgPlate = new paper.Path.Rectangle({
|
|
419
|
+
point: [x0, y0],
|
|
420
|
+
size: [x1 - x0, y1 - y0],
|
|
421
|
+
fillColor: "${groundColor}",
|
|
422
|
+
strokeColor: null
|
|
423
|
+
});
|
|
424
|
+
items.push(bgPlate);
|
|
425
|
+
|
|
426
|
+
if ("${pattern}" === "seigaiha") {
|
|
427
|
+
// Seigaiha: Overlapping concentric ocean wave arcs with staggered centers
|
|
428
|
+
const R = scale;
|
|
429
|
+
const dy = R * 0.55;
|
|
430
|
+
let row = 0;
|
|
431
|
+
for (let cy = y0 + R * 0.4; cy <= y1 + R; cy += dy) {
|
|
432
|
+
const offsetX = (row % 2 === 0) ? 0 : R;
|
|
433
|
+
let col = 0;
|
|
434
|
+
for (let cx = x0 - R + offsetX; cx <= x1 + R; cx += R * 2) {
|
|
435
|
+
for (let a = 1; a <= concentricArcs; a++) {
|
|
436
|
+
const arcR = (R * a) / concentricArcs;
|
|
437
|
+
const fromPt = [cx - arcR + vertexGap * 0.5, cy - vertexGap * 0.2];
|
|
438
|
+
const throughPt = [cx, cy - arcR];
|
|
439
|
+
const toPt = [cx + arcR - vertexGap * 0.5, cy - vertexGap * 0.2];
|
|
440
|
+
const arc = new paper.Path.Arc(fromPt, throughPt, toPt);
|
|
441
|
+
arc.strokeColor = threadColor;
|
|
442
|
+
arc.strokeWidth = threadWidth;
|
|
443
|
+
arc.strokeCap = "round";
|
|
444
|
+
arc.dashArray = [stitchLen, gapLen];
|
|
445
|
+
arc.opacity = opacity;
|
|
446
|
+
items.push(arc);
|
|
447
|
+
}
|
|
448
|
+
col++;
|
|
449
|
+
}
|
|
450
|
+
row++;
|
|
451
|
+
}
|
|
452
|
+
} else if ("${pattern}" === "asanoha") {
|
|
453
|
+
// Asanoha: Hexagonal star / hemp-leaf isometric lattice with vertex gap clearance
|
|
454
|
+
const S = scale;
|
|
455
|
+
const H = S * Math.sqrt(3) / 2;
|
|
456
|
+
let rIdx = 0;
|
|
457
|
+
for (let py = y0; py <= y1 + H; py += H) {
|
|
458
|
+
const offX = (rIdx % 2 === 0) ? 0 : S * 0.5;
|
|
459
|
+
for (let px = x0 - S + offX; px <= x1 + S; px += S) {
|
|
460
|
+
const mx = px;
|
|
461
|
+
const my = py;
|
|
462
|
+
const angles = [0, 60, 120, 180, 240, 300];
|
|
463
|
+
angles.forEach(angDeg => {
|
|
464
|
+
const rad = (angDeg * Math.PI) / 180;
|
|
465
|
+
const targetX = mx + Math.cos(rad) * S * 0.55;
|
|
466
|
+
const targetY = my + Math.sin(rad) * S * 0.55;
|
|
467
|
+
|
|
468
|
+
const startX = mx + Math.cos(rad) * vertexGap;
|
|
469
|
+
const startY = my + Math.sin(rad) * vertexGap;
|
|
470
|
+
const endX = targetX - Math.cos(rad) * vertexGap;
|
|
471
|
+
const endY = targetY - Math.sin(rad) * vertexGap;
|
|
472
|
+
|
|
473
|
+
const spoke = new paper.Path.Line({
|
|
474
|
+
from: [startX, startY],
|
|
475
|
+
to: [endX, endY],
|
|
476
|
+
strokeColor: threadColor,
|
|
477
|
+
strokeWidth: threadWidth,
|
|
478
|
+
strokeCap: "round",
|
|
479
|
+
dashArray: [stitchLen, gapLen],
|
|
480
|
+
opacity: opacity
|
|
481
|
+
});
|
|
482
|
+
items.push(spoke);
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
rIdx++;
|
|
486
|
+
}
|
|
487
|
+
} else {
|
|
488
|
+
// Hishi / Kaki no Hana: Diamond grid with vertex gap junctions
|
|
489
|
+
const P = scale;
|
|
490
|
+
for (let diag = -Math.max(w, h); diag <= w + h; diag += P) {
|
|
491
|
+
for (let t = 0; t <= w + h; t += P) {
|
|
492
|
+
const p1x = t + vertexGap;
|
|
493
|
+
const p1y = t + diag + vertexGap;
|
|
494
|
+
const p2x = t + P - vertexGap;
|
|
495
|
+
const p2y = t + P + diag - vertexGap;
|
|
496
|
+
if (p1x >= x0 - P && p1x <= x1 + P && p1y >= y0 - P && p1y <= y1 + P) {
|
|
497
|
+
const seg1 = new paper.Path.Line({
|
|
498
|
+
from: [p1x, p1y],
|
|
499
|
+
to: [p2x, p2y],
|
|
500
|
+
strokeColor: threadColor,
|
|
501
|
+
strokeWidth: threadWidth,
|
|
502
|
+
strokeCap: "round",
|
|
503
|
+
dashArray: [stitchLen, gapLen],
|
|
504
|
+
opacity: opacity
|
|
505
|
+
});
|
|
506
|
+
items.push(seg1);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
const q1x = t + vertexGap;
|
|
510
|
+
const q1y = -t + diag + vertexGap;
|
|
511
|
+
const q2x = t + P - vertexGap;
|
|
512
|
+
const q2y = -(t + P) + diag - vertexGap;
|
|
513
|
+
if (q1x >= x0 - P && q1x <= x1 + P && q1y >= y0 - P && q1y <= y1 + P) {
|
|
514
|
+
const seg2 = new paper.Path.Line({
|
|
515
|
+
from: [q1x, q1y],
|
|
516
|
+
to: [q2x, q2y],
|
|
517
|
+
strokeColor: threadColor,
|
|
518
|
+
strokeWidth: threadWidth,
|
|
519
|
+
strokeCap: "round",
|
|
520
|
+
dashArray: [stitchLen, gapLen],
|
|
521
|
+
opacity: opacity
|
|
522
|
+
});
|
|
523
|
+
items.push(seg2);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
const group = new paper.Group(items);
|
|
530
|
+
if (typeof app.registerItem === "function") {
|
|
531
|
+
app.registerItem(group, "${prefix}_group", {
|
|
532
|
+
source: "sashiko_generator",
|
|
533
|
+
pattern: "${pattern}",
|
|
534
|
+
stitchCount: items.length
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
return group;
|
|
538
|
+
})();`;
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Master dispatcher for textile and embroidery vector code generation.
|
|
542
|
+
*/
|
|
543
|
+
export function generateTextileCode(opts) {
|
|
544
|
+
const type = opts.type ?? opts.weave ?? "plain";
|
|
545
|
+
switch (type) {
|
|
546
|
+
case "plain":
|
|
547
|
+
return generatePlainWeaveCode(opts);
|
|
548
|
+
case "twill":
|
|
549
|
+
return generateTwillWeaveCode({
|
|
550
|
+
...opts,
|
|
551
|
+
herringbone: opts.herringbone || opts.twillVariant === "herringbone" || opts.variant === "herringbone",
|
|
552
|
+
});
|
|
553
|
+
case "herringbone":
|
|
554
|
+
return generateTwillWeaveCode({ ...opts, herringbone: true });
|
|
555
|
+
case "basket":
|
|
556
|
+
return generateBasketWeaveCode(opts);
|
|
557
|
+
case "knots":
|
|
558
|
+
case "french_knot":
|
|
559
|
+
case "bullion_roll":
|
|
560
|
+
case "knot_anchor":
|
|
561
|
+
return generateKnotCode({ knotType: (opts.knotType ?? (opts.type !== "knots" ? opts.type : "french_knot")), ...opts });
|
|
562
|
+
case "sashiko":
|
|
563
|
+
return generateSashikoCode({ pattern: (opts.pattern ?? opts.motif ?? "seigaiha"), ...opts });
|
|
564
|
+
default:
|
|
565
|
+
return generatePlainWeaveCode(opts);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
//# sourceMappingURL=textile-weave-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textile-weave-generator.js","sourceRoot":"","sources":["../../../src/vendor/design/textile-weave-generator.ts"],"names":[],"mappings":"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"}
|
package/manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": "0.3",
|
|
3
3
|
"name": "pinepaper-mcp",
|
|
4
|
-
"version": "1.6.
|
|
4
|
+
"version": "1.6.13",
|
|
5
5
|
"display_name": "PinePaper Studio",
|
|
6
6
|
"description": "Create animated graphics with AI using PinePaper Studio",
|
|
7
7
|
"long_description": "PinePaper MCP Server enables Claude to create, animate, and export graphics through PinePaper Studio. Features include shape creation, relation-based animations (orbits, follows, attached_to), procedural generators, visual effects, SVG export with animations, asset search & import from 4 open repositories (500k+ icons), performance metrics tracking, diagram tools for flowcharts/UML/network diagrams with smart connectors and auto-layout, enhanced error messages with canvas context, Agent Flow Mode for content automation pipelines with batch operations and smart platform exports (Instagram, TikTok, YouTube, etc.), interactive triggers (click, hover, drag events), quiz/LMS integration with SCORM/xAPI support, Letter Collage for stylized text with per-letter customization (Wordle, magazine cutout, gradient styles with 24+ palettes), and canvas presets for social media platforms. Supports two execution modes: Puppeteer (live browser execution) and Code (generate code for manual paste).",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pinepaper.studio/mcp-server",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.13",
|
|
4
4
|
"mcpName": "io.github.pinepaper/mcp-server",
|
|
5
5
|
"description": "MCP Server for PinePaper Studio - Create animated graphics with AI",
|
|
6
6
|
"type": "module",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"typecheck": "tsc --noEmit",
|
|
39
39
|
"check:manifest": "bun scripts/check-manifest-tools.mjs",
|
|
40
40
|
"fix:manifest": "bun scripts/check-manifest-tools.mjs --fix",
|
|
41
|
-
"prepublishOnly": "bun run check:manifest && bun run check:design && bun run check:character && bun run check:engine-methods && bun run check:engine-surface && bun run build",
|
|
41
|
+
"prepublishOnly": "bun run check:manifest && bun run check:design && bun run check:character && bun run check:engine-methods && bun run check:engine-surface && bun run check:shape-params && bun run check:stick-vocabulary && bun run build",
|
|
42
42
|
"lint:errors": "eslint src --quiet",
|
|
43
43
|
"sync:design": "node scripts/sync-design-systems.mjs",
|
|
44
44
|
"check:design": "node scripts/sync-design-systems.mjs --check",
|
|
@@ -48,6 +48,12 @@
|
|
|
48
48
|
"sync:engine-surface": "node scripts/sync-engine-surface.mjs",
|
|
49
49
|
"fix:engine-surface": "node scripts/sync-engine-surface.mjs",
|
|
50
50
|
"check:engine-surface": "node scripts/sync-engine-surface.mjs --check",
|
|
51
|
+
"sync:shape-params": "node scripts/sync-shape-params.mjs",
|
|
52
|
+
"fix:shape-params": "node scripts/sync-shape-params.mjs",
|
|
53
|
+
"check:shape-params": "node scripts/sync-shape-params.mjs --check",
|
|
54
|
+
"sync:stick-vocabulary": "node scripts/sync-stick-vocabulary.mjs",
|
|
55
|
+
"fix:stick-vocabulary": "node scripts/sync-stick-vocabulary.mjs",
|
|
56
|
+
"check:stick-vocabulary": "node scripts/sync-stick-vocabulary.mjs --check",
|
|
51
57
|
"sync:character": "node scripts/sync-character-modules.mjs",
|
|
52
58
|
"check:character": "node scripts/sync-character-modules.mjs --check"
|
|
53
59
|
},
|