This is an automated email from the ASF dual-hosted git repository.

tenthe pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/streampipes.git


The following commit(s) were added to refs/heads/dev by this push:
     new acf6da1356 Alert Banner for asset links  (#4717)
acf6da1356 is described below

commit acf6da13568cc59f329d023a8cbb207881550dfb
Author: Jacqueline Höllig <[email protected]>
AuthorDate: Thu Jul 23 23:03:39 2026 +0200

    Alert Banner for asset links  (#4717)
    
    Co-authored-by: Philipp Zehnder <[email protected]>
---
 ui/STYLEGUIDE.md                                   |  14 +
 .../sp-spinner/sp-spinner.component.html}          |  17 +-
 .../sp-spinner/sp-spinner.component.scss}          |  11 +-
 .../components/sp-spinner/sp-spinner.component.ts} |  23 +-
 .../streampipes/shared-ui/src/public-api.ts        |   1 +
 .../asset-details-links.component.html             |  21 +-
 .../asset-link-table.component.html                | 201 ++++++-----
 .../asset-link-table/asset-link-table.component.ts |   5 +
 .../view-asset-links.component.html                |   6 +-
 .../view-asset-links/view-asset-links.component.ts |   2 +
 .../asset-link-table.component.html                | 387 +++++++++++----------
 .../asset-link-table/asset-link-table.component.ts |   5 +
 .../manage-asset-links-dialog.component.html       |   1 +
 .../manage-asset-links-dialog.component.ts         |   2 +
 .../chart-container/chart-container.component.html |   8 +-
 .../chart-container/chart-container.component.ts   |   4 +-
 .../chart-overview-table.component.html            |  35 +-
 .../chart-overview-table.component.ts              |   4 +-
 .../chart-overview/chart-overview.component.scss   |   5 -
 ...service-running-instances-dialog.component.html |   2 +-
 ...s-service-running-instances-dialog.component.ts |   4 +-
 .../email-configuration.component.html             |   4 +-
 .../email-configuration.component.ts               |   4 +-
 .../data-export-dialog.component.html              |   8 +-
 .../export-dialog/data-export-dialog.component.ts  |   4 +-
 .../data-import-dialog.component.html              |   8 +-
 .../import-dialog/data-import-dialog.component.ts  |   4 +-
 .../extensions-installation.component.html         |  16 +-
 .../extensions-installation.component.ts           |   4 +-
 .../adapter-catalog/adapter-catalog.component.html |  14 +-
 .../adapter-catalog/adapter-catalog.component.ts   |   4 +-
 ...configure-fields-loading-message.component.html |   2 +-
 .../configure-fields-loading-message.component.ts  |   4 +-
 .../adapter-result-preview.component.html          |   2 +-
 .../adapter-result-preview.component.ts            |   4 +-
 .../adapter-sample-preview.component.html          |   2 +-
 .../adapter-sample-preview.component.ts            |   4 +-
 .../existing-adapters.component.html               |   5 +-
 .../existing-adapters.component.ts                 |   4 +-
 .../adapter-started-loading.component.html         |   8 +-
 .../adapter-started-loading.component.ts           |   4 +-
 .../delete-adapter-dialog.component.html           |   6 +-
 .../delete-adapter-dialog.component.ts             |   5 +-
 .../loading-indicator.component.html               |   3 +-
 .../loading-indicator.component.scss               |   5 -
 .../loading-indicator.component.ts                 |   4 +-
 .../multi-step-status-indicator.component.html     |   5 +-
 .../multi-step-status-indicator.component.ts       |   4 +-
 ...tic-runtime-resolvable-any-input.component.html |   6 +-
 ...tatic-runtime-resolvable-any-input.component.ts |   4 +-
 ...c-runtime-resolvable-oneof-input.component.html |   6 +-
 ...tic-runtime-resolvable-oneof-input.component.ts |   8 +-
 .../static-tree-input-button-menu.component.html   |   6 +-
 .../static-tree-input-button-menu.component.ts     |   4 +-
 .../chart-selection/chart-selection.component.html |  10 +-
 .../chart-selection/chart-selection.component.scss |   5 -
 .../chart-selection/chart-selection.component.ts   |   4 +-
 .../clone-dashboard-dialog.component.html          |   2 +-
 .../clone-dashboard-dialog.component.ts            |   9 +-
 .../dataset-details-events.component.html          |   7 +-
 .../dataset-details-events.component.ts            |   4 +-
 .../dataset-details-metrics.component.html         |   7 +-
 .../dataset-details-metrics.component.ts           |   8 +-
 .../dataset-overview.component.html                |   8 +-
 .../dataset-overview/dataset-overview.component.ts |   4 +-
 .../csv-import-dialog.component.html               |   2 +-
 .../csv-import-dialog.component.ts                 |   4 +-
 .../data-retention-now-dialog.component.html       |   6 +-
 .../data-retention-now-dialog.component.ts         |   9 +-
 .../delete-dataset-dialog.component.html           |   5 +-
 .../delete-dataset-dialog.component.ts             |   5 +-
 .../delete-export-provider-dialog.component.html   |   5 +-
 .../delete-export-provider-dialog.component.ts     |   5 +-
 .../export-provider-connection-test.component.html |   6 +-
 .../export-provider-connection-test.component.ts   |   9 +-
 ...-assembly-options-pipeline-cache.component.html |   6 +-
 ...ne-assembly-options-pipeline-cache.component.ts |   4 +-
 .../pipeline-element-preview.component.html        |   8 +-
 .../pipeline-element-preview.component.ts          |   4 +-
 .../dropped-pipeline-element.component.html        |   6 +-
 .../dropped-pipeline-element.component.ts          |   8 +-
 ui/src/app/editor/editor.component.html            |   8 +-
 ui/src/app/editor/editor.component.ts              |   4 +-
 .../welcome-tour/welcome-tour.component.html       |   8 +-
 .../dialog/welcome-tour/welcome-tour.component.ts  |   4 +-
 .../login/components/login/login.component.html    |   5 +-
 .../app/login/components/login/login.component.ts  |   4 +-
 .../components/register/register.component.html    |   6 +-
 .../components/register/register.component.ts      |   4 +-
 .../set-new-password.component.html                |   6 +-
 .../set-new-password/set-new-password.component.ts |   4 +-
 .../login/components/setup/setup.component.html    |   5 +-
 .../app/login/components/setup/setup.component.ts  |   4 +-
 .../delete-pipeline-dialog.component.html          |   6 +-
 .../delete-pipeline-dialog.component.ts            |   5 +-
 .../pipeline-notifications.component.html          |   2 +-
 .../pipeline-notifications.component.ts            |   5 +-
 .../pipeline-status-dialog.component.html          |  17 +-
 .../pipeline-status-dialog.component.ts            |   5 +-
 99 files changed, 586 insertions(+), 609 deletions(-)

diff --git a/ui/STYLEGUIDE.md b/ui/STYLEGUIDE.md
index 2560fccaf0..3d34ea559d 100644
--- a/ui/STYLEGUIDE.md
+++ b/ui/STYLEGUIDE.md
@@ -202,6 +202,20 @@ Use `sp-progress-bar` when real progress is available. 
Provide the current `valu
 ></sp-progress-bar>
 ```
 
+#### Spinner
+
+Use `sp-spinner` for indeterminate loading states where no real progress value 
is available. Prefer it over direct `mat-spinner` usage to keep loading 
indicators consistent.
+
+```html
+<sp-spinner [text]="'Loading assets' | translate" [diameter]="30"></sp-spinner>
+```
+
+For compact inline loading states, use a smaller diameter and row layout:
+
+```html
+<sp-spinner [diameter]="20" layout="row"></sp-spinner>
+```
+
 #### Tables
 
 For rendering tables, always use the `sp-table` component which comes with 
pre-defined features for paging, sorting and layout.
diff --git 
a/ui/src/app/connect/components/adapter-configuration/configure-fields/configure-fields-loading-message/configure-fields-loading-message.component.html
 
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-spinner/sp-spinner.component.html
similarity index 72%
copy from 
ui/src/app/connect/components/adapter-configuration/configure-fields/configure-fields-loading-message/configure-fields-loading-message.component.html
copy to 
ui/projects/streampipes/shared-ui/src/lib/components/sp-spinner/sp-spinner.component.html
index 260248b4e3..86159f31f2 100644
--- 
a/ui/src/app/connect/components/adapter-configuration/configure-fields/configure-fields-loading-message/configure-fields-loading-message.component.html
+++ 
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-spinner/sp-spinner.component.html
@@ -16,7 +16,18 @@
   ~
   -->
 
-<div fxFlex="100" fxLayoutAlign="center center" fxLayout="column">
-    <mat-spinner [diameter]="25"></mat-spinner>
-    <h5>{{ 'Loading' | translate }}</h5>
+<div
+    [fxLayout]="layout"
+    [fxLayoutAlign]="align"
+    [fxLayoutGap]="text ? gap : '0px'"
+    class="sp-spinner"
+>
+    <mat-spinner
+        color="accent"
+        [diameter]="diameter"
+        mode="indeterminate"
+    ></mat-spinner>
+    @if (text) {
+        <div class="sp-spinner__text">{{ text }}</div>
+    }
 </div>
diff --git 
a/ui/src/app/core-ui/loading-indicator/loading-indicator.component.scss 
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-spinner/sp-spinner.component.scss
similarity index 83%
copy from ui/src/app/core-ui/loading-indicator/loading-indicator.component.scss
copy to 
ui/projects/streampipes/shared-ui/src/lib/components/sp-spinner/sp-spinner.component.scss
index 59443f668b..38c5dc7f5c 100644
--- a/ui/src/app/core-ui/loading-indicator/loading-indicator.component.scss
+++ 
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-spinner/sp-spinner.component.scss
@@ -16,7 +16,12 @@
  *
  */
 
-.message-text {
-    font-size: var(--font-size-md);
-    margin-top: 10px;
+.sp-spinner {
+    width: fit-content;
+}
+
+.sp-spinner__text {
+    color: var(--color-paragraph);
+    font-size: var(--font-size-sm);
+    text-align: center;
 }
diff --git 
a/ui/src/app/core-ui/multi-step-status-indicator/multi-step-status-indicator.component.ts
 
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-spinner/sp-spinner.component.ts
similarity index 72%
copy from 
ui/src/app/core-ui/multi-step-status-indicator/multi-step-status-indicator.component.ts
copy to 
ui/projects/streampipes/shared-ui/src/lib/components/sp-spinner/sp-spinner.component.ts
index 666f2b7fdc..904fad5d26 100644
--- 
a/ui/src/app/core-ui/multi-step-status-indicator/multi-step-status-indicator.component.ts
+++ 
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-spinner/sp-spinner.component.ts
@@ -17,29 +17,28 @@
  */
 
 import { Component, Input } from '@angular/core';
-import { Status, StatusIndicator } from './multi-step-status-indicator.model';
+import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import {
-    FlexDirective,
     LayoutAlignDirective,
     LayoutDirective,
     LayoutGapDirective,
 } from '@ngbracket/ngx-layout/flex';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 
 @Component({
-    selector: 'sp-multi-step-status-indicator',
-    templateUrl: './multi-step-status-indicator.component.html',
-    styleUrls: ['./multi-step-status-indicator.component.scss'],
+    selector: 'sp-spinner',
+    templateUrl: './sp-spinner.component.html',
+    styleUrls: ['./sp-spinner.component.scss'],
     imports: [
         LayoutDirective,
-        LayoutGapDirective,
-        FlexDirective,
         LayoutAlignDirective,
+        LayoutGapDirective,
         MatProgressSpinner,
     ],
 })
-export class MultiStepStatusIndicatorComponent {
-    @Input()
-    statusIndicators: StatusIndicator[] = [];
-    protected readonly Status = Status;
+export class SpSpinnerComponent {
+    @Input() text = '';
+    @Input() layout: 'column' | 'row' = 'column';
+    @Input() align = 'center center';
+    @Input() gap = '8px';
+    @Input() diameter = 30;
 }
diff --git a/ui/projects/streampipes/shared-ui/src/public-api.ts 
b/ui/projects/streampipes/shared-ui/src/public-api.ts
index dfa1358113..7cf7d799ff 100644
--- a/ui/projects/streampipes/shared-ui/src/public-api.ts
+++ b/ui/projects/streampipes/shared-ui/src/public-api.ts
@@ -51,6 +51,7 @@ export * from 
'./lib/components/search-select/search-select-template.directive';
 export * from './lib/components/progress-bar/progress-bar.component';
 export * from './lib/components/split-section/split-section.component';
 export * from './lib/components/split-button/split-button.component';
+export * from './lib/components/sp-spinner/sp-spinner.component';
 export * from 
'./lib/components/sp-exception-message/sp-exception-message.component';
 export * from 
'./lib/components/sp-exception-message/exception-details-dialog/exception-details-dialog.component';
 export * from 
'./lib/components/sp-exception-message/exception-details/exception-details.component';
diff --git 
a/ui/src/app/assets/components/asset-details/edit-asset/asset-details-panel/asset-details-links/asset-details-links.component.html
 
b/ui/src/app/assets/components/asset-details/edit-asset/asset-details-panel/asset-details-links/asset-details-links.component.html
index 608ce0aaaa..66493e6ba2 100644
--- 
a/ui/src/app/assets/components/asset-details/edit-asset/asset-details-panel/asset-details-links/asset-details-links.component.html
+++ 
b/ui/src/app/assets/components/asset-details/edit-asset/asset-details-panel/asset-details-links/asset-details-links.component.html
@@ -42,15 +42,14 @@
             </button>
         }
     </div>
-    @if (assetLinkTypes) {
-        <div fxLayout="column" fxFlex="100" class="mt-10">
-            <sp-asset-link-table
-                #assetLinkTable
-                [assetLinkTypes]="assetLinkTypes"
-                [asset]="asset"
-                [assetModel]="assetModel"
-                [editMode]="true"
-            ></sp-asset-link-table>
-        </div>
-    }
+    <div fxLayout="column" fxFlex="100" class="mt-10">
+        <sp-asset-link-table
+            #assetLinkTable
+            [assetLinkTypes]="assetLinkTypes"
+            [asset]="asset"
+            [assetModel]="assetModel"
+            [editMode]="true"
+            [loading]="!assetLinksLoaded"
+        ></sp-asset-link-table>
+    </div>
 </sp-split-section>
diff --git 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.html
 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.html
index da7295734b..08e1cd1908 100644
--- 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.html
+++ 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.html
@@ -17,101 +17,112 @@
   -->
 
 <div fxFlex="100" fxLayout="row" fxLayoutAlign="center start">
-    <sp-table
-        fxFlex="100"
-        [columns]="displayedColumns"
-        [dataSource]="dataSource"
-        [showActionsMenu]="true"
-        [rowsClickable]="true"
-        (rowClicked)="openDetails($event)"
-        data-cy="all-adapters-table"
-        matSort
-    >
-        <ng-container matColumnDef="type">
-            <th mat-header-cell mat-sort-header *matHeaderCellDef>
-                {{ 'Type' | translate }}
-            </th>
-            <td mat-cell *matCellDef="let assetLink">
-                <div
-                    fxLayout="column"
-                    fxLayoutAlign="start start"
-                    class="truncate"
-                >
-                    <sp-asset-link-table-type
-                        [assetLink]="assetLink"
-                        [assetLinkTypes]="assetLinkTypes"
-                        class="mt-sm mb-sm"
-                    >
-                    </sp-asset-link-table-type>
-                </div>
-            </td>
-        </ng-container>
-        <ng-container matColumnDef="linkLabel">
-            <th mat-header-cell mat-sort-header *matHeaderCellDef>
-                {{ 'Name' | translate }}
-            </th>
-            <td
-                mat-cell
-                *matCellDef="let assetLink"
-                data-cy="asset-links-table"
+    <div fxFlex="100" fxLayout="column" fxLayoutGap="8px">
+        @if (loading) {
+            <div fxFlex="100" fxLayoutAlign="center center" fxLayout="column">
+                <sp-spinner
+                    [diameter]="25"
+                    [text]="'Loading' | translate"
+                ></sp-spinner>
+            </div>
+        } @else {
+            <sp-table
+                fxFlex="100"
+                [columns]="displayedColumns"
+                [dataSource]="dataSource"
+                [showActionsMenu]="true"
+                [rowsClickable]="true"
+                (rowClicked)="openDetails($event)"
+                data-cy="all-adapters-table"
+                matSort
             >
-                <div
-                    fxLayout="column"
-                    fxLayoutAlign="start start"
-                    class="truncate"
-                >
-                    <span>{{ assetLink.linkLabel }}</span>
-                </div>
-            </td>
-        </ng-container>
-        <ng-container matColumnDef="additionalInfo">
-            <th mat-header-cell *matHeaderCellDef>Info</th>
-            <td mat-cell *matCellDef="let assetLink">
-                <sp-asset-link-table-additional-data
-                    [isAdminUser]="isAdminUser"
-                    [assetLink]="assetLink"
-                    [certificates]="certificates"
-                >
-                </sp-asset-link-table-additional-data>
-            </td>
-        </ng-container>
+                <ng-container matColumnDef="type">
+                    <th mat-header-cell mat-sort-header *matHeaderCellDef>
+                        {{ 'Type' | translate }}
+                    </th>
+                    <td mat-cell *matCellDef="let assetLink">
+                        <div
+                            fxLayout="column"
+                            fxLayoutAlign="start start"
+                            class="truncate"
+                        >
+                            <sp-asset-link-table-type
+                                [assetLink]="assetLink"
+                                [assetLinkTypes]="assetLinkTypes"
+                                class="mt-sm mb-sm"
+                            >
+                            </sp-asset-link-table-type>
+                        </div>
+                    </td>
+                </ng-container>
+                <ng-container matColumnDef="linkLabel">
+                    <th mat-header-cell mat-sort-header *matHeaderCellDef>
+                        {{ 'Name' | translate }}
+                    </th>
+                    <td
+                        mat-cell
+                        *matCellDef="let assetLink"
+                        data-cy="asset-links-table"
+                    >
+                        <div
+                            fxLayout="column"
+                            fxLayoutAlign="start start"
+                            class="truncate"
+                        >
+                            <span>{{ assetLink.linkLabel }}</span>
+                        </div>
+                    </td>
+                </ng-container>
+                <ng-container matColumnDef="additionalInfo">
+                    <th mat-header-cell *matHeaderCellDef>Info</th>
+                    <td mat-cell *matCellDef="let assetLink">
+                        <sp-asset-link-table-additional-data
+                            [isAdminUser]="isAdminUser"
+                            [assetLink]="assetLink"
+                            [certificates]="certificates"
+                        >
+                        </sp-asset-link-table-additional-data>
+                    </td>
+                </ng-container>
 
-        <ng-template spTableActions let-element>
-            <button
-                mat-menu-item
-                data-cy="details-asset-link"
-                [disabled]="!hasFeatureCard(element.linkType)"
-                (click)="openDetails(element)"
-            >
-                <mat-icon>visibility</mat-icon>
-                <span>{{ 'Details' | translate }}</span>
-            </button>
-            <button
-                mat-menu-item
-                data-cy="navigate-asset-link"
-                (click)="navigate(element)"
-            >
-                <mat-icon>open_in_new</mat-icon>
-                <span>{{ 'Navigate' | translate }}</span>
-            </button>
-            @if (editMode) {
-                <button
-                    mat-menu-item
-                    data-cy="edit-asset-link"
-                    (click)="openEditAssetLinkDialog(element)"
-                >
-                    <mat-icon>edit</mat-icon>
-                    <span>{{ 'Edit' | translate }}</span>
-                </button>
-                <button
-                    mat-menu-item
-                    data-cy="delete-asset-link"
-                    (click)="deleteAssetLink(element)"
-                >
-                    <mat-icon>delete</mat-icon>
-                    <span>{{ 'Delete' | translate }}</span>
-                </button>
-            }
-        </ng-template>
-    </sp-table>
+                <ng-template spTableActions let-element>
+                    <button
+                        mat-menu-item
+                        data-cy="details-asset-link"
+                        [disabled]="!hasFeatureCard(element.linkType)"
+                        (click)="openDetails(element)"
+                    >
+                        <mat-icon>visibility</mat-icon>
+                        <span>{{ 'Details' | translate }}</span>
+                    </button>
+                    <button
+                        mat-menu-item
+                        data-cy="navigate-asset-link"
+                        (click)="navigate(element)"
+                    >
+                        <mat-icon>open_in_new</mat-icon>
+                        <span>{{ 'Navigate' | translate }}</span>
+                    </button>
+                    @if (editMode) {
+                        <button
+                            mat-menu-item
+                            data-cy="edit-asset-link"
+                            (click)="openEditAssetLinkDialog(element)"
+                        >
+                            <mat-icon>edit</mat-icon>
+                            <span>{{ 'Edit' | translate }}</span>
+                        </button>
+                        <button
+                            mat-menu-item
+                            data-cy="delete-asset-link"
+                            (click)="deleteAssetLink(element)"
+                        >
+                            <mat-icon>delete</mat-icon>
+                            <span>{{ 'Delete' | translate }}</span>
+                        </button>
+                    }
+                </ng-template>
+            </sp-table>
+        }
+    </div>
 </div>
diff --git 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.ts
 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.ts
index 8507749a56..cce831064c 100644
--- 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.ts
+++ 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.ts
@@ -52,6 +52,7 @@ import {
     PanelType,
     SpTableActionsDirective,
     SpTableComponent,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { TranslatePipe, TranslateService } from '@ngx-translate/core';
 import { Router } from '@angular/router';
@@ -88,6 +89,7 @@ import { MatIcon } from '@angular/material/icon';
         SpTableActionsDirective,
         MatMenuItem,
         MatIcon,
+        SpSpinnerComponent,
         TranslatePipe,
     ],
 })
