likec4 0.40.1-build.2 → 0.41.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 (196) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/dist/@likec4/core/{colors.js → colors/element.js} +1 -23
  4. package/dist/@likec4/core/colors/index.js +9 -0
  5. package/dist/@likec4/core/colors/relationships.js +64 -0
  6. package/dist/@likec4/core/index.js +1 -3
  7. package/dist/@likec4/core/types/relation.js +3 -0
  8. package/dist/@likec4/core/types/view.js +1 -1
  9. package/dist/@likec4/core/utils/fqn.js +16 -4
  10. package/dist/@likec4/core/utils/guards.js +1 -0
  11. package/dist/@likec4/core/utils/index.js +0 -1
  12. package/dist/@likec4/diagrams/cjs/components/EmbeddedDiagram.js +83 -0
  13. package/dist/@likec4/diagrams/cjs/components/FullscreenDiagramBrowser.js +50 -0
  14. package/dist/@likec4/diagrams/cjs/components/index.js +49 -0
  15. package/dist/@likec4/diagrams/cjs/components/primitives/fullscreen/CloseButton.js +44 -0
  16. package/dist/@likec4/diagrams/cjs/components/primitives/fullscreen/FullscreenDiagram.js +110 -0
  17. package/dist/@likec4/diagrams/cjs/components/primitives/fullscreen/FullscreenDiagramTitle.js +39 -0
  18. package/dist/@likec4/diagrams/cjs/components/primitives/index.js +38 -0
  19. package/dist/@likec4/diagrams/cjs/components/primitives/responsive/ResponsiveDiagram.js +56 -0
  20. package/dist/@likec4/diagrams/cjs/components/types.js +1 -0
  21. package/dist/@likec4/diagrams/cjs/diagram/Diagram.js +326 -0
  22. package/dist/@likec4/diagrams/cjs/diagram/Edges.js +121 -0
  23. package/dist/@likec4/diagrams/cjs/diagram/Nodes.js +204 -0
  24. package/dist/@likec4/diagrams/cjs/diagram/icons/BrainIcon.js +25 -0
  25. package/dist/@likec4/diagrams/cjs/diagram/icons/ExternalLink.js +82 -0
  26. package/dist/@likec4/diagrams/cjs/diagram/icons/index.js +27 -0
  27. package/dist/@likec4/diagrams/cjs/diagram/index.js +27 -0
  28. package/dist/@likec4/diagrams/cjs/diagram/shapes/Browser.js +67 -0
  29. package/dist/@likec4/diagrams/cjs/diagram/shapes/Compound.js +55 -0
  30. package/dist/@likec4/diagrams/cjs/diagram/shapes/Cylinder.js +71 -0
  31. package/dist/@likec4/diagrams/cjs/diagram/shapes/Edge.js +62 -0
  32. package/dist/@likec4/diagrams/cjs/diagram/shapes/Mobile.js +45 -0
  33. package/dist/@likec4/diagrams/cjs/diagram/shapes/NodeIcon.js +38 -0
  34. package/dist/@likec4/diagrams/cjs/diagram/shapes/NodeLabel.js +62 -0
  35. package/dist/@likec4/diagrams/cjs/diagram/shapes/Person.js +48 -0
  36. package/dist/@likec4/diagrams/cjs/diagram/shapes/Queue.js +72 -0
  37. package/dist/@likec4/diagrams/cjs/diagram/shapes/Rectangle.js +30 -0
  38. package/dist/@likec4/diagrams/cjs/diagram/shapes/index.js +54 -0
  39. package/dist/@likec4/diagrams/cjs/diagram/shapes/types.js +1 -0
  40. package/dist/@likec4/diagrams/cjs/diagram/shapes/utils.js +19 -0
  41. package/dist/@likec4/diagrams/cjs/diagram/springs.js +61 -0
  42. package/dist/@likec4/diagrams/cjs/diagram/state/atoms.js +63 -0
  43. package/dist/@likec4/diagrams/cjs/diagram/state/gestures.js +26 -0
  44. package/dist/@likec4/diagrams/cjs/diagram/state/hooks.js +36 -0
  45. package/dist/@likec4/diagrams/cjs/diagram/state/index.js +38 -0
  46. package/dist/@likec4/diagrams/cjs/diagram/state/provider.js +18 -0
  47. package/dist/@likec4/diagrams/cjs/diagram/types.js +1 -0
  48. package/dist/@likec4/diagrams/cjs/hooks/index.js +49 -0
  49. package/dist/@likec4/diagrams/cjs/hooks/useDarkMode.js +11 -0
  50. package/dist/@likec4/diagrams/cjs/hooks/useDiagramApi.js +27 -0
  51. package/dist/@likec4/diagrams/cjs/hooks/useImageLoader.js +68 -0
  52. package/dist/@likec4/diagrams/cjs/hooks/useViewIdFromHash.js +93 -0
  53. package/dist/@likec4/diagrams/cjs/index.js +51 -0
  54. package/dist/@likec4/diagrams/cjs/konva-html.js +93 -0
  55. package/dist/@likec4/diagrams/cjs/konva-portal.js +50 -0
  56. package/dist/@likec4/diagrams/cjs/konva.js +102 -0
  57. package/dist/@likec4/diagrams/cjs/likec4.js +91 -0
  58. package/dist/@likec4/diagrams/components/EmbeddedDiagram.mjs +77 -0
  59. package/dist/@likec4/diagrams/components/FullscreenDiagramBrowser.mjs +52 -0
  60. package/dist/@likec4/diagrams/components/index.mjs +4 -0
  61. package/dist/@likec4/diagrams/components/primitives/fullscreen/CloseButton.mjs +43 -0
  62. package/dist/@likec4/diagrams/components/primitives/fullscreen/FullscreenDiagram.mjs +116 -0
  63. package/dist/@likec4/diagrams/components/primitives/fullscreen/FullscreenDiagramTitle.mjs +32 -0
  64. package/dist/@likec4/diagrams/components/primitives/index.mjs +3 -0
  65. package/dist/@likec4/diagrams/components/primitives/responsive/ResponsiveDiagram.mjs +42 -0
  66. package/dist/@likec4/diagrams/components/types.mjs +0 -0
  67. package/dist/@likec4/diagrams/diagram/Diagram.js +2 -2
  68. package/dist/@likec4/diagrams/diagram/Diagram.mjs +307 -0
  69. package/dist/@likec4/diagrams/diagram/Edges.js +54 -49
  70. package/dist/@likec4/diagrams/diagram/Edges.mjs +117 -0
  71. package/dist/@likec4/diagrams/diagram/Nodes.js +6 -7
  72. package/dist/@likec4/diagrams/diagram/Nodes.mjs +178 -0
  73. package/dist/@likec4/diagrams/diagram/icons/BrainIcon.mjs +20 -0
  74. package/dist/@likec4/diagrams/diagram/icons/ExternalLink.js +1 -1
  75. package/dist/@likec4/diagrams/diagram/icons/ExternalLink.mjs +90 -0
  76. package/dist/@likec4/diagrams/diagram/icons/index.mjs +2 -0
  77. package/dist/@likec4/diagrams/diagram/index.mjs +2 -0
  78. package/dist/@likec4/diagrams/diagram/shapes/Browser.js +1 -2
  79. package/dist/@likec4/diagrams/diagram/shapes/Browser.mjs +49 -0
  80. package/dist/@likec4/diagrams/diagram/shapes/Compound.mjs +48 -0
  81. package/dist/@likec4/diagrams/diagram/shapes/Cylinder.js +0 -1
  82. package/dist/@likec4/diagrams/diagram/shapes/Cylinder.mjs +57 -0
  83. package/dist/@likec4/diagrams/diagram/shapes/Edge.js +124 -35
  84. package/dist/@likec4/diagrams/diagram/shapes/Edge.mjs +63 -0
  85. package/dist/@likec4/diagrams/diagram/shapes/Mobile.js +1 -1
  86. package/dist/@likec4/diagrams/diagram/shapes/Mobile.mjs +33 -0
  87. package/dist/@likec4/diagrams/diagram/shapes/NodeIcon.js +2 -1
  88. package/dist/@likec4/diagrams/diagram/shapes/NodeIcon.mjs +28 -0
  89. package/dist/@likec4/diagrams/diagram/shapes/NodeLabel.js +1 -1
  90. package/dist/@likec4/diagrams/diagram/shapes/NodeLabel.mjs +59 -0
  91. package/dist/@likec4/diagrams/diagram/shapes/Person.mjs +42 -0
  92. package/dist/@likec4/diagrams/diagram/shapes/Queue.js +0 -1
  93. package/dist/@likec4/diagrams/diagram/shapes/Queue.mjs +58 -0
  94. package/dist/@likec4/diagrams/diagram/shapes/Rectangle.js +1 -1
  95. package/dist/@likec4/diagrams/diagram/shapes/Rectangle.mjs +20 -0
  96. package/dist/@likec4/diagrams/diagram/shapes/index.mjs +7 -0
  97. package/dist/@likec4/diagrams/diagram/shapes/types.mjs +0 -0
  98. package/dist/@likec4/diagrams/diagram/shapes/utils.mjs +12 -0
  99. package/dist/@likec4/diagrams/diagram/springs.js +3 -3
  100. package/dist/@likec4/diagrams/diagram/springs.mjs +57 -0
  101. package/dist/@likec4/diagrams/diagram/state/atoms.js +4 -4
  102. package/dist/@likec4/diagrams/diagram/state/atoms.mjs +71 -0
  103. package/dist/@likec4/diagrams/diagram/state/gestures.mjs +19 -0
  104. package/dist/@likec4/diagrams/diagram/state/hooks.js +0 -11
  105. package/dist/@likec4/diagrams/diagram/state/hooks.mjs +28 -0
  106. package/dist/@likec4/diagrams/diagram/state/index.mjs +3 -0
  107. package/dist/@likec4/diagrams/diagram/state/provider.mjs +7 -0
  108. package/dist/@likec4/diagrams/diagram/types.mjs +0 -0
  109. package/dist/@likec4/diagrams/esm/components/EmbeddedDiagram.js +77 -0
  110. package/dist/@likec4/diagrams/esm/components/FullscreenDiagramBrowser.js +52 -0
  111. package/dist/@likec4/diagrams/esm/components/index.js +4 -0
  112. package/dist/@likec4/diagrams/esm/components/primitives/fullscreen/CloseButton.js +43 -0
  113. package/dist/@likec4/diagrams/esm/components/primitives/fullscreen/FullscreenDiagram.js +116 -0
  114. package/dist/@likec4/diagrams/esm/components/primitives/fullscreen/FullscreenDiagramTitle.js +32 -0
  115. package/dist/@likec4/diagrams/esm/components/primitives/index.js +3 -0
  116. package/dist/@likec4/diagrams/esm/components/primitives/responsive/ResponsiveDiagram.js +42 -0
  117. package/dist/@likec4/diagrams/esm/components/types.js +0 -0
  118. package/dist/@likec4/diagrams/esm/diagram/Diagram.js +307 -0
  119. package/dist/@likec4/diagrams/esm/diagram/Edges.js +117 -0
  120. package/dist/@likec4/diagrams/esm/diagram/Nodes.js +178 -0
  121. package/dist/@likec4/diagrams/esm/diagram/icons/BrainIcon.js +20 -0
  122. package/dist/@likec4/diagrams/esm/diagram/icons/ExternalLink.js +90 -0
  123. package/dist/@likec4/diagrams/esm/diagram/icons/index.js +2 -0
  124. package/dist/@likec4/diagrams/esm/diagram/index.js +2 -0
  125. package/dist/@likec4/diagrams/esm/diagram/shapes/Browser.js +49 -0
  126. package/dist/@likec4/diagrams/esm/diagram/shapes/Compound.js +48 -0
  127. package/dist/@likec4/diagrams/esm/diagram/shapes/Cylinder.js +57 -0
  128. package/dist/@likec4/diagrams/esm/diagram/shapes/Edge.js +63 -0
  129. package/dist/@likec4/diagrams/esm/diagram/shapes/Mobile.js +33 -0
  130. package/dist/@likec4/diagrams/esm/diagram/shapes/NodeIcon.js +28 -0
  131. package/dist/@likec4/diagrams/esm/diagram/shapes/NodeLabel.js +59 -0
  132. package/dist/@likec4/diagrams/esm/diagram/shapes/Person.js +42 -0
  133. package/dist/@likec4/diagrams/esm/diagram/shapes/Queue.js +58 -0
  134. package/dist/@likec4/diagrams/esm/diagram/shapes/Rectangle.js +20 -0
  135. package/dist/@likec4/diagrams/esm/diagram/shapes/index.js +7 -0
  136. package/dist/@likec4/diagrams/esm/diagram/shapes/types.js +0 -0
  137. package/dist/@likec4/diagrams/esm/diagram/shapes/utils.js +12 -0
  138. package/dist/@likec4/diagrams/esm/diagram/springs.js +57 -0
  139. package/dist/@likec4/diagrams/esm/diagram/state/atoms.js +71 -0
  140. package/dist/@likec4/diagrams/esm/diagram/state/gestures.js +19 -0
  141. package/dist/@likec4/diagrams/esm/diagram/state/hooks.js +28 -0
  142. package/dist/@likec4/diagrams/esm/diagram/state/index.js +3 -0
  143. package/dist/@likec4/diagrams/esm/diagram/state/provider.js +7 -0
  144. package/dist/@likec4/diagrams/esm/diagram/types.js +0 -0
  145. package/dist/@likec4/diagrams/esm/hooks/index.js +4 -0
  146. package/dist/@likec4/diagrams/esm/hooks/useDarkMode.js +5 -0
  147. package/dist/@likec4/diagrams/esm/hooks/useDiagramApi.js +27 -0
  148. package/dist/@likec4/diagrams/esm/hooks/useImageLoader.js +64 -0
  149. package/dist/@likec4/diagrams/esm/hooks/useViewIdFromHash.js +87 -0
  150. package/dist/@likec4/diagrams/esm/index.js +4 -0
  151. package/dist/@likec4/diagrams/esm/konva-html.js +74 -0
  152. package/dist/@likec4/diagrams/esm/konva-portal.js +34 -0
  153. package/dist/@likec4/diagrams/esm/konva.js +22 -0
  154. package/dist/@likec4/diagrams/esm/likec4.js +54 -0
  155. package/dist/@likec4/diagrams/hooks/index.mjs +4 -0
  156. package/dist/@likec4/diagrams/hooks/useDarkMode.mjs +5 -0
  157. package/dist/@likec4/diagrams/hooks/useDiagramApi.mjs +27 -0
  158. package/dist/@likec4/diagrams/hooks/useImageLoader.mjs +64 -0
  159. package/dist/@likec4/diagrams/hooks/useViewIdFromHash.mjs +87 -0
  160. package/dist/@likec4/diagrams/index.mjs +4 -0
  161. package/dist/@likec4/diagrams/konva-html.mjs +74 -0
  162. package/dist/@likec4/diagrams/konva-portal.mjs +34 -0
  163. package/dist/@likec4/diagrams/konva.js +12 -1
  164. package/dist/@likec4/diagrams/konva.mjs +33 -0
  165. package/dist/@likec4/diagrams/likec4.mjs +54 -0
  166. package/dist/__app__/likec4.css +4 -71
  167. package/dist/__app__/src/App.jsx +3 -7
  168. package/dist/__app__/src/components/DiagramNotFound.jsx +2 -2
  169. package/dist/__app__/src/components/ThemePanelToggle.jsx +11 -9
  170. package/dist/__app__/src/components/sidebar/Sidebar.jsx +1 -1
  171. package/dist/__app__/src/components/view-page/ShareDialog.jsx +7 -3
  172. package/dist/__app__/src/components/view-page/ViewActionsToolbar.jsx +4 -2
  173. package/dist/__app__/src/const.js +5 -0
  174. package/dist/__app__/src/likec4-views.js +15 -0
  175. package/dist/__app__/src/main.jsx +1 -4
  176. package/dist/__app__/src/pages/export.page.jsx +8 -4
  177. package/dist/__app__/src/router.js +37 -21
  178. package/dist/__app__/tsconfig.json +2 -1
  179. package/dist/cli/index.js +203 -201
  180. package/package.json +30 -24
  181. package/dist/@likec4/core/compute-view/EdgeBuilder.js +0 -30
  182. package/dist/@likec4/core/compute-view/compute-ctx.js +0 -100
  183. package/dist/@likec4/core/compute-view/compute-element-view.js +0 -98
  184. package/dist/@likec4/core/compute-view/compute-predicates.js +0 -324
  185. package/dist/@likec4/core/compute-view/compute.js +0 -36
  186. package/dist/@likec4/core/compute-view/index.js +0 -4
  187. package/dist/@likec4/core/compute-view/resolve-extended-views.js +0 -41
  188. package/dist/@likec4/core/compute-view/resolve-relative-paths.js +0 -76
  189. package/dist/@likec4/core/compute-view/utils/anyPossibleRelations.js +0 -12
  190. package/dist/@likec4/core/compute-view/utils/applyViewRuleStyles.js +0 -50
  191. package/dist/@likec4/core/compute-view/utils/sortNodes.js +0 -37
  192. package/dist/@likec4/core/model-index/ModelIndex.js +0 -127
  193. package/dist/@likec4/core/model-index/index.js +0 -1
  194. package/dist/@likec4/core/utils/compute-node-levels.js +0 -31
  195. package/dist/@likec4/diagrams/hooks/useDiagramRef.js +0 -21
  196. package/dist/__app__/src/pages/export.module.css +0 -4
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 Denis Davydkov
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 ADDED
@@ -0,0 +1,3 @@
1
+ # LikeC4
2
+
3
+ ...
@@ -1,38 +1,22 @@
1
1
  const blue = {
2
- // fill: colors.blue[500],
3
- // stroke: colors.blue[600],
4
- // hiContrast: colors.blue[50],
5
- // loContrast: colors.blue[200],
6
2
  fill: "#3b82f6",
7
3
  stroke: "#2563eb",
8
4
  hiContrast: "#eff6ff",
9
5
  loContrast: "#bfdbfe"
10
6
  };
