@vulfram/engine 0.14.8-alpha → 0.19.2-alpha

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 (63) hide show
  1. package/README.md +106 -0
  2. package/package.json +60 -4
  3. package/src/core.ts +14 -0
  4. package/src/ecs.ts +1 -0
  5. package/src/engine/api.ts +222 -24
  6. package/src/engine/bridge/dispatch.ts +260 -40
  7. package/src/engine/bridge/guards.ts +4 -1
  8. package/src/engine/bridge/protocol.ts +69 -52
  9. package/src/engine/ecs/components.ts +340 -0
  10. package/src/engine/ecs/index.ts +3 -518
  11. package/src/engine/ecs/intents.ts +184 -0
  12. package/src/engine/ecs/systems.ts +26 -0
  13. package/src/engine/intents/store.ts +72 -0
  14. package/src/engine/state.ts +136 -5
  15. package/src/engine/systems/command-intent.ts +159 -14
  16. package/src/engine/systems/constraint-solve.ts +167 -0
  17. package/src/engine/systems/core-command-builder.ts +9 -268
  18. package/src/engine/systems/diagnostics.ts +20 -29
  19. package/src/engine/systems/index.ts +3 -1
  20. package/src/engine/systems/input-mirror.ts +257 -21
  21. package/src/engine/systems/resource-upload.ts +108 -58
  22. package/src/engine/systems/response-decode.ts +86 -15
  23. package/src/engine/systems/scene-sync.ts +305 -0
  24. package/src/engine/systems/ui-bridge.ts +381 -0
  25. package/src/engine/systems/utils.ts +86 -1
  26. package/src/engine/systems/world-lifecycle.ts +43 -114
  27. package/src/engine/window/manager.ts +168 -0
  28. package/src/engine/world/entities.ts +998 -91
  29. package/src/engine/world/mount.ts +195 -0
  30. package/src/engine/world/types.ts +71 -0
  31. package/src/engine/world/world-ui.ts +313 -0
  32. package/src/engine/world/world3d.ts +529 -0
  33. package/src/helpers/collision.ts +487 -0
  34. package/src/helpers/index.ts +2 -0
  35. package/src/helpers/raycast.ts +442 -0
  36. package/src/index.ts +30 -1
  37. package/src/mount.ts +2 -0
  38. package/src/types/cmds/audio.ts +73 -48
  39. package/src/types/cmds/camera.ts +12 -8
  40. package/src/types/cmds/environment.ts +9 -3
  41. package/src/types/cmds/geometry.ts +15 -16
  42. package/src/types/cmds/index.ts +234 -162
  43. package/src/types/cmds/input.ts +39 -0
  44. package/src/types/cmds/light.ts +12 -11
  45. package/src/types/cmds/material.ts +19 -21
  46. package/src/types/cmds/model.ts +17 -15
  47. package/src/types/cmds/realm.ts +23 -0
  48. package/src/types/cmds/system.ts +29 -0
  49. package/src/types/cmds/target.ts +96 -0
  50. package/src/types/cmds/texture.ts +13 -3
  51. package/src/types/cmds/ui.ts +220 -0
  52. package/src/types/cmds/window.ts +41 -204
  53. package/src/types/events/index.ts +4 -1
  54. package/src/types/events/keyboard.ts +2 -2
  55. package/src/types/events/pointer.ts +85 -13
  56. package/src/types/events/system.ts +188 -30
  57. package/src/types/events/ui.ts +21 -0
  58. package/src/types/index.ts +1 -0
  59. package/src/types/json.ts +15 -0
  60. package/src/window.ts +8 -0
  61. package/src/world-ui.ts +2 -0
  62. package/src/world3d.ts +10 -0
  63. package/tsconfig.json +0 -29
