@likec4/diagram 1.22.1 → 1.23.1

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 (238) hide show
  1. package/dist/LikeC4Diagram.js +2 -3
  2. package/dist/base/BaseXYFlow.js +0 -1
  3. package/dist/base/example/custom.d.ts +1 -1
  4. package/dist/base/primitives/customEdge.d.ts +1 -1
  5. package/dist/base/primitives/edge/EdgePath.d.ts +1 -1
  6. package/dist/context/DiagramEventHandlers.d.ts +6 -2
  7. package/dist/context/DiagramEventHandlers.js +25 -20
  8. package/dist/context/DiagramFeatures.js +9 -22
  9. package/dist/{style.css → diagram.css} +1 -1
  10. package/dist/hooks/index.d.ts +0 -1
  11. package/dist/hooks/safeContext.d.ts +7 -0
  12. package/dist/hooks/safeContext.js +14 -0
  13. package/dist/hooks/useCurrentViewId.js +1 -1
  14. package/dist/hooks/useDiagram.d.ts +6587 -5969
  15. package/dist/hooks/useDiagram.js +26 -14
  16. package/dist/index.js +1 -1
  17. package/dist/likec4diagram/DiagramUI.js +12 -5
  18. package/dist/likec4diagram/XYFlow.js +3 -4
  19. package/dist/likec4diagram/custom/edges/NotePopover.js +1 -2
  20. package/dist/likec4diagram/custom/edges/RelationshipEdge.d.ts +1 -1
  21. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +1 -1
  22. package/dist/likec4diagram/custom/edges/RelationshipsDropdownMenu.js +6 -7
  23. package/dist/likec4diagram/custom/index.d.ts +1 -1
  24. package/dist/likec4diagram/custom/nodes/toolbar/Toolbar.js +1 -1
  25. package/dist/likec4diagram/ui/controls/ChangeAutoLayoutButton.js +1 -2
  26. package/dist/likec4diagram/ui/controls/Controls.js +3 -13
  27. package/dist/likec4diagram/ui/controls/NavigationButtons.js +1 -2
  28. package/dist/likec4diagram/ui/controls/ToggleReadonly.js +1 -2
  29. package/dist/likec4diagram/ui/diagram-title/DiagramTitlePanel.js +8 -9
  30. package/dist/likec4diagram/ui/notation/NotationPanel.js +1 -2
  31. package/dist/likec4diagram/ui/search/LikeC4Search.js +2 -4
  32. package/dist/likec4diagram/ui/search/ViewsColum.js +1 -1
  33. package/dist/likec4diagram/ui/search/state.js +1 -1
  34. package/dist/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.js +1 -2
  35. package/dist/likec4diagram/useViewToNodesEdges.d.ts +0 -1
  36. package/dist/likec4diagram/useViewToNodesEdges.js +0 -2
  37. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Accordion/Accordion.module.css.mjs.vanilla.css.js +1 -0
  38. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/ActionIcon/ActionIcon.module.css.mjs.vanilla.css.js +1 -0
  39. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Affix/Affix.module.css.mjs.vanilla.css.js +1 -0
  40. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Alert/Alert.module.css.mjs.vanilla.css.js +1 -0
  41. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Anchor/Anchor.module.css.mjs.vanilla.css.js +1 -0
  42. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/AngleSlider/AngleSlider.module.css.mjs.vanilla.css.js +1 -0
  43. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/AppShell/AppShell.module.css.mjs.vanilla.css.js +1 -0
  44. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/AspectRatio/AspectRatio.module.css.mjs.vanilla.css.js +1 -0
  45. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Avatar/Avatar.module.css.mjs.vanilla.css.js +1 -0
  46. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/BackgroundImage/BackgroundImage.module.css.mjs.vanilla.css.js +1 -0
  47. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Badge/Badge.module.css.mjs.vanilla.css.js +1 -0
  48. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Blockquote/Blockquote.module.css.mjs.vanilla.css.js +1 -0
  49. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Breadcrumbs/Breadcrumbs.module.css.mjs.vanilla.css.js +1 -0
  50. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Burger/Burger.module.css.mjs.vanilla.css.js +1 -0
  51. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Button/Button.module.css.mjs.vanilla.css.js +1 -0
  52. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Card/Card.module.css.mjs.vanilla.css.js +1 -0
  53. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Center/Center.module.css.mjs.vanilla.css.js +1 -0
  54. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Checkbox/Checkbox.module.css.mjs.vanilla.css.js +1 -0
  55. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Checkbox/CheckboxCard/CheckboxCard.module.css.mjs.vanilla.css.js +1 -0
  56. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Checkbox/CheckboxIndicator/CheckboxIndicator.module.css.mjs.vanilla.css.js +1 -0
  57. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Chip/Chip.module.css.mjs.vanilla.css.js +1 -0
  58. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/CloseButton/CloseButton.module.css.mjs.vanilla.css.js +1 -0
  59. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Code/Code.module.css.mjs.vanilla.css.js +1 -0
  60. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/ColorInput/ColorInput.module.css.mjs.vanilla.css.js +1 -0
  61. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/ColorPicker/ColorPicker.module.css.mjs.vanilla.css.js +1 -0
  62. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/ColorSwatch/ColorSwatch.module.css.mjs.vanilla.css.js +1 -0
  63. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Combobox/Combobox.module.css.mjs.vanilla.css.js +1 -0
  64. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Container/Container.module.css.mjs.vanilla.css.js +1 -0
  65. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Dialog/Dialog.module.css.mjs.vanilla.css.js +1 -0
  66. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Divider/Divider.module.css.mjs.vanilla.css.js +1 -0
  67. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Drawer/Drawer.module.css.mjs.vanilla.css.js +1 -0
  68. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Fieldset/Fieldset.module.css.mjs.vanilla.css.js +1 -0
  69. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Flex/Flex.module.css.mjs.vanilla.css.js +1 -0
  70. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/FloatingIndicator/FloatingIndicator.module.css.mjs.vanilla.css.js +1 -0
  71. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Grid/Grid.module.css.mjs.vanilla.css.js +1 -0
  72. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Group/Group.module.css.mjs.vanilla.css.js +1 -0
  73. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Image/Image.module.css.mjs.vanilla.css.js +1 -0
  74. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Indicator/Indicator.module.css.mjs.vanilla.css.js +1 -0
  75. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/InlineInput/InlineInput.module.css.mjs.vanilla.css.js +1 -0
  76. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Input/Input.module.css.mjs.vanilla.css.js +1 -0
  77. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Kbd/Kbd.module.css.mjs.vanilla.css.js +1 -0
  78. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/List/List.module.css.mjs.vanilla.css.js +1 -0
  79. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Loader/Loader.module.css.mjs.vanilla.css.js +1 -0
  80. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/LoadingOverlay/LoadingOverlay.module.css.mjs.vanilla.css.js +1 -0
  81. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Mark/Mark.module.css.mjs.vanilla.css.js +1 -0
  82. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Menu/Menu.module.css.mjs.vanilla.css.js +1 -0
  83. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Modal/Modal.module.css.mjs.vanilla.css.js +1 -0
  84. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/ModalBase/ModalBase.module.css.mjs.vanilla.css.js +1 -0
  85. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/NavLink/NavLink.module.css.mjs.vanilla.css.js +1 -0
  86. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Notification/Notification.module.css.mjs.vanilla.css.js +1 -0
  87. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/NumberInput/NumberInput.module.css.mjs.vanilla.css.js +1 -0
  88. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Overlay/Overlay.module.css.mjs.vanilla.css.js +1 -0
  89. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Pagination/Pagination.module.css.mjs.vanilla.css.js +1 -0
  90. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Paper/Paper.module.css.mjs.vanilla.css.js +1 -0
  91. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/PasswordInput/PasswordInput.module.css.mjs.vanilla.css.js +1 -0
  92. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Pill/Pill.module.css.mjs.vanilla.css.js +1 -0
  93. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/PillsInput/PillsInput.module.css.mjs.vanilla.css.js +1 -0
  94. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/PinInput/PinInput.module.css.mjs.vanilla.css.js +1 -0
  95. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Popover/Popover.module.css.mjs.vanilla.css.js +1 -0
  96. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Progress/Progress.module.css.mjs.vanilla.css.js +1 -0
  97. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Radio/Radio.module.css.mjs.vanilla.css.js +1 -0
  98. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Radio/RadioCard/RadioCard.module.css.mjs.vanilla.css.js +1 -0
  99. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Radio/RadioIndicator/RadioIndicator.module.css.mjs.vanilla.css.js +1 -0
  100. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Rating/Rating.module.css.mjs.vanilla.css.js +1 -0
  101. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/RingProgress/RingProgress.module.css.mjs.vanilla.css.js +1 -0
  102. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/ScrollArea/ScrollArea.module.css.mjs.vanilla.css.js +1 -0
  103. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/SegmentedControl/SegmentedControl.module.css.mjs.vanilla.css.js +1 -0
  104. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/SemiCircleProgress/SemiCircleProgress.module.css.mjs.vanilla.css.js +1 -0
  105. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/SimpleGrid/SimpleGrid.module.css.mjs.vanilla.css.js +1 -0
  106. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Skeleton/Skeleton.module.css.mjs.vanilla.css.js +1 -0
  107. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Slider/Slider.module.css.mjs.vanilla.css.js +1 -0
  108. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Spoiler/Spoiler.module.css.mjs.vanilla.css.js +1 -0
  109. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Stack/Stack.module.css.mjs.vanilla.css.js +1 -0
  110. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Stepper/Stepper.module.css.mjs.vanilla.css.js +1 -0
  111. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Switch/Switch.module.css.mjs.vanilla.css.js +1 -0
  112. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Table/Table.module.css.mjs.vanilla.css.js +1 -0
  113. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/TableOfContents/TableOfContents.module.css.mjs.vanilla.css.js +1 -0
  114. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Tabs/Tabs.module.css.mjs.vanilla.css.js +1 -0
  115. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Text/Text.module.css.mjs.vanilla.css.js +1 -0
  116. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/ThemeIcon/ThemeIcon.module.css.mjs.vanilla.css.js +1 -0
  117. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Timeline/Timeline.module.css.mjs.vanilla.css.js +1 -0
  118. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Title/Title.module.css.mjs.vanilla.css.js +1 -0
  119. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Tooltip/Tooltip.module.css.mjs.vanilla.css.js +1 -0
  120. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/Tree/Tree.module.css.mjs.vanilla.css.js +1 -0
  121. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/TypographyStylesProvider/TypographyStylesProvider.module.css.mjs.vanilla.css.js +1 -0
  122. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/UnstyledButton/UnstyledButton.module.css.mjs.vanilla.css.js +1 -0
  123. package/dist/node_modules/.pnpm/@mantine_core@7.17.0_@mantine_hooks@7.17.0_react@19.0.0__@types_react@19.0.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@mantine/core/esm/components/VisuallyHidden/VisuallyHidden.module.css.mjs.vanilla.css.js +1 -0
  124. package/dist/overlays/Overlays.d.ts +4 -1
  125. package/dist/overlays/Overlays.js +72 -60
  126. package/dist/overlays/element-details/ElementDetails.d.ts +6 -0
  127. package/dist/overlays/element-details/ElementDetails.js +31 -0
  128. package/dist/overlays/element-details/ElementDetailsCard.js +4 -9
  129. package/dist/overlays/element-details/TabPanelDeployments.js +1 -1
  130. package/dist/overlays/element-details/TabPanelRelationships.d.ts +3 -4
  131. package/dist/overlays/element-details/TabPanelRelationships.js +20 -20
  132. package/dist/overlays/element-details/actor.d.ts +20626 -0
  133. package/dist/overlays/element-details/actor.js +68 -0
  134. package/dist/overlays/element-details/actorContext.d.ts +7 -0
  135. package/dist/overlays/element-details/actorContext.js +14 -0
  136. package/dist/overlays/overlay/Overlay.css.js +87 -87
  137. package/dist/overlays/overlay/Overlay.js +16 -1
  138. package/dist/overlays/overlaysActor.d.ts +190 -0
  139. package/dist/overlays/overlaysActor.js +233 -0
  140. package/dist/overlays/relationship-details/actor.d.ts +130 -4
  141. package/dist/overlays/relationship-details/actor.js +2 -2
  142. package/dist/overlays/relationship-details/custom/edgeTypes.d.ts +1 -1
  143. package/dist/overlays/relationship-details/custom/nodeTypes.js +17 -0
  144. package/dist/overlays/relationships-browser/RelationshipsBrowser.js +17 -19
  145. package/dist/overlays/relationships-browser/actor.d.ts +1095 -8
  146. package/dist/overlays/relationships-browser/actor.js +181 -173
  147. package/dist/overlays/relationships-browser/custom/ElementActions.js +3 -2
  148. package/dist/overlays/relationships-browser/custom/edgeTypes.d.ts +1 -1
  149. package/dist/overlays/relationships-browser/custom/nodeTypes.js +17 -0
  150. package/dist/overlays/relationships-browser/hooks.d.ts +1 -1
  151. package/dist/overlays/relationships-browser/hooks.js +7 -5
  152. package/dist/overlays/types.d.ts +29 -0
  153. package/dist/{likec4diagram/DiagramActor.d.ts → state/DiagramActorProvider.d.ts} +2 -2
  154. package/dist/state/DiagramActorProvider.js +77 -0
  155. package/dist/{likec4diagram/state → state}/assign.d.ts +2 -2
  156. package/dist/{likec4diagram/state → state}/assign.js +2 -2
  157. package/dist/state/diagram-machine.d.ts +11680 -0
  158. package/dist/{likec4diagram/state/machine.js → state/diagram-machine.js} +105 -194
  159. package/dist/{likec4diagram/state → state}/hotkeyActor.d.ts +1 -1
  160. package/dist/state/hotkeyActor.js +26 -0
  161. package/dist/state/inspector.d.ts +4 -0
  162. package/dist/{likec4diagram/state → state}/syncManualLayoutActor.d.ts +7 -8
  163. package/dist/{likec4diagram/state → state}/syncManualLayoutActor.js +3 -5
  164. package/dist/state/types.d.ts +19 -0
  165. package/dist/state/utils.d.ts +17 -0
  166. package/dist/{likec4diagram/state → state}/utils.js +20 -1
  167. package/package.json +20 -24
  168. package/src/LikeC4Diagram.tsx +3 -5
  169. package/src/base/BaseXYFlow.tsx +2 -1
  170. package/src/base/primitives/compound/CompoundTitle.css.ts +0 -5
  171. package/src/context/DiagramEventHandlers.tsx +27 -13
  172. package/src/context/DiagramFeatures.tsx +8 -21
  173. package/src/hooks/index.ts +0 -1
  174. package/src/hooks/safeContext.tsx +16 -0
  175. package/src/hooks/useCurrentViewId.ts +2 -2
  176. package/src/hooks/useDiagram.ts +42 -15
  177. package/src/likec4diagram/DiagramUI.tsx +14 -11
  178. package/src/likec4diagram/XYFlow.tsx +4 -5
  179. package/src/likec4diagram/custom/edges/NotePopover.tsx +1 -2
  180. package/src/likec4diagram/custom/edges/RelationshipEdge.tsx +1 -1
  181. package/src/likec4diagram/custom/edges/RelationshipsDropdownMenu.tsx +6 -7
  182. package/src/likec4diagram/custom/nodes/toolbar/Toolbar.tsx +1 -1
  183. package/src/likec4diagram/ui/controls/ChangeAutoLayoutButton.tsx +2 -3
  184. package/src/likec4diagram/ui/controls/Controls.tsx +2 -4
  185. package/src/likec4diagram/ui/controls/NavigationButtons.tsx +1 -2
  186. package/src/likec4diagram/ui/controls/ToggleReadonly.tsx +2 -3
  187. package/src/likec4diagram/ui/diagram-title/DiagramTitlePanel.tsx +8 -11
  188. package/src/likec4diagram/ui/notation/NotationPanel.tsx +2 -3
  189. package/src/likec4diagram/ui/search/LikeC4Search.tsx +1 -4
  190. package/src/likec4diagram/ui/search/ViewsColum.tsx +1 -1
  191. package/src/likec4diagram/ui/search/state.ts +1 -1
  192. package/src/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.tsx +1 -2
  193. package/src/likec4diagram/useViewToNodesEdges.ts +0 -4
  194. package/src/overlays/Overlays.tsx +81 -71
  195. package/src/overlays/element-details/ElementDetails.tsx +33 -0
  196. package/src/overlays/element-details/ElementDetailsCard.tsx +8 -18
  197. package/src/overlays/element-details/TabPanelDeployments.tsx +1 -1
  198. package/src/overlays/element-details/TabPanelRelationships.tsx +33 -32
  199. package/src/overlays/element-details/actor.ts +102 -0
  200. package/src/overlays/element-details/actorContext.tsx +16 -0
  201. package/src/overlays/overlay/Overlay.tsx +14 -11
  202. package/src/overlays/overlaysActor.ts +278 -0
  203. package/src/overlays/relationship-details/actor.ts +8 -11
  204. package/src/overlays/relationship-details/custom/nodeTypes.tsx +18 -0
  205. package/src/overlays/relationships-browser/RelationshipsBrowser.tsx +23 -29
  206. package/src/overlays/relationships-browser/actor.ts +216 -220
  207. package/src/overlays/relationships-browser/custom/ElementActions.tsx +3 -2
  208. package/src/overlays/relationships-browser/custom/nodeTypes.tsx +20 -0
  209. package/src/overlays/relationships-browser/hooks.ts +7 -5
  210. package/src/overlays/types.ts +39 -0
  211. package/src/state/DiagramActorProvider.tsx +97 -0
  212. package/src/{likec4diagram/state → state}/assign.ts +4 -4
  213. package/src/{likec4diagram/state/machine.ts → state/diagram-machine.ts} +130 -205
  214. package/src/state/hotkeyActor.ts +29 -0
  215. package/src/state/inspector.ts +5 -0
  216. package/src/{likec4diagram/state → state}/syncManualLayoutActor.ts +8 -12
  217. package/src/state/types.ts +23 -0
  218. package/src/{likec4diagram/state → state}/utils.ts +24 -2
  219. package/dist/hooks/useDiagramActor.d.ts +0 -5
  220. package/dist/hooks/useDiagramActor.js +0 -21
  221. package/dist/hooks/useDiagramContext.d.ts +0 -3
  222. package/dist/hooks/useDiagramContext.js +0 -10
  223. package/dist/likec4diagram/DiagramActor.js +0 -82
  224. package/dist/likec4diagram/state/actorContext.d.ts +0 -52075
  225. package/dist/likec4diagram/state/actorContext.js +0 -12
  226. package/dist/likec4diagram/state/hotkeyActor.js +0 -18
  227. package/dist/likec4diagram/state/inspector.d.ts +0 -5
  228. package/dist/likec4diagram/state/machine.d.ts +0 -11025
  229. package/dist/likec4diagram/state/utils.d.ts +0 -8
  230. package/src/hooks/useDiagramActor.ts +0 -27
  231. package/src/hooks/useDiagramContext.ts +0 -14
  232. package/src/likec4diagram/DiagramActor.tsx +0 -92
  233. package/src/likec4diagram/state/actorContext.ts +0 -8
  234. package/src/likec4diagram/state/hotkeyActor.ts +0 -20
  235. package/src/likec4diagram/state/inspector.ts +0 -23
  236. /package/dist/{likec4diagram/state → state}/aligners.d.ts +0 -0
  237. /package/dist/{likec4diagram/state → state}/aligners.js +0 -0
  238. /package/src/{likec4diagram/state → state}/aligners.ts +0 -0
