@neta-art/cohub 11.0.0 → 11.2.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.
Files changed (115) hide show
  1. package/README.md +31 -5
  2. package/dist/board/editor/context.d.ts +1 -0
  3. package/dist/board/editor/context.js +1 -0
  4. package/dist/board/editor/creation.d.ts +2 -2
  5. package/dist/board/editor/creation.js +3 -3
  6. package/dist/board/editor/editor.d.ts +5 -4
  7. package/dist/board/editor/editor.js +8 -1
  8. package/dist/board/editor/index.d.ts +2 -2
  9. package/dist/board/editor/interaction.d.ts +12 -2
  10. package/dist/board/editor/interaction.js +50 -8
  11. package/dist/board/editor/selection-transform.d.ts +1 -1
  12. package/dist/board/editor/selection-transform.js +13 -2
  13. package/dist/board/editor/snapshots.d.ts +0 -2
  14. package/dist/board/editor/snapshots.js +4 -20
  15. package/dist/board/export/index.d.ts +2 -0
  16. package/dist/board/export/index.js +1 -0
  17. package/dist/board/export/scene.d.ts +2 -0
  18. package/dist/board/export/scene.js +8 -1
  19. package/dist/board/model/file-preview.d.ts +0 -1
  20. package/dist/board/model/file-preview.js +10 -1
  21. package/dist/board/model/image-key.js +1 -1
  22. package/dist/board/model/index.d.ts +8 -7
  23. package/dist/board/model/index.js +6 -5
  24. package/dist/board/model/items/create.d.ts +16 -3
  25. package/dist/board/model/items/create.js +125 -5
  26. package/dist/board/model/items/index.d.ts +2 -2
  27. package/dist/board/model/items/index.js +2 -2
  28. package/dist/board/model/media-playback.js +1 -1
  29. package/dist/board/model/overlay-placement.d.ts +25 -0
  30. package/dist/board/model/overlay-placement.js +35 -0
  31. package/dist/board/model/replay.d.ts +1 -1
  32. package/dist/board/model/replay.js +1 -0
  33. package/dist/board/model/script-hit.d.ts +20 -3
  34. package/dist/board/model/script-hit.js +81 -24
  35. package/dist/board/model/script-observers.d.ts +18 -0
  36. package/dist/board/model/script-observers.js +92 -0
  37. package/dist/board/model/script-scene.d.ts +1 -1
  38. package/dist/board/model/script-scene.js +35 -8
  39. package/dist/board/model/script.d.ts +51 -7
  40. package/dist/board/render/audio-waveform.d.ts +1 -1
  41. package/dist/board/render/audio-waveform.js +8 -5
  42. package/dist/board/render/board-background.js +5 -4
  43. package/dist/board/render/card-tag.d.ts +24 -0
  44. package/dist/board/render/card-tag.js +205 -0
  45. package/dist/board/render/index.d.ts +8 -5
  46. package/dist/board/render/index.js +8 -5
  47. package/dist/board/render/media-interaction.d.ts +2 -1
  48. package/dist/board/render/media-interaction.js +15 -7
  49. package/dist/board/render/palette.js +2 -2
  50. package/dist/board/render/renderers/arrow-card-renderer.js +20 -16
  51. package/dist/board/render/renderers/audio-card-renderer.d.ts +8 -1
  52. package/dist/board/render/renderers/audio-card-renderer.js +64 -60
  53. package/dist/board/render/renderers/base-card-renderer.d.ts +1 -26
  54. package/dist/board/render/renderers/base-card-renderer.js +6 -92
  55. package/dist/board/render/renderers/board-renderer-registry.d.ts +25 -2
  56. package/dist/board/render/renderers/board-renderer-registry.js +11 -4
  57. package/dist/board/render/renderers/custom-card-renderer.js +6 -8
  58. package/dist/board/render/renderers/effect-card-renderer.js +0 -5
  59. package/dist/board/render/renderers/file-card-renderer.d.ts +1 -11
  60. package/dist/board/render/renderers/file-card-renderer.js +43 -105
  61. package/dist/board/render/renderers/frame-card-renderer.js +14 -15
  62. package/dist/board/render/renderers/image-card-renderer.js +62 -67
  63. package/dist/board/render/renderers/media-key.d.ts +6 -0
  64. package/dist/board/render/renderers/media-key.js +39 -0
  65. package/dist/board/render/renderers/shape-card-renderer.js +6 -12
  66. package/dist/board/render/renderers/task-card-renderer.d.ts +1 -8
  67. package/dist/board/render/renderers/task-card-renderer.js +286 -111
  68. package/dist/board/render/renderers/unknown-card-renderer.js +17 -16
  69. package/dist/board/render/renderers/video-card-renderer.js +73 -80
  70. package/dist/board/render/script-host.d.ts +1 -1
  71. package/dist/board/render/script-host.js +53 -28
  72. package/dist/board/render/script-runtime.js +13 -3
  73. package/dist/board/render/script-texture.d.ts +11 -0
  74. package/dist/board/render/script-texture.js +33 -0
  75. package/dist/board/render/stroke.d.ts +1 -1
  76. package/dist/board/render/stroke.js +5 -4
  77. package/dist/board/render/style.d.ts +29 -0
  78. package/dist/board/render/style.js +54 -0
  79. package/dist/board/render/surface.d.ts +34 -0
  80. package/dist/board/render/surface.js +132 -0
  81. package/dist/board/render/text-fit.d.ts +8 -0
  82. package/dist/board/render/text-fit.js +60 -0
  83. package/dist/board/render/text-resolution.d.ts +2 -1
  84. package/dist/board/render/text-resolution.js +4 -1
  85. package/dist/board/stage/assets.js +1 -1
  86. package/dist/board/stage/index.d.ts +3 -2
  87. package/dist/board/stage/index.js +2 -1
  88. package/dist/board/stage/overlay.d.ts +41 -0
  89. package/dist/board/stage/overlay.js +182 -0
  90. package/dist/board/stage/scene.d.ts +4 -43
  91. package/dist/board/stage/scene.js +38 -130
  92. package/dist/board/stage/script-pointer.d.ts +1 -0
  93. package/dist/board/stage/script-pointer.js +8 -2
  94. package/dist/board/stage/stage.d.ts +13 -3
  95. package/dist/board/stage/stage.js +217 -53
  96. package/dist/chunks/environment.d.ts +1037 -8
  97. package/dist/chunks/environment.js +12 -4
  98. package/dist/chunks/http.d.ts +51 -2
  99. package/dist/chunks/http.js +10 -1
  100. package/dist/chunks/transport.js +1 -1
  101. package/dist/chunks/websocket.d.ts +1 -1
  102. package/dist/http.d.ts +3 -3
  103. package/dist/index.d.ts +3 -3
  104. package/dist/index.js +151 -139
  105. package/dist/protocol/dist/board-model.d.ts +36 -1
  106. package/dist/protocol/dist/board-model.js +14 -4
  107. package/dist/protocol/dist/board-task.d.ts +22 -0
  108. package/dist/{board/model/task.js → protocol/dist/board-task.js} +34 -7
  109. package/dist/protocol/dist/generation/blocks.d.ts +8 -0
  110. package/dist/{generation-blocks.js → protocol/dist/generation/blocks.js} +14 -15
  111. package/dist/protocol/dist/index.d.ts +5 -2
  112. package/dist/protocol/dist/task/index.d.ts +4 -0
  113. package/package.json +2 -1
  114. package/dist/board/model/task.d.ts +0 -11
  115. package/dist/types.d.ts +0 -36
