Excubo.Blazor.Diagrams is a native-Blazor diagram component library.
Demo on github.io using Blazor Webassembly
- Adding/Moving/Removing of nodes
- Moving/Removing groups of nodes (select multiple nodes by drawing a region (-> press
[shift]), or by adding/removing individual nodes by clicking them while holding[ctrl]) - Adding/Modifying/Removing links (including shape of curve for CurvedLink!)
- Undo/Redo with
[Ctrl]+[z](undo) and[Ctrl]+[Shift]+[z]/[Ctrl]+[y](redo) - Panning/Zooming
- Default link connection ports by position (North, NorthEast, East,...)
- Custom nodes/links
- Node library (fully customizable) for adding new nodes
- Change shape and arrows for links
- Overview screen for easy navigation on large diagrams
- Customizable background (grid lines, color, any style you want)
Using Excubo.Blazor.Diagrams doesn't require any difficult installation. You need to install it and use it, that's it:
Excubo.Blazor.Diagrams is distributed via nuget.org.
Install-Package Excubo.Blazor.Diagramsdotnet add package Excubo.Blazor.Diagrams<PackageReference Include="Excubo.Blazor.Diagrams" />@using Excubo.Blazor.Diagrams
<Diagram>
<Nodes>
<Node Id="abc" X="500" Y="500">
Hello node @context.Id
</Node>
<Node Id="def" X="1000" Y="500">
Hello node @context.Id
</Node>
</Nodes>
<Links>
</Links>
</Diagram>This is of course only a minimalistic example. For more examples, have a look at the sample project, which is the basis for the demo application.
:information:
Should you get a blank screen instead of the expected diagram, make sure that the diagram has a non-zero height.
The diagram takes 100% of the height of the parent DOM node.
To see whether this is the issue you're experiencing, try wrapping the diagram in a div with a fixed size,
e.g. <div style="height: 1000px; width: 1000px;"><Diagram>...</Diagram></div>.
- Extensibility
Users get a set of built-in node shapes and link types, but can expand this freely and with minimal amount of effort by adding their own shapes.
- Blazor API
The API should feel like you're using Blazor, not a javascript library.
- Minimal js, minimal css, lazy-loaded only when you use the component
The non-C# part of the code of the library should be as tiny as possible. We set ourselves a maximum amount of 10kB for combined js+css. The current payload is less than 100 bytes, and only gets loaded dynamically when the component is actually used.
A complete example of how to design a custom node is available here.
Starting with version 4.0.0, only the net6.0 TFM is targeted. This is a change to simplify dependency management and we strongly encourage all users to upgrade to net6.0.
When implementing custom nodes, one must now decide between a node that has a fixed size (i.e. has a parameter for both width and height) or one that determines its size by the size of the node's content.
To upgrade existing projects, replace NodeBase with ContentSizedNodeBase.
Starting with 2.0.0, EventCallback<T>s have been replaced with Action<T>. In most situations, there should be nothing to change. If you previously used await in the callback method, you now have to move that into a separate method:
before:
private async Task Callback(T value)
{
Value = value;
await FooAsync();
await BarAsync();
}after:
private void Callback(T value)
{
Value = value;
RunFooAndBarAsync();
}
private async Task RunFooAndBarAsync()
{
await FooAsync();
await BarAsync();
}Starting with version 1.11.0, NodeBase now implements IDisposable. This means that any node implementation inheriting from NodeBase that previously implemented IDisposable now needs to override void Dispose():
before:
@implements IDisposable
public void Dispose()
{
Resource.Dispose();
}after:
public override void Dispose()
{
Resource.Dispose();
base.Dispose();
}