@neta-art/cohub 11.0.0 → 11.1.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 (71) hide show
  1. package/README.md +31 -5
  2. package/dist/board/editor/creation.d.ts +2 -2
  3. package/dist/board/editor/creation.js +3 -3
  4. package/dist/board/editor/editor.d.ts +4 -4
  5. package/dist/board/editor/editor.js +1 -1
  6. package/dist/board/editor/index.d.ts +2 -2
  7. package/dist/board/editor/interaction.d.ts +8 -2
  8. package/dist/board/editor/interaction.js +34 -1
  9. package/dist/board/editor/snapshots.d.ts +0 -2
  10. package/dist/board/editor/snapshots.js +4 -20
  11. package/dist/board/export/scene.js +4 -1
  12. package/dist/board/model/image-key.js +1 -1
  13. package/dist/board/model/index.d.ts +8 -7
  14. package/dist/board/model/index.js +6 -5
  15. package/dist/board/model/items/create.d.ts +16 -3
  16. package/dist/board/model/items/create.js +125 -5
  17. package/dist/board/model/items/index.d.ts +2 -2
  18. package/dist/board/model/items/index.js +2 -2
  19. package/dist/board/model/media-playback.js +1 -1
  20. package/dist/board/model/overlay-placement.d.ts +25 -0
  21. package/dist/board/model/overlay-placement.js +35 -0
  22. package/dist/board/model/replay.d.ts +1 -1
  23. package/dist/board/model/replay.js +1 -0
  24. package/dist/board/model/script-hit.d.ts +20 -3
  25. package/dist/board/model/script-hit.js +81 -24
  26. package/dist/board/model/script-observers.d.ts +18 -0
  27. package/dist/board/model/script-observers.js +92 -0
  28. package/dist/board/model/script-scene.d.ts +1 -1
  29. package/dist/board/model/script-scene.js +35 -8
  30. package/dist/board/model/script.d.ts +51 -7
  31. package/dist/board/render/board-background.js +5 -4
  32. package/dist/board/render/index.d.ts +2 -2
  33. package/dist/board/render/index.js +2 -2
  34. package/dist/board/render/media-interaction.js +1 -1
  35. package/dist/board/render/renderers/board-renderer-registry.d.ts +17 -2
  36. package/dist/board/render/renderers/board-renderer-registry.js +8 -1
  37. package/dist/board/render/renderers/custom-card-renderer.js +2 -1
  38. package/dist/board/render/renderers/task-card-renderer.d.ts +2 -1
  39. package/dist/board/render/renderers/task-card-renderer.js +220 -71
  40. package/dist/board/render/script-host.d.ts +1 -1
  41. package/dist/board/render/script-host.js +53 -28
  42. package/dist/board/render/script-runtime.js +13 -3
  43. package/dist/board/render/script-texture.d.ts +11 -0
  44. package/dist/board/render/script-texture.js +33 -0
  45. package/dist/board/stage/assets.js +1 -1
  46. package/dist/board/stage/scene.d.ts +2 -0
  47. package/dist/board/stage/scene.js +17 -1
  48. package/dist/board/stage/script-pointer.d.ts +1 -0
  49. package/dist/board/stage/script-pointer.js +8 -2
  50. package/dist/board/stage/stage.d.ts +11 -3
  51. package/dist/board/stage/stage.js +118 -21
  52. package/dist/chunks/environment.d.ts +40 -5
  53. package/dist/chunks/environment.js +12 -4
  54. package/dist/chunks/http.d.ts +3 -1
  55. package/dist/chunks/http.js +2 -1
  56. package/dist/chunks/transport.js +1 -1
  57. package/dist/chunks/websocket.d.ts +1 -1
  58. package/dist/http.d.ts +2 -2
  59. package/dist/index.d.ts +2 -2
  60. package/dist/index.js +151 -139
  61. package/dist/protocol/dist/board-model.d.ts +36 -1
  62. package/dist/protocol/dist/board-model.js +14 -4
  63. package/dist/protocol/dist/board-task.d.ts +22 -0
  64. package/dist/{board/model/task.js → protocol/dist/board-task.js} +34 -7
  65. package/dist/protocol/dist/generation/blocks.d.ts +8 -0
  66. package/dist/{generation-blocks.js → protocol/dist/generation/blocks.js} +14 -15
  67. package/dist/protocol/dist/index.d.ts +5 -2
  68. package/dist/protocol/dist/task/index.d.ts +4 -0
  69. package/package.json +1 -1
  70. package/dist/board/model/task.d.ts +0 -11
  71. package/dist/types.d.ts +0 -36
