React Components
LikeC4 provides a set of React components, which you can use to render your architecture diagrams.
Codegen
When you run likec4 codegen react, it generates a file with typed react components.
They are "bound" to your model.
import {
// type guard
isViewId,
// hook to sync viewId with url
useViewId,
// all views
LikeC4Views,
// components, that expects "typed" viewId
Diagram,
Responsive,
Fullscreen,
Embedded,
Browser,
} from '../generated-code'
<Embedded viewId={"cloud"} />
// ⛔️ Fail on compile:
<Embedded viewId={"not_existing_viewId"} />Components are ready to be embedded, like in MDX.
The examples on this website are rendered with this approach.
Example
specification { // define "types" of architecture elements
element actor {
style {
shape person // how to render
}
}
element system
element component
relationship async // allow "typed" relationship
}
model { // describe your architecture, single source of truth
customer = actor 'Customer' {
description 'A user of our product with active subscription'
-> ui 'opens in browser' // how relationships are
}
cloud = system 'Our SaaS' {
backend = component 'Backend' {
description '
Implements business logic
and provides GraphQL API
'
}
ui = component 'Frontend' {
description 'NextJs application'
style {
shape browser
}
}
ui -[async]-> backend 'requests via HTTPS'
}
}
views {
view index {
include *, cloud.*
style cloud.* {
color green
}
}
}Code above is partial, see full source (opens in a new tab)
Run to generate react components:
likec4 codegen react -o likec4-generated.tsxNow import the generated:
import { Embedded as LikeC4 } from '$/likec4-generated'
// ...
export const SomeScreen = () => (
<LikeC4 viewId={"index"}/>
)And this is rendered (click to explore):
Library
Generated components are based on the library, which you can use directly.
npm install @likec4/diagramsThese are the base components to build your own views.
Components expect a structured data, which can be generated with CLI
Diagram
import { Diagram } from '@likec4/diagrams'
<Diagram
diagram={diagram}
animate={true}
pannable={true}
zoomable={true}
width={window.innerWidth}
height={window.innerHeight}
padding={16}
onStageClick={/* */}
onNodeClick={/* */}
onEdgeClick={/* */}
/>The most basic component, renders a diagram.
You have to control width and height.
If you pass another diagram, it will be replaced with animation.
ResponsiveDiagram
Automatically resize to fit its container, while maintaining the aspect ratio of the diagram.
import { ResponsiveDiagram } from '@likec4/diagrams'
<ResponsiveDiagram
diagram={diagram}
animate={true}
pannable={true}
zoomable={true}
padding={[10, 20, 10, 20]}
onStageClick={/* */}
onNodeClick={/* */}
onEdgeClick={/* */}
/>FullscreenDiagram
Renders diagram in a fullscreen overlay.
import { FullscreenDiagram, FullscreenDiagramTitle } from '@likec4/diagrams'
<FullscreenDiagram
diagram={diagram}
animate={true}
pannable={true}
zoomable={true}
padding={[10, 20, 10, 20]}
closeOnEsc={true}
closeOnOutsideClick={true}
onClose={/* */}
onStageClick={/* */}
onNodeClick={/* */}
onEdgeClick={/* */}>
<FullscreenDiagramTitle>
{diagram.title}
</FullscreenDiagramTitle>
</FullscreenDiagram>May have children, which are rendered inside and above the diagram.
If you pass onClose handler, it will render a close button.
May be styled with css:
:root {
--likec4-browser-overlay-bg: rgba(18, 18, 18, 0.8);
--likec4-browser-backdrop: blur(4px);
--likec4-overlay-z-index: 100;
}EmbeddedDiagram
Renders ResponsiveDiagram, but on click renders the disclose view.
import { EmbeddedDiagram } from '@likec4/diagrams'
import { LikeC4Views } from '../generated-code'
<EmbeddedDiagram
views={LikeC4Views}
viewId={'cloud'}
/>By default, Embedded diagram renders a FullscreenDiagramBrowser:
import { EmbeddedDiagram, FullscreenDiagramBrowser } from '@likec4/diagrams'
import { LikeC4Views } from '../generated-code'
<EmbeddedDiagram
views={LikeC4Views}
viewId={'cloud'}
renderDisclose={({views, viewId, initialPosition, onClose}) =>
<FullscreenDiagramBrowser
views={views}
initialViewId={viewId}
initialPosition={initialPosition}
onClose={onClose}
/>
}
/>FullscreenDiagramBrowser
Same as FullscreenDiagram, but also handles navigation between views.
import { FullscreenDiagramBrowser } from '@likec4/diagrams'
import { LikeC4Views } from '../generated-code'
<FullscreenDiagramBrowser
views={LikeC4Views}
initialViewId={'cloud'}
onClose={/* */}
/>