@neta-art/cohub 3.1.0 → 3.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.
- package/README.md +33 -2
- package/dist/{board.d.ts → board/animation.d.ts} +4 -2
- package/dist/{chunks/board.js → board/animation.js} +5 -44
- package/dist/board/codec.d.ts +25 -0
- package/dist/board/codec.js +252 -0
- package/dist/board/core/bindings.d.ts +45 -0
- package/dist/board/core/bindings.js +162 -0
- package/dist/board/core/draw-geometry.d.ts +31 -0
- package/dist/board/core/draw-geometry.js +183 -0
- package/dist/board/core/export-assets.d.ts +14 -0
- package/dist/board/core/export-assets.js +22 -0
- package/dist/board/core/export-plan.d.ts +84 -0
- package/dist/board/core/export-plan.js +128 -0
- package/dist/board/core/file-preview.d.ts +176 -0
- package/dist/board/core/file-preview.js +271 -0
- package/dist/board/core/palette.d.ts +42 -0
- package/dist/board/core/palette.js +138 -0
- package/dist/board/core/shape-definition.d.ts +35 -0
- package/dist/board/core/shape-definition.js +64 -0
- package/dist/board/core/shape-types.d.ts +144 -0
- package/dist/board/core/shape-types.js +27 -0
- package/dist/board/core/text-metrics.d.ts +18 -0
- package/dist/board/core/text-metrics.js +43 -0
- package/dist/board/export/index.d.ts +56 -0
- package/dist/board/export/index.js +86 -0
- package/dist/board/export/scene.d.ts +35 -0
- package/dist/board/export/scene.js +69 -0
- package/dist/board/geometry.d.ts +131 -0
- package/dist/board/geometry.js +468 -0
- package/dist/board/headless/index.d.ts +69 -0
- package/dist/board/headless/index.js +150 -0
- package/dist/board/image-key.d.ts +19 -0
- package/dist/board/image-key.js +34 -0
- package/dist/board/index.d.ts +16 -0
- package/dist/board/index.js +16 -0
- package/dist/board/render/index.d.ts +6 -0
- package/dist/board/render/index.js +6 -0
- package/dist/board/render/palette.d.ts +5 -0
- package/dist/board/render/palette.js +30 -0
- package/dist/board/render/renderers/arrow-card-renderer.d.ts +5 -0
- package/dist/board/render/renderers/arrow-card-renderer.js +157 -0
- package/dist/board/render/renderers/base-card-renderer.d.ts +46 -0
- package/dist/board/render/renderers/base-card-renderer.js +153 -0
- package/dist/board/render/renderers/board-renderer-registry.d.ts +85 -0
- package/dist/board/render/renderers/board-renderer-registry.js +43 -0
- package/dist/board/render/renderers/draw-card-renderer.d.ts +5 -0
- package/dist/board/render/renderers/draw-card-renderer.js +82 -0
- package/dist/board/render/renderers/far-plate.d.ts +39 -0
- package/dist/board/render/renderers/far-plate.js +92 -0
- package/dist/board/render/renderers/file-card-renderer.d.ts +33 -0
- package/dist/board/render/renderers/file-card-renderer.js +371 -0
- package/dist/board/render/renderers/frame-card-renderer.d.ts +5 -0
- package/dist/board/render/renderers/frame-card-renderer.js +99 -0
- package/dist/board/render/renderers/geo-card-renderer.d.ts +5 -0
- package/dist/board/render/renderers/geo-card-renderer.js +128 -0
- package/dist/board/render/renderers/image-card-renderer.d.ts +8 -0
- package/dist/board/render/renderers/image-card-renderer.js +138 -0
- package/dist/board/render/renderers/note-card-renderer.d.ts +5 -0
- package/dist/board/render/renderers/note-card-renderer.js +112 -0
- package/dist/board/render/renderers/text-card-renderer.d.ts +7 -0
- package/dist/board/render/renderers/text-card-renderer.js +94 -0
- package/dist/board/render/renderers/unknown-card-renderer.d.ts +5 -0
- package/dist/board/render/renderers/unknown-card-renderer.js +102 -0
- package/dist/board/render/renderers/video-card-renderer.d.ts +7 -0
- package/dist/board/render/renderers/video-card-renderer.js +146 -0
- package/dist/board/render/text-measurement.d.ts +30 -0
- package/dist/board/render/text-measurement.js +57 -0
- package/dist/board/render/text-resolution.d.ts +16 -0
- package/dist/board/render/text-resolution.js +43 -0
- package/dist/board/render/themes/board-theme-registry.d.ts +20 -0
- package/dist/board/render/themes/board-theme-registry.js +13 -0
- package/dist/board/render/themes/clean-theme.d.ts +5 -0
- package/dist/board/render/themes/clean-theme.js +102 -0
- package/dist/chunks/http.d.ts +1 -2
- package/dist/chunks/websocket.d.ts +798 -352
- package/dist/http.d.ts +1 -2
- package/dist/index.d.ts +99 -4
- package/dist/index.js +391 -1
- package/dist/protocol/dist/board-constants.d.ts +23 -0
- package/dist/protocol/dist/board-constants.js +60 -0
- package/dist/protocol/dist/board-document.d.ts +1124 -0
- package/dist/protocol/dist/board-document.js +331 -0
- package/dist/protocol/dist/board.d.ts +186 -0
- package/dist/protocol/dist/board.js +207 -0
- package/dist/protocol/dist/index.d.ts +5 -0
- package/dist/protocol/dist/index.js +5 -0
- package/dist/protocol/dist/provenance.js +12 -0
- package/dist/protocol/dist/realtime/board-awareness.d.ts +1 -0
- package/dist/protocol/dist/realtime/board-awareness.js +117 -0
- package/dist/protocol/dist/realtime/types.d.ts +2 -0
- package/package.json +39 -4
- package/dist/board.js +0 -2
- package/dist/chunks/board.d.ts +0 -2589
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import "./board-constants.js";
|
|
2
|
+
import { BOARD_DOCUMENT_KIND, BOARD_EXTENSION } from "./board.js";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
//#region ../protocol/dist/board-document.js
|
|
5
|
+
const BoardFrameSchema = z.object({
|
|
6
|
+
x: z.number().finite(),
|
|
7
|
+
y: z.number().finite(),
|
|
8
|
+
width: z.number().finite().positive(),
|
|
9
|
+
height: z.number().finite().positive(),
|
|
10
|
+
rotation: z.number().finite().default(0)
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* The board camera. This is local UI state, not synced content: semantic ops
|
|
14
|
+
* (see diffBoardDocuments) never describe the viewport, and the editor holds
|
|
15
|
+
* the live camera separately from the persisted document. Here it only serves
|
|
16
|
+
* as an initial camera hint when a document is first loaded.
|
|
17
|
+
*/
|
|
18
|
+
const BoardViewportSchema = z.object({
|
|
19
|
+
x: z.number().finite(),
|
|
20
|
+
y: z.number().finite(),
|
|
21
|
+
zoom: z.number().finite().min(.05).max(8)
|
|
22
|
+
});
|
|
23
|
+
const BoardAppearanceSchema = z.object({
|
|
24
|
+
theme: z.string().min(1).default("clean"),
|
|
25
|
+
background: z.object({
|
|
26
|
+
kind: z.enum([
|
|
27
|
+
"solid",
|
|
28
|
+
"dots",
|
|
29
|
+
"grid",
|
|
30
|
+
"image",
|
|
31
|
+
"shader",
|
|
32
|
+
"custom"
|
|
33
|
+
]).default("dots"),
|
|
34
|
+
color: z.string().optional(),
|
|
35
|
+
imageUrl: z.string().url().optional()
|
|
36
|
+
}).default({ kind: "solid" }),
|
|
37
|
+
grid: z.object({
|
|
38
|
+
visible: z.boolean().default(false),
|
|
39
|
+
size: z.number().finite().min(4).default(24),
|
|
40
|
+
opacity: z.number().finite().min(0).max(1).default(.12)
|
|
41
|
+
}).default({
|
|
42
|
+
visible: false,
|
|
43
|
+
size: 24,
|
|
44
|
+
opacity: .12
|
|
45
|
+
}),
|
|
46
|
+
mood: z.enum([
|
|
47
|
+
"clean",
|
|
48
|
+
"playful",
|
|
49
|
+
"arcane",
|
|
50
|
+
"cyber",
|
|
51
|
+
"natural"
|
|
52
|
+
]).default("clean")
|
|
53
|
+
});
|
|
54
|
+
/** Optional visual chrome still carried by a few older shapes. */
|
|
55
|
+
const BoardItemStyleSchema = z.object({
|
|
56
|
+
variant: z.string().min(1).default("default"),
|
|
57
|
+
theme: z.string().min(1).optional(),
|
|
58
|
+
accentColor: z.string().optional(),
|
|
59
|
+
size: z.enum([
|
|
60
|
+
"sm",
|
|
61
|
+
"md",
|
|
62
|
+
"lg"
|
|
63
|
+
]).default("md"),
|
|
64
|
+
emphasis: z.enum([
|
|
65
|
+
"normal",
|
|
66
|
+
"rare",
|
|
67
|
+
"epic",
|
|
68
|
+
"legendary"
|
|
69
|
+
]).default("normal"),
|
|
70
|
+
effects: z.array(z.string().min(1)).default([])
|
|
71
|
+
});
|
|
72
|
+
const SpaceFileRefSchema = z.object({
|
|
73
|
+
kind: z.literal("space-file"),
|
|
74
|
+
path: z.string().min(1)
|
|
75
|
+
});
|
|
76
|
+
const BoardMediaSnapshotSchema = z.object({
|
|
77
|
+
title: z.string().optional(),
|
|
78
|
+
mimeType: z.string().optional(),
|
|
79
|
+
size: z.number().finite().nonnegative().optional(),
|
|
80
|
+
mtimeMs: z.number().finite().nonnegative().optional(),
|
|
81
|
+
/** Intrinsic pixel size once known. */
|
|
82
|
+
naturalWidth: z.number().finite().positive().optional(),
|
|
83
|
+
naturalHeight: z.number().finite().positive().optional()
|
|
84
|
+
});
|
|
85
|
+
const BoardItemBaseSchema = z.object({
|
|
86
|
+
id: z.string().min(1),
|
|
87
|
+
frame: BoardFrameSchema,
|
|
88
|
+
/** When true the shape cannot be moved, resized, or deleted. */
|
|
89
|
+
locked: z.boolean().optional(),
|
|
90
|
+
style: BoardItemStyleSchema.optional(),
|
|
91
|
+
metadata: z.record(z.string(), z.unknown()).optional()
|
|
92
|
+
});
|
|
93
|
+
/** Freestanding text — no card chrome; its frame always follows the glyphs. */
|
|
94
|
+
const BoardTextItemSchema = BoardItemBaseSchema.extend({
|
|
95
|
+
type: z.literal("text"),
|
|
96
|
+
text: z.string().default(""),
|
|
97
|
+
color: z.string().min(1).default("neutral"),
|
|
98
|
+
fontSize: z.number().finite().min(2).max(512).default(18)
|
|
99
|
+
});
|
|
100
|
+
const BoardNoteItemSchema = BoardItemBaseSchema.extend({
|
|
101
|
+
type: z.literal("note"),
|
|
102
|
+
text: z.string().default(""),
|
|
103
|
+
color: z.string().min(1).default("amber")
|
|
104
|
+
});
|
|
105
|
+
const BoardGeoItemSchema = BoardItemBaseSchema.extend({
|
|
106
|
+
type: z.literal("geo"),
|
|
107
|
+
geo: z.string().min(1).default("rectangle"),
|
|
108
|
+
text: z.string().default(""),
|
|
109
|
+
color: z.string().min(1).default("brand"),
|
|
110
|
+
fillOpacity: z.number().finite().min(0).max(1).default(0)
|
|
111
|
+
});
|
|
112
|
+
/** A raw freehand sample. Pressure defaults to 0.5 (mouse) when absent. */
|
|
113
|
+
const DrawPointSchema = z.object({
|
|
114
|
+
x: z.number().finite(),
|
|
115
|
+
y: z.number().finite(),
|
|
116
|
+
p: z.number().finite().min(0).max(1).default(.5)
|
|
117
|
+
});
|
|
118
|
+
const BoardDrawItemSchema = BoardItemBaseSchema.extend({
|
|
119
|
+
type: z.literal("draw"),
|
|
120
|
+
points: z.array(DrawPointSchema).default([]),
|
|
121
|
+
color: z.string().min(1).default("brand"),
|
|
122
|
+
size: z.number().finite().positive().default(4)
|
|
123
|
+
});
|
|
124
|
+
/** An arrow endpoint: a free point or a binding to another shape. */
|
|
125
|
+
const ArrowEndpointSchema = z.union([z.object({
|
|
126
|
+
kind: z.literal("point"),
|
|
127
|
+
x: z.number().finite(),
|
|
128
|
+
y: z.number().finite()
|
|
129
|
+
}), z.object({
|
|
130
|
+
kind: z.literal("binding"),
|
|
131
|
+
target: z.string().min(1),
|
|
132
|
+
nx: z.number().finite().default(.5),
|
|
133
|
+
ny: z.number().finite().default(.5),
|
|
134
|
+
precise: z.boolean().default(true)
|
|
135
|
+
})]);
|
|
136
|
+
const BoardArrowItemSchema = BoardItemBaseSchema.extend({
|
|
137
|
+
type: z.literal("arrow"),
|
|
138
|
+
start: ArrowEndpointSchema,
|
|
139
|
+
end: ArrowEndpointSchema,
|
|
140
|
+
bend: z.number().finite().default(0),
|
|
141
|
+
color: z.string().min(1).default("brand"),
|
|
142
|
+
size: z.number().finite().positive().default(2.5),
|
|
143
|
+
arrowStart: z.boolean().default(false),
|
|
144
|
+
arrowEnd: z.boolean().default(true),
|
|
145
|
+
label: z.string().default("")
|
|
146
|
+
});
|
|
147
|
+
/** A frame container for organising shapes. */
|
|
148
|
+
const BoardFrameItemSchema = BoardItemBaseSchema.extend({
|
|
149
|
+
type: z.literal("frame"),
|
|
150
|
+
label: z.string().default("Frame"),
|
|
151
|
+
color: z.string().min(1).default("neutral")
|
|
152
|
+
});
|
|
153
|
+
/** Image node — space file only, natural aspect, no chrome. */
|
|
154
|
+
const BoardImageItemSchema = BoardItemBaseSchema.extend({
|
|
155
|
+
type: z.literal("image"),
|
|
156
|
+
ref: SpaceFileRefSchema,
|
|
157
|
+
snapshot: BoardMediaSnapshotSchema.optional(),
|
|
158
|
+
/** Optional normalized crop in source image space (0..1). */
|
|
159
|
+
crop: z.object({
|
|
160
|
+
x: z.number().finite().min(0).max(1).default(0),
|
|
161
|
+
y: z.number().finite().min(0).max(1).default(0),
|
|
162
|
+
w: z.number().finite().min(0).max(1).default(1),
|
|
163
|
+
h: z.number().finite().min(0).max(1).default(1)
|
|
164
|
+
}).optional()
|
|
165
|
+
});
|
|
166
|
+
/** Video node — space file only. Playback state is local UI, never synced. */
|
|
167
|
+
const BoardVideoItemSchema = BoardItemBaseSchema.extend({
|
|
168
|
+
type: z.literal("video"),
|
|
169
|
+
ref: SpaceFileRefSchema,
|
|
170
|
+
snapshot: BoardMediaSnapshotSchema.optional()
|
|
171
|
+
});
|
|
172
|
+
/**
|
|
173
|
+
* Cached display facts for a file card.
|
|
174
|
+
*
|
|
175
|
+
* Purely derived from the referenced file and versioned by `mtimeMs`, so it is a
|
|
176
|
+
* cache and never a second source of truth: the workspace file remains
|
|
177
|
+
* authoritative, and a stale snapshot is detectable rather than silently wrong.
|
|
178
|
+
* It is stored so that opening a board renders complete cards immediately, with
|
|
179
|
+
* no per-node file read on the first paint.
|
|
180
|
+
*/
|
|
181
|
+
const BoardFileSnapshotSchema = z.object({
|
|
182
|
+
title: z.string().optional(),
|
|
183
|
+
mimeType: z.string().optional(),
|
|
184
|
+
size: z.number().finite().nonnegative().optional(),
|
|
185
|
+
mtimeMs: z.number().finite().nonnegative().optional(),
|
|
186
|
+
/** Cleaned leading prose. Capped when written (see FILE_EXCERPT_MAX_CHARS). */
|
|
187
|
+
excerpt: z.string().optional(),
|
|
188
|
+
/** Cover image inside the space, already resolved to a workspace path. */
|
|
189
|
+
coverPath: z.string().optional(),
|
|
190
|
+
/** Cover image at an absolute https URL, as declared by the file itself. */
|
|
191
|
+
coverUrl: z.string().optional()
|
|
192
|
+
});
|
|
193
|
+
/**
|
|
194
|
+
* File node — a thumbnail entry point to any workspace file.
|
|
195
|
+
*
|
|
196
|
+
* This is the fallback for every dropped file that is not natively an image or
|
|
197
|
+
* video, including binaries and unknown extensions: a board should never refuse
|
|
198
|
+
* a file, only present it with less detail. Presentation tiers are derived from
|
|
199
|
+
* the snapshot (see filePreviewKind), not stored, so there is no display state
|
|
200
|
+
* to drift from the facts.
|
|
201
|
+
*/
|
|
202
|
+
const BoardFileItemSchema = BoardItemBaseSchema.extend({
|
|
203
|
+
type: z.literal("file"),
|
|
204
|
+
ref: SpaceFileRefSchema,
|
|
205
|
+
snapshot: BoardFileSnapshotSchema.optional()
|
|
206
|
+
});
|
|
207
|
+
/**
|
|
208
|
+
* The set of shape types this client understands natively. Anything else is
|
|
209
|
+
* preserved verbatim as an unknown item (see BoardUnknownItem) so documents
|
|
210
|
+
* authored by newer clients round-trip losslessly — data is never dropped or
|
|
211
|
+
* silently downgraded just because this client predates a shape type.
|
|
212
|
+
*/
|
|
213
|
+
const KNOWN_BOARD_ITEM_TYPES = [
|
|
214
|
+
"image",
|
|
215
|
+
"video",
|
|
216
|
+
"file",
|
|
217
|
+
"text",
|
|
218
|
+
"note",
|
|
219
|
+
"geo",
|
|
220
|
+
"draw",
|
|
221
|
+
"arrow",
|
|
222
|
+
"frame"
|
|
223
|
+
];
|
|
224
|
+
/**
|
|
225
|
+
* A forward-compatible carrier for shape types this client does not recognise.
|
|
226
|
+
* Its discriminant is the literal `"unknown"` so the item union still narrows
|
|
227
|
+
* cleanly on `type`. The real type string and every original field are preserved
|
|
228
|
+
* verbatim in `raw`.
|
|
229
|
+
*/
|
|
230
|
+
const UNKNOWN_BOARD_ITEM_TYPE = "unknown";
|
|
231
|
+
/** The real (preserved) type string of an unknown item. */
|
|
232
|
+
function unknownRealType(item) {
|
|
233
|
+
const real = item.raw.type;
|
|
234
|
+
return typeof real === "string" && real ? real : "unknown";
|
|
235
|
+
}
|
|
236
|
+
const BoardItemSchema = z.any().transform((raw) => parseBoardItemLoose(raw));
|
|
237
|
+
/**
|
|
238
|
+
* Parse a single item leniently: known types are validated and normalised;
|
|
239
|
+
* anything else becomes a lossless unknown item. Never throws on shape data —
|
|
240
|
+
* a malformed known item degrades to unknown rather than failing the document.
|
|
241
|
+
*/
|
|
242
|
+
function parseBoardItemLoose(raw) {
|
|
243
|
+
if (!raw || typeof raw !== "object") return makeUnknownItem(raw);
|
|
244
|
+
switch (raw.type) {
|
|
245
|
+
case "image": {
|
|
246
|
+
const parsed = BoardImageItemSchema.safeParse(raw);
|
|
247
|
+
return parsed.success ? parsed.data : makeUnknownItem(raw);
|
|
248
|
+
}
|
|
249
|
+
case "video": {
|
|
250
|
+
const parsed = BoardVideoItemSchema.safeParse(raw);
|
|
251
|
+
return parsed.success ? parsed.data : makeUnknownItem(raw);
|
|
252
|
+
}
|
|
253
|
+
case "file": {
|
|
254
|
+
const parsed = BoardFileItemSchema.safeParse(raw);
|
|
255
|
+
return parsed.success ? parsed.data : makeUnknownItem(raw);
|
|
256
|
+
}
|
|
257
|
+
case "text": {
|
|
258
|
+
const parsed = BoardTextItemSchema.safeParse(raw);
|
|
259
|
+
return parsed.success ? parsed.data : makeUnknownItem(raw);
|
|
260
|
+
}
|
|
261
|
+
case "note": {
|
|
262
|
+
const parsed = BoardNoteItemSchema.safeParse(raw);
|
|
263
|
+
return parsed.success ? parsed.data : makeUnknownItem(raw);
|
|
264
|
+
}
|
|
265
|
+
case "geo": {
|
|
266
|
+
const parsed = BoardGeoItemSchema.safeParse(raw);
|
|
267
|
+
return parsed.success ? parsed.data : makeUnknownItem(raw);
|
|
268
|
+
}
|
|
269
|
+
case "draw": {
|
|
270
|
+
const parsed = BoardDrawItemSchema.safeParse(raw);
|
|
271
|
+
return parsed.success ? parsed.data : makeUnknownItem(raw);
|
|
272
|
+
}
|
|
273
|
+
case "arrow": {
|
|
274
|
+
const parsed = BoardArrowItemSchema.safeParse(raw);
|
|
275
|
+
return parsed.success ? parsed.data : makeUnknownItem(raw);
|
|
276
|
+
}
|
|
277
|
+
case "frame": {
|
|
278
|
+
const parsed = BoardFrameItemSchema.safeParse(raw);
|
|
279
|
+
return parsed.success ? parsed.data : makeUnknownItem(raw);
|
|
280
|
+
}
|
|
281
|
+
default: return makeUnknownItem(raw);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
function makeUnknownItem(raw) {
|
|
285
|
+
const record = raw && typeof raw === "object" ? raw : {};
|
|
286
|
+
const frameParsed = BoardFrameSchema.safeParse(record.frame);
|
|
287
|
+
const styleParsed = BoardItemStyleSchema.safeParse(record.style);
|
|
288
|
+
return {
|
|
289
|
+
id: typeof record.id === "string" && record.id ? record.id : "unknown",
|
|
290
|
+
type: UNKNOWN_BOARD_ITEM_TYPE,
|
|
291
|
+
frame: frameParsed.success ? frameParsed.data : {
|
|
292
|
+
x: 0,
|
|
293
|
+
y: 0,
|
|
294
|
+
width: 120,
|
|
295
|
+
height: 80,
|
|
296
|
+
rotation: 0
|
|
297
|
+
},
|
|
298
|
+
...record.locked === true ? { locked: true } : {},
|
|
299
|
+
...styleParsed.success && record.style ? { style: styleParsed.data } : {},
|
|
300
|
+
...record.metadata && typeof record.metadata === "object" ? { metadata: record.metadata } : {},
|
|
301
|
+
raw: record
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
const BoardDocumentSchema = z.object({
|
|
305
|
+
kind: z.literal(BOARD_DOCUMENT_KIND),
|
|
306
|
+
version: z.literal(1),
|
|
307
|
+
appearance: BoardAppearanceSchema.default({
|
|
308
|
+
theme: "clean",
|
|
309
|
+
background: { kind: "solid" },
|
|
310
|
+
grid: {
|
|
311
|
+
visible: false,
|
|
312
|
+
size: 24,
|
|
313
|
+
opacity: .12
|
|
314
|
+
},
|
|
315
|
+
mood: "clean"
|
|
316
|
+
}),
|
|
317
|
+
viewport: BoardViewportSchema,
|
|
318
|
+
items: z.array(BoardItemSchema)
|
|
319
|
+
});
|
|
320
|
+
function isUnknownItem(item) {
|
|
321
|
+
return item.type === UNKNOWN_BOARD_ITEM_TYPE;
|
|
322
|
+
}
|
|
323
|
+
function isMediaItem(item) {
|
|
324
|
+
return item.type === "image" || item.type === "video";
|
|
325
|
+
}
|
|
326
|
+
/** Whether an item references a workspace file (image, video or file card). */
|
|
327
|
+
function isFileBackedItem(item) {
|
|
328
|
+
return item.type === "image" || item.type === "video" || item.type === "file";
|
|
329
|
+
}
|
|
330
|
+
//#endregion
|
|
331
|
+
export { ArrowEndpointSchema, BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BoardAppearanceSchema, BoardArrowItemSchema, BoardDocumentSchema, BoardDrawItemSchema, BoardFileItemSchema, BoardFileSnapshotSchema, BoardFrameItemSchema, BoardFrameSchema, BoardGeoItemSchema, BoardImageItemSchema, BoardItemSchema, BoardItemStyleSchema, BoardMediaSnapshotSchema, BoardNoteItemSchema, BoardTextItemSchema, BoardVideoItemSchema, BoardViewportSchema, DrawPointSchema, KNOWN_BOARD_ITEM_TYPES, SpaceFileRefSchema, UNKNOWN_BOARD_ITEM_TYPE, isFileBackedItem, isMediaItem, isUnknownItem, parseBoardItemLoose, unknownRealType };
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { BoardCapability, BoardRenderCost } from "./board-constants.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
//#region ../protocol/dist/board.d.ts
|
|
4
|
+
declare const BOARD_EXTENSION: ".board";
|
|
5
|
+
declare const BOARD_DOCUMENT_KIND: "cohub.board";
|
|
6
|
+
declare const BoardManifestSchema: z.ZodObject<{
|
|
7
|
+
kind: z.ZodLiteral<"cohub.board.manifest">;
|
|
8
|
+
version: z.ZodLiteral<1>;
|
|
9
|
+
boardId: z.ZodString;
|
|
10
|
+
title: z.ZodString;
|
|
11
|
+
}, z.core.$strip>;
|
|
12
|
+
type BoardManifest = z.infer<typeof BoardManifestSchema>;
|
|
13
|
+
declare class InvalidBoardFileError extends Error {
|
|
14
|
+
readonly code = "INVALID_BOARD_FILE";
|
|
15
|
+
constructor(message?: string);
|
|
16
|
+
}
|
|
17
|
+
declare function parseBoardManifest(input: string | unknown): BoardManifest;
|
|
18
|
+
declare function serializeBoardManifest(manifest: BoardManifest): string;
|
|
19
|
+
declare const BoardTargetSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
20
|
+
type: z.ZodLiteral<"node">;
|
|
21
|
+
nodeId: z.ZodString;
|
|
22
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
23
|
+
type: z.ZodLiteral<"effect">;
|
|
24
|
+
effectId: z.ZodString;
|
|
25
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
26
|
+
type: z.ZodLiteral<"board">;
|
|
27
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
28
|
+
type: z.ZodLiteral<"camera">;
|
|
29
|
+
}, z.core.$strip>], "type">;
|
|
30
|
+
declare const BoardAssetRefSchema: z.ZodObject<{
|
|
31
|
+
type: z.ZodEnum<{
|
|
32
|
+
extension: "extension";
|
|
33
|
+
"space-file": "space-file";
|
|
34
|
+
}>;
|
|
35
|
+
ref: z.ZodString;
|
|
36
|
+
digest: z.ZodOptional<z.ZodString>;
|
|
37
|
+
}, z.core.$strip>;
|
|
38
|
+
declare const BoardClipSchema: z.ZodObject<{
|
|
39
|
+
id: z.ZodString;
|
|
40
|
+
sequenceId: z.ZodString;
|
|
41
|
+
kind: z.ZodString;
|
|
42
|
+
kindVersion: z.ZodNumber;
|
|
43
|
+
target: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
44
|
+
type: z.ZodLiteral<"node">;
|
|
45
|
+
nodeId: z.ZodString;
|
|
46
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
47
|
+
type: z.ZodLiteral<"effect">;
|
|
48
|
+
effectId: z.ZodString;
|
|
49
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
50
|
+
type: z.ZodLiteral<"board">;
|
|
51
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
52
|
+
type: z.ZodLiteral<"camera">;
|
|
53
|
+
}, z.core.$strip>], "type">;
|
|
54
|
+
start: z.ZodNumber;
|
|
55
|
+
duration: z.ZodNumber;
|
|
56
|
+
layer: z.ZodDefault<z.ZodEnum<{
|
|
57
|
+
behind: "behind";
|
|
58
|
+
content: "content";
|
|
59
|
+
front: "front";
|
|
60
|
+
screen: "screen";
|
|
61
|
+
}>>;
|
|
62
|
+
fill: z.ZodDefault<z.ZodEnum<{
|
|
63
|
+
backwards: "backwards";
|
|
64
|
+
both: "both";
|
|
65
|
+
forwards: "forwards";
|
|
66
|
+
none: "none";
|
|
67
|
+
}>>;
|
|
68
|
+
easing: z.ZodDefault<z.ZodString>;
|
|
69
|
+
params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
70
|
+
keyframes: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
71
|
+
at: z.ZodNumber;
|
|
72
|
+
value: z.ZodUnknown;
|
|
73
|
+
easing: z.ZodOptional<z.ZodString>;
|
|
74
|
+
}, z.core.$strip>>>;
|
|
75
|
+
assetRefs: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
76
|
+
type: z.ZodEnum<{
|
|
77
|
+
extension: "extension";
|
|
78
|
+
"space-file": "space-file";
|
|
79
|
+
}>;
|
|
80
|
+
ref: z.ZodString;
|
|
81
|
+
digest: z.ZodOptional<z.ZodString>;
|
|
82
|
+
}, z.core.$strip>>>;
|
|
83
|
+
seed: z.ZodString;
|
|
84
|
+
metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
85
|
+
}, z.core.$strip>;
|
|
86
|
+
declare const BoardEffectSchema: z.ZodObject<{
|
|
87
|
+
id: z.ZodString;
|
|
88
|
+
boardId: z.ZodString;
|
|
89
|
+
target: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
90
|
+
type: z.ZodLiteral<"node">;
|
|
91
|
+
nodeId: z.ZodString;
|
|
92
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
93
|
+
type: z.ZodLiteral<"board">;
|
|
94
|
+
}, z.core.$strip>], "type">;
|
|
95
|
+
kind: z.ZodString;
|
|
96
|
+
kindVersion: z.ZodNumber;
|
|
97
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
98
|
+
lifecycle: z.ZodEnum<{
|
|
99
|
+
manual: "manual";
|
|
100
|
+
persistent: "persistent";
|
|
101
|
+
"when-visible": "when-visible";
|
|
102
|
+
}>;
|
|
103
|
+
timeOrigin: z.ZodEnum<{
|
|
104
|
+
activation: "activation";
|
|
105
|
+
board: "board";
|
|
106
|
+
visible: "visible";
|
|
107
|
+
}>;
|
|
108
|
+
layer: z.ZodDefault<z.ZodEnum<{
|
|
109
|
+
behind: "behind";
|
|
110
|
+
front: "front";
|
|
111
|
+
screen: "screen";
|
|
112
|
+
}>>;
|
|
113
|
+
seed: z.ZodString;
|
|
114
|
+
params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
115
|
+
assetRefs: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
116
|
+
type: z.ZodEnum<{
|
|
117
|
+
extension: "extension";
|
|
118
|
+
"space-file": "space-file";
|
|
119
|
+
}>;
|
|
120
|
+
ref: z.ZodString;
|
|
121
|
+
digest: z.ZodOptional<z.ZodString>;
|
|
122
|
+
}, z.core.$strip>>>;
|
|
123
|
+
metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
124
|
+
revision: z.ZodNumber;
|
|
125
|
+
}, z.core.$strip>;
|
|
126
|
+
declare const BoardSequenceSchema: z.ZodObject<{
|
|
127
|
+
id: z.ZodString;
|
|
128
|
+
boardId: z.ZodString;
|
|
129
|
+
name: z.ZodString;
|
|
130
|
+
duration: z.ZodNumber;
|
|
131
|
+
seed: z.ZodString;
|
|
132
|
+
restPose: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
133
|
+
metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
134
|
+
revision: z.ZodNumber;
|
|
135
|
+
}, z.core.$strip>;
|
|
136
|
+
type BoardTarget = z.infer<typeof BoardTargetSchema>;
|
|
137
|
+
type BoardAssetRef = z.infer<typeof BoardAssetRefSchema>;
|
|
138
|
+
type BoardClip = z.infer<typeof BoardClipSchema>;
|
|
139
|
+
type BoardEffect = z.infer<typeof BoardEffectSchema>;
|
|
140
|
+
type BoardSequence = z.infer<typeof BoardSequenceSchema>;
|
|
141
|
+
type BoardRecord = {
|
|
142
|
+
id: string;
|
|
143
|
+
spaceId: string;
|
|
144
|
+
title: string;
|
|
145
|
+
version: number;
|
|
146
|
+
metadata: Record<string, unknown>;
|
|
147
|
+
createdAt: string | null;
|
|
148
|
+
updatedAt: string | null;
|
|
149
|
+
};
|
|
150
|
+
type BoardNodeRecord = {
|
|
151
|
+
boardId: string;
|
|
152
|
+
nodeId: string;
|
|
153
|
+
type: string;
|
|
154
|
+
parentId: string | null;
|
|
155
|
+
orderKey: string | null;
|
|
156
|
+
x: number;
|
|
157
|
+
y: number;
|
|
158
|
+
width: number;
|
|
159
|
+
height: number;
|
|
160
|
+
rotation: number;
|
|
161
|
+
refKind: string | null;
|
|
162
|
+
refPath: string | null;
|
|
163
|
+
refUrl: string | null;
|
|
164
|
+
view: Record<string, unknown>;
|
|
165
|
+
style: Record<string, unknown>;
|
|
166
|
+
data: Record<string, unknown>;
|
|
167
|
+
version: number;
|
|
168
|
+
createdAt: string | null;
|
|
169
|
+
updatedAt: string | null;
|
|
170
|
+
};
|
|
171
|
+
type BoardNodeInput = Omit<BoardNodeRecord, "boardId" | "version" | "createdAt" | "updatedAt">;
|
|
172
|
+
type BoardDiagnostic = {
|
|
173
|
+
severity: "info" | "warning" | "error";
|
|
174
|
+
code: string;
|
|
175
|
+
message: string;
|
|
176
|
+
path?: string;
|
|
177
|
+
adaptation?: Record<string, unknown>;
|
|
178
|
+
};
|
|
179
|
+
type BoardValidationResult = {
|
|
180
|
+
valid: boolean;
|
|
181
|
+
diagnostics: BoardDiagnostic[];
|
|
182
|
+
peakCost: BoardRenderCost;
|
|
183
|
+
};
|
|
184
|
+
declare function isBoardPath(path: string): boolean;
|
|
185
|
+
//#endregion
|
|
186
|
+
export { BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BoardAssetRef, BoardAssetRefSchema, BoardClip, BoardClipSchema, BoardDiagnostic, BoardEffect, BoardEffectSchema, BoardManifest, BoardManifestSchema, BoardNodeInput, BoardNodeRecord, BoardRecord, BoardSequence, BoardSequenceSchema, BoardTarget, BoardTargetSchema, BoardValidationResult, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest };
|