From fcfce91ea082d503d54f982fd624bded6838e3fc Mon Sep 17 00:00:00 2001 From: Siarhei Huzarevich Date: Thu, 3 Oct 2024 01:32:33 +0200 Subject: [PATCH] docs: Added custom connections example --- projects/f-examples/_flow-common.scss | 8 ++-- .../custom-connections.component.html | 24 ++++++++++++ .../custom-connections.component.scss | 35 ++++++++++++++++++ .../custom-connections.component.ts | 22 +++++++++++ .../markdown/examples/custom-connections.md | 19 ++++++++++ public/markdown/examples/environment.ts | 11 ++++++ .../examples/custom-connections.dark.png | Bin 0 -> 24950 bytes .../examples/custom-connections.light.png | Bin 0 -> 24882 bytes src/app/app.component.html | 6 +-- 9 files changed, 118 insertions(+), 7 deletions(-) create mode 100644 projects/f-examples/connections/custom-connections/custom-connections.component.html create mode 100644 projects/f-examples/connections/custom-connections/custom-connections.component.scss create mode 100644 projects/f-examples/connections/custom-connections/custom-connections.component.ts create mode 100644 public/markdown/examples/custom-connections.md create mode 100644 public/previews/examples/custom-connections.dark.png create mode 100644 public/previews/examples/custom-connections.light.png diff --git a/projects/f-examples/_flow-common.scss b/projects/f-examples/_flow-common.scss index 46a37d8..1458afa 100644 --- a/projects/f-examples/_flow-common.scss +++ b/projects/f-examples/_flow-common.scss @@ -8,8 +8,8 @@ --connection-color: rgba(60, 60, 67, 0.78); --snap-connection-color: rgba(60, 60, 67, 0.38); - --connection-gradient-1: #915930; - --connection-gradient-2: #18794e; + --connection-gradient-1: #b8272c; + --connection-gradient-2: #30a46c; --outlet-color: #3451b2; --input-output-color: rgba(60, 60, 67, 0.78); @@ -29,8 +29,8 @@ --connection-color: rgba(235, 235, 245, 0.6); --snap-connection-color: rgba(235, 235, 245, 0.2); - --connection-gradient-1: #f9b44e; - --connection-gradient-2: #3dd68c; + --connection-gradient-1: #f66f81; + --connection-gradient-2: #298459; --outlet-color: #a8b1ff; --input-output-color: rgba(235, 235, 245, 0.6); diff --git a/projects/f-examples/connections/custom-connections/custom-connections.component.html b/projects/f-examples/connections/custom-connections/custom-connections.component.html new file mode 100644 index 0000000..79a14c5 --- /dev/null +++ b/projects/f-examples/connections/custom-connections/custom-connections.component.html @@ -0,0 +1,24 @@ + + + + +
+ I'm a node +
+
+ I'm a node +
+ + + +
+ I'm a node +
+
+ I'm a node +
+
+
diff --git a/projects/f-examples/connections/custom-connections/custom-connections.component.scss b/projects/f-examples/connections/custom-connections/custom-connections.component.scss new file mode 100644 index 0000000..48389ac --- /dev/null +++ b/projects/f-examples/connections/custom-connections/custom-connections.component.scss @@ -0,0 +1,35 @@ +@use "../../flow-common"; + +::ng-deep custom-connections { + .f-connection { + + .f-connection-drag-handle { + fill: none; + stroke: none; + } + + .f-connection-selection { + fill: none; + stroke-width: 20; + } + + .f-connection-path { + fill: none; + stroke-width: 6; + } + + &:not(.gradient-color) { + .f-connection-path { + stroke: #db2777; + stroke-width: 4; + } + } + &:hover { + stroke: var(--minimap-view-color); + } + } +} + +.f-node { + @include flow-common.node; +} diff --git a/projects/f-examples/connections/custom-connections/custom-connections.component.ts b/projects/f-examples/connections/custom-connections/custom-connections.component.ts new file mode 100644 index 0000000..76699f6 --- /dev/null +++ b/projects/f-examples/connections/custom-connections/custom-connections.component.ts @@ -0,0 +1,22 @@ +import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; +import { FCanvasComponent, FFlowModule } from '@foblex/flow'; + +@Component({ + selector: 'custom-connections', + styleUrls: [ './custom-connections.component.scss' ], + templateUrl: './custom-connections.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + FFlowModule + ] +}) +export class CustomConnectionsComponent { + + @ViewChild(FCanvasComponent, { static: true }) + public fCanvas!: FCanvasComponent; + + public onLoaded(): void { + this.fCanvas.resetScaleAndCenter(false); + } +} diff --git a/public/markdown/examples/custom-connections.md b/public/markdown/examples/custom-connections.md new file mode 100644 index 0000000..21442a0 --- /dev/null +++ b/public/markdown/examples/custom-connections.md @@ -0,0 +1,19 @@ +# Custom Connections + +## Description + +This guide shows how to customize connections between connectors, allowing for custom connection styles to be applied to connections between connectors. + +## Example + +::: ng-component [height]="600" +[component.html] <<< https://raw.githubusercontent.com/Foblex/f-flow/main/projects/f-examples/connections/custom-connections/custom-connections.component.html +[component.ts] <<< https://raw.githubusercontent.com/Foblex/f-flow/main/projects/f-examples/connections/custom-connections/custom-connections.component.ts +[component.scss] <<< https://raw.githubusercontent.com/Foblex/f-flow/main/projects/f-examples/connections/custom-connections/custom-connections.component.scss +[common.scss] <<< https://raw.githubusercontent.com/Foblex/f-flow/main/projects/f-examples/_flow-common.scss +::: + + + + + diff --git a/public/markdown/examples/environment.ts b/public/markdown/examples/environment.ts index 4cc7408..9d8b050 100644 --- a/public/markdown/examples/environment.ts +++ b/public/markdown/examples/environment.ts @@ -56,6 +56,7 @@ function createEnvironment(): IDocsEnvironment { { tag: 'custom-connection-type', component: import('../../../projects/f-examples/connections/custom-connection-type/custom-connection-type.component') }, { tag: 'connection-behaviours', component: import('../../../projects/f-examples/connections/connection-behaviours/connection-behaviours.component') }, { tag: 'connection-markers', component: import('../../../projects/f-examples/connections/connection-markers/connection-markers.component') }, + { tag: 'custom-connections', component: import('../../../projects/f-examples/connections/custom-connections/custom-connections.component') }, { tag: 'dagre-layout-example', component: import('../../../projects/f-examples/layouts/dagre-layout-example/dagre-layout-example.component') }, { tag: 'elkjs-layout-example', component: import('../../../projects/f-examples/layouts/elkjs-layout-example/elkjs-layout-example.component') }, @@ -292,6 +293,16 @@ function connectionGroup(): INavigationGroup { image_height: 600, image_type: 'image/png', }, + { + link: 'custom-connections', + text: 'Custom Connections', + description: 'Explore how to customize connections. This example demonstrates how to create custom connections, providing a comprehensive guide to building interactive flow-based diagrams.', + image: './previews/examples/custom-connections.light.png', + image_dark: './previews/examples/custom-connections.dark.png', + image_width: 791, + image_height: 600, + image_type: 'image/png', + }, // { // link: 'connection-text', // text: 'Connection Text', diff --git a/public/previews/examples/custom-connections.dark.png b/public/previews/examples/custom-connections.dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2a59a2274bad2893b6cd9f30b97026850bc8f9e4 GIT binary patch literal 24950 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 HhbR9BbYQ$f literal 0 HcmV?d00001 diff --git a/public/previews/examples/custom-connections.light.png b/public/previews/examples/custom-connections.light.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e65954f40edae9c1938801e411acbc2bf62746 GIT binary patch literal 24882 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 - + + +