This is an automated email from the ASF dual-hosted git repository.
dominikriemer 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 278567ee34 style: Harmonize button and table layout (#4608)
278567ee34 is described below
commit 278567ee34f0454eafff6708e9a8dce3bbdc7b14
Author: Dominik Riemer <[email protected]>
AuthorDate: Sun Jun 28 21:24:11 2026 +0200
style: Harmonize button and table layout (#4608)
---
ui/cypress/support/utils/dataset/DatasetUtils.ts | 66 ++++-
ui/deployment/theme/_custom-variables.scss | 28 ++-
.../alert-banner/alert-banner.component.scss | 5 +
.../pipeline-element.component.scss | 23 ++
.../components/sp-table/sp-table.component.scss | 129 +++++++++-
.../lib/components/sp-table/sp-table.component.ts | 29 ++-
.../dialog/card-dialog/card-dialog.component.scss | 5 +-
.../confirm-dialog/confirm-dialog.component.scss | 4 +-
.../panel-dialog/panel-dialog.component.scss | 17 +-
.../standard-dialog/standard-dialog.component.scss | 28 ++-
.../configure-schema.component.scss | 4 -
.../last-updated-formatter.service.ts | 22 ++
.../simple-metrics/simple-metrics.component.html | 11 +-
.../simple-metrics/simple-metrics.component.scss} | 12 +-
.../simple-metrics/simple-metrics.component.ts | 2 +-
.../core-ui/status/status-widget.component.scss | 57 +++--
.../core/components/toolbar/toolbar.component.scss | 5 +
.../chart-preview/chart-preview.component.scss | 6 +-
.../panel/dashboard-panel.component.html | 1 +
.../panel/dashboard-panel.component.scss | 10 +
.../datalake-configuration.component.html | 6 +-
.../datalake-configuration.component.ts | 15 +-
.../datalake-last-event-label.component.html} | 40 +---
.../datalake-last-event-label.component.scss} | 9 +-
.../datalake-last-event-label.component.ts | 69 ++++++
.../pipeline-element-icon-stand-row.component.html | 87 +++----
.../pipeline-element-icon-stand-row.component.scss | 127 ++++++++--
.../pipeline-element-icon-stand-row.component.ts | 16 +-
.../pipeline-element-icon-stand.component.scss | 17 +-
.../pipeline-element-options.component.html | 146 +++++------
.../pipeline-element-options.component.scss | 82 ++++---
.../components/pipeline/pipeline.component.scss | 37 +--
.../dialog/customize/customize.component.html | 8 +-
.../editor/dialog/customize/customize.component.ts | 2 +
ui/src/scss/sp/_variables.scss | 57 ++++-
ui/src/scss/sp/buttons-mat3.scss | 266 ++++++++++++++++++---
ui/src/scss/sp/dialog.scss | 30 ++-
ui/src/scss/sp/forms-mat3.scss | 37 ++-
ui/src/scss/sp/main.scss | 140 ++++++-----
ui/src/scss/sp/mat-tab.scss | 44 +++-
ui/src/scss/sp/pipeline-element-options.scss | 50 ++--
ui/src/scss/sp/sp-dialog.scss | 16 +-
ui/src/scss/sp/sp-theme.scss | 115 ++++++++-
43 files changed, 1374 insertions(+), 506 deletions(-)
diff --git a/ui/cypress/support/utils/dataset/DatasetUtils.ts
b/ui/cypress/support/utils/dataset/DatasetUtils.ts
index 482c79eda0..1c9e63ba8d 100644
--- a/ui/cypress/support/utils/dataset/DatasetUtils.ts
+++ b/ui/cypress/support/utils/dataset/DatasetUtils.ts
@@ -148,7 +148,9 @@ export class DatasetUtils {
): Cypress.Chainable<string> {
this.refreshDataLakeMeasures();
return this.getDatasetLastEventCell(datasetName).then($cell => {
- const lastEvent = $cell.text().trim();
+ const lastEvent = this.getComparableLastEventValueFromElements(
+ Array.from($cell),
+ );
if (this.isDatasetNotEmptyValue(lastEvent)) {
return lastEvent;
@@ -201,11 +203,7 @@ export class DatasetUtils {
previousLastEvent: string,
datasetName?: string,
) {
- this.waitForDatasetNotEmpty(datasetName).should(lastEvent => {
- expect(this.getComparableLastEventValue(lastEvent)).not.to.equal(
- this.getComparableLastEventValue(previousLastEvent),
- );
- });
+ this.waitForDatasetLastEventChanged(previousLastEvent, datasetName);
}
private static getDatasetLastEventCell(datasetName?: string) {
@@ -229,6 +227,62 @@ export class DatasetUtils {
return exactTimeMatch?.[1] ?? trimmedValue;
}
+ private static waitForDatasetLastEventChanged(
+ previousLastEvent: string,
+ datasetName?: string,
+ attempts = 30,
+ ): Cypress.Chainable<string> {
+ const previousComparableValue =
+ this.getComparableLastEventValue(previousLastEvent);
+
+ this.refreshDataLakeMeasures();
+ return this.getDatasetLastEventCell(datasetName).then($cell => {
+ const lastEvent = this.getComparableLastEventValueFromElements(
+ Array.from($cell),
+ );
+ const lastEventChanged =
+ this.isDatasetNotEmptyValue(lastEvent) &&
+ this.getComparableLastEventValue(lastEvent) !==
+ previousComparableValue;
+
+ if (lastEventChanged) {
+ return lastEvent;
+ } else if (attempts > 0) {
+ cy.wait(1000);
+ return this.waitForDatasetLastEventChanged(
+ previousLastEvent,
+ datasetName,
+ attempts - 1,
+ );
+ } else {
+ expect(
+ this.getComparableLastEventValue(lastEvent),
+ ).not.to.equal(previousComparableValue);
+ return lastEvent;
+ }
+ });
+ }
+
+ private static getComparableLastEventValueFromElements(
+ cells: HTMLElement[],
+ ): string {
+ const rawLastEventValue = cells
+ .flatMap(cell =>
+ Array.from(
+ cell.querySelectorAll('sp-datalake-last-event-label'),
+ ),
+ )
+ .map(label => label.getAttribute('data-last-event-value'))
+ .find(value => value && this.isDatasetNotEmptyValue(value));
+
+ return (
+ rawLastEventValue ??
+ this.getComparableLastEventValue(
+ cells.map(cell => cell.textContent ?? '').join(' '),
+ )
+ );
+ }
+
public static openLatestEventsTab() {
GeneralUtils.tab('Latest events');
}
diff --git a/ui/deployment/theme/_custom-variables.scss
b/ui/deployment/theme/_custom-variables.scss
index abb2def7ed..d9d25bf633 100644
--- a/ui/deployment/theme/_custom-variables.scss
+++ b/ui/deployment/theme/_custom-variables.scss
@@ -22,7 +22,7 @@
--color-primary: #1b1464;
--color-primary-dark: #83a3de;
--color-secondary: rgb(57, 181, 74);
- --color-secondary-dark: #16cc39;
+ --color-secondary-dark: #7ac98a;
--color-loading-bar: var(--color-primary);
--color-primary-alt: rgb(59, 92, 149);
@@ -50,7 +50,31 @@
--color-primary: var(--color-primary-dark);
--color-secondary: var(--color-secondary-dark);
--color-menubar-text-menu-group: #120c47;
- --color-navigation-text: #121212;
+ --color-navigation-bg: #123b28;
+ --color-navigation-hover: #185236;
+ --color-navigation-selected: var(--color-secondary);
+ --color-navigation-bg-selected: color-mix(
+ in srgb,
+ var(--color-navigation-selected) 18%,
+ var(--color-navigation-bg)
+ );
+ --color-navigation-text: rgba(255, 255, 255, 0.9);
+ --color-navigation-link-text: rgba(255, 255, 255, 0.86);
+ --color-navigation-divider: rgba(255, 255, 255, 0.12);
+ --color-menubar-bg: var(--color-navigation-bg);
+ --color-menubar-bg-menu-item: transparent;
+ --color-menubar-bg-menu-item-hover: var(--color-navigation-hover);
+ --color-menubar-bg-menu-item-selected: var(--color-navigation-bg-selected);
+ --color-menubar-bg-menu-group-hover: color-mix(
+ in srgb,
+ var(--color-navigation-hover) 72%,
+ transparent
+ );
+ --color-menubar-bg-menu-group-selected:
var(--color-navigation-bg-selected);
+ --color-menubar-text-menu-item: var(--color-navigation-link-text);
+ --color-menubar-text-menu-item-hover: var(--color-navigation-text);
+ --color-menubar-text-menu-group: rgba(255, 255, 255, 0.68);
+ --color-menubar-text-menu-group-hover: var(--color-navigation-text);
--content-box-color: #404040;
}
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/alert-banner/alert-banner.component.scss
b/ui/projects/streampipes/shared-ui/src/lib/components/alert-banner/alert-banner.component.scss
index 8400ca7770..fcb9d8f623 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/alert-banner/alert-banner.component.scss
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/alert-banner/alert-banner.component.scss
@@ -24,6 +24,7 @@
gap: 0.75rem;
margin-bottom: 0.5rem;
margin-top: 0.5rem;
+ border: 1px solid transparent;
}
.alert-icon {
@@ -51,6 +52,7 @@
.alert-info {
background-color: var(--color-info-bg);
color: var(--color-info);
+ border-color: color-mix(in srgb, var(--color-info) 24%, transparent);
}
.alert-icon-info {
@@ -60,6 +62,7 @@
.alert-warning {
background-color: var(--color-warning-bg);
color: var(--color-warning);
+ border-color: color-mix(in srgb, var(--color-warning) 24%, transparent);
}
.alert-icon-warning {
color: var(--color-warning);
@@ -68,6 +71,7 @@
.alert-error {
background-color: var(--color-error-bg);
color: var(--color-error);
+ border-color: color-mix(in srgb, var(--color-error) 24%, transparent);
}
.alert-icon-error {
color: var(--color-error);
@@ -76,6 +80,7 @@
.alert-success {
background-color: var(--color-success-bg);
color: var(--color-success);
+ border-color: color-mix(in srgb, var(--color-success) 24%, transparent);
}
.alert-icon-success {
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/pipeline-element/pipeline-element.component.scss
b/ui/projects/streampipes/shared-ui/src/lib/components/pipeline-element/pipeline-element.component.scss
index 581807cf7a..d67736b8ef 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/pipeline-element/pipeline-element.component.scss
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/pipeline-element/pipeline-element.component.scss
@@ -16,10 +16,33 @@
*
*/
+.text-small,
+.element-text-icon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ line-height: 1;
+}
+
.text-small {
font-size: 8pt;
}
.pipeline-element-image {
+ display: block;
+ background: transparent;
+ mix-blend-mode: normal;
+}
+
+:host-context(.dark-mode) .pipeline-element-image {
mix-blend-mode: multiply;
}
+
+:host {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ height: 100%;
+ line-height: 1;
+}
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/sp-table/sp-table.component.scss
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-table/sp-table.component.scss
index 3d122a76ca..31dea4817c 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/sp-table/sp-table.component.scss
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-table/sp-table.component.scss
@@ -16,14 +16,81 @@
*
*/
+:host {
+ --table-divider-color: color-mix(
+ in srgb,
+ var(--mat-sys-on-surface) 10%,
+ transparent
+ );
+ --table-divider-strong-color: color-mix(
+ in srgb,
+ var(--mat-sys-on-surface) 16%,
+ transparent
+ );
+}
+
.paginator-container {
- border-top: 1px solid var(--color-bg-3);
+ border-top: 1px solid var(--table-divider-color);
+ background: var(--mat-sys-surface);
+}
+
+.paginator-container .mat-mdc-paginator-page-size-select {
+ width: 5.25rem;
+}
+
+.paginator-container .mat-mdc-paginator .mat-mdc-select {
+ line-height: 1.5;
+ margin-top: 5px;
+}
+
+.paginator-container
+ .mat-mdc-paginator-page-size-select
+ .mdc-text-field--outlined {
+ height: 1.875rem;
+ background: var(--color-surface-interactive);
+ border-radius: var(--radius-sm);
+}
+
+.paginator-container
+ .mat-mdc-paginator-page-size-select
+ .mat-mdc-form-field-infix {
+ display: flex;
+ align-items: center;
+ min-height: 1.875rem;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+.paginator-container
+ .mat-mdc-paginator-page-size-select
+ .mat-mdc-select-trigger {
+ display: flex;
+ align-items: center;
+ height: 1.875rem;
+ color: var(--color-primary);
+ font-weight: var(--font-weight-medium);
+}
+
+.paginator-container .mat-mdc-paginator-page-size-select .mat-mdc-select-value
{
+ display: flex;
+ align-items: center;
+ height: 100%;
+ line-height: inherit;
+}
+
+.paginator-container
+ .mat-mdc-paginator-page-size-select
+ .mat-mdc-select-arrow-wrapper {
+ display: flex;
+ align-items: center;
+ height: 100%;
+ transform: none;
}
.selection-toolbar {
- border-bottom: 1px solid var(--color-bg-3);
+ border-bottom: 1px solid var(--color-border-subtle);
margin-bottom: var(--space-md);
- padding-bottom: var(--space-xs);
+ padding: var(--space-sm);
}
.selection-toolbar__left {
@@ -35,7 +102,9 @@
}
.grouping-toolbar {
- padding: var(--space-sm) 0 var(--space-lg);
+ padding: var(--space-sm);
+ margin-bottom: var(--space-md);
+ border-radius: var(--radius-sm);
}
.grouping-toolbar--standalone {
@@ -85,16 +154,51 @@
}
.table-search-field__clear {
- color: var(--color-text-2);
+ color: var(--color-primary);
+}
+
+.sp-table {
+ border-collapse: collapse;
+}
+
+.mat-mdc-header-row {
+ background: var(--mat-sys-surface);
+ border-bottom: none;
+ box-shadow: inset 0 -1px var(--table-divider-strong-color);
+}
+
+.mat-mdc-header-cell {
+ color: var(--mat-sys-on-surface);
+ font-weight: var(--font-weight-semibold);
+ border-bottom: 0;
+}
+
+.mat-mdc-row {
+ transition: background-color var(--motion-duration-fast)
+ var(--motion-easing-standard);
+}
+
+.mat-mdc-row:hover:not(.grouped-table-row--header) {
+ background-color: var(--color-surface-interactive-hover);
+}
+
+.mat-mdc-row:has(.mat-mdc-checkbox-checked) {
+ background-color: var(--color-surface-selected);
+}
+
+.mat-mdc-row:has(.mat-mdc-checkbox-checked):hover {
+ background-color: var(--color-surface-selected-hover);
}
-.mat-mdc-row:hover {
- background-color: var(--color-bg-1);
+.cursor-pointer:focus-visible {
+ outline: 2px solid var(--mat-sys-primary);
+ outline-offset: -2px;
}
.mat-mdc-no-data-row {
height: var(--mat-table-row-item-container-height, 52px);
text-align: center;
+ color: var(--mat-sys-on-surface-variant);
}
.cursor-pointer {
@@ -120,7 +224,7 @@
}
.asset-context-empty {
- color: var(--color-text-2);
+ color: var(--mat-sys-on-surface-variant);
font-size: var(--font-size-xs);
}
@@ -135,13 +239,14 @@
.grouped-table-header {
padding: var(--space-md) var(--space-lg);
- border-top: 1px solid var(--color-bg-3);
- border-bottom: 1px solid var(--color-bg-3);
- background: var(--color-bg-1);
+ border-top: 1px solid var(--table-divider-color);
+ border-bottom: 1px solid var(--table-divider-color);
+ background: var(--color-surface-interactive);
}
.grouped-table-title {
margin: 0;
font-size: var(--font-size-md);
- font-weight: var(--font-weight-bold);
+ font-weight: var(--font-weight-semibold);
+ color: var(--mat-sys-on-surface);
}
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/sp-table/sp-table.component.ts
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-table/sp-table.component.ts
index 2b01a2b6cd..23e530d5b3 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/sp-table/sp-table.component.ts
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-table/sp-table.component.ts
@@ -223,6 +223,8 @@ export class SpTableComponent<T>
private renderedDataSubscription?: Subscription;
private assetDataSubscription?: Subscription;
private nameSearchSubscription?: Subscription;
+ private columnDefsSubscription?: Subscription;
+ private registeredColumnDefs = new Set<MatColumnDef>();
private nameSearchInput$ = new Subject<string>();
private viewInitialized = false;
private defaultFilterPredicates = new WeakMap<
@@ -261,9 +263,11 @@ export class SpTableComponent<T>
}
ngAfterContentInit() {
- this.columnDefs.forEach(columnDef =>
- this.table.addColumnDef(columnDef),
- );
+ this.syncColumnDefs();
+ this.columnDefsSubscription = this.columnDefs.changes.subscribe(() => {
+ this.syncColumnDefs();
+ this.table.renderRows();
+ });
this.rowDefs.forEach(rowDef => this.table.addRowDef(rowDef));
this.headerRowDefs.forEach(headerRowDef =>
this.table.addHeaderRowDef(headerRowDef),
@@ -312,6 +316,7 @@ export class SpTableComponent<T>
this.renderedDataSubscription?.unsubscribe();
this.assetDataSubscription?.unsubscribe();
this.nameSearchSubscription?.unsubscribe();
+ this.columnDefsSubscription?.unsubscribe();
}
@HostListener('window:resize')
@@ -562,6 +567,24 @@ export class SpTableComponent<T>
});
}
+ private syncColumnDefs() {
+ const currentColumnDefs = new Set(this.columnDefs.toArray());
+
+ this.registeredColumnDefs.forEach(columnDef => {
+ if (!currentColumnDefs.has(columnDef)) {
+ this.table.removeColumnDef(columnDef);
+ this.registeredColumnDefs.delete(columnDef);
+ }
+ });
+
+ currentColumnDefs.forEach(columnDef => {
+ if (!this.registeredColumnDefs.has(columnDef)) {
+ this.table.addColumnDef(columnDef);
+ this.registeredColumnDefs.add(columnDef);
+ }
+ });
+ }
+
private refreshRenderedRows() {
this.updateRenderedState(this.getCurrentPageRows(), false);
}
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/dialog/card-dialog/card-dialog.component.scss
b/ui/projects/streampipes/shared-ui/src/lib/dialog/card-dialog/card-dialog.component.scss
index c92e4122ce..570a6ccde3 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/dialog/card-dialog/card-dialog.component.scss
+++
b/ui/projects/streampipes/shared-ui/src/lib/dialog/card-dialog/card-dialog.component.scss
@@ -25,5 +25,8 @@ sp-card-dialog {
height: 90vh;
margin-top: auto;
margin-bottom: auto;
- border-radius: 1rem;
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-lg);
+ box-shadow: var(--shadow-overlay);
+ overflow: hidden;
}
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/dialog/confirm-dialog/confirm-dialog.component.scss
b/ui/projects/streampipes/shared-ui/src/lib/dialog/confirm-dialog/confirm-dialog.component.scss
index eef4ad0780..521cf0c2b2 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/dialog/confirm-dialog/confirm-dialog.component.scss
+++
b/ui/projects/streampipes/shared-ui/src/lib/dialog/confirm-dialog/confirm-dialog.component.scss
@@ -17,7 +17,9 @@
*/
.footer {
- margin-top: 20px;
+ margin-top: var(--space-lg);
+ padding-top: var(--space-sm);
+ border-top: 1px solid var(--color-border-subtle);
}
.neutral-action-wrapper {
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/dialog/panel-dialog/panel-dialog.component.scss
b/ui/projects/streampipes/shared-ui/src/lib/dialog/panel-dialog/panel-dialog.component.scss
index cf4c869e56..4c4194a969 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/dialog/panel-dialog/panel-dialog.component.scss
+++
b/ui/projects/streampipes/shared-ui/src/lib/dialog/panel-dialog/panel-dialog.component.scss
@@ -20,7 +20,7 @@ sp-panel-dialog-container {
width: 100%;
background-color: var(--color-bg-0);
color: var(--color-default-text);
- box-shadow: -7px 0px 5px -5px #777;
+ box-shadow: -12px 0 32px rgba(0, 0, 0, 0.12);
}
.dialog-panel {
@@ -37,6 +37,8 @@ sp-panel-dialog-container {
width: 100%;
background: var(--color-secondary);
align-items: center;
+ border-bottom: 1px solid
+ color-mix(in srgb, var(--color-secondary) 78%, black);
}
.dialog-panel-content {
@@ -45,9 +47,18 @@ sp-panel-dialog-container {
}
.dialog-title {
- padding: 5px 5px 5px 15px;
+ padding: var(--space-sm) var(--space-lg);
font-size: var(--font-size-lg);
- color: var(--color-bg-0);
+ font-weight: var(--font-weight-semibold);
+ color: var(--color-navigation-text);
+}
+
+.dialog-panel-header .mat-mdc-icon-button {
+ color: var(--color-navigation-text);
+}
+
+.dialog-panel-header .material-icons {
+ color: var(--color-navigation-text) !important;
}
#portal {
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/dialog/standard-dialog/standard-dialog.component.scss
b/ui/projects/streampipes/shared-ui/src/lib/dialog/standard-dialog/standard-dialog.component.scss
index 885e6a1a43..e2e5cb3ab6 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/dialog/standard-dialog/standard-dialog.component.scss
+++
b/ui/projects/streampipes/shared-ui/src/lib/dialog/standard-dialog/standard-dialog.component.scss
@@ -20,10 +20,9 @@ sp-standard-dialog-container {
width: 100%;
background-color: var(--color-bg-0);
color: var(--color-default-text);
- border-radius: 5px;
- -webkit-box-shadow: 0 10px 6px -6px #777;
- -moz-box-shadow: 0 10px 6px -6px #777;
- box-shadow: 0 10px 6px -6px #777;
+ border-radius: var(--radius-md);
+ box-shadow: var(--shadow-overlay);
+ overflow: hidden;
}
.standard-dialog-panel {
@@ -41,8 +40,10 @@ sp-standard-dialog-container {
width: 100%;
background: var(--color-secondary);
align-items: center;
- border-top-left-radius: 5px;
- border-top-right-radius: 5px;
+ border-bottom: 1px solid
+ color-mix(in srgb, var(--color-secondary) 78%, black);
+ border-top-left-radius: var(--radius-md);
+ border-top-right-radius: var(--radius-md);
}
.dialog-panel-content {
@@ -52,9 +53,18 @@ sp-standard-dialog-container {
}
.dialog-title {
- padding: 5px 5px 5px 15px;
- font-size: 20px;
- color: white;
+ padding: var(--space-sm) var(--space-lg);
+ font-size: var(--font-size-lg);
+ font-weight: var(--font-weight-semibold);
+ color: var(--color-navigation-text);
+}
+
+.standard-dialog-panel-header .mat-mdc-icon-button {
+ color: var(--color-navigation-text);
+}
+
+.standard-dialog-panel-header .material-icons {
+ color: var(--color-navigation-text) !important;
}
#portal {
diff --git
a/ui/src/app/connect/components/adapter-configuration/configure-schema/configure-schema.component.scss
b/ui/src/app/connect/components/adapter-configuration/configure-schema/configure-schema.component.scss
index 63da642e69..cf0f1a803c 100644
---
a/ui/src/app/connect/components/adapter-configuration/configure-schema/configure-schema.component.scss
+++
b/ui/src/app/connect/components/adapter-configuration/configure-schema/configure-schema.component.scss
@@ -17,10 +17,6 @@
*/
:host {
- --mat-button-toggle-selected-state-text-color: var(--color-bg-1);
- --mat-button-toggle-selected-state-background-color: var(--color-primary);
- --mat-button-toggle-text-color: var(--color-default-text);
- --mat-button-toggle-background-color: var(--color-bg-0);
--mat-button-toggle-height: 20px;
}
diff --git
a/ui/src/app/core-services/time-formatting/last-updated-formatter.service.ts
b/ui/src/app/core-services/time-formatting/last-updated-formatter.service.ts
index 4f906933b7..6627763baf 100644
--- a/ui/src/app/core-services/time-formatting/last-updated-formatter.service.ts
+++ b/ui/src/app/core-services/time-formatting/last-updated-formatter.service.ts
@@ -41,6 +41,28 @@ export class LastUpdatedFormatterService {
return relativeTime ? `${relativeTime} (${exactTime})` : exactTime;
}
+ public formatExactLastUpdatedAt(
+ updatedAt: number | null | undefined,
+ emptyLabel = 'n/a',
+ ): string {
+ if (!updatedAt) {
+ return emptyLabel;
+ }
+
+ return this.formatExactTime(updatedAt);
+ }
+
+ public formatRelativeLastUpdatedAt(
+ updatedAt: number | null | undefined,
+ currentTime = Date.now(),
+ ): string | undefined {
+ if (!updatedAt) {
+ return undefined;
+ }
+
+ return this.formatRelativeTime(updatedAt, currentTime);
+ }
+
private formatExactTime(updatedAt: number): string {
this.updateFormatters();
return this.exactTimeFormatter.format(new Date(updatedAt));
diff --git
a/ui/src/app/core-ui/monitoring/simple-metrics/simple-metrics.component.html
b/ui/src/app/core-ui/monitoring/simple-metrics/simple-metrics.component.html
index bc76be0893..a3186773b8 100644
--- a/ui/src/app/core-ui/monitoring/simple-metrics/simple-metrics.component.html
+++ b/ui/src/app/core-ui/monitoring/simple-metrics/simple-metrics.component.html
@@ -16,20 +16,21 @@
~
-->
-<div fxLayout="column">
+<div class="simple-metrics" fxLayout="column">
<sp-basic-header-title-component
[title]="elementName + ' - Metrics'"
></sp-basic-header-title-component>
<div
+ class="simple-metrics__grid"
fxLayout="row"
- fxLayoutAlign="center center"
- fxLayoutGap="20px"
+ fxLayoutAlign="start stretch"
+ fxLayoutGap="var(--space-md)"
fxFlex="100"
>
<sp-status-widget
fxFlex="50"
[label]="lastPublishedLabel"
- widgetHeight="400px"
+ widgetHeight="7.5rem"
[statusValue]="
lastTimestamp === 0 ? 'n/a' : (lastTimestamp | date: 'medium')
"
@@ -38,7 +39,7 @@
<sp-status-widget
fxFlex="50"
[label]="statusValueLabel"
- widgetHeight="400px"
+ widgetHeight="7.5rem"
[statusValue]="statusValue"
>
</sp-status-widget>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/dialog/confirm-dialog/confirm-dialog.component.scss
b/ui/src/app/core-ui/monitoring/simple-metrics/simple-metrics.component.scss
similarity index 87%
copy from
ui/projects/streampipes/shared-ui/src/lib/dialog/confirm-dialog/confirm-dialog.component.scss
copy to
ui/src/app/core-ui/monitoring/simple-metrics/simple-metrics.component.scss
index eef4ad0780..99c50c9d76 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/dialog/confirm-dialog/confirm-dialog.component.scss
+++ b/ui/src/app/core-ui/monitoring/simple-metrics/simple-metrics.component.scss
@@ -16,10 +16,14 @@
*
*/
-.footer {
- margin-top: 20px;
+:host {
+ display: block;
}
-.neutral-action-wrapper {
- margin-right: auto;
+.simple-metrics {
+ gap: var(--space-md);
+}
+
+.simple-metrics__grid {
+ width: 100%;
}
diff --git
a/ui/src/app/core-ui/monitoring/simple-metrics/simple-metrics.component.ts
b/ui/src/app/core-ui/monitoring/simple-metrics/simple-metrics.component.ts
index 7552e8cc5f..fa0ef1b477 100644
--- a/ui/src/app/core-ui/monitoring/simple-metrics/simple-metrics.component.ts
+++ b/ui/src/app/core-ui/monitoring/simple-metrics/simple-metrics.component.ts
@@ -30,7 +30,7 @@ import { DatePipe } from '@angular/common';
@Component({
selector: 'sp-simple-metrics',
templateUrl: './simple-metrics.component.html',
- styleUrls: [],
+ styleUrls: ['./simple-metrics.component.scss'],
imports: [
LayoutDirective,
SpBasicHeaderTitleComponent,
diff --git a/ui/src/app/core-ui/status/status-widget.component.scss
b/ui/src/app/core-ui/status/status-widget.component.scss
index e5fad2d3c5..328269dc81 100644
--- a/ui/src/app/core-ui/status/status-widget.component.scss
+++ b/ui/src/app/core-ui/status/status-widget.component.scss
@@ -16,40 +16,45 @@
*
*/
-.statusValue {
- font-size: 40pt;
- background: darkblue;
- color: white;
- margin: 5px;
- min-height: 140px;
- padding: 15px;
-}
-
-.statusValue > h4 {
- font-size: 20pt;
- margin-bottom: 30px;
-}
-
-.fix-margin {
- margin-top: -5px;
+:host {
+ display: block;
+ width: 100%;
+ --status-widget-color: var(--color-primary);
+ --status-widget-bg: color-mix(
+ in srgb,
+ var(--status-widget-color) 10%,
+ var(--color-bg-0)
+ );
}
.status-container {
- height: 150px;
width: 100%;
- color: var(--color-primary);
- border-radius: 5px;
- margin-bottom: 20px;
- border: 2px solid var(--color-bg-2);
- background: var(--color-bg-2);
- border-bottom: 5px solid var(--color-primary);
+ min-height: 7rem;
+ box-sizing: border-box;
+ color: var(--status-widget-color);
+ border-radius: var(--radius-md);
+ background: var(--status-widget-bg);
+ overflow: hidden;
}
.status-container-value {
- font-size: 36pt;
- font-weight: bold;
+ min-width: 0;
+ color: var(--status-widget-color);
+ font-size: var(--font-size-2xl);
+ font-weight: var(--font-weight-bold);
+ line-height: var(--line-height-tight);
+ letter-spacing: -0.02em;
+ text-align: center;
+ overflow-wrap: anywhere;
}
.status-container-label {
- font-size: 14pt;
+ color: color-mix(in srgb, var(--status-widget-color) 82%, transparent);
+ font-size: var(--font-size-md);
+ font-weight: var(--font-weight-semibold);
+ line-height: var(--line-height-normal);
+}
+
+.status-container.p-10 {
+ padding: var(--space-md);
}
diff --git a/ui/src/app/core/components/toolbar/toolbar.component.scss
b/ui/src/app/core/components/toolbar/toolbar.component.scss
index d11249a954..4681e53d0e 100644
--- a/ui/src/app/core/components/toolbar/toolbar.component.scss
+++ b/ui/src/app/core/components/toolbar/toolbar.component.scss
@@ -62,4 +62,9 @@
::ng-deep .toolbar-menu {
background-color: var(--mat-sys-surface);
--mat-menu-item-icon-color: var(--mat-sys-on-surface);
+ color: var(--mat-sys-on-surface);
+}
+
+::ng-deep .toolbar-menu .current-user {
+ color: var(--mat-sys-on-surface);
}
diff --git
a/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-preview/chart-preview.component.scss
b/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-preview/chart-preview.component.scss
index 3d7a82ba85..47ba94c038 100644
---
a/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-preview/chart-preview.component.scss
+++
b/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-preview/chart-preview.component.scss
@@ -60,11 +60,7 @@ mat-icon {
min-width: 40px;
height: 40px;
border-radius: 12px;
- background: linear-gradient(
- 180deg,
- color-mix(in srgb, var(--color-primary) 14%, white) 0%,
- color-mix(in srgb, var(--color-primary) 8%, var(--color-bg-1)) 100%
- );
+ background: color-mix(in srgb, var(--color-primary) 10%,
var(--color-bg-1));
color: var(--color-primary);
}
diff --git
a/ui/src/app/dashboard/components/panel/dashboard-panel.component.html
b/ui/src/app/dashboard/components/panel/dashboard-panel.component.html
index d60106f42e..185562ac2f 100644
--- a/ui/src/app/dashboard/components/panel/dashboard-panel.component.html
+++ b/ui/src/app/dashboard/components/panel/dashboard-panel.component.html
@@ -339,6 +339,7 @@
fxFlex="100"
fxLayout="column"
fxLayoutAlign="center center"
+ class="empty-dashboard-state"
data-cy="empty-dashboard"
>
<h4>
diff --git
a/ui/src/app/dashboard/components/panel/dashboard-panel.component.scss
b/ui/src/app/dashboard/components/panel/dashboard-panel.component.scss
index 2655e51d21..7a3d2d80ac 100644
--- a/ui/src/app/dashboard/components/panel/dashboard-panel.component.scss
+++ b/ui/src/app/dashboard/components/panel/dashboard-panel.component.scss
@@ -88,3 +88,13 @@
.view-radio-button {
margin: 5px;
}
+
+.empty-dashboard-state {
+ color: var(--mat-sys-on-surface-variant);
+ text-align: center;
+}
+
+.empty-dashboard-state h4 {
+ color: inherit;
+ font-weight: var(--font-weight-medium);
+}
diff --git
a/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.html
b/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.html
index 0c00c5679f..49c6aedaa4 100644
---
a/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.html
+++
b/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.html
@@ -99,7 +99,11 @@
>{{ 'Loading' | translate }}
</mat-spinner>
} @else {
- {{ formatLastEvent(configurationEntry.lastEvent) }}
+ <sp-datalake-last-event-label
+ [lastEvent]="configurationEntry.lastEvent"
+ [currentTime]="currentTime"
+ >
+ </sp-datalake-last-event-label>
}
</td>
</ng-container>
diff --git
a/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.ts
b/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.ts
index 3428ec876c..e951762ad6 100644
---
a/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.ts
+++
b/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.ts
@@ -86,11 +86,11 @@ 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 { DatePipe, NgStyle } from '@angular/common';
+import { NgStyle } from '@angular/common';
import { StyleDirective } from '@ngbracket/ngx-layout/extended';
import { MatMenuItem } from '@angular/material/menu';
import { catchError, of, Subscription } from 'rxjs';
-import { LastUpdatedFormatterService } from
'../../../core-services/time-formatting/last-updated-formatter.service';
+import { DatalakeLastEventLabelComponent } from
'./datalake-last-event-label/datalake-last-event-label.component';
@Component({
selector: 'sp-datalake-configuration',
@@ -122,12 +122,12 @@ import { LastUpdatedFormatterService } from
'../../../core-services/time-formatt
MatHeaderRow,
MatRowDef,
MatRow,
- DatePipe,
TranslatePipe,
SpTableComponent,
SpBasicHeaderTitleComponent,
SpBasicViewComponent,
SpTableActionsDirective,
+ DatalakeLastEventLabelComponent,
],
})
export class DatalakeConfigurationComponent
@@ -146,8 +146,6 @@ export class DatalakeConfigurationComponent
private currentUserService = inject(CurrentUserService);
private assetFilterService = inject(SpAssetBrowserService);
private router = inject(Router);
- private lastUpdatedFormatterService = inject(LastUpdatedFormatterService);
-
dataSource: MatTableDataSource<DataLakeConfigurationEntry> =
new MatTableDataSource([]);
availableMeasurements: DataLakeConfigurationEntry[] = [];
@@ -515,13 +513,6 @@ export class DatalakeConfigurationComponent
});
}
- formatLastEvent(lastEventAt: number | null): string {
- return this.lastUpdatedFormatterService.formatLastUpdatedAt(
- lastEventAt,
- this.currentTime,
- );
- }
-
private toConfigurationEntry(
measurement: DatasetSummaryDto,
): DataLakeConfigurationEntry {
diff --git
a/ui/src/app/core-ui/monitoring/simple-metrics/simple-metrics.component.html
b/ui/src/app/dataset/components/datalake-configuration/datalake-last-event-label/datalake-last-event-label.component.html
similarity index 51%
copy from
ui/src/app/core-ui/monitoring/simple-metrics/simple-metrics.component.html
copy to
ui/src/app/dataset/components/datalake-configuration/datalake-last-event-label/datalake-last-event-label.component.html
index bc76be0893..bf98d1f985 100644
--- a/ui/src/app/core-ui/monitoring/simple-metrics/simple-metrics.component.html
+++
b/ui/src/app/dataset/components/datalake-configuration/datalake-last-event-label/datalake-last-event-label.component.html
@@ -16,31 +16,15 @@
~
-->
-<div fxLayout="column">
- <sp-basic-header-title-component
- [title]="elementName + ' - Metrics'"
- ></sp-basic-header-title-component>
- <div
- fxLayout="row"
- fxLayoutAlign="center center"
- fxLayoutGap="20px"
- fxFlex="100"
- >
- <sp-status-widget
- fxFlex="50"
- [label]="lastPublishedLabel"
- widgetHeight="400px"
- [statusValue]="
- lastTimestamp === 0 ? 'n/a' : (lastTimestamp | date: 'medium')
- "
- >
- </sp-status-widget>
- <sp-status-widget
- fxFlex="50"
- [label]="statusValueLabel"
- widgetHeight="400px"
- [statusValue]="statusValue"
- >
- </sp-status-widget>
- </div>
-</div>
+<sp-label
+ size="small"
+ shape="badge"
+ variant="soft"
+ [tone]="usesRelativeTime ? 'success' : 'neutral'"
+ [labelText]="displayValue"
+ minWidth="9rem"
+ [matTooltip]="tooltipValue"
+ [matTooltipDisabled]="!tooltipValue"
+ matTooltipPosition="above"
+>
+</sp-label>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/dialog/confirm-dialog/confirm-dialog.component.scss
b/ui/src/app/dataset/components/datalake-configuration/datalake-last-event-label/datalake-last-event-label.component.scss
similarity index 90%
copy from
ui/projects/streampipes/shared-ui/src/lib/dialog/confirm-dialog/confirm-dialog.component.scss
copy to
ui/src/app/dataset/components/datalake-configuration/datalake-last-event-label/datalake-last-event-label.component.scss
index eef4ad0780..723331d792 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/dialog/confirm-dialog/confirm-dialog.component.scss
+++
b/ui/src/app/dataset/components/datalake-configuration/datalake-last-event-label/datalake-last-event-label.component.scss
@@ -16,10 +16,7 @@
*
*/
-.footer {
- margin-top: 20px;
-}
-
-.neutral-action-wrapper {
- margin-right: auto;
+:host {
+ display: inline-flex;
+ align-items: center;
}
diff --git
a/ui/src/app/dataset/components/datalake-configuration/datalake-last-event-label/datalake-last-event-label.component.ts
b/ui/src/app/dataset/components/datalake-configuration/datalake-last-event-label/datalake-last-event-label.component.ts
new file mode 100644
index 0000000000..c2d2c7b1d0
--- /dev/null
+++
b/ui/src/app/dataset/components/datalake-configuration/datalake-last-event-label/datalake-last-event-label.component.ts
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import {
+ Component,
+ HostBinding,
+ inject,
+ Input,
+ OnChanges,
+} from '@angular/core';
+import { MatTooltip } from '@angular/material/tooltip';
+import { SpLabelComponent } from '@streampipes/shared-ui';
+import { LastUpdatedFormatterService } from
'../../../../core-services/time-formatting/last-updated-formatter.service';
+
+@Component({
+ selector: 'sp-datalake-last-event-label',
+ templateUrl: './datalake-last-event-label.component.html',
+ styleUrls: ['./datalake-last-event-label.component.scss'],
+ imports: [MatTooltip, SpLabelComponent],
+})
+export class DatalakeLastEventLabelComponent implements OnChanges {
+ @Input()
+ lastEvent: number | null;
+
+ @Input()
+ currentTime = Date.now();
+
+ displayValue = 'n/a';
+ tooltipValue = '';
+ usesRelativeTime = false;
+
+ @HostBinding('attr.data-last-event-value')
+ get lastEventValue(): string | null {
+ return this.lastEvent ? `${this.lastEvent}` : null;
+ }
+
+ private lastUpdatedFormatterService = inject(LastUpdatedFormatterService);
+
+ ngOnChanges(): void {
+ const relativeTime =
+ this.lastUpdatedFormatterService.formatRelativeLastUpdatedAt(
+ this.lastEvent,
+ this.currentTime,
+ );
+ const exactTime =
+ this.lastUpdatedFormatterService.formatExactLastUpdatedAt(
+ this.lastEvent,
+ );
+
+ this.usesRelativeTime = !!relativeTime;
+ this.displayValue = relativeTime ?? exactTime;
+ this.tooltipValue = relativeTime ? exactTime : '';
+ }
+}
diff --git
a/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand-row/pipeline-element-icon-stand-row.component.html
b/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand-row/pipeline-element-icon-stand-row.component.html
index 529c29fc97..fb2923d22d 100644
---
a/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand-row/pipeline-element-icon-stand-row.component.html
+++
b/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand-row/pipeline-element-icon-stand-row.component.html
@@ -16,36 +16,31 @@
~
-->
<div
- fxLayout="row"
class="draggable-pipeline-element"
- fxFlex="100"
id="{{ element.appId || element.name.toLowerCase().replaceAll(' ', '_') }}"
[attr.data-pe]="element.elementId"
(mouseenter)="updateMouseOver(element.name)"
(mouseleave)="updateMouseOver('')"
data-cy="pipeline-element-icon-stand-row"
>
- <div fxFlex="50px">
- <div
- matTooltip="{{ element.name }}"
- [matTooltipPosition]="'above'"
- class="draggable-icon-editor tt"
- [ngClass]="activeCssClass"
- >
- <span id="container" class="pe-container">
- <sp-pipeline-element
- id="pe-icon-stand-{{ element.appId }}"
- style="margin-left: -3%"
- [iconStandSize]="true"
- [attr.data-cy]="'sp-pipeline-element-' + cypressName"
- [pipelineElement]="element"
- ></sp-pipeline-element>
- </span>
- </div>
+ <div
+ matTooltip="{{ element.name }}"
+ [matTooltipPosition]="'above'"
+ class="draggable-icon-editor tt"
+ [ngClass]="activeCssClass"
+ >
+ <span id="container" class="pe-container">
+ <sp-pipeline-element
+ id="pe-icon-stand-{{ element.appId }}"
+ [iconStandSize]="true"
+ [attr.data-cy]="'sp-pipeline-element-' + cypressName"
+ [pipelineElement]="element"
+ ></sp-pipeline-element>
+ </span>
</div>
- <div fxFlex fxLayoutAlign="start start" fxLayout="column">
+ <div class="pipeline-element-row-content">
<div
- class="font-bold"
+ class="element-name-label"
[ngClass]="{
'element-name-hover': currentMouseOver,
'element-name': !currentMouseOver,
@@ -54,39 +49,35 @@
{{ element.name }}
</div>
@if (currentMouseOver && assetContext) {
- <div class="element-description" fxLayoutAlign="start start">
- <div fxLayout="row wrap" fxLayoutGap="4px">
- @for (asset of assetContext.assets; track asset.id) {
- <sp-label
- size="small"
- tone="neutral"
- variant="soft"
- [labelText]="asset.label"
- [matTooltip]="asset.tooltip"
- >
- </sp-label>
- }
- </div>
+ <div class="asset-labels">
+ @for (asset of assetContext.assets; track asset.id) {
+ <sp-label
+ size="small"
+ tone="neutral"
+ variant="soft"
+ [labelText]="asset.label"
+ [matTooltip]="asset.tooltip"
+ >
+ </sp-label>
+ }
</div>
}
@if (currentMouseOver) {
- <div class="element-description" fxLayoutAlign="start start">
- <span class="text-xs">{{ element.description }}</span>
+ <div class="element-description">
+ {{ element.description }}
</div>
}
</div>
@if (currentMouseOver) {
- <div fxLayoutAlign="end start">
- <button
- style="height: 20px"
- mat-flat-button
- color="accent"
- class="help-button-stand"
- data-cy="help-button-icon-stand"
- (click)="openHelpDialog(element)"
- >
- ?
- </button>
- </div>
+ <button
+ mat-icon-button
+ class="help-button-stand"
+ data-cy="help-button-icon-stand"
+ [matTooltip]="'Help'"
+ [matTooltipPosition]="'above'"
+ (click)="openHelpDialog(element)"
+ >
+ <mat-icon>help</mat-icon>
+ </button>
}
</div>
diff --git
a/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand-row/pipeline-element-icon-stand-row.component.scss
b/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand-row/pipeline-element-icon-stand-row.component.scss
index 9396ebddf8..48bbb026c6 100644
---
a/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand-row/pipeline-element-icon-stand-row.component.scss
+++
b/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand-row/pipeline-element-icon-stand-row.component.scss
@@ -20,72 +20,165 @@
cursor: move;
vertical-align: top;
background-color: var(--color-pe);
- display: inline-block;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
height: 35px;
width: 35px;
- line-height: 35px;
- box-shadow: 1px 1px 2px var(--color-shadow);
+ line-height: 1;
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-sm);
+ box-shadow: none;
text-align: center;
z-index: 100;
+ transition:
+ background-color var(--motion-duration-fast)
+ var(--motion-easing-standard),
+ border-color var(--motion-duration-fast) var(--motion-easing-standard);
}
.draggable-icon-drag {
cursor: pointer;
vertical-align: top;
background: var(--color-pe);
- display: inline-block;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
height: 70px;
width: 70px;
- line-height: 70px;
- box-shadow: 1px 1px 2px var(--color-shadow);
+ line-height: 1;
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-sm);
+ box-shadow: none;
text-align: center;
z-index: 100;
+ transition:
+ background-color var(--motion-duration-fast)
+ var(--motion-easing-standard),
+ border-color var(--motion-duration-fast) var(--motion-easing-standard);
+}
+
+.draggable-icon-editor.stream,
+.draggable-icon-drag.stream {
+ border-color: var(--color-data-source);
+ border-radius: 50%;
+ background: var(--color-pe);
+}
+
+.draggable-icon-editor.sepa,
+.draggable-icon-drag.sepa {
+ border-color: var(--color-processor);
+ background: var(--color-pe);
+}
+
+.draggable-icon-editor.action,
+.draggable-icon-drag.action {
+ border-color: var(--color-sink);
+ background: var(--color-pe);
}
.draggable-pipeline-element {
cursor: move;
+ display: grid;
+ grid-template-columns: 35px minmax(0, 1fr) auto;
+ align-items: center;
+ column-gap: var(--space-sm);
+ min-height: 2.5rem;
+ padding: var(--space-2xs) var(--space-sm);
+ border-radius: var(--radius-sm);
z-index: 100;
+ transition:
+ background-color var(--motion-duration-fast)
+ var(--motion-easing-standard),
+ color var(--motion-duration-fast) var(--motion-easing-standard);
+}
+
+.draggable-pipeline-element:hover {
+ background: var(--color-surface-interactive-hover);
+}
+
+.pipeline-element-row-content {
+ display: flex;
+ min-width: 0;
+ flex-direction: column;
+ gap: var(--space-2xs);
}
.element-name {
overflow: hidden;
text-overflow: ellipsis;
- display: inline-block;
white-space: nowrap;
- max-width: 170px;
}
.element-name-hover {
- word-wrap: break-word;
overflow-wrap: anywhere;
word-break: break-word;
}
+.element-name-label {
+ color: var(--mat-sys-on-surface);
+ font-size: var(--font-size-sm);
+ font-weight: var(--font-weight-semibold);
+ line-height: 1.25;
+}
+
.element-description {
- font-weight: 300;
+ display: -webkit-box;
+ overflow: hidden;
+ color: var(--mat-sys-on-surface-variant);
+ font-size: var(--font-size-xs);
+ font-weight: var(--font-weight-regular);
+ line-height: 1.25;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+}
+
+.asset-labels {
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--space-2xs);
}
.help-button-stand {
padding: 0;
min-width: 0;
- width: 20px;
- height: 20px;
+ width: 1.5rem;
+ height: 1.5rem;
flex-shrink: 0;
- line-height: 20px;
- border-radius: 0;
- margin-right: 5px;
+ border-radius: var(--radius-xs);
+ color: var(--color-primary);
+ line-height: 1;
+}
+
+.help-button-stand:hover {
+ background: color-mix(in srgb, var(--color-primary) 10%, transparent);
+}
+
+.help-button-stand .mat-icon {
+ width: 1.125rem;
+ height: 1.125rem;
+ font-size: var(--font-size-lg);
+ line-height: 1;
}
.pe-container {
position: relative;
- display: block;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
width: 35px;
height: 35px;
+ line-height: 1;
}
.pe-container-drag {
position: relative;
- display: block;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
width: 70px;
height: 70px;
+ line-height: 1;
}
diff --git
a/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand-row/pipeline-element-icon-stand-row.component.ts
b/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand-row/pipeline-element-icon-stand-row.component.ts
index 2b5c97dcbe..36ff52c4f4 100644
---
a/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand-row/pipeline-element-icon-stand-row.component.ts
+++
b/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand-row/pipeline-element-icon-stand-row.component.ts
@@ -23,21 +23,16 @@ import {
} from '../../../model/editor.model';
import { PipelineElementTypeUtils } from '../../../utils/editor.utils';
import { EditorService } from '../../../services/editor.service';
-import {
- FlexDirective,
- LayoutAlignDirective,
- LayoutDirective,
-} from '@ngbracket/ngx-layout/flex';
import { MatTooltip } from '@angular/material/tooltip';
import { NgClass } from '@angular/common';
-import { ClassDirective } from '@ngbracket/ngx-layout/extended';
import {
PipelineElementComponent,
SpLabelComponent,
SpAssetBrowserService,
SpTableAssetContextService,
} from '@streampipes/shared-ui';
-import { MatButton } from '@angular/material/button';
+import { MatIconButton } from '@angular/material/button';
+import { MatIcon } from '@angular/material/icon';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { SpDataStream } from '@streampipes/platform-services';
import { SpTableResolvedAssetContext } from '@streampipes/shared-ui';
@@ -48,15 +43,12 @@ import { map } from 'rxjs';
templateUrl: './pipeline-element-icon-stand-row.component.html',
styleUrls: ['./pipeline-element-icon-stand-row.component.scss'],
imports: [
- LayoutDirective,
- FlexDirective,
MatTooltip,
NgClass,
- ClassDirective,
PipelineElementComponent,
SpLabelComponent,
- LayoutAlignDirective,
- MatButton,
+ MatIconButton,
+ MatIcon,
],
})
export class PipelineElementIconStandRowComponent implements OnInit {
diff --git
a/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand.component.scss
b/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand.component.scss
index 6255f29a3e..1fad9a6012 100644
---
a/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand.component.scss
+++
b/ui/src/app/editor/components/pipeline-element-icon-stand/pipeline-element-icon-stand.component.scss
@@ -29,22 +29,7 @@
}
.pe-row {
- padding-top: 5px;
- padding-bottom: 5px;
- padding-left: 5px;
-}
-
-.pe-row:nth-child(even) {
- background-color: var(--color-bg-1);
-}
-
-.pe-row:nth-child(odd) {
- background-color: var(--color-bg-0);
-}
-
-.pe-row:hover {
- background-color: var(--color-bg-2);
- cursor: pointer;
+ padding: 1px var(--space-xs);
}
.panel-header {
diff --git
a/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.html
b/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.html
index 4fc91c67e2..421ff8ba8e 100644
---
a/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.html
+++
b/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.html
@@ -15,99 +15,85 @@
~ limitations under the License.
~
-->
-<div>
- <div>
- <div
- [ngStyle]="
- currentMouseOverElement === pipelineElement.payload.dom
- ? { opacity: 1 }
- : { opacity: 1 }
- "
- class="sp-fade-options"
- >
- @if (pipelineElement.type !== 'stream') {
- <span
- class="options-button customize-button"
- style="z-index: 10"
- >
- <button
- class="options-icon-button"
- mat-icon-button
- [matTooltip]="'Configure Element' | translate"
- [matTooltipPosition]="'above'"
- (click)="customizeElement(pipelineElement)"
- data-cy="settings-pipeline-element-button"
- >
- <mat-icon class="options-icon-size">settings</mat-icon>
- </button>
- </span>
- }
- @if (pipelineElement.type === 'stream' && isWildcardTopic()) {
- <span
- class="options-button customize-button"
- style="z-index: 10"
- >
- <button
- class="options-icon-button"
- mat-icon-button
- [matTooltip]="'Configure Element' | translate"
- [matTooltipPosition]="'above'"
- (click)="openCustomizeStreamDialog()"
- >
- <mat-icon class="options-icon-size">settings</mat-icon>
- </button>
- </span>
- }
- <span class="options-button delete-button" style="z-index: 10">
+<div
+ [ngStyle]="
+ currentMouseOverElement === pipelineElement.payload.dom
+ ? { opacity: 1 }
+ : { opacity: 1 }
+ "
+ class="sp-fade-options"
+>
+ <div class="pipeline-element-action-bar pipeline-element-action-bar--top">
+ @if (pipelineElement.type !== 'stream') {
+ <span class="options-button customize-button">
<button
class="options-icon-button"
mat-icon-button
- [matTooltip]="'Delete Element' | translate"
+ [matTooltip]="'Configure Element' | translate"
[matTooltipPosition]="'above'"
- (click)="removeElement(pipelineElement)"
+ (click)="customizeElement(pipelineElement)"
+ data-cy="settings-pipeline-element-button"
>
- <mat-icon class="options-icon-size">clear</mat-icon>
+ <mat-icon class="options-icon-size">settings</mat-icon>
</button>
</span>
- @if (pipelineElement.type !== 'action') {
- <span
- class="options-button possible-button"
- style="z-index: 10"
+ }
+ @if (pipelineElement.type === 'stream' && isWildcardTopic()) {
+ <span class="options-button customize-button">
+ <button
+ class="options-icon-button"
+ mat-icon-button
+ [matTooltip]="'Configure Element' | translate"
+ [matTooltipPosition]="'above'"
+ (click)="openCustomizeStreamDialog()"
>
- <button
- class="options-icon-button"
- mat-icon-button
- [matTooltip]="'Compatible Elements' | translate"
- [matTooltipPosition]="'below'"
- [disabled]="
- !possibleElements || possibleElements.length === 0
- "
- (click)="openPossibleElementsDialog()"
- [attr.data-cy]="
- 'sp-possible-elements-' +
- pipelineElement.payload.name
- .toLowerCase()
- .replaceAll(' ', '_')
- "
- _
- >
- <mat-icon class="options-icon-size"
- >account_tree</mat-icon
- >
- </button>
- </span>
- }
- <span class="options-button help-button" style="z-index: 10">
+ <mat-icon class="options-icon-size">settings</mat-icon>
+ </button>
+ </span>
+ }
+ @if (pipelineElement.type !== 'action') {
+ <span class="options-button possible-button">
<button
class="options-icon-button"
- [matTooltip]="'Help' | translate"
- [matTooltipPosition]="'below'"
mat-icon-button
- (click)="openHelpDialog()"
+ [matTooltip]="'Compatible Elements' | translate"
+ [matTooltipPosition]="'above'"
+ [disabled]="
+ !possibleElements || possibleElements.length === 0
+ "
+ (click)="openPossibleElementsDialog()"
+ [attr.data-cy]="
+ 'sp-possible-elements-' +
+ pipelineElement.payload.name
+ .toLowerCase()
+ .replaceAll(' ', '_')
+ "
>
- <mat-icon class="options-icon-size">help</mat-icon>
+ <mat-icon class="options-icon-size">account_tree</mat-icon>
</button>
</span>
- </div>
+ }
+ <span class="options-button help-button">
+ <button
+ class="options-icon-button"
+ [matTooltip]="'Help' | translate"
+ [matTooltipPosition]="'above'"
+ mat-icon-button
+ (click)="openHelpDialog()"
+ >
+ <mat-icon class="options-icon-size">help</mat-icon>
+ </button>
+ </span>
+ <span class="options-button delete-button">
+ <button
+ class="options-icon-button"
+ mat-icon-button
+ [matTooltip]="'Delete Element' | translate"
+ [matTooltipPosition]="'above'"
+ (click)="removeElement(pipelineElement)"
+ >
+ <mat-icon class="options-icon-size">clear</mat-icon>
+ </button>
+ </span>
</div>
</div>
diff --git
a/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.scss
b/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.scss
index f605ae8c56..b00445c498 100644
---
a/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.scss
+++
b/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.scss
@@ -18,49 +18,73 @@
.options-button {
cursor: pointer;
- position: absolute;
- height: 20px;
- width: 20px;
- border-radius: 20%;
- box-shadow: 0 0 3px var(--color-primary);
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ height: 1.5rem;
+ width: 1.5rem;
+ border-radius: var(--radius-xs);
+ box-shadow: none;
text-align: center;
- padding: 1px 1px;
- background-color: var(--mat-sys-primary);
+ padding: 0;
+ background-color: transparent;
}
.mat-mdc-icon-button.options-icon-button {
- width: 20px;
- height: 20px;
- line-height: 1.2;
- border-radius: 0;
+ width: 1.5rem;
+ height: 1.5rem;
+ line-height: 1;
+ border-radius: var(--radius-xs);
padding: 0;
- color: var(--mat-sys-on-primary);
+ color: var(--color-primary);
+ transition:
+ background-color var(--motion-duration-fast)
+ var(--motion-easing-standard),
+ color var(--motion-duration-fast) var(--motion-easing-standard);
+}
+
+.mat-mdc-icon-button.options-icon-button:hover:not(:disabled) {
+ background: color-mix(in srgb, var(--color-primary) 10%, transparent);
}
.options-icon-size {
- font-size: 1.08rem;
- width: inherit;
- height: inherit;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ font-size: var(--font-size-lg);
+ width: 1.125rem;
+ height: 1.125rem;
+ line-height: 1;
+}
+
+.pipeline-element-action-bar {
+ position: absolute;
+ z-index: 50;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: var(--space-2xs);
+ padding: var(--space-2xs);
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-sm);
+ background: var(--mat-sys-surface);
}
-.customize-button {
- left: 2%;
- top: -35%;
+.pipeline-element-action-bar--top {
+ left: 50%;
+ top: -2.25rem;
+ transform: translateX(-50%);
}
-.delete-button {
- left: 73%;
- top: -35%;
- background-color: darkred;
- box-shadow: 0 0 3px darkred;
+.delete-button .mat-mdc-icon-button.options-icon-button {
+ color: var(--color-error);
}
-.help-button {
- left: 37.5%;
- top: -35%;
+.delete-button .mat-mdc-icon-button.options-icon-button:hover:not(:disabled) {
+ background: color-mix(in srgb, var(--color-error) 12%, transparent);
}
-.possible-button {
- left: 37.5%;
- top: 80%;
+.possible-button .mat-mdc-icon-button.options-icon-button:disabled {
+ color: var(--mat-sys-on-surface-variant);
+ opacity: 0.5;
}
diff --git a/ui/src/app/editor/components/pipeline/pipeline.component.scss
b/ui/src/app/editor/components/pipeline/pipeline.component.scss
index e47a6b33c9..c7044dfa18 100644
--- a/ui/src/app/editor/components/pipeline/pipeline.component.scss
+++ b/ui/src/app/editor/components/pipeline/pipeline.component.scss
@@ -18,28 +18,35 @@
.topics-button {
cursor: pointer;
- width: 20px;
- height: 20px;
- border-radius: 20%;
- box-shadow: 0 0 3px var(--color-primary);
- background-color: var(--color-primary);
- color: rgba(255, 255, 255, 0.75);
position: absolute;
- left: 40%;
- top: 82%;
+ left: 50%;
+ top: -2.25rem;
+ transform: translateX(-50%);
z-index: 50;
- margin-top: 5px;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: auto;
+ height: auto;
+ padding: var(--space-2xs);
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-sm);
+ background: var(--mat-sys-surface);
}
.topics-icon-button {
- width: 20px;
- height: 20px;
+ width: 1.5rem;
+ height: 1.5rem;
padding: 0;
+ color: var(--color-primary);
}
.topics-icon-size {
- font-size: 1.08rem;
- color: white;
- width: 20px;
- height: 20px;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ font-size: var(--font-size-lg);
+ width: 1.125rem;
+ height: 1.125rem;
+ line-height: 1;
}
diff --git a/ui/src/app/editor/dialog/customize/customize.component.html
b/ui/src/app/editor/dialog/customize/customize.component.html
index 809113d688..a99a65a559 100644
--- a/ui/src/app/editor/dialog/customize/customize.component.html
+++ b/ui/src/app/editor/dialog/customize/customize.component.html
@@ -171,13 +171,12 @@
<mat-divider></mat-divider>
<div class="sp-dialog-actions">
@if (!templateMode) {
- <div fxLayout="row">
+ <div fxLayout="row" fxLayoutGap="10px" fxFlex="100">
<button
mat-button
mat-flat-button
color="accent"
(click)="save()"
- style="margin-right: 10px"
[disabled]="!formValid"
data-cy="sp-element-configuration-save"
>
@@ -197,7 +196,7 @@
<button
mat-button
mat-flat-button
- color="accent"
+ class="mat-basic"
[disabled]="!formValid"
data-cy="create-template"
(click)="triggerTemplateMode()"
@@ -208,13 +207,12 @@
</div>
}
@if (templateMode) {
- <div fxLayout="row">
+ <div fxLayout="row" fxLayoutGap="10px">
<button
mat-button
mat-flat-button
color="accent"
(click)="saveTemplate()"
- style="margin-right: 10px"
[disabled]="!formValid"
data-cy="save-template"
>
diff --git a/ui/src/app/editor/dialog/customize/customize.component.ts
b/ui/src/app/editor/dialog/customize/customize.component.ts
index eea8a9bdb9..4c42d30e32 100644
--- a/ui/src/app/editor/dialog/customize/customize.component.ts
+++ b/ui/src/app/editor/dialog/customize/customize.component.ts
@@ -67,6 +67,7 @@ import { PipelineElementTemplateConfigComponent } from
'../../../core-ui/pipelin
import { MatDivider } from '@angular/material/divider';
import { MatButton } from '@angular/material/button';
import { TranslatePipe } from '@ngx-translate/core';
+import { LayoutGapDirective } from '@ngbracket/ngx-layout';
@Component({
selector: 'sp-customize-pipeline-element',
@@ -92,6 +93,7 @@ import { TranslatePipe } from '@ngx-translate/core';
MatDivider,
MatButton,
TranslatePipe,
+ LayoutGapDirective,
],
})
export class CustomizeComponent implements OnInit, AfterViewInit {
diff --git a/ui/src/scss/sp/_variables.scss b/ui/src/scss/sp/_variables.scss
index 7900e374dd..100b4a7888 100644
--- a/ui/src/scss/sp/_variables.scss
+++ b/ui/src/scss/sp/_variables.scss
@@ -123,16 +123,60 @@
var(--color-primary) 10%,
var(--color-bg-0)
);
+ --color-panel-header-accent: color-mix(
+ in srgb,
+ var(--color-primary) 5%,
+ var(--color-bg-0)
+ );
+
+ // Semantic appearance tokens
+ --radius-xs: 0.25rem;
+ --radius-sm: 0.5rem;
+ --radius-md: 0.75rem;
+ --radius-lg: 1rem;
+ --radius-pill: 999px;
+
--color-border-subtle: color-mix(
in srgb,
- var(--color-bg-3) 72%,
+ var(--mat-sys-outline-variant) 72%,
transparent
);
- --color-panel-header-accent: color-mix(
+ --color-border-default: color-mix(
in srgb,
- var(--color-primary) 5%,
- var(--color-bg-0)
+ var(--mat-sys-outline) 58%,
+ transparent
);
+ --color-border-strong: color-mix(
+ in srgb,
+ var(--mat-sys-outline) 78%,
+ transparent
+ );
+
+ --color-surface-interactive: var(--mat-sys-surface-container-low);
+ --color-surface-interactive-hover: var(--mat-sys-surface-container);
+ --color-surface-interactive-active: var(--mat-sys-surface-container-high);
+ --color-surface-selected: color-mix(
+ in srgb,
+ var(--mat-sys-primary) 10%,
+ var(--mat-sys-surface)
+ );
+ --color-surface-selected-hover: color-mix(
+ in srgb,
+ var(--mat-sys-primary) 15%,
+ var(--mat-sys-surface)
+ );
+
+ --color-focus-ring: color-mix(
+ in srgb,
+ var(--mat-sys-primary) 38%,
+ transparent
+ );
+ --focus-ring: 0 0 0 3px var(--color-focus-ring);
+
+ --shadow-overlay: 0 12px 32px rgba(0, 0, 0, 0.16);
+ --motion-duration-fast: 120ms;
+ --motion-duration-standard: 180ms;
+ --motion-easing-standard: cubic-bezier(0.2, 0, 0, 1);
}
.dark-mode {
@@ -148,6 +192,11 @@
--color-default-text: rgba(255, 255, 255, 0.87);
--color-secondary-text: #aaa;
+ --color-info-bg: #0b1f3f;
+ --color-success-bg: #0f2f1f;
+ --color-warning-bg: #3a2704;
+ --color-error-bg: #3a1111;
+
// only used for buttons
--color-warn: #b36161;
--color-tab-border: #cccccc;
diff --git a/ui/src/scss/sp/buttons-mat3.scss b/ui/src/scss/sp/buttons-mat3.scss
index 7e073ec758..a0264c3ca9 100644
--- a/ui/src/scss/sp/buttons-mat3.scss
+++ b/ui/src/scss/sp/buttons-mat3.scss
@@ -19,69 +19,268 @@
@use '@angular/material' as mat;
:root {
- .mat-mdc-icon-button .mat-mdc-button-persistent-ripple {
- border-radius: 6px;
- }
@include mat.button-overrides(
(
- filled-container-shape: 1.5rem,
- outlined-outline-color: var(--mat-sys-outline),
+ filled-container-shape: var(--radius-sm),
+ outlined-container-shape: var(--radius-sm),
+ outlined-outline-color: var(--color-border-default),
outlined-label-text-color: var(--mat-sys-on-surface),
- filled-label-text-weight: 400,
+ text-container-shape: var(--radius-sm),
+ filled-label-text-weight: var(--font-weight-medium),
+ outlined-label-text-weight: var(--font-weight-medium),
+ text-label-text-weight: var(--font-weight-medium),
filled-label-text-tracking: -0.01em,
outlined-label-text-tracking: -0.01em,
- text-container-shape: 6px,
text-label-text-tracking: -0.01em,
- filled-hover-state-layer-opacity: 0.2,
+ filled-hover-state-layer-opacity: 0,
+ filled-pressed-state-layer-opacity: 0,
+ outlined-hover-state-layer-opacity: 0.06,
+ text-hover-state-layer-opacity: 0.06,
)
);
- .btn-secondary {
- @include mat.button-overrides(
- (
- filled-container-color: var(--mat-sys-surface-container-high),
- filled-label-text-color: var(--mat-sys-secondary),
- text-hover-state-layer-opacity: 1,
- filled-label-text-weight: 400,
- )
+ @include mat.icon-button-overrides(
+ (
+ container-shape: var(--radius-sm),
+ icon-color: var(--color-primary),
+ state-layer-color: var(--color-primary),
+ hover-state-layer-opacity: 0.06,
+ focus-state-layer-opacity: 0.06,
+ pressed-state-layer-opacity: 0.1,
+ )
+ );
+
+ @include mat.button-toggle-overrides(
+ (
+ shape: var(--radius-sm),
+ height: 1.875rem,
+ background-color: var(--color-surface-interactive),
+ text-color: var(--mat-sys-on-surface-variant),
+ divider-color: var(--color-border-subtle),
+ selected-state-background-color: var(--color-surface-selected),
+ selected-state-text-color: var(--mat-sys-primary),
+ state-layer-color: var(--mat-sys-on-surface),
+ hover-state-layer-opacity: 0.06,
+ focus-state-layer-opacity: 0.06,
+ label-text-weight: var(--font-weight-medium),
+ label-text-tracking: -0.01em,
+ )
+ );
+
+ .mat-mdc-icon-button {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
+ padding: 0;
+ color: var(--mat-icon-button-icon-color);
+ background: transparent;
+ border: 1px solid transparent;
+ border-radius: var(--radius-sm);
+ transition:
+ background-color var(--motion-duration-fast)
+ var(--motion-easing-standard),
+ border-color var(--motion-duration-fast)
+ var(--motion-easing-standard);
+ }
+
+ .mat-mdc-icon-button .mat-icon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ margin: 0;
+ line-height: 1;
+ }
+
+ .mat-mdc-icon-button .mat-mdc-button-persistent-ripple {
+ border-radius: var(--radius-sm);
+ }
+
+ .mat-mdc-icon-button:hover:not(:disabled) {
+ background: color-mix(in srgb, currentColor 8%, transparent);
+ border-color: color-mix(in srgb, currentColor 14%, transparent);
+ }
+
+ .mat-mdc-icon-button:active:not(:disabled) {
+ background: color-mix(in srgb, currentColor 12%, transparent);
+ border-color: color-mix(in srgb, currentColor 20%, transparent);
+ }
+
+ .mat-mdc-icon-button[aria-pressed='true'],
+ .mat-mdc-icon-button.sp-navbar-icon-button-selected {
+ background: var(--color-surface-selected);
+ border-color: color-mix(
+ in srgb,
+ var(--mat-sys-primary) 18%,
+ transparent
);
}
- .btn-secondary-outline {
- border: 1px solid var(--color-primary);
+ .mat-mdc-icon-button:focus-visible {
+ outline: 2px solid var(--mat-sys-primary);
+ outline-offset: -2px;
+ box-shadow: none;
+ }
+
+ .mat-mdc-icon-button:disabled {
+ background: transparent;
+ border-color: transparent;
+ }
+
+ .mat-button-toggle-group {
+ border-color: var(--color-border-subtle);
+ border-radius: var(--radius-sm);
+ background: var(--color-surface-interactive);
+ }
+
+ .mat-button-toggle {
+ transition:
+ background-color var(--motion-duration-fast)
+ var(--motion-easing-standard),
+ color var(--motion-duration-fast) var(--motion-easing-standard);
+ }
+
+ .mat-button-toggle:hover:not(.mat-button-toggle-checked) {
+ background: var(--color-surface-interactive-hover);
+ }
+
+ .mat-button-toggle-checked:hover {
+ background: var(--color-surface-selected-hover);
+ }
+
+ .mat-button-toggle-button:focus-visible {
+ outline: 2px solid var(--mat-sys-primary);
+ outline-offset: -2px;
+ }
+
+ .mat-mdc-unelevated-button:not(.mat-basic):not(.btn-secondary):not(
+ .btn-secondary-outline
+ ):not(.btn-warn):hover:not(:disabled) {
+ --mat-button-filled-container-color: color-mix(
+ in srgb,
+ var(--color-primary) 88%,
+ white
+ );
+ background-color: var(--mat-button-filled-container-color);
+ }
+
+ .mat-mdc-unelevated-button:not(.mat-basic):not(.btn-secondary):not(
+ .btn-secondary-outline
+ ):not(.btn-warn):active:not(:disabled) {
+ --mat-button-filled-container-color: color-mix(
+ in srgb,
+ var(--color-primary) 82%,
+ white
+ );
+ background-color: var(--mat-button-filled-container-color);
+ }
+
+ .btn-secondary,
+ .mat-basic {
+ border: 1px solid transparent;
+
@include mat.button-overrides(
(
- filled-container-color: var(--mat-sys-surface-container-high),
- filled-label-text-color: var(--mat-sys-primary),
- text-hover-state-layer-opacity: 1,
- filled-label-text-weight: 400,
+ filled-container-color: color-mix(
+ in srgb,
+ var(--color-primary) 6%,
+ var(--color-bg-0)
+ ),
+ filled-label-text-color: var(--color-primary),
+ filled-state-layer-color: var(--color-primary),
+ filled-hover-state-layer-opacity: 0,
+ filled-pressed-state-layer-opacity: 0,
)
);
}
- .mat-basic {
- border: 1px solid var(--mat-sys-surface-container-high);
+ .btn-secondary:hover:not(:disabled),
+ .mat-basic:hover:not(:disabled) {
+ border-color: transparent;
+ background: color-mix(
+ in srgb,
+ var(--color-primary) 10%,
+ var(--color-bg-0)
+ );
+ }
+
+ .btn-secondary:active:not(:disabled),
+ .mat-basic:active:not(:disabled) {
+ border-color: transparent;
+ background: color-mix(
+ in srgb,
+ var(--color-primary) 12%,
+ var(--color-bg-0)
+ );
+ }
+
+ .btn-secondary-outline {
+ border: 1px solid var(--color-border-default);
+
@include mat.button-overrides(
(
- filled-container-color: var(--mat-sys-surface-container-high),
+ filled-container-color: transparent,
filled-label-text-color: var(--mat-sys-primary),
- text-hover-state-layer-opacity: 1,
- filled-label-text-weight: 400,
+ filled-state-layer-color: var(--mat-sys-primary),
+ filled-hover-state-layer-opacity: 0.06,
)
);
}
.btn-warn {
+ border: 1px solid transparent;
+
@include mat.button-overrides(
(
- filled-container-color: var(--mat-sys-error-container),
- filled-label-text-color: var(--mat-sys-on-error-container),
- text-hover-state-layer-opacity: 1,
- filled-label-text-weight: 400,
+ filled-container-color: color-mix(
+ in srgb,
+ var(--mat-sys-error) 7%,
+ var(--color-bg-0)
+ ),
+ filled-label-text-color: var(--mat-sys-error),
+ filled-state-layer-color: var(--mat-sys-error),
+ filled-hover-state-layer-opacity: 0,
+ filled-pressed-state-layer-opacity: 0,
)
);
}
+ .btn-warn:hover:not(:disabled) {
+ border-color: transparent;
+ background: color-mix(
+ in srgb,
+ var(--mat-sys-error) 11%,
+ var(--color-bg-0)
+ );
+ }
+
+ .btn-warn:active:not(:disabled) {
+ border-color: transparent;
+ background: color-mix(
+ in srgb,
+ var(--mat-sys-error) 14%,
+ var(--color-bg-0)
+ );
+ }
+
+ .mat-mdc-button-base {
+ transition:
+ background-color var(--motion-duration-fast)
+ var(--motion-easing-standard),
+ border-color var(--motion-duration-fast)
+ var(--motion-easing-standard),
+ box-shadow var(--motion-duration-fast)
var(--motion-easing-standard);
+ }
+
+ .mat-mdc-button-base:focus-visible {
+ outline: none;
+ box-shadow: var(--focus-ring);
+ }
+
+ .mat-mdc-button-base[disabled] {
+ border-color: transparent;
+ }
+
.mdc-button.small-button {
padding: 0.25rem 0.75rem;
font-size: var(--font-size-sm);
@@ -101,8 +300,9 @@
font-size: var(--font-size-sm);
max-height: 75px;
line-height: 25px;
- background: white;
- border: 1.5px solid var(--mat-sys-primary);
+ background: var(--mat-sys-surface);
+ border: 1px solid var(--color-border-default);
color: var(--mat-sys-primary);
+ border-radius: var(--radius-sm);
}
}
diff --git a/ui/src/scss/sp/dialog.scss b/ui/src/scss/sp/dialog.scss
index 162bca8303..ce33757f95 100644
--- a/ui/src/scss/sp/dialog.scss
+++ b/ui/src/scss/sp/dialog.scss
@@ -19,13 +19,11 @@
@use './variables';
.sp-no-padding-dialog .mat-dialog-container {
- box-shadow:
- 0 11px 15px -7px rgba(0, 0, 0, 0.2),
- 0 24px 38px 3px rgba(0, 0, 0, 0.14),
- 0 9px 46px 8px rgba(0, 0, 0, 0.12);
+ box-shadow: var(--shadow-overlay);
display: block;
- padding: 0px;
- border-radius: 2px;
+ padding: 0;
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-md);
box-sizing: border-box;
overflow: auto;
outline: 0;
@@ -34,13 +32,11 @@
}
.sp.no-padding-dialog .mat-dialog-container .md-dialog {
- box-shadow:
- 0 11px 15px -7px rgba(0, 0, 0, 0.2),
- 0 24px 38px 3px rgba(0, 0, 0, 0.14),
- 0 9px 46px 8px rgba(0, 0, 0, 0.12);
+ box-shadow: var(--shadow-overlay);
display: block;
- padding: 0px;
- border-radius: 2px;
+ padding: 0;
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-md);
box-sizing: border-box;
overflow: auto;
outline: 0;
@@ -49,8 +45,9 @@
}
.sp-no-padding-dialog .mat-dialog-container .md-dialog .md-toolbar {
- background: var(--color-secondary);
- color: white;
+ background: var(--mat-sys-surface);
+ color: var(--mat-sys-on-surface);
+ border-bottom: 1px solid var(--color-border-subtle);
}
.sp-no-padding-dialog .mat-dialog-container .md-dialog .md-dialog-content {
@@ -76,10 +73,11 @@
padding-left: 16px;
min-height: 52px;
overflow: hidden;
- border-top: 1px solid #cccccc;
+ border-top: 1px solid var(--color-border-subtle);
}
.custom-dialog-container .mat-dialog-container {
- padding: 0px;
+ padding: 0;
overflow: auto;
+ border-radius: var(--radius-md);
}
diff --git a/ui/src/scss/sp/forms-mat3.scss b/ui/src/scss/sp/forms-mat3.scss
index e8d4f5d9ec..ca58139f33 100644
--- a/ui/src/scss/sp/forms-mat3.scss
+++ b/ui/src/scss/sp/forms-mat3.scss
@@ -23,13 +23,9 @@
(
container-height: 2.5rem,
container-vertical-padding: 0.5rem,
- outlined-container-shape: 2px,
- outlined-outline-color: var(--mat-sys-surface-container-highest),
- outlined-hover-outline-color: color-mix(
- in srgb,
- var(--mat-sys-outline) 85%,
- #000 0%
- ),
+ outlined-container-shape: var(--radius-sm),
+ outlined-outline-color: var(--color-border-subtle),
+ outlined-hover-outline-color: var(--color-border-strong),
outlined-focus-outline-color: var(--mat-sys-primary),
outlined-label-text-color: var(--mat-sys-on-surface-variant),
outlined-caret-color: var(--mat-sys-primary),
@@ -41,4 +37,31 @@
),
)
);
+
+ .mat-mdc-form-field {
+ transition: filter var(--motion-duration-fast)
+ var(--motion-easing-standard);
+ }
+
+ .mat-mdc-form-field .mdc-text-field--outlined {
+ background-color: var(--color-surface-interactive);
+ border-radius: var(--radius-sm);
+ transition:
+ background-color var(--motion-duration-fast)
+ var(--motion-easing-standard),
+ box-shadow var(--motion-duration-fast)
var(--motion-easing-standard);
+ }
+
+ .mat-mdc-form-field:hover .mdc-text-field--outlined {
+ background-color: var(--color-surface-interactive-hover);
+ }
+
+ .mat-mdc-form-field:has(.mdc-text-field--focused)
+ .mdc-text-field--outlined {
+ background-color: var(--mat-sys-surface);
+ }
+
+ .mat-mdc-form-field.mat-form-field-disabled {
+ filter: saturate(0.7);
+ }
}
diff --git a/ui/src/scss/sp/main.scss b/ui/src/scss/sp/main.scss
index a1b5ad3b0f..e5d0bb9f30 100644
--- a/ui/src/scss/sp/main.scss
+++ b/ui/src/scss/sp/main.scss
@@ -33,11 +33,11 @@ html {
}
md-progress-linear.md-accent .md-container {
- background-color: rgb(168, 168, 168);
+ background-color: var(--color-surface-interactive-active);
}
.stream-endpoint {
- background: green;
+ background: var(--color-success);
}
.gu-mirror {
@@ -75,15 +75,12 @@ pre[class*='language-'] {
top: 40px;
z-index: 1;
background: var(--color-bg-dialog);
- border: 2px solid var(--color-warn);
- border-radius: 5px;
+ border: 1px solid color-mix(in srgb, var(--color-error) 38%, transparent);
+ border-radius: var(--radius-sm);
width: 300px;
color: var(--color-default-text);
- padding: 5px;
- box-shadow:
- 0px 7px 8px -4px rgba(0, 0, 0, 0.2),
- 0px 13px 19px 2px rgba(0, 0, 0, 0.14),
- 0px 5px 24px 4px rgba(0, 0, 0, 0.12);
+ padding: var(--space-xs);
+ box-shadow: var(--shadow-overlay);
}
.mat-step-header .mat-step-icon {
@@ -122,7 +119,7 @@ md-toolbar:not(.md-menu-toolbar) {
width: 0;
height: 0;
border: 20px solid transparent;
- border-bottom-color: rgb(63, 81, 181);
+ border-bottom-color: var(--color-primary);
border-top: 0;
border-left: 0;
margin-left: -10px;
@@ -173,9 +170,9 @@ md-content {
left: 0px;
width: 100%;
/* styling bellow */
- background-color: rgb(63, 81, 181);
- font-size: 15px;
- color: white;
+ background-color: var(--color-primary);
+ font-size: var(--font-size-sm);
+ color: var(--mat-sys-on-primary);
opacity: 0.9; /* transparency */
filter: alpha(opacity=90); /* IE transparency */
align-items: center;
@@ -191,7 +188,7 @@ md-content {
left: 10%;
margin-right: auto;
height: 0px;
- background-color: #ccc;
+ background-color: var(--color-border-default);
z-order: 0;
}
@@ -201,7 +198,7 @@ md-content {
}
.wizard-row-stream:before {
- border-top: 1px solid #ccc;
+ border-top: 1px solid var(--color-border-default);
content: '';
margin: 0 auto; /* this centers the line to the full width specified */
position: absolute; /* positioning must be absolute here, and relative
positioning must be applied to the parent */
@@ -216,14 +213,14 @@ md-content {
.wizard-inactive {
background-color: var(--color-bg-0) !important;
color: var(--color-default-text) !important;
- border: 2px solid var(--color-primary) !important;
+ border: 1px solid var(--color-primary) !important;
}
.popover {
- border: 1px solid var(--color-primary);
- box-shadow: 0 0px 0px;
+ border: 1px solid var(--color-border-subtle);
+ box-shadow: none;
-webkit-bow-shadow: none;
- border-radius: 0px;
+ border-radius: var(--radius-sm);
padding: 0px;
}
@@ -233,8 +230,8 @@ md-content {
.popover-title {
background-color: var(--color-primary);
- color: white;
- border-radius: 0px 0px 0 0;
+ color: var(--mat-sys-on-primary);
+ border-radius: var(--radius-sm) var(--radius-sm) 0 0;
}
.full-background {
@@ -242,12 +239,9 @@ md-content {
}
.box-shadow-login {
- border: 1px solid #e0e0e0;
- border-radius: 5px;
- box-shadow:
- 0px 1px 8px 0px rgba(0, 0, 0, 0.2),
- 0px 1px 4px 0px rgba(0, 0, 0, 0.14),
- 0px 2px 4px -1px rgba(0, 0, 0, 0.12);
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-md);
+ box-shadow: var(--shadow-overlay);
}
.circle {
@@ -255,7 +249,7 @@ md-content {
width: 150px;
height: 150px;
font-size: 40px;
- color: #fff;
+ color: var(--mat-sys-on-primary);
line-height: 150px;
text-align: center;
}
@@ -266,7 +260,7 @@ md-content {
}
.customize-item-main {
- border-radius: 5px;
+ border-radius: var(--radius-sm);
margin: 5px;
}
@@ -286,8 +280,8 @@ md-content {
}
.tree-node {
- border: 1px solid var(--color-bg-3);
- border-radius: 5px;
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-sm);
background: var(--color-bg-0);
color: var(--color-primary);
margin: 5px;
@@ -305,7 +299,7 @@ md-content {
position: absolute;
right: 16px;
top: 25px;
- color: #ffffff;
+ color: var(--mat-sys-on-primary);
background-color: var(--color-primary);
vertical-align: middle;
}
@@ -346,7 +340,9 @@ md-content {
width: 50px;
min-width: 50px;
line-height: 50px;
- box-shadow: 1px 1px 2px #555;
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-sm);
+ box-shadow: none;
text-align: center;
}
@@ -360,19 +356,20 @@ md-content {
line-height: 70px;
margin-left: 3%;
margin-top: 5px;
- box-shadow: 1px 1px 2px var(--color-shadow);
+ border-radius: var(--radius-sm);
+ box-shadow: none;
text-align: center;
z-index: 200;
}
.pe-label {
- color: white;
+ color: var(--mat-sys-on-primary);
padding: 2px 5px;
}
.adapter-label {
background: var(--color-adapter);
- color: white;
+ color: var(--mat-sys-on-primary);
}
.stream-label {
@@ -409,7 +406,7 @@ md-content {
.draggable-img {
height: 50px;
width: 50px;
- color: #d22;
+ color: var(--color-error);
}
.sepa > .draggable-img {
@@ -423,11 +420,11 @@ md-content {
}
.ui-selectable-helper {
- background: rgba(51, 200, 51, 0.5);
+ background: color-mix(in srgb, var(--color-success) 22%, transparent);
}
.ui-selected {
- box-shadow: 0 0 10px #33dd33 !important;
+ box-shadow: 0 0 0 2px var(--color-success) !important;
}
.draggable-img-dragging {
@@ -440,13 +437,13 @@ md-content {
}
.assemblyOptions {
- color: white;
+ color: var(--mat-sys-on-primary);
padding: 5px;
margin-top: 1%;
}
.assembly-options-preview {
- color: white;
+ color: var(--mat-sys-on-primary);
padding: 5px;
}
@@ -477,7 +474,7 @@ md-content {
}
.shadow {
- box-shadow: 0 0 5px #333;
+ box-shadow: var(--shadow-overlay);
}
._jsPlumb_endpoint {
@@ -487,7 +484,10 @@ md-content {
.connectable {
cursor: move;
position: absolute;
- box-shadow: 0 0 2px #555;
+ box-sizing: border-box;
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-sm);
+ box-shadow: none;
display: inline-block;
vertical-align: middle;
background-color: var(--color-pe);
@@ -508,11 +508,29 @@ md-content {
line-height: 70px;
}
+.connectable.stream {
+ border: 2px solid var(--color-data-source);
+ border-radius: 50%;
+ background-color: var(--color-pe);
+}
+
+.connectable.sepa {
+ border: 2px solid var(--color-processor);
+ background-color: var(--color-pe);
+}
+
+.connectable.action {
+ border: 2px solid var(--color-sink);
+ background-color: var(--color-pe);
+}
+
.connectable-element {
cursor: move;
height: 150px !important;
width: 150px !important;
- box-shadow: 0 0 2px var(--color-primary);
+ border: 1px solid color-mix(in srgb, var(--color-primary) 28%,
transparent);
+ border-radius: var(--radius-sm);
+ box-shadow: none;
display: inline-block;
vertical-align: middle;
background-color: var(--color-pe);
@@ -527,7 +545,7 @@ md-content {
}
.connectable-img {
- color: #d22;
+ color: var(--color-error);
font-size: 80px;
/*margin-top: 14%;*/
/*margin-left: 14%;*/
@@ -548,7 +566,8 @@ md-content {
height: 40%;
width: 40%;
background-color: var(--color-bg-0);
- box-shadow: 0 0 2px #555;
+ border: 1px solid var(--color-border-subtle);
+ box-shadow: none;
line-height: 1.6;
border-radius: 50%;
}
@@ -562,13 +581,15 @@ md-content {
}
.recommended-item {
- box-shadow: 0 0 2px #555;
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-sm);
+ box-shadow: none;
background-color: var(--color-bg-0);
cursor: pointer;
}
.recommended-item:hover {
- box-shadow: 0 0 5px #555;
+ background-color: var(--color-surface-interactive-hover);
}
.recommended-item-img {
@@ -582,11 +603,11 @@ md-content {
}
.green {
- color: rgba(51, 200, 51, 0.5);
+ color: color-mix(in srgb, var(--color-success) 70%, transparent);
}
.red {
- color: rgba(200, 51, 51, 0.5);
+ color: color-mix(in srgb, var(--color-error) 70%, transparent);
}
ul.circleMenu-open {
@@ -619,7 +640,7 @@ ul.circleMenu-closed {
}
.ui-draggable-dragging {
- box-shadow: 0 0 8px black;
+ box-shadow: var(--shadow-overlay);
}
#submit {
@@ -646,17 +667,17 @@ h4.panel-title {
}
.disabled {
- border: 2px solid red;
+ border: 1px solid var(--color-error);
}
.endpoint-token svg rect {
- fill: rgb(63, 81, 181);
- stroke: rgb(63, 81, 181);
+ fill: var(--color-primary);
+ stroke: var(--color-primary);
}
.endpoint-empty svg rect {
- fill: white;
- stroke: rgb(63, 81, 181);
+ fill: var(--color-bg-0);
+ stroke: var(--color-primary);
stroke-width: 4;
}
@@ -681,7 +702,7 @@ textarea {
padding-left: 10px;
margin-top: 3px;
margin-bottom: 3px;
- background: #dfdfdf5e;
+ background: var(--color-surface-interactive);
border-left: 1px solid var(--color-primary);
}
@@ -690,12 +711,11 @@ label {
}
.error-message {
- background-color: black;
+ background-color: var(--color-code-bg);
font:
0.7rem Inconsolata,
monospace;
- text-shadow: 0 0 5px #c8c8c8;
- color: white;
+ color: var(--mat-sys-on-surface);
width: 100%;
max-width: 100%;
}
diff --git a/ui/src/scss/sp/mat-tab.scss b/ui/src/scss/sp/mat-tab.scss
index 912850e62d..1660e66dd5 100644
--- a/ui/src/scss/sp/mat-tab.scss
+++ b/ui/src/scss/sp/mat-tab.scss
@@ -16,13 +16,51 @@
*
*/
-.mdc-tab__text-label {
- color: rgba(0, 0, 0, 0.87);
+.mat-mdc-tab-group {
+ --mat-tab-active-indicator-color: var(--mat-sys-primary);
+ --mat-tab-active-label-text-color: var(--mat-sys-primary);
+ --mat-tab-active-focus-label-text-color: var(--mat-sys-primary);
+ --mat-tab-active-hover-label-text-color: var(--mat-sys-primary);
+ --mat-tab-inactive-label-text-color: var(--mat-sys-on-surface-variant);
+ --mat-tab-inactive-focus-label-text-color: var(--mat-sys-on-surface);
+ --mat-tab-inactive-hover-label-text-color: var(--mat-sys-on-surface);
+ --mat-tab-divider-color: var(--color-border-subtle);
+}
+
+.mat-mdc-tab {
+ border-radius: var(--radius-xs) var(--radius-xs) 0 0;
+ transition:
+ background-color var(--motion-duration-fast)
+ var(--motion-easing-standard),
+ color var(--motion-duration-fast) var(--motion-easing-standard);
+}
+
+.mat-mdc-tab:hover {
+ background: color-mix(in srgb, var(--mat-sys-on-surface) 4%, transparent);
+}
+
+.mat-mdc-tab.mdc-tab--active {
+ background: transparent;
+}
+
+.mat-mdc-tab.mdc-tab--active:hover {
+ background: color-mix(in srgb, var(--mat-sys-primary) 5%, transparent);
+}
+
+.mat-mdc-tab:focus-visible {
+ outline: none;
+ box-shadow: inset 0 0 0 2px var(--color-focus-ring);
+}
+
+.mat-mdc-tab .mdc-tab-indicator__content--underline {
+ border-top-width: 2px;
+ border-radius: var(--radius-pill);
}
.mat-mdc-tab-group.small-tab-headers .mdc-tab__text-label {
height: 32px;
- font-size: 10pt;
+ font-size: var(--font-size-sm);
+ font-weight: var(--font-weight-medium);
}
.mat-mdc-tab-group.mat-tab-fill-height .mat-mdc-tab-body-wrapper {
diff --git a/ui/src/scss/sp/pipeline-element-options.scss
b/ui/src/scss/sp/pipeline-element-options.scss
index fbe5db8183..f3bf539418 100644
--- a/ui/src/scss/sp/pipeline-element-options.scss
+++ b/ui/src/scss/sp/pipeline-element-options.scss
@@ -23,51 +23,47 @@
width: 20px;
border-radius: 50%;
background-color: var(--color-primary);
- color: rgba(255, 255, 255, 0.75);
- box-shadow: 0 0 2px var(--color-primary);
+ color: var(--mat-sys-on-primary);
+ box-shadow: none;
line-height: 1.2;
text-align: center;
}
.editor-pe-info {
position: absolute;
- left: 0%;
- top: 50%;
- width: 106%;
- padding: 50px 0 10px;
- font-size: smaller;
+ left: 50%;
+ top: calc(100% + var(--space-2xs));
+ transform: translateX(-50%);
+ box-sizing: border-box;
+ min-width: 6.5rem;
+ max-width: 9rem;
+ padding: var(--space-xs) var(--space-sm);
+ border-radius: var(--radius-sm);
+ font-size: var(--font-size-xs);
+ font-weight: var(--font-weight-semibold);
+ line-height: 1.22;
text-align: center;
- box-shadow: 0 0 2px #555;
- -webkit-animation: slidein 0.5s;
overflow: hidden;
- text-overflow: ellipsis;
- display: block;
-}
-
-@keyframes slidein {
- 0% {
- top: 0;
- border-top-left-radius: 50%;
- border-top-right-radius: 50%;
- }
- 100% {
- top: 50%;
- border-top-left-radius: 0;
- border-top-right-radius: 0;
- }
+ overflow-wrap: anywhere;
+ hyphens: auto;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 4;
+ border: 1px solid transparent;
+ box-shadow: none;
}
.pe-info-action {
background: var(--color-sink);
- color: white;
+ color: #ffffff;
}
.pe-info-sepa {
background: var(--color-processor);
- color: white;
+ color: #ffffff;
}
.pe-info-stream {
background: var(--color-data-source);
- color: #343434;
+ color: #1f1f1f;
}
diff --git a/ui/src/scss/sp/sp-dialog.scss b/ui/src/scss/sp/sp-dialog.scss
index 976b8fb023..23a6a26fba 100644
--- a/ui/src/scss/sp/sp-dialog.scss
+++ b/ui/src/scss/sp/sp-dialog.scss
@@ -19,17 +19,25 @@
.sp-dialog-container {
display: grid;
height: 100%;
- grid-template-rows: auto 10px 60px;
+ grid-template-rows: minmax(0, 1fr) auto auto;
+ background: var(--mat-sys-surface);
+ color: var(--mat-sys-on-surface);
}
.sp-dialog-content {
- margin: 0px;
+ margin: 0;
overflow-y: auto;
flex: 1 1 auto;
}
.sp-dialog-actions {
- padding: 10px;
+ min-height: 3.75rem;
+ padding: var(--space-sm) var(--space-lg);
+ border-top: 1px solid var(--color-border-subtle);
+ background: var(--mat-sys-surface);
+ display: flex;
+ align-items: center;
+ gap: var(--space-sm);
}
.actions-align-right {
@@ -37,5 +45,5 @@
}
.p-15 {
- padding: 15px;
+ padding: var(--space-lg);
}
diff --git a/ui/src/scss/sp/sp-theme.scss b/ui/src/scss/sp/sp-theme.scss
index 64711cf114..7406dad58f 100644
--- a/ui/src/scss/sp/sp-theme.scss
+++ b/ui/src/scss/sp/sp-theme.scss
@@ -66,12 +66,125 @@ html {
)
);
+ @include mat.table-overrides(
+ (
+ background-color: var(--mat-sys-surface),
+ header-headline-color: var(--mat-sys-on-surface),
+ header-headline-weight: var(--font-weight-semibold),
+ row-item-label-text-color: var(--mat-sys-on-surface),
+ row-item-outline-color: color-mix(
+ in srgb,
+ var(--mat-sys-on-surface) 10%,
+ transparent
+ ),
+ )
+ );
+
+ @include mat.paginator-overrides(
+ (
+ container-background-color: transparent,
+ container-text-color: var(--mat-sys-on-surface-variant),
+ enabled-icon-color: var(--color-primary),
+ container-size: 2.5rem,
+ form-field-container-height: 1.875rem,
+ form-field-container-vertical-padding: 0,
+ page-size-select-touch-target-height: 1.875rem,
+ select-trigger-text-size: var(--font-size-sm),
+ )
+ );
+
+ @include mat.dialog-overrides(
+ (
+ container-color: var(--mat-sys-surface),
+ container-shape: var(--radius-md),
+ container-elevation-shadow: var(--shadow-overlay),
+ subhead-color: var(--mat-sys-on-surface),
+ subhead-weight: var(--font-weight-semibold),
+ supporting-text-color: var(--mat-sys-on-surface-variant),
+ actions-padding: var(--space-sm) var(--space-lg),
+ content-padding: var(--space-lg),
+ )
+ );
+
+ @include mat.menu-overrides(
+ (
+ container-color: var(--mat-sys-surface),
+ container-shape: var(--radius-sm),
+ container-elevation-shadow: var(--shadow-overlay),
+ divider-color: var(--color-border-subtle),
+ divider-bottom-spacing: var(--space-xs),
+ divider-top-spacing: var(--space-xs),
+ item-icon-size: 1.125rem,
+ item-spacing: var(--space-xs),
+ item-leading-spacing: var(--space-sm),
+ item-trailing-spacing: var(--space-sm),
+ item-with-icon-leading-spacing: var(--space-sm),
+ item-with-icon-trailing-spacing: var(--space-sm),
+ item-label-text-color: var(--mat-sys-on-surface),
+ item-icon-color: var(--color-primary),
+ item-hover-state-layer-color: color-mix(
+ in srgb,
+ var(--color-primary) 8%,
+ transparent
+ ),
+ item-focus-state-layer-color: color-mix(
+ in srgb,
+ var(--color-primary) 10%,
+ transparent
+ ),
+ item-label-text-size: var(--font-size-sm),
+ item-label-text-line-height: 1.25rem,
+ item-label-text-weight: var(--font-weight-medium),
+ item-label-text-tracking: -0.01em,
+ )
+ );
+
+ .mat-mdc-menu-panel {
+ min-width: 10rem;
+ border: 1px solid var(--color-border-subtle);
+ overflow: hidden;
+ }
+
+ .mat-mdc-menu-content {
+ padding: var(--space-xs) 0;
+ }
+
+ .mat-mdc-menu-item {
+ width: calc(100% - (var(--space-xs) + var(--space-xs)));
+ min-height: 2.25rem;
+ box-sizing: border-box;
+ border-radius: var(--radius-xs);
+ margin: 0 var(--space-xs);
+ transition:
+ background-color var(--motion-duration-fast)
+ var(--motion-easing-standard),
+ color var(--motion-duration-fast) var(--motion-easing-standard);
+ }
+
+ .mat-mdc-menu-item .mat-icon {
+ width: 1.125rem;
+ height: 1.125rem;
+ margin-right: var(--space-xs);
+ font-size: 1.125rem;
+ line-height: 1;
+ }
+
+ .mat-mdc-menu-item-text {
+ line-height: 1.25rem;
+ }
+
+ .mat-mdc-menu-item:hover:not([disabled]),
+ .mat-mdc-menu-item.cdk-focused:not([disabled]),
+ .mat-mdc-menu-item.mat-mdc-menu-item-highlighted:not([disabled]) {
+ color: var(--color-primary);
+ }
+
&.dark-mode {
@include mat.theme-overrides(
(
primary: var(--color-primary),
secondary: var(--color-secondary),
- on-primary: #fff,
+ on-primary: #121212,
primary-container: mat.get-theme-color(
mat3theme.$palettes,
primary,