@@ -1,6 +1,29 @@
1
1
  import { BoardItem, BoardPatch, BoardScript, BoardVec2 } from "../../protocol/dist/board-model.js";
2
2
  import "../../protocol/dist/index.js";
3
3
  //#region src/board/model/script.d.ts
4
+ type BoardScriptView = {
5
+ camera: {
6
+ x: number;
7
+ y: number;
8
+ zoom: number;
9
+ };
10
+ width: number;
11
+ height: number;
12
+ safeRect: {
13
+ x: number;
14
+ y: number;
15
+ width: number;
16
+ height: number;
17
+ };
18
+ };
19
+ type BoardScriptAnchor = {
20
+ item: string;
21
+ point?: BoardVec2;
22
+ };
23
+ type BoardScriptSceneOptions = {
24
+ space?: "world" | "screen";
25
+ anchor?: BoardScriptAnchor;
26
+ };
4
27
  type BoardScriptEvent = {
5
28
  type: string;
6
29
  target?: string;
@@ -17,6 +40,22 @@ type BoardScriptEvent = {
17
40
  metaKey?: boolean;
18
41
  data?: unknown;
19
42
  };
43
+ type BoardScriptHostEvents = {
44
+ viewchange: BoardScriptView;
45
+ selectionchange: {
46
+ ids: string[];
47
+ };
48
+ transformend: {
49
+ ids: string[];
50
+ operation: "move" | "resize" | "rotate" | "arrow";
51
+ cancelled: boolean;
52
+ };
53
+ };
54
+ type BoardScriptEventOf<Type extends string> = BoardScriptEvent & {
55
+ type: Type;
56
+ } & (Type extends keyof BoardScriptHostEvents ? {
57
+ data: BoardScriptHostEvents[Type];
58
+ } : unknown);
20
59
  type BoardScriptFrame = {
21
60
  t: number;
22
61
  dt: number;
@@ -33,11 +72,16 @@ type BoardScriptItemPatch = Partial<Pick<BoardItem, "position" | "scale" | "rota
33
72
  };
34
73
  props?: Record<string, unknown>;
35
74
  };