@@ -0,0 +1,278 @@
1
+ import type { Fqn } from '@likec4/core'
2
+ import { getHotkeyHandler } from '@mantine/hooks'
3
+ import { isString, last, reverse } from 'remeda'
4
+ import {
5
+ type ActorLogicFrom,
6
+ type ActorRefFrom,
7
+ type SnapshotFrom,
8
+ assertEvent,
9
+ assign,
10
+ enqueueActions,
11
+ fromCallback,
12
+ setup,
13
+ spawnChild,
14
+ stopChild,
15
+ } from 'xstate'
16
+ import { elementDetailsLogic } from './element-details/actor'
17
+ import { relationshipDetailsLogic } from './relationship-details/actor'
18
+ import { relationshipsBrowserLogic } from './relationships-browser/actor'
19
+ import type { Overlays } from './types'
20
+
21
+ export type OverlayActorEvent =
22
+ | { type: 'open.elementDetails' } & Overlays.ElementDetails.Input
23
+ | { type: 'open.relationshipDetails' } & Overlays.RelationshipDetails.Input
24
+ | { type: 'open.relationshipsBrowser' } & Overlays.RelationshipsBrowser.Input
25
+ | { type: 'close'; actorId?: string | undefined } // Close last overlay if actorId is not provided
26
+ | { type: 'close.all' }
27
+
28
+ export interface OverlaysContext {
29
+ seq: number
30
+ overlays: Array<
31
+ | { type: 'elementDetails'; id: `elementDetails-${number}`; subject: Fqn }
32
+ | { type: 'relationshipDetails'; id: `relationshipDetails-${number}` }
33
+ | { type: 'relationshipsBrowser'; id: `relationshipsBrowser-${number}`; subject: Fqn }
34
+ >
35
+ }
36
+
37
+ export type OverlayActorEmitedEvent =
38
+ | { type: 'opened'; overlay: 'elementDetails' | 'relationshipsBrowser' | 'relationshipDetails' }
39
+ | { type: 'closed'; overlay: 'elementDetails' | 'relationshipsBrowser' | 'relationshipDetails' }
40
+ | { type: 'idle' }
41
+
42
+ type HotKeyEvent = { type: 'close' }
43
+ // TODO: naming convention for actors
44
+ const hotkeyLogic = fromCallback(({ sendBack }: {
45
+ sendBack: (event: HotKeyEvent) => void
46
+ }) => {
47
+ const handler = getHotkeyHandler([
48
+ ['Escape', () => sendBack({ type: 'close' }), {
49
+ preventDefault: true,
50
+ }],
51
+ ])
52
+ document.body.addEventListener('keydown', handler, { capture: true })
53
+ return () => {
54
+ document.body.removeEventListener('keydown', handler, { capture: true })
55
+ }
56
+ })
57
+
58
+ export const overlaysActorLogic = setup({
59
+ types: {
60
+ context: {} as OverlaysContext,
61
+ events: {} as OverlayActorEvent,
62
+ emitted: {} as OverlayActorEmitedEvent,
63
+ children: {} as {
64
+ hotkey: 'hotkey'
65
+ [key: `elementDetails-${number}`]: 'elementDetails'
66
+ [key: `relationshipDetails-${number}`]: 'relationshipDetails'
67
+ [key: `relationshipsBrowser-${number}`]: 'relationshipsBrowser'
68
+ },
69
+ },
70
+ actors: {
71
+ relationshipDetails: relationshipDetailsLogic as Overlays.RelationshipDetails.Logic,
72
+ elementDetails: elementDetailsLogic as Overlays.ElementDetails.Logic,
73
+ relationshipsBrowser: relationshipsBrowserLogic as Overlays.RelationshipsBrowser.Logic,
74
+ hotkey: hotkeyLogic,
75
+ },
76
+ actions: {
77
+ 'closeLastOverlay': enqueueActions(({ context, enqueue }) => {
78
+ if (context.overlays.length === 0) {
79
+ return
80
+ }
81
+ const lastOverlay = last(context.overlays)?.id
82
+ if (!lastOverlay) {
83
+ return
84
+ }
85
+ enqueue.sendTo(lastOverlay, { type: 'close' })
86
+ enqueue.stopChild(lastOverlay)
87
+ enqueue.assign({
88
+ overlays: context.overlays.filter(o => o.id !== lastOverlay),
89
+ })
90
+ }),
91
+ 'closeSpecificOverlay': enqueueActions(({ context, enqueue }, params: { actorId: string }) => {
92
+ const toClose = context.overlays.find(o => o.id === params.actorId)?.id
93
+ if (toClose) {
94
+ enqueue.sendTo(toClose, { type: 'close' })
95
+ enqueue.stopChild(toClose)
96
+ enqueue.assign({
97
+ overlays: context.overlays.filter(o => o.id !== toClose),
98
+ })
99
+ }
100
+ }),
101
+ 'closeAllOverlays': enqueueActions(({ context, enqueue }) => {
102
+ for (const { id } of reverse(context.overlays)) {
103
+ enqueue.sendTo(id, { type: 'close' })
104
+ enqueue.stopChild(id)
105
+ }
106
+
107
+ enqueue.assign({ overlays: [] })
108
+ }),
109
+ 'openElementDetails': enqueueActions(({ context, enqueue, event }) => {
110
+ assertEvent(event, 'open.elementDetails')
111
+ if (context.overlays.some(o => o.type === 'elementDetails' && o.subject === event.subject)) {
112
+ return
113
+ }
114
+ const id = `elementDetails-${context.seq}` as const
115
+ enqueue.spawnChild('elementDetails', {
116
+ id,
117
+ input: event,
118
+ })
119
+ enqueue.assign({
120
+ seq: context.seq + 1,
121
+ overlays: [
122
+ ...context.overlays,
123
+ {
124
+ type: 'elementDetails' as const,
125
+ id,
126
+ subject: event.subject,
127
+ },
128
+ ],
129
+ })
130
+ }),
131
+ 'openRelationshipDetails': enqueueActions(({ context, enqueue, event }) => {
132
+ assertEvent(event, 'open.relationshipDetails')
133
+ const currentOverlay = last(context.overlays)
134
+ if (currentOverlay?.type === 'relationshipDetails') {
135
+ enqueue.sendTo(currentOverlay.id, {
136
+ type: 'navigate.to',
137
+ edgeId: event.edgeId,
138
+ })
139
+ return
140
+ }
141
+ const id = `relationshipDetails-${context.seq}` as const
142
+ enqueue.spawnChild('relationshipDetails', {
143
+ id,
144
+ input: event,
145
+ })
146
+ enqueue.assign({
147
+ seq: context.seq + 1,
148
+ overlays: [
149
+ ...context.overlays,
150
+ {
151
+ type: 'relationshipDetails' as const,
152
+ id,
153
+ },
154
+ ],
155
+ })
156
+ }),
157
+ 'openRelationshipsBrowser': enqueueActions(({ context, enqueue, event }) => {
158
+ assertEvent(event, 'open.relationshipsBrowser')
159
+ const currentOverlay = last(context.overlays)
160
+ if (currentOverlay?.type === 'relationshipsBrowser') {
161
+ enqueue.sendTo(currentOverlay.id, {
162
+ type: 'navigate.to',
163
+ subject: event.subject,
164
+ })
165
+ return
166
+ }
167
+ const id = `relationshipsBrowser-${context.seq}` as const
168
+ enqueue.spawnChild('relationshipsBrowser', {
169
+ id,
170
+ input: event,
171
+ })
172
+ enqueue.assign({
173
+ seq: context.seq + 1,
174
+ overlays: [
175
+ ...context.overlays,
176
+ {
177
+ type: 'relationshipsBrowser' as const,
178
+ id,
179
+ subject: event.subject,
180
+ },
181
+ ],
182
+ })
183
+ }),
184
+ 'listenToEsc': spawnChild('hotkey', {
185
+ id: 'hotkey',
186
+ }),
187
+ 'stopListeningToEsc': stopChild('hotkey'),
188
+ },
189
+ guards: {
190
+ 'has overlays?': ({ context }) => context.overlays.length > 0,
191
+ 'close specific overlay?': ({ context, event }) => {
192
+ assertEvent(event, 'close')
193
+ return isString(event.actorId) && context.overlays.some(o => o.id === event.actorId)
194
+ },
195
+ 'last: is relationshipDetails?': ({ context }) => {
196
+ const lastOverlay = last(context.overlays)
197
+ return lastOverlay?.type === 'relationshipDetails'
198
+ },
199
+ 'last: is relationshipsBrowser?': ({ context }) => {
200
+ const lastOverlay = last(context.overlays)
201
+ return lastOverlay?.type === 'relationshipsBrowser'
202
+ },
203
+ },
204
+ }).createMachine({
205
+ id: 'overlays',
206
+ context: () => ({
207
+ seq: 1,
208
+ overlays: [],
209
+ }),
210
+ initial: 'idle',
211
+ on: {
212
+ 'open.elementDetails': {
213
+ actions: 'openElementDetails',
214
+ target: '.active',
215
+ reenter: false,
216
+ },
217
+ 'open.relationshipDetails': {
218
+ actions: 'openRelationshipDetails',
219
+ target: '.active',
220
+ reenter: false,
221
+ },
222
+ 'open.relationshipsBrowser': {
223
+ actions: 'openRelationshipsBrowser',
224
+ target: '.active',
225
+ reenter: false,
226
+ },
227
+ },
228
+ states: {
229
+ idle: {},
230
+ active: {
231
+ entry: 'listenToEsc',
232
+ exit: 'stopListeningToEsc',
233
+ on: {
234
+ 'close': [
235
+ {
236
+ guard: 'close specific overlay?',
237
+ actions: {
238
+ type: 'closeSpecificOverlay',
239
+ params: ({ event }) => ({ actorId: event.actorId! }),
240
+ },
241
+ target: 'closing',
242
+ },
243
+ {
244
+ actions: 'closeLastOverlay',
245
+ target: 'closing',
246
+ },
247
+ ],
248
+ 'close.all': {
249
+ actions: [
250
+ 'closeAllOverlays',
251
+ 'stopListeningToEsc',
252
+ ],
253
+ target: 'idle',
254
+ },
255
+ },
256
+ },
257
+ closing: {
258
+ always: [
259
+ {
260
+ guard: 'has overlays?',
261
+ target: 'active',
262
+ },
263
+ {
264
+ actions: 'stopListeningToEsc',
265
+ target: 'idle',
266
+ },
267
+ ],
268
+ },
269
+ },
270
+ exit: [
271
+ 'stopListeningToEsc',
272
+ 'closeAllOverlays',
273
+ ],
274
+ })
275
+
276
+ export interface OverlaysActorLogic extends ActorLogicFrom<typeof overlaysActorLogic> {}
277
+ export type OverlaysActorSnapshot = SnapshotFrom<OverlaysActorLogic>
278
+ export interface OverlaysActorRef extends ActorRefFrom<OverlaysActorLogic> {}
@@ -5,6 +5,7 @@ import {
5
5
  import { prop } from 'remeda'
6
6
  import {
7
7
  type ActorLogic,
8
+ type ActorLogicFrom,
8
9
  type ActorRefFromLogic,
9
10
  type MachineSnapshot,
10
11
  type SnapshotFrom,
@@ -21,7 +22,7 @@ type XYFLowInstance = ReactFlowInstance<RelationshipDetailsTypes.Node, Relations
21
22
  export type Input = {
22
23
  edgeId: EdgeId
23
24
  view: DiagramView
24
- // scope?: DiagramView | null
25
+ // view: DiagramView | null
25
26
  // parentRef?: AnyActorRef| null
26
27
  }
27
28
 
@@ -45,7 +46,7 @@ export type Events =
45
46
  | { type: 'navigate.to'; edgeId: EdgeId }
46
47
  | { type: 'close' }
47
48
 
48
- export const relationshipDetailsActor = setup({
49
+ export const relationshipDetailsLogic = setup({
49
50
  types: {
50
51
  context: {} as Context,
51
52
  input: {} as Input,
@@ -149,14 +150,10 @@ export const relationshipDetailsActor = setup({
149
150
  ],
150
151
  },
151
152
  },
152
- }) as unknown as ActorLogic<
153
- MachineSnapshot<Context, Events, any, 'opening' | 'active' | 'closed', any, any, any, any>,
154
- Events,
155
- Input,
156
- any,
157
- any
158
- > // TODO reduce type inference by forcing the types
153
+ })
159
154
 
160
- export type RelationshipDetailsLogic = typeof relationshipDetailsActor
161
- export type RelationshipDetailsActorRef = ActorRefFromLogic<typeof relationshipDetailsActor>
155
+ export interface RelationshipDetailsLogic extends ActorLogicFrom<typeof relationshipDetailsLogic> {
156
+ }
157
+ export interface RelationshipDetailsActorRef extends ActorRefFromLogic<RelationshipDetailsLogic> {
158
+ }
162
159
  export type RelationshipDetailsSnapshot = SnapshotFrom<RelationshipDetailsActorRef>
@@ -2,6 +2,7 @@ import {
2
2
  CompoundNodeContainer,
3
3
  CompoundTitle,
4
4
  customNode,
5
+ ElementDetailsButton,
5
6
  ElementNodeContainer,
6
7
  ElementShape,
7
8
  ElementTitle,
@@ -11,14 +12,30 @@ import { ElementActions } from './ElementActions'
11
12
  import { Handle } from '@xyflow/react'
12
13
  import { Position } from '@xyflow/system'
13
14
  import type { NodeProps } from '../../../base'
15
+ import { useDiagram } from '../../../hooks/useDiagram'
14
16
  import type { RelationshipDetailsTypes } from '../_types'
15
17
 
18
+ const ElementDetailsButtonWithHandler = (props: NodeProps<RelationshipDetailsTypes.NodeData>) => {
19
+ const diagram = useDiagram()
20
+
21
+ return (
22
+ <ElementDetailsButton
23
+ {...props}
24
+ onClick={e => {
25
+ e.stopPropagation()
26
+ diagram.openElementDetails(props.data.fqn)
27
+ }}
28
+ />
29
+ )
30
+ }
31
+
16
32
  export const nodeTypes = {
17
33
  element: customNode<RelationshipDetailsTypes.ElementNodeData>((props) => {
18
34
  return (
19
35
  <ElementNodeContainer nodeProps={props}>
20
36
  <ElementShape {...props} />
21
37
  <ElementTitle {...props} iconSize={40} />
38
+ <ElementDetailsButtonWithHandler {...props} />
22
39
  <ElementActions {...props} />
23
40
  <ElementPorts {...props} />
24
41
  </ElementNodeContainer>
@@ -28,6 +45,7 @@ export const nodeTypes = {
28
45
  compound: customNode<RelationshipDetailsTypes.CompoundNodeData>((props) => {
29
46
  return (
30
47
  <CompoundNodeContainer nodeProps={props}>
48
+ <ElementDetailsButtonWithHandler {...props} />
31
49
  <CompoundTitle {...props} />
32
50
  <CompoundPorts {...props} />
33
51
  </CompoundNodeContainer>
@@ -2,10 +2,10 @@ import type { Fqn } from '@likec4/core'
2
2
  import { ActionIcon, Box, Group } from '@mantine/core'
3
3
  import { useCallbackRef, useStateHistory } from '@mantine/hooks'
4
4
  import { IconChevronLeft, IconChevronRight, IconX } from '@tabler/icons-react'
5
- import { Panel, ReactFlowProvider, useStoreApi } from '@xyflow/react'
5
+ import { Panel, ReactFlowProvider, useReactFlow, useStoreApi } from '@xyflow/react'
6
6
  import clsx from 'clsx'
7
7
  import { shallowEqual } from 'fast-equals'
8
- import { AnimatePresence, LayoutGroup, m } from 'framer-motion'
8
+ import { AnimatePresence, LayoutGroup, m, useUnmountEffect } from 'framer-motion'
9
9
  import { memo, useEffect, useId, useRef } from 'react'
10
10
  import type { SnapshotFrom } from 'xstate'
11
11
  import { BaseXYFlow } from '../../base/BaseXYFlow'
@@ -18,6 +18,7 @@ import { nodeTypes } from './custom/nodeTypes'
18
18
  import {
19
19
  RelationshipsBrowserActorContext,
20
20
  useRelationshipsBrowser,
21
+ useRelationshipsBrowserActor,
21
22
  useRelationshipsBrowserState,
22
23
  } from './hooks'
23
24
  import { SelectElement } from './SelectElement'
@@ -26,53 +27,48 @@ export type RelationshipsBrowserProps = {
26
27
  actorRef: RelationshipsBrowserActorRef
27
28
  }
28
29
  export function RelationshipsBrowser({ actorRef }: RelationshipsBrowserProps) {
29
- const id = useId()
30
30
  // const actorRef = useDiagramActorState(s => s.children.relationshipsBrowser)
31
31
  // if (actorRef == null) {
32
32
  // return null
33
33
  // }
34
34
  const initialRef = useRef<{
35
- initialNodes: Types.Node[]
36
- initialEdges: Types.Edge[]
35
+ defaultNodes: Types.Node[]
36
+ defaultEdges: Types.Edge[]
37
37
  }>(null)
38
38
 
39
39
  if (initialRef.current == null) {
40
40
  initialRef.current = {
41
- initialNodes: [],
42
- initialEdges: [],
41
+ defaultNodes: [],
42
+ defaultEdges: [],
43
43
  }
44
44
  }
45
45
 
46
46
  return (
47
47
  <RelationshipsBrowserActorContext.Provider value={actorRef}>
48
48
  <ReactFlowProvider {...initialRef.current}>
49
- <AnimatePresence>
50
- <LayoutGroup id={id}>
49
+ <LayoutGroup id={actorRef.sessionId} inherit={false}>
50
+ <AnimatePresence>
51
51
  <RelationshipsBrowserXYFlow />
52
- </LayoutGroup>
53
- </AnimatePresence>
52
+ </AnimatePresence>
53
+ </LayoutGroup>
54
54
  </ReactFlowProvider>
55
55
  </RelationshipsBrowserActorContext.Provider>
56
56
  )
57
57
  }
58
58
 
59
59
  const selector = (state: SnapshotFrom<RelationshipsBrowserActorRef>) => ({
60
- initialized: state.context.initialized,
61
60
  isActive: state.hasTag('active'),
62
61
  nodes: state.context.xynodes,
63
62
  edges: state.context.xyedges,
64
63
  })
65
64
  const selectorEq = (a: ReturnType<typeof selector>, b: ReturnType<typeof selector>) =>
66
- a.initialized === b.initialized &&
67
65
  a.isActive === b.isActive &&
68
66
  shallowEqual(a.nodes, b.nodes) &&
69
67
  shallowEqual(a.edges, b.edges)
70
68
 
71
69
  const RelationshipsBrowserXYFlow = memo(() => {
72
- const xystore = useStoreApi<RelationshipsBrowserTypes.Node, RelationshipsBrowserTypes.Edge>()
73
70
  const browser = useRelationshipsBrowser()
74
71
  const {
75
- initialized,
76
72
  isActive,
77
73
  nodes,
78
74
  edges,
@@ -81,24 +77,15 @@ const RelationshipsBrowserXYFlow = memo(() => {
81
77
  selectorEq,
82
78
  )
83
79
 
84
- // useLifecycleLogger('RelationshipsBrowserXYFlow.browser', [browser])
85
- // useLifecycleLogger('RelationshipsBrowserXYFlow.xystore', [xystore])
86
- // useLifecycleLogger('RelationshipsBrowserXYFlow.initialized, isActive', [initialized, isActive])
87
- // useLifecycleLogger('RelationshipsBrowserXYFlow.nodes', [nodes])
88
- // useLifecycleLogger('RelationshipsBrowserXYFlow.edges', [edges])
89
-
90
80
  return (
91
81
  <BaseXYFlow<Types.Node, Types.Edge>
92
- id="relationships-browser"
82
+ id={`relationships-browser-${browser.actor.sessionId}`}
93
83
  nodes={nodes}
94
84
  edges={edges}
95
- className={clsx(initialized && isActive ? 'initialized' : 'not-initialized')}
85
+ className={clsx(isActive ? 'initialized' : 'not-initialized')}
96
86
  nodeTypes={nodeTypes}
97
87
  edgeTypes={edgeTypes}
98
88
  fitViewPadding={ViewPadding}
99
- onInit={useCallbackRef((instance) => {
100
- browser.send({ type: 'xyflow.init', instance, store: xystore })
101
- })}
102
89
  onNodeClick={useCallbackRef((e, node) => {
103
90
  e.stopPropagation()
104
91
  browser.send({ type: 'xyflow.nodeClick', node })
@@ -129,7 +116,7 @@ const RelationshipsBrowserXYFlow = memo(() => {
129
116
  pannable
130
117
  zoomable
131
118
  >
132
- {initialized && <RelationshipsBrowserInner />}
119
+ <RelationshipsBrowserInner />
133
120
  </BaseXYFlow>
134
121
  )
135
122
  })
@@ -148,6 +135,13 @@ const RelationshipsBrowserInner = memo(() => {
148
135
  enableNavigationMenu,
149
136
  } = useRelationshipsBrowserState(selector2)
150
137
 
138
+ const store = useStoreApi<RelationshipsBrowserTypes.Node, RelationshipsBrowserTypes.Edge>()
139
+ const instance = useReactFlow<RelationshipsBrowserTypes.Node, RelationshipsBrowserTypes.Edge>()
140
+
141
+ useEffect(() => {
142
+ browser.send({ type: 'xyflow.init', instance, store })
143
+ }, [store, instance, browser])
144
+
151
145
  const layouted = useRelationshipsView(subjectId)
152
146
  const [historySubjectId, historyOps, { history, current }] = useStateHistory(subjectId)
153
147
 
@@ -161,11 +155,11 @@ const RelationshipsBrowserInner = memo(() => {
161
155
  if (historySubjectId !== subjectId) {
162
156
  browser.navigateTo(historySubjectId)
163
157
  }
164
- }, [historySubjectId])
158
+ }, [historySubjectId, browser])
165
159
 
166
160
  useEffect(() => {
167
161
  browser.send({ type: 'update.view', layouted })
168
- }, [layouted])
162
+ }, [layouted, browser])
169
163
 
170
164
  const hasStepBack = current > 0
171
165
  const hasStepForward = current + 1 < history.length