diff --git a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-browse.component.html b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-browse.component.html
index 94b1ce7940..a1e69167ec 100644
--- a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-browse.component.html
+++ b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-browse.component.html
@@ -55,6 +55,7 @@
+
@if (getSubtypeMap(); as subtypeMap) {
@@ -71,6 +72,9 @@
}
@if (categories.size > 0) {
+ @if (getSubtypeMap()) {
+
+ }
{{ 'iot-hub.category' | translate }}
@@ -84,6 +88,9 @@
}
+ @if (getSubtypeMap() || categories.size > 0) {
+
+ }
{{ 'iot-hub.use-case' | translate }}
@@ -96,6 +103,7 @@
}
+
@@ -105,47 +113,47 @@
{{ 'iot-hub.results-count' | translate:{ count: totalElements } }}
-
- search
-
+ search
+
@if (textSearch) {
-
+
@if (hasActiveDropdownFilters()) {
-
+
@for (key of getActiveSubtypesArray(); track key) {
-
+
{{ getSubtypeLabel(key) }}
- close
-
+ close
+
}
@for (key of getActiveCategoriesArray(); track key) {
-
+
{{ getCategoryLabel(key) }}
- close
-
+ close
+
}
@for (key of getActiveUseCasesArray(); track key) {
-
+
{{ getUseCaseLabel(key) }}
- close
-
+ close
+
}
-
- {{ 'iot-hub.clear-all-filters' | translate }}
-
-
+
+
+ {{ 'iot-hub.clear-all' | translate }}
+
}
diff --git a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-browse.component.scss b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-browse.component.scss
index d228a5f2e6..93b66b7c80 100644
--- a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-browse.component.scss
+++ b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-browse.component.scss
@@ -14,10 +14,10 @@
* limitations under the License.
*/
+@import "../../../../../scss/constants";
+
:host {
- display: flex;
- flex-direction: column;
- height: 100%;
+ display: block;
}
.tb-iot-hub-browse {
@@ -26,17 +26,17 @@
height: 100%;
}
-// Tabs — Design: px-40, border-bottom
+// Tabs — Design: px-40, bottom border rgba(0,0,0,0.12)
.tb-iot-hub-tabs {
padding: 0 40px;
flex-shrink: 0;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.12);
}
// Two-column layout below tabs
.tb-iot-hub-content {
display: flex;
flex: 1;
- min-height: 0;
}
// Left sidebar filters — Design: 280px wide, right border, own scroll
@@ -44,6 +44,12 @@
width: 280px;
flex-shrink: 0;
border-right: 1px solid rgba(0, 0, 0, 0.12);
+ position: relative;
+}
+
+.tb-iot-hub-filters-wrapper {
+ position: absolute;
+ inset: 0;
overflow-y: auto;
}
@@ -54,33 +60,37 @@
padding: 24px 0;
}
-// Filter expansion panels — Design: no border, no shadow, pl-40 for content
-.tb-iot-hub-filter-panel {
- ::ng-deep {
- &.mat-expansion-panel {
- box-shadow: none !important;
- border-radius: 0 !important;
- background: transparent;
- }
+// Filter divider between sections
+.tb-iot-hub-filter-divider {
+ height: 1px;
+ background: rgba(0, 0, 0, 0.12);
+}
- .mat-expansion-panel-header {
- padding: 8px 16px 8px 40px;
- }
+// Filter expansion panels — Design: no shadow, pl-40 for content
+.tb-iot-hub-filter-panel.mat-expansion-panel {
+ box-shadow: none;
+ border-radius: 0;
+ background: transparent;
- .mat-expansion-panel-header-title {
- font-size: 14px;
- font-weight: 500;
- color: rgba(0, 0, 0, 0.87);
- }
+ .mat-expansion-panel-header {
+ padding: 8px 16px 8px 40px;
+ height: 40px;
+ min-height: 40px;
+ }
- .mat-expansion-panel-body {
- padding: 0;
- }
+ ::ng-deep .mat-expansion-panel-header-title {
+ font-size: 14px;
+ font-weight: 500;
+ color: rgba(0, 0, 0, 0.87);
+ }
+
+ ::ng-deep .mat-expansion-panel-body {
+ padding: 0;
}
mat-checkbox {
display: block;
- padding: 8px 16px 8px 40px;
+ padding: 0 0 0 28px;
&:hover {
background: rgba(0, 0, 0, 0.04);
@@ -107,16 +117,64 @@
flex-shrink: 0;
}
+// Results count — Design: 14px Medium, rgba(0,0,0,0.76), tracking 0.25
.tb-iot-hub-results-count {
font-size: 14px;
- color: rgba(0, 0, 0, 0.54);
+ font-weight: 500;
+ line-height: 20px;
+ letter-spacing: 0.25px;
+ color: rgba(0, 0, 0, 0.76);
}
+// Search field — Design: 320px, h-40, rounded-8, border rgba(0,0,0,0.12), white bg
.tb-iot-hub-search-field {
- width: 240px;
+ width: 320px;
+ height: 40px;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 8px 12px;
+ border-radius: 8px;
+ border: 1px solid rgba(0, 0, 0, 0.12);
+ background: white;
+}
+
+.tb-iot-hub-search-icon {
+ font-size: 24px;
+ width: 24px;
+ height: 24px;
+ color: rgba(0, 0, 0, 0.38);
+ flex-shrink: 0;
+}
+
+.tb-iot-hub-search-input {
+ flex: 1;
+ border: none;
+ outline: none;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 20px;
+ color: rgba(0, 0, 0, 0.87);
+ background: transparent;
+ font-family: inherit;
- .mat-mdc-form-field-subscript-wrapper {
- display: none;
+ &::placeholder {
+ color: rgba(0, 0, 0, 0.38);
+ }
+}
+
+.tb-iot-hub-search-clear.mat-mdc-icon-button {
+ width: 24px;
+ height: 24px;
+ padding: 0;
+ flex-shrink: 0;
+ color: rgba(0, 0, 0, 0.38);
+ --mdc-icon-button-state-layer-size: 24px;
+
+ mat-icon {
+ font-size: 18px;
+ width: 18px;
+ height: 18px;
}
}
@@ -134,50 +192,32 @@
flex: 1;
}
+// Sort button — Design: 14px Medium, primary color, with filter_list icon
.tb-iot-hub-sort-btn {
- color: rgba(0, 0, 0, 0.54);
+ color: $tb-primary-color;
flex-shrink: 0;
+ font-size: 14px;
+ font-weight: 500;
}
-// Active filter chips
+// Active filter chips — Design: mat-chip-set, gap-8, chip bg rgba(0,0,0,0.04)
.tb-iot-hub-active-filters {
- display: flex;
- align-items: center;
- gap: 8px;
- flex-wrap: wrap;
-}
+ display: inline;
-.tb-iot-hub-active-chip {
- display: inline-flex;
- align-items: center;
- gap: 4px;
- padding: 4px 8px;
- border-radius: 4px;
- font-size: 12px;
- font-weight: 500;
- background: rgba(0, 0, 0, 0.06);
- color: rgba(0, 0, 0, 0.76);
- cursor: pointer;
- white-space: nowrap;
-
- mat-icon {
- font-size: 14px;
- width: 14px;
- height: 14px;
- }
-
- &:hover {
- background: rgba(0, 0, 0, 0.1);
+ .mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) {
+ --mat-chip-elevated-container-color: rgba(0, 0, 0, 0.04);
}
}
+// Clear all button — Design: 14px Regular, rgba(0,0,0,0.54)
.tb-iot-hub-clear-btn {
- font-size: 12px;
+ font-size: 14px;
+ font-weight: 400;
color: rgba(0, 0, 0, 0.54);
cursor: pointer;
background: none;
border: none;
- padding: 4px 8px;
+ padding: 6px 8px;
font-family: inherit;
&:hover {
diff --git a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-creator-profile.component.html b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-creator-profile.component.html
index 16a31f5bc4..62bac84619 100644
--- a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-creator-profile.component.html
+++ b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-creator-profile.component.html
@@ -15,64 +15,67 @@
limitations under the License.
-->
-
-
- arrow_back
+
+
+
+ chevron_left
{{ 'iot-hub.back-to-iot-hub' | translate }}
@if (creator) {
-
-