@@ -1,518 +1,3 @@
1
- import type { ViewPosition } from '../../types/cmds/camera';
2
- import type { GeometryPrimitiveEntry } from '../../types/cmds/geometry';
3
- import type { MaterialOptions } from '../../types/cmds/material';
4
- import type { ShadowConfig } from '../../types/cmds/shadow';
5
- import type { ForwardAtlasOptions } from '../../types/cmds/texture';
6
- import type { EnvironmentConfig } from '../../types/cmds/environment';
7
- import type {
8
- CameraKind,
9
- LightKind,
10
- MaterialKind,
11
- TextureCreateMode,
12
- NotificationLevel,
13
- WindowState,
14
- CursorGrabMode,
15
- CursorIcon,
16
- UserAttentionType,
17
- } from '../../types/kinds';
18
- import type { WorldState } from '../state';
19
-
20
- /**
21
- * Standard ECS components for Vulfram.
22
- *
23
- * Rules:
24
- * 1. Components are plain data.
25
- * 2. They are NEVER modified directly by the user during a frame.
26
- * 3. Changes are requested via Intents.
27
- */
28
-
29
- /**
30
- * Transform component data used to position entities.
31
- */
32
- export interface TransformProps {
33
- position?: [number, number, number];
34
- rotation?: [number, number, number, number]; // Quaternion
35
- scale?: [number, number, number];
36
- layerMask?: number;
37
- visible?: boolean;
38
- }
39
-
40
- /**
41
- * Fully-resolved transform component stored in the ECS.
42
- */
43
- export interface TransformComponent extends Required<
44
- Omit<TransformProps, never>
45
- > {
46
- type: 'Transform';
47
- }
48
-
49
- /**
50
- * Parent link data used for hierarchical transforms.
51
- */
52
- export interface ParentProps {
53
- parentId: number;
54
- }
55
-
56
- /**
57
- * Parent component stored in the ECS.
58
- */
59
- export interface ParentComponent extends ParentProps {
60
- type: 'Parent';
61
- }
62
-
63
- /**
64
- * Camera component configuration.
65
- */
66
- export interface CameraProps {
67
- kind?: CameraKind;
68
- near?: number;
69
- far?: number;
70
- order?: number;
71
- viewPosition?: ViewPosition;
72
- orthoScale?: number;
73
- }
74
-
75
- /**
76
- * Camera component stored in the ECS.
77
- */
78
- export interface CameraComponent extends Required<
79
- Omit<CameraProps, 'viewPosition'>
80
- > {
81
- type: 'Camera';
82
- id: number; // Core Camera ID
83
- viewPosition?: ViewPosition;
84
- skipUpdate?: boolean; // Internal flag to skip next transform update
85
- }
86
-
87
- /**
88
- * Light component configuration.
89
- */
90
- export interface LightProps {
91
- kind?: LightKind;
92
- color?: [number, number, number];
93
- intensity?: number;
94
- range?: number;
95
- castShadow?: boolean;
96
- direction?: [number, number, number];
97
- spotInnerOuter?: [number, number];
98
- }
99
-
100
- /**
101
- * Light component stored in the ECS.
102
- */
103
- export interface LightComponent extends Required<Omit<LightProps, never>> {
104
- type: 'Light';
105
- id: number; // Core Light ID
106
- skipUpdate?: boolean; // Internal flag to skip next transform update
107
- }
108
-
109
- /**
110
- * Model component configuration.
111
- */
112
- export interface ModelProps {
113
- geometryId: number;
114
- materialId?: number;
115
- castShadow?: boolean;
116
- receiveShadow?: boolean;
117
- castOutline?: boolean;
118
- outlineColor?: [number, number, number, number];
119
- }
120
-
121
- /**
122
- * Model component stored in the ECS.
123
- */
124
- export interface ModelComponent extends Required<
125
- Omit<ModelProps, 'materialId'>
126
- > {
127
- type: 'Model';
128
- id: number; // Core Model ID
129
- materialId?: number;
130
- skipUpdate?: boolean; // Internal flag to skip next transform update
131
- }
132
-
133
- /**
134
- * Tag component configuration.
135
- */
136
- export interface TagProps {
137
- name?: string;
138
- labels?: string[];
139
- }
140
-
141
- /**
142
- * Tag component stored in the ECS.
143
- */
144
- export interface TagComponent {
145
- type: 'Tag';
146
- name: string;
147
- labels: Set<string>;
148
- }
149
-
150
- /**
151
- * InputState: Stores the current input state for a world.
152
- * This is updated each frame based on incoming events.
153
- */
154
- export interface InputStateComponent {
155
- type: 'InputState';
156
- keysPressed: Set<number>; // KeyCodes currently held down
157
- keysJustPressed: Set<number>; // KeyCodes pressed this frame
158
- keysJustReleased: Set<number>; // KeyCodes released this frame
159
- mouseButtons: Set<number>; // Mouse buttons currently held
160
- mousePosition: [number, number]; // Current mouse position
161
- mouseJustPressed: Set<number>; // Mouse buttons pressed this frame
162
- mouseJustReleased: Set<number>; // Mouse buttons released this frame
163
- mouseDelta: [number, number]; // Mouse movement delta this frame
164
- scrollDelta: [number, number]; // Scroll delta this frame
165
- }
166
-
167
- /**
168
- * WindowState: Stores window events and state.
169
- */
170
- export interface WindowStateComponent {
171
- type: 'WindowState';
172
- focused: boolean;
173
- size: [number, number];
174
- position: [number, number];
175
- scaleFactor: number;
176
- closeRequested: boolean;
177
- resizedThisFrame: boolean;
178
- movedThisFrame: boolean;
179
- focusChangedThisFrame: boolean;
180
- }
181
-
182
- /**
183
- * Resource Properties
184
- */
185
-
186
- /**
187
- * Base properties shared by resources.
188
- */
189
- export interface BaseResourceProps {
190
- label?: string;
191
- }
192
-
193
- /**
194
- * Material resource configuration.
195
- */
196
- export interface MaterialProps extends BaseResourceProps {
197
- kind: MaterialKind;
198
- options: MaterialOptions;
199
- }
200
-
201
- /**
202
- * Options for cube primitive geometry.
203
- */
204
- export interface CubeOptions {
205
- size?: [number, number, number];
206
- }
207
-
208
- /**
209
- * Options for plane primitive geometry.
210
- */
211
- export interface PlaneOptions {
212
- size?: [number, number, number];
213
- subdivisions?: number;
214
- }
215
-
216
- /**
217
- * Options for sphere primitive geometry.
218
- */
219
- export interface SphereOptions {
220
- radius?: number;
221
- sectors?: number;
222
- stacks?: number;
223
- }
224
-
225
- /**
226
- * Options for cylinder primitive geometry.
227
- */
228
- export interface CylinderOptions {
229
- radius?: number;
230
- height?: number;
231
- segments?: number;
232
- }
233
-
234
- /**
235
- * Options for torus primitive geometry.
236
- */
237
- export interface TorusOptions {
238
- majorRadius?: number;
239
- minorRadius?: number;
240
- radialSegments?: number;
241
- tubularSegments?: number;
242
- }
243
-
244
- /**
245
- * Options for pyramid primitive geometry.
246
- */
247
- export interface PyramidOptions {
248
- size?: [number, number, number];
249
- subdivisions?: number;
250
- }
251
-
252
- /**
253
- * Geometry resource configuration (primitive or custom).
254
- */
255
- export type GeometryProps = BaseResourceProps &
256
- (
257
- | {
258
- type: 'custom';
259
- entries: GeometryPrimitiveEntry[];
260
- }
261
- | ({ type: 'primitive' } & (
262
- | { shape: 'cube'; options?: CubeOptions }
263
- | { shape: 'plane'; options?: PlaneOptions }
264
- | { shape: 'sphere'; options?: SphereOptions }
265
- | { shape: 'cylinder'; options?: CylinderOptions }
266
- | { shape: 'torus'; options?: TorusOptions }
267
- | { shape: 'pyramid'; options?: PyramidOptions }
268
- ))
269
- );
270
-
271
- /**
272
- * Texture resource configuration.
273
- */
274
- export interface TextureProps extends BaseResourceProps {
275
- srgb?: boolean;
276
- mode?: TextureCreateMode;
277
- atlasOptions?: ForwardAtlasOptions;
278
- source:
279
- | { type: 'buffer'; bufferId: number }
280
- | { type: 'color'; color: [number, number, number, number] };
281
- }
282
-
283
- /**
284
- * Union of all built-in component types.
285
- */
286
- export type Component =
287
- | TransformComponent
288
- | ParentComponent
289
- | CameraComponent
290
- | LightComponent
291
- | ModelComponent
292
- | TagComponent
293
- | InputStateComponent
294
- | WindowStateComponent
295
- | CustomComponent;
296
-
297
- /**
298
- * Custom components are dynamic and registered via schema.
299
- */
300
- /**
301
- * Custom component payload stored in the ECS.
302
- */
303
- export interface CustomComponent {
304
- type: string;
305
- data: Record<string, unknown>;
306
- }
307
-
308
- /**
309
- * String literal type for component identifiers.
310
- */
311
- export type ComponentType = Component['type'];
312
-
313
- /**
314
- * Extension Schemas
315
- */
316
-
317
- /**
318
- * Supported property types for custom schemas.
319
- */
320
- export type PropertyType =
321
- | 'number'
322
- | 'string'
323
- | 'boolean'
324
- | 'vec2'
325
- | 'vec3'
326
- | 'vec4'
327
- | 'quat'
328
- | 'entity'
329
- | 'resource'
330
- | 'array'
331
- | 'object';
332
-
333
- /**
334
- * Schema entry describing a custom component field.
335
- */
336
- export interface SchemaProperty {
337
- type: PropertyType;
338
- default?: unknown;
339
- optional?: boolean;
340
- }
341
-
342
- /**
343
- * Schema definition for a custom component.
344
- */
345
- export interface ComponentSchema {
346
- [key: string]: SchemaProperty;
347
- }
348
-
349
- /**
350
- * Window update properties.
351
- */
352
- export interface WindowProps {
353
- title?: string;
354
- position?: [number, number];
355
- size?: [number, number];
356
- state?: WindowState;
357
- resizable?: boolean;
358
- decorations?: boolean;
359
- cursorVisible?: boolean;
360
- cursorGrab?: CursorGrabMode;
361
- icon?: number;
362
- cursorIcon?: CursorIcon;
363
- }
364
-
365
- /**
366
- * Window creation properties.
367
- */
368
- export interface CreateWindowProps {
369
- title: string;
370
- size: [number, number];
371
- position: [number, number];
372
- canvasId?: string;
373
- borderless?: boolean;
374
- resizable?: boolean;
375
- transparent?: boolean;
376
- initialState?: WindowState;
377
- }
378
-
379
- /**
380
- * Intents:
381
- * Requests to change the state of the World.
382
- * Systems process Intents and generate Core Commands.
383
- */
384
-
385
- export type Intent =
386
- | { type: 'create-window'; props: CreateWindowProps }
387
- | { type: 'close-window' }
388
- | { type: 'update-window'; props: WindowProps }
389
- | { type: 'request-attention'; attentionType?: UserAttentionType }
390
- | { type: 'focus-window' }
391
- | { type: 'configure-environment'; config: EnvironmentConfig }
392
- | {
393
- type: 'request-resource-list';
394
- resourceType:
395
- | 'model'
396
- | 'material'
397
- | 'texture'
398
- | 'geometry'
399
- | 'light'
400
- | 'camera';
401
- }
402
- | { type: 'create-entity'; worldId: number; entityId: number }
403
- | { type: 'remove-entity'; entityId: number }
404
- | {
405
- type: 'update-transform';
406
- entityId: number;
407
- props: TransformProps;
408
- }
409
- | {
410
- type: 'attach-camera';
411
- entityId: number;
412
- props: CameraProps;
413
- }
414
- | {
415
- type: 'attach-model';
416
- entityId: number;
417
- props: ModelProps;
418
- }
419
- | {
420
- type: 'attach-light';
421
- entityId: number;
422
- props: LightProps;
423
- }
424
- | {
425
- type: 'attach-tag';
426
- entityId: number;
427
- props: TagProps;
428
- }
429
- | { type: 'create-material'; resourceId: number; props: MaterialProps }
430
- | { type: 'create-geometry'; resourceId: number; props: GeometryProps }
431
- | { type: 'create-texture'; resourceId: number; props: TextureProps }
432
- | { type: 'dispose-material'; resourceId: number }
433
- | { type: 'dispose-texture'; resourceId: number }
434
- | { type: 'dispose-geometry'; resourceId: number }
435
- | { type: 'detach-component'; entityId: number; componentType: ComponentType }
436
- | { type: 'set-parent'; entityId: number; parentId: number | null }
437
- | {
438
- type: 'send-notification';
439
- level: NotificationLevel;
440
- title: string;
441
- message: string;
442
- }
443
- | { type: 'configure-shadows'; config: ShadowConfig }
444
- | {
445
- type: 'gizmo-draw-line';
446
- start: [number, number, number];
447
- end: [number, number, number];
448
- color: [number, number, number, number];
449
- }
450
- | {
451
- type: 'gizmo-draw-aabb';
452
- min: [number, number, number];
453
- max: [number, number, number];
454
- color: [number, number, number, number];
455
- }
456
- | {
457
- type: 'custom';
458
- name: string;
459
- data: Record<string, unknown>;
460
- };
461
-
462
- /**
463
- * Internal World Events:
464
- * Events emitted by systems or the engine to be consumed by other systems.
465
- */
466
- export type WorldEvent =
467
- | { type: 'entity-created'; entityId: number }
468
- | { type: 'entity-destroyed'; entityId: number }
469
- | { type: 'component-added'; entityId: number; componentType: ComponentType }
470
- | {
471
- type: 'component-removed';
472
- entityId: number;
473
- componentType: ComponentType;
474
- };
475
-
476
- /**
477
- * System Types
478
- */
479
-
480
- /**
481
- * Pipeline stage at which a system runs.
482
- */
483
- export type SystemStep = 'input' | 'update' | 'preRender' | 'postRender';
484
-
485
- /**
486
- * System execution context provided each frame.
487
- */
488
- export interface SystemContext {
489
- dt: number; // Delta time in seconds
490
- time: number; // Total time in seconds
491
- worldId: number;
492
- }
493
-
494
- /**
495
- * A System is a function that processes the WorldState.
496
- * It can emit new Intents, generate Core Commands, or interpret Events.
497
- */
498
- /**
499
- * System function signature.
500
- */
501
- export type System = (state: WorldState, context: SystemContext) => void;
502
-
503
- /**
504
- * Registration Hooks
505
- */
506
-
507
- /**
508
- * Registry of components and systems.
509
- */
510
- export interface EngineRegistry {
511
- components: Map<string, ComponentSchema>;
512
- systems: {
513
- input: System[];
514
- update: System[];
515
- preRender: System[];
516
- postRender: System[];
517
- };
518
- }
1
+ export * from './components';
2
+ export * from './intents';
3
+ export * from './systems';
@@ -0,0 +1,184 @@
1
+ import type {
2
+ CmdUiAccessKitActionRequestArgs,
3
+ CmdUiApplyOpsArgs,
4
+ CmdUiClipboardPasteArgs,
5
+ CmdUiDebugSetArgs,
6
+ CmdUiDocumentCreateArgs,
7
+ CmdUiDocumentDisposeArgs,
8
+ CmdUiDocumentGetLayoutRectsArgs,
9
+ CmdUiDocumentGetTreeArgs,
10
+ CmdUiDocumentSetRectArgs,
11
+ CmdUiDocumentSetThemeArgs,
12
+ CmdUiEventTraceSetArgs,
13
+ CmdUiFocusGetArgs,
14
+ CmdUiFocusSetArgs,
15
+ CmdUiImageCreateFromBufferArgs,
16
+ CmdUiImageDisposeArgs,
17
+ CmdUiScreenshotReplyArgs,
18
+ CmdUiThemeDefineArgs,
19
+ CmdUiThemeDisposeArgs,
20
+ } from '../../types/cmds/ui';
21
+ import type { EnvironmentConfig } from '../../types/cmds/environment';
22
+ import type { ShadowConfig } from '../../types/cmds/shadow';
23
+ import type { NotificationLevel } from '../../types/kinds';
24
+ import type { JsonObject } from '../../types/json';
25
+ import type {
26
+ CameraProps,
27
+ ComponentType,
28
+ GeometryProps,
29
+ LightProps,
30
+ MaterialProps,
31
+ ModelProps,
32
+ TagProps,
33
+ TextureProps,
34
+ TransformProps,
35
+ UiFocusCycleMode,
36
+ } from './components';
37
+
38
+ export type Intent =
39
+ | { type: 'configure-environment'; config: EnvironmentConfig }
40
+ | {
41
+ type: 'request-resource-list';
42
+ resourceType:
43
+ | 'model'
44
+ | 'material'
45
+ | 'texture'
46
+ | 'geometry'
47
+ | 'light'
48
+ | 'camera';
49
+ }
50
+ | { type: 'create-entity'; worldId: number; entityId: number }
51
+ | { type: 'remove-entity'; entityId: number }
52
+ | {
53
+ type: 'update-transform';
54
+ entityId: number;
55
+ props: TransformProps;
56
+ }
57
+ | {
58
+ type: 'attach-camera';
59
+ entityId: number;
60
+ props: CameraProps;
61
+ }
62
+ | {
63
+ type: 'attach-model';
64
+ entityId: number;
65
+ props: ModelProps;
66
+ }
67
+ | {
68
+ type: 'attach-light';
69
+ entityId: number;
70
+ props: LightProps;
71
+ }
72
+ | {
73
+ type: 'attach-tag';
74
+ entityId: number;
75
+ props: TagProps;
76
+ }
77
+ | { type: 'create-material'; resourceId: number; props: MaterialProps }
78
+ | { type: 'create-geometry'; resourceId: number; props: GeometryProps }
79
+ | { type: 'create-texture'; resourceId: number; props: TextureProps }
80
+ | { type: 'dispose-material'; resourceId: number }
81
+ | { type: 'dispose-texture'; resourceId: number }
82
+ | { type: 'dispose-geometry'; resourceId: number }
83
+ | { type: 'detach-component'; entityId: number; componentType: ComponentType }
84
+ | { type: 'set-parent'; entityId: number; parentId: number | null }
85
+ | {
86
+ type: 'send-notification';
87
+ level: NotificationLevel;
88
+ title: string;
89
+ message: string;
90
+ }
91
+ | { type: 'configure-shadows'; config: ShadowConfig }
92
+ | {
93
+ type: 'gizmo-draw-line';
94
+ start: [number, number, number];
95
+ end: [number, number, number];
96
+ color: [number, number, number, number];
97
+ }
98
+ | {
99
+ type: 'gizmo-draw-aabb';
100
+ min: [number, number, number];
101
+ max: [number, number, number];
102
+ color: [number, number, number, number];
103
+ }
104
+ | { type: 'ui-theme-define'; args: CmdUiThemeDefineArgs }
105
+ | { type: 'ui-theme-dispose'; args: CmdUiThemeDisposeArgs }
106
+ | { type: 'ui-document-create'; args: CmdUiDocumentCreateArgs }
107
+ | { type: 'ui-document-dispose'; args: CmdUiDocumentDisposeArgs }
108
+ | { type: 'ui-document-set-rect'; args: CmdUiDocumentSetRectArgs }
109
+ | { type: 'ui-document-set-theme'; args: CmdUiDocumentSetThemeArgs }
110
+ | { type: 'ui-document-get-tree'; args: CmdUiDocumentGetTreeArgs }
111
+ | {
112
+ type: 'ui-document-get-layout-rects';
113
+ args: CmdUiDocumentGetLayoutRectsArgs;
114
+ }
115
+ | { type: 'ui-apply-ops'; args: CmdUiApplyOpsArgs }
116
+ | { type: 'ui-debug-set'; args: CmdUiDebugSetArgs }
117
+ | { type: 'ui-focus-set'; args: CmdUiFocusSetArgs }
118
+ | { type: 'ui-focus-get'; args: CmdUiFocusGetArgs }
119
+ | { type: 'ui-event-trace-set'; args: CmdUiEventTraceSetArgs }
120
+ | { type: 'ui-image-create-from-buffer'; args: CmdUiImageCreateFromBufferArgs }
121
+ | { type: 'ui-image-dispose'; args: CmdUiImageDisposeArgs }
122
+ | { type: 'ui-clipboard-paste'; args: CmdUiClipboardPasteArgs }
123
+ | { type: 'ui-screenshot-reply'; args: CmdUiScreenshotReplyArgs }
124
+ | {
125
+ type: 'ui-access-kit-action-request';
126
+ args: CmdUiAccessKitActionRequestArgs;
127
+ }
128
+ | {
129
+ type: 'ui-form-upsert';
130
+ form: {
131
+ formId: string;
132
+ windowId: number;
133
+ realmId: number;
134
+ documentId: number;
135
+ disabled?: boolean;
136
+ cycleMode?: UiFocusCycleMode;
137
+ activeFieldsetId?: string;
138
+ };
139
+ }
140
+ | { type: 'ui-form-dispose'; formId: string }
141
+ | {
142
+ type: 'ui-fieldset-upsert';
143
+ fieldset: {
144
+ formId: string;
145
+ fieldsetId: string;
146
+ disabled?: boolean;
147
+ legendNodeId?: number;
148
+ };
149
+ }
150
+ | { type: 'ui-fieldset-dispose'; formId: string; fieldsetId: string }
151
+ | {
152
+ type: 'ui-focusable-upsert';
153
+ focusable: {
154
+ formId: string;
155
+ nodeId: number;
156
+ tabIndex?: number;
157
+ fieldsetId?: string;
158
+ disabled?: boolean;
159
+ orderHint?: number;
160
+ };
161
+ }
162
+ | { type: 'ui-focusable-dispose'; nodeId: number }
163
+ | {
164
+ type: 'ui-focus-next';
165
+ windowId: number;
166
+ backwards?: boolean;
167
+ formId?: string;
168
+ }
169
+ | {
170
+ type: 'custom';
171
+ name: string;
172
+ data: JsonObject;
173
+ };
174
+
175
+ /** Internal World Events. */
176
+ export type WorldEvent =
177
+ | { type: 'entity-created'; entityId: number }
178
+ | { type: 'entity-destroyed'; entityId: number }
179
+ | { type: 'component-added'; entityId: number; componentType: ComponentType }
180
+ | {
181
+ type: 'component-removed';
182
+ entityId: number;
183
+ componentType: ComponentType;
184
+ };