@meltemi/diagrams-editor 0.0.0-stage → 1.9.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 (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -2
  3. package/dist/analysis.d.ts +70 -0
  4. package/dist/analysis.d.ts.map +1 -0
  5. package/dist/analysis.js +59 -0
  6. package/dist/analysis.js.map +1 -0
  7. package/dist/arrange.d.ts +71 -0
  8. package/dist/arrange.d.ts.map +1 -0
  9. package/dist/arrange.js +286 -0
  10. package/dist/arrange.js.map +1 -0
  11. package/dist/assist.d.ts +61 -0
  12. package/dist/assist.d.ts.map +1 -0
  13. package/dist/assist.js +162 -0
  14. package/dist/assist.js.map +1 -0
  15. package/dist/c4.d.ts +30 -0
  16. package/dist/c4.d.ts.map +1 -0
  17. package/dist/c4.js +195 -0
  18. package/dist/c4.js.map +1 -0
  19. package/dist/canvas/arrange.d.ts +13 -0
  20. package/dist/canvas/arrange.d.ts.map +1 -0
  21. package/dist/canvas/arrange.js +61 -0
  22. package/dist/canvas/arrange.js.map +1 -0
  23. package/dist/canvas/geometry.d.ts +2 -0
  24. package/dist/canvas/geometry.d.ts.map +1 -0
  25. package/dist/canvas/geometry.js +3 -0
  26. package/dist/canvas/geometry.js.map +1 -0
  27. package/dist/canvas/index.d.ts +11 -0
  28. package/dist/canvas/index.d.ts.map +1 -0
  29. package/dist/canvas/index.js +14 -0
  30. package/dist/canvas/index.js.map +1 -0
  31. package/dist/canvas/keyboard.d.ts +39 -0
  32. package/dist/canvas/keyboard.d.ts.map +1 -0
  33. package/dist/canvas/keyboard.js +117 -0
  34. package/dist/canvas/keyboard.js.map +1 -0
  35. package/dist/canvas/palette.d.ts +40 -0
  36. package/dist/canvas/palette.d.ts.map +1 -0
  37. package/dist/canvas/palette.js +78 -0
  38. package/dist/canvas/palette.js.map +1 -0
  39. package/dist/canvas/protocol.d.ts +884 -0
  40. package/dist/canvas/protocol.d.ts.map +1 -0
  41. package/dist/canvas/protocol.js +268 -0
  42. package/dist/canvas/protocol.js.map +1 -0
  43. package/dist/canvas/routes.d.ts +104 -0
  44. package/dist/canvas/routes.d.ts.map +1 -0
  45. package/dist/canvas/routes.js +324 -0
  46. package/dist/canvas/routes.js.map +1 -0
  47. package/dist/canvas/selection.d.ts +77 -0
  48. package/dist/canvas/selection.d.ts.map +1 -0
  49. package/dist/canvas/selection.js +183 -0
  50. package/dist/canvas/selection.js.map +1 -0
  51. package/dist/canvas/snapping.d.ts +44 -0
  52. package/dist/canvas/snapping.d.ts.map +1 -0
  53. package/dist/canvas/snapping.js +86 -0
  54. package/dist/canvas/snapping.js.map +1 -0
  55. package/dist/canvas/turning.d.ts +20 -0
  56. package/dist/canvas/turning.d.ts.map +1 -0
  57. package/dist/canvas/turning.js +44 -0
  58. package/dist/canvas/turning.js.map +1 -0
  59. package/dist/catalog.d.ts +44 -0
  60. package/dist/catalog.d.ts.map +1 -0
  61. package/dist/catalog.js +182 -0
  62. package/dist/catalog.js.map +1 -0
  63. package/dist/clipboard.d.ts +27 -0
  64. package/dist/clipboard.d.ts.map +1 -0
  65. package/dist/clipboard.js +221 -0
  66. package/dist/clipboard.js.map +1 -0
  67. package/dist/drill.d.ts +55 -0
  68. package/dist/drill.d.ts.map +1 -0
  69. package/dist/drill.js +158 -0
  70. package/dist/drill.js.map +1 -0
  71. package/dist/effects.d.ts +22 -0
  72. package/dist/effects.d.ts.map +1 -0
  73. package/dist/effects.js +151 -0
  74. package/dist/effects.js.map +1 -0
  75. package/dist/exports.d.ts +107 -0
  76. package/dist/exports.d.ts.map +1 -0
  77. package/dist/exports.js +257 -0
  78. package/dist/exports.js.map +1 -0
  79. package/dist/git.d.ts +8 -0
  80. package/dist/git.d.ts.map +1 -0
  81. package/dist/git.js +86 -0
  82. package/dist/git.js.map +1 -0
  83. package/dist/icons.d.ts +61 -0
  84. package/dist/icons.d.ts.map +1 -0
  85. package/dist/icons.js +244 -0
  86. package/dist/icons.js.map +1 -0
  87. package/dist/index.d.ts +25 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +24 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/inspector.d.ts +31 -0
  92. package/dist/inspector.d.ts.map +1 -0
  93. package/dist/inspector.js +1305 -0
  94. package/dist/inspector.js.map +1 -0
  95. package/dist/json-edit.d.ts +16 -0
  96. package/dist/json-edit.d.ts.map +1 -0
  97. package/dist/json-edit.js +123 -0
  98. package/dist/json-edit.js.map +1 -0
  99. package/dist/layouts.d.ts +17 -0
  100. package/dist/layouts.d.ts.map +1 -0
  101. package/dist/layouts.js +39 -0
  102. package/dist/layouts.js.map +1 -0
  103. package/dist/messages/en.d.ts +357 -0
  104. package/dist/messages/en.d.ts.map +1 -0
  105. package/dist/messages/en.js +364 -0
  106. package/dist/messages/en.js.map +1 -0
  107. package/dist/messages/es.d.ts +3 -0
  108. package/dist/messages/es.d.ts.map +1 -0
  109. package/dist/messages/es.js +337 -0
  110. package/dist/messages/es.js.map +1 -0
  111. package/dist/messages/index.d.ts +315 -0
  112. package/dist/messages/index.d.ts.map +1 -0
  113. package/dist/messages/index.js +12 -0
  114. package/dist/messages/index.js.map +1 -0
  115. package/dist/messages/keys.d.ts +13 -0
  116. package/dist/messages/keys.d.ts.map +1 -0
  117. package/dist/messages/keys.js +150 -0
  118. package/dist/messages/keys.js.map +1 -0
  119. package/dist/messages/review.d.ts +11 -0
  120. package/dist/messages/review.d.ts.map +1 -0
  121. package/dist/messages/review.js +25 -0
  122. package/dist/messages/review.js.map +1 -0
  123. package/dist/messages/services.d.ts +711 -0
  124. package/dist/messages/services.d.ts.map +1 -0
  125. package/dist/messages/services.js +722 -0
  126. package/dist/messages/services.js.map +1 -0
  127. package/dist/node.d.ts +21 -0
  128. package/dist/node.d.ts.map +1 -0
  129. package/dist/node.js +34 -0
  130. package/dist/node.js.map +1 -0
  131. package/dist/projects.d.ts +171 -0
  132. package/dist/projects.d.ts.map +1 -0
  133. package/dist/projects.js +446 -0
  134. package/dist/projects.js.map +1 -0
  135. package/dist/render.d.ts +58 -0
  136. package/dist/render.d.ts.map +1 -0
  137. package/dist/render.js +71 -0
  138. package/dist/render.js.map +1 -0
  139. package/dist/review.d.ts +50 -0
  140. package/dist/review.d.ts.map +1 -0
  141. package/dist/review.js +232 -0
  142. package/dist/review.js.map +1 -0
  143. package/dist/sequence.d.ts +55 -0
  144. package/dist/sequence.d.ts.map +1 -0
  145. package/dist/sequence.js +593 -0
  146. package/dist/sequence.js.map +1 -0
  147. package/dist/services/actions.d.ts +18 -0
  148. package/dist/services/actions.d.ts.map +1 -0
  149. package/dist/services/actions.js +331 -0
  150. package/dist/services/actions.js.map +1 -0
  151. package/dist/services/completion.d.ts +26 -0
  152. package/dist/services/completion.d.ts.map +1 -0
  153. package/dist/services/completion.js +733 -0
  154. package/dist/services/completion.js.map +1 -0
  155. package/dist/services/docs.d.ts +12 -0
  156. package/dist/services/docs.d.ts.map +1 -0
  157. package/dist/services/docs.js +14 -0
  158. package/dist/services/docs.js.map +1 -0
  159. package/dist/services/entities.d.ts +28 -0
  160. package/dist/services/entities.d.ts.map +1 -0
  161. package/dist/services/entities.js +132 -0
  162. package/dist/services/entities.js.map +1 -0
  163. package/dist/services/format.d.ts +7 -0
  164. package/dist/services/format.d.ts.map +1 -0
  165. package/dist/services/format.js +26 -0
  166. package/dist/services/format.js.map +1 -0
  167. package/dist/services/hover.d.ts +15 -0
  168. package/dist/services/hover.d.ts.map +1 -0
  169. package/dist/services/hover.js +340 -0
  170. package/dist/services/hover.js.map +1 -0
  171. package/dist/services/navigation.d.ts +56 -0
  172. package/dist/services/navigation.d.ts.map +1 -0
  173. package/dist/services/navigation.js +379 -0
  174. package/dist/services/navigation.js.map +1 -0
  175. package/dist/services/profiles.d.ts +21 -0
  176. package/dist/services/profiles.d.ts.map +1 -0
  177. package/dist/services/profiles.js +145 -0
  178. package/dist/services/profiles.js.map +1 -0
  179. package/dist/services/stories.d.ts +43 -0
  180. package/dist/services/stories.d.ts.map +1 -0
  181. package/dist/services/stories.js +302 -0
  182. package/dist/services/stories.js.map +1 -0
  183. package/dist/services/tokens.d.ts +13 -0
  184. package/dist/services/tokens.d.ts.map +1 -0
  185. package/dist/services/tokens.js +127 -0
  186. package/dist/services/tokens.js.map +1 -0
  187. package/dist/session.d.ts +188 -0
  188. package/dist/session.d.ts.map +1 -0
  189. package/dist/session.js +1815 -0
  190. package/dist/session.js.map +1 -0
  191. package/dist/story.d.ts +36 -0
  192. package/dist/story.d.ts.map +1 -0
  193. package/dist/story.js +95 -0
  194. package/dist/story.js.map +1 -0
  195. package/dist/syntax.d.ts +45 -0
  196. package/dist/syntax.d.ts.map +1 -0
  197. package/dist/syntax.js +162 -0
  198. package/dist/syntax.js.map +1 -0
  199. package/dist/targets.d.ts +33 -0
  200. package/dist/targets.d.ts.map +1 -0
  201. package/dist/targets.js +69 -0
  202. package/dist/targets.js.map +1 -0
  203. package/dist/text-places.d.ts +20 -0
  204. package/dist/text-places.d.ts.map +1 -0
  205. package/dist/text-places.js +308 -0
  206. package/dist/text-places.js.map +1 -0
  207. package/dist/themes.d.ts +34 -0
  208. package/dist/themes.d.ts.map +1 -0
  209. package/dist/themes.js +190 -0
  210. package/dist/themes.js.map +1 -0
  211. package/package.json +57 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Architecture Studio contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,39 @@
1
- # Temporary Holding Version
1
+ # @meltemi/diagrams-editor
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Host-neutral editor services: diagnostics, completion, hover, definitions, references, rename,
4
+ formatting, quick fixes, symbols and semantic tokens; project sessions; the canvas session and its
5
+ protocol; exports and catalogs (`./node`). The VS Code extension and the playground are built on
6
+ it.
7
+
8
+ It is part of [Meltemi Diagrams](https://github.com/askenaz-dev/meltemi-diagrams#readme), diagrams as code with a canvas, motion and
9
+ exports. Every package of the product has the same version.
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ npm install @meltemi/diagrams-editor
15
+ ```
16
+
17
+ Node 22.12.0 or later. The package is an ES module with type declarations.
18
+
19
+ ## Use
20
+
21
+ ```js
22
+ import { ProjectSessions } from "@meltemi/diagrams-editor/node";
23
+
24
+ const sessions = new ProjectSessions({ toolVersion: "1.0.0" });
25
+ const analysis = sessions.analyze("/work/shop/diagrams/overview.meltemi");
26
+ console.log(
27
+ analysis.diagnostics,
28
+ analysis.diagrams.map((d) => d.id),
29
+ );
30
+ ```
31
+
32
+ ## Documentation
33
+
34
+ - [Editor guide](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/docs/editor.md)
35
+ - [All documentation](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/docs/README.md)
36
+
37
+ ## Licence
38
+
39
+ MIT. Third-party components and their licences are listed in [THIRD_PARTY_LICENSES.md](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/THIRD_PARTY_LICENSES.md).
@@ -0,0 +1,70 @@
1
+ import { type Library } from "@meltemi/diagrams-assets";
2
+ import type { IconRegistry } from "@meltemi/diagrams-assets";
3
+ import { type Diagnostic } from "@meltemi/diagrams-language";
4
+ import { type LayoutOptions, type LayoutResult } from "@meltemi/diagrams-layout";
5
+ import { type Compilation, type FlowDiagram, type LayoutMode, type ThemeDefinition } from "@meltemi/diagrams-model";
6
+ import type { FontProvider } from "@meltemi/diagrams-render";
7
+ /** One flow or free diagram of an analysed document. */
8
+ export interface DiagramView {
9
+ readonly id: string;
10
+ readonly title: string | null;
11
+ readonly mode: LayoutMode;
12
+ readonly diagram: FlowDiagram;
13
+ /** The layout with the document's options; null when the diagram has compile errors. */
14
+ readonly layout: LayoutResult | null;
15
+ }
16
+ /** Everything the services and the canvas need about one version of a document. */
17
+ export interface DocumentAnalysis {
18
+ readonly text: string;
19
+ readonly revision: number;
20
+ readonly compilation: Compilation;
21
+ /** Compile, module, project and layout diagnostics, deduplicated and sorted. */
22
+ readonly diagnostics: readonly Diagnostic[];
23
+ readonly diagrams: readonly DiagramView[];
24
+ readonly layoutOptions: LayoutOptions;
25
+ /** Themes in scope for the document: its own and the imported ones. */
26
+ readonly themes: readonly ThemeDefinition[];
27
+ readonly icons: IconRegistry | undefined;
28
+ /** The element libraries the document can create from: built-in, project and plugin ones. */
29
+ readonly libraries: readonly Library[];
30
+ /** Embeds fonts in rendered SVG; the same library that measures text. */
31
+ readonly fonts: FontProvider | undefined;
32
+ readonly formatOptions: {
33
+ readonly indent: number | "tab";
34
+ };
35
+ /** Image files of the project, relative to the document, for completion. */
36
+ readonly imageFiles: (() => readonly string[]) | undefined;
37
+ /** Lays out a diagram of another file of the project, for stories that show it. */
38
+ readonly importedView: ImportedViews | undefined;
39
+ }
40
+ /** A diagram of another file and its layout with that file's themes and assets. */
41
+ export type ImportedViews = (file: string, diagram: string) => {
42
+ readonly diagram: FlowDiagram;
43
+ readonly layout: LayoutResult;
44
+ } | undefined;
45
+ export interface AnalysisInput {
46
+ readonly text: string;
47
+ readonly revision?: number;
48
+ /** The compilation of `text`, for example inside a project; compiled alone by default. */
49
+ readonly compilation?: Compilation;
50
+ /** Diagnostics of the compilation and its project; the compilation's own by default. */
51
+ readonly diagnostics?: readonly Diagnostic[];
52
+ /** Layout options; the ELK engine is used when no engine is given. */
53
+ readonly layout?: LayoutOptions;
54
+ readonly icons?: IconRegistry;
55
+ /** The libraries, or how to build them: built when first asked for, not on every analysis. */
56
+ readonly libraries?: readonly Library[] | (() => readonly Library[]);
57
+ readonly fonts?: FontProvider;
58
+ readonly formatOptions?: {
59
+ readonly indent: number | "tab";
60
+ };
61
+ /** Lists the project's image files relative to the document. */
62
+ readonly imageFiles?: () => readonly string[];
63
+ /** Lays out diagrams of other files of the project, for stories. */
64
+ readonly importedView?: ImportedViews;
65
+ }
66
+ /** Compiles (unless given a compilation), lays out every diagram and merges diagnostics. */
67
+ export declare function analyzeDocument(input: AnalysisInput): DocumentAnalysis;
68
+ /** The view of a diagram by id. */
69
+ export declare function diagramView(analysis: DocumentAnalysis, id: string): DiagramView | undefined;
70
+ //# sourceMappingURL=analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../src/analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import {} from "@meltemi/diagrams-assets";
2
+ import { sortDiagnostics } from "@meltemi/diagrams-language";
3
+ import { layoutDiagram } from "@meltemi/diagrams-layout";
4
+ import { createElkEngine } from "@meltemi/diagrams-layout-elk";
5
+ import { compile, } from "@meltemi/diagrams-model";
6
+ let defaultEngine;
7
+ const key = (d) => `${d.code}@${d.range.start.offset}:${d.range.end.offset}`;
8
+ /** Compiles (unless given a compilation), lays out every diagram and merges diagnostics. */
9
+ export function analyzeDocument(input) {
10
+ const compilation = input.compilation ?? compile(input.text);
11
+ const layoutOptions = {
12
+ ...input.layout,
13
+ engine: input.layout?.engine ?? (defaultEngine ??= createElkEngine()),
14
+ };
15
+ const diagnostics = [...(input.diagnostics ?? compilation.diagnostics)];
16
+ const seen = new Set(diagnostics.map(key));
17
+ const diagrams = compilation.document.diagrams.map((diagram) => {
18
+ const layout = diagram.hasErrors ? null : layoutDiagram(compilation, diagram, layoutOptions);
19
+ for (const d of layout?.diagnostics ?? []) {
20
+ if (seen.has(key(d)))
21
+ continue;
22
+ seen.add(key(d));
23
+ diagnostics.push(d);
24
+ }
25
+ return {
26
+ id: diagram.id,
27
+ title: diagram.properties.title,
28
+ mode: diagram.properties.layout,
29
+ diagram,
30
+ layout,
31
+ };
32
+ });
33
+ const given = input.libraries ?? [];
34
+ let libraries = typeof given === "function" ? undefined : given;
35
+ return {
36
+ text: input.text,
37
+ revision: input.revision ?? 0,
38
+ compilation,
39
+ diagnostics: sortDiagnostics(diagnostics),
40
+ diagrams,
41
+ layoutOptions,
42
+ themes: layoutOptions.themes ?? compilation.document.themes,
43
+ icons: input.icons,
44
+ // Libraries read packs' categories (Tabler's are a 2 MB file): only the panel needs them.
45
+ get libraries() {
46
+ libraries ??= given();
47
+ return libraries;
48
+ },
49
+ fonts: input.fonts,
50
+ formatOptions: input.formatOptions ?? { indent: 2 },
51
+ imageFiles: input.imageFiles,
52
+ importedView: input.importedView,
53
+ };
54
+ }
55
+ /** The view of a diagram by id. */
56
+ export function diagramView(analysis, id) {
57
+ return analysis.diagrams.find((d) => d.id === id);
58
+ }
59
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","sourceRoot":"","sources":["../src/analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import type { EditOperation } from "@meltemi/diagrams-edit";
2
+ import { type Point } from "@meltemi/diagrams-model";
3
+ import { type DiagramView, type DocumentAnalysis } from "./analysis.js";
4
+ /**
5
+ * The interior origin of a group of a free diagram, which its children's places are measured
6
+ * from: the layout's origin of its children, or for an empty group its padding and its own header
7
+ * (the padding alone when it is untitled). (0, 0) for the top level and for flow diagrams, whose
8
+ * places are in diagram coordinates.
9
+ */
10
+ export declare function interiorOf(view: DiagramView, group: string | null): Point;
11
+ /**
12
+ * The `convertToContainer` operation for a flow node or a free box, with the elements drawn
13
+ * stacked on it as its children: siblings declared after it on its layer whose box lies inside
14
+ * its own (the composition checks' stack rule). Free children are placed in the interior the
15
+ * group will have; the group keeps the size it is drawn with. Undefined when it is not drawn.
16
+ */
17
+ export declare function containerOperation(view: DiagramView, id: string): {
18
+ readonly operation: EditOperation & {
19
+ kind: "convertToContainer";
20
+ };
21
+ readonly children: readonly string[];
22
+ } | undefined;
23
+ /**
24
+ * The first moved element that lands stacked on a node or box of its layer, which is no
25
+ * container: the hint that converting the box would carry the element with it.
26
+ */
27
+ export declare function stackedAfterMove(view: DiagramView, ids: readonly string[], delta: Point): {
28
+ readonly inner: string;
29
+ readonly outer: string;
30
+ } | undefined;
31
+ /**
32
+ * The operations that keep the groups an element leaves or enters drawn where they are, for a
33
+ * move of `leaving` into `target` (null: the top level), in one edit with it:
34
+ *
35
+ * - a group left with no children that lacks `place` or `size` gets the place and the size it is
36
+ * drawn with, as an empty group needs both;
37
+ * - in a free diagram, a placed group without `size` that is left or entered gets the size it is
38
+ * drawn with, so that its interior, where its children are placed, does not move: the element
39
+ * lands where it was dropped and the other children stay.
40
+ */
41
+ export declare function steadyGroups(view: DiagramView, leaving: readonly string[], target: string | null): EditOperation[];
42
+ /**
43
+ * The `arrange` operation that writes what ELK draws: the unplaced elements around the placed
44
+ * ones (`unplaced`, laid out as `assisted`), or every element anew (`all`, laid out as `auto`),
45
+ * with the bends of the drawn connectors. Undefined when the diagram cannot be arranged.
46
+ */
47
+ export declare function arrangeOperation(analysis: DocumentAnalysis, diagramId: string, scope: "unplaced" | "all"): EditOperation | undefined;
48
+ /**
49
+ * The `arrange` operation of `arrangeOperation`, or the first problem that keeps the diagram from
50
+ * being arranged: an error of the text or of the layout, as written in its diagnostic.
51
+ */
52
+ export declare function arrangeAttempt(analysis: DocumentAnalysis, diagramId: string, scope: "unplaced" | "all"): {
53
+ readonly operation?: EditOperation;
54
+ readonly problem?: string;
55
+ };
56
+ /**
57
+ * The `arrange` operation that writes the positions drawn now, so that an `auto` diagram
58
+ * becomes `assisted` without any box moving: the first step of a canvas gesture in `auto`.
59
+ */
60
+ export declare function materializeOperation(view: DiagramView): EditOperation | undefined;
61
+ /** A top-level id not used in the file: `base`, then `base_2`, `base_3`… */
62
+ export declare function freeDiagramId(analysis: DocumentAnalysis, base: string): string;
63
+ /**
64
+ * The `convertToFree` operation that copies a flow diagram, as drawn now, into a new free diagram
65
+ * named `id` (`<diagram>_free` by default), or undefined when the diagram is not drawn.
66
+ */
67
+ export declare function convertOperation(analysis: DocumentAnalysis, diagramId: string, id?: string): (EditOperation & {
68
+ kind: "convertToFree";
69
+ id: string;
70
+ }) | undefined;
71
+ //# sourceMappingURL=arrange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrange.d.ts","sourceRoot":"","sources":["../src/arrange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAU5D,OAAO,EAA8C,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAe,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAErF;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,CAczE;AAKD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,WAAW,EACjB,EAAE,EAAE,MAAM,GAER;IACE,QAAQ,CAAC,SAAS,EAAE,aAAa,GAAG;QAAE,IAAI,EAAE,oBAAoB,CAAA;KAAE,CAAC;IACnE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,GACD,SAAS,CA2CZ;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,KAAK,EAAE,KAAK,GACX;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAuBhE;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,aAAa,EAAE,CA4CjB;AAgCD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,UAAU,GAAG,KAAK,GACxB,aAAa,GAAG,SAAS,CAE3B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,UAAU,GAAG,KAAK,GACxB;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAkCnE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,aAAa,GAAG,SAAS,CAUjF;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAU9E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,MAAM,EACjB,EAAE,CAAC,EAAE,MAAM,GACV,CAAC,aAAa,GAAG;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,CAiBrE"}
@@ -0,0 +1,286 @@
1
+ import { groupHeaderOf, layoutDiagram, stacked, StyleResolver, typeScale, } from "@meltemi/diagrams-layout";
2
+ import { MAIN_LAYER } from "@meltemi/diagrams-model";
3
+ import { diagramView } from "./analysis.js";
4
+ /**
5
+ * The interior origin of a group of a free diagram, which its children's places are measured
6
+ * from: the layout's origin of its children, or for an empty group its padding and its own header
7
+ * (the padding alone when it is untitled). (0, 0) for the top level and for flow diagrams, whose
8
+ * places are in diagram coordinates.
9
+ */
10
+ export function interiorOf(view, group) {
11
+ const layout = view.layout;
12
+ if (group === null || view.diagram.type !== "free" || !layout)
13
+ return { x: 0, y: 0 };
14
+ for (const element of view.diagram.elements) {
15
+ if (element.groupPath[element.groupPath.length - 1] !== group)
16
+ continue;
17
+ const origin = layout.origins?.get(element.id);
18
+ if (origin)
19
+ return origin;
20
+ }
21
+ const element = view.diagram.elementsById.get(group);
22
+ const box = layout.boxes?.get(group);
23
+ const theme = layout.theme;
24
+ if (!element || !box || !theme)
25
+ return { x: 0, y: 0 };
26
+ const style = new StyleResolver(theme, view.diagram).element(element);
27
+ return { x: box.x + theme.groupPadding, y: box.y + groupHeaderOf(element, style, theme) };
28
+ }
29
+ const parentId = (e) => e.groupPath[e.groupPath.length - 1] ?? null;
30
+ const layerOf = (e) => e.layer ?? MAIN_LAYER;
31
+ /**
32
+ * The `convertToContainer` operation for a flow node or a free box, with the elements drawn
33
+ * stacked on it as its children: siblings declared after it on its layer whose box lies inside
34
+ * its own (the composition checks' stack rule). Free children are placed in the interior the
35
+ * group will have; the group keeps the size it is drawn with. Undefined when it is not drawn.
36
+ */
37
+ export function containerOperation(view, id) {
38
+ const diagram = view.diagram;
39
+ const layout = view.layout;
40
+ const element = diagram.elementsById.get(id);
41
+ const box = layout?.boxes?.get(id);
42
+ const theme = layout?.theme;
43
+ if (!element || !box || !theme || !layout?.boxes)
44
+ return undefined;
45
+ const boxes = layout.boxes;
46
+ const after = diagram.elements.slice(diagram.elements.indexOf(element) + 1);
47
+ const children = after.filter((e) => {
48
+ const inner = boxes.get(e.id);
49
+ return (inner !== undefined &&
50
+ parentId(e) === parentId(element) &&
51
+ layerOf(e) === layerOf(element) &&
52
+ stacked(box, inner));
53
+ });
54
+ const free = diagram.type === "free";
55
+ // The interior of the group the box becomes: below its title band when it keeps a title.
56
+ const style = new StyleResolver(theme, diagram).element(element);
57
+ const origin = { x: box.x + theme.groupPadding, y: box.y + groupHeaderOf(element, style, theme) };
58
+ return {
59
+ operation: {
60
+ kind: "convertToContainer",
61
+ diagram: view.id,
62
+ element: id,
63
+ children: children.map((child) => {
64
+ const inner = boxes.get(child.id);
65
+ return free
66
+ ? {
67
+ id: child.id,
68
+ at: {
69
+ x: Math.round(inner.x + inner.width / 2 - origin.x),
70
+ y: Math.round(inner.y + inner.height / 2 - origin.y),
71
+ },
72
+ }
73
+ : { id: child.id };
74
+ }),
75
+ size: { width: Math.round(box.width), height: Math.round(box.height) },
76
+ },
77
+ children: children.map((c) => c.id),
78
+ };
79
+ }
80
+ /**
81
+ * The first moved element that lands stacked on a node or box of its layer, which is no
82
+ * container: the hint that converting the box would carry the element with it.
83
+ */
84
+ export function stackedAfterMove(view, ids, delta) {
85
+ const diagram = view.diagram;
86
+ const boxes = view.layout?.boxes;
87
+ if (!boxes || (diagram.type !== "flow" && diagram.type !== "free"))
88
+ return undefined;
89
+ const moved = new Set(ids);
90
+ const moves = (e) => moved.has(e.id) || e.groupPath.some((g) => moved.has(g));
91
+ for (const id of ids) {
92
+ const element = diagram.elementsById.get(id);
93
+ const box = boxes.get(id);
94
+ if (!element || !box)
95
+ continue;
96
+ const landed = { ...box, x: box.x + delta.x, y: box.y + delta.y };
97
+ // The smallest box that holds it, which is the one it is seen on.
98
+ let outer;
99
+ for (const other of diagram.elements) {
100
+ if (other.kind === "group" || moves(other) || layerOf(other) !== layerOf(element))
101
+ continue;
102
+ const holder = boxes.get(other.id);
103
+ if (!holder || !stacked(holder, landed))
104
+ continue;
105
+ const area = holder.width * holder.height;
106
+ if (!outer || area < outer.area)
107
+ outer = { id: other.id, area };
108
+ }
109
+ if (outer)
110
+ return { inner: id, outer: outer.id };
111
+ }
112
+ return undefined;
113
+ }
114
+ /**
115
+ * The operations that keep the groups an element leaves or enters drawn where they are, for a
116
+ * move of `leaving` into `target` (null: the top level), in one edit with it:
117
+ *
118
+ * - a group left with no children that lacks `place` or `size` gets the place and the size it is
119
+ * drawn with, as an empty group needs both;
120
+ * - in a free diagram, a placed group without `size` that is left or entered gets the size it is
121
+ * drawn with, so that its interior, where its children are placed, does not move: the element
122
+ * lands where it was dropped and the other children stay.
123
+ */
124
+ export function steadyGroups(view, leaving, target) {
125
+ const diagram = view.diagram;
126
+ const boxes = view.layout?.boxes;
127
+ if (!boxes || leaving.length === 0)
128
+ return [];
129
+ const has = (statement, id) => diagram.placement.some((p) => p.statement === statement && p.target === id);
130
+ const parentOf = (id) => {
131
+ const path = diagram.elementsById.get(id)?.groupPath ?? [];
132
+ return path[path.length - 1] ?? null;
133
+ };
134
+ const sources = new Set(leaving.map(parentOf).filter((g) => g !== null && g !== target));
135
+ const ops = [];
136
+ for (const group of target === null ? sources : new Set([...sources, target])) {
137
+ const box = boxes.get(group);
138
+ const placed = has("place", group);
139
+ if (!box || (placed && has("size", group)))
140
+ continue;
141
+ const emptied = sources.has(group) &&
142
+ diagram.elements.every((e) => e.groupPath[e.groupPath.length - 1] !== group || leaving.includes(e.id));
143
+ if (!emptied && !(placed && diagram.type === "free"))
144
+ continue;
145
+ if (!placed) {
146
+ // Relative to the interior of its own group in free diagrams.
147
+ const origin = diagram.type === "free" ? view.layout?.origins?.get(group) : undefined;
148
+ ops.push({
149
+ kind: "setPosition",
150
+ diagram: view.id,
151
+ element: group,
152
+ x: Math.round(box.x + box.width / 2 - (origin?.x ?? 0)),
153
+ y: Math.round(box.y + box.height / 2 - (origin?.y ?? 0)),
154
+ });
155
+ }
156
+ ops.push({
157
+ kind: "setSize",
158
+ diagram: view.id,
159
+ element: group,
160
+ width: Math.round(box.width),
161
+ height: Math.round(box.height),
162
+ });
163
+ }
164
+ return ops;
165
+ }
166
+ /**
167
+ * Centres of elements and sizes of groups from laid-out boxes. In free diagrams the centres of
168
+ * group children are written relative to their group's interior (`origins`), and groups get a
169
+ * place and a size.
170
+ */
171
+ function fromBoxes(diagram, boxes, origins) {
172
+ const positions = new Map();
173
+ const sizes = new Map();
174
+ const free = diagram.type === "free";
175
+ for (const element of diagram.elements) {
176
+ const box = boxes.get(element.id);
177
+ if (!box)
178
+ continue;
179
+ const origin = free ? origins?.get(element.id) : undefined;
180
+ positions.set(element.id, {
181
+ x: box.x + box.width / 2 - (origin?.x ?? 0),
182
+ y: box.y + box.height / 2 - (origin?.y ?? 0),
183
+ });
184
+ if (element.kind === "group")
185
+ sizes.set(element.id, { width: box.width, height: box.height });
186
+ }
187
+ return free ? { positions, sizes, writeGroups: true } : { positions, sizes };
188
+ }
189
+ /**
190
+ * The `arrange` operation that writes what ELK draws: the unplaced elements around the placed
191
+ * ones (`unplaced`, laid out as `assisted`), or every element anew (`all`, laid out as `auto`),
192
+ * with the bends of the drawn connectors. Undefined when the diagram cannot be arranged.
193
+ */
194
+ export function arrangeOperation(analysis, diagramId, scope) {
195
+ return arrangeAttempt(analysis, diagramId, scope).operation;
196
+ }
197
+ /**
198
+ * The `arrange` operation of `arrangeOperation`, or the first problem that keeps the diagram from
199
+ * being arranged: an error of the text or of the layout, as written in its diagnostic.
200
+ */
201
+ export function arrangeAttempt(analysis, diagramId, scope) {
202
+ const view = diagramView(analysis, diagramId);
203
+ if (!view || view.diagram.type === "sequence")
204
+ return {};
205
+ if (view.diagram.hasErrors) {
206
+ // The first error inside the diagram, else the first of the file.
207
+ const range = view.diagram.range;
208
+ const errors = analysis.compilation.diagnostics.filter((d) => d.severity === "error");
209
+ const error = errors.find((d) => d.range.start.offset >= range.start.offset && d.range.end.offset <= range.end.offset) ?? errors[0];
210
+ return error ? { problem: error.message } : {};
211
+ }
212
+ const result = layoutDiagram(analysis.compilation, view.diagram, {
213
+ ...analysis.layoutOptions,
214
+ layout: scope === "all" ? "auto" : "assisted",
215
+ });
216
+ if (!result.scene || !result.boxes) {
217
+ const error = result.diagnostics.find((d) => d.severity === "error");
218
+ return error ? { problem: error.message } : {};
219
+ }
220
+ const routes = scope === "all" && result.connectors
221
+ ? new Map([...result.connectors].map(([key, c]) => [key, c.points]))
222
+ : undefined;
223
+ return {
224
+ operation: {
225
+ kind: "arrange",
226
+ diagram: diagramId,
227
+ ...fromBoxes(view.diagram, result.boxes, result.origins),
228
+ ...(routes ? { routes } : {}),
229
+ scope,
230
+ },
231
+ };
232
+ }
233
+ /**
234
+ * The `arrange` operation that writes the positions drawn now, so that an `auto` diagram
235
+ * becomes `assisted` without any box moving: the first step of a canvas gesture in `auto`.
236
+ */
237
+ export function materializeOperation(view) {
238
+ if (view.mode !== "auto" || !view.layout?.boxes || view.diagram.type === "sequence") {
239
+ return undefined;
240
+ }
241
+ return {
242
+ kind: "arrange",
243
+ diagram: view.id,
244
+ ...fromBoxes(view.diagram, view.layout.boxes, view.layout.origins),
245
+ scope: "all",
246
+ };
247
+ }
248
+ /** A top-level id not used in the file: `base`, then `base_2`, `base_3`… */
249
+ export function freeDiagramId(analysis, base) {
250
+ const document = analysis.compilation.document;
251
+ const used = new Set([
252
+ ...document.diagrams.map((x) => x.id),
253
+ ...document.themes.map((t) => t.id),
254
+ ...document.unsupported.flatMap((u) => (u.id === null ? [] : [u.id])),
255
+ ...document.imports.flatMap((i) => i.bindings.map((b) => b.name)),
256
+ ]);
257
+ if (!used.has(base))
258
+ return base;
259
+ for (let n = 2;; n++)
260
+ if (!used.has(`${base}_${n}`))
261
+ return `${base}_${n}`;
262
+ }
263
+ /**
264
+ * The `convertToFree` operation that copies a flow diagram, as drawn now, into a new free diagram
265
+ * named `id` (`<diagram>_free` by default), or undefined when the diagram is not drawn.
266
+ */
267
+ export function convertOperation(analysis, diagramId, id) {
268
+ const view = diagramView(analysis, diagramId);
269
+ const layout = view?.layout;
270
+ if (!view || view.diagram.type !== "flow" || !layout?.boxes || !layout.theme)
271
+ return undefined;
272
+ const scale = typeScale(layout.theme);
273
+ return {
274
+ kind: "convertToFree",
275
+ diagram: diagramId,
276
+ id: id ?? freeDiagramId(analysis, `${diagramId}_free`),
277
+ boxes: layout.boxes,
278
+ metrics: {
279
+ groupPadding: layout.theme.groupPadding,
280
+ groupHeader: layout.theme.groupHeader,
281
+ noteSize: scale.note,
282
+ tagSize: scale.tag,
283
+ },
284
+ };
285
+ }
286
+ //# sourceMappingURL=arrange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrange.js","sourceRoot":"","sources":["../src/arrange.ts"],"names":[],"mappings":"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"}