@@ -1,20 +1,9 @@
1
+ import { cardElevation, containRect, drawCardSurface, traceCardOutline } from "../surface.js";
1
2
  import { positionShell } from "./base-card-renderer.js";
2
3
  import { drawFarPlate } from "./far-plate.js";
3
4
  import { Container, Graphics, Rectangle, Sprite, Texture } from "pixi.js";
4
5
  //#region src/board/render/renderers/image-card-renderer.ts
5
6
  const partsByContainer = /* @__PURE__ */ new WeakMap();
6
- const RADIUS = 2;
7
- function layoutContain(sprite, width, height) {
8
- const texture = sprite.texture;
9
- const tw = texture.width;
10
- const th = texture.height;
11
- if (!tw || !th) return;
12
- const scale = Math.min(width / tw, height / th);
13
- sprite.width = tw * scale;
14
- sprite.height = th * scale;
15
- sprite.x = (width - sprite.width) / 2;
16
- sprite.y = (height - sprite.height) / 2;
17
- }
18
7
  function cropRect(crop) {
19
8
  if (!crop) return null;
20
9
  const w = Math.min(crop.w, 1 - crop.x);
@@ -48,70 +37,85 @@ function showTexture(parts, texture, crop) {
48
37
  if (parts.sprite.texture !== display) parts.sprite.texture = display;
49
38
  if (previous && previous !== parts.cropped) previous.destroy(false);
50
39
  }
40
+ const PRINT_MARGIN = 6;
51
41
  function sync(container, item, context) {
52
42
  const parts = partsByContainer.get(container);
53
43
  if (!parts) return;
54
44
  positionShell(parts.root, item);
55
45
  const { width, height } = item.frame;
56
- const selected = context.selectedIds.has(item.id);
57
- const hovered = context.hoveredId === item.id;
58
46
  const key = context.assetKey(item);
59
47
  const texture = key ? context.getTexture(key) : null;
60
48
  const failed = Boolean(key && !texture && context.hasError(key));
61
- const texId = texture ? `${texture.width}x${texture.height}` : "none";
49
+ const elevation = cardElevation(context, item.id);
62
50
  const sig = [
63
51
  key ?? "",
64
52
  width,
65
53
  height,
66
- selected,
67
- hovered,
68
- texId,
54
+ texture ? `${texture.width}x${texture.height}` : "none",
69
55
  JSON.stringify(item.props.crop ?? null),
70
56
  failed,
71
- context.colorScheme
57
+ elevation,
58
+ context.themeKey
72
59
  ].join("|");
73
60
  if (sig === parts.sig) return;
74
61
  parts.sig = sig;
75
62
  showTexture(parts, texture, item.props.crop);
63
+ const display = parts.sprite.texture;
64
+ const framed = context.style.media === "framed";
65
+ const margin = framed ? Math.min(PRINT_MARGIN, width / 8, height / 8) : 0;
66
+ const area = {
67
+ x: margin,
68
+ y: margin,
69
+ width: width - margin * 2,
70
+ height: height - margin * 2
71
+ };
72
+ const fitted = texture ? containRect(area.width, area.height, display.width, display.height) : {
73
+ ...area,
74
+ x: 0,
75
+ y: 0
76
+ };
77
+ const picture = {
78
+ x: area.x + fitted.x,
79
+ y: area.y + fitted.y,
80
+ width: fitted.width,
81
+ height: fitted.height
82
+ };
83
+ const card = framed ? {
84
+ x: picture.x - margin,
85
+ y: picture.y - margin,
86
+ width: picture.width + margin * 2,
87
+ height: picture.height + margin * 2
88
+ } : picture;
76
89
  parts.sprite.visible = Boolean(texture);
77
- if (texture) layoutContain(parts.sprite, width, height);
78
- parts.placeholder.clear();
79
- if (!texture) {
80
- parts.placeholder.roundRect(0, 0, width, height, RADIUS).fill({
81
- color: context.palette.surface,
82
- alpha: .85
83
- }).roundRect(0, 0, width, height, RADIUS).stroke({
84
- color: failed ? context.palette.border : context.palette.hover,
85
- width: 1,
86
- alpha: .9
87
- });
88
- const cx = width / 2;
89
- const cy = height / 2;
90
- if (failed) parts.placeholder.moveTo(cx - 10, cy - 10).lineTo(cx + 10, cy + 10).moveTo(cx + 10, cy - 10).lineTo(cx - 10, cy + 10).stroke({
91
- color: context.palette.muted,
92
- width: 1.5,
93
- alpha: .8
94
- });
95
- else parts.placeholder.circle(cx, cy, 6).stroke({
96
- color: context.palette.muted,
97
- width: 1.25,
98
- alpha: .55
99
- });
100
- }
101
- parts.placeholder.visible = !texture;
102
- if (selected || hovered) {
103
- const hasPixels = Boolean(texture) && parts.sprite.width > 0;
104
- const ox = hasPixels ? parts.sprite.x : 0;
105
- const oy = hasPixels ? parts.sprite.y : 0;
106
- const ow = hasPixels ? parts.sprite.width : width;
107
- const oh = hasPixels ? parts.sprite.height : height;
108
- parts.placeholder.visible = true;
109
- parts.placeholder.roundRect(ox, oy, ow, oh, RADIUS).stroke({
110
- color: selected ? context.palette.brand : context.palette.muted,
111
- width: selected ? 2 : 1,
112
- alpha: selected ? .95 : .7
113
- });
90
+ if (texture) {
91
+ parts.sprite.position.set(picture.x, picture.y);
92
+ parts.sprite.width = picture.width;
93
+ parts.sprite.height = picture.height;
114
94
  }
95
+ traceCardOutline(parts.mask.clear(), picture, framed ? {
96
+ corner: "round",
97
+ radius: 0
98
+ } : context.style).fill({ color: 16777215 });
99
+ parts.placeholder.clear();
100
+ if (texture && !framed) return;
101
+ drawCardSurface(parts.placeholder, card, context.style, {
102
+ fill: context.palette.surface,
103
+ border: texture ? null : failed ? context.palette.border : context.palette.hover,
104
+ elevation
105
+ });
106
+ if (texture) return;
107
+ const cx = width / 2;
108
+ const cy = height / 2;
109
+ if (failed) parts.placeholder.moveTo(cx - 10, cy - 10).lineTo(cx + 10, cy + 10).moveTo(cx + 10, cy - 10).lineTo(cx - 10, cy + 10).stroke({
110
+ color: context.palette.muted,
111
+ width: 1.5,
112
+ alpha: .8
113
+ });
114
+ else parts.placeholder.circle(cx, cy, 6).stroke({
115
+ color: context.palette.muted,
116
+ width: 1.25,
117
+ alpha: .55
118
+ });
115
119
  }
116
120
  const imageCardRenderer = {
117
121
  id: "image-card",
@@ -121,17 +125,13 @@ const imageCardRenderer = {
121
125
  const sprite = new Sprite(Texture.EMPTY);
122
126
  const placeholder = new Graphics();
123
127
  const mask = new Graphics();
124
- const maskBox = () => {
125
- mask.clear();
126
- if (item.type === "image") mask.roundRect(0, 0, item.frame.width, item.frame.height, RADIUS).fill({ color: 16777215 });
127
- };
128
- maskBox();
129
128
  root.addChild(placeholder, sprite, mask);
130
129
  sprite.mask = mask;
131
130
  partsByContainer.set(root, {
132
131
  root,
133
132
  sprite,
134
133
  placeholder,
134
+ mask,
135
135
  sig: "",
136
136
  cropped: null,
137
137
  cropSource: null,
@@ -141,12 +141,7 @@ const imageCardRenderer = {
141
141
  return root;
142
142
  },
143
143
  update: (container, item, context) => {
144
- if (item.type !== "image") return;
145
- const parts = partsByContainer.get(container);
146
- if (!parts) return;
147
- const mask = parts.root.children.find((child) => child !== parts.sprite && child !== parts.placeholder);
148
- if (mask) mask.clear().roundRect(0, 0, item.frame.width, item.frame.height, RADIUS).fill({ color: 16777215 });
149
- sync(container, item, context);
144
+ if (item.type === "image") sync(container, item, context);
150
145
  },
151
146
  renderFar: (graphics, item, context) => {
152
147
  drawFarPlate(graphics, item.frame, {
@@ -0,0 +1,6 @@
1
+ import { BoardRenderContext } from "./board-renderer-registry.js";
2
+ import { Graphics } from "pixi.js";
3
+ //#region src/board/render/renderers/media-key.d.ts
4
+ declare function drawMediaPlayKey(graphics: Graphics, cx: number, cy: number, radius: number, context: BoardRenderContext, solid?: boolean): void;
5
+ //#endregion
6
+ export { drawMediaPlayKey };
@@ -0,0 +1,39 @@
1
+ import { tracePixelRect } from "../surface.js";
2
+ //#region src/board/render/renderers/media-key.ts
3
+ const MEDIA_SCRIM = 0;
4
+ const MEDIA_INK = 16777215;
5
+ function drawMediaPlayKey(graphics, cx, cy, radius, context, solid = false) {
6
+ const face = solid ? context.palette.text : MEDIA_SCRIM;
7
+ const ink = solid ? context.palette.surface : MEDIA_INK;
8
+ if (context.style.corner === "pixel") {
9
+ const size = Math.round(radius * 1.6);
10
+ tracePixelRect(graphics, Math.round(cx - size / 2), Math.round(cy - size / 2), size, size, 2).fill({
11
+ color: face,
12
+ alpha: solid ? 1 : .62
13
+ });
14
+ const cell = Math.max(1, Math.round(size / 14));
15
+ const x = Math.round(cx - cell * 1.5);
16
+ const y = Math.round(cy - cell * 3.5);
17
+ for (let row = 0; row < 7; row += 1) graphics.rect(x, y + row * cell, (4 - Math.abs(row - 3)) * cell, cell);
18
+ graphics.fill({ color: ink });
19
+ return;
20
+ }
21
+ graphics.circle(cx, cy, radius).fill({
22
+ color: face,
23
+ alpha: solid ? 1 : .45
24
+ });
25
+ const size = radius * .5;
26
+ graphics.poly([
27
+ cx - size * .45,
28
+ cy - size * .75,
29
+ cx + size * .8,
30
+ cy,
31
+ cx - size * .45,
32
+ cy + size * .75
33
+ ]).fill({
34
+ color: ink,
35
+ alpha: .96
36
+ });
37
+ }
38
+ //#endregion
39
+ export { drawMediaPlayKey };
@@ -2,9 +2,9 @@ import { BOARD_FONT_STACK } from "../../../protocol/dist/board-constants.js";
2
2
  import { worldPoint } from "../../model/geometry.js";
3
3
  import { itemAlpha, itemColor } from "../palette.js";
4
4
  import { syncTextResolution, syncTextWrapWidth, textResolutionForZoom } from "../text-resolution.js";
5
+ import { dashPattern, roundRectPoints, tracePolyline, trimPolyline } from "../stroke.js";
5
6
  import { positionShell } from "./base-card-renderer.js";
6
7
  import { drawFarPlate } from "./far-plate.js";
7
- import { dashPattern, roundRectPoints, tracePolyline, trimPolyline } from "../stroke.js";
8
8
  import { Container, Graphics, GraphicsPath, Matrix, Text } from "pixi.js";
9
9
  //#region src/board/render/renderers/shape-card-renderer.ts
10
10
  const DEFAULT_ROUNDED_RADIUS = 8;
@@ -95,8 +95,6 @@ function sync(container, item, context) {
95
95
  positionShell(parts.root, item);
96
96
  const { width, height } = item.frame;
97
97
  const { props, style } = item;
98
- const selected = context.selectedIds.has(item.id);
99
- const hovered = context.hoveredId === item.id;
100
98
  const stroke = itemColor(context, style.stroke ?? style.fill, "brand");
101
99
  const fill = itemColor(context, style.fill ?? style.stroke, "brand", "fill");
102
100
  const fillOpacity = (style.fillOpacity ?? (style.fill ? 1 : 0)) * itemAlpha(context, style.fill ?? style.stroke);
@@ -106,8 +104,6 @@ function sync(container, item, context) {
106
104
  const visualSig = [
107
105
  width,
108
106
  height,
109
- selected,
110
- hovered,
111
107
  props.geometry,
112
108
  props.path,
113
109
  fill,
@@ -117,8 +113,7 @@ function sync(container, item, context) {
117
113
  strokeWidth,
118
114
  style.dash,
119
115
  style.radius,
120
- style.trim,
121
- context.palette.muted
116
+ style.trim
122
117
  ].join("|");
123
118
  if (visualSig !== parts.visualSig) {
124
119
  parts.visualSig = visualSig;
@@ -130,8 +125,7 @@ function sync(container, item, context) {
130
125
  alpha: fillOpacity
131
126
  });
132
127
  }
133
- const lineWidth = selected ? Math.max(2.5, strokeWidth) : strokeWidth;
134
- const pattern = dashPattern(style.dash, lineWidth);
128
+ const pattern = dashPattern(style.dash, strokeWidth);
135
129
  const partial = style.trim !== void 0 && style.trim < 1;
136
130
  if (strokeWidth > 0 && (!partial || style.trim)) {
137
131
  if ((pattern || partial) && props.geometry !== "path") {
@@ -139,9 +133,9 @@ function sync(container, item, context) {
139
133
  tracePolyline(parts.shape, trimPolyline(outlinePoints(props.geometry, width, height, radius), style.trim), pattern);
140
134
  } else traceShapeOutline(parts.shape, props, width, height, style.radius);
141
135
  parts.shape.stroke({
142
- color: hovered && !selected ? context.palette.muted : stroke,
143
- width: lineWidth,
144
- alpha: (selected ? 1 : hovered ? .95 : .85) * strokeAlpha,
136
+ color: stroke,
137
+ width: strokeWidth,
138
+ alpha: .85 * strokeAlpha,
145
139
  cap: partial || pattern ? "round" : "butt",
146
140
  join: "round"
147
141
  });
@@ -1,12 +1,5 @@
1
1
  import { BoardCardRenderer } from "./board-renderer-registry.js";
2
2
  //#region src/board/render/renderers/task-card-renderer.d.ts
3
- declare const TASK_CARD_FULL_DETAIL_ZOOM = 0.55;
4
- declare function containTaskPreviewRect(width: number, height: number, imageWidth: number, imageHeight: number): {
5
- x: number;
6
- y: number;
7
- width: number;
8
- height: number;
9
- };
10
3
  declare const taskCardRenderer: BoardCardRenderer;
11
4
  //#endregion
12
- export { TASK_CARD_FULL_DETAIL_ZOOM, containTaskPreviewRect, taskCardRenderer };
5
+ export { taskCardRenderer };