36
- type BoardScriptHit = {
75
+ type BoardScriptHit = ({
37
76
  x: number;
38
77
  y: number;
39
78
  width: number;
40
79
  height: number;
80
+ } | {
81
+ target: "self";
82
+ } | {
83
+ item: string;
84
+ }) & {
41
85
  label?: string;
42
86
  cursor?: string;
43
87
  };
@@ -46,7 +90,7 @@ type BoardScriptSnapshot = {
46
90
  time: number;
47
91
  random: number;
48
92
  configuration?: string;
49
- effects?: Pick<BoardScriptOutput, "patches" | "items" | "hits" | "space">;
93
+ effects?: Pick<BoardScriptOutput, "patches" | "items" | "hits" | "space" | "anchor">;
50
94
  };
51
95
  type BoardScriptParameter = {
52
96
  type: "number" | "boolean" | "string" | "color";
@@ -59,6 +103,7 @@ type BoardScriptParameter = {
59
103
  type BoardScriptOutput = {
60
104
  parameters?: Record<string, BoardScriptParameter>;
61
105
  space?: "world" | "screen";
106
+ anchor?: BoardScriptAnchor;
62
107
  patches: Record<string, Record<string, unknown>>;
63
108
  items: Record<string, unknown>;
64
109
  hits: Record<string, BoardScriptHit>;
@@ -78,16 +123,15 @@ type BoardScriptContext = {
78
123
  emit(target: string, type: string, data?: unknown): Promise<void>;
79
124
  readonly state: Record<string, unknown>;
80
125
  readonly frame: BoardScriptFrame;
126
+ readonly view: BoardScriptView | null;
81
127
  random(): number;
82
- on(type: string, handler: (event: BoardScriptEvent) => void): () => void;
128
+ on<Type extends string>(type: Type, handler: (event: BoardScriptEventOf<Type>) => void): () => void;
83
129
  onFrame(handler: (frame: BoardScriptFrame) => void): () => void;
84
130
  onDispose(handler: () => void): void;
85
131
  invalidate(): void;
86
132
  get(id: string): BoardItem | undefined;
87
133
  present(id: string, patch: BoardScriptItemPatch | null): void;
88
- scene(items: Record<string, unknown>, options?: {
89
- space?: "world" | "screen";
90
- }): void;
134
+ scene(items: Record<string, unknown>, options?: BoardScriptSceneOptions): void;
91
135
  hitRegions(hits: Record<string, BoardScriptHit>): void;
92
136
  commit(patch: BoardPatch): Promise<void>;
93
137
  capabilities: {
@@ -102,4 +146,4 @@ type BoardScriptModule = {
102
146
  animated?: boolean;
103
147
  };
104
148
  //#endregion
105
- export { BoardScriptContext, BoardScriptEvent, BoardScriptFrame, BoardScriptHit, BoardScriptItemPatch, BoardScriptModule, BoardScriptOutput, BoardScriptParameter, BoardScriptSnapshot };
149
+ export { BoardScriptAnchor, BoardScriptContext, BoardScriptEvent, BoardScriptEventOf, BoardScriptFrame, BoardScriptHit, BoardScriptHostEvents, BoardScriptItemPatch, BoardScriptModule, BoardScriptOutput, BoardScriptParameter, BoardScriptSceneOptions, BoardScriptSnapshot, BoardScriptView };
@@ -12,7 +12,7 @@ function buildGridTexture(context, size, color, opacity, kind) {
12
12
  width: 1,
13
13
  alpha: opacity
14
14
  });
15
- else graphics.circle(.5, .5, .9).fill({
15
+ else graphics.circle(size / 2, size / 2, 1.1).fill({
16
16
  color,
17
17
  alpha: opacity
18
18
  });
@@ -49,8 +49,9 @@ function sync(parts, context) {
49
49
  const kind = settings.background.kind === "grid" ? "grid" : "dots";
50
50
  const visible = settings.grid?.visible === true;
51
51
  const size = Math.max(4, settings.grid?.size ?? 24);
52
- const opacity = .12;
53
- const key = `${kind}|${size}|${palette.border}|${opacity}`;
52
+ const color = kind === "grid" ? palette.border : palette.muted;
53
+ const opacity = kind === "grid" ? .9 : .4;
54
+ const key = `${kind}|${size}|${color}|${opacity}`;
54
55
  if (!visible) {
55
56
  if (parts.sprite) parts.sprite.visible = false;
56
57
  return;
@@ -61,7 +62,7 @@ function sync(parts, context) {
61
62
  parts.sprite.destroy();
62
63
  previousTexture.destroy(true);
63
64
  }
64
- const texture = buildGridTexture(context, size, palette.border, opacity, kind);
65
+ const texture = buildGridTexture(context, size, color, opacity, kind);
65
66
  parts.sprite = new TilingSprite({
66
67
  texture,
67
68
  width,
@@ -1,4 +1,4 @@
1
- import { BoardCardRenderer, BoardCardRendererResolver, BoardRenderContext, BoardRenderPalette, BoardScriptHost, createBoardCardRendererResolver, getBoardCardRenderer } from "./renderers/board-renderer-registry.js";
1
+ import { BoardCardRenderer, BoardCardRendererResolver, BoardRenderContext, BoardRenderLabels, BoardRenderPalette, BoardScriptHost, DEFAULT_BOARD_RENDER_LABELS, createBoardCardRendererResolver, getBoardCardRenderer } from "./renderers/board-renderer-registry.js";
2
2
  import { createBoardRenderSampler } from "./sampling.js";
3
3
  import { BoardRenderDiagnostic, inspectBoardScene, measureBoardText } from "./diagnostics.js";
4
4
  import { BoardBackgroundContext, createBoardBackground, updateBoardBackground } from "./board-background.js";
@@ -14,4 +14,4 @@ import { TASK_CARD_FULL_DETAIL_ZOOM } from "./renderers/task-card-renderer.js";
14
14
  import { BOARD_FONT_STACKS, ensureBoardTextMeasurement, installBoardTextMeasurement } from "./text-measurement.js";
15
15
  import { getBoardResolution, syncTextResolution, syncTextWrapWidth, textResolutionForZoom, textZoomBucket } from "./text-resolution.js";
16
16
  import { VIDEO_THUMBNAIL_MAX_EDGE, VideoNaturalSize, loadVideoThumbnailTexture, videoTextureNaturalSize, videoThumbnailSize } from "./video-thumbnail.js";
17
- export { BOARD_EFFECT_MAX_PARTICLES, BOARD_FONT_STACKS, BoardBackgroundContext, BoardCardRenderer, BoardCardRendererResolver, BoardCssPaint, BoardMediaAction, BoardRenderContext, BoardRenderDiagnostic, BoardRenderPalette, BoardScriptHost, BoardScriptHostOptions, BrowserBoardScriptHost, ClipGroup, TASK_CARD_FULL_DETAIL_ZOOM, VIDEO_THUMBNAIL_MAX_EDGE, VideoNaturalSize, boardMediaActionAt, clippingAncestor, createBoardBackground, createBoardCardRendererResolver, createBoardRenderSampler, createBoardScriptHost, dashPattern, defaultBoardPalette, endAngle, ensureBoardTextMeasurement, getBoardCardRenderer, getBoardResolution, inspectBoardScene, installBoardTextMeasurement, isClippingFrame, itemAlpha, itemColor, loadVideoThumbnailTexture, measureBoardText, mediaPlayBadgeHit, mediaPlayBadgeVisible, parseBoardCssColor, parseBoardCssPaint, prepareBrowserBoardScripts, roundRectPoints, syncClipGroup, syncTextResolution, syncTextWrapWidth, textResolutionForZoom, textZoomBucket, traceArrowhead, traceFrameOutline, tracePolyline, trimPolyline, updateBoardBackground, videoTextureNaturalSize, videoThumbnailSize };
17
+ export { BOARD_EFFECT_MAX_PARTICLES, BOARD_FONT_STACKS, BoardBackgroundContext, BoardCardRenderer, BoardCardRendererResolver, BoardCssPaint, BoardMediaAction, BoardRenderContext, BoardRenderDiagnostic, BoardRenderLabels, BoardRenderPalette, BoardScriptHost, BoardScriptHostOptions, BrowserBoardScriptHost, ClipGroup, DEFAULT_BOARD_RENDER_LABELS, TASK_CARD_FULL_DETAIL_ZOOM, VIDEO_THUMBNAIL_MAX_EDGE, VideoNaturalSize, boardMediaActionAt, clippingAncestor, createBoardBackground, createBoardCardRendererResolver, createBoardRenderSampler, createBoardScriptHost, dashPattern, defaultBoardPalette, endAngle, ensureBoardTextMeasurement, getBoardCardRenderer, getBoardResolution, inspectBoardScene, installBoardTextMeasurement, isClippingFrame, itemAlpha, itemColor, loadVideoThumbnailTexture, measureBoardText, mediaPlayBadgeHit, mediaPlayBadgeVisible, parseBoardCssColor, parseBoardCssPaint, prepareBrowserBoardScripts, roundRectPoints, syncClipGroup, syncTextResolution, syncTextWrapWidth, textResolutionForZoom, textZoomBucket, traceArrowhead, traceFrameOutline, tracePolyline, trimPolyline, updateBoardBackground, videoTextureNaturalSize, videoThumbnailSize };
@@ -10,8 +10,8 @@ import { TASK_CARD_FULL_DETAIL_ZOOM } from "./renderers/task-card-renderer.js";
10
10
  import { boardMediaActionAt, mediaPlayBadgeHit, mediaPlayBadgeVisible } from "./media-interaction.js";
11
11
  import { dashPattern, endAngle, roundRectPoints, traceArrowhead, tracePolyline, trimPolyline } from "./stroke.js";
12
12
  import { BOARD_EFFECT_MAX_PARTICLES } from "./renderers/effect-card-renderer.js";
13
- import { createBoardCardRendererResolver, getBoardCardRenderer } from "./renderers/board-renderer-registry.js";
13
+ import { DEFAULT_BOARD_RENDER_LABELS, createBoardCardRendererResolver, getBoardCardRenderer } from "./renderers/board-renderer-registry.js";
14
14
  import { createBoardScriptHost } from "./script-host.js";
15
15
  import { prepareBrowserBoardScripts } from "./script-export.js";
16
16
  import { VIDEO_THUMBNAIL_MAX_EDGE, loadVideoThumbnailTexture, videoTextureNaturalSize, videoThumbnailSize } from "./video-thumbnail.js";
17
- export { BOARD_EFFECT_MAX_PARTICLES, BOARD_FONT_STACKS, TASK_CARD_FULL_DETAIL_ZOOM, VIDEO_THUMBNAIL_MAX_EDGE, boardMediaActionAt, clippingAncestor, createBoardBackground, createBoardCardRendererResolver, createBoardRenderSampler, createBoardScriptHost, dashPattern, defaultBoardPalette, endAngle, ensureBoardTextMeasurement, getBoardCardRenderer, getBoardResolution, inspectBoardScene, installBoardTextMeasurement, isClippingFrame, itemAlpha, itemColor, loadVideoThumbnailTexture, measureBoardText, mediaPlayBadgeHit, mediaPlayBadgeVisible, parseBoardCssColor, parseBoardCssPaint, prepareBrowserBoardScripts, roundRectPoints, syncClipGroup, syncTextResolution, syncTextWrapWidth, textResolutionForZoom, textZoomBucket, traceArrowhead, traceFrameOutline, tracePolyline, trimPolyline, updateBoardBackground, videoTextureNaturalSize, videoThumbnailSize };
17
+ export { BOARD_EFFECT_MAX_PARTICLES, BOARD_FONT_STACKS, DEFAULT_BOARD_RENDER_LABELS, TASK_CARD_FULL_DETAIL_ZOOM, VIDEO_THUMBNAIL_MAX_EDGE, boardMediaActionAt, clippingAncestor, createBoardBackground, createBoardCardRendererResolver, createBoardRenderSampler, createBoardScriptHost, dashPattern, defaultBoardPalette, endAngle, ensureBoardTextMeasurement, getBoardCardRenderer, getBoardResolution, inspectBoardScene, installBoardTextMeasurement, isClippingFrame, itemAlpha, itemColor, loadVideoThumbnailTexture, measureBoardText, mediaPlayBadgeHit, mediaPlayBadgeVisible, parseBoardCssColor, parseBoardCssPaint, prepareBrowserBoardScripts, roundRectPoints, syncClipGroup, syncTextResolution, syncTextWrapWidth, textResolutionForZoom, textZoomBucket, traceArrowhead, traceFrameOutline, tracePolyline, trimPolyline, updateBoardBackground, videoTextureNaturalSize, videoThumbnailSize };
@@ -1,4 +1,4 @@
1
- import { featuredTaskArtifact } from "../model/task.js";
1
+ import { featuredTaskArtifact } from "../../protocol/dist/board-task.js";
2
2
  import "./renderers/task-card-renderer.js";
3
3
  //#region src/board/render/media-interaction.ts
4
4
  function mediaPlayBadgeVisible(item, zoom, options) {
@@ -1,4 +1,4 @@
1
- import { BoardCustomItem, BoardDocument, BoardSettings } from "../../../protocol/dist/board-model.js";
1
+ import { BoardCustomItem, BoardDocument, BoardSettings, BoardTaskItem } from "../../../protocol/dist/board-model.js";
2
2
  import { BoardFrame } from "../../../protocol/dist/board-layout.js";
3
3
  import "../../../protocol/dist/index.js";
4
4
  import { BoardScene, BoardSceneItem, SceneItem } from "../../model/scene.js";
@@ -25,6 +25,14 @@ type BoardScriptHost = {
25
25
  error: (id: string) => string | null;
26
26
  release: (id: string) => void;
27
27
  };
28
+ type BoardRenderLabels = {
29
+ queued: string;
30
+ generating: string;
31
+ failed: string;
32
+ previewUnavailable: string;
33
+ noPreview: string;
34
+ };
35
+ declare const DEFAULT_BOARD_RENDER_LABELS: BoardRenderLabels;
28
36
  type BoardRenderContext = {
29
37
  settings: BoardSettings;
30
38
  scene: BoardScene;
@@ -37,6 +45,12 @@ type BoardRenderContext = {
37
45
  rendererType: "gpu" | "canvas";
38
46
  zoom: number;
39
47
  time: number;
48
+ reducedMotion: boolean;
49
+ labels: BoardRenderLabels;
50
+ taskRun: (taskRunId: string) => {
51
+ status: BoardTaskItem["props"]["snapshot"]["status"];
52
+ startedAt?: string;
53
+ } | null;
40
54
  frameAt?: (id: string, time: number) => BoardFrame | undefined;
41
55
  scripts?: BoardScriptHost;
42
56
  assetKey: (item: BoardSceneItem) => string | null;
@@ -50,6 +64,7 @@ type BoardCardRenderer = {
50
64
  id: string;
51
65
  canRender: (item: BoardSceneItem, context: BoardRenderContext) => boolean;
52
66
  animated?: boolean;
67
+ tick?: (container: Container, clock: number) => number | null;
53
68
  create: (item: BoardSceneItem, context: BoardRenderContext) => Container;
54
69
  update: (container: Container, item: BoardSceneItem, context: BoardRenderContext) => void;
55
70
  renderFar?: (graphics: Graphics, item: BoardSceneItem, context: BoardRenderContext) => void;
@@ -64,4 +79,4 @@ declare function createBoardCardRendererResolver(renderers?: Iterable<BoardCardR
64
79
  /** The built-in renderers alone. */
65
80
  declare const getBoardCardRenderer: BoardCardRendererResolver;
66
81
  //#endregion
67
- export { BoardCardRenderer, BoardCardRendererResolver, BoardRenderContext, BoardRenderPalette, BoardScriptHost, createBoardCardRendererResolver, getBoardCardRenderer };
82
+ export { BoardCardRenderer, BoardCardRendererResolver, BoardRenderContext, BoardRenderLabels, BoardRenderPalette, BoardScriptHost, DEFAULT_BOARD_RENDER_LABELS, createBoardCardRendererResolver, getBoardCardRenderer };
@@ -13,6 +13,13 @@ import { textCardRenderer } from "./text-card-renderer.js";
13
13
  import { unknownCardRenderer } from "./unknown-card-renderer.js";
14
14
  import { videoCardRenderer } from "./video-card-renderer.js";
15
15
  //#region src/board/render/renderers/board-renderer-registry.ts
16
+ const DEFAULT_BOARD_RENDER_LABELS = {
17
+ queued: "Queued",
18
+ generating: "Generating",
19
+ failed: "Failed",
20
+ previewUnavailable: "Preview unavailable",
21
+ noPreview: "No preview"
22
+ };
16
23
  const builtinCardRenderers = [
17
24
  textCardRenderer,
18
25
  imageCardRenderer,
@@ -41,4 +48,4 @@ function createBoardCardRendererResolver(renderers = []) {
41
48
  /** The built-in renderers alone. */
42
49
  const getBoardCardRenderer = createBoardCardRendererResolver();
43
50
  //#endregion
44
- export { createBoardCardRendererResolver, getBoardCardRenderer };
51
+ export { DEFAULT_BOARD_RENDER_LABELS, createBoardCardRendererResolver, getBoardCardRenderer };
@@ -18,7 +18,8 @@ function sync(container, item, context) {
18
18
  const texture = context.scripts?.frame(item, context.time, resolution) ?? null;
19
19
  const error = context.scripts?.error(item.id) ?? null;
20
20
  parts.sprite.visible = Boolean(texture);
21
- if (texture && parts.sprite.texture !== texture) parts.sprite.texture = texture;
21
+ const display = texture ?? Texture.EMPTY;
22
+ if (parts.sprite.texture !== display) parts.sprite.texture = display;
22
23
  parts.sprite.width = width;
23
24
  parts.sprite.height = height;
24
25
  const selected = context.selectedIds.has(item.id);
@@ -1,6 +1,7 @@
1
1
  import { BoardCardRenderer } from "./board-renderer-registry.js";
2
2
  //#region src/board/render/renderers/task-card-renderer.d.ts
3
3
  declare const TASK_CARD_FULL_DETAIL_ZOOM = 0.55;
4
+ declare function formatTaskElapsed(ms: number): string;
4
5
  declare function containTaskPreviewRect(width: number, height: number, imageWidth: number, imageHeight: number): {
5
6
  x: number;
6
7
  y: number;
@@ -9,4 +10,4 @@ declare function containTaskPreviewRect(width: number, height: number, imageWidt
9
10
  };
10
11
  declare const taskCardRenderer: BoardCardRenderer;
11
12
  //#endregion
12
- export { TASK_CARD_FULL_DETAIL_ZOOM, containTaskPreviewRect, taskCardRenderer };
13
+ export { TASK_CARD_FULL_DETAIL_ZOOM, containTaskPreviewRect, formatTaskElapsed, taskCardRenderer };