@@ -106,6 +108,9 @@ export class AssetLinkTableComponent
     @Input()
     editMode = false;
 
+    @Input()
+    loading = false;
+
     @ViewChild(MatSort)
     sort: MatSort;
 
diff --git 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.html
 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.html
index 48eceaf516..e3b97bf4ec 100644
--- 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.html
+++ 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.html
@@ -34,12 +34,14 @@
                 }
             </div>
             @if (
-                assetLinkTypes.length > 0 &&
-                selectedAsset.assetLinks?.length > 0
+                assetLinkTypesLoading ||
+                (assetLinkTypes.length > 0 &&
+                    selectedAsset.assetLinks?.length > 0)
             ) {
                 <sp-asset-link-table
                     [asset]="selectedAsset"
                     [assetLinkTypes]="assetLinkTypes"
+                    [loading]="assetLinkTypesLoading"
                 >
                 </sp-asset-link-table>
             } @else {
diff --git 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.ts
 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.ts
index 71766b1de2..a8bd62dab9 100644
--- 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.ts
+++ 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.ts
@@ -52,6 +52,7 @@ export class ViewAssetLinksComponent implements OnInit {
     selectedAsset: SpAsset;
 
     assetLinkTypes: AssetLinkType[] = [];
+    assetLinkTypesLoading = true;
 
     private genericStorageService = inject(GenericStorageService);
 
@@ -60,6 +61,7 @@ export class ViewAssetLinksComponent implements OnInit {
             .getAllDocuments(AssetConstants.ASSET_LINK_TYPES_DOC_NAME)
             .subscribe(res => {
                 this.assetLinkTypes = res;
+                this.assetLinkTypesLoading = false;
             });
     }
 }
diff --git 
a/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.html
 
b/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.html
index 5b92b8924c..724e967ce8 100644
--- 
a/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.html
+++ 
b/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.html
@@ -17,210 +17,219 @@
 -->
 
 <div fxLayout="column" fxLayoutGap="8px">
-    <div
-        fxLayout="row wrap"
-        fxLayoutAlign="end center"
-        fxLayoutGap="8px"
-        class="asset-link-table-toolbar"
-    >
-        <button
-            mat-flat-button
-            class="mat-basic"
-            data-cy="asset-link-table-select-all"
-            [disabled]="!hasUnselectedFilteredResources()"
-            (click)="selectAll()"
+    @if (resourcesLoading) {
+        <div fxFlex="100" fxLayoutAlign="center center" fxLayout="column">
+            <sp-spinner
+                [diameter]="25"
+                [text]="'Loading' | translate"
+            ></sp-spinner>
+        </div>
+    } @else {
+        <div
+            fxLayout="row wrap"
+            fxLayoutAlign="end center"
+            fxLayoutGap="8px"
+            class="asset-link-table-toolbar"
         >
-            <mat-icon>queue</mat-icon>
-            {{ 'Select all' | translate }}
-        </button>
-        <button
-            mat-flat-button
-            class="mat-basic"
-            data-cy="asset-link-table-deselect-all"
-            [disabled]="!hasSelectedFilteredResources()"
-            (click)="deselectAll()"
-        >
-            <mat-icon>filter_none</mat-icon>
-            {{ 'Deselect all' | translate }}
-        </button>
+            <button
+                mat-flat-button
+                class="mat-basic"
+                data-cy="asset-link-table-select-all"
+                [disabled]="!hasUnselectedFilteredResources()"
+                (click)="selectAll()"
+            >
+                <mat-icon>queue</mat-icon>
+                {{ 'Select all' | translate }}
+            </button>
+            <button
+                mat-flat-button
+                class="mat-basic"
+                data-cy="asset-link-table-deselect-all"
+                [disabled]="!hasSelectedFilteredResources()"
+                (click)="deselectAll()"
+            >
+                <mat-icon>filter_none</mat-icon>
+                {{ 'Deselect all' | translate }}
+            </button>
 
-        <mat-form-field class="form-field-small asset-link-table-search">
-            <mat-icon matPrefix>search</mat-icon>
-            <input
-                #searchInput
-                matInput
-                [placeholder]="'Search' | translate"
-                [value]="searchTerm"
-                (input)="updateSearch($any($event.target).value)"
-            />
-            @if (searchTerm) {
-                <button
-                    mat-icon-button
-                    matSuffix
-                    type="button"
-                    [attr.aria-label]="'Clear search' | translate"
-                    (click)="clearSearch()"
-                >
-                    <mat-icon>close</mat-icon>
-                </button>
-            }
-        </mat-form-field>
+            <mat-form-field class="form-field-small asset-link-table-search">
+                <mat-icon matPrefix>search</mat-icon>
+                <input
+                    #searchInput
+                    matInput
+                    [placeholder]="'Search' | translate"
+                    [value]="searchTerm"
+                    (input)="updateSearch($any($event.target).value)"
+                />
+                @if (searchTerm) {
+                    <button
+                        mat-icon-button
+                        matSuffix
+                        type="button"
+                        [attr.aria-label]="'Clear search' | translate"
+                        (click)="clearSearch()"
+                    >
+                        <mat-icon>close</mat-icon>
+                    </button>
+                }
+            </mat-form-field>
 
-        <mat-button-toggle-group
-            [value]="viewMode"
-            (change)="updateViewMode($event.value)"
-        >
-            <mat-button-toggle value="grouped">
-                {{ 'Grouped' | translate }}
-            </mat-button-toggle>
-            <mat-button-toggle value="list">
-                {{ 'List' | translate }}
-            </mat-button-toggle>
-        </mat-button-toggle-group>
-    </div>
+            <mat-button-toggle-group
+                [value]="viewMode"
+                (change)="updateViewMode($event.value)"
+            >
+                <mat-button-toggle value="grouped">
+                    {{ 'Grouped' | translate }}
+                </mat-button-toggle>
+                <mat-button-toggle value="list">
+                    {{ 'List' | translate }}
+                </mat-button-toggle>
+            </mat-button-toggle-group>
+        </div>
 
-    <table
-        mat-table
-        matSort
-        [matSortActive]="sort.active"
-        [matSortDirection]="sort.direction"
-        class="sp-table"
-        [dataSource]="renderedRows"
-        [multiTemplateDataRows]="viewMode === 'grouped'"
-        (matSortChange)="updateSort($event)"
-    >
-        <ng-container matColumnDef="selected">
-            <th mat-header-cell *matHeaderCellDef></th>
-            <td mat-cell *matCellDef="let resource">
-                <mat-checkbox
-                    color="accent"
-                    [checked]="isResourceSelected(resource.resourceId)"
-                    [attr.data-cy]="
-                        'select-' +
-                        resource.resourceType
-                            .toLowerCase()
-                            .replace(/\s+/g, '-') +
-                        '-checkbox-' +
-                        resource.resourceName
-                    "
-                    (change)="updateSelection($event.checked, resource)"
-                    (click)="$event.stopPropagation()"
-                >
-                </mat-checkbox>
-            </td>
-        </ng-container>
+        <table
+            mat-table
+            matSort
+            [matSortActive]="sort.active"
+            [matSortDirection]="sort.direction"
+            class="sp-table"
+            [dataSource]="renderedRows"
+            [multiTemplateDataRows]="viewMode === 'grouped'"
+            (matSortChange)="updateSort($event)"
+        >
+            <ng-container matColumnDef="selected">
+                <th mat-header-cell *matHeaderCellDef></th>
+                <td mat-cell *matCellDef="let resource">
+                    <mat-checkbox
+                        color="accent"
+                        [checked]="isResourceSelected(resource.resourceId)"
+                        [attr.data-cy]="
+                            'select-' +
+                            resource.resourceType
+                                .toLowerCase()
+                                .replace(/\s+/g, '-') +
+                            '-checkbox-' +
+                            resource.resourceName
+                        "
+                        (change)="updateSelection($event.checked, resource)"
+                        (click)="$event.stopPropagation()"
+                    >
+                    </mat-checkbox>
+                </td>
+            </ng-container>
 
-        <ng-container matColumnDef="type">
-            <th mat-header-cell mat-sort-header *matHeaderCellDef>
-                {{ 'Type' | translate }}
-            </th>
-            <td mat-cell *matCellDef="let resource">
-                <div
-                    fxLayout="column"
-                    fxLayoutAlign="start start"
-                    class="truncate"
-                >
+            <ng-container matColumnDef="type">
+                <th mat-header-cell mat-sort-header *matHeaderCellDef>
+                    {{ 'Type' | translate }}
+                </th>
+                <td mat-cell *matCellDef="let resource">
                     <div
-                        class="chip mt-sm mb-sm"
-                        [ngStyle]="{ color: getLinkTypeColor(resource) }"
+                        fxLayout="column"
+                        fxLayoutAlign="start start"
+                        class="truncate"
                     >
-                        <mat-icon class="link-type-icon">
-                            {{ getLinkType(resource)?.linkIcon || 'link' }}
-                        </mat-icon>
-                        <span class="text-sm">
-                            {{
-                                getLinkType(resource)?.linkLabel ||
-                                    resource.resourceType
-                            }}
-                        </span>
+                        <div
+                            class="chip mt-sm mb-sm"
+                            [ngStyle]="{ color: getLinkTypeColor(resource) }"
+                        >
+                            <mat-icon class="link-type-icon">
+                                {{ getLinkType(resource)?.linkIcon || 'link' }}
+                            </mat-icon>
+                            <span class="text-sm">
+                                {{
+                                    getLinkType(resource)?.linkLabel ||
+                                        resource.resourceType
+                                }}
+                            </span>
+                        </div>
                     </div>
-                </div>
-            </td>
-        </ng-container>
+                </td>
+            </ng-container>
 
-        <ng-container matColumnDef="linkLabel">
-            <th mat-header-cell mat-sort-header *matHeaderCellDef>
-                {{ 'Name' | translate }}
-            </th>
-            <td mat-cell *matCellDef="let resource">
-                <div
-                    fxLayout="column"
-                    fxLayoutAlign="start start"
-                    class="truncate"
-                >
-                    <span>{{ resource.resourceName }}</span>
-                </div>
-            </td>
-        </ng-container>
+            <ng-container matColumnDef="linkLabel">
+                <th mat-header-cell mat-sort-header *matHeaderCellDef>
+                    {{ 'Name' | translate }}
+                </th>
+                <td mat-cell *matCellDef="let resource">
+                    <div
+                        fxLayout="column"
+                        fxLayoutAlign="start start"
+                        class="truncate"
+                    >
+                        <span>{{ resource.resourceName }}</span>
+                    </div>
+                </td>
+            </ng-container>
 
-        <ng-container matColumnDef="groupHeader">
-            <td
-                mat-cell
-                *matCellDef="let group"
-                class="asset-link-table-group-header-cell"
-                [attr.colspan]="displayedColumns.length"
-            >
-                <div
-                    fxLayout="row"
-                    fxLayoutAlign="start center"
-                    fxLayoutGap="8px"
-                    class="asset-link-table-group-header"
+            <ng-container matColumnDef="groupHeader">
+                <td
+                    mat-cell
+                    *matCellDef="let group"
+                    class="asset-link-table-group-header-cell"
+                    [attr.colspan]="displayedColumns.length"
                 >
-                    <button
-                        mat-icon-button
-                        type="button"
-                        class="asset-link-table-group-toggle"
-                        (click)="toggleGroup(group.id)"
-                    >
-                        <mat-icon>
-                            {{
-                                group.collapsed
-                                    ? 'chevron_right'
-                                    : 'expand_more'
-                            }}
-                        </mat-icon>
-                    </button>
                     <div
-                        class="chip asset-link-table-group-chip"
-                        [ngStyle]="{ color: group.color }"
+                        fxLayout="row"
+                        fxLayoutAlign="start center"
+                        fxLayoutGap="8px"
+                        class="asset-link-table-group-header"
                     >
-                        <mat-icon class="link-type-icon">
-                            {{ group.icon }}
-                        </mat-icon>
-                        <span class="text-sm">
-                            {{ group.title | translate }}
+                        <button
+                            mat-icon-button
+                            type="button"
+                            class="asset-link-table-group-toggle"
+                            (click)="toggleGroup(group.id)"
+                        >
+                            <mat-icon>
+                                {{
+                                    group.collapsed
+                                        ? 'chevron_right'
+                                        : 'expand_more'
+                                }}
+                            </mat-icon>
+                        </button>
+                        <div
+                            class="chip asset-link-table-group-chip"
+                            [ngStyle]="{ color: group.color }"
+                        >
+                            <mat-icon class="link-type-icon">
+                                {{ group.icon }}
+                            </mat-icon>
+                            <span class="text-sm">
+                                {{ group.title | translate }}
+                            </span>
+                        </div>
+                        <span class="asset-link-table-group-count text-sm">
+                            {{ group.count }}
                         </span>
                     </div>
-                    <span class="asset-link-table-group-count text-sm">
-                        {{ group.count }}
-                    </span>
-                </div>
-            </td>
-        </ng-container>
+                </td>
+            </ng-container>
 
-        <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
-        <tr
-            mat-row
-            *matRowDef="
-                let row;
-                columns: groupHeaderColumns;
-                when: isGroupHeaderRow
-            "
-            class="asset-link-table-group-row"
-        ></tr>
-        <tr
-            mat-row
-            *matRowDef="let row; columns: displayedColumns; when: isDataRow"
-        ></tr>
+            <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
+            <tr
+                mat-row
+                *matRowDef="
+                    let row;
+                    columns: groupHeaderColumns;
+                    when: isGroupHeaderRow
+                "
+                class="asset-link-table-group-row"
+            ></tr>
+            <tr
+                mat-row
+                *matRowDef="let row; columns: displayedColumns; when: 
isDataRow"
+            ></tr>
 
-        <tr class="mat-row" *matNoDataRow>
-            <td
-                class="mat-cell"
-                data-cy="no-table-entries"
-                [colSpan]="displayedColumns.length"
-            >
-                {{ 'No entries available.' | translate }}
-            </td>
-        </tr>
-    </table>
+            <tr class="mat-row" *matNoDataRow>
+                <td
+                    class="mat-cell"
+                    data-cy="no-table-entries"
+                    [colSpan]="displayedColumns.length"
+                >
+                    {{ 'No entries available.' | translate }}
+                </td>
+            </tr>
+        </table>
+    }
 </div>
diff --git 
a/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.ts
 
b/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.ts
index 16a15e71f0..a905d58b93 100644
--- 
a/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.ts
+++ 
b/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.ts
@@ -65,6 +65,7 @@ import {
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
 import { LayoutGapDirective } from '@ngbracket/ngx-layout';
+import { SpSpinnerComponent } from '@streampipes/shared-ui';
 
 interface AssetLinkGroupHeaderRow {
     groupHeader: true;
@@ -101,6 +102,7 @@ type AssetLinkViewMode = 'grouped' | 'list';
         MatHeaderRow,
         MatHeaderRowDef,
         MatIcon,
+        SpSpinnerComponent,
         MatIconButton,
         MatInput,
         MatNoDataRow,
@@ -128,6 +130,9 @@ export class AssetLinkTableComponent {
     @Input()
     assetLinkTypes: AssetLinkType[] = [];
 
+    @Input()
+    resourcesLoading = false;
+
     @Output()
     selectionChange = new EventEmitter<AssetLinkSelectionChange>();
 
diff --git 
a/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.html
 
b/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.html
index 7bcd39cc0c..56fcb013cf 100644
--- 
a/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.html
+++ 
b/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.html
@@ -24,6 +24,7 @@
                 [resources]="resourceRows"
                 [selectedResourceIds]="selectedResourceIds"
                 [assetLinkTypes]="assetLinkTypes"
+                [resourcesLoading]="resourcesLoading"
                 (selectionChange)="selectLink($event)"
                 data-cy="manage-asset-links-table"
             >
diff --git 
a/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.ts
 
b/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.ts
index ddf8d37c14..b4d3d26d52 100644
--- 
a/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.ts
+++ 
b/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.ts
@@ -63,6 +63,7 @@ export class SpManageAssetLinksDialogComponent
     clonedAssetLinks: AssetLink[] = [];
 
     resourceRows: AssetLinkResourceRow[] = [];
+    resourcesLoading = true;
 
     ngOnInit(): void {
         super.onInit();
@@ -161,6 +162,7 @@ export class SpManageAssetLinksDialogComponent
                 ),
             ),
         ];
+        this.resourcesLoading = false;
     }
 
     linkSelected(resourceId: string): boolean {
diff --git 
a/ui/src/app/chart-shared/components/chart-container/chart-container.component.html
 
b/ui/src/app/chart-shared/components/chart-container/chart-container.component.html
index 7f1ca237ef..c6157b7eba 100644
--- 
a/ui/src/app/chart-shared/components/chart-container/chart-container.component.html
+++ 
b/ui/src/app/chart-shared/components/chart-container/chart-container.component.html
@@ -85,12 +85,8 @@
                     <div fxLayout="row" fxLayoutAlign="end center">
                         @if (editMode) {
                             @if (timerActive) {
-                                <mat-spinner
-                                    [diameter]="20"
-                                    color="primary"
-                                    class="mr-10"
-                                >
-                                </mat-spinner>
+                                <sp-spinner [diameter]="20" class="mr-10">
+                                </sp-spinner>
                             }
                             <sp-label
                                 shape="badge"
diff --git 
a/ui/src/app/chart-shared/components/chart-container/chart-container.component.ts
 
b/ui/src/app/chart-shared/components/chart-container/chart-container.component.ts
index f0c5677634..6772343bb1 100644
--- 
a/ui/src/app/chart-shared/components/chart-container/chart-container.component.ts
+++ 
b/ui/src/app/chart-shared/components/chart-container/chart-container.component.ts
@@ -59,6 +59,7 @@ import {
     TimeRangeSelectorMenuComponent,
     TimeSelectionService,
     TimeSelectorLabel,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { ChartSharedService } from '../../services/chart-shared.service';
 import {
@@ -79,7 +80,6 @@ import {
 import { MatButton, MatIconButton } from '@angular/material/button';
 import { MatIcon } from '@angular/material/icon';
 import { FormsModule } from '@angular/forms';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatTooltip } from '@angular/material/tooltip';
 import { TranslatePipe } from '@ngx-translate/core';
 
@@ -97,7 +97,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         MatIconButton,
         MatIcon,
         FormsModule,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         SpLabelComponent,
         MatMenuTrigger,
         MatTooltip,
diff --git 
a/ui/src/app/chart/components/chart-overview/chart-overview-table/chart-overview-table.component.html
 
b/ui/src/app/chart/components/chart-overview/chart-overview-table/chart-overview-table.component.html
index 0df252e181..48d96ef2ce 100644
--- 
a/ui/src/app/chart/components/chart-overview/chart-overview-table/chart-overview-table.component.html
+++ 
b/ui/src/app/chart/components/chart-overview/chart-overview-table/chart-overview-table.component.html
@@ -21,35 +21,22 @@
         [title]="'Charts' | translate"
     ></sp-basic-header-title-component>
     @if (isLoading && !hasLoadedCharts) {
-        <div
-            fxLayout="column"
-            fxFlex="100"
-            fxLayoutAlign="center center"
-            fxLayoutGap="12px"
-        >
-            <mat-progress-spinner
-                mode="indeterminate"
+        <div fxLayout="column" fxFlex="100" fxLayoutAlign="center center">
+            <sp-spinner
                 diameter="40"
-            ></mat-progress-spinner>
-            <span class="chart-overview-loading-text">{{
-                'Loading' | translate
-            }}</span>
+                [text]="'Loading' | translate"
+            ></sp-spinner>
         </div>
     } @else {
         @if (isLoading) {
-            <div
-                fxLayout="row"
-                fxLayoutAlign="end center"
-                fxLayoutGap="8px"
-                class="p-2"
-            >
-                <mat-progress-spinner
-                    mode="indeterminate"
+            <div class="p-2">
+                <sp-spinner
                     diameter="18"
-                ></mat-progress-spinner>
-                <span class="chart-overview-loading-text">{{
-                    'Loading' | translate
-                }}</span>
+                    layout="row"
+                    align="end center"
+                    gap="8px"
+                    [text]="'Loading' | translate"
+                ></sp-spinner>
             </div>
         }
         <div fxFlex="100" fxLayout="row" fxLayoutAlign="center start">
diff --git 
a/ui/src/app/chart/components/chart-overview/chart-overview-table/chart-overview-table.component.ts
 
b/ui/src/app/chart/components/chart-overview/chart-overview-table/chart-overview-table.component.ts
index 3fcc7a1a78..9efb008a52 100644
--- 
a/ui/src/app/chart/components/chart-overview/chart-overview-table/chart-overview-table.component.ts
+++ 
b/ui/src/app/chart/components/chart-overview/chart-overview-table/chart-overview-table.component.ts
@@ -51,6 +51,7 @@ import {
     SpBasicHeaderTitleComponent,
     SpTableActionsDirective,
     SpTableComponent,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { MatDialog } from '@angular/material/dialog';
 import { TranslatePipe, TranslateService } from '@ngx-translate/core';
@@ -67,7 +68,6 @@ import { MatMenuItem } from '@angular/material/menu';
 import { MatIcon } from '@angular/material/icon';
 import { MatTooltip } from '@angular/material/tooltip';
 import { ChartRegistry } from 
'../../../../chart-shared/registry/chart-registry.service';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 
 type ManageableChart = DataExplorerWidgetModel & {
     name: string;
@@ -109,7 +109,7 @@ type ChartOverviewRow = ChartSummaryDto & {
         MatMenuItem,
         MatIcon,
         MatTooltip,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         TranslatePipe,
     ],
     changeDetection: ChangeDetectionStrategy.OnPush,
diff --git 
a/ui/src/app/chart/components/chart-overview/chart-overview.component.scss 
b/ui/src/app/chart/components/chart-overview/chart-overview.component.scss
index c10f9025ea..9103beb12d 100644
--- a/ui/src/app/chart/components/chart-overview/chart-overview.component.scss
+++ b/ui/src/app/chart/components/chart-overview/chart-overview.component.scss
@@ -35,8 +35,3 @@
 .mr-10 {
     margin-right: 10px;
 }
-
-.chart-overview-loading-text {
-    font-size: var(--font-size-sm);
-    color: var(--color-paragraph);
-}
diff --git 
a/ui/src/app/configuration/dialog/extensions-service-running-instances/extensions-service-running-instances-dialog.component.html
 
b/ui/src/app/configuration/dialog/extensions-service-running-instances/extensions-service-running-instances-dialog.component.html
index 3253a9b4e9..2fcb0df546 100644
--- 
a/ui/src/app/configuration/dialog/extensions-service-running-instances/extensions-service-running-instances-dialog.component.html
+++ 
b/ui/src/app/configuration/dialog/extensions-service-running-instances/extensions-service-running-instances-dialog.component.html
@@ -47,7 +47,7 @@
                     fxLayoutAlign="center center"
                     class="loading-container"
                 >
-                    <mat-spinner diameter="32"></mat-spinner>
+                    <sp-spinner diameter="32"></sp-spinner>
                 </div>
             }
 
diff --git 
a/ui/src/app/configuration/dialog/extensions-service-running-instances/extensions-service-running-instances-dialog.component.ts
 
b/ui/src/app/configuration/dialog/extensions-service-running-instances/extensions-service-running-instances-dialog.component.ts
index 02dcb597ae..fd0d313d21 100644
--- 
a/ui/src/app/configuration/dialog/extensions-service-running-instances/extensions-service-running-instances-dialog.component.ts
+++ 
b/ui/src/app/configuration/dialog/extensions-service-running-instances/extensions-service-running-instances-dialog.component.ts
@@ -20,7 +20,6 @@ import { Component, Input, OnInit, inject } from 
'@angular/core';
 import { MatButton, MatIconButton } from '@angular/material/button';
 import { MatDivider } from '@angular/material/divider';
 import { MatIcon } from '@angular/material/icon';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import {
     MatCell,
     MatCellDef,
@@ -45,6 +44,7 @@ import {
     SpLabelComponent,
     SpTableComponent,
     SpTableNameSearchConfig,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import {
     ConfigurationService,
@@ -95,7 +95,7 @@ type PendingRemoval =
         MatHeaderCellDef,
         MatIcon,
         MatIconButton,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         MatTooltip,
         SpAlertBannerComponent,
         SpLabelComponent,
diff --git 
a/ui/src/app/configuration/email-configuration/email-configuration.component.html
 
b/ui/src/app/configuration/email-configuration/email-configuration.component.html
index 60bdf5e4fd..44d2e98b6a 100644
--- 
a/ui/src/app/configuration/email-configuration/email-configuration.component.html
+++ 
b/ui/src/app/configuration/email-configuration/email-configuration.component.html
@@ -269,9 +269,7 @@
                             <div fxLayout="column">
                                 @if (sendingTestMailInProgress) {
                                     <div fxLayout="row">
-                                        <mat-progress-spinner
-                                            diameter="10"
-                                        ></mat-progress-spinner>
+                                        <sp-spinner diameter="10"></sp-spinner>
                                         <h5>
                                             {{
                                                 'Trying to send test mail...'
diff --git 
a/ui/src/app/configuration/email-configuration/email-configuration.component.ts 
b/ui/src/app/configuration/email-configuration/email-configuration.component.ts
index d4d0a0efa4..ae753740d6 100644
--- 
a/ui/src/app/configuration/email-configuration/email-configuration.component.ts
+++ 
b/ui/src/app/configuration/email-configuration/email-configuration.component.ts
@@ -36,6 +36,7 @@ import {
     SpBreadcrumbService,
     SplitSectionComponent,
     SpNavigationItem,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { TranslatePipe, TranslateService } from '@ngx-translate/core';
 import {
@@ -48,7 +49,6 @@ import { MatInput } from '@angular/material/input';
 import { MatRadioButton, MatRadioGroup } from '@angular/material/radio';
 import { MatCheckbox } from '@angular/material/checkbox';
 import { MatButton } from '@angular/material/button';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { SpEmailTemplateConfigurationComponent } from 
'./email-template-configuration/email-template-configuration.component';
 import { MatDivider } from '@angular/material/divider';
 
@@ -71,7 +71,7 @@ import { MatDivider } from '@angular/material/divider';
         MatCheckbox,
         MatLabel,
         MatButton,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         SpAlertBannerComponent,
         SpEmailTemplateConfigurationComponent,
         MatDivider,
diff --git 
a/ui/src/app/configuration/export/export-dialog/data-export-dialog.component.html
 
b/ui/src/app/configuration/export/export-dialog/data-export-dialog.component.html
index 78ad88e566..7488e6257e 100644
--- 
a/ui/src/app/configuration/export/export-dialog/data-export-dialog.component.html
+++ 
b/ui/src/app/configuration/export/export-dialog/data-export-dialog.component.html
@@ -209,10 +209,10 @@
                 class="mt-10"
                 fxLayoutAlign="center center"
             >
-                <mat-spinner [diameter]="25" color="accent"></mat-spinner>
-                <h4 class="mt-10">
-                    {{ 'Exporting resources...' | translate }}
-                </h4>
+                <sp-spinner
+                    [diameter]="25"
+                    [text]="'Exporting resources...' | translate"
+                ></sp-spinner>
                 <span class="text-md mt-10">
                     {{
                         'Depending on number and size of exported files, this 
might take a while...'
diff --git 
a/ui/src/app/configuration/export/export-dialog/data-export-dialog.component.ts 
b/ui/src/app/configuration/export/export-dialog/data-export-dialog.component.ts
index 0b64ce549b..1e129e2ec9 100644
--- 
a/ui/src/app/configuration/export/export-dialog/data-export-dialog.component.ts
+++ 
b/ui/src/app/configuration/export/export-dialog/data-export-dialog.component.ts
@@ -21,6 +21,7 @@ import {
     DialogRef,
     SpAlertBannerComponent,
     SplitSectionComponent,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { DataExportService } from '../data-export.service';
 import {
@@ -34,7 +35,6 @@ import {
     LayoutDirective,
     LayoutGapDirective,
 } from '@ngbracket/ngx-layout/flex';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatDivider } from '@angular/material/divider';
 import { MatButton } from '@angular/material/button';
 import { MatCheckbox, MatCheckboxChange } from '@angular/material/checkbox';
@@ -72,7 +72,7 @@ type ExportSectionKey =
         LayoutDirective,
         LayoutAlignDirective,
         LayoutGapDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         MatDivider,
         MatButton,
         MatCheckbox,
diff --git 
a/ui/src/app/configuration/export/import-dialog/data-import-dialog.component.html
 
b/ui/src/app/configuration/export/import-dialog/data-import-dialog.component.html
index aaef675895..ee2ae02af5 100644
--- 
a/ui/src/app/configuration/export/import-dialog/data-import-dialog.component.html
+++ 
b/ui/src/app/configuration/export/import-dialog/data-import-dialog.component.html
@@ -204,10 +204,10 @@
                 class="mt-10"
                 fxLayoutAlign="center center"
             >
-                <mat-spinner [diameter]="50" color="accent"></mat-spinner>
-                <h4 class="mt-10">
-                    {{ 'Importing resources...' | translate }}
-                </h4>
+                <sp-spinner
+                    [diameter]="50"
+                    [text]="'Importing resources...' | translate"
+                ></sp-spinner>
             </div>
         }
     </div>
diff --git 
a/ui/src/app/configuration/export/import-dialog/data-import-dialog.component.ts 
b/ui/src/app/configuration/export/import-dialog/data-import-dialog.component.ts
index 4a15ae4e1a..5c3170a1a7 100644
--- 
a/ui/src/app/configuration/export/import-dialog/data-import-dialog.component.ts
+++ 
b/ui/src/app/configuration/export/import-dialog/data-import-dialog.component.ts
@@ -22,6 +22,7 @@ import {
     SpAlertBannerComponent,
     SpAssetBrowserService,
     SplitSectionComponent,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { DataExportService } from '../data-export.service';
 import { HttpEventType, HttpResponse } from '@angular/common/http';
@@ -49,7 +50,6 @@ import { SpDataExportItemComponent } from 
'../export-dialog/data-export-item/dat
 import { GenericStorageItemsComponent } from 
'../export-dialog/generic-storage-items/generic-storage-items.component';
 import { MatCheckbox } from '@angular/material/checkbox';
 import { FormsModule } from '@angular/forms';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatDivider } from '@angular/material/divider';
 
 @Component({
@@ -74,7 +74,7 @@ import { MatDivider } from '@angular/material/divider';
         FormsModule,
         FlexDirective,
         LayoutAlignDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         MatDivider,
         TranslatePipe,
     ],
diff --git 
a/ui/src/app/configuration/extensions-installation/extensions-installation.component.html
 
b/ui/src/app/configuration/extensions-installation/extensions-installation.component.html
index 65789caf64..3c107650fe 100644
--- 
a/ui/src/app/configuration/extensions-installation/extensions-installation.component.html
+++ 
b/ui/src/app/configuration/extensions-installation/extensions-installation.component.html
@@ -181,18 +181,16 @@
             </div>
         }
         @if (!endpointItemsLoadingComplete) {
-            <div fxFlex="100" fxLayout="row" fxLayoutAlign="center center">
-                <mat-spinner
-                    [mode]="'indeterminate'"
+            <div fxFlex="100" fxLayoutAlign="center center">
+                <sp-spinner
                     [diameter]="20"
-                    color="accent"
-                ></mat-spinner>
-                <h4>
-                    &nbsp;&nbsp;{{
+                    layout="row"
+                    gap="8px"
+                    [text]="
                         'Searching for available extensions, please wait...'
                             | translate
-                    }}
-                </h4>
+                    "
+                ></sp-spinner>
             </div>
         }
     </div>
diff --git 
a/ui/src/app/configuration/extensions-installation/extensions-installation.component.ts
 
b/ui/src/app/configuration/extensions-installation/extensions-installation.component.ts
index 1ec6d98159..c3e5cdf988 100644
--- 
a/ui/src/app/configuration/extensions-installation/extensions-installation.component.ts
+++ 
b/ui/src/app/configuration/extensions-installation/extensions-installation.component.ts
@@ -25,6 +25,7 @@ import {
     SpBasicNavTabsComponent,
     SpBreadcrumbService,
     SpNavigationItem,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { ExtensionItemDescription } from '@streampipes/platform-services';
 import {
@@ -49,7 +50,6 @@ import { MatInput } from '@angular/material/input';
 import { FormsModule } from '@angular/forms';
 import { MatIcon } from '@angular/material/icon';
 import { EndpointItemComponent } from 
'./endpoint-item/endpoint-item.component';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { OrderByPipe } from './filter/order-by.pipe';
 import { PipelineElementNameFilter } from 
'./filter/pipeline-element-name.pipe';
 import { PipelineElementInstallationStatusFilter } from 
'./filter/pipeline-element-installation-status.pipe';
@@ -76,7 +76,7 @@ import { PipelineElementTypeFilter } from 
'./filter/pipeline-element-type.pipe';
         MatPrefix,
         SpBasicHeaderTitleComponent,
         EndpointItemComponent,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         TranslatePipe,
         OrderByPipe,
         PipelineElementNameFilter,
diff --git 
a/ui/src/app/connect/components/adapter-catalog/adapter-catalog.component.html 
b/ui/src/app/connect/components/adapter-catalog/adapter-catalog.component.html
index 3b0af4080c..f1bbdffef6 100644
--- 
a/ui/src/app/connect/components/adapter-catalog/adapter-catalog.component.html
+++ 
b/ui/src/app/connect/components/adapter-catalog/adapter-catalog.component.html
@@ -51,17 +51,13 @@
                     class="container-fluid marketplace-container"
                     fxFlex="100"
                     fxLayoutAlign="center center"
-                    fxLayout="row"
                 >
-                    <mat-spinner
-                        [mode]="'indeterminate'"
+                    <sp-spinner
                         [diameter]="20"
-                        color="accent"
-                    ></mat-spinner>
-                    <h4>
-                        &nbsp;&nbsp;Searching for available adapters, please
-                        wait...
-                    </h4>
+                        layout="row"
+                        gap="8px"
+                        text="Searching for available adapters, please wait..."
+                    ></sp-spinner>
                 </div>
             }
             @if (!adaptersLoading && !adapterLoadingError) {
diff --git 
a/ui/src/app/connect/components/adapter-catalog/adapter-catalog.component.ts 
b/ui/src/app/connect/components/adapter-catalog/adapter-catalog.component.ts
index 31e5bf8c5e..7e792e55a4 100644
--- a/ui/src/app/connect/components/adapter-catalog/adapter-catalog.component.ts
+++ b/ui/src/app/connect/components/adapter-catalog/adapter-catalog.component.ts
@@ -25,6 +25,7 @@ import {
     SpBasicHeaderTitleComponent,
     SpBasicViewComponent,
     SpBreadcrumbService,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { AdapterFilterSettingsModel } from 
'../../model/adapter-filter-settings.model';
 import { SpConnectRoutes } from '../../connect.breadcrumb';
@@ -34,7 +35,6 @@ import {
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
 import { SpConnectFilterToolbarComponent } from 
'../filter-toolbar/filter-toolbar.component';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { AdapterCatalogItemComponent } from 
'./adapter-description/adapter-catalog-item.component';
 import { TranslatePipe } from '@ngx-translate/core';
 import { AdapterFilterPipe } from '../../filter/adapter-filter.pipe';
@@ -50,7 +50,7 @@ import { AdapterFilterPipe } from 
'../../filter/adapter-filter.pipe';
         LayoutDirective,
         SpConnectFilterToolbarComponent,
         SpBasicHeaderTitleComponent,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         AdapterCatalogItemComponent,
         TranslatePipe,
         AdapterFilterPipe,
diff --git 
a/ui/src/app/connect/components/adapter-configuration/configure-fields/configure-fields-loading-message/configure-fields-loading-message.component.html
 
b/ui/src/app/connect/components/adapter-configuration/configure-fields/configure-fields-loading-message/configure-fields-loading-message.component.html
index 260248b4e3..ec8a019c58 100644
--- 
a/ui/src/app/connect/components/adapter-configuration/configure-fields/configure-fields-loading-message/configure-fields-loading-message.component.html
+++ 
b/ui/src/app/connect/components/adapter-configuration/configure-fields/configure-fields-loading-message/configure-fields-loading-message.component.html
@@ -17,6 +17,6 @@
   -->
 
 <div fxFlex="100" fxLayoutAlign="center center" fxLayout="column">
-    <mat-spinner [diameter]="25"></mat-spinner>
+    <sp-spinner [diameter]="25"></sp-spinner>
     <h5>{{ 'Loading' | translate }}</h5>
 </div>
diff --git 
a/ui/src/app/connect/components/adapter-configuration/configure-fields/configure-fields-loading-message/configure-fields-loading-message.component.ts
 
b/ui/src/app/connect/components/adapter-configuration/configure-fields/configure-fields-loading-message/configure-fields-loading-message.component.ts
index 80849a1208..de64d0aabc 100644
--- 
a/ui/src/app/connect/components/adapter-configuration/configure-fields/configure-fields-loading-message/configure-fields-loading-message.component.ts
+++ 
b/ui/src/app/connect/components/adapter-configuration/configure-fields/configure-fields-loading-message/configure-fields-loading-message.component.ts
@@ -22,8 +22,8 @@ import {
     LayoutAlignDirective,
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { TranslatePipe } from '@ngx-translate/core';
+import { SpSpinnerComponent } from '@streampipes/shared-ui';
 
 @Component({
     selector: 'sp-configure-fields-loading-message',
@@ -32,7 +32,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         FlexDirective,
         LayoutAlignDirective,
         LayoutDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         TranslatePipe,
     ],
 })
diff --git 
a/ui/src/app/connect/components/adapter-configuration/configure-schema/result-preview/adapter-result-preview.component.html
 
b/ui/src/app/connect/components/adapter-configuration/configure-schema/result-preview/adapter-result-preview.component.html
index dc907b38a8..13dd55bd1b 100644
--- 
a/ui/src/app/connect/components/adapter-configuration/configure-schema/result-preview/adapter-result-preview.component.html
+++ 
b/ui/src/app/connect/components/adapter-configuration/configure-schema/result-preview/adapter-result-preview.component.html
@@ -39,7 +39,7 @@
     @if (isRunningScript()) {
         <div class="m-lg">
             <div fxFlex="100" fxLayoutAlign="center center" fxLayout="column">
-                <mat-spinner [diameter]="25"></mat-spinner>
+                <sp-spinner [diameter]="25"></sp-spinner>
                 <h5>{{ 'Loading' | translate }}</h5>
             </div>
         </div>
diff --git 
a/ui/src/app/connect/components/adapter-configuration/configure-schema/result-preview/adapter-result-preview.component.ts
 
b/ui/src/app/connect/components/adapter-configuration/configure-schema/result-preview/adapter-result-preview.component.ts
index a99ab2bf91..a1bb36ebc8 100644
--- 
a/ui/src/app/connect/components/adapter-configuration/configure-schema/result-preview/adapter-result-preview.component.ts
+++ 
b/ui/src/app/connect/components/adapter-configuration/configure-schema/result-preview/adapter-result-preview.component.ts
@@ -24,6 +24,7 @@ import {
 import {
     SpBasicInnerPanelComponent,
     SpExceptionMessageComponent,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import {
     FlexDirective,
@@ -34,7 +35,6 @@ import {
     MatButtonToggle,
     MatButtonToggleGroup,
 } from '@angular/material/button-toggle';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { TranslatePipe } from '@ngx-translate/core';
 
 @Component({
@@ -47,7 +47,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         MatButtonToggleGroup,
         MatButtonToggle,
         LayoutDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         SpExceptionMessageComponent,
         AdapterEventPreviewComponent,
         TranslatePipe,
diff --git 
a/ui/src/app/connect/components/adapter-configuration/configure-schema/sample-preview/adapter-sample-preview.component.html
 
b/ui/src/app/connect/components/adapter-configuration/configure-schema/sample-preview/adapter-sample-preview.component.html
index e3945675cb..869b8cb669 100644
--- 
a/ui/src/app/connect/components/adapter-configuration/configure-schema/sample-preview/adapter-sample-preview.component.html
+++ 
b/ui/src/app/connect/components/adapter-configuration/configure-schema/sample-preview/adapter-sample-preview.component.html
@@ -59,7 +59,7 @@
             fxLayout="column"
             class="m-lg"
         >
-            <mat-spinner [diameter]="25"></mat-spinner>
+            <sp-spinner [diameter]="25"></sp-spinner>
             <h5>{{ 'Loading' | translate }}</h5>
         </div>
     } @else {
diff --git 
a/ui/src/app/connect/components/adapter-configuration/configure-schema/sample-preview/adapter-sample-preview.component.ts
 
b/ui/src/app/connect/components/adapter-configuration/configure-schema/sample-preview/adapter-sample-preview.component.ts
index a82f12ad32..a4d4afa33d 100644
--- 
a/ui/src/app/connect/components/adapter-configuration/configure-schema/sample-preview/adapter-sample-preview.component.ts
+++ 
b/ui/src/app/connect/components/adapter-configuration/configure-schema/sample-preview/adapter-sample-preview.component.ts
@@ -24,6 +24,7 @@ import {
 import {
     SpBasicInnerPanelComponent,
     SpExceptionMessageComponent,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import {
     FlexDirective,
@@ -36,7 +37,6 @@ import {
     MatButtonToggle,
     MatButtonToggleGroup,
 } from '@angular/material/button-toggle';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { ShowFieldStatusInfosComponent } from 
'../show-field-status-infos/show-field-status-infos.component';
 import { TranslatePipe } from '@ngx-translate/core';
 
@@ -52,7 +52,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         MatButtonToggleGroup,
         MatButtonToggle,
         LayoutDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         SpExceptionMessageComponent,
         ShowFieldStatusInfosComponent,
         AdapterEventPreviewComponent,
diff --git 
a/ui/src/app/connect/components/existing-adapters/existing-adapters.component.html
 
b/ui/src/app/connect/components/existing-adapters/existing-adapters.component.html
index 489ceb39ce..08f8938548 100644
--- 
a/ui/src/app/connect/components/existing-adapters/existing-adapters.component.html
+++ 
b/ui/src/app/connect/components/existing-adapters/existing-adapters.component.html
@@ -115,10 +115,7 @@
                                 data-cy="adapter-operation-in-progress-spinner"
                                 fxLayoutAlign="center center"
                             >
-                                <mat-spinner
-                                    color="accent"
-                                    [diameter]="20"
-                                ></mat-spinner>
+                                <sp-spinner [diameter]="20"></sp-spinner>
                             </div>
                         } @else if (!adapter.running) {
                             <button
diff --git 
a/ui/src/app/connect/components/existing-adapters/existing-adapters.component.ts
 
b/ui/src/app/connect/components/existing-adapters/existing-adapters.component.ts
index 5808e77d53..003d6f7e52 100644
--- 
a/ui/src/app/connect/components/existing-adapters/existing-adapters.component.ts
+++ 
b/ui/src/app/connect/components/existing-adapters/existing-adapters.component.ts
@@ -52,6 +52,7 @@ import {
     SpTableMultiActionOption,
     SpTableActionsDirective,
     SpTableComponent,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { AdapterCodeDialogComponent } from 
'../../dialog/adapter-code-dialog/adapter-code-dialog.component';
 import { DeleteAdapterDialogComponent } from 
'../../dialog/delete-adapter-dialog/delete-adapter-dialog.component';
@@ -73,7 +74,6 @@ import { MatButton, MatIconButton } from 
'@angular/material/button';
 import { MatIcon } from '@angular/material/icon';
 import { MatTooltip } from '@angular/material/tooltip';
 import { AdapterStatusLightComponent } from 
'./adapter-status-light/adapter-status-light.component';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatMenuItem } from '@angular/material/menu';
 import { DatePipe } from '@angular/common';
 
@@ -101,7 +101,7 @@ import { DatePipe } from '@angular/common';
         MatCellDef,
         MatCell,
         AdapterStatusLightComponent,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         SpLabelComponent,
         SpTableActionsDirective,
         MatMenuItem,
diff --git 
a/ui/src/app/connect/dialog/adapter-started/adapter-started-loading/adapter-started-loading.component.html
 
b/ui/src/app/connect/dialog/adapter-started/adapter-started-loading/adapter-started-loading.component.html
index 34024865d4..2d49748fa2 100644
--- 
a/ui/src/app/connect/dialog/adapter-started/adapter-started-loading/adapter-started-loading.component.html
+++ 
b/ui/src/app/connect/dialog/adapter-started/adapter-started-loading/adapter-started-loading.component.html
@@ -18,13 +18,11 @@
 
 <div fxLayout="column">
     <div fxLayoutAlign="center">
-        <mat-spinner
+        <sp-spinner
             [diameter]="50"
-            fxLayoutAlign="center"
             style="margin: 10px 0 5px 0"
-            color="accent"
-            >Loading
-        </mat-spinner>
+            text="Loading"
+        ></sp-spinner>
     </div>
     <div fxLayoutAlign="center">
         <h4>
diff --git 
a/ui/src/app/connect/dialog/adapter-started/adapter-started-loading/adapter-started-loading.component.ts
 
b/ui/src/app/connect/dialog/adapter-started/adapter-started-loading/adapter-started-loading.component.ts
index 87d1172761..36b8d3d83c 100644
--- 
a/ui/src/app/connect/dialog/adapter-started/adapter-started-loading/adapter-started-loading.component.ts
+++ 
b/ui/src/app/connect/dialog/adapter-started/adapter-started-loading/adapter-started-loading.component.ts
@@ -17,16 +17,16 @@
  */
 
 import { Component, Input } from '@angular/core';
+import { SpSpinnerComponent } from '@streampipes/shared-ui';
 import {
     LayoutAlignDirective,
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 
 @Component({
     selector: 'sp-adapter-started-loading',
     templateUrl: './adapter-started-loading.component.html',
-    imports: [LayoutDirective, LayoutAlignDirective, MatProgressSpinner],
+    imports: [LayoutDirective, LayoutAlignDirective, SpSpinnerComponent],
 })
 export class SpAdapterStartedLoadingComponent {
     @Input()
diff --git 
a/ui/src/app/connect/dialog/delete-adapter-dialog/delete-adapter-dialog.component.html
 
b/ui/src/app/connect/dialog/delete-adapter-dialog/delete-adapter-dialog.component.html
index fd9c175f88..8ea197cca1 100644
--- 
a/ui/src/app/connect/dialog/delete-adapter-dialog/delete-adapter-dialog.component.html
+++ 
b/ui/src/app/connect/dialog/delete-adapter-dialog/delete-adapter-dialog.component.html
@@ -145,11 +145,7 @@
                 data-cy="adapter-deletion-in-progress"
             >
                 <div fxLayout="row" fxLayoutAlign="space-around">
-                    <mat-spinner
-                        [diameter]="50"
-                        [mode]="'indeterminate'"
-                        color="accent"
-                    ></mat-spinner>
+                    <sp-spinner [diameter]="50"></sp-spinner>
                 </div>
                 <b
                     ><h4>{{ currentStatus }}</h4></b
diff --git 
a/ui/src/app/connect/dialog/delete-adapter-dialog/delete-adapter-dialog.component.ts
 
b/ui/src/app/connect/dialog/delete-adapter-dialog/delete-adapter-dialog.component.ts
index 0bfce6884e..5159b08580 100644
--- 
a/ui/src/app/connect/dialog/delete-adapter-dialog/delete-adapter-dialog.component.ts
+++ 
b/ui/src/app/connect/dialog/delete-adapter-dialog/delete-adapter-dialog.component.ts
@@ -22,14 +22,13 @@ import {
     AdapterSummaryDto,
     AdapterService,
 } from '@streampipes/platform-services';
-import { DialogRef } from '@streampipes/shared-ui';
+import { DialogRef, SpSpinnerComponent } from '@streampipes/shared-ui';
 import {
     FlexDirective,
     LayoutAlignDirective,
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
 import { MatButton } from '@angular/material/button';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatDivider } from '@angular/material/divider';
 import { TranslatePipe } from '@ngx-translate/core';
 
@@ -42,7 +41,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         FlexDirective,
         LayoutAlignDirective,
         MatButton,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         MatDivider,
         TranslatePipe,
     ],
diff --git 
a/ui/src/app/core-ui/loading-indicator/loading-indicator.component.html 
b/ui/src/app/core-ui/loading-indicator/loading-indicator.component.html
index 3be5c4666f..2f61c09c01 100644
--- a/ui/src/app/core-ui/loading-indicator/loading-indicator.component.html
+++ b/ui/src/app/core-ui/loading-indicator/loading-indicator.component.html
@@ -17,6 +17,5 @@
   -->
 
 <div fxLayout="column" fxFlex="100" fxLayoutAlign="center center">
-    <mat-spinner [diameter]="30" color="accent"></mat-spinner>
-    <div class="message-text">{{ message() }}</div>
+    <sp-spinner [diameter]="30" [text]="message()"></sp-spinner>
 </div>
diff --git 
a/ui/src/app/core-ui/loading-indicator/loading-indicator.component.scss 
b/ui/src/app/core-ui/loading-indicator/loading-indicator.component.scss
index 59443f668b..13cbc4aacb 100644
--- a/ui/src/app/core-ui/loading-indicator/loading-indicator.component.scss
+++ b/ui/src/app/core-ui/loading-indicator/loading-indicator.component.scss
@@ -15,8 +15,3 @@
  * limitations under the License.
  *
  */
-
-.message-text {
-    font-size: var(--font-size-md);
-    margin-top: 10px;
-}
diff --git 
a/ui/src/app/core-ui/loading-indicator/loading-indicator.component.ts 
b/ui/src/app/core-ui/loading-indicator/loading-indicator.component.ts
index b96cf1100d..e2665f65c7 100644
--- a/ui/src/app/core-ui/loading-indicator/loading-indicator.component.ts
+++ b/ui/src/app/core-ui/loading-indicator/loading-indicator.component.ts
@@ -18,12 +18,12 @@
 
 import { Component, inject, input } from '@angular/core';
 import { TranslateService } from '@ngx-translate/core';
+import { SpSpinnerComponent } from '@streampipes/shared-ui';
 import {
     FlexDirective,
     LayoutAlignDirective,
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 
 @Component({
     selector: 'sp-loading-indicator',
@@ -33,7 +33,7 @@ import { MatProgressSpinner } from 
'@angular/material/progress-spinner';
         LayoutDirective,
         FlexDirective,
         LayoutAlignDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
     ],
 })
 export class LoadingIndicatorComponent {
diff --git 
a/ui/src/app/core-ui/multi-step-status-indicator/multi-step-status-indicator.component.html
 
b/ui/src/app/core-ui/multi-step-status-indicator/multi-step-status-indicator.component.html
index 40852f0157..e327d0b7a3 100644
--- 
a/ui/src/app/core-ui/multi-step-status-indicator/multi-step-status-indicator.component.html
+++ 
b/ui/src/app/core-ui/multi-step-status-indicator/multi-step-status-indicator.component.html
@@ -27,10 +27,7 @@
             >
                 @if (step.status === Status.PROGRESS) {
                     <div>
-                        <mat-spinner
-                            [diameter]="25"
-                            color="accent"
-                        ></mat-spinner>
+                        <sp-spinner [diameter]="25"></sp-spinner>
                     </div>
                 }
                 @if (step.status === Status.SUCCESS) {
diff --git 
a/ui/src/app/core-ui/multi-step-status-indicator/multi-step-status-indicator.component.ts
 
b/ui/src/app/core-ui/multi-step-status-indicator/multi-step-status-indicator.component.ts
index 666f2b7fdc..0360b1ec75 100644
--- 
a/ui/src/app/core-ui/multi-step-status-indicator/multi-step-status-indicator.component.ts
+++ 
b/ui/src/app/core-ui/multi-step-status-indicator/multi-step-status-indicator.component.ts
@@ -18,13 +18,13 @@
 
 import { Component, Input } from '@angular/core';
 import { Status, StatusIndicator } from './multi-step-status-indicator.model';
+import { SpSpinnerComponent } from '@streampipes/shared-ui';
 import {
     FlexDirective,
     LayoutAlignDirective,
     LayoutDirective,
     LayoutGapDirective,
 } from '@ngbracket/ngx-layout/flex';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 
 @Component({
     selector: 'sp-multi-step-status-indicator',
@@ -35,7 +35,7 @@ import { MatProgressSpinner } from 
'@angular/material/progress-spinner';
         LayoutGapDirective,
         FlexDirective,
         LayoutAlignDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
     ],
 })
 export class MultiStepStatusIndicatorComponent {
diff --git 
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-any-input/static-runtime-resolvable-any-input.component.html
 
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-any-input/static-runtime-resolvable-any-input.component.html
index 1da759b0a6..a227a74559 100644
--- 
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-any-input/static-runtime-resolvable-any-input.component.html
+++ 
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-any-input/static-runtime-resolvable-any-input.component.html
@@ -48,11 +48,7 @@
             <span>{{ 'Reload' | translate }}</span>
         </button>
         @if (loading) {
-            <mat-spinner
-                color="accent"
-                [mode]="'indeterminate'"
-                [diameter]="15"
-            ></mat-spinner>
+            <sp-spinner [diameter]="15"></sp-spinner>
         }
     </div>
     @if (!staticProperty.horizontalRendering) {
diff --git 
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-any-input/static-runtime-resolvable-any-input.component.ts
 
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-any-input/static-runtime-resolvable-any-input.component.ts
index 946a244f99..1905b1ebca 100644
--- 
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-any-input/static-runtime-resolvable-any-input.component.ts
+++ 
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-any-input/static-runtime-resolvable-any-input.component.ts
@@ -30,11 +30,11 @@ import {
     LayoutGapDirective,
 } from '@ngbracket/ngx-layout/flex';
 import { MatButton } from '@angular/material/button';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatCheckbox } from '@angular/material/checkbox';
 import { FormsModule } from '@angular/forms';
 import { MatFormField } from '@angular/material/form-field';
 import { TranslatePipe } from '@ngx-translate/core';
+import { SpSpinnerComponent } from '@streampipes/shared-ui';
 
 @Component({
     selector: 'sp-app-static-runtime-resolvable-any-input',
@@ -44,7 +44,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         LayoutDirective,
         LayoutGapDirective,
         MatButton,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         MatCheckbox,
         FormsModule,
         MatFormField,
diff --git 
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-oneof-input/static-runtime-resolvable-oneof-input.component.html
 
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-oneof-input/static-runtime-resolvable-oneof-input.component.html
index 0cfcde78ec..e8d6021433 100644
--- 
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-oneof-input/static-runtime-resolvable-oneof-input.component.html
+++ 
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-oneof-input/static-runtime-resolvable-oneof-input.component.html
@@ -63,11 +63,7 @@
                 }
                 @if (loading) {
                     <div fxLayout="column">
-                        <mat-spinner
-                            color="accent"
-                            [mode]="'indeterminate'"
-                            [diameter]="20"
-                        ></mat-spinner>
+                        <sp-spinner [diameter]="20"></sp-spinner>
                     </div>
                 }
             </div>
diff --git 
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-oneof-input/static-runtime-resolvable-oneof-input.component.ts
 
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-oneof-input/static-runtime-resolvable-oneof-input.component.ts
index 203439b179..8f64958019 100644
--- 
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-oneof-input/static-runtime-resolvable-oneof-input.component.ts
+++ 
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-oneof-input/static-runtime-resolvable-oneof-input.component.ts
@@ -30,9 +30,11 @@ import {
 } from '@angular/forms';
 import { FlexDirective, LayoutDirective } from '@ngbracket/ngx-layout/flex';
 import { MatButton } from '@angular/material/button';
-import { SpExceptionMessageComponent } from '@streampipes/shared-ui';
+import {
+    SpExceptionMessageComponent,
+    SpSpinnerComponent,
+} from '@streampipes/shared-ui';
 import { MatRadioButton } from '@angular/material/radio';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { TranslatePipe } from '@ngx-translate/core';
 
 @Component({
@@ -47,7 +49,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         MatButton,
         SpExceptionMessageComponent,
         MatRadioButton,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         TranslatePipe,
     ],
 })
diff --git 
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-button-menu/static-tree-input-button-menu.component.html
 
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-button-menu/static-tree-input-button-menu.component.html
index 9da8b1c965..32e3442218 100644
--- 
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-button-menu/static-tree-input-button-menu.component.html
+++ 
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-button-menu/static-tree-input-button-menu.component.html
@@ -50,11 +50,7 @@
             fxLayoutAlign="start center"
             data-cy="reloading-nodes"
         >
-            <mat-spinner
-                color="accent"
-                [mode]="'indeterminate'"
-                [diameter]="15"
-            ></mat-spinner>
+            <sp-spinner [diameter]="15"></sp-spinner>
             <span class="reloading-nodes-label">{{
                 'Reloading nodes' | translate
             }}</span>
diff --git 
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-button-menu/static-tree-input-button-menu.component.ts
 
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-button-menu/static-tree-input-button-menu.component.ts
index 365889ea5d..f1e03402ee 100644
--- 
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-button-menu/static-tree-input-button-menu.component.ts
+++ 
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-button-menu/static-tree-input-button-menu.component.ts
@@ -24,13 +24,13 @@ import {
 } from '@ngbracket/ngx-layout/flex';
 import { MatButton, MatIconButton } from '@angular/material/button';
 import { MatIcon } from '@angular/material/icon';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import {
     MatButtonToggle,
     MatButtonToggleGroup,
 } from '@angular/material/button-toggle';
 import { MatTooltip } from '@angular/material/tooltip';
 import { TranslatePipe } from '@ngx-translate/core';
+import { SpSpinnerComponent } from '@streampipes/shared-ui';
 
 @Component({
     selector: 'sp-static-tree-input-button-menu',
@@ -43,7 +43,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         MatButton,
         MatIconButton,
         MatIcon,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         FlexDirective,
         MatButtonToggleGroup,
         MatButtonToggle,
diff --git 
a/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.html
 
b/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.html
index 0554e8ffdd..56fdceed77 100644
--- 
a/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.html
+++ 
b/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.html
@@ -103,16 +103,12 @@
             fxFlex="100"
             fxLayout="column"
             fxLayoutAlign="center center"
-            fxLayoutGap="12px"
             class="chart-selection-loading"
         >
-            <mat-progress-spinner
-                mode="indeterminate"
+            <sp-spinner
                 diameter="36"
-            ></mat-progress-spinner>
-            <span class="chart-selection-loading-text">{{
-                'Loading charts...' | translate
-            }}</span>
+                [text]="'Loading charts...' | translate"
+            ></sp-spinner>
         </div>
     } @else if (charts.length > 0 && filteredChartItems.length > 0) {
         <cdk-virtual-scroll-viewport
diff --git 
a/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.scss
 
b/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.scss
index 6af04c100e..2cc990e29c 100644
--- 
a/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.scss
+++ 
b/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.scss
@@ -98,11 +98,6 @@
     text-align: center;
 }
 
-.chart-selection-loading-text {
-    font-size: var(--font-size-sm);
-    color: var(--color-paragraph);
-}
-
 .chart-selection-empty {
     min-height: 220px;
     text-align: center;
diff --git 
a/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.ts
 
b/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.ts
index e191fb94dc..0b5ccf7f3c 100644
--- 
a/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.ts
+++ 
b/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.ts
@@ -50,7 +50,6 @@ import {
     MatSuffix,
 } from '@angular/material/form-field';
 import { MatInput } from '@angular/material/input';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatTooltip } from '@angular/material/tooltip';
 import {
     CdkFixedSizeVirtualScroll,
@@ -59,6 +58,7 @@ import {
 } from '@angular/cdk/scrolling';
 import { debounceTime, distinctUntilChanged, finalize } from 'rxjs';
 import { ChartSelectionItem } from './chart-selection.model';
+import { SpSpinnerComponent } from '@streampipes/shared-ui';
 
 @Component({
     selector: 'sp-chart-selection',
@@ -79,7 +79,7 @@ import { ChartSelectionItem } from './chart-selection.model';
         MatPrefix,
         MatSuffix,
         MatInput,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         TranslatePipe,
         MatTooltip,
         CdkVirtualScrollViewport,
diff --git 
a/ui/src/app/dashboard/dialogs/clone-dashboard/clone-dashboard-dialog.component.html
 
b/ui/src/app/dashboard/dialogs/clone-dashboard/clone-dashboard-dialog.component.html
index a752aba63c..ce0e29dac3 100644
--- 
a/ui/src/app/dashboard/dialogs/clone-dashboard/clone-dashboard-dialog.component.html
+++ 
b/ui/src/app/dashboard/dialogs/clone-dashboard/clone-dashboard-dialog.component.html
@@ -150,7 +150,7 @@
         </div>
     } @else {
         <div fxFlex="100" fxLayoutAlign="center center">
-            <mat-spinner [diameter]="20"></mat-spinner>
+            <sp-spinner [diameter]="20"></sp-spinner>
             <h5 class="mt-10">Loading</h5>
         </div>
     }
diff --git 
a/ui/src/app/dashboard/dialogs/clone-dashboard/clone-dashboard-dialog.component.ts
 
b/ui/src/app/dashboard/dialogs/clone-dashboard/clone-dashboard-dialog.component.ts
index 29ab64dc2b..3d4f63f278 100644
--- 
a/ui/src/app/dashboard/dialogs/clone-dashboard/clone-dashboard-dialog.component.ts
+++ 
b/ui/src/app/dashboard/dialogs/clone-dashboard/clone-dashboard-dialog.component.ts
@@ -25,7 +25,11 @@ import {
     DashboardService,
     DataExplorerWidgetModel,
 } from '@streampipes/platform-services';
-import { DialogRef, FormFieldComponent } from '@streampipes/shared-ui';
+import {
+    DialogRef,
+    FormFieldComponent,
+    SpSpinnerComponent,
+} from '@streampipes/shared-ui';
 import { IdGeneratorService } from 
'../../../core-services/id-generator/id-generator.service';
 import { Observable, zip } from 'rxjs';
 import { TranslatePipe, TranslateService } from '@ngx-translate/core';
@@ -47,7 +51,6 @@ import {
     LayoutGapDirective,
 } from '@ngbracket/ngx-layout/flex';
 import { MatButton } from '@angular/material/button';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 
 export interface WidgetClone {
     current: DataExplorerWidgetModel;
@@ -74,7 +77,7 @@ export interface WidgetClone {
         LayoutGapDirective,
         MatButton,
         LayoutAlignDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         TranslatePipe,
         FormFieldComponent,
     ],
diff --git 
a/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.html
 
b/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.html
index 83102bde15..482e9bf6ea 100644
--- 
a/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.html
+++ 
b/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.html
@@ -81,9 +81,10 @@
                         fxLayoutAlign="center center"
                         class="loading-state"
                     >
-                        <mat-spinner [diameter]="32" color="accent">
-                            {{ 'Loading' | translate }}
-                        </mat-spinner>
+                        <sp-spinner
+                            [diameter]="32"
+                            [text]="'Loading' | translate"
+                        ></sp-spinner>
                     </div>
                 } @else {
                     <div
diff --git 
a/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.ts
 
b/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.ts
index 561adef0f1..62c0ba7212 100644
--- 
a/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.ts
+++ 
b/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.ts
@@ -23,6 +23,7 @@ import {
     SpBasicHeaderTitleComponent,
     SpBasicNavTabsComponent,
     SpElementIdComponent,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { SpAbstractDatasetDetailsDirective } from 
'../abstract-dataset-details.directive';
 import {
@@ -33,7 +34,6 @@ import {
 } from '@ngbracket/ngx-layout/flex';
 import { MatButton, MatIconButton } from '@angular/material/button';
 import { MatIcon } from '@angular/material/icon';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatFormField, MatLabel } from '@angular/material/form-field';
 import { MatInput } from '@angular/material/input';
 import { MatTooltip } from '@angular/material/tooltip';
@@ -59,7 +59,7 @@ type PreviewRow = Record<string, unknown>;
         FlexDirective,
         MatButton,
         MatIcon,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         MatFormField,
         MatLabel,
         MatInput,
diff --git 
a/ui/src/app/dataset/components/dataset-details/dataset-details-metrics/dataset-details-metrics.component.html
 
b/ui/src/app/dataset/components/dataset-details/dataset-details-metrics/dataset-details-metrics.component.html
index d86080fef6..c153eafe57 100644
--- 
a/ui/src/app/dataset/components/dataset-details/dataset-details-metrics/dataset-details-metrics.component.html
+++ 
b/ui/src/app/dataset/components/dataset-details/dataset-details-metrics/dataset-details-metrics.component.html
@@ -51,9 +51,10 @@
                     fxLayout="row"
                     fxLayoutAlign="center center"
                 >
-                    <mat-spinner [diameter]="32" color="accent">
-                        {{ 'Loading' | translate }}
-                    </mat-spinner>
+                    <sp-spinner
+                        [diameter]="32"
+                        [text]="'Loading' | translate"
+                    ></sp-spinner>
                 </div>
             }
 
diff --git 
a/ui/src/app/dataset/components/dataset-details/dataset-details-metrics/dataset-details-metrics.component.ts
 
b/ui/src/app/dataset/components/dataset-details/dataset-details-metrics/dataset-details-metrics.component.ts
index bac1c7dc2d..d5a9e7fc9c 100644
--- 
a/ui/src/app/dataset/components/dataset-details/dataset-details-metrics/dataset-details-metrics.component.ts
+++ 
b/ui/src/app/dataset/components/dataset-details/dataset-details-metrics/dataset-details-metrics.component.ts
@@ -19,7 +19,10 @@
 import { Component, OnInit } from '@angular/core';
 import { SpAbstractDatasetDetailsDirective } from 
'../abstract-dataset-details.directive';
 import { SpQueryResult } from '@streampipes/platform-services';
-import { SpBasicNavTabsComponent } from '@streampipes/shared-ui';
+import {
+    SpBasicNavTabsComponent,
+    SpSpinnerComponent,
+} from '@streampipes/shared-ui';
 import {
     FlexDirective,
     LayoutAlignDirective,
@@ -28,7 +31,6 @@ import {
 } from '@ngbracket/ngx-layout/flex';
 import { MatIconButton } from '@angular/material/button';
 import { MatTooltip } from '@angular/material/tooltip';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { TranslatePipe } from '@ngx-translate/core';
 import { SpSimpleMetricsComponent } from 
'../../../../core-ui/monitoring/simple-metrics/simple-metrics.component';
 import { SpConfigurationRoutes } from 
'../../../../configuration/configuration.breadcrumb';
@@ -55,7 +57,7 @@ interface DayBucket extends DailyEventCount {
         FlexDirective,
         MatIconButton,
         MatTooltip,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         TranslatePipe,
         SpSimpleMetricsComponent,
         DailyEventCountsChartComponent,
diff --git 
a/ui/src/app/dataset/components/dataset-overview/dataset-overview.component.html
 
b/ui/src/app/dataset/components/dataset-overview/dataset-overview.component.html
index 90015afce3..c4d9f46038 100644
--- 
a/ui/src/app/dataset/components/dataset-overview/dataset-overview.component.html
+++ 
b/ui/src/app/dataset/components/dataset-overview/dataset-overview.component.html
@@ -92,12 +92,10 @@
                         *matCellDef="let configurationEntry"
                     >
                         @if (configurationEntry.lastEventLoading) {
-                            <mat-spinner
+                            <sp-spinner
                                 [diameter]="20"
-                                fxLayoutAlign="center"
-                                color="accent"
-                                >{{ 'Loading' | translate }}
-                            </mat-spinner>
+                                [text]="'Loading' | translate"
+                            ></sp-spinner>
                         } @else {
                             <sp-dataset-last-event-label
                                 [lastEvent]="configurationEntry.lastEvent"
diff --git 
a/ui/src/app/dataset/components/dataset-overview/dataset-overview.component.ts 
b/ui/src/app/dataset/components/dataset-overview/dataset-overview.component.ts
index ede12bdada..5bcd213e70 100644
--- 
a/ui/src/app/dataset/components/dataset-overview/dataset-overview.component.ts
+++ 
b/ui/src/app/dataset/components/dataset-overview/dataset-overview.component.ts
@@ -63,6 +63,7 @@ import {
     SpTableAssetContextConfig,
     SpTableActionsDirective,
     SpTableComponent,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { DeleteDatasetDialogComponent } from 
'../../dialog/delete-dataset/delete-dataset-dialog.component';
 import { SpConfigurationRoutes } from 
'../../../configuration/configuration.breadcrumb';
@@ -85,7 +86,6 @@ import {
 import { MatButton, MatIconButton } from '@angular/material/button';
 import { MatTooltip } from '@angular/material/tooltip';
 import { MatIcon } from '@angular/material/icon';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { NgStyle } from '@angular/common';
 import { StyleDirective } from '@ngbracket/ngx-layout/extended';
 import { MatMenuItem } from '@angular/material/menu';
@@ -111,7 +111,7 @@ import { DatasetLastEventLabelComponent } from 
'./dataset-last-event-label/datas
         MatSortHeader,
         MatCellDef,
         MatCell,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         FlexOrderDirective,
         NgStyle,
         StyleDirective,
diff --git 
a/ui/src/app/dataset/dialog/csv-import-dialog/csv-import-dialog.component.html 
b/ui/src/app/dataset/dialog/csv-import-dialog/csv-import-dialog.component.html
index 232c1c0637..9c5d794892 100644
--- 
a/ui/src/app/dataset/dialog/csv-import-dialog/csv-import-dialog.component.html
+++ 
b/ui/src/app/dataset/dialog/csv-import-dialog/csv-import-dialog.component.html
@@ -151,7 +151,7 @@
                 >
                     @if (previewLoading()) {
                         <div section-actions>
-                            <mat-spinner [diameter]="24"></mat-spinner>
+                            <sp-spinner [diameter]="24"></sp-spinner>
                         </div>
                     }
 
diff --git 
a/ui/src/app/dataset/dialog/csv-import-dialog/csv-import-dialog.component.ts 
b/ui/src/app/dataset/dialog/csv-import-dialog/csv-import-dialog.component.ts
index 02644f9ee8..16593e169e 100644
--- a/ui/src/app/dataset/dialog/csv-import-dialog/csv-import-dialog.component.ts
+++ b/ui/src/app/dataset/dialog/csv-import-dialog/csv-import-dialog.component.ts
@@ -38,7 +38,6 @@ import { MatDivider } from '@angular/material/divider';
 import { MatFormField } from '@angular/material/form-field';
 import { MatInput } from '@angular/material/input';
 import { MatOption, MatSelect } from '@angular/material/select';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatStep, MatStepLabel, MatStepper } from '@angular/material/stepper';
 import { TranslatePipe, TranslateService } from '@ngx-translate/core';
 import {
@@ -64,6 +63,7 @@ import {
     DialogRef,
     FormFieldComponent,
     SplitSectionComponent,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { startWith, Subscription, switchMap, timer } from 'rxjs';
 import { CsvImportColumnModel, CsvImportColumnRole } from './csv-import.model';
@@ -86,7 +86,7 @@ import { CsvImportUploadStateComponent } from 
'./csv-import-upload-state/csv-imp
         MatSelect,
         MatOption,
         MatDivider,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         MatStepper,
         MatStep,
         MatStepLabel,
diff --git 
a/ui/src/app/dataset/dialog/data-retention-now-dialog/data-retention-now-dialog.component.html
 
b/ui/src/app/dataset/dialog/data-retention-now-dialog/data-retention-now-dialog.component.html
index ae5ef9da4f..7d7df03612 100644
--- 
a/ui/src/app/dataset/dialog/data-retention-now-dialog/data-retention-now-dialog.component.html
+++ 
b/ui/src/app/dataset/dialog/data-retention-now-dialog/data-retention-now-dialog.component.html
@@ -56,11 +56,7 @@
                 data-cy="connection-testing-in-progress"
             >
                 <div fxLayout="row" fxLayoutAlign="space-around">
-                    <mat-spinner
-                        [mode]="'indeterminate'"
-                        color="accent"
-                        diameter="25"
-                    ></mat-spinner>
+                    <sp-spinner diameter="25"></sp-spinner>
                 </div>
             </div>
         }
diff --git 
a/ui/src/app/dataset/dialog/data-retention-now-dialog/data-retention-now-dialog.component.ts
 
b/ui/src/app/dataset/dialog/data-retention-now-dialog/data-retention-now-dialog.component.ts
index 1366d0dac5..20b1500e0e 100644
--- 
a/ui/src/app/dataset/dialog/data-retention-now-dialog/data-retention-now-dialog.component.ts
+++ 
b/ui/src/app/dataset/dialog/data-retention-now-dialog/data-retention-now-dialog.component.ts
@@ -17,7 +17,11 @@
  */
 
 import { Component, inject, Input, OnInit } from '@angular/core';
-import { DialogRef, SpExceptionDetailsComponent } from 
'@streampipes/shared-ui';
+import {
+    DialogRef,
+    SpExceptionDetailsComponent,
+    SpSpinnerComponent,
+} from '@streampipes/shared-ui';
 import { DatalakeRestService } from '@streampipes/platform-services';
 import { TranslatePipe, TranslateService } from '@ngx-translate/core';
 import { finalize } from 'rxjs';
@@ -25,7 +29,6 @@ import {
     LayoutAlignDirective,
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatDivider } from '@angular/material/divider';
 import { MatButton } from '@angular/material/button';
 
@@ -35,7 +38,7 @@ import { MatButton } from '@angular/material/button';
     imports: [
         LayoutAlignDirective,
         LayoutDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         MatDivider,
         MatButton,
         TranslatePipe,
diff --git 
a/ui/src/app/dataset/dialog/delete-dataset/delete-dataset-dialog.component.html 
b/ui/src/app/dataset/dialog/delete-dataset/delete-dataset-dialog.component.html
index 0e8c1a726d..11bc2266a6 100644
--- 
a/ui/src/app/dataset/dialog/delete-dataset/delete-dataset-dialog.component.html
+++ 
b/ui/src/app/dataset/dialog/delete-dataset/delete-dataset-dialog.component.html
@@ -83,10 +83,7 @@
                 data-cy="adapter-deletion-in-progress"
             >
                 <div fxLayout="row" fxLayoutAlign="space-around">
-                    <mat-spinner
-                        [mode]="'indeterminate'"
-                        color="accent"
-                    ></mat-spinner>
+                    <sp-spinner></sp-spinner>
                 </div>
                 <b
                     ><h4>{{ currentStatus }}</h4></b
diff --git 
a/ui/src/app/dataset/dialog/delete-dataset/delete-dataset-dialog.component.ts 
b/ui/src/app/dataset/dialog/delete-dataset/delete-dataset-dialog.component.ts
index 847c1942f3..afd60219ee 100644
--- 
a/ui/src/app/dataset/dialog/delete-dataset/delete-dataset-dialog.component.ts
+++ 
b/ui/src/app/dataset/dialog/delete-dataset/delete-dataset-dialog.component.ts
@@ -17,7 +17,7 @@
  */
 
 import { Component, inject, Input, OnInit } from '@angular/core';
-import { DialogRef } from '@streampipes/shared-ui';
+import { DialogRef, SpSpinnerComponent } from '@streampipes/shared-ui';
 import { DatalakeRestService } from '@streampipes/platform-services';
 import { TranslatePipe, TranslateService } from '@ngx-translate/core';
 import {
@@ -26,7 +26,6 @@ import {
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
 import { MatButton } from '@angular/material/button';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatDivider } from '@angular/material/divider';
 
 @Component({
@@ -37,7 +36,7 @@ import { MatDivider } from '@angular/material/divider';
         FlexDirective,
         LayoutAlignDirective,
         MatButton,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         MatDivider,
         TranslatePipe,
     ],
diff --git 
a/ui/src/app/dataset/dialog/delete-export-provider/delete-export-provider-dialog.component.html
 
b/ui/src/app/dataset/dialog/delete-export-provider/delete-export-provider-dialog.component.html
index 862cd82019..0e2d4261e7 100644
--- 
a/ui/src/app/dataset/dialog/delete-export-provider/delete-export-provider-dialog.component.html
+++ 
b/ui/src/app/dataset/dialog/delete-export-provider/delete-export-provider-dialog.component.html
@@ -67,10 +67,7 @@
                 data-cy="adapter-deletion-in-progress"
             >
                 <div fxLayout="row" fxLayoutAlign="space-around">
-                    <mat-spinner
-                        [mode]="'indeterminate'"
-                        color="accent"
-                    ></mat-spinner>
+                    <sp-spinner></sp-spinner>
                 </div>
                 <b
                     ><h4>{{ currentStatus }}</h4></b
diff --git 
a/ui/src/app/dataset/dialog/delete-export-provider/delete-export-provider-dialog.component.ts
 
b/ui/src/app/dataset/dialog/delete-export-provider/delete-export-provider-dialog.component.ts
index ee27fbcc4b..597fb4b8c7 100644
--- 
a/ui/src/app/dataset/dialog/delete-export-provider/delete-export-provider-dialog.component.ts
+++ 
b/ui/src/app/dataset/dialog/delete-export-provider/delete-export-provider-dialog.component.ts
@@ -17,7 +17,7 @@
  */
 
 import { Component, inject, Input } from '@angular/core';
-import { DialogRef } from '@streampipes/shared-ui';
+import { DialogRef, SpSpinnerComponent } from '@streampipes/shared-ui';
 import { ExportProviderService } from '@streampipes/platform-services';
 import {
     FlexDirective,
@@ -25,7 +25,6 @@ import {
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
 import { MatButton } from '@angular/material/button';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatDivider } from '@angular/material/divider';
 import { TranslatePipe } from '@ngx-translate/core';
 
@@ -37,7 +36,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         FlexDirective,
         LayoutAlignDirective,
         MatButton,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         MatDivider,
         TranslatePipe,
     ],
diff --git 
a/ui/src/app/dataset/dialog/export-provider-connection-test/export-provider-connection-test.component.html
 
b/ui/src/app/dataset/dialog/export-provider-connection-test/export-provider-connection-test.component.html
index a753e674c9..0695b95307 100644
--- 
a/ui/src/app/dataset/dialog/export-provider-connection-test/export-provider-connection-test.component.html
+++ 
b/ui/src/app/dataset/dialog/export-provider-connection-test/export-provider-connection-test.component.html
@@ -54,11 +54,7 @@
                 data-cy="connection-testing-in-progress"
             >
                 <div fxLayout="row" fxLayoutAlign="space-around">
-                    <mat-spinner
-                        [mode]="'indeterminate'"
-                        color="accent"
-                        diameter="25"
-                    ></mat-spinner>
+                    <sp-spinner diameter="25"></sp-spinner>
                 </div>
             </div>
         }
diff --git 
a/ui/src/app/dataset/dialog/export-provider-connection-test/export-provider-connection-test.component.ts
 
b/ui/src/app/dataset/dialog/export-provider-connection-test/export-provider-connection-test.component.ts
index 8ed2242a8e..4ff058a228 100644
--- 
a/ui/src/app/dataset/dialog/export-provider-connection-test/export-provider-connection-test.component.ts
+++ 
b/ui/src/app/dataset/dialog/export-provider-connection-test/export-provider-connection-test.component.ts
@@ -17,14 +17,17 @@
  */
 
 import { Component, inject, Input, OnInit } from '@angular/core';
-import { DialogRef, SpExceptionDetailsComponent } from 
'@streampipes/shared-ui';
+import {
+    DialogRef,
+    SpExceptionDetailsComponent,
+    SpSpinnerComponent,
+} from '@streampipes/shared-ui';
 import { ExportProviderService } from '@streampipes/platform-services';
 import { TranslatePipe, TranslateService } from '@ngx-translate/core';
 import {
     LayoutAlignDirective,
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatDivider } from '@angular/material/divider';
 import { MatButton } from '@angular/material/button';
 
@@ -34,7 +37,7 @@ import { MatButton } from '@angular/material/button';
     imports: [
         LayoutAlignDirective,
         LayoutDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         MatDivider,
         MatButton,
         TranslatePipe,
diff --git 
a/ui/src/app/editor/components/pipeline-assembly/pipeline-assembly-options/pipeline-assembly-options-pipeline-cache/pipeline-assembly-options-pipeline-cache.component.html
 
b/ui/src/app/editor/components/pipeline-assembly/pipeline-assembly-options/pipeline-assembly-options-pipeline-cache/pipeline-assembly-options-pipeline-cache.component.html
index 380c1af063..b7410ea53d 100644
--- 
a/ui/src/app/editor/components/pipeline-assembly/pipeline-assembly-options/pipeline-assembly-options-pipeline-cache/pipeline-assembly-options-pipeline-cache.component.html
+++ 
b/ui/src/app/editor/components/pipeline-assembly/pipeline-assembly-options/pipeline-assembly-options-pipeline-cache/pipeline-assembly-options-pipeline-cache.component.html
@@ -25,12 +25,10 @@
         <div fxFlex="100" fxLayoutAlign="start center" fxLayout="row">
             <div fxLayout="row" fxLayoutAlign="start center">
                 @if (pipelineCacheRunning) {
-                    <mat-spinner
+                    <sp-spinner
                         data-cy="saving-pipeline-modification"
-                        [mode]="'indeterminate'"
-                        color="accent"
                         [diameter]="15"
-                    ></mat-spinner>
+                    ></sp-spinner>
                 }
                 @if (pipelineCacheRunning) {
                     <span class="modification-status"
diff --git 
a/ui/src/app/editor/components/pipeline-assembly/pipeline-assembly-options/pipeline-assembly-options-pipeline-cache/pipeline-assembly-options-pipeline-cache.component.ts
 
b/ui/src/app/editor/components/pipeline-assembly/pipeline-assembly-options/pipeline-assembly-options-pipeline-cache/pipeline-assembly-options-pipeline-cache.component.ts
index b1de6030d6..cca1d0dcfe 100644
--- 
a/ui/src/app/editor/components/pipeline-assembly/pipeline-assembly-options/pipeline-assembly-options-pipeline-cache/pipeline-assembly-options-pipeline-cache.component.ts
+++ 
b/ui/src/app/editor/components/pipeline-assembly/pipeline-assembly-options/pipeline-assembly-options-pipeline-cache/pipeline-assembly-options-pipeline-cache.component.ts
@@ -27,8 +27,8 @@ import {
     LayoutAlignDirective,
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { TranslatePipe } from '@ngx-translate/core';
+import { SpSpinnerComponent } from '@streampipes/shared-ui';
 
 @Component({
     selector: 'sp-pipeline-assembly-options-pipeline-cache',
@@ -38,7 +38,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         LayoutDirective,
         LayoutAlignDirective,
         FlexDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         TranslatePipe,
     ],
 })
diff --git 
a/ui/src/app/editor/components/pipeline-element-preview/pipeline-element-preview.component.html
 
b/ui/src/app/editor/components/pipeline-element-preview/pipeline-element-preview.component.html
index b678246f97..e72c8ba276 100644
--- 
a/ui/src/app/editor/components/pipeline-element-preview/pipeline-element-preview.component.html
+++ 
b/ui/src/app/editor/components/pipeline-element-preview/pipeline-element-preview.component.html
@@ -19,10 +19,10 @@
 <div class="data-preview">
     @if (!runtimeData) {
         <div fxFlex="100" fxLayout="column" fxLayoutAlign="center center">
-            <mat-spinner [diameter]="20" color="accent"></mat-spinner>
-            <span class="preview-table text-sm mt-10"
-                >{{ 'Waiting for live data' | translate }}...</span
-            >
+            <sp-spinner
+                [diameter]="20"
+                [text]="('Waiting for live data' | translate) + '...'"
+            ></sp-spinner>
         </div>
     }
     @if (runtimeData) {
diff --git 
a/ui/src/app/editor/components/pipeline-element-preview/pipeline-element-preview.component.ts
 
b/ui/src/app/editor/components/pipeline-element-preview/pipeline-element-preview.component.ts
index 6dc4d14dbf..60a3765ae0 100644
--- 
a/ui/src/app/editor/components/pipeline-element-preview/pipeline-element-preview.component.ts
+++ 
b/ui/src/app/editor/components/pipeline-element-preview/pipeline-element-preview.component.ts
@@ -28,8 +28,8 @@ import {
     LayoutAlignDirective,
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { TranslatePipe } from '@ngx-translate/core';
+import { SpSpinnerComponent } from '@streampipes/shared-ui';
 
 @Component({
     selector: 'sp-pipeline-element-preview',
@@ -39,7 +39,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         FlexDirective,
         LayoutDirective,
         LayoutAlignDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         KeyValuePipe,
         TranslatePipe,
     ],
diff --git 
a/ui/src/app/editor/components/pipeline/dropped-pipeline-element/dropped-pipeline-element.component.html
 
b/ui/src/app/editor/components/pipeline/dropped-pipeline-element/dropped-pipeline-element.component.html
index 043962a55a..614e932fb4 100644
--- 
a/ui/src/app/editor/components/pipeline/dropped-pipeline-element/dropped-pipeline-element.component.html
+++ 
b/ui/src/app/editor/components/pipeline/dropped-pipeline-element/dropped-pipeline-element.component.html
@@ -18,12 +18,10 @@
 <div style="z-index: 5" [ngClass]="elementCssClasses">
     @if (pipelineElementConfig.settings.loadingStatus) {
         <div class="pipeline-element-progress-container sp-fade">
-            <mat-spinner
-                [mode]="'indeterminate'"
+            <sp-spinner
                 class="pipeline-element-progress"
                 [diameter]="40"
-                color="accent"
-            ></mat-spinner>
+            ></sp-spinner>
         </div>
     }
     @if (pipelineElementConfig.settings.loadingStatus) {
diff --git 
a/ui/src/app/editor/components/pipeline/dropped-pipeline-element/dropped-pipeline-element.component.ts
 
b/ui/src/app/editor/components/pipeline/dropped-pipeline-element/dropped-pipeline-element.component.ts
index 5e5bb3fc1d..5add60add7 100644
--- 
a/ui/src/app/editor/components/pipeline/dropped-pipeline-element/dropped-pipeline-element.component.ts
+++ 
b/ui/src/app/editor/components/pipeline/dropped-pipeline-element/dropped-pipeline-element.component.ts
@@ -27,8 +27,10 @@ import {
 } from '@streampipes/platform-services';
 import { NgClass } from '@angular/common';
 import { ClassDirective } from '@ngbracket/ngx-layout/extended';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
-import { PipelineElementComponent } from '@streampipes/shared-ui';
+import {
+    PipelineElementComponent,
+    SpSpinnerComponent,
+} from '@streampipes/shared-ui';
 import { MatTooltip } from '@angular/material/tooltip';
 import { PipelineElementStatisticsComponent } from 
'../../pipeline-element-statistics/pipeline-element-statistics.component';
 import { PipelineElementOptionsComponent } from 
'../../pipeline-element-options/pipeline-element-options.component';
@@ -40,7 +42,7 @@ import { PipelineElementPreviewComponent } from 
'../../pipeline-element-preview/
     imports: [
         NgClass,
         ClassDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         PipelineElementComponent,
         MatTooltip,
         PipelineElementStatisticsComponent,
diff --git a/ui/src/app/editor/editor.component.html 
b/ui/src/app/editor/editor.component.html
index 69f45223c6..7f9d539f5e 100644
--- a/ui/src/app/editor/editor.component.html
+++ b/ui/src/app/editor/editor.component.html
@@ -19,12 +19,10 @@
 <div fxLayout="column" fxFlex="100" class="pipeline-editor-outer">
     @if (!allElementsLoaded) {
         <div fxFlex="100" fxLayout="column" fxLayoutAlign="center center">
-            <mat-spinner
+            <sp-spinner
                 [diameter]="30"
-                color="accent"
-                mode="indeterminate"
-            ></mat-spinner>
-            <p>{{ 'Preparing pipeline editor...' | translate }}</p>
+                [text]="'Preparing pipeline editor...' | translate"
+            ></sp-spinner>
         </div>
     } @else {
         <div fxLayout="row" fxFlex="100">
diff --git a/ui/src/app/editor/editor.component.ts 
b/ui/src/app/editor/editor.component.ts
index b831c54554..c6a002e451 100644
--- a/ui/src/app/editor/editor.component.ts
+++ b/ui/src/app/editor/editor.component.ts
@@ -31,6 +31,7 @@ import {
 import {
     SpBasicViewComponent,
     SpBreadcrumbService,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { ActivatedRoute } from '@angular/router';
 import { forkJoin, of, zip } from 'rxjs';
@@ -43,7 +44,6 @@ import {
     LayoutAlignDirective,
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { PipelineElementIconStandComponent } from 
'./components/pipeline-element-icon-stand/pipeline-element-icon-stand.component';
 import { PipelineAssemblyComponent } from 
'./components/pipeline-assembly/pipeline-assembly.component';
 import { TranslatePipe } from '@ngx-translate/core';
@@ -56,7 +56,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         LayoutDirective,
         FlexDirective,
         LayoutAlignDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         SpBasicViewComponent,
         PipelineElementIconStandComponent,
         PipelineAssemblyComponent,
diff --git a/ui/src/app/home/dialog/welcome-tour/welcome-tour.component.html 
b/ui/src/app/home/dialog/welcome-tour/welcome-tour.component.html
index 90c028bd2c..ee30228481 100644
--- a/ui/src/app/home/dialog/welcome-tour/welcome-tour.component.html
+++ b/ui/src/app/home/dialog/welcome-tour/welcome-tour.component.html
@@ -41,8 +41,12 @@
                         fxLayoutAlign="center center"
                         fxLayoutGap="10px"
                     >
-                        <mat-spinner [diameter]="20"></mat-spinner>
-                        <span>Checking tutorial pipeline elements...</span>
+                        <sp-spinner
+                            [diameter]="20"
+                            layout="row"
+                            gap="10px"
+                            text="Checking tutorial pipeline elements..."
+                        ></sp-spinner>
                     </div>
                 }
                 @if (showMissingElementsHint) {
diff --git a/ui/src/app/home/dialog/welcome-tour/welcome-tour.component.ts 
b/ui/src/app/home/dialog/welcome-tour/welcome-tour.component.ts
index 8e57d2e7f4..f973087899 100644
--- a/ui/src/app/home/dialog/welcome-tour/welcome-tour.component.ts
+++ b/ui/src/app/home/dialog/welcome-tour/welcome-tour.component.ts
@@ -21,6 +21,7 @@ import {
     DialogService,
     PanelType,
     SpAlertBannerComponent,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { Component, Input, OnInit, inject } from '@angular/core';
 import { AppConstants } from '../../../services/app.constants';
@@ -41,7 +42,6 @@ import {
 } from '@ngbracket/ngx-layout/flex';
 import { MatButton } from '@angular/material/button';
 import { MatDivider } from '@angular/material/divider';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MissingElementsForTutorialComponent } from 
'../../../editor/dialog/missing-elements-for-tutorial/missing-elements-for-tutorial.component';
 import { forkJoin } from 'rxjs';
 import { LayoutGapDirective } from '@ngbracket/ngx-layout';
@@ -56,7 +56,7 @@ import { LayoutGapDirective } from '@ngbracket/ngx-layout';
         LayoutAlignDirective,
         MatButton,
         MatDivider,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         LayoutGapDirective,
         SpAlertBannerComponent,
     ],
diff --git a/ui/src/app/login/components/login/login.component.html 
b/ui/src/app/login/components/login/login.component.html
index eb1c81c70c..8af90af921 100644
--- a/ui/src/app/login/components/login/login.component.html
+++ b/ui/src/app/login/components/login/login.component.html
@@ -66,11 +66,10 @@
                         }
                     </button>
                     @if (loading) {
-                        <mat-spinner
-                            [mode]="'indeterminate'"
+                        <sp-spinner
                             [diameter]="20"
                             style="margin-top: 10px"
-                        ></mat-spinner>
+                        ></sp-spinner>
                     }
                     @if (authenticationFailed) {
                         <sp-alert-banner
diff --git a/ui/src/app/login/components/login/login.component.ts 
b/ui/src/app/login/components/login/login.component.ts
index 5f78b3cbff..2734737997 100644
--- a/ui/src/app/login/components/login/login.component.ts
+++ b/ui/src/app/login/components/login/login.component.ts
@@ -37,12 +37,12 @@ import {
 import {
     FormFieldComponent,
     SpAlertBannerComponent,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { MatFormField } from '@angular/material/form-field';
 import { MatInput } from '@angular/material/input';
 import { MatButton } from '@angular/material/button';
 import { MatCheckbox } from '@angular/material/checkbox';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { TranslatePipe } from '@ngx-translate/core';
 
 @Component({
@@ -61,7 +61,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         MatInput,
         MatButton,
         MatCheckbox,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         SpAlertBannerComponent,
         RouterLink,
         TranslatePipe,
diff --git a/ui/src/app/login/components/register/register.component.html 
b/ui/src/app/login/components/register/register.component.html
index 3d596b3d87..59a7585359 100644
--- a/ui/src/app/login/components/register/register.component.html
+++ b/ui/src/app/login/components/register/register.component.html
@@ -77,12 +77,10 @@
                         </button>
                     }
                     @if (registrationInProcess) {
-                        <mat-spinner
-                            [mode]="'indeterminate'"
-                            color="accent"
+                        <sp-spinner
                             [diameter]="20"
                             style="margin-top: 10px"
-                        ></mat-spinner>
+                        ></sp-spinner>
                     }
                     @if (registrationError) {
                         <sp-alert-banner
diff --git a/ui/src/app/login/components/register/register.component.ts 
b/ui/src/app/login/components/register/register.component.ts
index 8d7f4b45ad..b9a0004511 100644
--- a/ui/src/app/login/components/register/register.component.ts
+++ b/ui/src/app/login/components/register/register.component.ts
@@ -37,11 +37,11 @@ import {
 import {
     FormFieldComponent,
     SpAlertBannerComponent,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { MatError, MatFormField } from '@angular/material/form-field';
 import { MatInput } from '@angular/material/input';
 import { MatButton } from '@angular/material/button';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { RouterLink } from '@angular/router';
 import { TranslatePipe } from '@ngx-translate/core';
 
@@ -61,7 +61,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         MatInput,
         MatError,
         MatButton,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         SpAlertBannerComponent,
         RouterLink,
         TranslatePipe,
diff --git 
a/ui/src/app/login/components/set-new-password/set-new-password.component.html 
b/ui/src/app/login/components/set-new-password/set-new-password.component.html
index 8c50d48fe2..28bd4a32ac 100644
--- 
a/ui/src/app/login/components/set-new-password/set-new-password.component.html
+++ 
b/ui/src/app/login/components/set-new-password/set-new-password.component.html
@@ -61,12 +61,10 @@
                         </button>
                     }
                     @if (resetInProgress) {
-                        <mat-spinner
-                            [mode]="'indeterminate'"
-                            color="accent"
+                        <sp-spinner
                             [diameter]="20"
                             style="margin-top: 10px"
-                        ></mat-spinner>
+                        ></sp-spinner>
                     }
                     @if (resetPerformed && !resetSuccess) {
                         <sp-alert-banner
diff --git 
a/ui/src/app/login/components/set-new-password/set-new-password.component.ts 
b/ui/src/app/login/components/set-new-password/set-new-password.component.ts
index ae43729b7f..f8489371de 100644
--- a/ui/src/app/login/components/set-new-password/set-new-password.component.ts
+++ b/ui/src/app/login/components/set-new-password/set-new-password.component.ts
@@ -39,11 +39,11 @@ import {
 import {
     FormFieldComponent,
     SpAlertBannerComponent,
+    SpSpinnerComponent,
 } from '@streampipes/shared-ui';
 import { MatFormField } from '@angular/material/form-field';
 import { MatInput } from '@angular/material/input';
 import { MatButton } from '@angular/material/button';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { TranslatePipe } from '@ngx-translate/core';
 
 @Component({
@@ -61,7 +61,7 @@ import { TranslatePipe } from '@ngx-translate/core';
         MatFormField,
         MatInput,
         MatButton,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         SpAlertBannerComponent,
         RouterLink,
         TranslatePipe,
diff --git a/ui/src/app/login/components/setup/setup.component.html 
b/ui/src/app/login/components/setup/setup.component.html
index 34f5dd47f1..048451fe07 100644
--- a/ui/src/app/login/components/setup/setup.component.html
+++ b/ui/src/app/login/components/setup/setup.component.html
@@ -124,12 +124,11 @@
                                     </div>
                                     <div fxFlex="20" style="width: 50%">
                                         @if (loading) {
-                                            <mat-spinner
+                                            <sp-spinner
                                                 class="md-accent"
-                                                [mode]="'indeterminate'"
                                                 [diameter]="20"
                                                 style="margin-top: 10px"
-                                            ></mat-spinner>
+                                            ></sp-spinner>
                                         }
                                     </div>
                                 </div>
diff --git a/ui/src/app/login/components/setup/setup.component.ts 
b/ui/src/app/login/components/setup/setup.component.ts
index 195cdcb8db..2bafe88bb2 100644
--- a/ui/src/app/login/components/setup/setup.component.ts
+++ b/ui/src/app/login/components/setup/setup.component.ts
@@ -31,9 +31,9 @@ import { MatFormField, MatLabel } from 
'@angular/material/form-field';
 import { MatInput } from '@angular/material/input';
 import { MatCheckbox } from '@angular/material/checkbox';
 import { MatIcon } from '@angular/material/icon';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatDivider } from '@angular/material/divider';
 import { MatButton } from '@angular/material/button';
+import { SpSpinnerComponent } from '@streampipes/shared-ui';
 
 @Component({
     selector: 'sp-setup',
@@ -49,7 +49,7 @@ import { MatButton } from '@angular/material/button';
         MatInput,
         MatCheckbox,
         MatIcon,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         MatDivider,
         MatButton,
     ],
diff --git 
a/ui/src/app/pipelines/dialog/delete-pipeline/delete-pipeline-dialog.component.html
 
b/ui/src/app/pipelines/dialog/delete-pipeline/delete-pipeline-dialog.component.html
index 476d67b0cf..757da8ac03 100644
--- 
a/ui/src/app/pipelines/dialog/delete-pipeline/delete-pipeline-dialog.component.html
+++ 
b/ui/src/app/pipelines/dialog/delete-pipeline/delete-pipeline-dialog.component.html
@@ -82,11 +82,7 @@
         @if (isInProgress) {
             <div fxFlex="100" fxLayoutAlign="center center" fxLayout="column">
                 <div fxLayout="row" fxLayoutAlign="space-around">
-                    <mat-spinner
-                        [diameter]="50"
-                        [mode]="'indeterminate'"
-                        color="accent"
-                    ></mat-spinner>
+                    <sp-spinner [diameter]="50"></sp-spinner>
                 </div>
                 <b
                     ><h4>{{ currentStatus }}</h4></b
diff --git 
a/ui/src/app/pipelines/dialog/delete-pipeline/delete-pipeline-dialog.component.ts
 
b/ui/src/app/pipelines/dialog/delete-pipeline/delete-pipeline-dialog.component.ts
index b9745659a6..8d1287dd80 100644
--- 
a/ui/src/app/pipelines/dialog/delete-pipeline/delete-pipeline-dialog.component.ts
+++ 
b/ui/src/app/pipelines/dialog/delete-pipeline/delete-pipeline-dialog.component.ts
@@ -18,7 +18,7 @@
 
 import { Component, inject, Input } from '@angular/core';
 import { PipelineService } from '@streampipes/platform-services';
-import { DialogRef } from '@streampipes/shared-ui';
+import { DialogRef, SpSpinnerComponent } from '@streampipes/shared-ui';
 import { TranslatePipe, TranslateService } from '@ngx-translate/core';
 import {
     FlexDirective,
@@ -26,7 +26,6 @@ import {
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
 import { MatButton } from '@angular/material/button';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatDivider } from '@angular/material/divider';
 
 @Component({
@@ -37,7 +36,7 @@ import { MatDivider } from '@angular/material/divider';
         FlexDirective,
         LayoutAlignDirective,
         MatButton,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         MatDivider,
         TranslatePipe,
     ],
diff --git 
a/ui/src/app/pipelines/dialog/pipeline-notifications/pipeline-notifications.component.html
 
b/ui/src/app/pipelines/dialog/pipeline-notifications/pipeline-notifications.component.html
index ed50403646..3f14113558 100644
--- 
a/ui/src/app/pipelines/dialog/pipeline-notifications/pipeline-notifications.component.html
+++ 
b/ui/src/app/pipelines/dialog/pipeline-notifications/pipeline-notifications.component.html
@@ -38,7 +38,7 @@
             </div>
         } @else {
             <div fxFlex="100" fxLayout="column" fxLayoutAlign="start center">
-                <mat-spinner [diameter]="20"></mat-spinner>
+                <sp-spinner [diameter]="20"></sp-spinner>
             </div>
         }
     </div>
diff --git 
a/ui/src/app/pipelines/dialog/pipeline-notifications/pipeline-notifications.component.ts
 
b/ui/src/app/pipelines/dialog/pipeline-notifications/pipeline-notifications.component.ts
index e0f3f41932..d13b09b64a 100644
--- 
a/ui/src/app/pipelines/dialog/pipeline-notifications/pipeline-notifications.component.ts
+++ 
b/ui/src/app/pipelines/dialog/pipeline-notifications/pipeline-notifications.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { DialogRef } from '@streampipes/shared-ui';
+import { DialogRef, SpSpinnerComponent } from '@streampipes/shared-ui';
 import {
     Pipeline,
     PipelineService,
@@ -27,7 +27,6 @@ import { FlexDirective, LayoutDirective } from 
'@ngbracket/ngx-layout/flex';
 import { MatDivider } from '@angular/material/divider';
 import { MatButton } from '@angular/material/button';
 import { TranslatePipe } from '@ngx-translate/core';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { LayoutAlignDirective } from '@ngbracket/ngx-layout';
 
 @Component({
@@ -40,7 +39,7 @@ import { LayoutAlignDirective } from '@ngbracket/ngx-layout';
         MatDivider,
         MatButton,
         TranslatePipe,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         LayoutAlignDirective,
     ],
 })
diff --git 
a/ui/src/app/pipelines/dialog/pipeline-status/pipeline-status-dialog.component.html
 
b/ui/src/app/pipelines/dialog/pipeline-status/pipeline-status-dialog.component.html
index cd69fe8960..7a43aacf1f 100644
--- 
a/ui/src/app/pipelines/dialog/pipeline-status/pipeline-status-dialog.component.html
+++ 
b/ui/src/app/pipelines/dialog/pipeline-status/pipeline-status-dialog.component.html
@@ -30,18 +30,15 @@
                     fxLayout="column"
                 >
                     <div fxFlex="100" fxLayoutAlign="center center">
-                        <mat-spinner
-                            color="accent"
+                        <sp-spinner
                             [diameter]="30"
-                            fxLayoutAlign="center"
                             style="margin: 10px 0 5px 0"
-                        >
-                            @if (action === 0) {
-                                {{ 'Starting' | translate }}
-                            } @else {
-                                {{ 'Stopping' | translate }}
-                            }
-                        </mat-spinner>
+                            [text]="
+                                action === 0
+                                    ? ('Starting' | translate)
+                                    : ('Stopping' | translate)
+                            "
+                        ></sp-spinner>
                     </div>
                     <div
                         fxFlex="100"
diff --git 
a/ui/src/app/pipelines/dialog/pipeline-status/pipeline-status-dialog.component.ts
 
b/ui/src/app/pipelines/dialog/pipeline-status/pipeline-status-dialog.component.ts
index d99b87d832..42a87f3d42 100644
--- 
a/ui/src/app/pipelines/dialog/pipeline-status/pipeline-status-dialog.component.ts
+++ 
b/ui/src/app/pipelines/dialog/pipeline-status/pipeline-status-dialog.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { DialogRef } from '@streampipes/shared-ui';
+import { DialogRef, SpSpinnerComponent } from '@streampipes/shared-ui';
 import {
     PipelineOperationStatus,
     PipelineService,
@@ -29,7 +29,6 @@ import {
     LayoutAlignDirective,
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
-import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatIcon } from '@angular/material/icon';
 import { MatDivider } from '@angular/material/divider';
 import { MatButton } from '@angular/material/button';
@@ -43,7 +42,7 @@ import { PipelineStartedStatusComponent } from 
'../../../core-ui/pipeline/pipeli
         LayoutDirective,
         LayoutAlignDirective,
         FlexDirective,
-        MatProgressSpinner,
+        SpSpinnerComponent,
         MatIcon,
         MatDivider,
         MatButton,


Reply via email to