@likec4/diagram 1.31.0 → 1.32.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.
- package/bundle/{chunk-BBzMXzCg.js → chunk-BvTQaUYl.js} +1675 -1207
- package/bundle/custom.js +50 -47
- package/bundle/index.js +2482 -2438
- package/dist/LikeC4CustomColors.d.ts +2 -7
- package/dist/LikeC4CustomColors.js +17 -6
- package/dist/LikeC4Diagram.d.ts +3 -2
- package/dist/LikeC4Diagram.js +10 -14
- package/dist/LikeC4Diagram.props.d.ts +28 -22
- package/dist/LikeC4ModelProvider.d.ts +5 -4
- package/dist/StaticLikeC4Diagram.d.ts +3 -2
- package/dist/StaticLikeC4Diagram.js +2 -2
- package/dist/base/BaseXYFlow.js +5 -5
- package/dist/base/const.d.ts +1 -1
- package/dist/base/const.js +1 -1
- package/dist/base/index.d.ts +2 -1
- package/dist/base/primitives/compound/CompoundActionButton.js +2 -1
- package/dist/base/primitives/compound/CompoundDetailsButton.js +2 -1
- package/dist/base/primitives/compound/CompoundTitle.d.ts +1 -1
- package/dist/base/primitives/compound/CompoundTitle.js +2 -1
- package/dist/base/primitives/edge/EdgeContainer.d.ts +1 -1
- package/dist/base/primitives/edge/EdgeLabel.css.js +1 -0
- package/dist/base/primitives/edge/EdgeLabel.d.ts +3 -3
- package/dist/base/primitives/edge/EdgeLabel.js +6 -4
- package/dist/base/primitives/edge/EdgeLabelContainer.d.ts +1 -1
- package/dist/base/primitives/edge/EdgeMarkers.d.ts +1 -1
- package/dist/base/primitives/edge/EdgePath.d.ts +1 -1
- package/dist/base/primitives/element/ElementActionButtons.js +10 -9
- package/dist/base/primitives/element/ElementDetailsButton.js +2 -1
- package/dist/base/primitives/element/ElementShape.d.ts +1 -1
- package/dist/base/primitives/element/ElementTags.d.ts +14 -0
- package/dist/base/primitives/element/ElementTags.js +176 -0
- package/dist/base/primitives/element/ElementTitle.d.ts +5 -4
- package/dist/base/primitives/element/ElementTitle.js +6 -6
- package/dist/base/primitives/index.d.ts +1 -0
- package/dist/base/types.Base.d.ts +54 -0
- package/dist/base/types.Base.js +48 -0
- package/dist/base/types.d.ts +2 -52
- package/dist/bundle/LikeC4View.d.ts +2 -1
- package/dist/bundle/LikeC4View.js +8 -6
- package/dist/bundle/LikeC4View.props.d.ts +15 -4
- package/dist/bundle/ReactLikeC4.d.ts +4 -7
- package/dist/bundle/ReactLikeC4.js +3 -2
- package/dist/bundle/index.js +1 -1
- package/dist/components/ErrorFallback.d.ts +2 -0
- package/dist/components/ErrorFallback.js +29 -0
- package/dist/context/DiagramEventHandlers.d.ts +6 -5
- package/dist/context/DiagramFeatures.d.ts +2 -2
- package/dist/context/DiagramFeatures.js +3 -31
- package/dist/context/EnsureMantine.js +1 -1
- package/dist/context/IconRenderer.js +1 -4
- package/dist/context/RootContainer.js +5 -1
- package/dist/context/TagStylesContext.d.ts +7 -0
- package/dist/context/TagStylesContext.js +85 -0
- package/dist/custom/components.d.ts +1 -1
- package/dist/custom/customNodes.d.ts +27 -17
- package/dist/custom/hooks.d.ts +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/useDiagram.d.ts +73 -38
- package/dist/hooks/useDiagram.js +7 -3
- package/dist/hooks/useMantinePortalProps.d.ts +2 -2
- package/dist/hooks/useSearchActor.d.ts +2 -0
- package/dist/hooks/useSearchActor.js +10 -0
- package/dist/hooks/useUpdateEffect.js +3 -0
- package/dist/hooks/useXYFlow.d.ts +39 -37
- package/dist/hooks/useXYFlow.js +5 -1
- package/dist/index.js +1 -1
- package/dist/likec4diagram/DiagramUI.js +7 -2
- package/dist/likec4diagram/DiagramXYFlow.d.ts +4 -3
- package/dist/likec4diagram/DiagramXYFlow.js +104 -107
- package/dist/likec4diagram/custom/edges/RelationshipEdge.d.ts +7 -6
- package/dist/likec4diagram/custom/edges/RelationshipEdge.js +8 -0
- package/dist/likec4diagram/custom/edges/RelationshipsDropdownMenu.js +7 -5
- package/dist/likec4diagram/custom/index.d.ts +7 -6
- package/dist/likec4diagram/custom/nodes/nodes.js +39 -26
- package/dist/likec4diagram/custom/nodes/toolbar/_shared.d.ts +3 -3
- package/dist/likec4diagram/types.d.ts +5 -5
- package/dist/likec4diagram/ui/controls/Controls.js +12 -4
- package/dist/likec4diagram/ui/notation/NotationPanel.js +1 -1
- package/dist/likec4diagram/useViewToNodesEdges.d.ts +5 -3
- package/dist/likec4diagram/useViewToNodesEdges.js +20 -30
- package/dist/likec4model/LikeC4ModelContext.d.ts +2 -2
- package/dist/likec4model/useLikeC4ElementsTree.js +1 -1
- package/dist/likec4model/useLikeC4Model.d.ts +22 -10
- package/dist/likec4model/useLikeC4Model.js +11 -7
- package/dist/overlays/Overlays.js +4 -27
- package/dist/overlays/element-details/ElementDetailsCard.d.ts +1 -1
- package/dist/overlays/element-details/ElementDetailsCard.js +19 -12
- package/dist/overlays/element-details/TabPanelDeployments.d.ts +1 -1
- package/dist/overlays/element-details/TabPanelDeployments.js +1 -1
- package/dist/overlays/element-details/TabPanelRelationships.d.ts +1 -1
- package/dist/overlays/element-details/TabPanelStructure.d.ts +1 -1
- package/dist/overlays/element-details/actor.d.ts +288 -286
- package/dist/overlays/overlay/Overlay.css.d.ts +57 -2
- package/dist/overlays/overlay/Overlay.css.js +76 -39
- package/dist/overlays/overlay/Overlay.d.ts +12 -0
- package/dist/overlays/overlay/Overlay.js +36 -25
- package/dist/overlays/overlaysActor.d.ts +1 -1
- package/dist/overlays/relationship-details/RelationshipDetails.d.ts +3 -2
- package/dist/overlays/relationship-details/RelationshipDetails.js +3 -3
- package/dist/overlays/relationship-details/_types.d.ts +2 -2
- package/dist/overlays/relationship-details/actor.js +7 -7
- package/dist/overlays/relationship-details/custom/edgeTypes.d.ts +3 -2
- package/dist/overlays/relationship-details/custom/nodeTypes.js +4 -0
- package/dist/overlays/relationship-details/hooks.d.ts +10 -9
- package/dist/overlays/relationship-details/layout-to-xyflow.js +1 -0
- package/dist/overlays/relationship-details/layout.js +3 -1
- package/dist/overlays/relationships-browser/RelationshipsBrowser.d.ts +3 -2
- package/dist/overlays/relationships-browser/SelectElement.js +1 -1
- package/dist/overlays/relationships-browser/_types.d.ts +2 -2
- package/dist/overlays/relationships-browser/actor.d.ts +1 -1
- package/dist/overlays/relationships-browser/actor.js +7 -7
- package/dist/overlays/relationships-browser/custom/edgeTypes.d.ts +3 -2
- package/dist/overlays/relationships-browser/custom/nodeTypes.d.ts +8 -5
- package/dist/overlays/relationships-browser/custom/nodeTypes.js +4 -0
- package/dist/overlays/relationships-browser/layout.d.ts +2 -2
- package/dist/overlays/relationships-browser/layout.js +10 -6
- package/dist/overlays/relationships-browser/useViewToNodesEdges.js +4 -3
- package/dist/search/Search.d.ts +5 -0
- package/dist/search/Search.js +192 -0
- package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.css.js +0 -1
- package/dist/search/components/ElementsColumn.d.ts +2 -0
- package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.js +21 -19
- package/dist/search/components/PickView.d.ts +4 -0
- package/dist/search/components/PickView.js +135 -0
- package/dist/search/components/SearchByTags.d.ts +1 -0
- package/dist/search/components/SearchByTags.js +116 -0
- package/dist/search/components/SearchInput.d.ts +2 -0
- package/dist/{likec4diagram/ui/search → search/components}/SearchInput.js +53 -34
- package/dist/{likec4diagram/ui/search → search/components}/ViewsColum.d.ts +3 -2
- package/dist/{likec4diagram/ui/search → search/components}/ViewsColum.js +14 -13
- package/dist/{likec4diagram/ui/search → search/components}/_shared.css.js +26 -35
- package/dist/{likec4diagram/ui/search/LikeC4Search.css.d.ts → search/components/styles.css.d.ts} +0 -2
- package/dist/search/components/styles.css.js +60 -0
- package/dist/{likec4diagram/ui/search → search/components}/utils.d.ts +1 -0
- package/dist/{likec4diagram/ui/search → search/components}/utils.js +7 -1
- package/dist/search/hooks.d.ts +16 -0
- package/dist/search/hooks.js +35 -0
- package/dist/search/searchActor.d.ts +90 -0
- package/dist/search/searchActor.js +75 -0
- package/dist/state/DiagramActorProvider.d.ts +9 -7
- package/dist/state/DiagramActorProvider.js +24 -18
- package/dist/state/assign.d.ts +0 -1
- package/dist/state/assign.js +9 -19
- package/dist/state/diagram-machine.d.ts +430 -176
- package/dist/state/diagram-machine.js +119 -54
- package/dist/state/syncManualLayoutActor.d.ts +2 -2
- package/dist/state/types.d.ts +2 -0
- package/dist/state/utils.d.ts +2 -0
- package/dist/state/utils.js +3 -0
- package/dist/styles-min.css +1 -1
- package/dist/styles-xyflow.css +1 -1
- package/dist/styles.css +1 -1
- package/dist/styles.css2.js +1 -1
- package/package.json +18 -18
- package/panda.buildinfo.json +171 -148
- package/src/LikeC4CustomColors.tsx +21 -6
- package/src/LikeC4Diagram.props.ts +35 -30
- package/src/LikeC4Diagram.tsx +19 -20
- package/src/LikeC4ModelProvider.tsx +6 -5
- package/src/StaticLikeC4Diagram.tsx +8 -6
- package/src/base/const.ts +1 -1
- package/src/base/index.ts +2 -1
- package/src/base/primitives/compound/CompoundActionButton.tsx +2 -1
- package/src/base/primitives/compound/CompoundDetailsButton.tsx +2 -1
- package/src/base/primitives/compound/CompoundTitle.tsx +3 -2
- package/src/base/primitives/edge/EdgeContainer.tsx +2 -1
- package/src/base/primitives/edge/EdgeLabel.css.ts +1 -0
- package/src/base/primitives/edge/EdgeLabel.tsx +20 -15
- package/src/base/primitives/edge/EdgeLabelContainer.tsx +1 -1
- package/src/base/primitives/edge/EdgeMarkers.tsx +2 -1
- package/src/base/primitives/edge/EdgePath.tsx +1 -1
- package/src/base/primitives/element/ElementActionButtons.tsx +11 -10
- package/src/base/primitives/element/ElementDetailsButton.tsx +2 -1
- package/src/base/primitives/element/ElementShape.tsx +2 -1
- package/src/base/primitives/element/ElementTags.tsx +182 -0
- package/src/base/primitives/element/ElementTitle.tsx +21 -15
- package/src/base/primitives/index.ts +1 -0
- package/src/base/types.Base.ts +104 -0
- package/src/base/types.ts +2 -99
- package/src/bundle/LikeC4View.props.ts +17 -4
- package/src/bundle/LikeC4View.tsx +17 -19
- package/src/bundle/ReactLikeC4.tsx +14 -26
- package/src/components/ErrorFallback.tsx +30 -0
- package/src/context/DiagramEventHandlers.tsx +5 -4
- package/src/context/DiagramFeatures.tsx +3 -22
- package/src/context/EnsureMantine.tsx +1 -1
- package/src/context/IconRenderer.tsx +1 -4
- package/src/context/RootContainer.tsx +9 -3
- package/src/context/TagStylesContext.tsx +96 -0
- package/src/custom/components.ts +2 -0
- package/src/custom/customNodes.tsx +24 -14
- package/src/custom/hooks.ts +1 -0
- package/src/hooks/index.ts +1 -1
- package/src/hooks/useCurrentViewId.ts +1 -4
- package/src/hooks/useDiagram.ts +104 -12
- package/src/hooks/useMantinePortalProps.ts +10 -1
- package/src/hooks/useSearchActor.ts +11 -0
- package/src/hooks/useUpdateEffect.ts +7 -4
- package/src/hooks/useXYFlow.ts +5 -0
- package/src/likec4diagram/DiagramUI.tsx +5 -0
- package/src/likec4diagram/DiagramXYFlow.tsx +115 -118
- package/src/likec4diagram/custom/edges/RelationshipEdge.tsx +9 -0
- package/src/likec4diagram/custom/edges/RelationshipsDropdownMenu.tsx +10 -9
- package/src/likec4diagram/custom/nodes/nodes.tsx +45 -43
- package/src/likec4diagram/custom/nodes/toolbar/_shared.tsx +11 -3
- package/src/likec4diagram/types.ts +5 -3
- package/src/likec4diagram/ui/controls/Controls.tsx +11 -4
- package/src/likec4diagram/ui/notation/NotationPanel.tsx +2 -2
- package/src/likec4diagram/useViewToNodesEdges.ts +34 -36
- package/src/likec4model/LikeC4ModelContext.ts +2 -2
- package/src/likec4model/useLikeC4ElementsTree.ts +1 -1
- package/src/likec4model/useLikeC4Model.ts +18 -16
- package/src/overlays/Overlays.tsx +5 -32
- package/src/overlays/element-details/ElementDetailsCard.tsx +25 -18
- package/src/overlays/element-details/TabPanelDeployments.tsx +3 -2
- package/src/overlays/element-details/TabPanelRelationships.tsx +2 -1
- package/src/overlays/element-details/TabPanelStructure.tsx +1 -1
- package/src/overlays/element-details/actor.ts +2 -2
- package/src/overlays/overlay/Overlay.css.ts +75 -38
- package/src/overlays/overlay/Overlay.tsx +43 -26
- package/src/overlays/overlaysActor.ts +1 -1
- package/src/overlays/relationship-details/RelationshipDetails.tsx +4 -4
- package/src/overlays/relationship-details/_types.ts +2 -1
- package/src/overlays/relationship-details/custom/nodeTypes.tsx +4 -0
- package/src/overlays/relationship-details/layout-to-xyflow.ts +1 -0
- package/src/overlays/relationship-details/layout.ts +3 -1
- package/src/overlays/relationships-browser/SelectElement.tsx +1 -1
- package/src/overlays/relationships-browser/_types.ts +2 -1
- package/src/overlays/relationships-browser/custom/nodeTypes.tsx +4 -0
- package/src/overlays/relationships-browser/layout.ts +12 -7
- package/src/overlays/relationships-browser/useViewToNodesEdges.ts +4 -4
- package/src/search/Search.tsx +237 -0
- package/src/{likec4diagram/ui/search → search/components}/ElementsColumn.css.ts +0 -29
- package/src/{likec4diagram/ui/search → search/components}/ElementsColumn.tsx +24 -22
- package/src/search/components/PickView.tsx +140 -0
- package/src/search/components/SearchByTags.tsx +109 -0
- package/src/{likec4diagram/ui/search → search/components}/SearchInput.tsx +63 -36
- package/src/{likec4diagram/ui/search → search/components}/ViewsColum.tsx +17 -18
- package/src/{likec4diagram/ui/search → search/components}/_shared.css.ts +26 -37
- package/src/{likec4diagram/ui/search/LikeC4Search.css.ts → search/components/styles.css.ts} +9 -36
- package/src/{likec4diagram/ui/search → search/components}/utils.ts +7 -0
- package/src/search/hooks.ts +41 -0
- package/src/search/searchActor.ts +99 -0
- package/src/state/DiagramActorProvider.tsx +36 -25
- package/src/state/assign.ts +10 -10
- package/src/state/diagram-machine.ts +115 -52
- package/src/state/syncManualLayoutActor.ts +1 -1
- package/src/state/types.ts +2 -0
- package/src/state/utils.ts +4 -0
- package/dist/base/types.js +0 -54
- package/dist/likec4diagram/ui/search/ElementsColumn.d.ts +0 -1
- package/dist/likec4diagram/ui/search/LikeC4Search.css.js +0 -87
- package/dist/likec4diagram/ui/search/LikeC4Search.d.ts +0 -2
- package/dist/likec4diagram/ui/search/LikeC4Search.js +0 -267
- package/dist/likec4diagram/ui/search/SearchInput.d.ts +0 -1
- package/dist/likec4diagram/ui/search/state.d.ts +0 -19
- package/dist/likec4diagram/ui/search/state.js +0 -63
- package/src/likec4diagram/ui/search/LikeC4Search.tsx +0 -301
- package/src/likec4diagram/ui/search/state.ts +0 -78
- /package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.css.d.ts +0 -0
- /package/dist/{likec4diagram/ui/search → search/components}/ViewsColumn.css.d.ts +0 -0
- /package/dist/{likec4diagram/ui/search → search/components}/ViewsColumn.css.js +0 -0
- /package/dist/{likec4diagram/ui/search → search/components}/_shared.css.d.ts +0 -0
- /package/src/{likec4diagram/ui/search → search/components}/ViewsColumn.css.ts +0 -0
|
@@ -1,21 +1,16 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import
|
|
3
|
-
import { ShadowRoot } from './ShadowRoot'
|
|
4
|
-
|
|
1
|
+
import type { Any, DiagramView } from '@likec4/core/types'
|
|
2
|
+
import type * as aux from '@likec4/core/types/aux'
|
|
5
3
|
import { cx } from '@likec4/styles/css'
|
|
4
|
+
import { type CSSProperties } from 'react'
|
|
6
5
|
import { isFunction, isString } from 'remeda'
|
|
7
6
|
import { type LikeC4DiagramProps, LikeC4Diagram } from '../LikeC4Diagram'
|
|
8
|
-
import type { OnNavigateTo } from '../LikeC4Diagram.props'
|
|
9
7
|
import { useLikeC4Model } from '../likec4model/useLikeC4Model'
|
|
8
|
+
import { ShadowRoot } from './ShadowRoot'
|
|
10
9
|
import { useColorScheme, useShadowRootStyle } from './styles.css'
|
|
11
10
|
import { ErrorMessage, ViewNotFound } from './ViewNotFound'
|
|
12
11
|
|
|
13
|
-
export type ReactLikeC4Props<
|
|
14
|
-
ViewId
|
|
15
|
-
Tag = string,
|
|
16
|
-
Kind = string,
|
|
17
|
-
> = Omit<LikeC4DiagramProps, 'view' | 'where' | 'onNavigateTo'> & {
|
|
18
|
-
viewId: ViewId
|
|
12
|
+
export type ReactLikeC4Props<A extends aux.Any> = Omit<LikeC4DiagramProps<A>, 'view'> & {
|
|
13
|
+
viewId: aux.ViewId<A>
|
|
19
14
|
|
|
20
15
|
/**
|
|
21
16
|
* Keep aspect ratio of the diagram
|
|
@@ -41,24 +36,16 @@ export type ReactLikeC4Props<
|
|
|
41
36
|
|
|
42
37
|
style?: CSSProperties | undefined
|
|
43
38
|
|
|
44
|
-
where?: WhereOperator<Tag, Kind> | undefined
|
|
45
|
-
|
|
46
|
-
onNavigateTo?: OnNavigateTo<ViewId> | undefined
|
|
47
|
-
|
|
48
39
|
mantineTheme?: any
|
|
49
40
|
|
|
50
41
|
/** Function to generate nonce attribute added to all generated `<style />` tags */
|
|
51
42
|
styleNonce?: string | (() => string) | undefined
|
|
52
43
|
}
|
|
53
44
|
|
|
54
|
-
export function ReactLikeC4<
|
|
55
|
-
ViewId extends string = string,
|
|
56
|
-
Tag = string,
|
|
57
|
-
Kind = string,
|
|
58
|
-
>({
|
|
45
|
+
export function ReactLikeC4<A extends aux.Any = aux.UnknownLayouted>({
|
|
59
46
|
viewId,
|
|
60
47
|
...props
|
|
61
|
-
}: ReactLikeC4Props<
|
|
48
|
+
}: ReactLikeC4Props<A>) {
|
|
62
49
|
const likec4model = useLikeC4Model()
|
|
63
50
|
const view = likec4model?.findView(viewId)
|
|
64
51
|
|
|
@@ -85,10 +72,10 @@ export function ReactLikeC4<
|
|
|
85
72
|
return <ReactLikeC4Inner view={view.$view} {...props} />
|
|
86
73
|
}
|
|
87
74
|
|
|
88
|
-
type ReactLikeC4InnerProps = Omit<ReactLikeC4Props<
|
|
89
|
-
view: DiagramView
|
|
75
|
+
type ReactLikeC4InnerProps<A extends Any> = Omit<ReactLikeC4Props<A>, 'viewId'> & {
|
|
76
|
+
view: DiagramView<A>
|
|
90
77
|
}
|
|
91
|
-
function ReactLikeC4Inner({
|
|
78
|
+
function ReactLikeC4Inner<A extends Any>({
|
|
92
79
|
className,
|
|
93
80
|
view,
|
|
94
81
|
colorScheme: explicitColorScheme,
|
|
@@ -101,12 +88,12 @@ function ReactLikeC4Inner({
|
|
|
101
88
|
mantineTheme,
|
|
102
89
|
styleNonce,
|
|
103
90
|
...props
|
|
104
|
-
}: ReactLikeC4InnerProps) {
|
|
91
|
+
}: ReactLikeC4InnerProps<A>) {
|
|
105
92
|
const colorScheme = useColorScheme(explicitColorScheme)
|
|
106
93
|
|
|
107
94
|
const [shadowRootProps, cssstyle] = useShadowRootStyle(keepAspectRatio, view)
|
|
108
95
|
|
|
109
|
-
const notations = view.notation?.
|
|
96
|
+
const notations = view.notation?.nodes ?? []
|
|
110
97
|
const hasNotations = notations.length > 0
|
|
111
98
|
|
|
112
99
|
let nonce
|
|
@@ -139,6 +126,7 @@ function ReactLikeC4Inner({
|
|
|
139
126
|
showNotations={showNotations && hasNotations}
|
|
140
127
|
onNavigateTo={onNavigateTo as any}
|
|
141
128
|
background={background}
|
|
129
|
+
enableElementTags={false}
|
|
142
130
|
{...props}
|
|
143
131
|
/>
|
|
144
132
|
</ShadowRoot>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Box } from '@likec4/styles/jsx'
|
|
2
|
+
import { Button, Code, Group, Notification, ScrollAreaAutosize } from '@mantine/core'
|
|
3
|
+
import { IconX } from '@tabler/icons-react'
|
|
4
|
+
import type { FallbackProps } from 'react-error-boundary'
|
|
5
|
+
|
|
6
|
+
export function ErrorFallback({ error, resetErrorBoundary }: FallbackProps) {
|
|
7
|
+
const errorString = error instanceof Error ? error.message : 'Unknown error'
|
|
8
|
+
return (
|
|
9
|
+
<Box pos={'fixed'} top={0} left={0} w={'100%'} p={0} style={{ zIndex: 1000 }}>
|
|
10
|
+
<Notification
|
|
11
|
+
icon={<IconX style={{ width: 16, height: 16 }} />}
|
|
12
|
+
styles={{
|
|
13
|
+
icon: {
|
|
14
|
+
alignSelf: 'flex-start',
|
|
15
|
+
},
|
|
16
|
+
}}
|
|
17
|
+
color={'red'}
|
|
18
|
+
title={'Oops, something went wrong'}
|
|
19
|
+
p={'xl'}
|
|
20
|
+
withCloseButton={false}>
|
|
21
|
+
<ScrollAreaAutosize maw={'100%'} mah={400}>
|
|
22
|
+
<Code block>{errorString}</Code>
|
|
23
|
+
</ScrollAreaAutosize>
|
|
24
|
+
<Group gap={'xs'} mt="xl">
|
|
25
|
+
<Button color="gray" size="xs" variant="light" onClick={() => resetErrorBoundary()}>Reset</Button>
|
|
26
|
+
</Group>
|
|
27
|
+
</Notification>
|
|
28
|
+
</Box>
|
|
29
|
+
)
|
|
30
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Any } from '@likec4/core/types'
|
|
1
2
|
import { useSyncedRef } from '@react-hookz/web'
|
|
2
3
|
import { type PropsWithChildren, type RefObject, createContext, useContext, useMemo } from 'react'
|
|
3
4
|
import { isFunction, mapToObj } from 'remeda'
|
|
@@ -21,8 +22,8 @@ const HandlerNames = [
|
|
|
21
22
|
'onCanvasDblClick',
|
|
22
23
|
] as const
|
|
23
24
|
|
|
24
|
-
type DiagramEventHandlersContextValue = RequiredOrNull<LikeC4DiagramEventHandlers
|
|
25
|
-
handlersRef: RefObject<LikeC4DiagramEventHandlers
|
|
25
|
+
type DiagramEventHandlersContextValue = RequiredOrNull<LikeC4DiagramEventHandlers<Any>> & {
|
|
26
|
+
handlersRef: RefObject<LikeC4DiagramEventHandlers<Any>>
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
const DiagramEventHandlersContext = createContext<DiagramEventHandlersContextValue>({
|
|
@@ -32,10 +33,10 @@ const DiagramEventHandlersContext = createContext<DiagramEventHandlersContextVal
|
|
|
32
33
|
},
|
|
33
34
|
})
|
|
34
35
|
|
|
35
|
-
export function DiagramEventHandlers({
|
|
36
|
+
export function DiagramEventHandlers<A extends Any>({
|
|
36
37
|
handlers,
|
|
37
38
|
children,
|
|
38
|
-
}: PropsWithChildren<{ handlers: LikeC4DiagramEventHandlers }>) {
|
|
39
|
+
}: PropsWithChildren<{ handlers: LikeC4DiagramEventHandlers<A> }>) {
|
|
39
40
|
const handlersRef = useSyncedRef(handlers)
|
|
40
41
|
|
|
41
42
|
const deps = HandlerNames.map((name) => isFunction(handlers[name]))
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { ExclusiveUnion
|
|
1
|
+
import type { ExclusiveUnion } from '@likec4/core/types'
|
|
2
2
|
import { shallowEqual } from 'fast-equals'
|
|
3
3
|
import { type PropsWithChildren, createContext, useContext, useEffect, useState } from 'react'
|
|
4
|
-
import {
|
|
4
|
+
import { mapToObj } from 'remeda'
|
|
5
5
|
|
|
6
6
|
const FeatureNames = [
|
|
7
7
|
'Controls',
|
|
@@ -18,14 +18,11 @@ const FeatureNames = [
|
|
|
18
18
|
'EdgeEditing',
|
|
19
19
|
'ViewTitle',
|
|
20
20
|
'FitView',
|
|
21
|
-
/**
|
|
22
|
-
* LikeC4Model is available in context
|
|
23
|
-
*/
|
|
24
|
-
'LikeC4Model',
|
|
25
21
|
/**
|
|
26
22
|
* Running in VSCode
|
|
27
23
|
*/
|
|
28
24
|
'Vscode',
|
|
25
|
+
'ElementTags',
|
|
29
26
|
] as const
|
|
30
27
|
export type FeatureName = typeof FeatureNames[number]
|
|
31
28
|
export type EnabledFeatures = {
|
|
@@ -41,20 +38,9 @@ const DiagramFeaturesContext = createContext<EnabledFeatures>(AllDisabled)
|
|
|
41
38
|
const validate = (features: EnabledFeatures) => {
|
|
42
39
|
let {
|
|
43
40
|
enableReadOnly,
|
|
44
|
-
enableLikeC4Model,
|
|
45
|
-
enableElementDetails,
|
|
46
|
-
enableRelationshipDetails,
|
|
47
|
-
enableRelationshipBrowser,
|
|
48
|
-
enableSearch,
|
|
49
41
|
enableEdgeEditing,
|
|
50
42
|
...rest
|
|
51
43
|
} = features
|
|
52
|
-
if (!enableLikeC4Model) {
|
|
53
|
-
enableElementDetails = false
|
|
54
|
-
enableRelationshipDetails = false
|
|
55
|
-
enableRelationshipBrowser = false
|
|
56
|
-
enableSearch = false
|
|
57
|
-
}
|
|
58
44
|
|
|
59
45
|
if (enableReadOnly) {
|
|
60
46
|
enableEdgeEditing = false
|
|
@@ -62,11 +48,6 @@ const validate = (features: EnabledFeatures) => {
|
|
|
62
48
|
|
|
63
49
|
return {
|
|
64
50
|
enableReadOnly,
|
|
65
|
-
enableLikeC4Model,
|
|
66
|
-
enableElementDetails,
|
|
67
|
-
enableRelationshipDetails,
|
|
68
|
-
enableRelationshipBrowser,
|
|
69
|
-
enableSearch,
|
|
70
51
|
enableEdgeEditing,
|
|
71
52
|
...rest,
|
|
72
53
|
}
|
|
@@ -99,10 +99,7 @@ export function IconOrShapeRenderer({
|
|
|
99
99
|
}
|
|
100
100
|
className: string
|
|
101
101
|
}) {
|
|
102
|
-
const icon = IconRenderer
|
|
103
|
-
element,
|
|
104
|
-
className,
|
|
105
|
-
})
|
|
102
|
+
const icon = <IconRenderer element={element} className={className} />
|
|
106
103
|
if (icon) {
|
|
107
104
|
return icon
|
|
108
105
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { cx } from '@likec4/styles/css'
|
|
2
2
|
import { Box } from '@likec4/styles/jsx'
|
|
3
|
+
import { useId } from '@mantine/hooks'
|
|
3
4
|
import { type PropsWithChildren, createContext, createRef, useContext, useEffect, useRef } from 'react'
|
|
4
5
|
import { usePanningAtom } from './ReduceGraphics'
|
|
6
|
+
import { TagStylesProvider } from './TagStylesContext'
|
|
5
7
|
|
|
6
8
|
const RootContainerContext = createContext(createRef<HTMLDivElement>())
|
|
7
9
|
|
|
@@ -13,6 +15,7 @@ export function RootContainer({
|
|
|
13
15
|
className?: string | undefined
|
|
14
16
|
reduceGraphics?: boolean
|
|
15
17
|
}>) {
|
|
18
|
+
const id = useId()
|
|
16
19
|
const ref = useRef<HTMLDivElement>(null)
|
|
17
20
|
const $isPanning = usePanningAtom()
|
|
18
21
|
|
|
@@ -28,14 +31,17 @@ export function RootContainer({
|
|
|
28
31
|
|
|
29
32
|
return (
|
|
30
33
|
<Box
|
|
34
|
+
id={id}
|
|
31
35
|
className={cx('likec4-root', className)}
|
|
32
36
|
ref={ref}
|
|
33
37
|
{...reduceGraphics && {
|
|
34
38
|
['data-likec4-reduced-graphics']: true,
|
|
35
39
|
}}>
|
|
36
|
-
<
|
|
37
|
-
{
|
|
38
|
-
|
|
40
|
+
<TagStylesProvider rootSelector={`#${id}`}>
|
|
41
|
+
<RootContainerContext.Provider value={ref}>
|
|
42
|
+
{children}
|
|
43
|
+
</RootContainerContext.Provider>
|
|
44
|
+
</TagStylesProvider>
|
|
39
45
|
</Box>
|
|
40
46
|
)
|
|
41
47
|
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { type TagSpecification, isTagColorSpecified } from '@likec4/core'
|
|
2
|
+
import { useMantineStyleNonce } from '@mantine/core'
|
|
3
|
+
import { useDeepCompareMemo } from '@react-hookz/web'
|
|
4
|
+
import { type PropsWithChildren, createContext, useContext } from 'react'
|
|
5
|
+
import { entries, flatMap, join, pipe } from 'remeda'
|
|
6
|
+
import { useLikeC4Specification } from '../likec4model/useLikeC4Model'
|
|
7
|
+
|
|
8
|
+
const TagStylesContext = createContext<Record<string, TagSpecification>>({})
|
|
9
|
+
|
|
10
|
+
const radixColors = [
|
|
11
|
+
'yellow',
|
|
12
|
+
'orange',
|
|
13
|
+
'amber',
|
|
14
|
+
'tomato',
|
|
15
|
+
'red',
|
|
16
|
+
'ruby',
|
|
17
|
+
'crimson',
|
|
18
|
+
'pink',
|
|
19
|
+
'pink',
|
|
20
|
+
'purple',
|
|
21
|
+
'violet',
|
|
22
|
+
'indigo',
|
|
23
|
+
'blue',
|
|
24
|
+
'teal',
|
|
25
|
+
'grass',
|
|
26
|
+
'lime',
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
const generateColorVars = (spec: TagSpecification) => {
|
|
30
|
+
const color = spec.color
|
|
31
|
+
if (isTagColorSpecified(spec)) {
|
|
32
|
+
return `
|
|
33
|
+
--colors-likec4-tag-bg: ${color};
|
|
34
|
+
--colors-likec4-tag-bg-hover: color-mix(in srgb, ${color}, var(--colors-likec4-mix-color) 20%);
|
|
35
|
+
`
|
|
36
|
+
}
|
|
37
|
+
if (!radixColors.includes(color)) {
|
|
38
|
+
return ''
|
|
39
|
+
}
|
|
40
|
+
let textcolor = '12'
|
|
41
|
+
if (['mint', 'grass', 'lime', 'yellow', 'amber'].includes(color)) {
|
|
42
|
+
textcolor = 'dark-2'
|
|
43
|
+
}
|
|
44
|
+
return `
|
|
45
|
+
--colors-likec4-tag-border: var(--colors-${color}-8);
|
|
46
|
+
--colors-likec4-tag-bg: var(--colors-${color}-9);
|
|
47
|
+
--colors-likec4-tag-bg-hover: var(--colors-${color}-10);
|
|
48
|
+
--colors-likec4-tag-text: var(--colors-${color}-${textcolor});
|
|
49
|
+
`
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function TagStylesProvider({ children, rootSelector }: PropsWithChildren<{ rootSelector: string }>) {
|
|
53
|
+
const tags = useLikeC4Specification().tags
|
|
54
|
+
const { specs, stylesheet } = useDeepCompareMemo(() => {
|
|
55
|
+
if (!tags) {
|
|
56
|
+
return { specs: {}, stylesheet: '' }
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
specs: tags,
|
|
60
|
+
stylesheet: pipe(
|
|
61
|
+
entries(tags),
|
|
62
|
+
flatMap(([tag, spec]) => [
|
|
63
|
+
`:is(${rootSelector} [data-likec4-tag="${tag}"]) {`,
|
|
64
|
+
generateColorVars(spec),
|
|
65
|
+
'}',
|
|
66
|
+
]),
|
|
67
|
+
join('\n'),
|
|
68
|
+
),
|
|
69
|
+
}
|
|
70
|
+
}, [tags, rootSelector])
|
|
71
|
+
|
|
72
|
+
return (
|
|
73
|
+
<TagStylesContext.Provider value={specs}>
|
|
74
|
+
{stylesheet !== '' && <TagStylesheet stylesheet={stylesheet} />}
|
|
75
|
+
{children}
|
|
76
|
+
</TagStylesContext.Provider>
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function TagStylesheet({ stylesheet }: { stylesheet: string }) {
|
|
81
|
+
const nonce = useMantineStyleNonce()?.()
|
|
82
|
+
return (
|
|
83
|
+
<style data-likec4-tag-stylesheet type="text/css" dangerouslySetInnerHTML={{ __html: stylesheet }} nonce={nonce} />
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function useTagSpecifications() {
|
|
88
|
+
return useContext(TagStylesContext)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function useTagSpecification(tag: string): TagSpecification {
|
|
92
|
+
const specs = useContext(TagStylesContext)
|
|
93
|
+
return specs[tag] ?? {
|
|
94
|
+
color: 'tomato' as any,
|
|
95
|
+
}
|
|
96
|
+
}
|
package/src/custom/components.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { DeployedInstanceModel, DeploymentNodeModel, NodeModel } from '@likec4/core/model'
|
|
2
|
+
import type { Any } from '@likec4/core/types'
|
|
3
3
|
import type { ReactNode } from 'react'
|
|
4
4
|
import { customNode } from '../base/primitives'
|
|
5
5
|
import type { NodeProps } from '../base/types'
|
|
@@ -9,22 +9,22 @@ import { useLikeC4Model } from '../likec4model/useLikeC4Model'
|
|
|
9
9
|
function customDiagramNode<
|
|
10
10
|
P extends {
|
|
11
11
|
nodeProps: NodeProps<Types.NodeData>
|
|
12
|
-
nodeModel: NodeModel
|
|
12
|
+
nodeModel: NodeModel
|
|
13
13
|
},
|
|
14
14
|
>(
|
|
15
15
|
Node: (props: P) => ReactNode,
|
|
16
16
|
): (props: P['nodeProps']) => ReactNode {
|
|
17
17
|
return customNode((props) => {
|
|
18
|
-
const viewModel = useLikeC4Model(
|
|
18
|
+
const viewModel = useLikeC4Model().view(props.data.viewId)
|
|
19
19
|
const model = viewModel.node(props.id)
|
|
20
20
|
// @ts-ignore
|
|
21
21
|
return <Node nodeProps={props} nodeModel={model} />
|
|
22
22
|
}) as (props: P['nodeProps']) => ReactNode
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
export type CustomElementNodeProps<M extends
|
|
25
|
+
export type CustomElementNodeProps<M extends Any = Any> = {
|
|
26
26
|
nodeProps: NodeProps<Types.ElementNodeData, 'element'>
|
|
27
|
-
nodeModel: NodeModel.WithElement<M
|
|
27
|
+
nodeModel: NodeModel.WithElement<M>
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
30
|
* Node that will be used to render the element from the model.
|
|
@@ -34,6 +34,8 @@ export type CustomElementNodeProps<M extends AnyAux = AnyAux> = {
|
|
|
34
34
|
* - `nodeProps`: props from XYFlow
|
|
35
35
|
* - `nodeModel`: LikeC4 {@link NodeModel.WithElement}
|
|
36
36
|
*
|
|
37
|
+
* @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
|
|
38
|
+
*
|
|
37
39
|
* @example
|
|
38
40
|
* ```tsx
|
|
39
41
|
* import {
|
|
@@ -74,9 +76,9 @@ export type CustomElementNodeProps<M extends AnyAux = AnyAux> = {
|
|
|
74
76
|
*/
|
|
75
77
|
export const elementNode = customDiagramNode<CustomElementNodeProps>
|
|
76
78
|
|
|
77
|
-
export type CustomDeploymentNodeProps<M extends
|
|
79
|
+
export type CustomDeploymentNodeProps<M extends Any = Any> = {
|
|
78
80
|
nodeProps: NodeProps<Types.DeploymentElementNodeData, 'deployment'>
|
|
79
|
-
nodeModel: NodeModel.WithDeploymentElement<M
|
|
81
|
+
nodeModel: NodeModel.WithDeploymentElement<M>
|
|
80
82
|
}
|
|
81
83
|
/**
|
|
82
84
|
* Node that will be used to render the element from deployment model.
|
|
@@ -87,6 +89,8 @@ export type CustomDeploymentNodeProps<M extends AnyAux = AnyAux> = {
|
|
|
87
89
|
* - `nodeProps`: props from XYFlow
|
|
88
90
|
* - `nodeModel`: {@link NodeModel.WithDeploymentElement}
|
|
89
91
|
*
|
|
92
|
+
* @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
|
|
93
|
+
*
|
|
90
94
|
* @example
|
|
91
95
|
* ```tsx
|
|
92
96
|
* import {
|
|
@@ -126,9 +130,9 @@ export type CustomDeploymentNodeProps<M extends AnyAux = AnyAux> = {
|
|
|
126
130
|
*/
|
|
127
131
|
export const deploymentNode = customDiagramNode<CustomDeploymentNodeProps>
|
|
128
132
|
|
|
129
|
-
export type CustomCompoundElementNodeProps<M extends
|
|
133
|
+
export type CustomCompoundElementNodeProps<M extends Any = Any> = {
|
|
130
134
|
nodeProps: NodeProps<Types.CompoundElementNodeData, 'compound-element'>
|
|
131
|
-
nodeModel: NodeModel.WithElement<M
|
|
135
|
+
nodeModel: NodeModel.WithElement<M>
|
|
132
136
|
}
|
|
133
137
|
/**
|
|
134
138
|
* Node that will be used to render the compound element from the model.
|
|
@@ -138,6 +142,8 @@ export type CustomCompoundElementNodeProps<M extends AnyAux = AnyAux> = {
|
|
|
138
142
|
* - `nodeProps`: props from XYFlow
|
|
139
143
|
* - `nodeModel`: LikeC4 {@link NodeModel.WithElement}
|
|
140
144
|
*
|
|
145
|
+
* @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
|
|
146
|
+
*
|
|
141
147
|
* @example
|
|
142
148
|
* ```tsx
|
|
143
149
|
* import {
|
|
@@ -168,9 +174,9 @@ export type CustomCompoundElementNodeProps<M extends AnyAux = AnyAux> = {
|
|
|
168
174
|
*/
|
|
169
175
|
export const compoundElementNode = customDiagramNode<CustomCompoundElementNodeProps>
|
|
170
176
|
|
|
171
|
-
export type CustomCompoundDeploymentNodeProps<M extends
|
|
177
|
+
export type CustomCompoundDeploymentNodeProps<M extends Any = Any> = {
|
|
172
178
|
nodeProps: NodeProps<Types.CompoundDeploymentNodeData, 'compound-deployment'>
|
|
173
|
-
nodeModel: NodeModel.WithDeploymentElement<M
|
|
179
|
+
nodeModel: NodeModel.WithDeploymentElement<M>
|
|
174
180
|
}
|
|
175
181
|
/**
|
|
176
182
|
* Node that will be used to render the compound from the deployment model.
|
|
@@ -180,6 +186,8 @@ export type CustomCompoundDeploymentNodeProps<M extends AnyAux = AnyAux> = {
|
|
|
180
186
|
* - `nodeProps`: props from XYFlow
|
|
181
187
|
* - `nodeModel`: LikeC4 {@link NodeModel.WithDeploymentElement}
|
|
182
188
|
*
|
|
189
|
+
* @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
|
|
190
|
+
*
|
|
183
191
|
* @example
|
|
184
192
|
* ```tsx
|
|
185
193
|
* import {
|
|
@@ -204,9 +212,9 @@ export type CustomCompoundDeploymentNodeProps<M extends AnyAux = AnyAux> = {
|
|
|
204
212
|
*/
|
|
205
213
|
export const compoundDeploymentNode = customDiagramNode<CustomCompoundDeploymentNodeProps>
|
|
206
214
|
|
|
207
|
-
export type CustomViewGroupNodeProps<M extends
|
|
215
|
+
export type CustomViewGroupNodeProps<M extends Any = Any> = {
|
|
208
216
|
nodeProps: NodeProps<Types.ViewGroupNodeData, 'view-group'>
|
|
209
|
-
nodeModel: NodeModel.IsGroup<M
|
|
217
|
+
nodeModel: NodeModel.IsGroup<M>
|
|
210
218
|
}
|
|
211
219
|
/**
|
|
212
220
|
* Node that will be used to render the view group from the model.
|
|
@@ -215,6 +223,8 @@ export type CustomViewGroupNodeProps<M extends AnyAux = AnyAux> = {
|
|
|
215
223
|
* - `nodeProps`: props from XYFlow
|
|
216
224
|
* - `nodeModel`: LikeC4 {@link NodeModel.IsGroup}
|
|
217
225
|
*
|
|
226
|
+
* @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
|
|
227
|
+
*
|
|
218
228
|
* @example
|
|
219
229
|
* ```tsx
|
|
220
230
|
* import {
|
package/src/custom/hooks.ts
CHANGED
package/src/hooks/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { useMantinePortalProps } from './useMantinePortalProps'
|
|
2
2
|
export { useSetState } from './useSetState'
|
|
3
3
|
export { useUpdateEffect } from './useUpdateEffect'
|
|
4
|
-
export { useXYFlow, useXYInternalNode, useXYStore, useXYStoreApi } from './useXYFlow'
|
|
4
|
+
export { useCurrentZoom, useIsZoomTooSmall, useXYFlow, useXYInternalNode, useXYStore, useXYStoreApi } from './useXYFlow'
|
|
5
5
|
export type { XYStoreApi } from './useXYFlow'
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { AnyAux, LikeC4ViewModel } from '@likec4/core/model'
|
|
3
|
-
import type { DiagramView, ViewId } from '@likec4/core/types'
|
|
1
|
+
import type { ViewId } from '@likec4/core/types'
|
|
4
2
|
import { useSelector } from '@xstate/react'
|
|
5
|
-
import { useLikeC4Model } from '../likec4model/useLikeC4Model'
|
|
6
3
|
import type { DiagramActorSnapshot } from '../state/types'
|
|
7
4
|
import { useDiagramActorRef } from './useDiagram'
|
|
8
5
|
|