@cratis/scene.engine 4.11.0 → 4.12.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 (94) hide show
  1. package/dist/cjs/forms/CommandFormLayoutDiagnosticCode.js +20 -0
  2. package/dist/cjs/forms/CommandFormLayoutDiagnosticCode.js.map +1 -0
  3. package/dist/cjs/forms/commitCommandFormLayoutDraft.js +12 -0
  4. package/dist/cjs/forms/commitCommandFormLayoutDraft.js.map +1 -0
  5. package/dist/cjs/forms/defaultCommandFormLayout.js +23 -0
  6. package/dist/cjs/forms/defaultCommandFormLayout.js.map +1 -0
  7. package/dist/cjs/forms/formWidthToCss.js +24 -0
  8. package/dist/cjs/forms/formWidthToCss.js.map +1 -0
  9. package/dist/cjs/forms/normalizeCommandFormLayout.js +42 -0
  10. package/dist/cjs/forms/normalizeCommandFormLayout.js.map +1 -0
  11. package/dist/cjs/forms/parseFormWidth.js +34 -0
  12. package/dist/cjs/forms/parseFormWidth.js.map +1 -0
  13. package/dist/cjs/forms/preserveDirtyCommandValues.js +15 -0
  14. package/dist/cjs/forms/preserveDirtyCommandValues.js.map +1 -0
  15. package/dist/cjs/forms/resizeCommandFormColumn.js +27 -0
  16. package/dist/cjs/forms/resizeCommandFormColumn.js.map +1 -0
  17. package/dist/cjs/forms/updateCommandFormFieldPlacement.js +27 -0
  18. package/dist/cjs/forms/updateCommandFormFieldPlacement.js.map +1 -0
  19. package/dist/cjs/forms/validateCommandFormLayout.js +72 -0
  20. package/dist/cjs/forms/validateCommandFormLayout.js.map +1 -0
  21. package/dist/cjs/index.js +20 -0
  22. package/dist/cjs/index.js.map +1 -1
  23. package/dist/esm/forms/CommandFormLayoutDiagnostic.d.ts +7 -0
  24. package/dist/esm/forms/CommandFormLayoutDiagnostic.d.ts.map +1 -0
  25. package/dist/esm/forms/CommandFormLayoutDiagnostic.js +2 -0
  26. package/dist/esm/forms/CommandFormLayoutDiagnostic.js.map +1 -0
  27. package/dist/esm/forms/CommandFormLayoutDiagnosticCode.d.ts +11 -0
  28. package/dist/esm/forms/CommandFormLayoutDiagnosticCode.d.ts.map +1 -0
  29. package/dist/esm/forms/CommandFormLayoutDiagnosticCode.js +18 -0
  30. package/dist/esm/forms/CommandFormLayoutDiagnosticCode.js.map +1 -0
  31. package/dist/esm/forms/CommandFormLayoutDraft.d.ts +9 -0
  32. package/dist/esm/forms/CommandFormLayoutDraft.d.ts.map +1 -0
  33. package/dist/esm/forms/CommandFormLayoutDraft.js +2 -0
  34. package/dist/esm/forms/CommandFormLayoutDraft.js.map +1 -0
  35. package/dist/esm/forms/commitCommandFormLayoutDraft.d.ts +4 -0
  36. package/dist/esm/forms/commitCommandFormLayoutDraft.d.ts.map +1 -0
  37. package/dist/esm/forms/commitCommandFormLayoutDraft.js +10 -0
  38. package/dist/esm/forms/commitCommandFormLayoutDraft.js.map +1 -0
  39. package/dist/esm/forms/defaultCommandFormLayout.d.ts +3 -0
  40. package/dist/esm/forms/defaultCommandFormLayout.d.ts.map +1 -0
  41. package/dist/esm/forms/defaultCommandFormLayout.js +21 -0
  42. package/dist/esm/forms/defaultCommandFormLayout.js.map +1 -0
  43. package/dist/esm/forms/formWidthToCss.d.ts +3 -0
  44. package/dist/esm/forms/formWidthToCss.d.ts.map +1 -0
  45. package/dist/esm/forms/formWidthToCss.js +22 -0
  46. package/dist/esm/forms/formWidthToCss.js.map +1 -0
  47. package/dist/esm/forms/index.d.ts +13 -0
  48. package/dist/esm/forms/index.d.ts.map +1 -0
  49. package/dist/esm/forms/index.js +13 -0
  50. package/dist/esm/forms/index.js.map +1 -0
  51. package/dist/esm/forms/normalizeCommandFormLayout.d.ts +8 -0
  52. package/dist/esm/forms/normalizeCommandFormLayout.d.ts.map +1 -0
  53. package/dist/esm/forms/normalizeCommandFormLayout.js +40 -0
  54. package/dist/esm/forms/normalizeCommandFormLayout.js.map +1 -0
  55. package/dist/esm/forms/parseFormWidth.d.ts +3 -0
  56. package/dist/esm/forms/parseFormWidth.d.ts.map +1 -0
  57. package/dist/esm/forms/parseFormWidth.js +32 -0
  58. package/dist/esm/forms/parseFormWidth.js.map +1 -0
  59. package/dist/esm/forms/preserveDirtyCommandValues.d.ts +2 -0
  60. package/dist/esm/forms/preserveDirtyCommandValues.d.ts.map +1 -0
  61. package/dist/esm/forms/preserveDirtyCommandValues.js +13 -0
  62. package/dist/esm/forms/preserveDirtyCommandValues.js.map +1 -0
  63. package/dist/esm/forms/resizeCommandFormColumn.d.ts +4 -0
  64. package/dist/esm/forms/resizeCommandFormColumn.d.ts.map +1 -0
  65. package/dist/esm/forms/resizeCommandFormColumn.js +25 -0
  66. package/dist/esm/forms/resizeCommandFormColumn.js.map +1 -0
  67. package/dist/esm/forms/updateCommandFormFieldPlacement.d.ts +4 -0
  68. package/dist/esm/forms/updateCommandFormFieldPlacement.d.ts.map +1 -0
  69. package/dist/esm/forms/updateCommandFormFieldPlacement.js +25 -0
  70. package/dist/esm/forms/updateCommandFormFieldPlacement.js.map +1 -0
  71. package/dist/esm/forms/validateCommandFormLayout.d.ts +4 -0
  72. package/dist/esm/forms/validateCommandFormLayout.d.ts.map +1 -0
  73. package/dist/esm/forms/validateCommandFormLayout.js +70 -0
  74. package/dist/esm/forms/validateCommandFormLayout.js.map +1 -0
  75. package/dist/esm/index.d.ts +1 -0
  76. package/dist/esm/index.d.ts.map +1 -1
  77. package/dist/esm/index.js +10 -0
  78. package/dist/esm/index.js.map +1 -1
  79. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  80. package/forms/CommandFormLayoutDiagnostic.ts +13 -0
  81. package/forms/CommandFormLayoutDiagnosticCode.ts +16 -0
  82. package/forms/CommandFormLayoutDraft.ts +15 -0
  83. package/forms/commitCommandFormLayoutDraft.ts +12 -0
  84. package/forms/defaultCommandFormLayout.ts +12 -0
  85. package/forms/formWidthToCss.ts +21 -0
  86. package/forms/index.ts +15 -0
  87. package/forms/normalizeCommandFormLayout.ts +39 -0
  88. package/forms/parseFormWidth.ts +20 -0
  89. package/forms/preserveDirtyCommandValues.ts +13 -0
  90. package/forms/resizeCommandFormColumn.ts +23 -0
  91. package/forms/updateCommandFormFieldPlacement.ts +22 -0
  92. package/forms/validateCommandFormLayout.ts +74 -0
  93. package/index.ts +1 -0
  94. package/package.json +3 -3
