@make-pictures/kits 0.0.0-stage → 2.0.1

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.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -2
  3. package/dist/chunk-3SUIELJV.mjs +601 -0
  4. package/dist/chunk-4Z3G6FPZ.mjs +485 -0
  5. package/dist/chunk-AHA23PHC.mjs +678 -0
  6. package/dist/chunk-CW623YVB.mjs +1124 -0
  7. package/dist/chunk-NNA7XXQB.mjs +1059 -0
  8. package/dist/chunk-S4CHTWOS.mjs +1237 -0
  9. package/dist/chunk-WAA7P5FT.mjs +912 -0
  10. package/dist/data-storytelling/AnimatedBarRace.d.ts +37 -0
  11. package/dist/data-storytelling/MetricComparisonCard.d.ts +29 -0
  12. package/dist/data-storytelling/TimelineTrack.d.ts +29 -0
  13. package/dist/data-storytelling/index.cjs +1224 -0
  14. package/dist/data-storytelling/index.d.ts +3 -0
  15. package/dist/data-storytelling/index.mjs +10 -0
  16. package/dist/index.cjs +6010 -0
  17. package/dist/index.d.ts +7 -0
  18. package/dist/index.mjs +108 -0
  19. package/dist/isometric-3d/IsometricStudioEnvironment.d.ts +8 -0
  20. package/dist/isometric-3d/Stylized3DCharacter.d.ts +29 -0
  21. package/dist/isometric-3d/index.cjs +611 -0
  22. package/dist/isometric-3d/index.d.ts +2 -0
  23. package/dist/isometric-3d/index.mjs +8 -0
  24. package/dist/kinetic-typography/AnimatedMetricCounter.d.ts +36 -0
  25. package/dist/kinetic-typography/ImpactKeywordCard.d.ts +31 -0
  26. package/dist/kinetic-typography/WordByWordStage.d.ts +47 -0
  27. package/dist/kinetic-typography/index.cjs +665 -0
  28. package/dist/kinetic-typography/index.d.ts +3 -0
  29. package/dist/kinetic-typography/index.mjs +14 -0
  30. package/dist/motion-diagrams-2d/CameraRig.d.ts +34 -0
  31. package/dist/motion-diagrams-2d/CodePayloadToast.d.ts +14 -0
  32. package/dist/motion-diagrams-2d/DataFlowEdge.d.ts +24 -0
  33. package/dist/motion-diagrams-2d/NodeBox.d.ts +65 -0
  34. package/dist/motion-diagrams-2d/SystemNode.d.ts +21 -0
  35. package/dist/motion-diagrams-2d/index.cjs +1137 -0
  36. package/dist/motion-diagrams-2d/index.d.ts +5 -0
  37. package/dist/motion-diagrams-2d/index.mjs +28 -0
  38. package/dist/paper-diorama-3d/ImageCutout3D.d.ts +47 -0
  39. package/dist/paper-diorama-3d/PaperCutout3D.d.ts +62 -0
  40. package/dist/paper-diorama-3d/PaperPopUpBook3D.d.ts +51 -0
  41. package/dist/paper-diorama-3d/PaperStageLighting3D.d.ts +12 -0
  42. package/dist/paper-diorama-3d/index.cjs +1087 -0
  43. package/dist/paper-diorama-3d/index.d.ts +4 -0
  44. package/dist/paper-diorama-3d/index.mjs +34 -0
  45. package/dist/product-frames/BrowserFrame.d.ts +28 -0
  46. package/dist/product-frames/PhoneFrame.d.ts +23 -0
  47. package/dist/product-frames/ScreenSpotlightOverlay.d.ts +34 -0
  48. package/dist/product-frames/frameMedia.d.ts +24 -0
  49. package/dist/product-frames/index.cjs +507 -0
  50. package/dist/product-frames/index.d.ts +8 -0
  51. package/dist/product-frames/index.mjs +12 -0
  52. package/dist/vfx/CinematicLensOverlay.d.ts +29 -0
  53. package/dist/vfx/ParticleField.d.ts +18 -0
  54. package/dist/vfx/SceneTransition.d.ts +24 -0
  55. package/dist/vfx/StagePostProcessing3D.d.ts +44 -0
  56. package/dist/vfx/index.cjs +933 -0
  57. package/dist/vfx/index.d.ts +4 -0
  58. package/dist/vfx/index.mjs +14 -0
  59. package/package.json +95 -4
