@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
@@ -0,0 +1,61 @@
1
+ import { type ApplyResult, type AssistOperation, type AssistRequest, type Disclosure, type ModelAdapter, type Proposal, type SharedFile } from "@meltemi/diagrams-assist";
2
+ import { type Locale } from "@meltemi/diagrams-i18n";
3
+ import type { Diagnostic } from "@meltemi/diagrams-language";
4
+ import { type Document } from "@meltemi/diagrams-model";
5
+ import { type Workspace } from "@meltemi/diagrams-project";
6
+ import type { Review } from "./review.js";
7
+ export interface AssistInput {
8
+ readonly workspace: Workspace;
9
+ readonly operation: AssistOperation;
10
+ /** The file to change or create, as a project path. */
11
+ readonly path: string;
12
+ readonly instruction: string;
13
+ readonly profile?: AssistRequest["profile"];
14
+ readonly block?: string;
15
+ /**
16
+ * The language of the words a proposal writes into the file, as the files a command writes:
17
+ * the command line's `--lang`; the project's `locale`, else English, when absent.
18
+ */
19
+ readonly locale?: Locale;
20
+ }
21
+ /** A request ready to send, and what it will send. */
22
+ export interface PreparedAssist {
23
+ readonly request: AssistRequest;
24
+ readonly disclosure: (adapter: ModelAdapter) => Disclosure;
25
+ /** Diagnostics of a text of the file in its project. */
26
+ readonly check: (text: string) => readonly Diagnostic[];
27
+ /** The document of a text of the file in its project. */
28
+ readonly documentOf: (text: string) => Document;
29
+ /** The language of the words a proposal writes into the file. */
30
+ readonly locale: Locale;
31
+ }
32
+ /** The diagnostics of a text of a file within its project. */
33
+ export declare function checkInProject(workspace: Workspace, path: string): (text: string) => Diagnostic[];
34
+ /** The document of a text of a file within its project. */
35
+ export declare function documentInProject(workspace: Workspace, path: string): (text: string) => Document;
36
+ /** Prepares a request on a file of a project: the text, the files shared, the check. */
37
+ export declare function prepareAssist(input: AssistInput): PreparedAssist;
38
+ /** Sends a prepared request and returns the proposal for the file at `path`. */
39
+ export declare function runAssist(prepared: PreparedAssist, adapter: ModelAdapter, path: string, signal?: AbortSignal): Promise<Proposal & {
40
+ readonly problems: readonly string[];
41
+ }>;
42
+ /** Applies accepted items of a proposal to the file's current text in its project. */
43
+ export declare function applyAssist(workspace: Workspace, proposal: Proposal, accepted: readonly number[]): ApplyResult;
44
+ /** An explanation ready to send: the changes, the files shared, and what it will send. */
45
+ export interface PreparedExplain {
46
+ readonly changes: string;
47
+ readonly shared: readonly SharedFile[];
48
+ readonly disclosure: (adapter: ModelAdapter) => Disclosure;
49
+ }
50
+ /**
51
+ * Prepares the explanation of a review: its changes by file, with the changed files as they are
52
+ * after, read with `textOf` from their review paths. The changes are written for the model, in
53
+ * English; what the disclosure lists is in the interface language.
54
+ */
55
+ export declare function prepareExplain(review: Review, textOf: (path: string) => string | undefined): PreparedExplain;
56
+ /** Asks the model to explain a prepared review, in Markdown. */
57
+ export declare function runExplain(prepared: PreparedExplain, adapter: ModelAdapter, signal?: AbortSignal): Promise<{
58
+ summary: string;
59
+ explanation: string;
60
+ }>;
61
+ //# sourceMappingURL=assist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assist.d.ts","sourceRoot":"","sources":["../src/assist.ts"],"names":[],"mappings":"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"}
package/dist/assist.js ADDED
@@ -0,0 +1,162 @@
1
+ import { applyProposal, assistMessages, disclosure, explainChanges, propose, } from "@meltemi/diagrams-assist";
2
+ import { DEFAULT_LOCALE } from "@meltemi/diagrams-i18n";
3
+ import { compile, describeChange } from "@meltemi/diagrams-model";
4
+ import { relativePath } from "@meltemi/diagrams-project";
5
+ /** Most project files a request shares for context, and most bytes. */
6
+ const MAX_SHARED_FILES = 12;
7
+ const MAX_SHARED_BYTES = 200_000;
8
+ /** Compiles a text of a file within its project: as an overlay, then the editor's overlay again. */
9
+ function inProject(workspace, path, read) {
10
+ return (text) => {
11
+ const previous = workspace.overlay(path);
12
+ workspace.setOverlay(path, text);
13
+ try {
14
+ return read(workspace.file(path), text);
15
+ }
16
+ finally {
17
+ workspace.setOverlay(path, previous ?? null);
18
+ }
19
+ };
20
+ }
21
+ /** The diagnostics of a text of a file within its project. */
22
+ export function checkInProject(workspace, path) {
23
+ return inProject(workspace, path, (file, text) => [
24
+ ...(file?.diagnostics ?? compile(text).diagnostics),
25
+ ]);
26
+ }
27
+ /** The document of a text of a file within its project. */
28
+ export function documentInProject(workspace, path) {
29
+ return inProject(workspace, path, (file, text) => (file?.compilation ?? compile(text)).document);
30
+ }
31
+ /**
32
+ * What a request shares besides the file (decision 0029): the files it imports, transitively;
33
+ * for a new file, the project's models and themes, which it may import. Paths are relative to the
34
+ * project, so no local path is sent; the reasons are for the person, in the interface language.
35
+ */
36
+ function sharedFor(input) {
37
+ const { workspace, path } = input;
38
+ const root = workspace.root;
39
+ const reasons = assistMessages().reasons;
40
+ const shared = [];
41
+ let bytes = 0;
42
+ const add = (file, reason) => {
43
+ if (file === path || shared.some((s) => s.path === relativePath(root, file)))
44
+ return;
45
+ const text = workspace.text(file);
46
+ if (text === undefined || shared.length >= MAX_SHARED_FILES)
47
+ return;
48
+ if (bytes + text.length > MAX_SHARED_BYTES)
49
+ return;
50
+ bytes += text.length;
51
+ shared.push({ path: relativePath(root, file), text, reason });
52
+ };
53
+ if (input.operation === "generate" && workspace.text(path) === undefined) {
54
+ const program = workspace.compileProject();
55
+ for (const [file, compiled] of program.files) {
56
+ const document = compiled.compilation.document;
57
+ if (document.models.length > 0)
58
+ add(file, reasons.model);
59
+ else if (document.themes.length > 0)
60
+ add(file, reasons.themes);
61
+ }
62
+ return shared;
63
+ }
64
+ const visit = (file, seen) => {
65
+ const compiled = workspace.file(file);
66
+ for (const imported of compiled?.imports ?? []) {
67
+ if (imported.target === null || seen.has(imported.target))
68
+ continue;
69
+ seen.add(imported.target);
70
+ add(imported.target, file === path ? reasons.importedByIt : reasons.importedByImport);
71
+ visit(imported.target, seen);
72
+ }
73
+ };
74
+ visit(path, new Set([path]));
75
+ return shared;
76
+ }
77
+ /** Prepares a request on a file of a project: the text, the files shared, the check. */
78
+ export function prepareAssist(input) {
79
+ const { workspace, path } = input;
80
+ const request = {
81
+ operation: input.operation,
82
+ path: relativePath(workspace.root, path),
83
+ text: workspace.text(path) ?? "",
84
+ instruction: input.instruction,
85
+ shared: sharedFor(input),
86
+ ...(input.profile ? { profile: input.profile } : {}),
87
+ ...(input.block ? { block: input.block } : {}),
88
+ };
89
+ return {
90
+ request,
91
+ disclosure: (adapter) => disclosure(request, adapter),
92
+ check: checkInProject(workspace, path),
93
+ documentOf: documentInProject(workspace, path),
94
+ locale: input.locale ?? workspace.manifest().manifest?.locale ?? DEFAULT_LOCALE,
95
+ };
96
+ }
97
+ /** Sends a prepared request and returns the proposal for the file at `path`. */
98
+ export async function runAssist(prepared, adapter, path, signal) {
99
+ const proposal = await propose(prepared.request, {
100
+ adapter,
101
+ check: prepared.check,
102
+ documentOf: prepared.documentOf,
103
+ locale: prepared.locale,
104
+ ...(signal ? { signal } : {}),
105
+ });
106
+ // The proposal is kept on this machine, so it names the file where it is.
107
+ return { ...proposal, path };
108
+ }
109
+ /** Applies accepted items of a proposal to the file's current text in its project. */
110
+ export function applyAssist(workspace, proposal, accepted) {
111
+ return applyProposal(proposal, workspace.text(proposal.path) ?? "", accepted, checkInProject(workspace, proposal.path));
112
+ }
113
+ /**
114
+ * Prepares the explanation of a review: its changes by file, with the changed files as they are
115
+ * after, read with `textOf` from their review paths. The changes are written for the model, in
116
+ * English; what the disclosure lists is in the interface language.
117
+ */
118
+ export function prepareExplain(review, textOf) {
119
+ const changes = review.files
120
+ .map((file) => [
121
+ `${file.status} ${file.from ? `${file.from} → ` : ""}${file.path}`,
122
+ ...file.changes.map((c) => ` ${describeChange(c, "en")}${c.scope ? ` (in ${c.scope})` : ""}`),
123
+ ].join("\n"))
124
+ .join("\n");
125
+ const shared = [];
126
+ let bytes = 0;
127
+ for (const file of review.files) {
128
+ if (file.status === "removed")
129
+ continue;
130
+ const text = textOf(file.path);
131
+ if (text === undefined || shared.length >= MAX_SHARED_FILES)
132
+ continue;
133
+ if (bytes + text.length > MAX_SHARED_BYTES)
134
+ continue;
135
+ bytes += text.length;
136
+ shared.push({ path: file.path, text, reason: assistMessages().reasons.changed });
137
+ }
138
+ const size = (text) => new TextEncoder().encode(text).length;
139
+ return {
140
+ changes,
141
+ shared,
142
+ disclosure: (adapter) => {
143
+ const t = assistMessages();
144
+ return {
145
+ provider: adapter.provider,
146
+ model: adapter.model,
147
+ endpoint: adapter.endpoint,
148
+ remote: adapter.remote,
149
+ files: [
150
+ { path: t.disclosure.changes, bytes: size(changes), reason: t.reasons.review },
151
+ ...shared.map((f) => ({ path: f.path, bytes: size(f.text), reason: f.reason })),
152
+ ],
153
+ instruction: 0,
154
+ };
155
+ },
156
+ };
157
+ }
158
+ /** Asks the model to explain a prepared review, in Markdown. */
159
+ export function runExplain(prepared, adapter, signal) {
160
+ return explainChanges(prepared.changes, prepared.shared, adapter, signal);
161
+ }
162
+ //# sourceMappingURL=assist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assist.js","sourceRoot":"","sources":["../src/assist.ts"],"names":[],"mappings":"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"}
package/dist/c4.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ import type { EditOperation } from "@meltemi/diagrams-edit";
2
+ import { type Element, type FlowDiagram, type Relation } from "@meltemi/diagrams-model";
3
+ import type { InspectorField } from "./canvas/protocol.js";
4
+ /** The entities a view may draw and does not: what "Add from the model…" offers. */
5
+ export declare function entityChoices(diagram: FlowDiagram): {
6
+ path: string;
7
+ label: string;
8
+ kind: string;
9
+ }[];
10
+ /** Whether the view's model is in the same document, so that its fields can be written. */
11
+ export declare function modelIsLocal(diagram: FlowDiagram): boolean;
12
+ export type C4Result = {
13
+ readonly ok: true;
14
+ readonly operations: readonly EditOperation[];
15
+ } | {
16
+ readonly ok: false;
17
+ readonly reason: string;
18
+ };
19
+ /** Fields of an element of a C4 view: the local label, then the entity's fields. */
20
+ export declare function c4ElementFields(diagram: FlowDiagram, element: Element): InspectorField[];
21
+ /** Fields of a relation of a C4 view: the local label, the model relation and its sources. */
22
+ export declare function c4RelationFields(diagram: FlowDiagram, relation: Relation): InspectorField[];
23
+ /** Fields of a C4 view: level, scope and model, then the shared diagram properties. */
24
+ export declare function c4DiagramFields(diagram: FlowDiagram): InspectorField[];
25
+ /**
26
+ * The operations that write a field of a C4 view: local labels in the view, entity and relation
27
+ * fields in the model; undefined for the fields every profile shares.
28
+ */
29
+ export declare function c4FieldOperations(diagram: FlowDiagram, id: string, field: string, value: string | number | null): C4Result | undefined;
30
+ //# sourceMappingURL=c4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c4.d.ts","sourceRoot":"","sources":["../src/c4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,oFAAoF;AACpF,wBAAgB,aAAa,CAC3B,OAAO,EAAE,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAQjD;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAE1D;AAED,MAAM,MAAM,QAAQ,GAChB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,aAAa,EAAE,CAAA;CAAE,GACpE;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAUpD,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,cAAc,EAAE,CAqDxF;AAED,8FAA8F;AAC9F,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,cAAc,EAAE,CA8C3F;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,EAAE,CAoBtE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EACpB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAC5B,QAAQ,GAAG,SAAS,CAmDtB"}
package/dist/c4.js ADDED
@@ -0,0 +1,195 @@
1
+ import { C4_LEVELS, allowedEntities, } from "@meltemi/diagrams-model";
2
+ import { messages } from "./messages/index.js";
3
+ /** The entities a view may draw and does not: what "Add from the model…" offers. */
4
+ export function entityChoices(diagram) {
5
+ const c4 = diagram.c4;
6
+ const model = c4?.resolved?.definition;
7
+ if (!c4 || !model)
8
+ return [];
9
+ const allowed = allowedEntities(model, c4.level, c4.scope);
10
+ return model.entities
11
+ .filter((e) => allowed.has(e.path) && !diagram.elementsById.has(e.path))
12
+ .map((e) => ({ path: e.path, label: e.label, kind: e.kind }));
13
+ }
14
+ /** Whether the view's model is in the same document, so that its fields can be written. */
15
+ export function modelIsLocal(diagram) {
16
+ return diagram.c4?.resolved?.file === null;
17
+ }
18
+ /** The kind of an entity in words, lower case: `software system`, `external person`. */
19
+ function entityKind(element, kind, external) {
20
+ const words = messages().c4;
21
+ const kinds = external ? words.externalKinds : words.kinds;
22
+ const known = kind !== undefined && Object.hasOwn(kinds, kind);
23
+ return (known ? kinds[kind] : element.kind).toLowerCase();
24
+ }
25
+ /** Fields of an element of a C4 view: the local label, then the entity's fields. */
26
+ export function c4ElementFields(diagram, element) {
27
+ const model = diagram.c4?.resolved?.definition;
28
+ const entity = model?.entitiesByPath.get(element.id);
29
+ const local = diagram.c4?.labels.find((l) => l.target === element.id);
30
+ const readonly = !modelIsLocal(diagram);
31
+ const words = messages();
32
+ const fields = [
33
+ { name: "id", label: words.c4.fields.entity, type: "text", value: element.id, readonly: true },
34
+ {
35
+ name: "kind",
36
+ label: words.fields.kind,
37
+ type: "text",
38
+ value: entityKind(element, entity?.kind, entity?.external ?? false),
39
+ readonly: true,
40
+ },
41
+ {
42
+ name: "label",
43
+ label: words.c4.fields.localLabel,
44
+ type: "text",
45
+ value: local?.text ?? null,
46
+ placeholder: entity?.label ?? element.label,
47
+ },
48
+ ];
49
+ if (!entity)
50
+ return fields;
51
+ const entityField = (name, label, value, type = "text") => ({
52
+ name: `entity.${name}`,
53
+ label,
54
+ type,
55
+ value,
56
+ ...(readonly ? { readonly: true, placeholder: words.c4.readOnly } : {}),
57
+ });
58
+ fields.push(entityField("label", words.c4.fields.modelLabel, entity.label), entityField("description", words.fields.description, entity.description, "multiline"), entityField("technology", words.c4.fields.technology, entity.technology), entityField("url", words.fields.url, entity.url));
59
+ if (entity.kind === "person" || entity.kind === "system") {
60
+ fields.push({
61
+ name: "entity.external",
62
+ label: words.c4.fields.external,
63
+ type: "enum",
64
+ value: entity.external ? "yes" : "no",
65
+ options: ["no", "yes"],
66
+ ...(readonly ? { readonly: true } : {}),
67
+ });
68
+ }
69
+ return fields;
70
+ }
71
+ /** Fields of a relation of a C4 view: the local label, the model relation and its sources. */
72
+ export function c4RelationFields(diagram, relation) {
73
+ const model = diagram.c4?.resolved?.definition;
74
+ const local = diagram.c4?.labels.find((l) => l.target === relation.key);
75
+ const combined = diagram.c4?.combined.includes(relation.key) ?? false;
76
+ const source = combined ? undefined : model?.relationsByKey.get(relation.key);
77
+ const readonly = !modelIsLocal(diagram);
78
+ const words = messages();
79
+ const fields = [
80
+ {
81
+ name: "id",
82
+ label: words.fields.id,
83
+ type: "text",
84
+ value: relation.id,
85
+ placeholder: relation.key,
86
+ readonly: true,
87
+ },
88
+ {
89
+ name: "label",
90
+ label: combined ? words.fields.label : words.c4.fields.localLabel,
91
+ type: "text",
92
+ value: combined ? relation.label : (local?.text ?? null),
93
+ placeholder: source?.label ?? "",
94
+ },
95
+ {
96
+ name: "sources",
97
+ label: relation.derived ? words.c4.fields.standsForLifted : words.c4.fields.standsFor,
98
+ type: "text",
99
+ value: relation.sources.join(", "),
100
+ readonly: true,
101
+ },
102
+ ];
103
+ if (source) {
104
+ const field = (name, label, value) => ({
105
+ name: `relation.${name}`,
106
+ label,
107
+ type: "text",
108
+ value,
109
+ ...(readonly ? { readonly: true, placeholder: words.c4.readOnly } : {}),
110
+ });
111
+ fields.push(field("label", words.c4.fields.modelLabel, source.label), field("technology", words.c4.fields.technology, source.technology), field("description", words.fields.description, source.description));
112
+ }
113
+ return fields;
114
+ }
115
+ /** Fields of a C4 view: level, scope and model, then the shared diagram properties. */
116
+ export function c4DiagramFields(diagram) {
117
+ const c4 = diagram.c4;
118
+ const words = messages();
119
+ return [
120
+ {
121
+ name: "level",
122
+ label: words.c4.fields.level,
123
+ type: "enum",
124
+ value: c4.level,
125
+ options: C4_LEVELS,
126
+ },
127
+ {
128
+ name: "scope",
129
+ label: words.c4.fields.scope,
130
+ type: "text",
131
+ value: c4.scope,
132
+ placeholder: words.placeholders.none,
133
+ },
134
+ { name: "model", label: words.c4.fields.model, type: "text", value: c4.model, readonly: true },
135
+ ];
136
+ }
137
+ /**
138
+ * The operations that write a field of a C4 view: local labels in the view, entity and relation
139
+ * fields in the model; undefined for the fields every profile shares.
140
+ */
141
+ export function c4FieldOperations(diagram, id, field, value) {
142
+ const c4 = diagram.c4;
143
+ const model = c4?.resolved?.definition;
144
+ if (!c4 || !model)
145
+ return undefined;
146
+ const text = value === null ? null : String(value);
147
+ if (field === "label") {
148
+ const relation = diagram.relationsByKey.get(id);
149
+ if (relation && c4.combined.includes(id)) {
150
+ return {
151
+ ok: true,
152
+ operations: [
153
+ { kind: "setRelationLabel", diagram: diagram.id, relation: id, label: text || null },
154
+ ],
155
+ };
156
+ }
157
+ return {
158
+ ok: true,
159
+ operations: [{ kind: "setLocalLabel", diagram: diagram.id, target: id, label: text || null }],
160
+ };
161
+ }
162
+ if (field.startsWith("entity.") || field.startsWith("relation.")) {
163
+ if (!modelIsLocal(diagram))
164
+ return { ok: false, reason: messages().c4.readOnly };
165
+ const [scope, property] = field.split(".");
166
+ if (scope === "entity") {
167
+ return {
168
+ ok: true,
169
+ operations: [
170
+ {
171
+ kind: "setEntityProperty",
172
+ model: model.id,
173
+ entity: id,
174
+ property: property,
175
+ value: property === "external" ? text === "yes" : text || null,
176
+ },
177
+ ],
178
+ };
179
+ }
180
+ return {
181
+ ok: true,
182
+ operations: [
183
+ {
184
+ kind: "setModelRelationProperty",
185
+ model: model.id,
186
+ relation: id,
187
+ property: property,
188
+ value: text || null,
189
+ },
190
+ ],
191
+ };
192
+ }
193
+ return undefined;
194
+ }
195
+ //# sourceMappingURL=c4.js.map
package/dist/c4.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c4.js","sourceRoot":"","sources":["../src/c4.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type Box, type Point } from "./geometry.js";
2
+ export type AlignEdge = "left" | "center" | "right" | "top" | "middle" | "bottom";
3
+ /**
4
+ * New centres that align the boxes: edges line up with the extreme box, centres with the centre
5
+ * of the selection. Boxes already in line keep their centre.
6
+ */
7
+ export declare function alignBoxes(boxes: ReadonlyMap<string, Box>, edge: AlignEdge): Map<string, Point>;
8
+ /**
9
+ * New centres that spread three or more boxes with equal gaps along an axis, in the order of
10
+ * their centres. The first and the last box stay.
11
+ */
12
+ export declare function distributeBoxes(boxes: ReadonlyMap<string, Box>, axis: "horizontal" | "vertical"): Map<string, Point>;
13
+ //# sourceMappingURL=arrange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrange.d.ts","sourceRoot":"","sources":["../../src/canvas/arrange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAElF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CA6B/F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,IAAI,EAAE,YAAY,GAAG,UAAU,GAC9B,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAuBpB"}
@@ -0,0 +1,61 @@
1
+ import { center, unionBox } from "./geometry.js";
2
+ /**
3
+ * New centres that align the boxes: edges line up with the extreme box, centres with the centre
4
+ * of the selection. Boxes already in line keep their centre.
5
+ */
6
+ export function alignBoxes(boxes, edge) {
7
+ const all = [...boxes.values()];
8
+ const bounds = unionBox(all);
9
+ const result = new Map();
10
+ if (!bounds)
11
+ return result;
12
+ for (const [id, box] of boxes) {
13
+ const c = center(box);
14
+ switch (edge) {
15
+ case "left":
16
+ result.set(id, { x: bounds.x + box.width / 2, y: c.y });
17
+ break;
18
+ case "right":
19
+ result.set(id, { x: bounds.x + bounds.width - box.width / 2, y: c.y });
20
+ break;
21
+ case "center":
22
+ result.set(id, { x: bounds.x + bounds.width / 2, y: c.y });
23
+ break;
24
+ case "top":
25
+ result.set(id, { x: c.x, y: bounds.y + box.height / 2 });
26
+ break;
27
+ case "bottom":
28
+ result.set(id, { x: c.x, y: bounds.y + bounds.height - box.height / 2 });
29
+ break;
30
+ case "middle":
31
+ result.set(id, { x: c.x, y: bounds.y + bounds.height / 2 });
32
+ break;
33
+ }
34
+ }
35
+ return result;
36
+ }
37
+ /**
38
+ * New centres that spread three or more boxes with equal gaps along an axis, in the order of
39
+ * their centres. The first and the last box stay.
40
+ */
41
+ export function distributeBoxes(boxes, axis) {
42
+ const result = new Map();
43
+ const horizontal = axis === "horizontal";
44
+ const entries = [...boxes].sort(([, a], [, b]) => horizontal ? center(a).x - center(b).x : center(a).y - center(b).y);
45
+ if (entries.length < 3)
46
+ return result;
47
+ const start = horizontal ? entries[0][1].x : entries[0][1].y;
48
+ const last = entries[entries.length - 1][1];
49
+ const end = horizontal ? last.x + last.width : last.y + last.height;
50
+ const total = entries.reduce((sum, [, b]) => sum + (horizontal ? b.width : b.height), 0);
51
+ const gap = (end - start - total) / (entries.length - 1);
52
+ let cursor = start;
53
+ for (const [id, box] of entries) {
54
+ const size = horizontal ? box.width : box.height;
55
+ const c = center(box);
56
+ result.set(id, horizontal ? { x: cursor + size / 2, y: c.y } : { x: c.x, y: cursor + size / 2 });
57
+ cursor += size + gap;
58
+ }
59
+ return result;
60
+ }
61
+ //# sourceMappingURL=arrange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrange.js","sourceRoot":"","sources":["../../src/canvas/arrange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAwB,MAAM,eAAe,CAAC;AAIvE;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAA+B,EAAE,IAAe;IACzE,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IACxC,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,MAAM;gBACT,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACxD,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvE,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3D,MAAM;YACR,KAAK,KAAK;gBACR,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzD,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzE,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC5D,MAAM;QACV,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,KAA+B,EAC/B,IAA+B;IAE/B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,KAAK,YAAY,CAAC;IACzC,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAC/C,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CACnE,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACtC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACpE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACzF,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QACjD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,CACR,EAAE,EACF,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,EAAE,CACjF,CAAC;QACF,MAAM,IAAI,IAAI,GAAG,GAAG,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "@meltemi/diagrams-layout/viewport";
2
+ //# sourceMappingURL=geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/canvas/geometry.ts"],"names":[],"mappings":"AACA,cAAc,mCAAmC,CAAC"}
@@ -0,0 +1,3 @@
1
+ // The viewport math lives in the layout package so the HTML player shares it with the canvas.
2
+ export * from "@meltemi/diagrams-layout/viewport";
3
+ //# sourceMappingURL=geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/canvas/geometry.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,cAAc,mCAAmC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export * from "./geometry.js";
2
+ export * from "./snapping.js";
3
+ export * from "./selection.js";
4
+ export * from "./arrange.js";
5
+ export * from "./routes.js";
6
+ export * from "./keyboard.js";
7
+ export * from "./protocol.js";
8
+ export * from "./palette.js";
9
+ export * from "./turning.js";
10
+ export { CORNERED_SHAPES, SHAPE_SIZES, onOutline, pointInShape, turnPoint, turnedOutline, shapeMagnets, shapeOutline, type ShapeMagnet, type ShapeOptions, type ShapeOutline, type ShapeSize, } from "@meltemi/diagrams-layout/shapes";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/canvas/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAG7B,OAAO,EACL,eAAe,EACf,WAAW,EACX,SAAS,EACT,YAAY,EACZ,SAAS,EACT,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,SAAS,GACf,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,14 @@
1
+ // Pure helpers shared by the canvas webview and the session. Nothing here imports the engine.
2
+ export * from "./geometry.js";
3
+ export * from "./snapping.js";
4
+ export * from "./selection.js";
5
+ export * from "./arrange.js";
6
+ export * from "./routes.js";
7
+ export * from "./keyboard.js";
8
+ export * from "./protocol.js";
9
+ export * from "./palette.js";
10
+ export * from "./turning.js";
11
+ // The outlines of the shapes, from the layout's pure geometry module (no engine, no model at run
12
+ // time), so the canvas draws what the layout draws: pictures, ghosts, hit tests and magnets.
13
+ export { CORNERED_SHAPES, SHAPE_SIZES, onOutline, pointInShape, turnPoint, turnedOutline, shapeMagnets, shapeOutline, } from "@meltemi/diagrams-layout/shapes";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/canvas/index.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,iGAAiG;AACjG,6FAA6F;AAC7F,OAAO,EACL,eAAe,EACf,WAAW,EACX,SAAS,EACT,YAAY,EACZ,SAAS,EACT,aAAa,EACb,YAAY,EACZ,YAAY,GAKb,MAAM,iCAAiC,CAAC"}