@@ -0,0 +1,13 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { CommandFormLayoutDiagnosticCode } from './CommandFormLayoutDiagnosticCode';
5
+
6
+ /**
7
+ * A validation problem in authored command-form geometry.
8
+ */
9
+ export interface CommandFormLayoutDiagnostic {
10
+ code: CommandFormLayoutDiagnosticCode;
11
+ message: string;
12
+ path: string;
13
+ }
@@ -0,0 +1,16 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ /**
5
+ * Diagnostic codes for command-form geometry validation.
6
+ */
7
+ export enum CommandFormLayoutDiagnosticCode {
8
+ EmptyColumns = 'emptyColumns',
9
+ DuplicateColumn = 'duplicateColumn',
10
+ InvalidColumnIndex = 'invalidColumnIndex',
11
+ InvalidWidth = 'invalidWidth',
12
+ DuplicatePlacement = 'duplicatePlacement',
13
+ InvalidPlacement = 'invalidPlacement',
14
+ MissingField = 'missingField',
15
+ OutOfBoundsPlacement = 'outOfBoundsPlacement',
16
+ }
@@ -0,0 +1,15 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { CommandFormLayout } from '@cratis/scene.model';
5
+ import { CommandFormLayoutDiagnostic } from './CommandFormLayoutDiagnostic';
6
+
7
+ /**
8
+ * Separates invalid editing state from the last committed form geometry.
9
+ */
10
+ export interface CommandFormLayoutDraft {
11
+ committed: CommandFormLayout;
12
+ draft: CommandFormLayout;
13
+ diagnostics: CommandFormLayoutDiagnostic[];
14
+ isValid: boolean;
15
+ }
@@ -0,0 +1,12 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { CommandFormLayout } from '@cratis/scene.model';
5
+ import { CommandFormLayoutDraft } from './CommandFormLayoutDraft';
6
+
7
+ /**
8
+ * Commits a draft layout only when it is valid; otherwise returns the previous committed metadata.
9
+ */
10
+ export function commitCommandFormLayoutDraft(draft: CommandFormLayoutDraft): CommandFormLayout {
11
+ return draft.isValid ? draft.draft : draft.committed;
12
+ }
@@ -0,0 +1,12 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { CommandFormLayout, FormWidthUnit } from '@cratis/scene.model';
5
+
6
+ /**
7
+ * Backward-compatible command form geometry: one flexible column and no authored placements.
8
+ */
9
+ export const defaultCommandFormLayout: CommandFormLayout = {
10
+ columns: [{ index: 1, width: { unit: FormWidthUnit.Fraction, value: 1 } }],
11
+ placements: [],
12
+ };
@@ -0,0 +1,21 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { FormWidth, FormWidthUnit } from '@cratis/scene.model';
5
+
6
+ /**
7
+ * Converts a platform-neutral form width to a browser CSS width token.
8
+ */
9
+ export function formWidthToCss(width: FormWidth | undefined): string | undefined {
10
+ if (!width) return undefined;
11
+ switch (width.unit) {
12
+ case FormWidthUnit.Auto:
13
+ return 'auto';
14
+ case FormWidthUnit.Fraction:
15
+ return `${width.value ?? 1}fr`;
16
+ case FormWidthUnit.Pixels:
17
+ return `${width.value ?? 0}px`;
18
+ case FormWidthUnit.Percent:
19
+ return `${width.value ?? 0}%`;
20
+ }
21
+ }
package/forms/index.ts ADDED
@@ -0,0 +1,15 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ export * from './CommandFormLayoutDiagnostic';
5
+ export * from './CommandFormLayoutDiagnosticCode';
6
+ export * from './CommandFormLayoutDraft';
7
+ export * from './commitCommandFormLayoutDraft';
8
+ export * from './defaultCommandFormLayout';
9
+ export * from './formWidthToCss';
10
+ export * from './normalizeCommandFormLayout';
11
+ export * from './parseFormWidth';
12
+ export * from './preserveDirtyCommandValues';
13
+ export * from './resizeCommandFormColumn';
14
+ export * from './updateCommandFormFieldPlacement';
15
+ export * from './validateCommandFormLayout';
@@ -0,0 +1,39 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { CommandFormLayout, FormColumn, FormFieldPlacement, FormWidth, FormWidthUnit } from '@cratis/scene.model';
5
+ import { defaultCommandFormLayout } from './defaultCommandFormLayout';
6
+ import { parseFormWidth } from './parseFormWidth';
7
+
8
+ export interface LegacyCommandFormInputGeometry {
9
+ property: string;
10
+ column?: number;
11
+ width?: string;
12
+ }
13
+
14
+ /**
15
+ * Normalizes authored command form layout, including legacy per-input column/width metadata.
16
+ */
17
+ export function normalizeCommandFormLayout(layout: CommandFormLayout | undefined, inputs: readonly LegacyCommandFormInputGeometry[] = []): CommandFormLayout {
18
+ if (layout) return layout;
19
+ if (!inputs.length) return defaultCommandFormLayout;
20
+ const placements = inputs.map((input, index): FormFieldPlacement => ({
21
+ field: input.property,
22
+ row: index + 1,
23
+ column: positiveInteger(input.column) ?? 1,
24
+ width: parseFormWidth(input.width),
25
+ }));
26
+ const columnCount = Math.max(1, ...placements.map(placement => placement.column));
27
+ return {
28
+ columns: Array.from({ length: columnCount }, (_, index): FormColumn => ({ index: index + 1, width: fraction(1) })),
29
+ placements,
30
+ };
31
+ }
32
+
33
+ function fraction(value: number): FormWidth {
34
+ return { unit: FormWidthUnit.Fraction, value };
35
+ }
36
+
37
+ function positiveInteger(value: number | undefined): number | undefined {
38
+ return value !== undefined && Number.isInteger(value) && value > 0 ? value : undefined;
39
+ }
@@ -0,0 +1,20 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { FormWidth, FormWidthUnit } from '@cratis/scene.model';
5
+
6
+ /**
7
+ * Parses a legacy width token into typed form geometry. Arbitrary strings are intentionally rejected.
8
+ */
9
+ export function parseFormWidth(value: unknown): FormWidth | undefined {
10
+ if (!value || typeof value !== 'string') return undefined;
11
+ const trimmed = value.trim();
12
+ if (trimmed === 'auto') return { unit: FormWidthUnit.Auto };
13
+ const match = /^([0-9]+(?:\.[0-9]+)?)(fr|px|%)$/.exec(trimmed);
14
+ if (!match) return undefined;
15
+ const widthValue = Number(match[1]);
16
+ if (!Number.isFinite(widthValue) || widthValue < 0) return undefined;
17
+ if (match[2] === 'fr') return { unit: FormWidthUnit.Fraction, value: widthValue };
18
+ if (match[2] === 'px') return { unit: FormWidthUnit.Pixels, value: widthValue };
19
+ return { unit: FormWidthUnit.Percent, value: widthValue };
20
+ }
@@ -0,0 +1,13 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ /**
5
+ * Merges refreshed command values without overwriting dirty fields a user is editing.
6
+ */
7
+ export function preserveDirtyCommandValues(
8
+ current: Record<string, unknown>,
9
+ refreshed: Record<string, unknown>,
10
+ dirtyFields: ReadonlySet<string>,
11
+ ): Record<string, unknown> {
12
+ return Object.fromEntries(Object.entries(refreshed).map(([field, value]) => [field, dirtyFields.has(field) ? current[field] : value]));
13
+ }
@@ -0,0 +1,23 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { CommandFormLayout, FormWidth } from '@cratis/scene.model';
5
+ import { CommandFormLayoutDraft } from './CommandFormLayoutDraft';
6
+ import { validateCommandFormLayout } from './validateCommandFormLayout';
7
+
8
+ /**
9
+ * Resizes a column as draft geometry, keeping the last committed layout separate when invalid.
10
+ */
11
+ export function resizeCommandFormColumn(
12
+ committed: CommandFormLayout,
13
+ columnIndex: number,
14
+ width: FormWidth,
15
+ fields: readonly string[] = [],
16
+ ): CommandFormLayoutDraft {
17
+ const draft: CommandFormLayout = {
18
+ ...committed,
19
+ columns: committed.columns.map(column => column.index === columnIndex ? { ...column, width } : column),
20
+ };
21
+ const diagnostics = validateCommandFormLayout(draft, fields);
22
+ return { committed, draft, diagnostics, isValid: diagnostics.length === 0 };
23
+ }
@@ -0,0 +1,22 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { CommandFormLayout, FormFieldPlacement } from '@cratis/scene.model';
5
+ import { CommandFormLayoutDraft } from './CommandFormLayoutDraft';
6
+ import { validateCommandFormLayout } from './validateCommandFormLayout';
7
+
8
+ /**
9
+ * Updates a field placement as draft geometry, keeping the committed layout separate when invalid.
10
+ */
11
+ export function updateCommandFormFieldPlacement(
12
+ committed: CommandFormLayout,
13
+ placement: FormFieldPlacement,
14
+ fields: readonly string[] = [],
15
+ ): CommandFormLayoutDraft {
16
+ const draft: CommandFormLayout = {
17
+ ...committed,
18
+ placements: [...committed.placements.filter(existing => existing.field !== placement.field), placement],
19
+ };
20
+ const diagnostics = validateCommandFormLayout(draft, fields);
21
+ return { committed, draft, diagnostics, isValid: diagnostics.length === 0 };
22
+ }
@@ -0,0 +1,74 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { CommandFormLayout, FormWidth, FormWidthUnit } from '@cratis/scene.model';
5
+ import { CommandFormLayoutDiagnostic } from './CommandFormLayoutDiagnostic';
6
+ import { CommandFormLayoutDiagnosticCode } from './CommandFormLayoutDiagnosticCode';
7
+
8
+ /**
9
+ * Validates authored command-form geometry without rewriting invalid drafts.
10
+ */
11
+ export function validateCommandFormLayout(layout: CommandFormLayout, fields: readonly string[] = []): CommandFormLayoutDiagnostic[] {
12
+ const diagnostics: CommandFormLayoutDiagnostic[] = [];
13
+ const columnIndexes = new Set<number>();
14
+ const knownFields = new Set(fields);
15
+
16
+ if (!layout.columns.length) diagnostics.push(problem(CommandFormLayoutDiagnosticCode.EmptyColumns, 'At least one column is required.', 'columns'));
17
+ layout.columns.forEach((column, index) => {
18
+ if (!Number.isInteger(column.index) || column.index < 1) {
19
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidColumnIndex, `Column ${index + 1} must have a one-based integer index.`, `columns.${index}.index`));
20
+ }
21
+ if (columnIndexes.has(column.index)) {
22
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.DuplicateColumn, `Column ${column.index} is declared more than once.`, `columns.${index}.index`));
23
+ }
24
+ columnIndexes.add(column.index);
25
+ validateWidth(column.width, `columns.${index}.width`, diagnostics);
26
+ validateWidth(column.minWidth, `columns.${index}.minWidth`, diagnostics);
27
+ validateWidth(column.maxWidth, `columns.${index}.maxWidth`, diagnostics);
28
+ });
29
+
30
+ validateWidth(layout.columnGap, 'columnGap', diagnostics);
31
+ validateWidth(layout.rowGap, 'rowGap', diagnostics);
32
+
33
+ const placements = new Set<string>();
34
+ layout.placements.forEach((placement, index) => {
35
+ if (!placement.field.trim()) diagnostics.push(problem(CommandFormLayoutDiagnosticCode.MissingField, 'A placement must name its field.', `placements.${index}.field`));
36
+ if (knownFields.size && !knownFields.has(placement.field)) {
37
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.MissingField, `Placement targets unknown field '${placement.field}'.`, `placements.${index}.field`));
38
+ }
39
+ if (placements.has(placement.field)) {
40
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.DuplicatePlacement, `Field '${placement.field}' is placed more than once.`, `placements.${index}.field`));
41
+ }
42
+ placements.add(placement.field);
43
+ if (!Number.isInteger(placement.row) || placement.row < 1 || !Number.isInteger(placement.column) || placement.column < 1 ||
44
+ (placement.rowSpan !== undefined && (!Number.isInteger(placement.rowSpan) || placement.rowSpan < 1)) ||
45
+ (placement.columnSpan !== undefined && (!Number.isInteger(placement.columnSpan) || placement.columnSpan < 1))) {
46
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidPlacement, `Placement for '${placement.field}' must use positive integer row, column and span values.`, `placements.${index}`));
47
+ }
48
+ const span = placement.columnSpan ?? 1;
49
+ if (layout.columns.length && placement.column + span - 1 > layout.columns.length) {
50
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.OutOfBoundsPlacement, `Placement for '${placement.field}' extends beyond the declared columns.`, `placements.${index}.columnSpan`));
51
+ }
52
+ validateWidth(placement.width, `placements.${index}.width`, diagnostics);
53
+ });
54
+
55
+ return diagnostics;
56
+ }
57
+
58
+ function validateWidth(width: FormWidth | undefined, path: string, diagnostics: CommandFormLayoutDiagnostic[]): void {
59
+ if (!width) return;
60
+ if (!Object.values(FormWidthUnit).includes(width.unit)) {
61
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidWidth, `Width at '${path}' uses an unsupported unit.`, path));
62
+ return;
63
+ }
64
+ if (width.unit === FormWidthUnit.Auto && width.value !== undefined) {
65
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidWidth, `Automatic width at '${path}' must not carry a numeric value.`, path));
66
+ }
67
+ if (width.unit !== FormWidthUnit.Auto && (width.value === undefined || width.value < 0 || !Number.isFinite(width.value))) {
68
+ diagnostics.push(problem(CommandFormLayoutDiagnosticCode.InvalidWidth, `Width at '${path}' must carry a non-negative numeric value.`, path));
69
+ }
70
+ }
71
+
72
+ function problem(code: CommandFormLayoutDiagnosticCode, message: string, path: string): CommandFormLayoutDiagnostic {
73
+ return { code, message, path };
74
+ }
package/index.ts CHANGED
@@ -8,6 +8,7 @@ export * from './BindingDiagnostic';
8
8
  export * from './resolveBindingExpression';
9
9
  export * from './validateBindingExpression';
10
10
  export * from './renderElement';
11
+ export * from './forms';
11
12
  export * from './elementKind';
12
13
  export * from './panelKind';
13
14
  export * from './flowNodeKind';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/scene.engine",
3
- "version": "4.11.0",
3
+ "version": "4.12.0",
4
4
  "description": "The Scene runtime: walks a Scene element tree and drives whichever renderer is plugged in. Does not know React, or any other rendering platform, exists.",
5
5
  "keywords": [
6
6
  "cratis",
@@ -48,9 +48,9 @@
48
48
  "up": "yarn g:up"
49
49
  },
50
50
  "dependencies": {
51
- "@cratis/scene.model": "4.11.0"
51
+ "@cratis/scene.model": "4.12.0"
52
52
  },
53
53
  "devDependencies": {
54
- "@cratis/scene.model": "4.11.0"
54
+ "@cratis/scene.model": "4.12.0"
55
55
  }
56
56
  }