@@ -0,0 +1,1124 @@
1
+ // packages/kits/src/motion-diagrams-2d/CameraRig.tsx
2
+ import {
3
+ AbsoluteFill,
4
+ spring,
5
+ useCurrentFrame,
6
+ useVideoConfig
7
+ } from "remotion";
8
+ import { STUDIO_THEME, THEME, useStudioFontsReady } from "@make-pictures/core";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ function evaluateCameraState(frame, fps, keyframes) {
11
+ if (keyframes.length === 0) {
12
+ return {
13
+ x: 960,
14
+ y: 540,
15
+ zoom: 1,
16
+ rotateZ: 0,
17
+ velocity: 0
18
+ };
19
+ }
20
+ let x = keyframes[0].x;
21
+ let y = keyframes[0].y;
22
+ let zoom = keyframes[0].zoom;
23
+ let rotateZ = keyframes[0].rotateZ ?? 0;
24
+ let velocity = 0;
25
+ for (let i = 1; i < keyframes.length; i++) {
26
+ const prev = keyframes[i - 1];
27
+ const curr = keyframes[i];
28
+ if (frame < curr.startFrame) {
29
+ break;
30
+ }
31
+ const p = spring({
32
+ frame: frame - curr.startFrame,
33
+ fps,
34
+ config: {
35
+ damping: 200,
36
+ stiffness: curr.stiffness ?? 42,
37
+ mass: 1.25
38
+ }
39
+ });
40
+ const midFlightArc = 0.5 * (1 - Math.cos(2 * Math.PI * p));
41
+ const zoomDip = (curr.flightZoomDip ?? 0) * midFlightArc;
42
+ const bankAdd = (curr.flightBankDeg ?? 0) * midFlightArc;
43
+ x += (curr.x - prev.x) * p;
44
+ y += (curr.y - prev.y) * p;
45
+ zoom += (curr.zoom - prev.zoom) * p + zoomDip;
46
+ rotateZ += ((curr.rotateZ ?? 0) - (prev.rotateZ ?? 0)) * p + bankAdd;
47
+ velocity = Math.max(velocity, midFlightArc);
48
+ }
49
+ const floatX = Math.sin(frame / 45) * 4;
50
+ const floatY = Math.cos(frame / 55) * 3.5;
51
+ return {
52
+ x: x + floatX,
53
+ y: y + floatY,
54
+ zoom,
55
+ rotateZ,
56
+ velocity
57
+ };
58
+ }
59
+ var CameraRig = ({
60
+ keyframes,
61
+ stageWidth = 1920,
62
+ stageHeight = 1080,
63
+ variant = "light",
64
+ children
65
+ }) => {
66
+ const frame = useCurrentFrame();
67
+ const { fps } = useVideoConfig();
68
+ useStudioFontsReady();
69
+ const cam = evaluateCameraState(frame, fps, keyframes);
70
+ const centerX = stageWidth / 2;
71
+ const centerY = stageHeight / 2;
72
+ const gridSpacing = Math.max(24, 80 * cam.zoom);
73
+ const dotSpacing = Math.max(16, 40 * cam.zoom);
74
+ const gridOffsetX = centerX - cam.x * cam.zoom;
75
+ const gridOffsetY = centerY - cam.y * cam.zoom;
76
+ const isDark = variant === "dark";
77
+ return /* @__PURE__ */ jsxs(
78
+ AbsoluteFill,
79
+ {
80
+ style: {
81
+ backgroundColor: isDark ? THEME.colors.bgPrimary : STUDIO_THEME.colors.bgCanvas,
82
+ overflow: "hidden"
83
+ },
84
+ children: [
85
+ /* @__PURE__ */ jsx(
86
+ AbsoluteFill,
87
+ {
88
+ style: {
89
+ backgroundImage: isDark ? `
90
+ radial-gradient(circle at 20% 25%, rgba(0, 240, 255, 0.14) 0%, transparent 48%),
91
+ radial-gradient(circle at 80% 30%, rgba(139, 92, 246, 0.16) 0%, transparent 50%),
92
+ radial-gradient(circle at 50% 82%, rgba(16, 185, 129, 0.12) 0%, transparent 55%)
93
+ ` : `
94
+ radial-gradient(circle at 20% 25%, rgba(165, 180, 252, 0.35) 0%, transparent 48%),
95
+ radial-gradient(circle at 80% 30%, rgba(199, 210, 254, 0.32) 0%, transparent 50%),
96
+ radial-gradient(circle at 50% 82%, rgba(224, 231, 255, 0.42) 0%, transparent 55%)
97
+ `,
98
+ pointerEvents: "none"
99
+ }
100
+ }
101
+ ),
102
+ /* @__PURE__ */ jsx(
103
+ AbsoluteFill,
104
+ {
105
+ style: {
106
+ backgroundImage: isDark ? `
107
+ linear-gradient(to right, rgba(255, 255, 255, 0.045) 1px, transparent 1px),
108
+ linear-gradient(to bottom, rgba(255, 255, 255, 0.045) 1px, transparent 1px)
109
+ ` : `
110
+ linear-gradient(to right, rgba(15, 23, 42, 0.045) 1px, transparent 1px),
111
+ linear-gradient(to bottom, rgba(15, 23, 42, 0.045) 1px, transparent 1px)
112
+ `,
113
+ backgroundSize: `${gridSpacing}px ${gridSpacing}px`,
114
+ backgroundPosition: `${gridOffsetX}px ${gridOffsetY}px`,
115
+ pointerEvents: "none"
116
+ }
117
+ }
118
+ ),
119
+ /* @__PURE__ */ jsx(
120
+ AbsoluteFill,
121
+ {
122
+ style: {
123
+ backgroundImage: isDark ? "radial-gradient(rgba(56, 189, 248, 0.18) 1.5px, transparent 1.5px)" : "radial-gradient(rgba(37, 99, 235, 0.14) 1.5px, transparent 1.5px)",
124
+ backgroundSize: `${dotSpacing}px ${dotSpacing}px`,
125
+ backgroundPosition: `${gridOffsetX + dotSpacing / 2}px ${gridOffsetY + dotSpacing / 2}px`,
126
+ pointerEvents: "none"
127
+ }
128
+ }
129
+ ),
130
+ /* @__PURE__ */ jsx(
131
+ "div",
132
+ {
133
+ style: {
134
+ position: "absolute",
135
+ left: 0,
136
+ top: 0,
137
+ width: 0,
138
+ height: 0,
139
+ transformOrigin: "0 0",
140
+ willChange: "transform",
141
+ transform: `translate3d(${centerX}px, ${centerY}px, 0) scale(${cam.zoom}) rotate(${cam.rotateZ}deg) translate3d(${-cam.x}px, ${-cam.y}px, 0)`
142
+ },
143
+ children
144
+ }
145
+ )
146
+ ]
147
+ }
148
+ );
149
+ };
150
+
151
+ // packages/kits/src/motion-diagrams-2d/NodeBox.tsx
152
+ import { spring as spring2, useCurrentFrame as useCurrentFrame2, useVideoConfig as useVideoConfig2 } from "remotion";
153
+ import {
154
+ SPRING_PRESETS,
155
+ STUDIO_FONTS,
156
+ STUDIO_THEME as STUDIO_THEME2
157
+ } from "@make-pictures/core";
158
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
159
+ var portRight = (n, dy = 0) => ({
160
+ x: n.cx + n.w / 2,
161
+ y: n.cy + dy
162
+ });
163
+ var portLeft = (n, dy = 0) => ({
164
+ x: n.cx - n.w / 2,
165
+ y: n.cy + dy
166
+ });
167
+ var portTop = (n, dx = 0) => ({
168
+ x: n.cx + dx,
169
+ y: n.cy - n.h / 2
170
+ });
171
+ var portBottom = (n, dx = 0) => ({
172
+ x: n.cx + dx,
173
+ y: n.cy + n.h / 2
174
+ });
175
+ var WorldBox = ({
176
+ node,
177
+ scale = 1,
178
+ opacity = 1,
179
+ zIndex = 2,
180
+ style,
181
+ children
182
+ }) => /* @__PURE__ */ jsx2(
183
+ "div",
184
+ {
185
+ style: {
186
+ position: "absolute",
187
+ left: node.cx - node.w / 2,
188
+ top: node.cy - node.h / 2,
189
+ width: node.w,
190
+ height: node.h,
191
+ boxSizing: "border-box",
192
+ transformOrigin: "center center",
193
+ transform: `scale(${scale})`,
194
+ opacity,
195
+ zIndex,
196
+ fontFamily: STUDIO_FONTS.sans,
197
+ ...style
198
+ },
199
+ children
200
+ }
201
+ );
202
+ var FlowCurve = ({
203
+ from,
204
+ to,
205
+ curveY = 0,
206
+ curveX = 0,
207
+ orientation = "horizontal",
208
+ color = STUDIO_THEME2.colors.brand[600],
209
+ activeFromFrame,
210
+ packetSpeedFrames = 100,
211
+ packetCount = 2,
212
+ strokeWidth = 4,
213
+ dashed = false,
214
+ blocked = false
215
+ }) => {
216
+ const frame = useCurrentFrame2();
217
+ const { fps } = useVideoConfig2();
218
+ const dx = to.x - from.x;
219
+ const dy = to.y - from.y;
220
+ const p0 = from;
221
+ const p1 = orientation === "vertical" ? { x: from.x + curveX, y: from.y + dy * 0.45 } : { x: from.x + dx * 0.4, y: from.y + curveY };
222
+ const p2 = orientation === "vertical" ? { x: to.x + curveX, y: to.y - dy * 0.45 } : { x: from.x + dx * 0.6, y: to.y + curveY };
223
+ const p3 = to;
224
+ const d = `M ${p0.x} ${p0.y} C ${p1.x} ${p1.y}, ${p2.x} ${p2.y}, ${p3.x} ${p3.y}`;
225
+ const drawProgress = spring2({
226
+ frame: frame - activeFromFrame,
227
+ fps,
228
+ config: SPRING_PRESETS.smooth
229
+ });
230
+ if (drawProgress <= 0.01) return null;
231
+ const evalBezier = (t) => {
232
+ const u = 1 - t;
233
+ return {
234
+ x: u * u * u * p0.x + 3 * u * u * t * p1.x + 3 * u * t * t * p2.x + t * t * t * p3.x,
235
+ y: u * u * u * p0.y + 3 * u * u * t * p1.y + 3 * u * t * t * p2.y + t * t * t * p3.y
236
+ };
237
+ };
238
+ const packets = [];
239
+ if (!blocked && frame >= activeFromFrame + 10) {
240
+ for (let i = 0; i < packetCount; i++) {
241
+ const offset = i / packetCount * packetSpeedFrames;
242
+ const elapsed = frame - (activeFromFrame + 10) - offset;
243
+ if (elapsed < 0) continue;
244
+ const t = elapsed % packetSpeedFrames / packetSpeedFrames;
245
+ const alpha = t < 0.1 ? t / 0.1 : t > 0.9 ? (1 - t) / 0.1 : 1;
246
+ const pt = evalBezier(t);
247
+ packets.push({ x: pt.x, y: pt.y, alpha });
248
+ }
249
+ }
250
+ return /* @__PURE__ */ jsxs2(
251
+ "svg",
252
+ {
253
+ style: {
254
+ position: "absolute",
255
+ left: 0,
256
+ top: 0,
257
+ width: 1,
258
+ height: 1,
259
+ overflow: "visible",
260
+ pointerEvents: "none",
261
+ zIndex: 1
262
+ },
263
+ children: [
264
+ /* @__PURE__ */ jsx2(
265
+ "path",
266
+ {
267
+ d,
268
+ fill: "none",
269
+ stroke: color,
270
+ strokeWidth: strokeWidth + 6,
271
+ strokeOpacity: 0.14 * drawProgress,
272
+ strokeLinecap: "round"
273
+ }
274
+ ),
275
+ /* @__PURE__ */ jsx2(
276
+ "path",
277
+ {
278
+ d,
279
+ fill: "none",
280
+ stroke: color,
281
+ strokeWidth,
282
+ strokeOpacity: 0.85 * drawProgress,
283
+ strokeDasharray: dashed ? "10 10" : void 0,
284
+ strokeLinecap: "round"
285
+ }
286
+ ),
287
+ /* @__PURE__ */ jsx2(
288
+ "circle",
289
+ {
290
+ cx: from.x,
291
+ cy: from.y,
292
+ r: 6,
293
+ fill: "#FFFFFF",
294
+ stroke: color,
295
+ strokeWidth: 3,
296
+ opacity: drawProgress
297
+ }
298
+ ),
299
+ /* @__PURE__ */ jsx2(
300
+ "circle",
301
+ {
302
+ cx: to.x,
303
+ cy: to.y,
304
+ r: 6,
305
+ fill: "#FFFFFF",
306
+ stroke: color,
307
+ strokeWidth: 3,
308
+ opacity: drawProgress
309
+ }
310
+ ),
311
+ packets.map((pkt, idx) => /* @__PURE__ */ jsxs2("g", { opacity: pkt.alpha * drawProgress, children: [
312
+ /* @__PURE__ */ jsx2("circle", { cx: pkt.x, cy: pkt.y, r: 12, fill: color, opacity: 0.22 }),
313
+ /* @__PURE__ */ jsx2(
314
+ "circle",
315
+ {
316
+ cx: pkt.x,
317
+ cy: pkt.y,
318
+ r: 6.5,
319
+ fill: "#FFFFFF",
320
+ stroke: color,
321
+ strokeWidth: 3
322
+ }
323
+ )
324
+ ] }, idx))
325
+ ]
326
+ }
327
+ );
328
+ };
329
+
330
+ // packages/kits/src/motion-diagrams-2d/SystemNode.tsx
331
+ import { interpolate, spring as spring3, useCurrentFrame as useCurrentFrame3, useVideoConfig as useVideoConfig3 } from "remotion";
332
+ import { FONTS, SPRING_PRESETS as SPRING_PRESETS2, THEME as THEME2 } from "@make-pictures/core";
333
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
334
+ var SystemNode = ({
335
+ title,
336
+ subtitle,
337
+ badge,
338
+ statusText,
339
+ activeStatusText,
340
+ icon: Icon,
341
+ x,
342
+ y,
343
+ width = 340,
344
+ height = 188,
345
+ accentColor = THEME2.colors.accents.cyan,
346
+ enterFrame = 0,
347
+ activeRanges = [],
348
+ metricsLabel,
349
+ metricsValue
350
+ }) => {
351
+ const frame = useCurrentFrame3();
352
+ const { fps } = useVideoConfig3();
353
+ const enterProgress = spring3({
354
+ frame: frame - enterFrame,
355
+ fps,
356
+ config: SPRING_PRESETS2.snappy
357
+ });
358
+ if (enterProgress <= 2e-3) {
359
+ return null;
360
+ }
361
+ let activeStrength = 0;
362
+ for (const [start, end] of activeRanges) {
363
+ if (frame >= start - 8 && frame <= end + 24) {
364
+ const rampIn = spring3({
365
+ frame: frame - start,
366
+ fps,
367
+ config: SPRING_PRESETS2.smooth
368
+ });
369
+ const rampOut = interpolate(frame, [end, end + 22], [1, 0], {
370
+ extrapolateLeft: "clamp",
371
+ extrapolateRight: "clamp"
372
+ });
373
+ activeStrength = Math.max(activeStrength, rampIn * rampOut);
374
+ }
375
+ }
376
+ const isCurrentlyActive = activeStrength > 0.35;
377
+ const pulseWave = interpolate(
378
+ Math.sin((frame - enterFrame) * 0.045),
379
+ [-1, 1],
380
+ [0.82, 1.1]
381
+ );
382
+ const glowIntensity = activeStrength * pulseWave;
383
+ const scale = interpolate(enterProgress, [0, 1], [0.88, 1]) + interpolate(activeStrength, [0, 1], [0, 0.024]);
384
+ const translateY = interpolate(enterProgress, [0, 1], [28, 0]);
385
+ const opacity = interpolate(enterProgress, [0, 0.65, 1], [0, 0.9, 1]);
386
+ const displayedStatus = isCurrentlyActive && activeStatusText ? activeStatusText : statusText;
387
+ return /* @__PURE__ */ jsxs3(
388
+ "div",
389
+ {
390
+ style: {
391
+ position: "absolute",
392
+ left: x - width / 2,
393
+ top: y - height / 2,
394
+ width,
395
+ height,
396
+ opacity,
397
+ willChange: "transform, opacity",
398
+ transform: `translate3d(0, ${translateY}px, 0) scale(${scale})`,
399
+ borderRadius: THEME2.radii.lg,
400
+ backgroundColor: "rgba(15, 18, 29, 0.95)",
401
+ backgroundImage: `radial-gradient(130% 110% at 50% 0%, ${accentColor}${isCurrentlyActive ? "26" : "0E"} 0%, rgba(15, 18, 29, 0.6) 68%)`,
402
+ border: `1px solid ${isCurrentlyActive ? `${accentColor}88` : "rgba(255, 255, 255, 0.09)"}`,
403
+ boxShadow: activeStrength > 0.02 ? THEME2.shadows.glow(accentColor, glowIntensity) : THEME2.shadows.card,
404
+ padding: "20px 22px",
405
+ display: "flex",
406
+ flexDirection: "column",
407
+ justifyContent: "space-between",
408
+ boxSizing: "border-box",
409
+ overflow: "hidden"
410
+ },
411
+ children: [
412
+ /* @__PURE__ */ jsx3(
413
+ "div",
414
+ {
415
+ style: {
416
+ position: "absolute",
417
+ top: 0,
418
+ left: "12%",
419
+ right: "12%",
420
+ height: 1.5,
421
+ background: `linear-gradient(90deg, transparent, ${isCurrentlyActive ? accentColor : "rgba(255,255,255,0.22)"}, transparent)`,
422
+ opacity: interpolate(activeStrength, [0, 1], [0.55, 1])
423
+ }
424
+ }
425
+ ),
426
+ /* @__PURE__ */ jsxs3(
427
+ "div",
428
+ {
429
+ style: {
430
+ display: "flex",
431
+ alignItems: "center",
432
+ justifyContent: "space-between"
433
+ },
434
+ children: [
435
+ /* @__PURE__ */ jsx3(
436
+ "div",
437
+ {
438
+ style: {
439
+ width: 44,
440
+ height: 44,
441
+ borderRadius: 12,
442
+ backgroundColor: `${accentColor}${isCurrentlyActive ? "28" : "14"}`,
443
+ border: `1px solid ${accentColor}${isCurrentlyActive ? "77" : "33"}`,
444
+ boxShadow: isCurrentlyActive ? `0 0 22px ${accentColor}55` : "none",
445
+ display: "flex",
446
+ alignItems: "center",
447
+ justifyContent: "center"
448
+ },
449
+ children: /* @__PURE__ */ jsx3(
450
+ Icon,
451
+ {
452
+ size: 22,
453
+ color: isCurrentlyActive ? "#FFFFFF" : accentColor,
454
+ strokeWidth: 2
455
+ }
456
+ )
457
+ }
458
+ ),
459
+ /* @__PURE__ */ jsx3(
460
+ "div",
461
+ {
462
+ style: {
463
+ padding: "4px 10px",
464
+ borderRadius: THEME2.radii.pill,
465
+ backgroundColor: "rgba(255, 255, 255, 0.045)",
466
+ border: "1px solid rgba(255, 255, 255, 0.08)",
467
+ fontFamily: FONTS.mono,
468
+ fontSize: 11,
469
+ fontWeight: 500,
470
+ letterSpacing: "0.06em",
471
+ textTransform: "uppercase",
472
+ color: isCurrentlyActive ? accentColor : THEME2.colors.textSecondary
473
+ },
474
+ children: badge
475
+ }
476
+ )
477
+ ]
478
+ }
479
+ ),
480
+ /* @__PURE__ */ jsxs3("div", { style: { marginTop: 6 }, children: [
481
+ /* @__PURE__ */ jsx3(
482
+ "div",
483
+ {
484
+ style: {
485
+ fontFamily: FONTS.sans,
486
+ fontSize: 21,
487
+ fontWeight: 600,
488
+ letterSpacing: "-0.025em",
489
+ color: THEME2.colors.textPrimary,
490
+ lineHeight: 1.2
491
+ },
492
+ children: title
493
+ }
494
+ ),
495
+ /* @__PURE__ */ jsx3(
496
+ "div",
497
+ {
498
+ style: {
499
+ fontFamily: FONTS.sans,
500
+ fontSize: 13,
501
+ fontWeight: 400,
502
+ color: THEME2.colors.textSecondary,
503
+ marginTop: 4,
504
+ lineHeight: 1.35
505
+ },
506
+ children: subtitle
507
+ }
508
+ )
509
+ ] }),
510
+ /* @__PURE__ */ jsxs3(
511
+ "div",
512
+ {
513
+ style: {
514
+ display: "flex",
515
+ alignItems: "center",
516
+ justifyContent: "space-between",
517
+ paddingTop: 10,
518
+ borderTop: "1px solid rgba(255, 255, 255, 0.06)"
519
+ },
520
+ children: [
521
+ /* @__PURE__ */ jsxs3(
522
+ "div",
523
+ {
524
+ style: {
525
+ display: "flex",
526
+ alignItems: "center",
527
+ gap: 8
528
+ },
529
+ children: [
530
+ /* @__PURE__ */ jsx3(
531
+ "span",
532
+ {
533
+ style: {
534
+ width: 8,
535
+ height: 8,
536
+ borderRadius: "50%",
537
+ backgroundColor: isCurrentlyActive ? accentColor : "rgba(148, 163, 184, 0.45)",
538
+ boxShadow: isCurrentlyActive ? `0 0 12px ${accentColor}, 0 0 24px ${accentColor}` : "none"
539
+ }
540
+ }
541
+ ),
542
+ /* @__PURE__ */ jsx3(
543
+ "span",
544
+ {
545
+ style: {
546
+ fontFamily: FONTS.mono,
547
+ fontSize: 11.5,
548
+ fontWeight: 500,
549
+ color: isCurrentlyActive ? THEME2.colors.textPrimary : THEME2.colors.textMuted,
550
+ letterSpacing: "0.02em"
551
+ },
552
+ children: displayedStatus
553
+ }
554
+ )
555
+ ]
556
+ }
557
+ ),
558
+ metricsLabel && metricsValue && /* @__PURE__ */ jsxs3(
559
+ "div",
560
+ {
561
+ style: {
562
+ fontFamily: FONTS.mono,
563
+ fontSize: 11,
564
+ color: THEME2.colors.textSecondary
565
+ },
566
+ children: [
567
+ /* @__PURE__ */ jsxs3("span", { style: { color: THEME2.colors.textMuted }, children: [
568
+ metricsLabel,
569
+ ": "
570
+ ] }),
571
+ /* @__PURE__ */ jsx3("span", { style: { color: isCurrentlyActive ? accentColor : "#E2E8F0" }, children: metricsValue })
572
+ ]
573
+ }
574
+ )
575
+ ]
576
+ }
577
+ )
578
+ ]
579
+ }
580
+ );
581
+ };
582
+
583
+ // packages/kits/src/motion-diagrams-2d/DataFlowEdge.tsx
584
+ import { interpolate as interpolate2, spring as spring4, useCurrentFrame as useCurrentFrame4, useVideoConfig as useVideoConfig4 } from "remotion";
585
+ import { FONTS as FONTS2, SPRING_PRESETS as SPRING_PRESETS3, THEME as THEME3 } from "@make-pictures/core";
586
+ import { Fragment, jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
587
+ function evaluateCubicBezier(p0, p1, p2, p3, t) {
588
+ const u = 1 - t;
589
+ const tt = t * t;
590
+ const uu = u * u;
591
+ const uuu = uu * u;
592
+ const ttt = tt * t;
593
+ return {
594
+ x: uuu * p0.x + 3 * uu * t * p1.x + 3 * u * tt * p2.x + ttt * p3.x,
595
+ y: uuu * p0.y + 3 * uu * t * p1.y + 3 * u * tt * p2.y + ttt * p3.y
596
+ };
597
+ }
598
+ var DataFlowEdge = ({
599
+ id,
600
+ from,
601
+ to,
602
+ curveOffsetY = -70,
603
+ color = THEME3.colors.accents.cyan,
604
+ secondaryColor,
605
+ drawStartFrame = 0,
606
+ flowStartFrame = 30,
607
+ flowEndFrame = 600,
608
+ packetCount = 2,
609
+ traverseFrames = 96,
610
+ direction = "forward",
611
+ label,
612
+ subLabel,
613
+ labelOffsetY = -28
614
+ }) => {
615
+ const frame = useCurrentFrame4();
616
+ const { fps } = useVideoConfig4();
617
+ const endColor = secondaryColor ?? color;
618
+ const dx = to.x - from.x;
619
+ const p0 = from;
620
+ const p1 = {
621
+ x: from.x + dx * 0.36,
622
+ y: from.y + curveOffsetY
623
+ };
624
+ const p2 = {
625
+ x: from.x + dx * 0.64,
626
+ y: to.y + curveOffsetY
627
+ };
628
+ const p3 = to;
629
+ const pathData = `M ${p0.x} ${p0.y} C ${p1.x} ${p1.y}, ${p2.x} ${p2.y}, ${p3.x} ${p3.y}`;
630
+ const drawProgress = spring4({
631
+ frame: frame - drawStartFrame,
632
+ fps,
633
+ config: SPRING_PRESETS3.smooth
634
+ });
635
+ if (drawProgress <= 5e-3) {
636
+ return null;
637
+ }
638
+ const isFlowActive = frame >= flowStartFrame && frame <= flowEndFrame;
639
+ const flowFadeIn = interpolate2(
640
+ frame,
641
+ [flowStartFrame, flowStartFrame + 16],
642
+ [0, 1],
643
+ { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
644
+ );
645
+ const flowFadeOut = interpolate2(
646
+ frame,
647
+ [flowEndFrame - 18, flowEndFrame],
648
+ [1, 0],
649
+ { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
650
+ );
651
+ const flowAlpha = isFlowActive ? flowFadeIn * flowFadeOut : 0;
652
+ const midPoint = evaluateCubicBezier(p0, p1, p2, p3, 0.5);
653
+ const pathLengthEstimate = 1600;
654
+ const dashOffset = interpolate2(
655
+ drawProgress,
656
+ [0, 1],
657
+ [pathLengthEstimate, 0]
658
+ );
659
+ const gradId = `edge-grad-${id}`;
660
+ const packets = [];
661
+ if (flowAlpha > 0.01) {
662
+ for (let i = 0; i < packetCount; i++) {
663
+ const staggerFrames = Math.round(i / packetCount * traverseFrames);
664
+ const localElapsed = frame - flowStartFrame - staggerFrames;
665
+ if (localElapsed < 0) continue;
666
+ const rawProgress = localElapsed % traverseFrames / traverseFrames;
667
+ const t = direction === "forward" ? rawProgress : 1 - rawProgress;
668
+ const edgeFade = interpolate2(t, [0, 0.08, 0.92, 1], [0, 1, 1, 0], {
669
+ extrapolateLeft: "clamp",
670
+ extrapolateRight: "clamp"
671
+ }) * flowAlpha;
672
+ const head = evaluateCubicBezier(p0, p1, p2, p3, t);
673
+ const trail = [];
674
+ const trailSteps = 5;
675
+ for (let s = 1; s <= trailSteps; s++) {
676
+ const dt = s * 0.016 * (direction === "forward" ? -1 : 1);
677
+ const clampedT = Math.max(0, Math.min(1, t + dt));
678
+ trail.push(evaluateCubicBezier(p0, p1, p2, p3, clampedT));
679
+ }
680
+ packets.push({ head, trail, opacity: edgeFade });
681
+ }
682
+ }
683
+ return /* @__PURE__ */ jsxs4(
684
+ "div",
685
+ {
686
+ style: {
687
+ position: "absolute",
688
+ inset: 0,
689
+ pointerEvents: "none"
690
+ },
691
+ children: [
692
+ /* @__PURE__ */ jsxs4(
693
+ "svg",
694
+ {
695
+ width: 1920,
696
+ height: 1080,
697
+ viewBox: "0 0 1920 1080",
698
+ style: { position: "absolute", inset: 0, overflow: "visible" },
699
+ children: [
700
+ /* @__PURE__ */ jsx4("defs", { children: /* @__PURE__ */ jsxs4(
701
+ "linearGradient",
702
+ {
703
+ id: gradId,
704
+ x1: from.x,
705
+ y1: from.y,
706
+ x2: to.x,
707
+ y2: to.y,
708
+ gradientUnits: "userSpaceOnUse",
709
+ children: [
710
+ /* @__PURE__ */ jsx4("stop", { offset: "0%", stopColor: color }),
711
+ /* @__PURE__ */ jsx4("stop", { offset: "100%", stopColor: endColor })
712
+ ]
713
+ }
714
+ ) }),
715
+ /* @__PURE__ */ jsx4(
716
+ "path",
717
+ {
718
+ d: pathData,
719
+ fill: "none",
720
+ stroke: "rgba(255, 255, 255, 0.09)",
721
+ strokeWidth: 2,
722
+ strokeDasharray: pathLengthEstimate,
723
+ strokeDashoffset: dashOffset,
724
+ strokeLinecap: "round"
725
+ }
726
+ ),
727
+ /* @__PURE__ */ jsx4(
728
+ "path",
729
+ {
730
+ d: pathData,
731
+ fill: "none",
732
+ stroke: `url(#${gradId})`,
733
+ strokeWidth: 2,
734
+ strokeDasharray: "6 10",
735
+ strokeOpacity: 0.32 * drawProgress + 0.35 * flowAlpha,
736
+ strokeLinecap: "round"
737
+ }
738
+ ),
739
+ flowAlpha > 0.01 && /* @__PURE__ */ jsxs4(Fragment, { children: [
740
+ /* @__PURE__ */ jsx4(
741
+ "path",
742
+ {
743
+ d: pathData,
744
+ fill: "none",
745
+ stroke: `url(#${gradId})`,
746
+ strokeWidth: 11,
747
+ strokeOpacity: 0.14 * flowAlpha,
748
+ strokeLinecap: "round"
749
+ }
750
+ ),
751
+ /* @__PURE__ */ jsx4(
752
+ "path",
753
+ {
754
+ d: pathData,
755
+ fill: "none",
756
+ stroke: `url(#${gradId})`,
757
+ strokeWidth: 3,
758
+ strokeOpacity: 0.62 * flowAlpha,
759
+ strokeLinecap: "round"
760
+ }
761
+ )
762
+ ] }),
763
+ /* @__PURE__ */ jsx4(
764
+ "circle",
765
+ {
766
+ cx: from.x,
767
+ cy: from.y,
768
+ r: 4.5,
769
+ fill: color,
770
+ opacity: drawProgress
771
+ }
772
+ ),
773
+ /* @__PURE__ */ jsx4(
774
+ "circle",
775
+ {
776
+ cx: to.x,
777
+ cy: to.y,
778
+ r: 4.5,
779
+ fill: endColor,
780
+ opacity: drawProgress
781
+ }
782
+ ),
783
+ packets.map((pkt, idx) => /* @__PURE__ */ jsxs4("g", { opacity: pkt.opacity, children: [
784
+ pkt.trail.map((pt, tIdx) => {
785
+ const ratio = 1 - (tIdx + 1) / (pkt.trail.length + 1);
786
+ return /* @__PURE__ */ jsx4(
787
+ "circle",
788
+ {
789
+ cx: pt.x,
790
+ cy: pt.y,
791
+ r: 5.2 * ratio,
792
+ fill: color,
793
+ opacity: 0.4 * ratio
794
+ },
795
+ `trail-${tIdx}`
796
+ );
797
+ }),
798
+ /* @__PURE__ */ jsx4(
799
+ "circle",
800
+ {
801
+ cx: pkt.head.x,
802
+ cy: pkt.head.y,
803
+ r: 16,
804
+ fill: color,
805
+ opacity: 0.14
806
+ }
807
+ ),
808
+ /* @__PURE__ */ jsx4(
809
+ "circle",
810
+ {
811
+ cx: pkt.head.x,
812
+ cy: pkt.head.y,
813
+ r: 10,
814
+ fill: color,
815
+ opacity: 0.28
816
+ }
817
+ ),
818
+ /* @__PURE__ */ jsx4(
819
+ "circle",
820
+ {
821
+ cx: pkt.head.x,
822
+ cy: pkt.head.y,
823
+ r: 5.2,
824
+ fill: "#FFFFFF",
825
+ stroke: color,
826
+ strokeWidth: 2.5
827
+ }
828
+ )
829
+ ] }, `pkt-${idx}`))
830
+ ]
831
+ }
832
+ ),
833
+ label && drawProgress > 0.4 && /* @__PURE__ */ jsxs4(
834
+ "div",
835
+ {
836
+ style: {
837
+ position: "absolute",
838
+ left: midPoint.x,
839
+ top: midPoint.y + labelOffsetY,
840
+ transform: `translate3d(-50%, -50%, 0) scale(${interpolate2(
841
+ drawProgress,
842
+ [0.4, 1],
843
+ [0.85, 1],
844
+ { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
845
+ )})`,
846
+ opacity: interpolate2(drawProgress, [0.4, 0.9], [0, 1], {
847
+ extrapolateLeft: "clamp",
848
+ extrapolateRight: "clamp"
849
+ }),
850
+ padding: "5px 12px",
851
+ borderRadius: THEME3.radii.pill,
852
+ backgroundColor: "rgba(11, 14, 23, 0.94)",
853
+ border: `1px solid ${flowAlpha > 0.2 ? `${color}77` : "rgba(255,255,255,0.1)"}`,
854
+ boxShadow: flowAlpha > 0.2 ? `0 0 20px ${color}33, 0 8px 20px rgba(0,0,0,0.6)` : "0 8px 20px rgba(0,0,0,0.6)",
855
+ display: "flex",
856
+ alignItems: "center",
857
+ gap: 7,
858
+ whiteSpace: "nowrap"
859
+ },
860
+ children: [
861
+ /* @__PURE__ */ jsx4(
862
+ "span",
863
+ {
864
+ style: {
865
+ width: 6,
866
+ height: 6,
867
+ borderRadius: "50%",
868
+ backgroundColor: color,
869
+ boxShadow: flowAlpha > 0.2 ? `0 0 8px ${color}` : "none"
870
+ }
871
+ }
872
+ ),
873
+ /* @__PURE__ */ jsx4(
874
+ "span",
875
+ {
876
+ style: {
877
+ fontFamily: FONTS2.mono,
878
+ fontSize: 11,
879
+ fontWeight: 600,
880
+ color: THEME3.colors.textPrimary,
881
+ letterSpacing: "0.04em"
882
+ },
883
+ children: label
884
+ }
885
+ ),
886
+ subLabel && /* @__PURE__ */ jsxs4(
887
+ "span",
888
+ {
889
+ style: {
890
+ fontFamily: FONTS2.mono,
891
+ fontSize: 10.5,
892
+ color: THEME3.colors.textSecondary
893
+ },
894
+ children: [
895
+ "\u2022 ",
896
+ subLabel
897
+ ]
898
+ }
899
+ )
900
+ ]
901
+ }
902
+ )
903
+ ]
904
+ }
905
+ );
906
+ };
907
+
908
+ // packages/kits/src/motion-diagrams-2d/CodePayloadToast.tsx
909
+ import { interpolate as interpolate3, spring as spring5, useCurrentFrame as useCurrentFrame5, useVideoConfig as useVideoConfig5 } from "remotion";
910
+ import { FONTS as FONTS3, SPRING_PRESETS as SPRING_PRESETS4, THEME as THEME4 } from "@make-pictures/core";
911
+ import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
912
+ function renderHighlightedLine(line, accentColor) {
913
+ const jsonKeyMatch = line.match(/^(\s*)("[^"]+")(\s*:\s*)(.*)$/);
914
+ if (jsonKeyMatch) {
915
+ const [, indent, keyPart, colonPart, valuePart] = jsonKeyMatch;
916
+ return /* @__PURE__ */ jsxs5(Fragment2, { children: [
917
+ /* @__PURE__ */ jsx5("span", { children: indent }),
918
+ /* @__PURE__ */ jsx5("span", { style: { color: "#93C5FD" }, children: keyPart }),
919
+ /* @__PURE__ */ jsx5("span", { style: { color: "#64748B" }, children: colonPart }),
920
+ renderJsonValue(valuePart, accentColor)
921
+ ] });
922
+ }
923
+ const sqlKeywords = /\b(INSERT|INTO|VALUES|SELECT|FROM|WHERE|RETURNING|await|const|return)\b/g;
924
+ if (sqlKeywords.test(line)) {
925
+ const tokens = line.split(/(\b(?:INSERT|INTO|VALUES|SELECT|FROM|WHERE|RETURNING|await|const|return)\b)/g);
926
+ return tokens.map(
927
+ (tok, idx) => /^(INSERT|INTO|VALUES|SELECT|FROM|WHERE|RETURNING|await|const|return)$/.test(tok) ? /* @__PURE__ */ jsx5("span", { style: { color: accentColor, fontWeight: 600 }, children: tok }, idx) : /* @__PURE__ */ jsx5("span", { style: { color: "#E2E8F0" }, children: tok }, idx)
928
+ );
929
+ }
930
+ return /* @__PURE__ */ jsx5("span", { style: { color: "#94A3B8" }, children: line });
931
+ }
932
+ function renderJsonValue(raw, accentColor) {
933
+ const trailingComma = raw.endsWith(",") ? "," : "";
934
+ const clean = raw.endsWith(",") ? raw.slice(0, -1) : raw;
935
+ if (/^".*"$/.test(clean)) {
936
+ return /* @__PURE__ */ jsxs5(Fragment2, { children: [
937
+ /* @__PURE__ */ jsx5("span", { style: { color: "#6EE7B7" }, children: clean }),
938
+ /* @__PURE__ */ jsx5("span", { style: { color: "#64748B" }, children: trailingComma })
939
+ ] });
940
+ }
941
+ if (/^(true|false|null)$/.test(clean)) {
942
+ return /* @__PURE__ */ jsxs5(Fragment2, { children: [
943
+ /* @__PURE__ */ jsx5("span", { style: { color: accentColor, fontWeight: 600 }, children: clean }),
944
+ /* @__PURE__ */ jsx5("span", { style: { color: "#64748B" }, children: trailingComma })
945
+ ] });
946
+ }
947
+ if (/^-?\d+(\.\d+)?$/.test(clean)) {
948
+ return /* @__PURE__ */ jsxs5(Fragment2, { children: [
949
+ /* @__PURE__ */ jsx5("span", { style: { color: "#FCD34D" }, children: clean }),
950
+ /* @__PURE__ */ jsx5("span", { style: { color: "#64748B" }, children: trailingComma })
951
+ ] });
952
+ }
953
+ return /* @__PURE__ */ jsx5("span", { style: { color: "#E2E8F0" }, children: raw });
954
+ }
955
+ var CodePayloadToast = ({
956
+ x,
957
+ y,
958
+ width = 410,
959
+ methodBadge,
960
+ endpoint,
961
+ latencyText = "18ms",
962
+ code,
963
+ accentColor = THEME4.colors.accents.cyan,
964
+ startFrame,
965
+ endFrame
966
+ }) => {
967
+ const frame = useCurrentFrame5();
968
+ const { fps } = useVideoConfig5();
969
+ if (frame < startFrame - 2 || frame > endFrame + 24) {
970
+ return null;
971
+ }
972
+ const enterProgress = spring5({
973
+ frame: frame - startFrame,
974
+ fps,
975
+ config: SPRING_PRESETS4.snappy
976
+ });
977
+ const exitProgress = interpolate3(frame, [endFrame, endFrame + 18], [1, 0], {
978
+ extrapolateLeft: "clamp",
979
+ extrapolateRight: "clamp"
980
+ });
981
+ const combined = enterProgress * exitProgress;
982
+ const translateY = interpolate3(enterProgress, [0, 1], [18, 0]);
983
+ const scale = interpolate3(combined, [0, 1], [0.92, 1]);
984
+ const lines = code.trim().split("\n");
985
+ return /* @__PURE__ */ jsxs5(
986
+ "div",
987
+ {
988
+ style: {
989
+ position: "absolute",
990
+ left: x - width / 2,
991
+ top: y,
992
+ width,
993
+ opacity: combined,
994
+ willChange: "transform, opacity",
995
+ transform: `translate3d(0, ${translateY}px, 0) scale(${scale})`,
996
+ borderRadius: THEME4.radii.md,
997
+ backgroundColor: "rgba(11, 14, 23, 0.95)",
998
+ border: `1px solid ${accentColor}44`,
999
+ boxShadow: `0 24px 60px rgba(0, 0, 0, 0.8), 0 0 28px ${accentColor}22, 0 1px 0 rgba(255, 255, 255, 0.1) inset`,
1000
+ overflow: "hidden",
1001
+ pointerEvents: "none"
1002
+ },
1003
+ children: [
1004
+ /* @__PURE__ */ jsxs5(
1005
+ "div",
1006
+ {
1007
+ style: {
1008
+ display: "flex",
1009
+ alignItems: "center",
1010
+ justifyContent: "space-between",
1011
+ padding: "9px 14px",
1012
+ backgroundColor: "rgba(255, 255, 255, 0.03)",
1013
+ borderBottom: "1px solid rgba(255, 255, 255, 0.07)"
1014
+ },
1015
+ children: [
1016
+ /* @__PURE__ */ jsxs5("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
1017
+ /* @__PURE__ */ jsx5(
1018
+ "span",
1019
+ {
1020
+ style: {
1021
+ padding: "2px 7px",
1022
+ borderRadius: 5,
1023
+ backgroundColor: `${accentColor}24`,
1024
+ border: `1px solid ${accentColor}66`,
1025
+ fontFamily: FONTS3.mono,
1026
+ fontSize: 10,
1027
+ fontWeight: 600,
1028
+ color: accentColor,
1029
+ letterSpacing: "0.04em"
1030
+ },
1031
+ children: methodBadge
1032
+ }
1033
+ ),
1034
+ /* @__PURE__ */ jsx5(
1035
+ "span",
1036
+ {
1037
+ style: {
1038
+ fontFamily: FONTS3.mono,
1039
+ fontSize: 11.5,
1040
+ fontWeight: 500,
1041
+ color: THEME4.colors.textPrimary
1042
+ },
1043
+ children: endpoint
1044
+ }
1045
+ )
1046
+ ] }),
1047
+ /* @__PURE__ */ jsx5(
1048
+ "span",
1049
+ {
1050
+ style: {
1051
+ fontFamily: FONTS3.mono,
1052
+ fontSize: 10.5,
1053
+ color: THEME4.colors.textSecondary
1054
+ },
1055
+ children: latencyText
1056
+ }
1057
+ )
1058
+ ]
1059
+ }
1060
+ ),
1061
+ /* @__PURE__ */ jsx5(
1062
+ "div",
1063
+ {
1064
+ style: {
1065
+ padding: "12px 16px",
1066
+ fontFamily: FONTS3.mono,
1067
+ fontSize: 12,
1068
+ lineHeight: 1.55,
1069
+ whiteSpace: "pre"
1070
+ },
1071
+ children: lines.map((line, idx) => {
1072
+ const lineOpacity = interpolate3(
1073
+ frame - startFrame,
1074
+ [idx * 2, idx * 2 + 10],
1075
+ [0, 1],
1076
+ { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
1077
+ );
1078
+ return /* @__PURE__ */ jsxs5(
1079
+ "div",
1080
+ {
1081
+ style: {
1082
+ opacity: lineOpacity,
1083
+ display: "flex"
1084
+ },
1085
+ children: [
1086
+ /* @__PURE__ */ jsx5(
1087
+ "span",
1088
+ {
1089
+ style: {
1090
+ width: 22,
1091
+ color: "rgba(100, 116, 139, 0.45)",
1092
+ userSelect: "none",
1093
+ fontSize: 10.5
1094
+ },
1095
+ children: idx + 1
1096
+ }
1097
+ ),
1098
+ /* @__PURE__ */ jsx5("span", { children: renderHighlightedLine(line, accentColor) })
1099
+ ]
1100
+ },
1101
+ idx
1102
+ );
1103
+ })
1104
+ }
1105
+ )
1106
+ ]
1107
+ }
1108
+ );
1109
+ };
1110
+
1111
+ export {
1112
+ evaluateCameraState,
1113
+ CameraRig,
1114
+ portRight,
1115
+ portLeft,
1116
+ portTop,
1117
+ portBottom,
1118
+ WorldBox,
1119
+ FlowCurve,
1120
+ SystemNode,
1121
+ evaluateCubicBezier,
1122
+ DataFlowEdge,
1123
+ CodePayloadToast
1124
+ };