This is an automated email from the ASF dual-hosted git repository.
marat pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git
The following commit(s) were added to refs/heads/main by this push:
new ac2efa61 Fix #484
ac2efa61 is described below
commit ac2efa61fae9a7b298edf425246eafe5cae22355
Author: Marat Gubaidullin <[email protected]>
AuthorDate: Fri Aug 4 14:30:47 2023 -0400
Fix #484
---
karavan-designer/src/designer/utils/CamelUi.tsx | 4 +-
.../src/designer/utils/KaravanIcons.tsx | 16 +
karavan-space/src/designer/utils/CamelUi.tsx | 4 +-
karavan-space/src/designer/utils/KaravanIcons.tsx | 16 +
.../src/main/webui/src/api/ProjectStore.ts | 16 +-
.../src/main/webui/src/designer/karavan.css | 6 +-
.../webui/src/designer/route/DslConnections.tsx | 43 +-
.../src/main/webui/src/designer/utils/CamelUi.tsx | 215 +++-
.../main/webui/src/designer/utils/KaravanIcons.tsx | 1139 +++++++++++++++++++-
.../karavan-app/src/main/webui/src/index.tsx | 2 +-
.../src/knowledgebase/components/ComponentCard.tsx | 6 +-
.../knowledgebase/components/ComponentModal.tsx | 4 +-
.../src/main/webui/src/main/DataPoller.tsx | 103 ++
.../src/main/webui/src/{ => main}/Main.tsx | 126 +--
.../src/main/webui/src/{ => main}/MainLogin.tsx | 0
.../src/main/webui/src/{ => main}/Notification.tsx | 6 +-
.../src/main/webui/src/main/PageNavigation.tsx | 104 ++
17 files changed, 1667 insertions(+), 143 deletions(-)
diff --git a/karavan-designer/src/designer/utils/CamelUi.tsx
b/karavan-designer/src/designer/utils/CamelUi.tsx
index e21544ad..8974019e 100644
--- a/karavan-designer/src/designer/utils/CamelUi.tsx
+++ b/karavan-designer/src/designer/utils/CamelUi.tsx
@@ -56,7 +56,7 @@ import {
Intercept,
InterceptFrom,
InterceptSendToEndpoint,
- IotIcon,
+ IotIcon, KafkaIcon,
KubernetesIcon,
MachineLearningIcon,
MailIcon,
@@ -574,6 +574,8 @@ export class CamelUi {
return InfinispanIcon();
} else if (title.startsWith("Ignite")) {
return IgniteIcon();
+ } else if (title.startsWith("Kafka")) {
+ return KafkaIcon();
} else if (title.startsWith("GitHub")) {
return GithubIcon();
} else if (title.startsWith("Git")) {
diff --git a/karavan-designer/src/designer/utils/KaravanIcons.tsx
b/karavan-designer/src/designer/utils/KaravanIcons.tsx
index 78991e01..0e9b6d82 100644
--- a/karavan-designer/src/designer/utils/KaravanIcons.tsx
+++ b/karavan-designer/src/designer/utils/KaravanIcons.tsx
@@ -937,6 +937,22 @@ export function GithubIcon() {
</svg>
);
}
+export function KafkaIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ preserveAspectRatio="xMidYMid"
+ viewBox="-78.5 0 413 413"
+ className="icon">
+ <path
+ fill="#1A1919"
+ d="M87.932 36.714c-4.55-4.571-10.896-7.394-17.951-7.394-7.029
0-13.326 2.823-17.822 7.394h-.13c-4.535 4.55-7.358 10.9-7.358 17.93 0 7.055
2.823 13.352 7.359 17.875l.129.102c4.496 4.55 10.793 7.346 17.822 7.346 7.055 0
13.402-2.797 17.951-7.346L88 72.52c4.558-4.523 7.354-10.82 7.354-17.876
0-7.029-2.796-13.38-7.354-17.929h-.067Zm-17.951 346.64a25.504 25.504 0 0 0
17.951-7.368l.067-.134c4.558-4.487 7.354-10.838 7.354-17.817
0-7.056-2.796-13.38-7.354-17.952h-.067c-4.55-4.625 [...]
+ />
+ </svg>
+ );
+}
export function GrapeIcon() {
return (
<svg
diff --git a/karavan-space/src/designer/utils/CamelUi.tsx
b/karavan-space/src/designer/utils/CamelUi.tsx
index e21544ad..8974019e 100644
--- a/karavan-space/src/designer/utils/CamelUi.tsx
+++ b/karavan-space/src/designer/utils/CamelUi.tsx
@@ -56,7 +56,7 @@ import {
Intercept,
InterceptFrom,
InterceptSendToEndpoint,
- IotIcon,
+ IotIcon, KafkaIcon,
KubernetesIcon,
MachineLearningIcon,
MailIcon,
@@ -574,6 +574,8 @@ export class CamelUi {
return InfinispanIcon();
} else if (title.startsWith("Ignite")) {
return IgniteIcon();
+ } else if (title.startsWith("Kafka")) {
+ return KafkaIcon();
} else if (title.startsWith("GitHub")) {
return GithubIcon();
} else if (title.startsWith("Git")) {
diff --git a/karavan-space/src/designer/utils/KaravanIcons.tsx
b/karavan-space/src/designer/utils/KaravanIcons.tsx
index 78991e01..0e9b6d82 100644
--- a/karavan-space/src/designer/utils/KaravanIcons.tsx
+++ b/karavan-space/src/designer/utils/KaravanIcons.tsx
@@ -937,6 +937,22 @@ export function GithubIcon() {
</svg>
);
}
+export function KafkaIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ preserveAspectRatio="xMidYMid"
+ viewBox="-78.5 0 413 413"
+ className="icon">
+ <path
+ fill="#1A1919"
+ d="M87.932 36.714c-4.55-4.571-10.896-7.394-17.951-7.394-7.029
0-13.326 2.823-17.822 7.394h-.13c-4.535 4.55-7.358 10.9-7.358 17.93 0 7.055
2.823 13.352 7.359 17.875l.129.102c4.496 4.55 10.793 7.346 17.822 7.346 7.055 0
13.402-2.797 17.951-7.346L88 72.52c4.558-4.523 7.354-10.82 7.354-17.876
0-7.029-2.796-13.38-7.354-17.929h-.067Zm-17.951 346.64a25.504 25.504 0 0 0
17.951-7.368l.067-.134c4.558-4.487 7.354-10.838 7.354-17.817
0-7.056-2.796-13.38-7.354-17.952h-.067c-4.55-4.625 [...]
+ />
+ </svg>
+ );
+}
export function GrapeIcon() {
return (
<svg
diff --git a/karavan-web/karavan-app/src/main/webui/src/api/ProjectStore.ts
b/karavan-web/karavan-app/src/main/webui/src/api/ProjectStore.ts
index 4c554926..deebf7ee 100644
--- a/karavan-web/karavan-app/src/main/webui/src/api/ProjectStore.ts
+++ b/karavan-web/karavan-app/src/main/webui/src/api/ProjectStore.ts
@@ -23,13 +23,19 @@ import {unstable_batchedUpdates} from "react-dom";
interface AppConfigState {
config: AppConfig;
setConfig: (config: AppConfig) => void;
+ pageId: string;
+ setPageId: (pageId: string) => void;
}
export const useAppConfigStore = create<AppConfigState>((set) => ({
config: new AppConfig(),
+ pageId: 'projects',
setConfig: (config: AppConfig) => {
set({config: config})
},
+ setPageId: (pageId: string) => {
+ set({pageId: pageId})
+ },
}))
@@ -107,7 +113,7 @@ export const useFilesStore = create<FilesState>((set) => ({
interface FileState {
file?: ProjectFile;
operation: "create" | "select" | "delete" | "none" | "copy" | "upload";
- setFile: (file: ProjectFile, operation: "create" | "select" | "delete"|
"none" | "copy" | "upload") => void;
+ setFile: (operation: "create" | "select" | "delete"| "none" | "copy" |
"upload", file?: ProjectFile) => void;
editAdvancedProperties: boolean;
setEditAdvancedProperties: (editAdvancedProperties: boolean) => void;
addProperty: string;
@@ -119,7 +125,7 @@ export const useFileStore = create<FileState>((set) => ({
operation: "none",
editAdvancedProperties: false,
addProperty: '',
- setFile: (file: ProjectFile, operation: "create" | "select" | "delete"|
"none" | "copy" | "upload") => {
+ setFile: (operation: "create" | "select" | "delete"| "none" | "copy" |
"upload", file?: ProjectFile) => {
set((state: FileState) => ({
file: file,
operation: operation
@@ -137,6 +143,7 @@ interface DevModeState {
podName?: string,
status: "none" | "wip",
setStatus: (status: "none" | "wip") => void,
+ setPodName: (podName?: string) => void,
}
export const useDevModeStore = create<DevModeState>((set) => ({
@@ -147,6 +154,11 @@ export const useDevModeStore = create<DevModeState>((set)
=> ({
status: status,
}));
},
+ setPodName: (podName?: string) => {
+ set((state: DevModeState) => ({
+ podName: podName,
+ }));
+ },
}))
interface StatusesState {
diff --git a/karavan-web/karavan-app/src/main/webui/src/designer/karavan.css
b/karavan-web/karavan-app/src/main/webui/src/designer/karavan.css
index 3b2574e4..f8f9f634 100644
--- a/karavan-web/karavan-app/src/main/webui/src/designer/karavan.css
+++ b/karavan-web/karavan-app/src/main/webui/src/designer/karavan.css
@@ -142,9 +142,10 @@
.kamelets-page .kamelet-card .icon {
height: 24px;
+ width: 24px;
margin-top: auto;
margin-bottom: auto;
- margin-right: 3px;
+ margin-right: 5px;
border: none;
-webkit-user-select: none;
-khtml-user-select: none;
@@ -201,6 +202,7 @@
.kamelet-modal-card .icon {
height: 36px;
+ width: 36px;
margin-top: auto;
margin-bottom: auto;
border: none;
@@ -560,6 +562,7 @@
.karavan .dsl-page .graph .connections .icon {
height: 20px;
+ width: 20px;
}
.karavan .dsl-page .graph .connections .arrow {
@@ -956,6 +959,7 @@
.dsl-modal .labels {
opacity: 0.5;
font-weight: 200;
+ text-wrap: nowrap;
}
.dsl-modal .dsl-card:hover .labels {
diff --git
a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx
b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx
index 7ccfe8fe..4e4f9f53 100644
---
a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx
+++
b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx
@@ -73,6 +73,7 @@ export class DslConnections extends React.Component<Props,
State> {
getIncomings() {
let outs: [string, number][] = Array.from(this.state.steps.values())
.filter(pos => ["FromDefinition"].includes(pos.step.dslName))
+ .filter(pos => !CamelUi.isElementInternalComponent(pos.step))
.filter(pos => !(pos.step.dslName === 'FromDefinition' &&
CamelUi.hasInternalUri(pos.step)))
.sort((pos1: DslPosition, pos2: DslPosition) => {
const y1 = pos1.headerRect.y + pos1.headerRect.height / 2;
@@ -104,7 +105,7 @@ export class DslConnections extends React.Component<Props,
State> {
return (
<g key={pos.step.uuid + "-incoming"}>
<circle cx={incomingX} cy={fromY} r={r}
className="circle-incoming"/>
- <image x={imageX} y={imageY}
href={CamelUi.getConnectionIcon(pos.step)} className="icon"/>
+ {/*<image x={imageX} y={imageY}
href={CamelUi.getConnectionIconString(pos.step)} className="icon"/>*/}
{/*<text x={imageX - 5} y={imageY + 40}
className="caption" textAnchor="start">{CamelUi.getTitle(pos.step)}</text>*/}
<path d={`M ${lineX1},${lineY1} C ${lineX1},${lineY2}
${lineX2},${lineY1} ${lineX2},${lineY2}`}
className="path-incoming"
markerEnd="url(#arrowhead)"/>
@@ -113,6 +114,22 @@ export class DslConnections extends React.Component<Props,
State> {
}
}
+ getIncomingIcons(data: [string, number]) {
+ const pos = this.state.steps.get(data[0]);
+ if (pos) {
+ const fromY = pos.headerRect.y + pos.headerRect.height / 2 -
this.props.top;
+ const r = pos.headerRect.height / 2;
+ const incomingX = 20;
+ const imageX = incomingX - r + 5;
+ const imageY = fromY - r + 5;
+ return (
+ <div style={{display: "block", position: "absolute", top:
imageY, left: imageX}}>
+ {CamelUi.getConnectionIcon(pos.step)}
+ </div>
+ )
+ }
+ }
+
hasOverlap(data: [string, number][]): boolean {
let result = false;
data.forEach((d, i, arr) => {
@@ -135,7 +152,7 @@ export class DslConnections extends React.Component<Props,
State> {
let outs: [string, number][] = Array.from(this.state.steps.values())
.filter(pos => outgoingDefinitions.includes(pos.step.dslName))
.filter(pos => pos.step.dslName !== 'KameletDefinition' ||
(pos.step.dslName === 'KameletDefinition' &&
!CamelUi.isActionKamelet(pos.step)))
- .filter(pos => pos.step.dslName === 'ToDefinition' &&
!CamelUi.isActionKamelet(pos.step))
+ .filter(pos => pos.step.dslName === 'ToDefinition' &&
!CamelUi.isActionKamelet(pos.step) &&
!CamelUi.isElementInternalComponent(pos.step))
.filter(pos => !(outgoingDefinitions.includes(pos.step.dslName) &&
CamelUi.hasInternalUri(pos.step)))
.filter(pos => pos.step.dslName !== 'SagaDefinition')
.sort((pos1: DslPosition, pos2: DslPosition) => {
@@ -168,13 +185,13 @@ export class DslConnections extends
React.Component<Props, State> {
const lineXi = lineX1 + 40;
const lineYi = lineY2;
- let image = CamelUi.getConnectionIcon(pos.step);
+ let image = CamelUi.getConnectionIconString(pos.step);
const imageX = outgoingX - r + 5;
const imageY = outgoingY - r + 5;
return (
<g key={pos.step.uuid + "-outgoing"}>
<circle cx={outgoingX} cy={outgoingY} r={r}
className="circle-outgoing"/>
- <image x={imageX} y={imageY} href={image}
className="icon"/>
+ {/*<image x={imageX} y={imageY} href={image}
className="icon"/>*/}
{/*<text x={imageX + 25} y={imageY + 40}
className="caption"
textAnchor="end">{CamelUi.getOutgoingTitle(pos.step)}</text>*/}
<path d={`M ${lineX1},${lineY1} C ${lineXi - 20},
${lineY1} ${lineX1 - 15},${lineYi} ${lineXi},${lineYi} L ${lineX2},${lineY2}`}
className="path-incoming"
markerEnd="url(#arrowhead)"/>
@@ -183,6 +200,22 @@ export class DslConnections extends React.Component<Props,
State> {
}
}
+ getOutgoingIcons(data: [string, number]) {
+ const pos = this.state.steps.get(data[0]);
+ if (pos) {
+ const r = pos.headerRect.height / 2;
+ const outgoingX = this.props.width - 20;
+ const outgoingY = data[1] + 15;
+ const imageX = outgoingX - r + 5;
+ const imageY = outgoingY - r + 5;
+ return (
+ <div style={{display: "block", position: "absolute", top:
imageY, left: imageX}}>
+ {CamelUi.getConnectionIcon(pos.step)}
+ </div>
+ )
+ }
+ }
+
getInternals(): [string, number, boolean][] {
let outs: [string, number, boolean][] =
Array.from(this.state.steps.values())
.filter(pos => outgoingDefinitions.includes(pos.step.dslName) &&
CamelUi.hasInternalUri(pos.step))
@@ -432,6 +465,8 @@ export class DslConnections extends React.Component<Props,
State> {
return (
<div className="connections" style={{width: this.props.width,
height: this.props.height, marginTop: "8px"}}>
{this.getSvg()}
+ {this.getIncomings().map(p => this.getIncomingIcons(p))}
+ {this.getOutgoings().map(p => this.getOutgoingIcons(p))}
</div>
);
}
diff --git
a/karavan-web/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx
b/karavan-web/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx
index c55a8ef8..8974019e 100644
--- a/karavan-web/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx
@@ -29,8 +29,65 @@ import {
ToDefinition
} from "karavan-core/lib/model/CamelDefinition";
import {CamelElement, Integration} from
"karavan-core/lib/model/IntegrationDefinition";
-import {AggregateIcon, ChoiceIcon, FilterIcon, Intercept, InterceptFrom,
InterceptSendToEndpoint, OnCompletion, SagaIcon, SortIcon, SplitIcon} from
"./KaravanIcons";
+import {
+ AggregateIcon,
+ ApiIcon,
+ AwsIcon,
+ AzureIcon,
+ BlockchainIcon,
+ ChatIcon,
+ ChoiceIcon,
+ CloudIcon,
+ ClusterIcon,
+ DatabaseIcon,
+ DebeziumIcon,
+ DocumentIcon,
+ FileIcon,
+ FilterIcon,
+ GithubIcon,
+ GitIcon,
+ GoogleCloudIcon,
+ GrapeIcon,
+ HazelcastIcon,
+ HealthIcon,
+ HttpIcon,
+ IgniteIcon,
+ InfinispanIcon,
+ Intercept,
+ InterceptFrom,
+ InterceptSendToEndpoint,
+ IotIcon, KafkaIcon,
+ KubernetesIcon,
+ MachineLearningIcon,
+ MailIcon,
+ MessagingIcon,
+ MobileIcon,
+ MonitoringIcon,
+ NetworkingIcon,
+ OnCompletion,
+ OpenshiftIcon,
+ OpenstackIcon,
+ RedisIcon,
+ RefIcon,
+ RpcIcon,
+ SagaIcon,
+ SapIcon,
+ SchedulingIcon,
+ ScriptIcon,
+ SearchIcon,
+ SocialIcon,
+ SortIcon,
+ SplitIcon,
+ SpringIcon,
+ TerminalIcon,
+ TestingIcon,
+ TransformationIcon,
+ ValidationIcon,
+ WebserviceIcon,
+ WorkflowIcon
+} from "./KaravanIcons";
import React from "react";
+import {Icon} from "@patternfly/react-core";
const StepElements: string[] = [
"AggregateDefinition",
@@ -426,7 +483,7 @@ export class CamelUi {
case "SagaDefinition":
return "data:image/svg+xml,%0A%3Csvg width='32px'
height='32px' viewBox='0 0 32 32' id='icon'
xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:none;%7D%3C/style%3E%3C/defs%3E%3Ctitle%3Eexpand-categories%3C/title%3E%3Crect
x='20' y='26' width='6' height='2'/%3E%3Crect x='20' y='18' width='8'
height='2'/%3E%3Crect x='20' y='10' width='10' height='2'/%3E%3Crect x='15'
y='4' width='2' height='24'/%3E%3Cpolygon points='10.586 3.959 7 7.249 3.412
3.958 2 [...]
case "FromDefinition":
- return "data:image/svg+xml,%3Csvg
xmlns='http://www.w3.org/2000/svg' width='24px' height='24px' viewBox='0 0 24
24'%3E%3Cpath fill-rule='evenodd' d='M12.6577283,22.7532553 L12,23.3275712
L11.3422717,22.7532553 C5.81130786,17.9237218 3,13.70676 3,10 C3,4.7506636
7.09705254,1 12,1 C16.9029475,1 21,4.7506636 21,10 C21,13.70676
18.1886921,17.9237218 12.6577283,22.7532553 Z M5,10 C5,12.8492324
7.30661202,16.4335466 12,20.6634039 C16.693388,16.4335466 19,12.8492324 19,10
C19,5. [...]
+ return
"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTIgMy4yNUMxMi40MTQyIDMuMjUgMTIuNzUgMy41ODU3OSAxMi43NSA0TDEyLjc1IDE4LjE4OTNMMT
[...]
case "ToDefinition":
return "data:image/svg+xml,%3Csvg width='32' height='32'
xmlns='http://www.w3.org/2000/svg'
xmlns:svg='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cstyle%3E.cls-1 %7B fill:
none; %7D%3C/style%3E%3C/defs%3E%3Cg class='layer'%3E%3Ctitle%3ELayer
1%3C/title%3E%3Cpath
d='m24.08924,9.30736l-1.67194,1.57734l4.23986,3.99986l-5.47865,0a5.92883,5.59337
0 0 0 -4.60981,-4.34899l0,-10.15173l-2.36467,0l0,10.15173a5.91168,5.5772 0 0 0
0,10.92886l0,10.15173l2.36467,0l0,-10.15173a5.92883,5. [...]
case "SwitchDefinition":
@@ -479,18 +536,149 @@ export class CamelUi {
&& dsl.uri?.startsWith("kamelet")) {
return
this.getIconFromSource(CamelUi.getKameletIconByUri(dsl.uri));
} else if (dsl.navigation === 'component' ){
- return this.getIconFromSource(camelIcon);
+ return CamelUi.getIconForComponent(dsl.title, dsl.labels);
} else {
return CamelUi.getIconForDslName(dsl.dsl);
}
}
+ static getIconForComponent = (title: string, label: string):JSX.Element =>
{
+ const labels = label.split(",");
+ if (title === "Ref") {
+ return RefIcon();
+ } else if (title === "Exec") {
+ return TerminalIcon();
+ } else if (title === "Grape") {
+ return GrapeIcon();
+ } else if (title.startsWith("Google")) {
+ return GoogleCloudIcon();
+ } else if (title.startsWith("Spring")) {
+ return SpringIcon();
+ } else if (title.startsWith("Kubernetes")) {
+ return KubernetesIcon();
+ } else if (title.startsWith("SAP")) {
+ return SapIcon();
+ } else if (title.toLowerCase().startsWith("openstack")) {
+ return OpenstackIcon();
+ } else if (title.toLowerCase().startsWith("openshift")) {
+ return OpenshiftIcon();
+ } else if (title.includes("Redis")) {
+ return RedisIcon();
+ } else if (title.startsWith("Azure")) {
+ return AzureIcon();
+ } else if (title.startsWith("AWS")) {
+ return AwsIcon();
+ } else if (title.startsWith("Debezium")) {
+ return DebeziumIcon();
+ } else if (title.startsWith("Infinispan")) {
+ return InfinispanIcon();
+ } else if (title.startsWith("Ignite")) {
+ return IgniteIcon();
+ } else if (title.startsWith("Kafka")) {
+ return KafkaIcon();
+ } else if (title.startsWith("GitHub")) {
+ return GithubIcon();
+ } else if (title.startsWith("Git")) {
+ return GitIcon();
+ } else if (title.startsWith("Hazelcast")) {
+ return HazelcastIcon();
+ } else if (title.startsWith("FHIR") || title.startsWith("MLLP")) {
+ return HealthIcon();
+ } else if (labels.includes('transformation')) {
+ return TransformationIcon();
+ } else if (labels.includes("validation")){
+ return ValidationIcon();
+ } else if (labels.includes("scheduling")){
+ return SchedulingIcon();
+ } else if (labels.includes("database")){
+ return DatabaseIcon();
+ } else if (labels.includes("cloud")){
+ return CloudIcon();
+ } else if (labels.includes("chat")){
+ return ChatIcon();
+ } else if (labels.includes("messaging")){
+ return MessagingIcon();
+ } else if (labels.includes("script")){
+ return ScriptIcon();
+ } else if (labels.includes("file")){
+ return FileIcon();
+ } else if (labels.includes("monitoring")){
+ return MonitoringIcon();
+ } else if (labels.includes("iot")){
+ return IotIcon();
+ } else if (labels.includes("mail")){
+ return MailIcon();
+ } else if (labels.includes("http")){
+ return HttpIcon();
+ } else if (labels.includes("document")){
+ return DocumentIcon();
+ } else if (labels.includes("social")){
+ return SocialIcon();
+ } else if (labels.includes("networking")){
+ return NetworkingIcon();
+ } else if (labels.includes("api")){
+ return ApiIcon();
+ } else if (labels.includes("testing")){
+ return TestingIcon();
+ } else if (labels.includes("clustering")){
+ return ClusterIcon();
+ } else if (labels.includes("mobile")){
+ return MobileIcon();
+ } else if (labels.includes("workflow")){
+ return WorkflowIcon();
+ } else if (labels.includes("webservice") || labels.includes("rest")){
+ return WebserviceIcon();
+ } else if (labels.includes("search")){
+ return SearchIcon();
+ } else if (labels.includes("blockchain")){
+ return BlockchainIcon();
+ } else if (labels.includes("ai")){
+ return MachineLearningIcon();
+ } else if (labels.includes("rpc")){
+ return RpcIcon();
+ } else {
+ return this.getIconFromSource(camelIcon);
+ }
+ }
+
+ static isElementInternalComponent = (element: CamelElement):boolean => {
+ const uri = (element as any).uri;
+ const component = ComponentApi.findByName(uri);
+ return component !== undefined &&
CamelUi.isComponentInternal(component.component.label);
+ }
+
+ static isComponentInternal = (label: string):boolean => {
+ const labels = label.split(",");
+ if (labels.includes('core') && (
+ labels.includes('transformation')
+ || labels.includes('testing')
+ || labels.includes('scheduling')
+ || labels.includes('monitoring')
+ || labels.includes('transformation')
+ || labels.includes('java')
+ || labels.includes('endpoint')
+ || labels.includes('script')
+ || labels.includes('validation')
+ )) {
+ return true;
+ } else if (label === 'transformation') {
+ return true;
+ }
+ return false;
+ }
+
static getIconForElement = (element: CamelElement):JSX.Element => {
+ const uri = (element as any).uri;
+ const component = ComponentApi.findByName(uri);
const k: KameletModel | undefined = CamelUtil.getKamelet(element);
- if (["FromDefinition", "KameletDefinition"].includes(element.dslName))
{
+ if (["FromDefinition", "KameletDefinition"].includes(element.dslName)
&& k !== undefined) {
return k ? this.getIconFromSource(k.icon()) :
CamelUi.getIconForDslName(element.dslName);
+ } else if ("FromDefinition" === element.dslName && component !==
undefined && CamelUi.isComponentInternal(component.component.label)) {
+ return this.getIconForComponent(component?.component.title,
component?.component.label);
} else if (element.dslName === "ToDefinition" && (element as
ToDefinition).uri?.startsWith("kamelet:")) {
return k ? this.getIconFromSource(k.icon()) :
CamelUi.getIconForDslName(element.dslName);
+ } else if (element.dslName === "ToDefinition" && component &&
CamelUi.isComponentInternal(component.component.label)) {
+ return this.getIconForComponent(component?.component.title,
component?.component.label);
} else {
return this.getIconForDslName(element.dslName);
}
@@ -515,7 +703,24 @@ export class CamelUi {
return <img draggable={false} src={src} className="icon" alt="icon"/>
}
- static getConnectionIcon = (element: CamelElement): string => {
+ static getConnectionIcon = (element: CamelElement): JSX.Element => {
+ const k: KameletModel | undefined = CamelUtil.getKamelet(element);
+ const uri = (element as any).uri;
+ const component = ComponentApi.findByName(uri);
+ if (component) {
+ return CamelUi.getIconForComponent(component.component.title,
component.component.label);
+ } else if (["FromDefinition",
"KameletDefinition"].includes(element.dslName)) {
+ const icon = k ? k.icon() : externalIcon;
+ return <img src={icon} className="icon"/>
+ } else if (element.dslName === "ToDefinition" && (element as
ToDefinition).uri?.startsWith("kamelet:")) {
+ const icon = k ? k.icon() :
CamelUi.getIconSrcForName(element.dslName);
+ return <img src={icon} className="icon"/>
+ } else {
+ return <img src={externalIcon} className="icon"/>;
+ }
+ }
+
+ static getConnectionIconString = (element: CamelElement): string => {
const k: KameletModel | undefined = CamelUtil.getKamelet(element);
if (["FromDefinition", "KameletDefinition"].includes(element.dslName))
{
return k ? k.icon() : externalIcon;
diff --git
a/karavan-web/karavan-app/src/main/webui/src/designer/utils/KaravanIcons.tsx
b/karavan-web/karavan-app/src/main/webui/src/designer/utils/KaravanIcons.tsx
index 6bd0e15b..0e9b6d82 100644
--- a/karavan-web/karavan-app/src/main/webui/src/designer/utils/KaravanIcons.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/designer/utils/KaravanIcons.tsx
@@ -198,9 +198,9 @@ export function CamelIcon(props?: (JSX.IntrinsicAttributes
& React.SVGProps<SVGS
y1="108.214%"
y2="-1.964%"
>
- <stop offset="0%" stopColor="#F69923" />
- <stop offset="10.996%" stopColor="#F79A23" />
- <stop offset="94.502%" stopColor="#E97826" />
+ <stop offset="0%" stopColor="#F69923"/>
+ <stop offset="10.996%" stopColor="#F79A23"/>
+ <stop offset="94.502%" stopColor="#E97826"/>
</linearGradient>
<linearGradient
id="d"
@@ -209,9 +209,9 @@ export function CamelIcon(props?: (JSX.IntrinsicAttributes
& React.SVGProps<SVGS
y1="108.214%"
y2="-1.964%"
>
- <stop offset="0%" stopColor="#F69923" />
- <stop offset="8.048%" stopColor="#F79A23" />
- <stop offset="41.874%" stopColor="#E97826" />
+ <stop offset="0%" stopColor="#F69923"/>
+ <stop offset="8.048%" stopColor="#F79A23"/>
+ <stop offset="41.874%" stopColor="#E97826"/>
</linearGradient>
<linearGradient
id="e"
@@ -220,14 +220,14 @@ export function CamelIcon(props?:
(JSX.IntrinsicAttributes & React.SVGProps<SVGS
y1="-3.059%"
y2="100.066%"
>
- <stop offset="0%" stopColor="#F6E423" />
- <stop offset="41.191%" stopColor="#F79A23" />
- <stop offset="73.271%" stopColor="#E97826" />
+ <stop offset="0%" stopColor="#F6E423"/>
+ <stop offset="41.191%" stopColor="#F79A23"/>
+ <stop offset="73.271%" stopColor="#E97826"/>
</linearGradient>
- <circle id="a" cx={128} cy={128} r={128} />
+ <circle id="a" cx={128} cy={128} r={128}/>
</defs>
<mask id="c" fill="#fff">
- <use xlinkHref="#a" />
+ <use xlinkHref="#a"/>
</mask>
<circle
cx={127.994}
@@ -713,4 +713,1119 @@ export function QuarkusIcon() {
></path>
</svg>
);
-}
\ No newline at end of file
+}
+
+export function DatabaseIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width="800"
+ height="800"
+ viewBox="0 0 24 24"
+ className="icon">
+ <path
+ fillRule="evenodd"
+ d="M12 1.25c-2.487 0-4.774.402-6.466
1.079-.844.337-1.577.758-2.112 1.264C2.886 4.1 2.5 4.744 2.5
5.5v12.987l.026.013H2.5c0 .756.386 1.4.922 1.907.535.506 1.268.927 2.112 1.264
1.692.677 3.979 1.079 6.466 1.079s4.773-.402 6.466-1.079c.844-.337 1.577-.758
2.112-1.264.536-.507.922-1.151.922-1.907h-.026l.026-.013V5.5c0-.756-.386-1.4-.922-1.907-.535-.506-1.268-.927-2.112-1.264C16.773
1.652 14.487 1.25 12 1.25zM4 5.5c0-.21.104-.487.453-.817.35-.332.899-.666
1.638-.962C7.566 3. [...]
+ ></path>
+ </svg>
+ );
+}
+
+export function CloudIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <path
+ d="M16 7a7.66 7.66 0 0 1 1.51.15 8 8 0 0 1 6.35 6.34l.26 1.35
1.35.24a5.5 5.5 0 0 1-1 10.92H7.5a5.5 5.5 0 0 1-1-10.92l1.34-.24.26-1.35A8 8 0
0 1 16 7m0-2a10 10 0 0 0-9.83 8.12A7.5 7.5 0 0 0 7.49 28h17a7.5 7.5 0 0 0
1.32-14.88 10 10 0 0 0-7.94-7.94A10.27 10.27 0 0 0 16 5Z"/>
+ <path
+ d="M0 0h32v32H0z"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+
+export function FileIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ xmlSpace="preserve"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <title>{"document"}</title>
+ <path
+ d="m25.7 9.3-7-7c-.2-.2-.4-.3-.7-.3H8c-1.1 0-2 .9-2 2v24c0
1.1.9 2 2 2h16c1.1 0 2-.9 2-2V10c0-.3-.1-.5-.3-.7zM18 4.4l5.6 5.6H18V4.4zM24
28H8V4h8v6c0 1.1.9 2 2 2h6v16z"/>
+ <path d="M10 22h12v2H10zM10 16h12v2H10z"/>
+ <path
+ d="M0 0h32v32H0z"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+
+export function MessagingIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <path d="M28 28H4a2.002 2.002 0 0 1-2-2v-5h2v5h24v-5h2v5a2.002
2.002 0 0 1-2 2Z"/>
+ <path d="M7 21h18v2H7zM7 16h18v2H7zM7 11h18v2H7zM7 6h18v2H7z"/>
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function SchedulingIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <path d="M16 30a14 14 0 1 1 14-14 14 14 0 0 1-14 14Zm0-26a12 12 0
1 0 12 12A12 12 0 0 0 16 4Z" />
+ <path d="M20.59 22 15 16.41V7h2v8.58l5 5.01L20.59 22z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+
+export function HttpIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <path d="M30 11h-5v10h2v-3h3a2.003 2.003 0 0 0 2-2v-3a2.002 2.002
0 0 0-2-2Zm-3 5v-3h3l.001 3ZM10 13h2v8h2v-8h2v-2h-6v2zM23
11h-6v2h2v8h2v-8h2v-2zM6 11v4H3v-4H1v10h2v-4h3v4h2V11H6z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function GoogleCloudIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ preserveAspectRatio="xMidYMid"
+ viewBox="0 -25 256 256"
+ className="icon">
+ <path
+ fill="#EA4335"
+ d="m170.252 56.819 22.253-22.253 1.483-9.37C153.437-11.677
88.976-7.496 52.42 33.92 42.267 45.423 34.734 59.764 30.717 74.573l7.97-1.123
44.505-7.34 3.436-3.513c19.797-21.742 53.27-24.667 76.128-6.168l7.496.39Z"
+ />
+ <path
+ fill="#4285F4"
+ d="M224.205 73.918a100.249 100.249 0 0 0-30.217-48.722l-31.232
31.232a55.515 55.515 0 0 1 20.379 44.037v5.544c15.35 0 27.797 12.445 27.797
27.796 0 15.352-12.446 27.485-27.797 27.485h-55.671l-5.466 5.934v33.34l5.466
5.231h55.67c39.93.311 72.553-31.494 72.864-71.424a72.303 72.303 0 0
0-31.793-60.453"
+ />
+ <path
+ fill="#34A853"
+ d="M71.87 205.796h55.593V161.29H71.87a27.275 27.275 0 0
1-11.399-2.498l-7.887 2.42-22.409 22.253-1.952 7.574c12.567 9.489 27.9 14.825
43.647 14.757"
+ />
+ <path
+ fill="#FBBC05"
+ d="M71.87 61.425C31.94 61.664-.237 94.228.001 134.159a72.301
72.301 0 0 0 28.222
56.88l32.248-32.246c-13.99-6.322-20.208-22.786-13.887-36.776 6.32-13.99
22.786-20.208 36.775-13.888a27.796 27.796 0 0 1 13.887
13.888l32.248-32.248A72.224 72.224 0 0 0 71.87 61.425"
+ />
+ </svg>
+ );
+}
+export function AwsIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ fill="none"
+ viewBox="0 0 16 16"
+ className="icon">
+ <path
+ fill="#252F3E"
+ d="M4.51 7.687c0
.197.02.357.058.475.042.117.096.245.17.384a.233.233 0 0 1 .037.123c0
.053-.032.107-.1.16l-.336.224a.255.255 0 0 1-.138.048c-.054
0-.107-.026-.16-.074a1.652 1.652 0 0 1-.192-.251 4.137 4.137 0 0
1-.165-.315c-.415.491-.936.737-1.564.737-.447
0-.804-.129-1.064-.385-.261-.256-.394-.598-.394-1.025
0-.454.16-.822.484-1.1.325-.278.756-.416 1.304-.416.18 0
.367.016.564.042.197.027.4.07.612.118v-.39c0-.406-.085-.689-.25-.854-.17-.166-.458-.246-.868-.246-.186
0-.37 [...]
+ />
+ <g fill="#F90" fillRule="evenodd" clipRule="evenodd">
+ <path d="M14.465 11.813c-1.75 1.297-4.294 1.986-6.481
1.986-3.065 0-5.827-1.137-7.913-3.027-.165-.15-.016-.353.18-.235 2.257 1.313
5.04 2.109 7.92 2.109 1.941 0 4.075-.406 6.039-1.239.293-.133.543.192.255.406z"
/>
+ <path d="M15.194
10.98c-.223-.287-1.479-.138-2.048-.069-.17.022-.197-.128-.043-.24 1-.705
2.645-.502 2.836-.267.192.24-.053 1.89-.99
2.68-.143.123-.281.06-.218-.1.213-.53.687-1.72.463-2.003z" />
+ </g>
+ </svg>
+ );
+}
+export function MailIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <title>{"email"}</title>
+ <path d="M28 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h24a2 2 0 0 0
2-2V8a2 2 0 0 0-2-2Zm-2.2 2L16 14.78 6.2 8ZM4 24V8.91l11.43 7.91a1 1 0 0 0 1.14
0L28 8.91V24Z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function IotIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <title>{"iot--platform"}</title>
+ <path d="M30 19h-4v-4h-2v9H8V8h9V6h-4V2h-2v4H8a2.002 2.002 0 0 0-2
2v3H2v2h4v6H2v2h4v3a2.002 2.002 0 0 0 2 2h3v4h2v-4h6v4h2v-4h3a2.003 2.003 0 0 0
2-2v-3h4Z" />
+ <path d="M21 21H11V11h10Zm-8-2h6v-6h-6ZM31 13h-2A10.012 10.012 0 0
0 19 3V1a12.013 12.013 0 0 1 12 12Z" />
+ <path d="M26 13h-2a5.006 5.006 0 0 0-5-5V6a7.008 7.008 0 0 1 7 7Z"
/>
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function GithubIcon() {
+ return (
+ <svg
+ width={32}
+ height={32}
+ aria-hidden="true"
+ data-view-component="true"
+ viewBox="0 0 16 16"
+ className="icon">
+ <path d="M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45
7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48
1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0
0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2
.27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82
2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51
1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82
1.13.16. [...]
+ </svg>
+ );
+}
+export function KafkaIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ preserveAspectRatio="xMidYMid"
+ viewBox="-78.5 0 413 413"
+ className="icon">
+ <path
+ fill="#1A1919"
+ d="M87.932 36.714c-4.55-4.571-10.896-7.394-17.951-7.394-7.029
0-13.326 2.823-17.822 7.394h-.13c-4.535 4.55-7.358 10.9-7.358 17.93 0 7.055
2.823 13.352 7.359 17.875l.129.102c4.496 4.55 10.793 7.346 17.822 7.346 7.055 0
13.402-2.797 17.951-7.346L88 72.52c4.558-4.523 7.354-10.82 7.354-17.876
0-7.029-2.796-13.38-7.354-17.929h-.067Zm-17.951 346.64a25.504 25.504 0 0 0
17.951-7.368l.067-.134c4.558-4.487 7.354-10.838 7.354-17.817
0-7.056-2.796-13.38-7.354-17.952h-.067c-4.55-4.625 [...]
+ />
+ </svg>
+ );
+}
+export function GrapeIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ xmlSpace="preserve"
+ viewBox="0 0 512 512"
+ className="icon">
+ <path
+ d="M438.557 512H19.785c-8.216
0-14.876-6.66-14.876-14.876V256.916c0-8.216 6.66-14.876 14.876-14.876s14.876
6.66 14.876 14.876v225.332h389.021v-32.833c0-8.216 6.661-14.876
14.876-14.876s14.876 6.66 14.876 14.876v47.709c-.001 8.216-6.662 14.876-14.877
14.876z"
+ style={{
+ fill: "#2d527c",
+ }}
+ />
+ <path
+ d="M19.785 177.122v-4.79L175.581 14.876v162.246zM196.154
219.435h296.061v163.65H196.154z"
+ style={{
+ fill: "#cee8fa",
+ }}
+ />
+ <path
+ d="M492.215 204.559h-38.782V14.876C453.433 6.66 446.772 0
438.557 0H175.581c-.182 0-.361.021-.543.027a14.949 14.949 0 0
0-2.41.269c-.018.003-.036.01-.054.013-.613.126-1.211.302-1.8.504-.158.054-.315.11-.472.171-.58.22-1.148.466-1.697.756-.024.012-.048.021-.071.034-.567.305-1.105.66-1.63
1.037a10.84 10.84 0 0 0-.403.302c-.521.402-1.026.827-1.495 1.3L9.21
161.868c-.35.353-.678.721-.988
1.104-.207.254-.388.521-.576.784-.092.131-.195.256-.283.388a15.3 15.3 0 0
0-.592.998c-.04 [...]
+ style={{
+ fill: "#2d527c",
+ }}
+ />
+ <path
+ d="M265.4 270.343c-3.927 0-6.153-4.188-6.153-9.031 0-4.189
1.831-8.771 6.153-8.771h22.907c4.451 0 8.902 2.095 8.902 6.285v59.298c0
22.516-14.269 30.894-31.418 30.894-18.718 0-32.857-9.949-32.857-27.36 0-7.854
3.273-9.687 10.342-9.687 5.236 0 9.687 1.309 10.078 6.153.393 5.105 1.047
13.091 11.521 13.091 7.593 0 11.913-4.188
11.913-13.091v-47.78H265.4v-.001zM304.411
339.854c0-.393.131-.916.262-1.44l24.349-79.853c1.44-4.58 7.331-6.806
13.353-6.806s11.913 2.225 13.353 6.806l2 [...]
+ style={{
+ fill: "#2d527c",
+ }}
+ />
+ </svg>
+ );
+}
+export function MachineLearningIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <path d="M27 24a2.96 2.96 0 0 0-1.285.3l-4.3-4.3H18v2h2.586l3.715
3.715A2.966 2.966 0 0 0 24 27a3 3 0 1 0 3-3Zm0 4a1 1 0 1 1 1-1 1 1 0 0 1-1
1ZM27 13a2.995 2.995 0 0 0-2.816 2H18v2h6.184A2.995 2.995 0 1 0 27 13Zm0 4a1 1
0 1 1 1-1 1 1 0 0 1-1 1ZM27 2a3.003 3.003 0 0 0-3 3 2.966 2.966 0 0 0 .348
1.373L20.596 10H18v2h3.404l4.4-4.252A2.999 2.999 0 1 0 27 2Zm0 4a1 1 0 1 1 1-1
1 1 0 0 1-1 1Z" />
+ <path d="M18 6h2V4h-2a3.976 3.976 0 0 0-3 1.382A3.976 3.976 0 0 0
12 4h-1a9.01 9.01 0 0 0-9 9v6a9.01 9.01 0 0 0 9 9h1a3.976 3.976 0 0 0
3-1.382A3.976 3.976 0 0 0 18 28h2v-2h-2a2.002 2.002 0 0 1-2-2V8a2.002 2.002 0 0
1 2-2Zm-6 20h-1a7.005 7.005 0 0 1-6.92-6H6v-2H4v-4h3a3.003 3.003 0 0 0
3-3V9H8v2a1 1 0 0 1-1 1H4.08A7.005 7.005 0 0 1 11 6h1a2.002 2.002 0 0 1 2
2v4h-2v2h2v4h-2a3.003 3.003 0 0 0-3 3v2h2v-2a1 1 0 0 1 1-1h2v4a2.002 2.002 0 0
1-2 2Z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function TerminalIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <title>{"terminal"}</title>
+ <path d="M26 4.01H6a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h20a2 2 0 0 0
2-2v-20a2 2 0 0 0-2-2Zm0 2v4H6v-4Zm-20 20v-14h20v14Z" />
+ <path d="m10.76 16.18 2.82 2.83-2.82 2.83 1.41 1.41
4.24-4.24-4.24-4.24-1.41 1.41z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function SapIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 1024 1024"
+ className="icon">
+ <circle
+ cx={512}
+ cy={512}
+ r={512}
+ style={{
+ fill: "#007cc5",
+ }}
+ />
+ <path
+ d="M256 359.88v304.24h310.82L871 359.88zm83.62 56.58h.14c22.11
0 49.06 6.29 68.56 16.22l-21 36.64C365.92 459 355.17 458 343
457.36c-18.14-1-27.26 5.51-27.4 12.5-.18 8.52 17.13 16.23 33.45 21.47 24.7 7.85
56.1 18.33 60.9 48.7l45.15-119.36h52.45l52.88 142.91-.2-142.86H621c57.84 0 85
19.58 85 64.53 0 40.36-28 64.42-75.25 64.42h-19.56l-.19
53.69-92-.09-6.38-23.27a101.65 101.65 0 0 1-31.56 4.83 100.52 100.52 0 0
1-32.32-5.12l-9.19 23.54-51.25.16 2.3-11.84c-.73.64-1.43 1.29-2.2 [...]
+ style={{
+ fill: "#fff",
+ }}
+ />
+ </svg>
+ );
+}
+export function ScriptIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <title>{"script"}</title>
+ <path d="m18.83 26 2.58-2.58L20 22l-4 4 4 4 1.42-1.41L18.83
26zM27.17 26l-2.58 2.58L26 30l4-4-4-4-1.42 1.41L27.17 26z" />
+ <path d="M14 28H8V4h8v6a2.006 2.006 0 0 0 2 2h6v6h2v-8a.91.91 0 0
0-.3-.7l-7-7A.909.909 0 0 0 18 2H8a2.006 2.006 0 0 0-2 2v24a2.006 2.006 0 0 0 2
2h6Zm4-23.6 5.6 5.6H18Z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function ValidationIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <path d="m22 27.18-2.59-2.59L18 26l4 4 8-8-1.41-1.41L22 27.18z" />
+ <path d="M15 28H8V4h8v6a2.006 2.006 0 0 0 2 2h6v6h2v-8a.91.91 0 0
0-.3-.7l-7-7A.909.909 0 0 0 18 2H8a2.006 2.006 0 0 0-2 2v24a2.006 2.006 0 0 0 2
2h7Zm3-23.6 5.6 5.6H18Z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function OpenstackIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ preserveAspectRatio="xMidYMid"
+ viewBox="0 -2.5 256 256"
+ className="icon">
+ <path
+ fill="#DA1A32"
+ d="M57.82 170.723v9.156c0 7.104 5.756 12.86 12.86
12.86h114.65c7.104 0 12.86-5.756 12.86-12.86v-9.156H256v56.051c0 13.082-10.703
23.785-23.785 23.785H23.785C10.703 250.559 0 239.856 0
226.774v-56.051h57.82Zm-.01-74.353v57.809H0v-57.81h57.81Zm198.19
0v57.809h-57.81v-57.81H256ZM232.215 0C245.297 0 256 10.703 256
23.795v56.041h-57.81V70.68c0-7.104-5.756-12.86-12.86-12.86H70.67c-7.104 0-12.86
5.756-12.86 12.86v9.156H0V23.785C0 10.703 10.703 0 23.785 0Z"
+ />
+ </svg>
+ );
+}
+export function OpenshiftIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ preserveAspectRatio="xMidYMid"
+ viewBox="0 -9.5 256 256"
+ className="icon">
+ <path
+ fill="#DA2430"
+ d="m74.84 106.893-40.869 14.87c.525 6.552 1.652 13.024 3.24
19.366l38.818-14.137c-1.244-6.552-1.689-13.32-1.18-20.1M255.444
61.702c-2.85-5.879-6.147-11.561-9.966-16.916l-40.857 14.87c4.755 4.864 8.743
10.33 12.007 16.176L255.445 61.7v.002Z"
+ />
+ <path
+ fill="#DA2430"
+ d="M182.95
61.461c-5.14-4.46-10.946-8.31-17.408-11.324h-.003C127.6 32.449 82.33 48.905
64.642 86.859a73.976 73.976 0 0 0-2.653 6.487c-2.208 6.423-3.498 12.99-3.991
19.546l-.144.054-.011.144-24.596 8.95-15.826
5.849-.007-.088-.434.158c-1.536-19.435 1.74-39.512 10.553-58.411a117.952
117.952 0 0 1 3.687-7.246c29.054-54.116 95.164-76.736 150.918-50.33a115.314
115.314 0 0 1 30.557 21.074 116.597 116.597 0 0 1 15.78 17.94L187.618
65.86a79.69 79.69 0 0 0-.635-.641l-.113.041a78.6 [...]
+ />
+ <path
+ fill="#E82429"
+ d="m19.261 193.896-.064.024A118.404 118.404 0 0 1 .939
154.347l38.825-14.14.002.003.024.125.252-.093.006.015c1.994 10.56 6.145 20.635
12.198 29.494a75.287 75.287 0 0 0 7.722 9.326l-.154.057.294.308-40.488
14.97c-.12-.171-.24-.343-.359-.516Z"
+ />
+ <path
+ fill="#DA2430"
+ d="M173.465 183.447c-21.051 13.017-48.053 15.532-72.113
4.312a75.139 75.139 0 0 1-22.118-15.695l-40.772 14.844.313.437-.02.008c11.21
16.016 26.502 29.404 45.266 38.298 40.47 19.163 86.387 12.501 119.634-13.284
14.888-11.152 27.317-26.016 35.713-44.02 8.819-18.895 12.076-38.964
10.515-58.384l-1.136.414c-.015-.208-.03-.416-.047-.624l-40.49
14.957.002.004a76.457 76.457 0 0 1-6.806 26.46c-6.315 13.753-16.164
24.708-27.94 32.273Z"
+ />
+ <path
+ fill="#E82429"
+ d="m218.552 75.13.607-.222v-.001a117.732 117.732 0 0 1 11.454
42.055l-40.773
14.834.022-.304-.77.285c1.11-15.088-2.275-30.093-9.435-43.123l38.548-14.25.002-.004c.116.243.231.486.345.73Z"
+ />
+ <path
+ fill="#C22035"
+ d="M74.89 106.654 34.31 121.65c.52 6.61 1.64 13.136 3.219
19.532l38.546-14.258c-1.247-6.622-1.695-13.438-1.169-20.274M254.227
61.083c-2.83-5.929-6.106-11.658-9.898-17.059L203.76 59.02c4.72 4.906 8.68
10.418 11.92 16.315l38.542-14.256.006.004Z"
+ />
+ <path
+ fill="#AC223B"
+ d="m34.308 121.653 40.482-14.829-.165 8.133-39.056
14.749-1.266-8.063.005.01ZM203.766 58.897l41.113-14.108 4.273 6.449-39.946
14.121-5.434-6.465-.006.003Z"
+ />
+ <path
+ fill="#B92135"
+ d="m38.764 187.201 40.53-14.749 12.258 11.565-42.503
15.956-10.283-12.776-.002.004ZM249.38 109.862l-41.165 14.844-3.032 16.478
43.892-15.643.311-15.677-.005-.002Z"
+ />
+ </svg>
+ );
+}
+export function RefIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <path d="M4 20v2h4.586L2 28.586 3.414 30 10 23.414V28h2v-8H4zM30
30h-8v-8h8Zm-6-2h4v-4h-4ZM20 20h-8v-8h8Zm-6-2h4v-4h-4Z" />
+ <path d="M24 17h-2v-2h2a4 4 0 0 0 0-8H12V5h12a6 6 0 0 1 0 12ZM10
10H2V2h8ZM4 8h4V4H4Z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function RedisIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ preserveAspectRatio="xMidYMid"
+ viewBox="0 -18 256 256"
+ className="icon">
+ <path
+ fill="#912626"
+ d="M245.97 168.943c-13.662 7.121-84.434 36.22-99.501
44.075-15.067 7.856-23.437 7.78-35.34
2.09-11.902-5.69-87.216-36.112-100.783-42.597C3.566 169.271 0 166.535 0
163.951v-25.876s98.05-21.345 113.879-27.024c15.828-5.679 21.32-5.884 34.79-.95
13.472 4.936 94.018 19.468 107.331 24.344l-.006 25.51c.002 2.558-3.07
5.364-10.024 8.988"
+ />
+ <path
+ fill="#C6302B"
+ d="M245.965 143.22c-13.661 7.118-84.431 36.218-99.498
44.072-15.066 7.857-23.436 7.78-35.338
2.09-11.903-5.686-87.214-36.113-100.78-42.594-13.566-6.485-13.85-10.948-.524-16.166
13.326-5.22 88.224-34.605 104.055-40.284 15.828-5.677 21.319-5.884 34.789-.948
13.471 4.934 83.819 32.935 97.13 37.81 13.316 4.881 13.827 8.9.166 16.02"
+ />
+ <path
+ fill="#912626"
+ d="M245.97 127.074c-13.662 7.122-84.434 36.22-99.501
44.078-15.067 7.853-23.437 7.777-35.34
2.087-11.903-5.687-87.216-36.112-100.783-42.597C3.566 127.402 0 124.67 0
122.085V96.206s98.05-21.344 113.879-27.023c15.828-5.679 21.32-5.885
34.79-.95C162.142 73.168 242.688 87.697 256 92.574l-.006 25.513c.002 2.557-3.07
5.363-10.024 8.987"
+ />
+ <path
+ fill="#C6302B"
+ d="M245.965 101.351c-13.661 7.12-84.431 36.218-99.498
44.075-15.066 7.854-23.436 7.777-35.338
2.087-11.903-5.686-87.214-36.112-100.78-42.594-13.566-6.483-13.85-10.947-.524-16.167C23.151
83.535 98.05 54.148 113.88 48.47c15.828-5.678 21.319-5.884 34.789-.949 13.471
4.934 83.819 32.933 97.13 37.81 13.316 4.88 13.827 8.9.166 16.02"
+ />
+ <path
+ fill="#912626"
+ d="M245.97 83.653c-13.662 7.12-84.434 36.22-99.501
44.078-15.067 7.854-23.437 7.777-35.34
2.087-11.903-5.687-87.216-36.113-100.783-42.595C3.566 83.98 0 81.247 0
78.665v-25.88s98.05-21.343 113.879-27.021c15.828-5.68 21.32-5.884
34.79-.95C162.142 29.749 242.688 44.278 256 49.155l-.006 25.512c.002 2.555-3.07
5.361-10.024 8.986"
+ />
+ <path
+ fill="#C6302B"
+ d="M245.965 57.93c-13.661 7.12-84.431 36.22-99.498
44.074-15.066 7.854-23.436 7.777-35.338 2.09C99.227 98.404 23.915 67.98 10.35
61.497-3.217 55.015-3.5 50.55 9.825 45.331 23.151 40.113 98.05 10.73 113.88
5.05c15.828-5.679 21.319-5.883 34.789-.948 13.471 4.935 83.819 32.934 97.13
37.811 13.316 4.876 13.827 8.897.166 16.017"
+ />
+ <path
+ fill="#FFF"
+ d="m159.283 32.757-22.01 2.285-4.927
11.856-7.958-13.23-25.415-2.284 18.964-6.839-5.69-10.498 17.755 6.944
16.738-5.48-4.524 10.855 17.067 6.391M131.032 90.275 89.955
73.238l58.86-9.035-17.783 26.072M74.082 39.347c17.375 0 31.46 5.46 31.46 12.194
0 6.736-14.085 12.195-31.46 12.195s-31.46-5.46-31.46-12.195c0-6.734
14.085-12.194 31.46-12.194"
+ />
+ <path
+ fill="#621B1C"
+ d="m185.295 35.998 34.836 13.766-34.806 13.753-.03-27.52"
+ />
+ <path
+ fill="#9A2928"
+ d="m146.755 51.243 38.54-15.245.03 27.519-3.779
1.478-34.791-13.752"
+ />
+ </svg>
+ );
+}
+export function SearchIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <path d="m29 27.586-7.552-7.552a11.018 11.018 0 1 0-1.414
1.414L27.586 29ZM4 13a9 9 0 1 1 9 9 9.01 9.01 0 0 1-9-9Z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function BlockchainIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <title>{"blockchain"}</title>
+ <path d="M6 24H4V8h2ZM28 8h-2v16h2Zm-4-2V4H8v2Zm0 22v-2H8v2Z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function ChatIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <title>{"chat"}</title>
+ <path d="M17.74 30 16 29l4-7h6a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2H6a2 2
0 0 0-2 2v12a2 2 0 0 0 2 2h9v2H6a4 4 0 0 1-4-4V8a4 4 0 0 1 4-4h20a4 4 0 0 1 4
4v12a4 4 0 0 1-4 4h-4.84Z" />
+ <path d="M8 10h16v2H8zM8 16h10v2H8z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function WorkflowIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ xmlSpace="preserve"
+ width={800}
+ height={800}
+ viewBox="0 0 512 512"
+ className="icon">
+ <path d="M445.66 49.341H340.206L294.008
3.143c-4.192-4.191-10.99-4.191-15.183 0l-49.341 49.342c-4.192 4.192-4.192 10.99
0 15.183l46.198 46.198v38.494h-80.516c-5.929 0-10.736 4.806-10.736
10.735v21.471h-42.942v-21.471c0-5.929-4.806-10.735-10.736-10.735H66.34c-5.929
0-10.735 4.806-10.735 10.735v64.413c0 5.929 4.806 10.735 10.735
10.735h20.755v93.798c0 5.929 4.806 10.736 10.735 10.736h95.437l-10.346
10.346c-4.192 4.192-4.193 10.99 0 15.182a10.7 10.7 0 0 0 7.591 3.144c2.747 0
5.4 [...]
+ </svg>
+ );
+}
+export function WebserviceIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <title>{"fog"}</title>
+ <path d="M25.829 13.116A10.02 10.02 0 0 0 16 5v2a8.023 8.023 0 0 1
7.865 6.493l.259 1.346 1.349.245A5.502 5.502 0 0 1 24.508 26H16v2h8.508a7.502
7.502 0 0 0 1.32-14.884ZM8 24h6v2H8zM4 24h2v2H4zM6 20h8v2H6zM2 20h2v2H2zM8
16h6v2H8zM4 16h2v2H4zM10 12h4v2h-4zM6 12h2v2H6zM12 8h2v2h-2z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function MobileIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <path d="M23 7h4v4h-4zM23 13h4v4h-4zM17 7h4v4h-4zM17 13h4v4h-4z" />
+ <circle cx={14.5} cy={24.5} r={1.5} />
+ <path d="M21 30H8a2.002 2.002 0 0 1-2-2V4a2.002 2.002 0 0 1
2-2h13v2H8v24h13v-8h2v8a2.002 2.002 0 0 1-2 2Z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function ClusterIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <path d="M16 7a3 3 0 1 1 3-3 3.003 3.003 0 0 1-3 3Zm0-4a1 1 0 1 0
1 1 1.001 1.001 0 0 0-1-1ZM11 30a3 3 0 1 1 3-3 3.003 3.003 0 0 1-3 3Zm0-4a1 1 0
1 0 1 1 1.001 1.001 0 0 0-1-1ZM7 11a3 3 0 1 1 3-3 3.003 3.003 0 0 1-3 3Zm0-4a1
1 0 1 0 1 1 1.001 1.001 0 0 0-1-1ZM21 30a3 3 0 1 1 3-3 3.003 3.003 0 0 1-3
3Zm0-4a1 1 0 1 0 1 1 1.001 1.001 0 0 0-1-1ZM25 11a3 3 0 1 1 3-3 3.003 3.003 0 0
1-3 3Zm0-4a1 1 0 1 0 1 1 1.001 1.001 0 0 0-1-1ZM4 21a3 3 0 1 1 3-3 3.003 3.003
0 0 1-3 3Zm0-4a1 1 0 [...]
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function RpcIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <path d="m14 26 1.41-1.41L7.83 17H28v-2H7.83l7.58-7.59L14 6 4
16l10 10z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function InfinispanIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ id="artwork"
+ viewBox="0 0 1024 1024"
+ className="icon">
+ <defs>
+ <style>{".cls-2{fill:#fff}"}</style>
+ </defs>
+ <path
+ d="M1 1h1022v1022H1z"
+ style={{
+ fill: "#599fc6",
+ }}
+ />
+ <path
+ d="M566.84
512c0-221.39-179.47-400.86-400.86-400.86v109.68c160.56 0 291.18 130.62 291.18
291.18 0 221.39 179.47 400.86 400.86 400.86V803.18c-160.56
0-291.18-130.62-291.18-291.18Z"
+ className="cls-2"
+ />
+ <path
+ d="M436.76 618.86C394.05 726.69 288.82 803.18 166
803.18v109.68c134.26 0 253-66.07 325.76-167.4a432.16 432.16 0 0
1-55-126.6ZM587.24 405.14C630 297.31 735.19 220.82 858 220.82V111.14c-134.26
0-253 66.07-325.77 167.4a431.92 431.92 0 0 1 55.01 126.6Z"
+ className="cls-2"
+ />
+ </svg>
+ );
+}
+export function TransformationIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <title>{"data-share"}</title>
+ <path d="M5 25v-9.172l-3.586 3.586L0 18l6-6 6 6-1.414 1.414L7
15.828V25h12v2H7a2.002 2.002 0 0 1-2-2ZM24 22h4a2.002 2.002 0 0 1 2 2v4a2.002
2.002 0 0 1-2 2h-4a2.002 2.002 0 0 1-2-2v-4a2.002 2.002 0 0 1 2-2Zm4
6v-4h-4.002L24 28ZM27 6v9.172l3.586-3.586L32 13l-6 6-6-6 1.414-1.414L25
15.172V6H13V4h12a2.002 2.002 0 0 1 2 2ZM2 6h6v2H2zM2 2h8v2H2z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function TestingIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <path d="M28 17v5H4V6h10V4H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2
2h8v4H8v2h16v-2h-4v-4h8a2 2 0 0 0 2-2v-5ZM18 28h-4v-4h4Z" />
+ <path d="M30 10V8h-2.101a4.968 4.968 0 0
0-.732-1.753l1.49-1.49-1.414-1.414-1.49 1.49A4.968 4.968 0 0 0 24
4.101V2h-2v2.101a4.968 4.968 0 0 0-1.753.732l-1.49-1.49-1.414 1.414 1.49
1.49A4.968 4.968 0 0 0 18.101 8H16v2h2.101a4.968 4.968 0 0 0 .732 1.753l-1.49
1.49 1.414 1.414 1.49-1.49a4.968 4.968 0 0 0 1.753.732V16h2v-2.101a4.968 4.968
0 0 0 1.753-.732l1.49 1.49 1.414-1.414-1.49-1.49A4.968 4.968 0 0 0 27.899
10Zm-7 2a3 3 0 1 1 3-3 3.003 3.003 0 0 1-3 3Z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function ApiIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <title>{"api"}</title>
+ <path d="M26 22a3.86 3.86 0 0 0-2 .57l-3.09-3.1a6 6 0 0 0
0-6.94L24 9.43a3.86 3.86 0 0 0 2 .57 4 4 0 1 0-4-4 3.86 3.86 0 0 0 .57 2l-3.1
3.09a6 6 0 0 0-6.94 0L9.43 8A3.86 3.86 0 0 0 10 6a4 4 0 1 0-4 4 3.86 3.86 0 0 0
2-.57l3.09 3.1a6 6 0 0 0 0 6.94L8 22.57A3.86 3.86 0 0 0 6 22a4 4 0 1 0 4 4 3.86
3.86 0 0 0-.57-2l3.1-3.09a6 6 0 0 0 6.94 0l3.1 3.09a3.86 3.86 0 0 0-.57 2 4 4 0
1 0 4-4Zm0-18a2 2 0 1 1-2 2 2 2 0 0 1 2-2ZM4 6a2 2 0 1 1 2 2 2 2 0 0 1-2-2Zm2
22a2 2 0 1 1 2-2 2 2 0 0 1 [...]
+ <path
+ d="M0 0h32v32H0z"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function MonitoringIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <path d="M28 16v6H4V6h7V4H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2
2h8v4H8v2h16v-2h-4v-4h8a2 2 0 0 0 2-2v-6ZM18 28h-4v-4h4Z" />
+ <path d="M18 18h-.01a1 1 0 0 1-.951-.725L15.246 11H11V9h5a1 1 0 0
1 .962.725l1.074 3.76 3.009-9.78A1.014 1.014 0 0 1 22 3a.98.98 0 0 1
.949.684L24.72 9H30v2h-6a1 1 0 0 1-.949-.684l-1.013-3.04-3.082 10.018A1 1 0 0 1
18 18Z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function NetworkingIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ xmlSpace="preserve"
+ width={800}
+ height={800}
+ viewBox="0 0 511.984 511.984"
+ className="icon">
+ <path d="M207.29 287.991H48.735C30.687 287.991 16 302.375 16
320.054v111.868c0 17.679 14.688 32.063 32.735 32.063H207.29c18.031 0
32.703-14.384 32.703-32.063V320.054c0-17.679-14.672-32.063-32.703-32.063zm0
143.996-159.291-.064.736-111.932 159.259.064.048 111.645c0
.015-.192.287-.752.287z" />
+ <path d="M383.988 239.992H127.996c-8.832 0-16 7.168-16 16v47.998c0
8.832 7.168 16 16 16s15.999-7.168 15.999-16v-31.999h223.993v31.999c0 8.832
7.168 16 16 16s15.999-7.168 15.999-16v-47.998c0-8.832-7.167-16-15.999-16z" />
+ <path d="M463.25 287.991H304.727c-18.047 0-32.735 14.384-32.735
32.063v111.868c0 17.679 14.688 32.063 32.735 32.063H463.25c18.047 0
32.735-14.384 32.735-32.063V320.054c-.001-17.679-14.688-32.063-32.735-32.063zm0
143.996-159.259-.064.736-111.932 159.259.064.064
111.645c-.016-.001-.208.287-.8.287zM415.987 479.985h-63.998c-8.832 0-16
7.168-16 16s7.168 16 16 16h63.998c8.832 0 16-7.168
16-16s-7.168-16-16-16zM335.253 0H176.73c-18.047 0-32.735 14.384-32.735
32.063v111.869c0 17.679 1 [...]
+ <path d="M255.992 191.994c-8.832 0-16 7.168-16 16v47.998c0 8.832
7.168 16 16 16s15.999-7.168 15.999-16v-47.998c.001-8.832-7.167-16-15.999-16z" />
+ </svg>
+ );
+}
+export function HealthIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ xmlSpace="preserve"
+ id="Icons"
+ viewBox="0 0 32 32"
+ className="icon">
+ <style>
+ {
+
".st0{fill:none;stroke:#000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10}"
+ }
+ </style>
+ <path
+ d="M27 7h0c-2.6-2.7-6.9-2.7-9.5 0l-1.3 1.4c-.1.1-.4.1-.5
0L14.4 7C11.8 4.3 7.6 4.3 5 7h0c-2.6 2.7-2.6 7.1 0 9.8l1.6 1.6 9.2
9.5c.1.1.4.1.5 0l9.2-9.5 1.6-1.6c2.6-2.7 2.6-7.1-.1-9.8z"
+ className="st0"
+ />
+ <path d="M9 15h3l2-2 2 4 2-5 2 3h3" className="st0" />
+ </svg>
+ );
+}
+export function KubernetesIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 -10.44 722.846 722.846"
+ className="icon">
+ <path
+ fill="#326ce5"
+ d="M358.986 10.06a46.725 46.342 0 0 0-17.906 4.531L96.736
131.341a46.725 46.342 0 0 0-25.28 31.438l-60.282 262.25a46.725 46.342 0 0 0
6.344 35.531 46.725 46.342 0 0 0 2.656 3.688l169.125 210.28a46.725 46.342 0 0 0
36.531 17.438l271.219-.062a46.725 46.342 0 0 0
36.531-17.406l169.063-210.313a46.725 46.342 0 0 0 9.03-39.219L651.3
162.716a46.725 46.342 0 0 0-25.281-31.437L381.643 14.59a46.725 46.342 0 0
0-22.657-4.53z"
+ />
+ <path
+ fill="#fff"
+ stroke="#fff"
+ strokeWidth={0.25}
+ d="M361.408 99.307c-8.077.001-14.626 7.276-14.625 16.25 0
.138.028.27.03.406-.011 1.22-.07 2.689-.03 3.75.192 5.176 1.32 9.138 2 13.907
1.23 10.206 2.26 18.667 1.625 26.531-.62 2.965-2.803 5.677-4.75 7.562l-.344
6.188a190.337 190.337 0 0 0-26.438 4.062c-37.974 8.623-70.67 28.184-95.562
54.594a245.167 245.167 0 0 1-5.281-3.75c-2.612.353-5.25
1.159-8.688-.844-6.545-4.405-12.506-10.486-19.719-17.812-3.305-3.504-5.698-6.841-9.625-10.219-.891-.767-2.252-1.804-3.25-2.594-3.07-2
[...]
+ color="#000"
+ fontFamily="Sans"
+ fontWeight={400}
+ overflow="visible"
+ style={{
+ textIndent: 0,
+ textAlign: "start",
+ lineHeight: "normal",
+ textTransform: "none",
+ marker: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function DocumentIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 32 32"
+ className="icon">
+ <title>{"document--blank"}</title>
+ <path d="m25.7 9.3-7-7A.908.908 0 0 0 18 2H8a2.006 2.006 0 0 0-2
2v24a2.006 2.006 0 0 0 2 2h16a2.006 2.006 0 0 0 2-2V10a.908.908 0 0 0-.3-.7ZM18
4.4l5.6 5.6H18ZM24 28H8V4h8v6a2.006 2.006 0 0 0 2 2h6Z" />
+ <path
+ d="M0 0h32v32H0z"
+ data-name="<Transparent Rectangle>"
+ style={{
+ fill: "none",
+ }}
+ />
+ </svg>
+ );
+}
+export function GitIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ fill="none"
+ viewBox="0 0 24 24"
+ className="icon">
+ <path
+ fill="#000"
+ fillRule="evenodd"
+ d="M13.414 3.828a2 2 0 0 0-2.828 0l-.672.672 1.568 1.568a2.002
2.002 0 0 1 2.45 2.45l2.05 2.05a2 2 0 1 1-1.414 1.414L13 10.414v4.854A2 2 0 0 1
12 19a2 2 0 0 1-1-3.732V9.732a2 2 0 0 1-.932-2.25L8.5 5.914l-4.672 4.672a2 2 0
0 0 0 2.828l6.758 6.758a2 2 0 0 0 2.828 0l6.758-6.758a2 2 0 0 0
0-2.828l-6.758-6.758ZM9.172 2.414a4 4 0 0 1 5.656 0l6.758 6.758a4 4 0 0 1 0
5.656l-6.758 6.758a4 4 0 0 1-5.656 0l-6.758-6.758a4 4 0 0 1
0-5.656l6.758-6.758Z"
+ clipRule="evenodd"
+ />
+ </svg>
+ );
+}
+export function SocialIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={800}
+ height={800}
+ viewBox="0 0 1024 1024"
+ className="icon">
+ <path
+ fill="#FFB89A"
+ d="M570.2 842c-50.6 0-278.7-180-278.7-401.9
0-58.8-2.9-133.1-1-183.9-50.8 3.2-91.4 45.7-91.4 97.3v272.1c37.4 194.7 137.5
334 255.2 334 69.5 0 132.9-48.6 180.9-128.5-20.8 7.1-42.6 10.9-65 10.9z"
+ />
+ <path
+ fill="#4E5155"
+ d="M926.1 191.8C900.5 74.1 817.9 62.1 704.9 62.1c-29.1
0-60.3.8-93 .8-36 0-70.5-1.1-102.5-1.1-109.7 0-189.8 12.5-201.3 123.7-20.4
198.3 30 617.1 306.1 617.1S939 414.3 926.1 191.8zm-76.9 268.5c-9.5 47.9-22.3
90.8-38.1 127.7-16.8 39.2-37 71.4-60 95.8-37.3 39.5-82.1 58.7-137 58.7-53.4
0-97.6-20.1-134.9-61.6-45.5-50.5-79.8-131.5-99-234.2-15.6-83.5-20.3-178.9-12.4-255.2
1.8-17.3 5.7-30.7 11.6-39.8 4.4-6.8 10.1-11.7 18.7-15.8 25.8-12.5 70.8-14.2
111.4-14.2 15 0 30.7.2 47.3.5 17 [...]
+ />
+ <path
+ fill="#4E5155"
+ d="M532 841.7c-32.5 22.3-70.6 33.7-113.2 33.7-29.7
0-57.3-6-82.1-17.7-23.2-11-44.7-27.4-63.9-48.7-46-50.9-80.3-131.3-99.2-232.4-15.1-80.6-19.6-172.9-12-246.8
3-29.5 12-50.2 27.5-63.2 14.2-12 35.1-19.2 65.8-22.9 16.5-2 28.2-16.9
26.3-33.3-2-16.5-16.9-28.2-33.3-26.3-42.9 5.1-73.8 16.7-97.4 36.5-27.9
23.5-43.8 57.2-48.5 103-8.2 79.3-3.4 178.1 12.7 264 9.7 51.9 23.4 99.4 40.6
141.2 19.8 48.1 44.4 88.6 73 120.4 51.6 57.2 115.7 86.2 190.6 86.2 55 0
104.5-14.9 147.2-44.2 13.7-9. [...]
+ />
+ <path
+ fill="#3C9"
+ d="M519.7 248.5c-16.6 0-30 13.4-30 30v91.3c0 16.6 13.4 30 30
30s30-13.4 30-30v-91.3c0-16.6-13.5-30-30-30zm-220.2
137c0-16.6-13.4-30-30-30s-30 13.4-30 30v91.3c0 16.6 13.4 30 30 30s30-13.4
30-30v-91.3zm455.1-137c-16.6 0-30 13.4-30 30v91.3c0 16.6 13.4 30 30 30s30-13.4
30-30v-91.3c0-16.6-13.4-30-30-30zm-37.9 306c0-16.6-13.4-30-30-30H551v30c0 58.5
38.1 123.7 92.8 123.7 22.9 0 45-11.9 62.2-33.6 10.3-13
8.1-31.9-4.9-42.1-13-10.3-31.9-8.1-42.1 4.9-5.3 6.7-11.1 10.9-15.1 10.9-4.3
[...]
+ />
+ </svg>
+ );
+}
+export function DebeziumIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ xmlnsXlink="http://www.w3.org/1999/xlink"
+ viewBox="0 0 130.93 130.93"
+ className="icon">
+ <defs>
+ <linearGradient
+ id="linear-gradient"
+ x1={19.74}
+ x2={114.03}
+ y1={19.73}
+ y2={114.02}
+ gradientUnits="userSpaceOnUse"
+ >
+ <stop offset={0} stopColor="#91d443" />
+ <stop offset={1} stopColor="#48bfe0" />
+ </linearGradient>
+ <linearGradient
+ xlinkHref="#linear-gradient"
+ id="linear-gradient-2"
+ x1={43.19}
+ x2={137.48}
+ y1={-3.72}
+ y2={90.57}
+ />
+ <linearGradient
+ xlinkHref="#linear-gradient"
+ id="linear-gradient-3"
+ x1={66.56}
+ x2={160.85}
+ y1={-27.09}
+ y2={67.2}
+ />
+ <linearGradient
+ xlinkHref="#linear-gradient"
+ id="linear-gradient-4"
+ x1={-3.72}
+ x2={90.57}
+ y1={43.18}
+ y2={137.47}
+ />
+ <linearGradient
+ xlinkHref="#linear-gradient"
+ id="linear-gradient-5"
+ x1={-27.09}
+ x2={67.2}
+ y1={66.55}
+ y2={160.84}
+ />
+ <style>{".cls-1{fill:#fff}"}</style>
+ </defs>
+ <g id="Layer_1" data-name="Layer 1">
+ <path
+ d="M93.79 114.29a16.65 16.65 0 0 0 16.63
16.63h20.53v-20.53a16.65 16.65 0 0 0-16.63-16.63h-3.91A26.39 26.39 0 0 1 84
67.4v-3.89a16.65 16.65 0 0 0-16.59-16.62h-3.9a26.39 26.39 0 0
1-26.35-26.37v-3.9A16.65 16.65 0 0 0 20.53 0H0v20.52a16.65 16.65 0 0 0 16.63
16.63h3.91A26.39 26.39 0 0 1 46.9 63.51v3.89A16.65 16.65 0 0 0 63.53
84h3.9a26.39 26.39 0 0 1 26.36 26.36Z"
+ style={{
+ fill: "url(#linear-gradient)",
+ }}
+ />
+ <path
+ d="M130.94 63.51a16.65 16.65 0 0 0-16.63-16.63h-3.91A26.39
26.39 0 0 1 84 20.52v-3.9A16.65 16.65 0 0 0 67.41 0H46.9v20.75a16.64 16.64 0 0
0 16.62 16.4h3.91a26.39 26.39 0 0 1 26.36 26.36v3.89A16.65 16.65 0 0 0 110.36
84h20.58Z"
+ style={{
+ fill: "url(#linear-gradient-2)",
+ }}
+ />
+ <path
+ d="M130.94 16.49A16.63 16.63 0 0 0 115 0H93.47v20.7a16.64
16.64 0 0 0 16.62 16.44h20.85Z"
+ style={{
+ fill: "url(#linear-gradient-3)",
+ }}
+ />
+ <path
+ d="M0 67.44a16.65 16.65 0 0 0 16.64 16.62h3.91a26.39 26.39
0 0 1 26.36 26.36v3.89a16.65 16.65 0 0 0 16.63 16.63H84v-20.75A16.64 16.64 0 0
0 67.43 93.8h-3.9a26.39 26.39 0 0 1-26.37-26.36v-3.9a16.65 16.65 0 0
0-16.57-16.63H0Z"
+ style={{
+ fill: "url(#linear-gradient-4)",
+ }}
+ />
+ <path
+ d="M0 114.45a16.63 16.63 0 0 0 16 16.5h21.48v-20.71A16.64
16.64 0 0 0 20.86 93.8H0Z"
+ style={{
+ fill: "url(#linear-gradient-5)",
+ }}
+ />
+ </g>
+ </svg>
+ );
+}
+export function IgniteIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={48}
+ height={48}
+ fill="none"
+ viewBox="0 0 48 48"
+ className="icon">
+ <path
+ fill="#ED1C24"
+ d="M7.686 8.136S-8.95 18.28 6.73 28.355c3.016 1.962 13.956
7.418 13.644 12.466 0 0 6.631-9.81-3.064-15.983C7.351 18.52 4.862 11.772 7.686
8.135Z"
+ />
+ <path
+ fill="#ED1C24"
+ d="M1.893 27.517s-5.936 8.997 5.745 10.84c1.15.144 9.6 1.029
11.802 3.804 0
0-.192-4.785-7.086-7.609-6.87-2.823-9.695-3.517-10.46-7.035Zm22.981-9.451C17.74
10.6 15.754 5.982 18.818 0c0 0-21.281 8.183-.264 22.708 7.517 5.192 6.272
10.504 6.272 10.696 1.173-1.22 7.181-7.873.048-15.338Z"
+ />
+ </svg>
+ );
+}
+export function HazelcastIcon() {
+ return (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 133.3 133.3"
className="icon">
+ <defs>
+ <style>{".a{fill:#00e1e1}"}</style>
+ </defs>
+ <path
+ d="M133.3 92.85h-.38c-6.07
0-12.48-6.42-12.48-12.49V80h-.93v.38c0 6.07-6.42 12.49-12.49
12.49h-.38v.93h.36c6.07 0 12.49 6.41 12.49 12.48v.38h.93v-.38c0-6.07 6.41-12.48
12.48-12.48h.38v-.93ZM26.66 12.86h-.38C20.21 12.86 13.8 6.45
13.8.38V0h-.94v.38c0 6.07-6.41 12.48-12.48 12.48H0v.94h.38c6.07 0 12.48 6.41
12.48 12.48v.38h.94v-.38c0-6.07 6.41-12.48 12.48-12.48h.38v-.94Z"
+ className="a"
+ />
+ <path
+ d="M26.66 39.53h-.38c-6.07
0-12.48-6.42-12.48-12.53v-.38h-.94V27c0 6.07-6.41 12.49-12.48
12.49H0v.93h.38c6.07 0 12.48 6.41 12.48 12.48v.38h.94v-.38c0-6.07 6.41-12.48
12.48-12.48h.38v-.93Z"
+ className="a"
+ />
+ <path
+ d="M53.32 39.53h-.38c-6.07
0-12.48-6.42-12.48-12.49v-.38h-.94V27c0 6.07-6.41 12.49-12.48
12.49h-.38v.93H27c6.07 0 12.48 6.41 12.48 12.48v.38h.94v-.38c0-6.07 6.41-12.48
12.48-12.48h.38v-.93ZM26.66 66.19h-.38c-6.07
0-12.48-6.42-12.48-12.49v-.38h-.94v.38c0 6.07-6.41 12.49-12.48
12.49H0v.93h.38c6.07 0 12.48 6.41 12.48 12.48v.4h.94v-.4c0-6.07 6.41-12.48
12.48-12.48h.38v-.93Z"
+ className="a"
+ />
+ <path
+ d="M53.32 66.19h-.38c-6.07
0-12.48-6.42-12.48-12.49v-.38h-.94v.38c0 6.07-6.41 12.49-12.48
12.49h-.38v.93H27c6.07 0 12.48 6.41 12.48 12.48v.4h.94v-.4c0-6.07 6.41-12.48
12.48-12.48h.38v-.93Z"
+ className="a"
+ />
+ <path
+ d="M80 66.19h-.4c-6.07
0-12.48-6.42-12.48-12.49v-.38h-.94v.38c0 6.07-6.41 12.49-12.48
12.49h-.38v.93h.38c6.07 0 12.48 6.41 12.48 12.48v.4h.94v-.4c0-6.07 6.41-12.48
12.48-12.48h.4v-.93ZM26.66 92.85h-.38c-6.07
0-12.48-6.42-12.48-12.49V80h-.94v.38c0 6.07-6.41 12.49-12.48
12.49H0v.93h.38c6.07 0 12.48 6.41 12.48 12.48v.38h.94v-.38c0-6.07 6.41-12.48
12.48-12.48h.38v-.93Z"
+ className="a"
+ />
+ <path
+ d="M53.32 92.85h-.38c-6.07
0-12.48-6.42-12.48-12.49V80h-.94v.38c0 6.07-6.41 12.49-12.48
12.49h-.38v.93H27c6.07 0 12.48 6.41 12.48 12.48v.38h.94v-.38c0-6.07 6.41-12.48
12.48-12.48h.38v-.93ZM106.64 39.53h-.38c-6.07
0-12.48-6.42-12.48-12.49v-.38h-.93V27c0 6.07-6.42 12.49-12.49
12.49H80v.93h.38c6.07 0 12.49 6.41 12.49 12.48v.38h.93v-.38c0-6.07 6.41-12.48
12.48-12.48h.38v-.93ZM106.64 66.19h-.38c-6.07
0-12.48-6.42-12.48-12.49v-.38h-.93v.38c0 6.07-6.42 12.49-12.49 12.49H80v.93h.
[...]
+ className="a"
+ />
+ <path
+ d="M106.64 92.85h-.38c-6.07
0-12.48-6.42-12.48-12.49V80h-.93v.38c0 6.07-6.42 12.49-12.49
12.49H80v.93h.38c6.07 0 12.49 6.41 12.49 12.48v.38h.93v-.38c0-6.07 6.41-12.48
12.48-12.48h.38v-.93ZM133.3 39.53h-.38c-6.07
0-12.48-6.42-12.48-12.49v-.38h-.93V27c0 6.07-6.42 12.49-12.49
12.49h-.38v.93h.36c6.07 0 12.49 6.41 12.49 12.48v.38h.93v-.38c0-6.07 6.41-12.48
12.48-12.48h.38v-.93ZM133.3 12.86h-.38c-6.07
0-12.48-6.41-12.48-12.48V0h-.93v.38c0 6.07-6.42 12.48-12.49 12.48h-.38v.94h.3
[...]
+ className="a"
+ />
+ </svg>
+ );
+}
+export function AzureIcon() {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={150}
+ height={150}
+ viewBox="0 0 96 96"
+ className="icon">
+ <defs>
+ <linearGradient
+ id="a"
+ x1={-1032.172}
+ x2={-1059.213}
+ y1={145.312}
+ y2={65.426}
+ gradientTransform="matrix(1 0 0 -1 1075 158)"
+ gradientUnits="userSpaceOnUse"
+ >
+ <stop offset={0} stopColor="#114a8b" />
+ <stop offset={1} stopColor="#0669bc" />
+ </linearGradient>
+ <linearGradient
+ id="b"
+ x1={-1023.725}
+ x2={-1029.98}
+ y1={108.083}
+ y2={105.968}
+ gradientTransform="matrix(1 0 0 -1 1075 158)"
+ gradientUnits="userSpaceOnUse"
+ >
+ <stop offset={0} stopOpacity={0.3} />
+ <stop offset={0.071} stopOpacity={0.2} />
+ <stop offset={0.321} stopOpacity={0.1} />
+ <stop offset={0.623} stopOpacity={0.05} />
+ <stop offset={1} stopOpacity={0} />
+ </linearGradient>
+ <linearGradient
+ id="c"
+ x1={-1027.165}
+ x2={-997.482}
+ y1={147.642}
+ y2={68.561}
+ gradientTransform="matrix(1 0 0 -1 1075 158)"
+ gradientUnits="userSpaceOnUse"
+ >
+ <stop offset={0} stopColor="#3ccbf4" />
+ <stop offset={1} stopColor="#2892df" />
+ </linearGradient>
+ </defs>
+ <path
+ fill="url(#a)"
+ d="M33.338 6.544h26.038l-27.03 80.087a4.152 4.152 0 0 1-3.933
2.824H8.149a4.145 4.145 0 0 1-3.928-5.47L29.404 9.368a4.152 4.152 0 0 1
3.934-2.825z"
+ />
+ <path
+ fill="#0078d4"
+ d="M71.175 60.261h-41.29a1.911 1.911 0 0 0-1.305 3.309l26.532
24.764a4.171 4.171 0 0 0 2.846 1.121h23.38z"
+ />
+ <path
+ fill="url(#b)"
+ d="M33.338 6.544a4.118 4.118 0 0 0-3.943 2.879L4.252
83.917a4.14 4.14 0 0 0 3.908 5.538h20.787a4.443 4.443 0 0 0
3.41-2.9l5.014-14.777 17.91 16.705a4.237 4.237 0 0 0 2.666.972H81.24L71.024
60.261l-29.781.007L59.47 6.544z"
+ />
+ <path
+ fill="url(#c)"
+ d="M66.595 9.364a4.145 4.145 0 0 0-3.928-2.82H33.648a4.146
4.146 0 0 1 3.928 2.82l25.184 74.62a4.146 4.146 0 0 1-3.928 5.472h29.02a4.146
4.146 0 0 0 3.927-5.472z"
+ />
+ </svg>
+ );
+}
+
+
diff --git a/karavan-web/karavan-app/src/main/webui/src/index.tsx
b/karavan-web/karavan-app/src/main/webui/src/index.tsx
index d112e5b8..8eeda047 100644
--- a/karavan-web/karavan-app/src/main/webui/src/index.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/index.tsx
@@ -2,7 +2,7 @@ import React from 'react';
import {createRoot} from "react-dom/client";
import "@patternfly/patternfly/patternfly.css";
import './index.css';
-import {Main} from "./Main";
+import {Main} from "./main/Main";
const container = document.getElementById('root');
const root = createRoot(container!);
diff --git
a/karavan-web/karavan-app/src/main/webui/src/knowledgebase/components/ComponentCard.tsx
b/karavan-web/karavan-app/src/main/webui/src/knowledgebase/components/ComponentCard.tsx
index 0e907c8b..9226bb52 100644
---
a/karavan-web/karavan-app/src/main/webui/src/knowledgebase/components/ComponentCard.tsx
+++
b/karavan-web/karavan-app/src/main/webui/src/knowledgebase/components/ComponentCard.tsx
@@ -19,7 +19,7 @@ import {
CardHeader, Card, CardTitle, CardBody, CardFooter, Badge
} from '@patternfly/react-core';
import '../../designer/karavan.css';
-import {camelIcon, CamelUi} from "../../designer/utils/CamelUi";
+import {CamelUi} from "../../designer/utils/CamelUi";
import {Component} from "karavan-core/lib/model/ComponentModels";
interface Props {
@@ -45,7 +45,7 @@ export class ComponentCard extends React.Component<Props,
State> {
render() {
const component = this.state.component;
return (
- <Card isHoverable isCompact key={component.component.name}
className="kamelet-card"
+ <Card isCompact key={component.component.name}
className="kamelet-card"
onClick={event => this.click(event)}
>
<CardHeader className="header-labels">
@@ -53,7 +53,7 @@ export class ComponentCard extends React.Component<Props,
State> {
<Badge isRead className="support-level
labels">{component.component.supportLevel}</Badge>
</CardHeader>
<CardHeader>
- {CamelUi.getIconFromSource(camelIcon)}
+ {CamelUi.getIconForComponent(component.component.title,
component.component.label)}
<CardTitle>{component.component.title}</CardTitle>
</CardHeader>
<CardBody>{component.component.description}</CardBody>
diff --git
a/karavan-web/karavan-app/src/main/webui/src/knowledgebase/components/ComponentModal.tsx
b/karavan-web/karavan-app/src/main/webui/src/knowledgebase/components/ComponentModal.tsx
index 7b10b3f1..7d622425 100644
---
a/karavan-web/karavan-app/src/main/webui/src/knowledgebase/components/ComponentModal.tsx
+++
b/karavan-web/karavan-app/src/main/webui/src/knowledgebase/components/ComponentModal.tsx
@@ -27,7 +27,7 @@ import {
import '../../designer/karavan.css';
import {TableComposable, Tbody, Td, Th, Thead, Tr} from
"@patternfly/react-table";
import {Component} from "karavan-core/lib/model/ComponentModels";
-import {camelIcon, CamelUi} from "../../designer/utils/CamelUi";
+import {CamelUi} from "../../designer/utils/CamelUi";
import {ComponentApi} from "karavan-core/lib/api/ComponentApi";
import {ComponentProperty} from "karavan-core/lib/model/ComponentModels";
@@ -85,7 +85,7 @@ export class ComponentModal extends React.Component<Props,
State> {
<Flex direction={{default: 'column'}}
key={component?.component.name}
className="kamelet-modal-card">
<CardHeader>
- {CamelUi.getIconFromSource(camelIcon)}
+ {component &&
CamelUi.getIconForComponent(component.component.title,
component.component.label)}
<CardActions>
<Badge className="badge"
isRead> {component?.component.label}</Badge>
diff --git a/karavan-web/karavan-app/src/main/webui/src/main/DataPoller.tsx
b/karavan-web/karavan-app/src/main/webui/src/main/DataPoller.tsx
new file mode 100644
index 00000000..5c3aa622
--- /dev/null
+++ b/karavan-web/karavan-app/src/main/webui/src/main/DataPoller.tsx
@@ -0,0 +1,103 @@
+import React, {useEffect, useState} from 'react';
+import {
+ Page,
+ Flex,
+ FlexItem,
+ Spinner, Bullseye
+} from '@patternfly/react-core';
+import {KaravanApi} from "../api/KaravanApi";
+import {SsoApi} from "../api/SsoApi";
+import {KameletApi} from "karavan-core/lib/api/KameletApi";
+import '../designer/karavan.css';
+import {v4 as uuidv4} from "uuid";
+import {ComponentApi} from "karavan-core/lib/api/ComponentApi";
+import Icon from "../Logo";
+import {ProjectsPage} from "../projects/ProjectsPage";
+import {MainLogin} from "./MainLogin";
+import {DashboardPage} from "../dashboard/DashboardPage";
+import {ContainersPage} from "../containers/ContainersPage";
+import {ProjectEventBus} from "../api/ProjectEventBus";
+import {AppConfig, ContainerStatus, Project, ToastMessage} from
"../api/ProjectModels";
+import {ProjectPage} from "../project/ProjectPage";
+import {useAppConfigStore, useStatusesStore} from "../api/ProjectStore";
+import {Notification} from "./Notification";
+import {InfrastructureAPI} from "../designer/utils/InfrastructureAPI";
+import {KnowledgebasePage} from "../knowledgebase/KnowledgebasePage";
+import {ServicesPage} from "../services/ServicesPage";
+import {shallow} from "zustand/shallow";
+import {PageNavigation} from "./PageNavigation";
+
+export const DataPoller = () => {
+
+ const [config, pageId, setPageId, setConfig] = useAppConfigStore((state)
=> [state.config, state.pageId, state.setPageId, state.setConfig], shallow)
+ const [setContainers] = useStatusesStore((state) => [state.setContainers],
shallow);
+ const [request, setRequest] = useState<string>(uuidv4());
+
+ useEffect(() => {
+ console.log("DataPoller Start");
+ const interval = setInterval(() => {
+ getStatuses();
+ }, 1000);
+ return () => {
+ console.log("DataPoller End");
+ clearInterval(interval);
+ };
+ }, []);
+
+ function getStatuses() {
+ if (KaravanApi.isAuthorized || KaravanApi.authType === 'public') {
+ KaravanApi.getAllContainerStatuses((statuses: ContainerStatus[])
=> {
+ setContainers(statuses);
+ });
+ }
+ }
+
+ function getData() {
+ if (KaravanApi.isAuthorized || KaravanApi.authType === 'public') {
+ KaravanApi.getConfiguration((config: AppConfig) => {
+ setRequest(uuidv4());
+ setConfig(config);
+ InfrastructureAPI.infrastructure = config.infrastructure;
+ });
+ updateKamelets();
+ updateComponents();
+ // updateSupportedComponents(); // not implemented yet
+ }
+ }
+
+ async function updateKamelets(): Promise<void> {
+ await new Promise(resolve => {
+ KaravanApi.getKamelets(yamls => {
+ const kamelets: string[] = [];
+ yamls.split("\n---\n").map(c => c.trim()).forEach(z =>
kamelets.push(z));
+ KameletApi.saveKamelets(kamelets, true);
+ })
+ KaravanApi.getCustomKameletNames(names => {
+ KameletApi.saveCustomKameletNames(names);
+ })
+ });
+ }
+
+ async function updateComponents(): Promise<void> {
+ await new Promise(resolve => {
+ KaravanApi.getComponents(code => {
+ const components: [] = JSON.parse(code);
+ const jsons: string[] = [];
+ components.forEach(c => jsons.push(JSON.stringify(c)));
+ ComponentApi.saveComponents(jsons, true);
+ })
+ });
+ }
+
+ async function updateSupportedComponents(): Promise<void> {
+ await new Promise(resolve => {
+ KaravanApi.getSupportedComponents(jsons => {
+ ComponentApi.saveSupportedComponents(jsons);
+ })
+ });
+ }
+
+ return (
+ <React.Fragment></React.Fragment>
+ )
+}
\ No newline at end of file
diff --git a/karavan-web/karavan-app/src/main/webui/src/Main.tsx
b/karavan-web/karavan-app/src/main/webui/src/main/Main.tsx
similarity index 50%
rename from karavan-web/karavan-app/src/main/webui/src/Main.tsx
rename to karavan-web/karavan-app/src/main/webui/src/main/Main.tsx
index 98ca08f1..2d40b1f4 100644
--- a/karavan-web/karavan-app/src/main/webui/src/Main.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/main/Main.tsx
@@ -1,60 +1,37 @@
import React, {useEffect, useState} from 'react';
import {
Page,
- Button,
Flex,
FlexItem,
- Tooltip,
- Divider, Spinner, Bullseye, Popover, Badge
+ Spinner, Bullseye
} from '@patternfly/react-core';
-import {KaravanApi} from "./api/KaravanApi";
-import {SsoApi} from "./api/SsoApi";
+import {KaravanApi} from "../api/KaravanApi";
+import {SsoApi} from "../api/SsoApi";
import {KameletApi} from "karavan-core/lib/api/KameletApi";
-import './designer/karavan.css';
+import '../designer/karavan.css';
import {v4 as uuidv4} from "uuid";
import {ComponentApi} from "karavan-core/lib/api/ComponentApi";
-import Icon from "./Logo";
-import {ProjectsPage} from "./projects/ProjectsPage";
-import UserIcon from "@patternfly/react-icons/dist/js/icons/user-icon";
-import ProjectsIcon from
"@patternfly/react-icons/dist/js/icons/repository-icon";
-import KnowledgebaseIcon from
"@patternfly/react-icons/dist/js/icons/book-open-icon";
-import ContainersIcon from "@patternfly/react-icons/dist/js/icons/cubes-icon";
-import DashboardIcon from
"@patternfly/react-icons/dist/js/icons/tachometer-alt-icon";
-import ServicesIcon from "@patternfly/react-icons/dist/js/icons/services-icon";
-import ComponentsIcon from "@patternfly/react-icons/dist/js/icons/module-icon";
+import Icon from "../Logo";
+import {ProjectsPage} from "../projects/ProjectsPage";
import {MainLogin} from "./MainLogin";
-import {DashboardPage} from "./dashboard/DashboardPage";
-import {ContainersPage} from "./containers/ContainersPage";
-import {ProjectEventBus} from "./api/ProjectEventBus";
-import {AppConfig, ContainerStatus, Project, ToastMessage} from
"./api/ProjectModels";
-import {ProjectPage} from "./project/ProjectPage";
-import {useAppConfigStore, useDevModeStore, useFileStore, useProjectStore,
useStatusesStore} from "./api/ProjectStore";
+import {DashboardPage} from "../dashboard/DashboardPage";
+import {ContainersPage} from "../containers/ContainersPage";
+import {ProjectEventBus} from "../api/ProjectEventBus";
+import {AppConfig, ContainerStatus, Project, ToastMessage} from
"../api/ProjectModels";
+import {ProjectPage} from "../project/ProjectPage";
+import {useAppConfigStore, useStatusesStore} from "../api/ProjectStore";
import {Notification} from "./Notification";
-import {InfrastructureAPI} from "./designer/utils/InfrastructureAPI";
-import {KnowledgebasePage} from "./knowledgebase/KnowledgebasePage";
-import {ServicesPage} from "./services/ServicesPage";
+import {InfrastructureAPI} from "../designer/utils/InfrastructureAPI";
+import {KnowledgebasePage} from "../knowledgebase/KnowledgebasePage";
+import {ServicesPage} from "../services/ServicesPage";
import {shallow} from "zustand/shallow";
-import {ProjectService} from "./api/ProjectService";
-
-class MenuItem {
- pageId: string = '';
- tooltip: string = '';
- icon: any;
-
- constructor(pageId: string, tooltip: string, icon: any) {
- this.pageId = pageId;
- this.tooltip = tooltip;
- this.icon = icon;
- }
-}
+import {PageNavigation} from "./PageNavigation";
export const Main = () => {
- const [config, setConfig] = useAppConfigStore((state) => [state.config,
state.setConfig], shallow)
+ const [config, pageId, setPageId, setConfig] = useAppConfigStore((state)
=> [state.config, state.pageId, state.setPageId, state.setConfig], shallow)
const [setContainers] = useStatusesStore((state) => [state.setContainers],
shallow);
- const [pageId, setPageId] = useState<string>('projects');
const [request, setRequest] = useState<string>(uuidv4());
- const [showUser, setShowUser] = useState<boolean>(false);
useEffect(() => {
console.log("Main Start");
@@ -104,7 +81,6 @@ export const Main = () => {
KaravanApi.getConfiguration((config: AppConfig) => {
setRequest(uuidv4());
setConfig(config);
- useAppConfigStore.setState({config: config});
InfrastructureAPI.infrastructure = config.infrastructure;
});
updateKamelets();
@@ -145,72 +121,6 @@ export const Main = () => {
});
}
- function getMenu() : MenuItem[] {
- const pages: MenuItem[] = [
- new MenuItem("dashboard", "Dashboard", <DashboardIcon/>),
- new MenuItem("projects", "Projects", <ProjectsIcon/>),
- ]
- if (config.infrastructure === 'docker') {
- pages.push(
- new MenuItem("services", "Services", <ServicesIcon/>),
- new MenuItem("containers", "Containers", <ContainersIcon/>)
- )
- }
- pages.push(new MenuItem("knowledgebase", "Knowledgebase",
<KnowledgebaseIcon/>));
- return pages;
- }
-
- function pageNav() {
- return (<Flex className="nav-buttons" direction={{default: "column"}}
style={{height: "100%"}}
- spaceItems={{default: "spaceItemsNone"}}>
- <FlexItem alignSelf={{default: "alignSelfCenter"}}>
- <Tooltip className="logo-tooltip" content={"Apache Camel
Karavan " + config.version}
- position={"right"}>
- {Icon()}
- </Tooltip>
- </FlexItem>
- {getMenu().map(page =>
- <FlexItem key={page.pageId} className={pageId === page.pageId
? "nav-button-selected" : ""}>
- <Tooltip content={page.tooltip} position={"right"}>
- <Button id={page.pageId} icon={page.icon}
variant={"plain"}
- className={pageId === page.pageId ?
"nav-button-selected" : ""}
- onClick={event => {
- useFileStore.setState({operation: 'none',
file: undefined})
- useDevModeStore.setState({podName:
undefined, status: "none"})
- setPageId(page.pageId);
- }}
- />
- </Tooltip>
- </FlexItem>
- )}
- <FlexItem flex={{default: "flex_2"}} alignSelf={{default:
"alignSelfCenter"}}>
- <Divider/>
- </FlexItem>
- {KaravanApi.authType !== 'public' &&
- <FlexItem alignSelf={{default: "alignSelfCenter"}}>
- <Popover
- aria-label="Current user"
- position={"right-end"}
- hideOnOutsideClick={false}
- isVisible={showUser}
- shouldClose={tip => setShowUser(false)}
- shouldOpen={tip => setShowUser(true)}
- headerContent={<div>{KaravanApi.me.userName}</div>}
- bodyContent={
- <Flex direction={{default: "row"}}>
- {KaravanApi.me.roles &&
Array.isArray(KaravanApi.me.roles)
- && KaravanApi.me.roles
- .filter((r: string) =>
['administrator', 'developer', 'viewer'].includes(r))
- .map((role: string) => <Badge
id={role} isRead>{role}</Badge>)}
- </Flex>
- }
- >
- <UserIcon className="avatar"/>
- </Popover>
- </FlexItem>}
- </Flex>)
- }
-
function toast(title: string, text: string, variant: 'success' | 'danger'
| 'warning' | 'info' | 'default') {
ProjectEventBus.sendAlert(new ToastMessage(title, text, variant))
}
@@ -221,7 +131,7 @@ export const Main = () => {
<Flex direction={{default: "row"}} style={{width: "100%",
height: "100%"}}
alignItems={{default: "alignItemsStretch"}}
spaceItems={{default: 'spaceItemsNone'}}>
<FlexItem>
- {pageNav()}
+ {<PageNavigation/>}
</FlexItem>
<FlexItem flex={{default: "flex_2"}} style={{height:
"100%"}}>
{pageId === 'dashboard' && <DashboardPage
key='dashboard'/>}
diff --git a/karavan-web/karavan-app/src/main/webui/src/MainLogin.tsx
b/karavan-web/karavan-app/src/main/webui/src/main/MainLogin.tsx
similarity index 100%
rename from karavan-web/karavan-app/src/main/webui/src/MainLogin.tsx
rename to karavan-web/karavan-app/src/main/webui/src/main/MainLogin.tsx
diff --git a/karavan-web/karavan-app/src/main/webui/src/Notification.tsx
b/karavan-web/karavan-app/src/main/webui/src/main/Notification.tsx
similarity index 90%
rename from karavan-web/karavan-app/src/main/webui/src/Notification.tsx
rename to karavan-web/karavan-app/src/main/webui/src/main/Notification.tsx
index 5216ddd4..2b12b01a 100644
--- a/karavan-web/karavan-app/src/main/webui/src/Notification.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/main/Notification.tsx
@@ -3,9 +3,9 @@ import {
Alert,
AlertActionCloseButton, AlertGroup,
} from '@patternfly/react-core';
-import './designer/karavan.css';
-import {ToastMessage} from "./api/ProjectModels";
-import {ProjectEventBus} from "./api/ProjectEventBus";
+import '../designer/karavan.css';
+import {ToastMessage} from "../api/ProjectModels";
+import {ProjectEventBus} from "../api/ProjectEventBus";
export const Notification = () => {
diff --git a/karavan-web/karavan-app/src/main/webui/src/main/PageNavigation.tsx
b/karavan-web/karavan-app/src/main/webui/src/main/PageNavigation.tsx
new file mode 100644
index 00000000..f723cd34
--- /dev/null
+++ b/karavan-web/karavan-app/src/main/webui/src/main/PageNavigation.tsx
@@ -0,0 +1,104 @@
+import React, { useState} from 'react';
+import {
+ Button,
+ Flex,
+ FlexItem,
+ Tooltip,
+ Divider, Popover, Badge
+} from '@patternfly/react-core';
+import {KaravanApi} from "../api/KaravanApi";
+import '../designer/karavan.css';
+import Icon from "../Logo";
+import UserIcon from "@patternfly/react-icons/dist/js/icons/user-icon";
+import ProjectsIcon from
"@patternfly/react-icons/dist/js/icons/repository-icon";
+import KnowledgebaseIcon from
"@patternfly/react-icons/dist/js/icons/book-open-icon";
+import ContainersIcon from "@patternfly/react-icons/dist/js/icons/cubes-icon";
+import DashboardIcon from
"@patternfly/react-icons/dist/js/icons/tachometer-alt-icon";
+import ServicesIcon from "@patternfly/react-icons/dist/js/icons/services-icon";
+import {useAppConfigStore, useDevModeStore, useFileStore} from
"../api/ProjectStore";
+import {shallow} from "zustand/shallow";
+
+class MenuItem {
+ pageId: string = '';
+ tooltip: string = '';
+ icon: any;
+
+ constructor(pageId: string, tooltip: string, icon: any) {
+ this.pageId = pageId;
+ this.tooltip = tooltip;
+ this.icon = icon;
+ }
+}
+
+export const PageNavigation = () => {
+
+ const [config, pageId, setPageId] = useAppConfigStore((state) =>
[state.config, state.pageId, state.setPageId], shallow)
+ const [setFile] = useFileStore((state) => [state.setFile], shallow)
+ const [setStatus, setPodName] = useDevModeStore((state) =>
[state.setStatus, state.setPodName], shallow)
+ const [showUser, setShowUser] = useState<boolean>(false);
+
+ function getMenu() : MenuItem[] {
+ const pages: MenuItem[] = [
+ new MenuItem("dashboard", "Dashboard", <DashboardIcon/>),
+ new MenuItem("projects", "Projects", <ProjectsIcon/>),
+ ]
+ if (config.infrastructure === 'docker') {
+ pages.push(
+ new MenuItem("services", "Services", <ServicesIcon/>),
+ new MenuItem("containers", "Containers", <ContainersIcon/>)
+ )
+ }
+ pages.push(new MenuItem("knowledgebase", "Knowledgebase",
<KnowledgebaseIcon/>));
+ return pages;
+ }
+
+ return (<Flex className="nav-buttons" direction={{default: "column"}}
style={{height: "100%"}}
+ spaceItems={{default: "spaceItemsNone"}}>
+ <FlexItem alignSelf={{default: "alignSelfCenter"}}>
+ <Tooltip className="logo-tooltip" content={"Apache Camel Karavan "
+ config.version}
+ position={"right"}>
+ {Icon()}
+ </Tooltip>
+ </FlexItem>
+ {getMenu().map(page =>
+ <FlexItem key={page.pageId} className={pageId === page.pageId ?
"nav-button-selected" : ""}>
+ <Tooltip content={page.tooltip} position={"right"}>
+ <Button id={page.pageId} icon={page.icon} variant={"plain"}
+ className={pageId === page.pageId ?
"nav-button-selected" : ""}
+ onClick={event => {
+ setFile('none',undefined);
+ setPodName(undefined);
+ setStatus("none");
+ setPageId(page.pageId);
+ }}
+ />
+ </Tooltip>
+ </FlexItem>
+ )}
+ <FlexItem flex={{default: "flex_2"}} alignSelf={{default:
"alignSelfCenter"}}>
+ <Divider/>
+ </FlexItem>
+ {KaravanApi.authType !== 'public' &&
+ <FlexItem alignSelf={{default: "alignSelfCenter"}}>
+ <Popover
+ aria-label="Current user"
+ position={"right-end"}
+ hideOnOutsideClick={false}
+ isVisible={showUser}
+ shouldClose={tip => setShowUser(false)}
+ shouldOpen={tip => setShowUser(true)}
+ headerContent={<div>{KaravanApi.me.userName}</div>}
+ bodyContent={
+ <Flex direction={{default: "row"}}>
+ {KaravanApi.me.roles &&
Array.isArray(KaravanApi.me.roles)
+ && KaravanApi.me.roles
+ .filter((r: string) => ['administrator',
'developer', 'viewer'].includes(r))
+ .map((role: string) => <Badge id={role}
isRead>{role}</Badge>)}
+ </Flex>
+ }
+ >
+ <UserIcon className="avatar"/>
+ </Popover>
+ </FlexItem>}
+ </Flex>)
+}
\ No newline at end of file