11
7
  const sky = {
12
- // fill: colors.sky[600],
13
- // stroke: colors.sky[700],
14
- // hiContrast: colors.sky[50],
15
- // loContrast: colors.sky[100],
16
8
  fill: "#0284c7",
17
9
  stroke: "#0369a1",
18
10
  hiContrast: "#f0f9ff",
19
11
  loContrast: "#e0f2fe"
20
12
  };
21
13
  const slate = {
22
- // fill: colors.slate[500],
23
- // stroke: colors.slate[600],
24
- // hiContrast: colors.slate[50],
25
- // loContrast: colors.slate[200],
26
14
  fill: "#64748b",
27
15
  stroke: "#475569",
28
16
  hiContrast: "#f8fafc",
29
17
  loContrast: "#e2e8f0"
30
18
  };
31
- export const RelationColors = {
32
- lineColor: "#b1b1b1",
33
- labelColor: "#b1b1b1"
34
- };
35
- export const Colors = {
19
+ export const ElementColors = {
36
20
  primary: blue,
37
21
  blue,
38
22
  secondary: sky,
@@ -96,9 +80,3 @@ export const Colors = {
96
80
  loContrast: "#c7d2fe"
97
81
  }
98
82
  };
99
- export const defaultTheme = {
100
- font: "Helvetica",
101
- shadow: "#0a0a0a",
102
- relation: RelationColors,
103
- colors: Colors
104
- };
@@ -0,0 +1,9 @@
1
+ import { ElementColors } from "./element.js";
2
+ import { RelationshipColors } from "./relationships.js";
3
+ export const defaultTheme = {
4
+ elements: ElementColors,
5
+ relationships: RelationshipColors,
6
+ font: "Helvetica",
7
+ shadow: "#0a0a0a"
8
+ };
9
+ export { ElementColors, RelationshipColors };
@@ -0,0 +1,64 @@
1
+ const gray = {
2
+ lineColor: "#6E6E6E",
3
+ labelBgColor: "#18191b",
4
+ labelColor: "#C6C6C6"
5
+ };
6
+ const slate = {
7
+ lineColor: "#64748b",
8
+ // 500
9
+ labelBgColor: "#0f172a",
10
+ // 900
11
+ labelColor: "#cbd5e1"
12
+ // 300
13
+ };
14
+ const blue = {
15
+ lineColor: "#3b82f6",
16
+ // 500
17
+ labelBgColor: "#172554",
18
+ // 950
19
+ labelColor: "#60a5fa"
20
+ // 400
21
+ };
22
+ const sky = {
23
+ lineColor: "#0ea5e9",
24
+ // 500
25
+ labelBgColor: "#082f49",
26
+ // 950
27
+ labelColor: "#38bdf8"
28
+ // 400
29
+ };
30
+ export const RelationshipColors = {
31
+ amber: {
32
+ lineColor: "#b45309",
33
+ labelBgColor: "#78350f",
34
+ labelColor: "#f59e0b"
35
+ },
36
+ blue,
37
+ gray,
38
+ green: {
39
+ lineColor: "#15803d",
40
+ // 700
41
+ labelBgColor: "#052e16",
42
+ //950
43
+ labelColor: "#22c55e"
44
+ // 500
45
+ },
46
+ indigo: {
47
+ lineColor: "#6366f1",
48
+ // 500
49
+ labelBgColor: "#1e1b4b",
50
+ // 950
51
+ labelColor: "#818cf8"
52
+ // 400
53
+ },
54
+ muted: slate,
55
+ primary: blue,
56
+ red: {
57
+ lineColor: "#b91c1c",
58
+ labelBgColor: "#b91c1c",
59
+ labelColor: "#dc2626"
60
+ },
61
+ secondary: sky,
62
+ sky,
63
+ slate
64
+ };
@@ -1,6 +1,4 @@
1
- export * from "./colors.js";
2
- export * from "./compute-view/index.js";
1
+ export * from "./colors/index.js";
3
2
  export * from "./errors/index.js";
4
- export * from "./model-index/index.js";
5
3
  export * from "./types/index.js";
6
4
  export * from "./utils/index.js";
@@ -0,0 +1,3 @@
1
+ export const DefaultLineStyle = "dashed";
2
+ export const DefaultArrowType = "normal";
3
+ export const DefaultRelationshipColor = "gray";
@@ -1,5 +1,5 @@
1
1
  export function isViewRuleExpression(rule) {
2
- return "exprs" in rule && "isInclude" in rule;
2
+ return "include" in rule && Array.isArray(rule.include) || "exclude" in rule && Array.isArray(rule.exclude);
3
3
  }
4
4
  export function isViewRuleStyle(rule) {
5
5
  return "style" in rule && "targets" in rule;
@@ -13,10 +13,10 @@ export function isAncestor(...args) {
13
13
  const another = isString(args[1]) ? args[1] : args[1].id;
14
14
  return another.startsWith(ancestor + ".");
15
15
  }
16
- export function isSameHierarchy(...args) {
17
- const one = isString(args[0]) ? args[0] : args[0].id;
18
- const another = isString(args[1]) ? args[1] : args[1].id;
19
- return one === another || another.startsWith(one + ".") || one.startsWith(another + ".");
16
+ export function isSameHierarchy(one, another) {
17
+ const first = isString(one) ? one : one.id;
18
+ const second = isString(another) ? another : another.id;
19
+ return first === second || second.startsWith(first + ".") || first.startsWith(second + ".");
20
20
  }
21
21
  export function isDescendantOf(ancestors) {
22
22
  const predicates = ancestors.flatMap((a) => [(e) => e.id === a.id, (e) => isAncestor(a, e)]);
@@ -52,6 +52,18 @@ export function parentFqn(fqn) {
52
52
  }
53
53
  return null;
54
54
  }
55
+ export function ancestorsFqn(fqn) {
56
+ const path = fqn.split(".");
57
+ path.pop();
58
+ if (path.length === 0) {
59
+ return [];
60
+ }
61
+ return path.reduce((acc, _, idx) => {
62
+ const ancestor = path.slice(0, idx + 1).join(".");
63
+ acc.unshift(ancestor);
64
+ return acc;
65
+ }, []);
66
+ }
55
67
  export function compareFqnHierarchically(a, b) {
56
68
  const depthA = a.split(".").length;
57
69
  const depthB = b.split(".").length;
@@ -1,3 +1,4 @@
1
+ export { hasAtLeast } from "remeda";
1
2
  export function isString(value) {
2
3
  return value != null && typeof value === "string";
3
4
  }
@@ -1,4 +1,3 @@
1
1
  export * from "./fqn.js";
2
2
  export * from "./guards.js";
3
- export * from "./compute-node-levels.js";
4
3
  export * from "./relations.js";
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.EmbeddedDiagram = void 0;
7
+ var _jsxRuntime = require("react/jsx-runtime");
8
+ var _core = require("@likec4/core");
9
+ var _react = require("react");
10
+ var _primitives = require("./primitives");
11
+ var _FullscreenDiagramBrowser = require("./FullscreenDiagramBrowser");
12
+ const EmbeddedPadding = [20, 20, 20, 20];
13
+ const defaultRenderDisclose = ({
14
+ views,
15
+ viewId,
16
+ initialPosition,
17
+ onClose
18
+ }) => /* @__PURE__ */(0, _jsxRuntime.jsx)(_FullscreenDiagramBrowser.FullscreenDiagramBrowser, {
19
+ views,
20
+ initialViewId: viewId,
21
+ initialPosition,
22
+ onClose
23
+ });
24
+ const EmbeddedDiagram = /* @__PURE__ */(0, _react.forwardRef)(({
25
+ animate = false,
26
+ views,
27
+ viewId,
28
+ padding,
29
+ noBrowser = false,
30
+ renderDisclose = defaultRenderDisclose,
31
+ ...props
32
+ }, ref) => {
33
+ const diagram = views[viewId];
34
+ (0, _core.invariant)(diagram, `View "${viewId}" not found in views`);
35
+ const [initialPosition, setBrowserInitialPosition] = (0, _react.useState)(null);
36
+ const isOpened = initialPosition !== null;
37
+ const openBrowser = s => {
38
+ const rect = s.container().getBoundingClientRect(),
39
+ scale = s.scaleX(),
40
+ embeddedX = s.x() - s.offsetX(),
41
+ embeddedY = s.y() - s.offsetY(),
42
+ offset = {
43
+ x: window.innerWidth / 2,
44
+ y: window.innerHeight / 2
45
+ };
46
+ setBrowserInitialPosition({
47
+ x: Math.ceil(embeddedX + rect.x * scale + offset.x),
48
+ y: Math.ceil(embeddedY + rect.y * scale + offset.y),
49
+ scale
50
+ });
51
+ };
52
+ const onNodeEdgeClick = (_node, e) => {
53
+ const stage = e.target.getStage();
54
+ if (stage) {
55
+ e.cancelBubble = true;
56
+ openBrowser(stage);
57
+ }
58
+ };
59
+ const onClose = (0, _react.useCallback)(() => setBrowserInitialPosition(null), []);
60
+ const enableBrowseClicks = !noBrowser && !isOpened;
61
+ return /* @__PURE__ */(0, _jsxRuntime.jsxs)("div", {
62
+ ...props,
63
+ children: [/* @__PURE__ */(0, _jsxRuntime.jsx)(_primitives.ResponsiveDiagram, {
64
+ ref,
65
+ animate,
66
+ zoomable: false,
67
+ pannable: false,
68
+ diagram,
69
+ padding: padding ?? EmbeddedPadding,
70
+ ...(enableBrowseClicks && {
71
+ onStageClick: openBrowser,
72
+ onEdgeClick: onNodeEdgeClick,
73
+ onNodeClick: onNodeEdgeClick
74
+ })
75
+ }), isOpened && renderDisclose({
76
+ views,
77
+ viewId,
78
+ initialPosition,
79
+ onClose
80
+ })]
81
+ });
82
+ });
83
+ exports.EmbeddedDiagram = EmbeddedDiagram;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FullscreenDiagramBrowser = FullscreenDiagramBrowser;
7
+ var _jsxRuntime = require("react/jsx-runtime");
8
+ var _core = require("@likec4/core");
9
+ var _esm = require("@react-hookz/web/esm");
10
+ var _react = require("react");
11
+ var _reactDom = require("react-dom");
12
+ var _useViewIdFromHash = require("../hooks/useViewIdFromHash");
13
+ var _primitives = require("./primitives");
14
+ function FullscreenDiagramBrowser({
15
+ initialViewId,
16
+ views,
17
+ initialPosition,
18
+ onClose,
19
+ closeOnEsc,
20
+ closeOnOutsideClick,
21
+ ...props
22
+ }) {
23
+ const viewsRef = (0, _esm.useSyncedRef)(views);
24
+ const [viewId, setViewId] = (0, _useViewIdFromHash.useViewIdFromHash)({
25
+ initialViewId,
26
+ onReturnToInitial: () => {
27
+ onClose?.();
28
+ }
29
+ });
30
+ const diagram = views[viewId];
31
+ (0, _core.invariant)(diagram, `View "${viewId}" not found in views`);
32
+ const onNodeClick = (0, _react.useCallback)(node => {
33
+ if (node.navigateTo && node.navigateTo in viewsRef.current) {
34
+ setViewId(node.navigateTo);
35
+ }
36
+ }, [viewsRef, setViewId]);
37
+ return (0, _reactDom.createPortal)( /* @__PURE__ */(0, _jsxRuntime.jsx)(_primitives.FullscreenDiagram, {
38
+ diagram,
39
+ initialPosition,
40
+ closeOnEsc: true,
41
+ closeOnOutsideClick: true,
42
+ onNodeClick,
43
+ onClose,
44
+ ...props,
45
+ children: /* @__PURE__ */(0, _jsxRuntime.jsx)(_primitives.FullscreenDiagramTitle, {
46
+ children: diagram.title
47
+ })
48
+ }), document.body, "FullscreenDiagramBrowser");
49
+ }
50
+ FullscreenDiagramBrowser.displayName = "FullscreenDiagramBrowser";
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _FullscreenDiagramBrowser = require("./FullscreenDiagramBrowser");
7
+ Object.keys(_FullscreenDiagramBrowser).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _FullscreenDiagramBrowser[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _FullscreenDiagramBrowser[key];
14
+ }
15
+ });
16
+ });
17
+ var _EmbeddedDiagram = require("./EmbeddedDiagram");
18
+ Object.keys(_EmbeddedDiagram).forEach(function (key) {
19
+ if (key === "default" || key === "__esModule") return;
20
+ if (key in exports && exports[key] === _EmbeddedDiagram[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _EmbeddedDiagram[key];
25
+ }
26
+ });
27
+ });
28
+ var _primitives = require("./primitives");
29
+ Object.keys(_primitives).forEach(function (key) {
30
+ if (key === "default" || key === "__esModule") return;
31
+ if (key in exports && exports[key] === _primitives[key]) return;
32
+ Object.defineProperty(exports, key, {
33
+ enumerable: true,
34
+ get: function () {
35
+ return _primitives[key];
36
+ }
37
+ });
38
+ });
39
+ var _types = require("./types");
40
+ Object.keys(_types).forEach(function (key) {
41
+ if (key === "default" || key === "__esModule") return;
42
+ if (key in exports && exports[key] === _types[key]) return;
43
+ Object.defineProperty(exports, key, {
44
+ enumerable: true,
45
+ get: function () {
46
+ return _types[key];
47
+ }
48
+ });
49
+ });
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.CloseButton = void 0;
7
+ var _jsxRuntime = require("react/jsx-runtime");
8
+ var _react = require("react");
9
+ const CrossIcon = (0, _react.forwardRef)((props, ref) => /* @__PURE__ */(0, _jsxRuntime.jsx)("svg", {
10
+ ref,
11
+ width: "15",
12
+ height: "15",
13
+ viewBox: "0 0 15 15",
14
+ fill: "none",
15
+ xmlns: "http://www.w3.org/2000/svg",
16
+ ...props,
17
+ children: /* @__PURE__ */(0, _jsxRuntime.jsx)("path", {
18
+ d: "M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z",
19
+ fill: "currentColor",
20
+ fillRule: "evenodd",
21
+ clipRule: "evenodd"
22
+ })
23
+ }));
24
+ const CloseButton = ({
25
+ style,
26
+ ...props
27
+ }) => /* @__PURE__ */(0, _jsxRuntime.jsx)("div", {
28
+ ...props,
29
+ style: {
30
+ position: "absolute",
31
+ top: "1rem",
32
+ right: "1rem",
33
+ width: 24,
34
+ height: 24,
35
+ cursor: "pointer",
36
+ color: "var(--likec4-browser-close-btn-color, rgba(200,200,200,0.8))",
37
+ ...style
38
+ },
39
+ children: /* @__PURE__ */(0, _jsxRuntime.jsx)(CrossIcon, {
40
+ width: 24,
41
+ height: 24
42
+ })
43
+ });
44
+ exports.CloseButton = CloseButton;
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FullscreenDiagram = FullscreenDiagram;
7
+ var _jsxRuntime = require("react/jsx-runtime");
8
+ var _core = require("@likec4/core");
9
+ var _esm = require("@react-hookz/web/esm");
10
+ var _bodyScrollLockUpgrade = require("body-scroll-lock-upgrade");
11
+ var _react = require("react");
12
+ var _Diagram = require("../../../diagram/Diagram");
13
+ var _CloseButton = require("./CloseButton");
14
+ const DefaultPadding = [30, 30, 30, 30];
15
+ const StyleOverlay = {
16
+ position: "fixed",
17
+ top: 0,
18
+ left: 0,
19
+ right: 0,
20
+ bottom: 0,
21
+ backgroundColor: "var(--likec4-browser-overlay-bg, rgba(18,18,18,0.8))",
22
+ backdropFilter: "var(--likec4-browser-backdrop, blur(4px))",
23
+ zIndex: "var(--likec4-overlay-z-index, 100)",
24
+ display: "flex",
25
+ placeContent: "strech",
26
+ placeItems: "strech",
27
+ touchAction: "pan-x pan-y pinch-zoom",
28
+ boxSizing: "border-box",
29
+ margin: 0,
30
+ padding: 0,
31
+ border: "0 solid transparent"
32
+ };
33
+ const StyleContainer = {
34
+ margin: 0,
35
+ padding: 0,
36
+ flex: "1 1 100%",
37
+ overflow: "hidden"
38
+ };
39
+ function FullscreenDiagram({
40
+ diagram,
41
+ initialPosition,
42
+ padding,
43
+ style,
44
+ styleDiagram,
45
+ closeOnEsc = true,
46
+ closeOnOutsideClick,
47
+ onNodeClick,
48
+ onEdgeClick,
49
+ onStageClick,
50
+ onClose,
51
+ children,
52
+ ...props
53
+ }) {
54
+ if (onStageClick && closeOnOutsideClick === true) {
55
+ throw new Error("onStageClick cannot be used with closeOnOutsideClick");
56
+ }
57
+ if (closeOnEsc || closeOnOutsideClick) {
58
+ (0, _core.invariant)(onClose, "onClose is required when closeOnEsc or closeOnOutsideClick");
59
+ }
60
+ const overlayRef = (0, _react.useRef)(null);
61
+ const [measures, containerRef] = (0, _esm.useMeasure)();
62
+ (0, _react.useEffect)(() => {
63
+ const target = overlayRef.current;
64
+ if (!target) {
65
+ return;
66
+ }
67
+ (0, _bodyScrollLockUpgrade.disableBodyScroll)(target);
68
+ return () => {
69
+ (0, _bodyScrollLockUpgrade.enableBodyScroll)(target);
70
+ };
71
+ }, []);
72
+ (0, _esm.useKeyboardEvent)(closeOnEsc && "Escape", () => {
73
+ onClose?.();
74
+ }, [], {
75
+ eventOptions: {
76
+ passive: true
77
+ }
78
+ });
79
+ return /* @__PURE__ */(0, _jsxRuntime.jsxs)("div", {
80
+ ref: overlayRef,
81
+ style: {
82
+ ...StyleOverlay,
83
+ ...style
84
+ },
85
+ ...props,
86
+ children: [/* @__PURE__ */(0, _jsxRuntime.jsx)("div", {
87
+ ref: containerRef,
88
+ style: {
89
+ ...StyleContainer
90
+ },
91
+ children: measures && /* @__PURE__ */(0, _jsxRuntime.jsx)(_Diagram.Diagram, {
92
+ animate: true,
93
+ pannable: true,
94
+ zoomable: true,
95
+ diagram,
96
+ width: measures.width,
97
+ height: measures.height,
98
+ initialPosition,
99
+ padding: padding ?? DefaultPadding,
100
+ style: styleDiagram,
101
+ onNodeClick,
102
+ onEdgeClick,
103
+ onStageClick: onStageClick ?? (closeOnOutsideClick ? onClose : void 0)
104
+ })
105
+ }), children, onClose && /* @__PURE__ */(0, _jsxRuntime.jsx)(_CloseButton.CloseButton, {
106
+ onClick: () => onClose()
107
+ })]
108
+ });
109
+ }
110
+ FullscreenDiagram.displayName = "FullscreenDiagram";
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FullscreenDiagramTitle = FullscreenDiagramTitle;
7
+ var _jsxRuntime = require("react/jsx-runtime");
8
+ const ContainerStyles = {
9
+ position: "absolute",
10
+ pointerEvents: "none",
11
+ userSelect: "none",
12
+ top: 0,
13
+ left: 0,
14
+ width: "100%",
15
+ margin: 0,
16
+ padding: "10px 20px 0 20px",
17
+ boxSizing: "border-box",
18
+ color: "rgb(241 245 249 / 95%)",
19
+ fontFamily: 'ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif',
20
+ fontSize: "16px",
21
+ lineHeight: "1.1",
22
+ fontWeight: "500",
23
+ textShadow: "4px 4px 5px rgb(17 17 17)"
24
+ };
25
+ function FullscreenDiagramTitle({
26
+ children,
27
+ style,
28
+ ...props
29
+ }) {
30
+ return /* @__PURE__ */(0, _jsxRuntime.jsx)("div", {
31
+ style: {
32
+ ...ContainerStyles,
33
+ ...style
34
+ },
35
+ ...props,
36
+ children
37
+ });
38
+ }
39
+ FullscreenDiagramTitle.displayName = "FullscreenDiagramTitle";
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _ResponsiveDiagram = require("./responsive/ResponsiveDiagram");
7
+ Object.keys(_ResponsiveDiagram).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _ResponsiveDiagram[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _ResponsiveDiagram[key];
14
+ }
15
+ });
16
+ });
17
+ var _FullscreenDiagram = require("./fullscreen/FullscreenDiagram");
18
+ Object.keys(_FullscreenDiagram).forEach(function (key) {
19
+ if (key === "default" || key === "__esModule") return;
20
+ if (key in exports && exports[key] === _FullscreenDiagram[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _FullscreenDiagram[key];
25
+ }
26
+ });
27
+ });
28
+ var _FullscreenDiagramTitle = require("./fullscreen/FullscreenDiagramTitle");
29
+ Object.keys(_FullscreenDiagramTitle).forEach(function (key) {
30
+ if (key === "default" || key === "__esModule") return;
31
+ if (key in exports && exports[key] === _FullscreenDiagramTitle[key]) return;
32
+ Object.defineProperty(exports, key, {
33
+ enumerable: true,
34
+ get: function () {
35
+ return _FullscreenDiagramTitle[key];
36
+ }
37
+ });
38
+ });