Browse Source

Add IoT Hub home page with interactive hero, category cards, and popular items

- Create TbIotHubHomeComponent as default route at /iot-hub
- Move browse page to /iot-hub/browse, accept type/search query params
- Interactive hero: hoverable keywords cycle through item types with color changes,
  background gradient transitions, and floating icon animations
- Page load animation: hero and categories fade in with slide (down/up)
- Category cards: 3x2 grid with exact Figma gradients and separated title/image layout
- Popular sections: 5-column grid for widgets/dashboards/solutions,
  3-column grid for calculated fields/rule chains
- Become a Creator footer section
- Export category card images and hero floating icons from Figma
- Add plural item type translations and home page locale keys
pull/15347/head
Igor Kulikov 3 months ago
parent
commit
7651647050
  1. 14
      ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-browse.component.ts
  2. 200
      ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-home.component.html
  3. 419
      ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-home.component.scss
  4. 222
      ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-home.component.ts
  5. 15
      ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-routing.module.ts
  6. 2
      ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub.module.ts
  7. 233
      ui-ngx/src/assets/iot-hub/category-calculated-fields-img.svg
  8. 84
      ui-ngx/src/assets/iot-hub/category-dashboards-img.svg
  9. 95
      ui-ngx/src/assets/iot-hub/category-device-library-img.svg
  10. 107
      ui-ngx/src/assets/iot-hub/category-rule-chains-img.svg
  11. BIN
      ui-ngx/src/assets/iot-hub/category-solution-templates-img.png
  12. 181
      ui-ngx/src/assets/iot-hub/category-widgets-img.svg
  13. 30
      ui-ngx/src/assets/iot-hub/hero-dashboard-icon-1.svg
  14. 25
      ui-ngx/src/assets/iot-hub/hero-dashboard-icon-2.svg
  15. 30
      ui-ngx/src/assets/iot-hub/hero-dashboard-icon-3.svg
  16. 30
      ui-ngx/src/assets/iot-hub/hero-dashboard-icon-4.svg
  17. 27
      ui-ngx/src/assets/iot-hub/hero-widget-icon-1.svg
  18. 25
      ui-ngx/src/assets/iot-hub/hero-widget-icon-2.svg
  19. 35
      ui-ngx/src/assets/iot-hub/hero-widget-icon-3.svg
  20. 35
      ui-ngx/src/assets/iot-hub/hero-widget-icon-4.svg
  21. 20
      ui-ngx/src/assets/locale/locale.constant-en_US.json

14
ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-browse.component.ts

@ -30,7 +30,7 @@ import { IotHubInstalledItem } from '@shared/models/iot-hub/iot-hub-installed-it
import { IotHubApiService } from '@core/http/iot-hub-api.service';
import { MatDialog } from '@angular/material/dialog';
import { TranslateService } from '@ngx-translate/core';
import { Router } from '@angular/router';
import { ActivatedRoute, Router } from '@angular/router';
import { TbIotHubItemDetailDialogComponent, IotHubItemDetailDialogData } from './iot-hub-item-detail-dialog.component';
import { TbIotHubInstallDialogComponent, IotHubInstallDialogData } from './iot-hub-install-dialog.component';
import { TbIotHubUpdateDialogComponent, IotHubUpdateDialogData } from './iot-hub-update-dialog.component';
@ -101,7 +101,8 @@ export class TbIotHubBrowseComponent implements OnInit, OnDestroy {
private iotHubApiService: IotHubApiService,
private dialog: MatDialog,
private translate: TranslateService,
private router: Router
private router: Router,
private route: ActivatedRoute
) {}
ngOnInit(): void {
@ -112,6 +113,15 @@ export class TbIotHubBrowseComponent implements OnInit, OnDestroy {
this.pageIndex = 0;
this.loadItems();
});
if (!this.embedded) {
const params = this.route.snapshot.queryParams;
if (params['type'] && Object.values(ItemType).includes(params['type'])) {
this.activeType = params['type'] as ItemType;
}
if (params['search']) {
this.textSearch = params['search'];
}
}
this.updateCategories();
this.loadItems();
}

200
ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-home.component.html

@ -0,0 +1,200 @@
<!--
Copyright © 2016-2026 The Thingsboard Authors
Licensed 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.
-->
<div class="tb-iot-hub-home">
<!-- Hero section -->
<div class="tb-iot-hub-hero">
<!-- Background gradient overlay -->
<div class="tb-iot-hub-hero-gradient"
[style.background]="'radial-gradient(ellipse at 50% 0%, ' + activeHeroType.gradientColor + ' 0%, transparent 60%)'"></div>
<!-- Floating icons -->
@for (heroType of heroTypes; track heroType.type) {
@if (heroType.icons.length) {
<div class="tb-iot-hub-hero-icons"
[class.active]="heroIconsReady && activeHeroType === heroType">
@for (iconUrl of heroType.icons; track iconUrl; let i = $index) {
<img class="tb-iot-hub-hero-float-icon"
[class]="'icon-pos-' + (i + 1)"
[src]="iconUrl" alt="">
}
</div>
}
}
<div class="tb-iot-hub-hero-content">
<h1 class="tb-iot-hub-hero-title">{{ 'iot-hub.home-title' | translate }}</h1>
<div class="tb-iot-hub-hero-subtitle">
<span class="tb-iot-hub-hero-prefix">{{ 'iot-hub.home-subtitle-prefix' | translate }}</span>
@for (ht of heroTypes; track ht.type; let last = $last) {
<span class="tb-iot-hub-hero-keyword"
[class.active]="activeHeroType === ht"
[style.--keyword-color]="ht.color"
(mouseenter)="onHeroTypeHover(ht)"
(mouseleave)="onHeroTypeLeave()">{{ ht.labelKey | translate }}@if (!last) {,}</span>
}
</div>
<mat-form-field appearance="outline" class="tb-iot-hub-hero-search">
<input matInput
[placeholder]="'iot-hub.search-placeholder' | translate"
[(ngModel)]="searchText"
(keyup.enter)="onSearch()">
<button matSuffix mat-icon-button (click)="onSearch()">
<mat-icon>search</mat-icon>
</button>
</mat-form-field>
</div>
</div>
<!-- Category cards -->
<div class="tb-iot-hub-categories">
@for (card of categoryCards; track card.type) {
<div class="tb-iot-hub-category-card" [ngClass]="card.cssClass" (click)="navigateToBrowse(card.type)">
<span class="tb-iot-hub-category-title">{{ card.titleKey | translate }}</span>
<img class="tb-iot-hub-category-img" [src]="card.image" alt="">
</div>
}
</div>
@if (!isLoading) {
<!-- Popular Widgets -->
@if (popularWidgets.length) {
<div class="tb-iot-hub-section">
<a class="tb-iot-hub-section-header" (click)="navigateToBrowse(ItemType.WIDGET)">
{{ 'iot-hub.popular-widgets' | translate }}
<mat-icon>chevron_right</mat-icon>
</a>
<div class="tb-iot-hub-big-cards-row">
@for (item of popularWidgets; track item.id) {
<tb-iot-hub-item-card
[item]="item"
[showTypeChip]="false"
[showCreator]="true"
(cardClick)="openItemDetail($event)"
(creatorClick)="navigateToCreator($event)"
(installClick)="installItem($event)">
</tb-iot-hub-item-card>
}
</div>
</div>
}
<!-- Popular Dashboards -->
@if (popularDashboards.length) {
<div class="tb-iot-hub-section">
<a class="tb-iot-hub-section-header" (click)="navigateToBrowse(ItemType.DASHBOARD)">
{{ 'iot-hub.popular-dashboards' | translate }}
<mat-icon>chevron_right</mat-icon>
</a>
<div class="tb-iot-hub-big-cards-row">
@for (item of popularDashboards; track item.id) {
<tb-iot-hub-item-card
[item]="item"
[showTypeChip]="false"
[showCreator]="true"
(cardClick)="openItemDetail($event)"
(creatorClick)="navigateToCreator($event)"
(installClick)="installItem($event)">
</tb-iot-hub-item-card>
}
</div>
</div>
}
<!-- Popular Solution Templates -->
@if (popularSolutionTemplates.length) {
<div class="tb-iot-hub-section">
<a class="tb-iot-hub-section-header" (click)="navigateToBrowse(ItemType.SOLUTION_TEMPLATE)">
{{ 'iot-hub.popular-solution-templates' | translate }}
<mat-icon>chevron_right</mat-icon>
</a>
<div class="tb-iot-hub-big-cards-row">
@for (item of popularSolutionTemplates; track item.id) {
<tb-iot-hub-item-card
[item]="item"
[showTypeChip]="false"
[showCreator]="true"
(cardClick)="openItemDetail($event)"
(creatorClick)="navigateToCreator($event)"
(installClick)="installItem($event)">
</tb-iot-hub-item-card>
}
</div>
</div>
}
<!-- Popular Calculated Fields -->
@if (popularCalcFields.length) {
<div class="tb-iot-hub-section">
<a class="tb-iot-hub-section-header" (click)="navigateToBrowse(ItemType.CALCULATED_FIELD)">
{{ 'iot-hub.popular-calculated-fields' | translate }}
<mat-icon>chevron_right</mat-icon>
</a>
<div class="tb-iot-hub-compact-cards-grid">
@for (item of popularCalcFields; track item.id) {
<tb-iot-hub-item-card
[item]="item"
[showTypeChip]="false"
[showCreator]="true"
(cardClick)="openItemDetail($event)"
(creatorClick)="navigateToCreator($event)"
(installClick)="installItem($event)">
</tb-iot-hub-item-card>
}
</div>
</div>
}
<!-- Popular Rule Chains -->
@if (popularRuleChains.length) {
<div class="tb-iot-hub-section">
<a class="tb-iot-hub-section-header" (click)="navigateToBrowse(ItemType.RULE_CHAIN)">
{{ 'iot-hub.popular-rule-chains' | translate }}
<mat-icon>chevron_right</mat-icon>
</a>
<div class="tb-iot-hub-compact-cards-grid">
@for (item of popularRuleChains; track item.id) {
<tb-iot-hub-item-card
[item]="item"
[showTypeChip]="false"
[showCreator]="true"
(cardClick)="openItemDetail($event)"
(creatorClick)="navigateToCreator($event)"
(installClick)="installItem($event)">
</tb-iot-hub-item-card>
}
</div>
</div>
}
<!-- Become a Creator -->
<div class="tb-iot-hub-divider"></div>
<div class="tb-iot-hub-become-creator">
<h2>{{ 'iot-hub.become-a-creator' | translate }}</h2>
<p>{{ 'iot-hub.become-creator-text' | translate }}</p>
<button mat-stroked-button color="primary" (click)="openSignup()">
{{ 'iot-hub.submit-template' | translate }}
</button>
</div>
}
@if (isLoading) {
<div class="tb-iot-hub-loading">
<mat-spinner diameter="40"></mat-spinner>
</div>
}
</div>

419
ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-home.component.scss

@ -0,0 +1,419 @@
/**
* Copyright © 2016-2026 The Thingsboard Authors
*
* Licensed 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.
*/
// Outer page 16px padding around the white container
:host {
display: block;
padding: 16px;
}
// Page container white card with 8px radius, matches Figma "page-container"
.tb-iot-hub-home {
position: relative;
background: white;
border-radius: 8px;
overflow: hidden;
// Dot grid pattern covers top 800px, fades out via gradient mask
&::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 800px;
background-image: radial-gradient(circle, rgba(0, 0, 0, 0.1) 1px, transparent 1px);
background-size: 20px 20px;
mask-image: linear-gradient(to bottom, black 0%, transparent 100%);
-webkit-mask-image: linear-gradient(to bottom, black 0%, transparent 100%);
pointer-events: none;
z-index: 0;
}
> * {
position: relative;
z-index: 1;
}
}
// Hero section
.tb-iot-hub-hero {
text-align: center;
padding: 140px 40px 80px;
position: relative;
overflow: hidden;
}
// Animated background gradient
.tb-iot-hub-hero-gradient {
position: absolute;
inset: 0;
transition: background 0.6s ease;
pointer-events: none;
}
// Floating icons container per type
.tb-iot-hub-hero-icons {
position: absolute;
inset: 0;
pointer-events: none;
// Icons start near center (translate toward center, scaled down, invisible)
.tb-iot-hub-hero-float-icon {
opacity: 0;
transform: var(--icon-rotation) translate(var(--start-x), var(--start-y)) scale(0.9);
transition: opacity 0.5s ease, transform 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);
}
// Active: icons move outward to final position, scale to 1, fully visible
&.active .tb-iot-hub-hero-float-icon {
opacity: 1;
transform: var(--icon-rotation) translate(0, 0) scale(1);
}
}
// Individual floating icon final (resting) positions match Figma
.tb-iot-hub-hero-float-icon {
position: absolute;
width: 64px;
height: 64px;
// Top-left: moves from center-right and center-down to final pos
&.icon-pos-1 {
top: 40px;
left: 23%;
--icon-rotation: rotate(-15deg);
--start-x: 40px;
--start-y: 12px;
}
// Top-right: moves from center-left and center-down
&.icon-pos-2 {
top: 40px;
right: 23%;
--icon-rotation: rotate(15deg);
--start-x: -40px;
--start-y: 12px;
}
// Bottom-left: moves from center-right and center-up
&.icon-pos-3 {
bottom: 100px;
left: 18%;
--icon-rotation: rotate(-30deg);
--start-x: 50px;
--start-y: -8px;
}
// Bottom-right: moves from center-left and center-up
&.icon-pos-4 {
bottom: 100px;
right: 18%;
--icon-rotation: rotate(30deg);
--start-x: -45px;
--start-y: -4px;
}
}
.tb-iot-hub-hero-content {
display: flex;
flex-direction: column;
align-items: center;
gap: 40px;
position: relative;
z-index: 1;
}
.tb-iot-hub-hero-title {
font-size: 56px;
font-weight: 500;
line-height: 1.2;
letter-spacing: 0.14px;
color: rgba(0, 0, 0, 0.87);
margin: 0;
}
.tb-iot-hub-hero-subtitle {
font-size: 20px;
line-height: 24px;
letter-spacing: 0.1px;
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 6px;
}
.tb-iot-hub-hero-prefix {
font-weight: 400;
color: rgba(0, 0, 0, 0.76);
}
.tb-iot-hub-hero-keyword {
font-weight: 600;
color: rgba(0, 0, 0, 0.54);
opacity: 0.48;
cursor: pointer;
transition: color 0.3s ease, opacity 0.3s ease;
&.active {
color: var(--keyword-color);
opacity: 1;
}
&:hover {
opacity: 0.8;
}
}
.tb-iot-hub-hero-search {
width: 600px;
max-width: 100%;
::ng-deep .mat-mdc-text-field-wrapper {
background: white;
border-radius: 8px;
box-shadow:
0 7px 16px 0 rgba(0, 0, 0, 0.04),
0 29px 29px 0 rgba(0, 0, 0, 0.03),
0 64px 38px 0 rgba(0, 0, 0, 0.02);
}
.mat-mdc-form-field-subscript-wrapper {
display: none;
}
}
// Category cards Figma: centered 1200px container, flex-col gap=20, pb=48, 3-col rows
.tb-iot-hub-categories {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
max-width: 1200px;
margin: 0 auto;
padding-bottom: 48px;
}
// Card Figma: flex-col, gap=24, pt=24, rounded-8, border, overflow-clip, h=220
.tb-iot-hub-category-card {
height: 220px;
border-radius: 8px;
cursor: pointer;
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
padding-top: 24px;
transition: transform 0.2s, box-shadow 0.2s;
border: 1px solid rgba(0, 0, 0, 0.12);
overflow: hidden;
&:hover {
transform: translateY(-2px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
}
}
// Title Figma: 18px Medium, centered, tracking=0.15, flex child
.tb-iot-hub-category-title {
font-size: 18px;
font-weight: 500;
line-height: 24px;
letter-spacing: 0.15px;
color: rgba(0, 0, 0, 0.87);
text-align: center;
width: 100%;
flex-shrink: 0;
}
// Card image Figma: h=148, w=full, overflow-clip, fills remaining space
.tb-iot-hub-category-img {
width: 100%;
height: 148px;
object-fit: cover;
flex-shrink: 0;
}
// Exact Figma gradients (104.75deg angle)
.category-widgets {
background: linear-gradient(104.75deg, rgb(240, 255, 245) 0%, rgb(147, 246, 182) 100%);
}
.category-dashboards {
background: linear-gradient(104.75deg, rgb(245, 246, 255) 0%, rgb(189, 197, 255) 100%);
}
.category-solutions {
background: linear-gradient(104.75deg, rgb(245, 250, 255) 0%, rgb(149, 200, 255) 100%);
}
.category-calc-fields {
background: linear-gradient(104.75deg, rgb(245, 252, 255) 0%, rgb(149, 222, 248) 100%);
}
.category-rule-chains {
background: linear-gradient(104.75deg, rgb(255, 252, 245) 0%, rgb(255, 238, 194) 100%);
}
.category-devices {
background: linear-gradient(104.75deg, rgb(245, 255, 252) 0%, rgb(147, 240, 213) 100%);
}
// Sections matches Figma "items-section" (px=40, gap between sections ~48px)
.tb-iot-hub-section {
padding: 0 40px;
margin-top: 48px;
}
// Section header matches Figma "button" (height=40, font-size=20, font-weight=500)
.tb-iot-hub-section-header {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 20px;
font-weight: 500;
line-height: 40px;
color: rgba(0, 0, 0, 0.87);
cursor: pointer;
text-decoration: none;
mat-icon {
font-size: 20px;
width: 20px;
height: 20px;
}
&:hover {
color: #00695c;
}
}
// Big card row matches Figma "cards-row" (5 cards, gap=20, mt=12 from header)
.tb-iot-hub-big-cards-row {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 20px;
margin-top: 12px;
}
// Compact card grid matches Figma "cards" (3 columns, row gap=20, col gap=20)
.tb-iot-hub-compact-cards-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
margin-top: 12px;
}
// Divider matches Figma "divider" (1px, rgba(0,0,0,0.12))
.tb-iot-hub-divider {
height: 1px;
background: rgba(0, 0, 0, 0.12);
margin: 48px 0 0;
}
// Become a Creator matches Figma (pt=64, text centered, button at y=156)
.tb-iot-hub-become-creator {
text-align: center;
padding: 64px 40px;
h2 {
font-size: 24px;
font-weight: 500;
line-height: 32px;
color: rgba(0, 0, 0, 0.87);
margin: 0 0 8px;
}
p {
font-size: 14px;
line-height: 20px;
color: rgba(0, 0, 0, 0.54);
margin: 0 0 32px;
}
}
// Loading
.tb-iot-hub-loading {
display: flex;
justify-content: center;
padding: 80px 0;
}
// Page load animation Figma: Defaultappear-first, Smart Animate 1.02s, Gentle easing
// Hero elements fade in + slide DOWN 20px; categories fade in + slide UP 20px
@keyframes iot-hub-fade-slide-down {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes iot-hub-fade-slide-up {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.tb-iot-hub-hero-title,
.tb-iot-hub-hero-subtitle,
.tb-iot-hub-hero-search {
animation: iot-hub-fade-slide-down 1s cubic-bezier(0.19, 1, 0.22, 1) 0.2s both;
}
.tb-iot-hub-categories {
animation: iot-hub-fade-slide-up 1s cubic-bezier(0.19, 1, 0.22, 1) 0.2s both;
}
// Responsive
@media (max-width: 1200px) {
.tb-iot-hub-big-cards-row {
grid-template-columns: repeat(3, 1fr);
}
.tb-iot-hub-compact-cards-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 900px) {
.tb-iot-hub-categories {
grid-template-columns: repeat(2, 1fr);
.tb-iot-hub-category-card {
height: 180px;
}
}
.tb-iot-hub-big-cards-row {
grid-template-columns: repeat(2, 1fr);
}
.tb-iot-hub-hero-title {
font-size: 36px;
}
.tb-iot-hub-hero {
padding: 80px 24px 40px;
}
}

222
ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-home.component.ts

@ -0,0 +1,222 @@
///
/// Copyright © 2016-2026 The Thingsboard Authors
///
/// Licensed 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, OnInit, OnDestroy } from '@angular/core';
import { Router } from '@angular/router';
import { MatDialog } from '@angular/material/dialog';
import { forkJoin } from 'rxjs';
import { PageLink } from '@shared/models/page/page-link';
import { Direction, SortOrder } from '@shared/models/page/sort-order';
import { MpItemVersionQuery, MpItemVersionView } from '@shared/models/iot-hub/iot-hub-version.models';
import { ItemType, itemTypeTranslations } from '@shared/models/iot-hub/iot-hub-item.models';
import { IotHubApiService } from '@core/http/iot-hub-api.service';
import { TbIotHubItemDetailDialogComponent, IotHubItemDetailDialogData } from './iot-hub-item-detail-dialog.component';
import { TbIotHubInstallDialogComponent, IotHubInstallDialogData } from './iot-hub-install-dialog.component';
interface CategoryCard {
type: ItemType;
titleKey: string;
icon: string;
cssClass: string;
image: string;
}
interface HeroTypeConfig {
type: ItemType;
labelKey: string;
color: string;
gradientColor: string;
icons: string[];
}
@Component({
selector: 'tb-iot-hub-home',
standalone: false,
templateUrl: './iot-hub-home.component.html',
styleUrls: ['./iot-hub-home.component.scss']
})
export class TbIotHubHomeComponent implements OnInit, OnDestroy {
readonly ItemType = ItemType;
searchText = '';
heroTypes: HeroTypeConfig[] = [
{
type: ItemType.WIDGET, labelKey: 'item.type-widget-plural', color: '#2c9755',
gradientColor: 'rgba(44, 151, 85, 0.1)',
icons: ['assets/iot-hub/hero-widget-icon-1.svg', 'assets/iot-hub/hero-widget-icon-2.svg', 'assets/iot-hub/hero-widget-icon-3.svg', 'assets/iot-hub/hero-widget-icon-4.svg']
},
{
type: ItemType.DASHBOARD, labelKey: 'item.type-dashboard-plural', color: '#4d5fd0',
gradientColor: 'rgba(77, 95, 208, 0.1)',
icons: ['assets/iot-hub/hero-dashboard-icon-1.svg', 'assets/iot-hub/hero-dashboard-icon-2.svg', 'assets/iot-hub/hero-dashboard-icon-3.svg', 'assets/iot-hub/hero-dashboard-icon-4.svg']
},
{
type: ItemType.SOLUTION_TEMPLATE, labelKey: 'item.type-solution-template-plural', color: '#2666a9',
gradientColor: 'rgba(38, 102, 169, 0.1)', icons: []
},
{
type: ItemType.CALCULATED_FIELD, labelKey: 'item.type-calculated-field-plural', color: '#006d92',
gradientColor: 'rgba(0, 109, 146, 0.1)', icons: []
},
{
type: ItemType.RULE_CHAIN, labelKey: 'item.type-rule-chain-plural', color: '#95694b',
gradientColor: 'rgba(149, 105, 75, 0.1)', icons: []
},
{
type: ItemType.DEVICE, labelKey: 'iot-hub.and-devices', color: '#4b8a79',
gradientColor: 'rgba(75, 138, 121, 0.1)', icons: []
}
];
activeHeroType: HeroTypeConfig = this.heroTypes[0];
heroIconsReady = false;
private heroInterval: any;
categoryCards: CategoryCard[] = [
{ type: ItemType.WIDGET, titleKey: 'item.type-widget-plural', icon: 'widgets', cssClass: 'category-widgets', image: 'assets/iot-hub/category-widgets-img.svg' },
{ type: ItemType.DASHBOARD, titleKey: 'item.type-dashboard-plural', icon: 'dashboard', cssClass: 'category-dashboards', image: 'assets/iot-hub/category-dashboards-img.svg' },
{ type: ItemType.SOLUTION_TEMPLATE, titleKey: 'item.type-solution-template-plural', icon: 'integration_instructions', cssClass: 'category-solutions', image: 'assets/iot-hub/category-solution-templates-img.png' },
{ type: ItemType.CALCULATED_FIELD, titleKey: 'item.type-calculated-field-plural', icon: 'functions', cssClass: 'category-calc-fields', image: 'assets/iot-hub/category-calculated-fields-img.svg' },
{ type: ItemType.RULE_CHAIN, titleKey: 'item.type-rule-chain-plural', icon: 'account_tree', cssClass: 'category-rule-chains', image: 'assets/iot-hub/category-rule-chains-img.svg' },
{ type: ItemType.DEVICE, titleKey: 'iot-hub.device-library', icon: 'memory', cssClass: 'category-devices', image: 'assets/iot-hub/category-device-library-img.svg' }
];
popularWidgets: MpItemVersionView[] = [];
popularDashboards: MpItemVersionView[] = [];
popularSolutionTemplates: MpItemVersionView[] = [];
popularCalcFields: MpItemVersionView[] = [];
popularRuleChains: MpItemVersionView[] = [];
isLoading = true;
constructor(
private router: Router,
private dialog: MatDialog,
private iotHubApiService: IotHubApiService
) {}
ngOnInit(): void {
this.loadPopularItems();
// One-tick delay so Angular renders icons in hidden state first, then triggers transition
requestAnimationFrame(() => {
this.heroIconsReady = true;
this.startHeroCycle();
});
}
ngOnDestroy(): void {
this.stopHeroCycle();
}
onHeroTypeHover(config: HeroTypeConfig): void {
this.stopHeroCycle();
this.activeHeroType = config;
}
onHeroTypeLeave(): void {
this.startHeroCycle();
}
private startHeroCycle(): void {
this.stopHeroCycle();
this.heroInterval = setInterval(() => {
const idx = this.heroTypes.indexOf(this.activeHeroType);
this.activeHeroType = this.heroTypes[(idx + 1) % this.heroTypes.length];
}, 3000);
}
private stopHeroCycle(): void {
if (this.heroInterval) {
clearInterval(this.heroInterval);
this.heroInterval = null;
}
}
onSearch(): void {
if (this.searchText?.trim()) {
this.router.navigate(['/iot-hub/browse'], { queryParams: { search: this.searchText.trim() } });
}
}
navigateToBrowse(type: ItemType): void {
this.router.navigate(['/iot-hub/browse'], { queryParams: { type } });
}
navigateToInstalledItems(): void {
this.router.navigate(['/iot-hub/installed']);
}
openItemDetail(item: MpItemVersionView): void {
this.dialog.open(TbIotHubItemDetailDialogComponent, {
panelClass: ['tb-dialog', 'tb-fullscreen-dialog'],
autoFocus: false,
data: {
item,
iotHubApiService: this.iotHubApiService
} as IotHubItemDetailDialogData
});
}
installItem(item: MpItemVersionView): void {
this.dialog.open(TbIotHubInstallDialogComponent, {
panelClass: ['tb-dialog'],
data: {
item,
iotHubApiService: this.iotHubApiService
} as IotHubInstallDialogData
});
}
navigateToCreator(creatorId: string): void {
this.router.navigate(['/iot-hub/creator', creatorId]);
}
openSignup(): void {
window.open('https://iothub.thingsboard.io/signup', '_blank');
}
private loadPopularItems(): void {
const sortOrder: SortOrder = { property: 'totalInstallCount', direction: Direction.DESC };
const config = { ignoreLoading: true };
const buildQuery = (type: ItemType, size: number): MpItemVersionQuery => {
const pageLink = new PageLink(size, 0, null, sortOrder);
return new MpItemVersionQuery(pageLink, type);
};
forkJoin({
widgets: this.iotHubApiService.getPublishedVersions(buildQuery(ItemType.WIDGET, 5), config),
dashboards: this.iotHubApiService.getPublishedVersions(buildQuery(ItemType.DASHBOARD, 5), config),
solutionTemplates: this.iotHubApiService.getPublishedVersions(buildQuery(ItemType.SOLUTION_TEMPLATE, 5), config),
calcFields: this.iotHubApiService.getPublishedVersions(buildQuery(ItemType.CALCULATED_FIELD, 6), config),
ruleChains: this.iotHubApiService.getPublishedVersions(buildQuery(ItemType.RULE_CHAIN, 6), config)
}).subscribe({
next: (results) => {
this.popularWidgets = results.widgets.data;
this.popularDashboards = results.dashboards.data;
this.popularSolutionTemplates = results.solutionTemplates.data;
this.popularCalcFields = results.calcFields.data;
this.popularRuleChains = results.ruleChains.data;
this.isLoading = false;
},
error: () => {
this.isLoading = false;
}
});
}
}

15
ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-routing.module.ts

@ -18,6 +18,7 @@ import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { Authority } from '@shared/models/authority.enum';
import { TbIotHubHomeComponent } from './iot-hub-home.component';
import { TbIotHubBrowseComponent } from './iot-hub-browse.component';
import { TbIotHubCreatorProfileComponent } from './iot-hub-creator-profile.component';
import { TbIotHubInstalledItemsComponent } from './iot-hub-installed-items.component';
@ -35,10 +36,22 @@ const routes: Routes = [
children: [
{
path: '',
component: TbIotHubHomeComponent,
data: {
auth: [Authority.TENANT_ADMIN],
title: 'iot-hub.iot-hub'
}
},
{
path: 'browse',
component: TbIotHubBrowseComponent,
data: {
auth: [Authority.TENANT_ADMIN],
title: 'iot-hub.browse'
title: 'iot-hub.browse',
breadcrumb: {
label: 'iot-hub.browse',
icon: 'search'
}
}
},
{

2
ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub.module.ts

@ -18,6 +18,7 @@ import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SharedModule } from '@shared/shared.module';
import { IotHubRoutingModule } from './iot-hub-routing.module';
import { TbIotHubHomeComponent } from './iot-hub-home.component';
import { TbIotHubBrowseComponent } from './iot-hub-browse.component';
import { TbIotHubCreatorProfileComponent } from './iot-hub-creator-profile.component';
import { TbIotHubItemDetailDialogComponent } from './iot-hub-item-detail-dialog.component';
@ -28,6 +29,7 @@ import { TbIotHubUpdateDialogComponent } from './iot-hub-update-dialog.component
@NgModule({
declarations: [
TbIotHubHomeComponent,
TbIotHubBrowseComponent,
TbIotHubCreatorProfileComponent,
TbIotHubItemDetailDialogComponent,

233
ui-ngx/src/assets/iot-hub/category-calculated-fields-img.svg

@ -0,0 +1,233 @@
<svg width="387" height="148" viewBox="0 0 387 148" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_16822_62175)">
<g filter="url(#filter0_dddd_16822_62175)">
<rect x="63.1523" y="0.375" width="76" height="76" rx="6" fill="white"/>
<g clip-path="url(#clip1_16822_62175)">
<path opacity="0.16" d="M82.3995 36.4004H96.2177C97.003 36.4004 97.7562 36.0884 98.3115 35.5331C98.8668 34.9778 99.1787 34.2247 99.1787 33.4394V19.6212C99.1787 18.8359 98.8668 18.0827 98.3115 17.5274C97.7562 16.9721 97.003 16.6602 96.2177 16.6602H82.3995C81.6142 16.6602 80.861 16.9721 80.3057 17.5274C79.7504 18.0827 79.4385 18.8359 79.4385 19.6212V33.4394C79.4385 34.2247 79.7504 34.9778 80.3057 35.5331C80.861 36.0884 81.6142 36.4004 82.3995 36.4004Z" fill="#006D92"/>
<path d="M84.3737 25.543H94.2439C94.5056 25.543 94.7567 25.647 94.9418 25.8321C95.1269 26.0172 95.2309 26.2682 95.2309 26.53C95.2309 26.7918 95.1269 27.0428 94.9418 27.2279C94.7567 27.413 94.5056 27.517 94.2439 27.517H84.3737C84.112 27.517 83.8609 27.413 83.6758 27.2279C83.4907 27.0428 83.3867 26.7918 83.3867 26.53C83.3867 26.2682 83.4907 26.0172 83.6758 25.8321C83.8609 25.647 84.112 25.543 84.3737 25.543Z" fill="#006D92"/>
<path opacity="0.16" d="M119.906 16.6602H106.088C105.303 16.6602 104.55 16.9721 103.994 17.5274C103.439 18.0827 103.127 18.8359 103.127 19.6212V33.4394C103.127 34.2247 103.439 34.9778 103.994 35.5331C104.55 36.0884 105.303 36.4004 106.088 36.4004H119.906C120.691 36.4004 121.445 36.0884 122 35.5331C122.555 34.9778 122.867 34.2247 122.867 33.4394V19.6212C122.867 18.8359 122.555 18.0827 122 17.5274C121.445 16.9721 120.691 16.6602 119.906 16.6602Z" fill="#006D92"/>
<path d="M117.932 27.5165H113.984V31.4646C113.984 31.7263 113.88 31.9774 113.695 32.1625C113.51 32.3476 113.259 32.4516 112.997 32.4516C112.735 32.4516 112.484 32.3476 112.299 32.1625C112.114 31.9774 112.01 31.7263 112.01 31.4646V27.5165H108.062C107.8 27.5165 107.549 27.4125 107.364 27.2274C107.179 27.0423 107.075 26.7913 107.075 26.5295C107.075 26.2677 107.179 26.0167 107.364 25.8316C107.549 25.6465 107.8 25.5425 108.062 25.5425H112.01V21.5944C112.01 21.3327 112.114 21.0816 112.299 20.8965C112.484 20.7114 112.735 20.6074 112.997 20.6074C113.259 20.6074 113.51 20.7114 113.695 20.8965C113.88 21.0816 113.984 21.3327 113.984 21.5944V25.5425H117.932C118.194 25.5425 118.445 25.6465 118.63 25.8316C118.815 26.0167 118.919 26.2677 118.919 26.5295C118.919 26.7913 118.815 27.0423 118.63 27.2274C118.445 27.4125 118.194 27.5165 117.932 27.5165Z" fill="#006D92"/>
<path opacity="0.16" d="M96.2177 60.0879C97.003 60.0879 97.7562 59.7759 98.3115 59.2206C98.8668 58.6653 99.1787 57.9122 99.1787 57.1269V43.3087C99.1787 42.5234 98.8668 41.7702 98.3115 41.2149C97.7562 40.6596 97.003 40.3477 96.2177 40.3477H82.3995C81.6142 40.3477 80.861 40.6596 80.3057 41.2149C79.7504 41.7702 79.4385 42.5234 79.4385 43.3087V57.1269C79.4385 57.9122 79.7504 58.6653 80.3057 59.2206C80.861 59.7759 81.6142 60.0879 82.3995 60.0879H96.2177Z" fill="#006D92"/>
<path d="M85.1234 47.4259C84.9617 47.2371 84.8772 46.9942 84.8868 46.7458C84.8964 46.4974 84.9994 46.2617 85.1752 46.086C85.351 45.9102 85.5866 45.8072 85.835 45.7976C86.0834 45.788 86.3263 45.8725 86.5151 46.0342L89.3084 48.8275L92.1016 46.0342C92.2904 45.8725 92.5333 45.788 92.7817 45.7976C93.0301 45.8072 93.2658 45.9102 93.4416 46.086C93.6173 46.2617 93.7203 46.4974 93.7299 46.7458C93.7395 46.9942 93.655 47.2371 93.4933 47.4259L90.7001 50.2191L93.4933 53.0124C93.6771 53.1973 93.7803 53.4475 93.7803 53.7082C93.7803 53.969 93.6771 54.2192 93.4933 54.4041C93.3084 54.5879 93.0582 54.6911 92.7975 54.6911C92.5367 54.6911 92.2866 54.5879 92.1016 54.4041L89.3084 51.6108L86.5151 54.4041C86.3302 54.5879 86.08 54.6911 85.8193 54.6911C85.5585 54.6911 85.3084 54.5879 85.1234 54.4041C84.9396 54.2192 84.8364 53.969 84.8364 53.7082C84.8364 53.4475 84.9396 53.1973 85.1234 53.0124L87.9167 50.2191L85.1234 47.4259Z" fill="#006D92"/>
<path opacity="0.16" d="M119.906 40.3477H106.088C105.303 40.3477 104.55 40.6596 103.994 41.2149C103.439 41.7702 103.127 42.5234 103.127 43.3087V57.1269C103.127 57.9122 103.439 58.6653 103.994 59.2206C104.55 59.7759 105.303 60.0879 106.088 60.0879H119.906C120.691 60.0879 121.445 59.7759 122 59.2206C122.555 58.6653 122.867 57.9122 122.867 57.1269V43.3087C122.867 42.5234 122.555 41.7702 122 41.2149C121.445 40.6596 120.691 40.3477 119.906 40.3477Z" fill="#006D92"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M108.062 51.2053H117.932C118.194 51.2053 118.445 51.1013 118.63 50.9162C118.815 50.7311 118.919 50.48 118.919 50.2183C118.919 49.9565 118.815 49.7054 118.63 49.5203C118.445 49.3352 118.194 49.2313 117.932 49.2313H108.062C107.8 49.2313 107.549 49.3352 107.364 49.5203C107.179 49.7054 107.075 49.9565 107.075 50.2183C107.075 50.48 107.179 50.7311 107.364 50.9162C107.549 51.1013 107.8 51.2053 108.062 51.2053Z" fill="#006D92"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M113.545 45.4495C113.383 45.3411 113.192 45.2832 112.997 45.2832C112.735 45.2832 112.484 45.3872 112.299 45.5723C112.114 45.7574 112.01 46.0084 112.01 46.2702C112.01 46.4654 112.068 46.6563 112.176 46.8186C112.285 46.9809 112.439 47.1074 112.619 47.1821C112.799 47.2568 112.998 47.2763 113.189 47.2383C113.381 47.2002 113.557 47.1062 113.695 46.9681C113.833 46.8301 113.927 46.6542 113.965 46.4628C114.003 46.2713 113.983 46.0729 113.909 45.8925C113.834 45.7122 113.707 45.558 113.545 45.4495Z" fill="#006D92"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M112.299 54.8642C112.484 55.0493 112.735 55.1533 112.997 55.1533C113.259 55.1533 113.51 55.0493 113.695 54.8642C113.88 54.6791 113.984 54.4281 113.984 54.1663C113.984 53.9045 113.88 53.6535 113.695 53.4684C113.51 53.2833 113.259 53.1793 112.997 53.1793C112.735 53.1793 112.484 53.2833 112.299 53.4684C112.114 53.6535 112.01 53.9045 112.01 54.1663C112.01 54.4281 112.114 54.6791 112.299 54.8642Z" fill="#006D92"/>
</g>
</g>
<g filter="url(#filter1_dddd_16822_62175)">
<rect x="155.152" y="0.375" width="76" height="76" rx="6" fill="white"/>
<g clip-path="url(#clip2_16822_62175)">
<rect opacity="0.16" x="171.438" y="16.6602" width="43.4286" height="43.4286" rx="21.7143" fill="#006D92"/>
<path d="M184.707 33.5488L179.882 38.3742L184.707 43.1996" stroke="#006D92" stroke-width="2.4127" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M201.596 33.5488L206.422 38.3742L201.596 43.1996" stroke="#006D92" stroke-width="2.4127" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M195.565 28.7246L190.739 48.0262" stroke="#006D92" stroke-width="2.4127" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</g>
<g filter="url(#filter2_dddd_16822_62175)">
<rect x="247.152" y="0.375" width="76" height="76" rx="6" fill="white"/>
<path opacity="0.16" d="M295.349 21.7891C295.258 22.1425 295.21 22.513 295.21 22.8949C295.21 25.3378 297.19 27.3182 299.633 27.3182C300.015 27.3182 300.386 27.2698 300.739 27.1789V49.5739C300.386 49.4829 300.015 49.4346 299.633 49.4346C297.19 49.4346 295.21 51.4149 295.21 53.8578C295.21 54.2397 295.258 54.6102 295.349 54.9637H272.954C273.045 54.6102 273.094 54.2397 273.094 53.8578C273.094 51.4149 271.113 49.4346 268.67 49.4346C268.288 49.4346 267.918 49.4829 267.564 49.5739V27.1789C267.918 27.2698 268.288 27.3182 268.67 27.3182C271.113 27.3182 273.094 25.3378 273.094 22.8949C273.094 22.513 273.045 22.1425 272.954 21.7891H295.349Z" fill="#006D92"/>
<path opacity="0.4" d="M295.246 53.3049C295.223 53.4861 295.21 53.6705 295.21 53.8578C295.21 54.2397 295.258 54.6102 295.349 54.9637H272.954C273.045 54.6102 273.094 54.2397 273.094 53.8578C273.094 53.6705 273.081 53.4861 273.058 53.3049H295.246ZM267.564 27.1789C267.918 27.2698 268.288 27.3182 268.67 27.3182C268.858 27.3182 269.042 27.3051 269.223 27.2825V49.4691C269.042 49.4465 268.858 49.4346 268.67 49.4346C268.288 49.4346 267.918 49.4829 267.564 49.5739V27.1789ZM300.739 49.5739C300.386 49.4829 300.015 49.4346 299.633 49.4346C299.446 49.4346 299.261 49.4465 299.08 49.4691V27.2825C299.262 27.3051 299.446 27.3182 299.633 27.3182C300.015 27.3182 300.386 27.2698 300.739 27.1789V49.5739ZM295.349 21.7891C295.258 22.1425 295.21 22.513 295.21 22.8949C295.21 23.0822 295.223 23.2666 295.246 23.4478H273.058C273.081 23.2666 273.094 23.0822 273.094 22.8949C273.094 22.513 273.045 22.1425 272.954 21.7891H295.349Z" fill="#006D92"/>
<path d="M302.951 22.8936C302.951 21.0614 301.466 19.5762 299.633 19.5762C297.801 19.5762 296.316 21.0614 296.316 22.8936C296.316 24.7258 297.801 26.2111 299.633 26.2111C301.466 26.2111 302.951 24.7258 302.951 22.8936Z" fill="#006D92"/>
<path d="M302.951 53.8565C302.951 52.0243 301.466 50.5391 299.633 50.5391C297.801 50.5391 296.316 52.0243 296.316 53.8565C296.316 55.6887 297.801 57.174 299.633 57.174C301.466 57.174 302.951 55.6887 302.951 53.8565Z" fill="#006D92"/>
<path d="M271.988 53.8565C271.988 52.0243 270.503 50.5391 268.67 50.5391C266.838 50.5391 265.353 52.0243 265.353 53.8565C265.353 55.6887 266.838 57.174 268.67 57.174C270.503 57.174 271.988 55.6887 271.988 53.8565Z" fill="#006D92"/>
<path d="M271.988 22.8936C271.988 21.0614 270.503 19.5762 268.67 19.5762C266.838 19.5762 265.353 21.0614 265.353 22.8936C265.353 24.7258 266.838 26.2111 268.67 26.2111C270.503 26.2111 271.988 24.7258 271.988 22.8936Z" fill="#006D92"/>
</g>
<g filter="url(#filter3_dddd_16822_62175)">
<rect x="247" y="88.375" width="76" height="76" rx="6" fill="white"/>
<g clip-path="url(#clip3_16822_62175)">
<rect x="275.248" y="103.646" width="17.6931" height="13.2698" rx="1.10582" fill="#006D92"/>
<path opacity="0.16" fill-rule="evenodd" clip-rule="evenodd" d="M283.314 117.338C283.622 117.031 284.085 116.974 284.45 117.166C284.506 117.195 284.56 117.23 284.61 117.271C284.636 117.292 284.661 117.314 284.685 117.338L288.002 120.655C288.38 121.033 288.379 121.646 288.002 122.024C287.624 122.402 287.011 122.402 286.633 122.024L285.002 120.393C285.175 123.376 285.966 125.176 286.973 126.324C288.123 127.636 289.684 128.25 291.42 128.68C292.311 128.901 293.14 129.051 294.036 129.251C294.891 129.441 295.761 129.668 296.533 130.023C297.317 130.384 298.043 130.897 298.563 131.68C299.085 132.466 299.343 133.436 299.343 134.61C299.343 135.144 298.909 135.578 298.375 135.578C297.841 135.578 297.407 135.144 297.407 134.61C297.407 133.722 297.215 133.148 296.951 132.751C296.686 132.351 296.288 132.041 295.724 131.781C295.148 131.516 294.446 131.324 293.616 131.139C292.828 130.964 291.86 130.783 290.954 130.558C289.097 130.098 287.063 129.362 285.518 127.599C285.324 127.379 285.14 127.144 284.967 126.894V139.033C284.967 139.567 284.533 140.001 283.999 140.001C283.465 140.001 283.031 139.567 283.031 139.033V126.896C282.858 127.145 282.675 127.379 282.481 127.599C280.936 129.362 278.902 130.098 277.045 130.558C276.139 130.783 275.171 130.964 274.383 131.139C273.553 131.324 272.851 131.516 272.275 131.781C271.711 132.041 271.313 132.351 271.048 132.751C270.784 133.148 270.592 133.722 270.592 134.61C270.592 135.144 270.158 135.578 269.624 135.578C269.09 135.578 268.656 135.144 268.656 134.61C268.656 133.436 268.914 132.466 269.436 131.68C269.956 130.897 270.682 130.384 271.466 130.023C272.238 129.668 273.108 129.441 273.963 129.251C274.859 129.051 275.688 128.901 276.579 128.68C278.315 128.25 279.876 127.636 281.026 126.324C282.033 125.176 282.822 123.376 282.995 120.394L281.366 122.024C280.988 122.402 280.375 122.402 279.997 122.024C279.62 121.646 279.619 121.033 279.997 120.655L283.314 117.338Z" fill="#006D92"/>
<path d="M283.444 132.707C283.856 132.295 284.524 132.295 284.935 132.707L289.41 137.182C289.822 137.594 289.822 138.261 289.41 138.673L284.935 143.148C284.524 143.56 283.856 143.56 283.444 143.148L278.97 138.673C278.558 138.261 278.558 137.594 278.97 137.182L283.444 132.707Z" fill="#006D92"/>
<path d="M269.069 132.707C269.48 132.295 270.148 132.295 270.56 132.707L275.034 137.182C275.446 137.594 275.446 138.261 275.034 138.673L270.56 143.148C270.148 143.56 269.48 143.56 269.069 143.148L264.594 138.673C264.182 138.261 264.182 137.594 264.594 137.182L269.069 132.707Z" fill="#006D92"/>
<path d="M297.82 132.707C298.232 132.295 298.9 132.295 299.311 132.707L303.786 137.182C304.198 137.594 304.198 138.261 303.786 138.673L299.311 143.148C298.9 143.56 298.232 143.56 297.82 143.148L293.346 138.673C292.934 138.261 292.934 137.594 293.346 137.182L297.82 132.707Z" fill="#006D92"/>
</g>
</g>
<g filter="url(#filter4_dddd_16822_62175)">
<rect x="63" y="88.375" width="76" height="76" rx="6" fill="white"/>
<g clip-path="url(#clip4_16822_62175)">
<path opacity="0.16" d="M97.5557 110.105L86.5557 121.105" stroke="#006D92" stroke-width="2.44444" stroke-linecap="round"/>
<path opacity="0.16" d="M102.444 110.105L113.444 121.105" stroke="#006D92" stroke-width="2.44444" stroke-linecap="round"/>
<path d="M83.2869 117.781C83.7421 117.326 84.4801 117.326 84.9354 117.781L89.8808 122.726C90.336 123.182 90.336 123.92 89.8808 124.375L84.9354 129.32C84.4801 129.775 83.7421 129.775 83.2869 129.32L78.3414 124.375C77.8862 123.92 77.8862 123.182 78.3414 122.726L83.2869 117.781Z" fill="#006D92"/>
<path d="M115.065 117.781C115.52 117.326 116.258 117.326 116.713 117.781L121.659 122.726C122.114 123.182 122.114 123.92 121.659 124.375L116.713 129.32C116.258 129.775 115.52 129.775 115.065 129.32L110.119 124.375C109.664 123.92 109.664 123.182 110.119 122.726L115.065 117.781Z" fill="#006D92"/>
<path d="M99.1755 101.892C99.6308 101.437 100.369 101.437 100.824 101.892L105.769 106.838C106.225 107.293 106.225 108.031 105.769 108.486L100.824 113.432C100.369 113.887 99.6308 113.887 99.1755 113.432L94.2301 108.486C93.7749 108.031 93.7749 107.293 94.2301 106.838L99.1755 101.892Z" fill="#006D92"/>
<path d="M100.978 125.996C101.222 125.996 101.467 126.159 101.548 126.403L101.915 127.504C101.955 127.707 102.118 127.87 102.322 127.911C102.892 128.074 103.422 128.277 103.911 128.562C104.074 128.644 104.318 128.644 104.481 128.562L105.5 128.074C105.744 127.952 105.989 127.993 106.193 128.196L107.578 129.581C107.781 129.744 107.822 130.029 107.7 130.273L107.211 131.292C107.089 131.496 107.13 131.699 107.211 131.862C107.497 132.351 107.7 132.881 107.863 133.451C107.944 133.655 108.066 133.778 108.27 133.859L109.371 134.226C109.615 134.307 109.778 134.552 109.778 134.796V136.752C109.778 136.996 109.615 137.241 109.371 137.322L108.27 137.688C108.067 137.729 107.904 137.892 107.863 138.096C107.7 138.666 107.496 139.196 107.211 139.685C107.13 139.847 107.13 140.092 107.211 140.255L107.66 141.273C107.782 141.518 107.74 141.763 107.537 141.967L106.152 143.352C105.989 143.555 105.704 143.596 105.459 143.474L104.441 142.985C104.237 142.863 104.034 142.904 103.871 142.985C103.382 143.27 102.852 143.474 102.282 143.637C102.078 143.718 101.955 143.84 101.874 144.044L101.507 145.145C101.426 145.389 101.181 145.552 100.937 145.552H98.981C98.7367 145.552 98.4921 145.389 98.4106 145.145L98.0444 144.044C98.0036 143.84 97.8407 143.678 97.6372 143.637C97.067 143.474 96.5371 143.27 96.0483 142.985C95.8854 142.904 95.641 142.904 95.478 142.985L94.4595 143.474C94.2151 143.596 93.9708 143.555 93.7671 143.352L92.3813 141.967C92.1776 141.804 92.1371 141.518 92.2593 141.273L92.7886 140.255C92.9106 140.051 92.87 139.847 92.7886 139.685C92.5035 139.196 92.3001 138.666 92.1372 138.096C92.0558 137.892 91.9334 137.77 91.73 137.688L90.6294 137.322C90.3851 137.241 90.2223 136.996 90.2222 136.752V134.796C90.2223 134.552 90.3851 134.307 90.6294 134.226L91.73 133.859C91.9335 133.819 92.0965 133.655 92.1372 133.451C92.3001 132.881 92.5035 132.351 92.7886 131.862C92.8699 131.699 92.87 131.455 92.7886 131.292L92.2593 130.273C92.178 130.029 92.2187 129.745 92.3813 129.541L93.7671 128.155C93.9707 127.993 94.2553 127.952 94.4995 128.033L95.5181 128.562C95.7217 128.685 95.9255 128.644 96.0884 128.562C96.5771 128.277 97.1071 128.074 97.6772 127.911C97.8809 127.83 98.004 127.707 98.0854 127.504L98.4517 126.403C98.5332 126.159 98.7776 125.996 99.022 125.996H100.978ZM98.2632 141.379V141.378V141.379ZM101.737 141.379V141.378V141.379ZM99.9995 130.885C97.2998 130.885 95.1111 133.074 95.1108 135.773C95.1108 138.473 97.2996 140.663 99.9995 140.663C102.7 140.663 104.889 138.473 104.889 135.773C104.889 133.074 102.699 130.885 99.9995 130.885Z" fill="#006D92"/>
</g>
</g>
<g filter="url(#filter5_dddd_16822_62175)">
<rect x="155" y="88.375" width="76" height="76" rx="6" fill="white"/>
<g clip-path="url(#clip5_16822_62175)">
<path d="M192.587 113.383C192.832 113.383 193.076 113.546 193.158 113.79L193.524 114.891C193.565 115.094 193.728 115.257 193.931 115.298C194.501 115.461 195.031 115.664 195.52 115.949C195.683 116.031 195.927 116.031 196.09 115.949L197.109 115.461C197.353 115.339 197.599 115.379 197.802 115.583L199.187 116.968C199.391 117.131 199.431 117.416 199.309 117.66L198.821 118.679C198.699 118.882 198.739 119.086 198.821 119.249C199.106 119.738 199.309 120.268 199.472 120.838C199.554 121.042 199.676 121.165 199.879 121.246L200.98 121.612C201.224 121.694 201.387 121.938 201.387 122.183V124.139C201.387 124.383 201.224 124.627 200.98 124.709L199.879 125.075C199.676 125.116 199.513 125.279 199.472 125.482C199.309 126.053 199.106 126.583 198.821 127.071C198.739 127.234 198.739 127.479 198.821 127.642L199.269 128.66C199.391 128.905 199.35 129.15 199.146 129.354L197.761 130.738C197.598 130.942 197.313 130.983 197.069 130.86L196.05 130.372C195.847 130.25 195.643 130.291 195.48 130.372C194.991 130.657 194.461 130.86 193.891 131.023C193.687 131.105 193.564 131.227 193.483 131.431L193.117 132.531C193.035 132.776 192.791 132.938 192.546 132.938H190.59C190.346 132.938 190.101 132.775 190.02 132.531L189.654 131.431C189.613 131.227 189.45 131.064 189.247 131.023C188.676 130.861 188.147 130.657 187.658 130.372C187.495 130.291 187.25 130.291 187.087 130.372L186.069 130.86C185.824 130.983 185.58 130.942 185.376 130.738L183.991 129.354C183.787 129.191 183.746 128.905 183.869 128.66L184.398 127.642C184.52 127.438 184.479 127.234 184.398 127.071C184.113 126.583 183.909 126.053 183.747 125.482C183.665 125.279 183.543 125.157 183.339 125.075L182.239 124.709C181.994 124.628 181.832 124.383 181.832 124.139V122.183C181.832 121.938 181.994 121.694 182.239 121.612L183.339 121.246C183.543 121.205 183.706 121.041 183.747 120.838C183.91 120.268 184.113 119.738 184.398 119.249C184.479 119.086 184.479 118.842 184.398 118.679L183.869 117.66C183.787 117.416 183.828 117.131 183.991 116.928L185.376 115.542C185.58 115.379 185.865 115.339 186.109 115.42L187.127 115.949C187.331 116.071 187.535 116.031 187.698 115.949C188.187 115.664 188.716 115.461 189.287 115.298C189.49 115.216 189.613 115.094 189.695 114.891L190.061 113.79C190.143 113.546 190.387 113.383 190.631 113.383H192.587ZM189.873 128.766V128.765V128.766ZM193.346 128.766V128.765V128.766ZM191.609 118.271C188.909 118.272 186.72 120.46 186.72 123.16C186.72 125.86 188.909 128.05 191.609 128.05C194.309 128.05 196.499 125.86 196.499 123.16C196.498 120.46 194.309 118.271 191.609 118.271Z" fill="#006D92"/>
<circle opacity="0.16" cx="191.609" cy="123.16" r="18.3333" stroke="#006D92" stroke-width="2.44444"/>
<circle cx="191.61" cy="104.827" r="3.66667" fill="#006D92"/>
<circle cx="173.276" cy="123.161" r="3.66667" fill="#006D92"/>
<circle cx="191.61" cy="141.493" r="3.66667" fill="#006D92"/>
<circle cx="209.943" cy="123.161" r="3.66667" fill="#006D92"/>
</g>
</g>
</g>
<defs>
<filter id="filter0_dddd_16822_62175" x="30.4251" y="-5.07955" width="141.455" height="196" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="5.45455"/>
<feGaussianBlur stdDeviation="5.45455"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.06 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="20.7273"/>
<feGaussianBlur stdDeviation="10.3636"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.05 0"/>
<feBlend mode="normal" in2="effect1_dropShadow_16822_62175" result="effect2_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="45.8182"/>
<feGaussianBlur stdDeviation="13.6364"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.03 0"/>
<feBlend mode="normal" in2="effect2_dropShadow_16822_62175" result="effect3_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="81.8182"/>
<feGaussianBlur stdDeviation="16.3636"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.01 0"/>
<feBlend mode="normal" in2="effect3_dropShadow_16822_62175" result="effect4_dropShadow_16822_62175"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect4_dropShadow_16822_62175" result="shape"/>
</filter>
<filter id="filter1_dddd_16822_62175" x="122.425" y="-5.07955" width="141.455" height="196" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="5.45455"/>
<feGaussianBlur stdDeviation="5.45455"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.06 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="20.7273"/>
<feGaussianBlur stdDeviation="10.3636"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.05 0"/>
<feBlend mode="normal" in2="effect1_dropShadow_16822_62175" result="effect2_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="45.8182"/>
<feGaussianBlur stdDeviation="13.6364"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.03 0"/>
<feBlend mode="normal" in2="effect2_dropShadow_16822_62175" result="effect3_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="81.8182"/>
<feGaussianBlur stdDeviation="16.3636"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.01 0"/>
<feBlend mode="normal" in2="effect3_dropShadow_16822_62175" result="effect4_dropShadow_16822_62175"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect4_dropShadow_16822_62175" result="shape"/>
</filter>
<filter id="filter2_dddd_16822_62175" x="214.425" y="-5.07955" width="141.455" height="196" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="5.45455"/>
<feGaussianBlur stdDeviation="5.45455"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.06 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="20.7273"/>
<feGaussianBlur stdDeviation="10.3636"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.05 0"/>
<feBlend mode="normal" in2="effect1_dropShadow_16822_62175" result="effect2_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="45.8182"/>
<feGaussianBlur stdDeviation="13.6364"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.03 0"/>
<feBlend mode="normal" in2="effect2_dropShadow_16822_62175" result="effect3_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="81.8182"/>
<feGaussianBlur stdDeviation="16.3636"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.01 0"/>
<feBlend mode="normal" in2="effect3_dropShadow_16822_62175" result="effect4_dropShadow_16822_62175"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect4_dropShadow_16822_62175" result="shape"/>
</filter>
<filter id="filter3_dddd_16822_62175" x="214.273" y="82.9205" width="141.455" height="196" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="5.45455"/>
<feGaussianBlur stdDeviation="5.45455"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.06 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="20.7273"/>
<feGaussianBlur stdDeviation="10.3636"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.05 0"/>
<feBlend mode="normal" in2="effect1_dropShadow_16822_62175" result="effect2_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="45.8182"/>
<feGaussianBlur stdDeviation="13.6364"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.03 0"/>
<feBlend mode="normal" in2="effect2_dropShadow_16822_62175" result="effect3_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="81.8182"/>
<feGaussianBlur stdDeviation="16.3636"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.01 0"/>
<feBlend mode="normal" in2="effect3_dropShadow_16822_62175" result="effect4_dropShadow_16822_62175"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect4_dropShadow_16822_62175" result="shape"/>
</filter>
<filter id="filter4_dddd_16822_62175" x="30.2727" y="82.9205" width="141.455" height="196" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="5.45455"/>
<feGaussianBlur stdDeviation="5.45455"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.06 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="20.7273"/>
<feGaussianBlur stdDeviation="10.3636"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.05 0"/>
<feBlend mode="normal" in2="effect1_dropShadow_16822_62175" result="effect2_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="45.8182"/>
<feGaussianBlur stdDeviation="13.6364"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.03 0"/>
<feBlend mode="normal" in2="effect2_dropShadow_16822_62175" result="effect3_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="81.8182"/>
<feGaussianBlur stdDeviation="16.3636"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.01 0"/>
<feBlend mode="normal" in2="effect3_dropShadow_16822_62175" result="effect4_dropShadow_16822_62175"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect4_dropShadow_16822_62175" result="shape"/>
</filter>
<filter id="filter5_dddd_16822_62175" x="122.273" y="82.9205" width="141.455" height="196" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="5.45455"/>
<feGaussianBlur stdDeviation="5.45455"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.06 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="20.7273"/>
<feGaussianBlur stdDeviation="10.3636"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.05 0"/>
<feBlend mode="normal" in2="effect1_dropShadow_16822_62175" result="effect2_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="45.8182"/>
<feGaussianBlur stdDeviation="13.6364"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.03 0"/>
<feBlend mode="normal" in2="effect2_dropShadow_16822_62175" result="effect3_dropShadow_16822_62175"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="81.8182"/>
<feGaussianBlur stdDeviation="16.3636"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.01 0"/>
<feBlend mode="normal" in2="effect3_dropShadow_16822_62175" result="effect4_dropShadow_16822_62175"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect4_dropShadow_16822_62175" result="shape"/>
</filter>
<clipPath id="clip0_16822_62175">
<rect width="386.667" height="148" fill="white"/>
</clipPath>
<clipPath id="clip1_16822_62175">
<rect width="43.4286" height="43.4286" fill="white" transform="translate(79.4385 16.6602)"/>
</clipPath>
<clipPath id="clip2_16822_62175">
<rect width="43.4286" height="43.4286" fill="white" transform="translate(171.438 16.6602)"/>
</clipPath>
<clipPath id="clip3_16822_62175">
<rect width="39.8095" height="39.8095" fill="white" transform="translate(264.095 103.646)"/>
</clipPath>
<clipPath id="clip4_16822_62175">
<rect width="44" height="44" fill="white" transform="translate(78 101.551)"/>
</clipPath>
<clipPath id="clip5_16822_62175">
<rect width="44" height="44" fill="white" transform="translate(169.609 101.16)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 30 KiB

84
ui-ngx/src/assets/iot-hub/category-dashboards-img.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 62 KiB

95
ui-ngx/src/assets/iot-hub/category-device-library-img.svg

@ -0,0 +1,95 @@
<svg width="387" height="148" viewBox="0 0 387 148" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_17063_68013)">
<g filter="url(#filter0_dddd_17063_68013)">
<rect x="28" width="77" height="51" rx="5.85799" fill="white"/>
<g clip-path="url(#clip1_17063_68013)">
<path d="M44.1343 31.0677V17.4609H47.4659V28.2088H52.676V31.0677H44.1343Z" fill="#4B8A79"/>
<path d="M69.6183 19.976V23.6491H72.6664C73.8537 23.6491 74.4562 23.0339 74.4562 21.8216C74.4562 20.5912 73.8714 19.9941 72.6664 19.9941H69.6183V19.976ZM66.2866 31.0677V17.4609H72.9499C76.1752 17.4609 77.7879 18.9447 77.7879 21.9302C77.7879 22.8168 77.5398 23.5767 77.0436 24.2281C76.5474 24.8795 75.8739 25.35 75.041 25.6033L78.0891 31.0677H74.3676L71.7448 26.1642H69.6183V31.0677H66.2866Z" fill="#4B8A79"/>
<path d="M85.3189 26.8347V26.129L83.3518 26.708C82.4126 26.9794 81.9518 27.4137 81.9518 28.0289C81.9518 28.7888 82.4126 29.1688 83.3164 29.1688C83.9189 29.1688 84.3974 28.9698 84.7696 28.5717C85.124 28.1555 85.3189 27.5765 85.3189 26.8347ZM88.1189 23.5777V28.9517C88.1189 29.9107 88.2075 30.6163 88.3847 31.0687H85.6911C85.5847 30.743 85.5316 30.3992 85.5139 30.0192H85.4784C85.248 30.3992 84.805 30.7249 84.1848 30.9782C83.6177 31.2134 83.0506 31.3401 82.4835 31.3401C81.4911 31.3401 80.7113 31.0868 80.1088 30.562C79.4708 30.0192 79.1519 29.2593 79.1519 28.3184C79.1519 27.1604 79.6126 26.2737 80.5164 25.6766C81.2962 25.17 82.5367 24.79 84.2556 24.5548L85.3189 24.4101V23.5596C85.3189 22.8359 84.8582 22.474 83.9367 22.474C83.4582 22.474 83.1037 22.5826 82.8734 22.7816C82.643 22.9806 82.4835 23.3425 82.4126 23.831H79.5772C79.6303 21.6959 81.0126 20.6465 83.6886 20.6465C85.1417 20.6465 86.2227 20.8455 86.9316 21.2617C87.729 21.714 88.1189 22.4921 88.1189 23.5777Z" fill="#4B8A79"/>
<path d="M59.0204 22.9068C58.2229 22.9068 57.6204 23.1963 57.2128 23.7934C56.8407 24.3362 56.6457 25.06 56.6457 25.9828C56.6457 26.9056 56.8407 27.6294 57.2128 28.1722C57.6204 28.7693 58.2229 29.0588 59.0204 29.0588C60.6153 29.0588 61.3951 27.9912 61.3951 25.8561C61.3951 24.9876 61.2001 24.282 60.828 23.7572C60.4204 23.1963 59.8179 22.9068 59.0204 22.9068ZM59.0204 20.627C60.6153 20.627 61.8913 21.0974 62.866 22.0383C63.8406 22.9792 64.3191 24.3001 64.3191 25.9828C64.3191 27.6656 63.8406 28.9864 62.866 29.9273C61.8913 30.8682 60.6153 31.3387 59.0204 31.3387C57.4255 31.3387 56.1495 30.8682 55.1748 29.9273C54.2002 28.9864 53.7217 27.6656 53.7217 25.9828C53.7217 24.3001 54.2002 22.9792 55.1748 22.0383C56.1672 21.0974 57.4432 20.627 59.0204 20.627Z" fill="#4B8A79"/>
<path d="M58.9313 18.6012C60.3844 18.6012 61.749 19.0354 62.8832 19.7954L63.4502 18.963C62.1388 18.0945 60.5971 17.5879 58.9313 17.5879C57.3363 17.5879 55.8477 18.0583 54.5718 18.8545L55.1389 19.6868C56.2553 18.9811 57.549 18.6012 58.9313 18.6012Z" fill="#4B8A79"/>
<path d="M52.7998 16.2479L53.5618 17.3517C55.1213 16.3384 56.9644 15.7594 58.9314 15.7594C60.9871 15.7594 62.8833 16.3927 64.4783 17.4602L65.2403 16.3565C63.4327 15.1261 61.2529 14.4023 58.9314 14.4023C56.6808 14.4023 54.572 15.0899 52.7998 16.2479Z" fill="#4B8A79"/>
<path d="M58.9316 12.8649C61.5898 12.8649 64.0531 13.6791 66.1265 15.0905L67.0834 13.6972C64.7619 12.0869 61.9442 11.1641 58.9316 11.1641C56.0075 11.1641 53.2607 12.0507 50.9746 13.5706L51.9316 14.9638C53.9518 13.643 56.3442 12.8649 58.9316 12.8649Z" fill="#4B8A79"/>
<path d="M59.1269 33.4012C57.6737 33.4012 56.3092 32.967 55.175 32.207L54.6079 33.0394C55.9193 33.9079 57.4611 34.4145 59.1446 34.4145C60.7395 34.4145 62.2281 33.9441 63.5041 33.1479L62.937 32.3156C61.8028 33.0213 60.5092 33.4012 59.1269 33.4012Z" fill="#4B8A79"/>
<path d="M65.2579 35.7533L64.4958 34.6496C62.9363 35.6628 61.0933 36.2419 59.1262 36.2419C57.0705 36.2419 55.1743 35.6086 53.5794 34.541L52.8174 35.6448C54.625 36.8752 56.787 37.5989 59.1262 37.5989C61.3769 37.5989 63.4857 36.9113 65.2579 35.7533Z" fill="#4B8A79"/>
<path d="M59.1265 39.1377C56.4683 39.1377 54.005 38.3234 51.9316 36.9121L50.9746 38.3054C53.2961 39.8976 56.1138 40.8385 59.1265 40.8385C62.0505 40.8385 64.7974 39.9519 67.0834 38.432L66.1265 37.0388C64.1062 38.3596 61.6961 39.1377 59.1265 39.1377Z" fill="#4B8A79"/>
</g>
<rect x="28" y="120" width="77.1302" height="40" rx="5.85799" fill="url(#paint0_linear_17063_68013)"/>
<rect x="28" y="60" width="59" height="50" rx="5.85799" fill="white"/>
<path d="M41.7041 81.0303L44.5996 83.9258C51.7948 76.7305 63.4636 76.7305 70.6589 83.9258L73.5543 81.0303C64.7666 72.2425 50.5063 72.2425 41.7041 81.0303ZM53.286 92.6122L57.6292 96.9554L61.9724 92.6122C59.5837 90.2089 55.6892 90.2089 53.286 92.6122ZM47.4951 86.8212L50.3905 89.7167C54.3863 85.7209 60.8721 85.7209 64.8679 89.7167L67.7634 86.8212C62.1751 81.233 53.0978 81.233 47.4951 86.8212Z" fill="#4B8A79"/>
<rect x="115" width="64" height="51" rx="5.85799" fill="white"/>
<path d="M165.655 27.4551H162.473V25.0732H165.655C166.088 25.0732 166.44 25 166.709 24.8535C166.979 24.707 167.175 24.5049 167.298 24.2471C167.427 23.9834 167.492 23.6875 167.492 23.3594C167.492 23.0078 167.427 22.6826 167.298 22.3838C167.175 22.085 166.979 21.8447 166.709 21.6631C166.44 21.4756 166.088 21.3818 165.655 21.3818H163.633V31.7969H160.548V19H165.655C166.68 19 167.562 19.1875 168.3 19.5625C169.044 19.9375 169.616 20.4531 170.014 21.1094C170.413 21.7598 170.612 22.5039 170.612 23.3418C170.612 24.168 170.413 24.8887 170.014 25.5039C169.616 26.1191 169.044 26.5996 168.3 26.9453C167.562 27.2852 166.68 27.4551 165.655 27.4551Z" fill="#4B8A79"/>
<path d="M155.239 19V31.7969H152.154V19H155.239ZM159.088 19V21.3818H148.392V19H159.088Z" fill="#4B8A79"/>
<path d="M143.593 19V31.7969H140.508V19H143.593ZM147.442 19V21.3818H136.746V19H147.442Z" fill="#4B8A79"/>
<path d="M133.476 24.0801V26.4531H126.911V24.0801H133.476ZM127.939 19V31.7969H124.854V19H127.939ZM135.55 19V31.7969H132.474V19H135.55Z" fill="#4B8A79"/>
<rect x="114.894" y="120" width="64.4379" height="40" rx="5.85799" fill="url(#paint1_linear_17063_68013)"/>
<rect x="189" width="102" height="51" rx="5.85799" fill="white"/>
<path d="M230.034 27.1094C230.159 27.3778 230.276 27.6534 230.387 27.9363C230.494 27.6509 230.614 27.3702 230.746 27.0949C230.871 26.8266 231.003 26.5582 231.135 26.3044L234.831 19.095C234.897 18.9717 234.963 18.8774 235.036 18.8049C235.102 18.7396 235.183 18.6888 235.271 18.6526C235.359 18.6163 235.454 18.6018 235.564 18.6018H238.498V32.861H235.549V24.6507C235.549 24.2518 235.571 23.8239 235.608 23.3597L231.787 30.6924C231.67 30.9244 231.509 31.0913 231.311 31.2146C231.113 31.3306 230.878 31.3886 230.621 31.3886H230.166C229.91 31.3886 229.682 31.3306 229.477 31.2146C229.279 31.0985 229.118 30.9244 229 30.6924L225.15 23.3524C225.18 23.5845 225.194 23.8094 225.209 24.0342C225.224 24.2591 225.231 24.4694 225.231 24.658V32.861H222.283V18.6018H225.216C225.326 18.6018 225.422 18.6163 225.51 18.6526C225.598 18.6888 225.671 18.7324 225.744 18.8049C225.81 18.8702 225.884 18.9717 225.95 19.095L229.66 26.3406C229.785 26.5872 229.917 26.8411 230.034 27.1094ZM254.317 25.7241C254.317 26.3406 254.251 26.9281 254.126 27.4938C253.994 28.0596 253.81 28.589 253.568 29.0822C253.326 29.5754 253.033 30.0396 252.674 30.4603C252.322 30.8882 251.918 31.2581 251.471 31.5845L255.123 35.53H252.373C251.977 35.53 251.618 35.4793 251.295 35.385C250.972 35.2907 250.686 35.1021 250.437 34.812L248.648 32.8247C248.354 32.8827 248.061 32.9262 247.76 32.9625C247.459 32.9915 247.151 33.0133 246.836 33.0133C245.714 33.0133 244.687 32.8247 243.763 32.4548C242.839 32.0849 242.047 31.57 241.394 30.9099C240.734 30.2572 240.228 29.4811 239.869 28.5963C239.51 27.7114 239.326 26.7468 239.326 25.7169C239.326 24.687 239.51 23.7296 239.869 22.8375C240.228 21.9526 240.734 21.1766 241.394 20.5238C242.054 19.8711 242.839 19.3561 243.763 18.9862C244.687 18.6163 245.707 18.4277 246.836 18.4277C247.958 18.4277 248.978 18.6163 249.902 18.9935C250.826 19.3706 251.61 19.8856 252.263 20.5383C252.916 21.1911 253.422 21.9599 253.781 22.852C254.141 23.7368 254.317 24.6942 254.317 25.7241ZM250.892 25.7241C250.892 25.0206 250.796 24.3823 250.613 23.8166C250.43 23.2509 250.166 22.7722 249.814 22.3806C249.469 21.9889 249.044 21.6915 248.545 21.4812C248.046 21.2709 247.474 21.1693 246.829 21.1693C246.183 21.1693 245.604 21.2709 245.098 21.4812C244.592 21.6915 244.167 21.9889 243.822 22.3806C243.477 22.7722 243.213 23.2509 243.023 23.8166C242.839 24.3823 242.744 25.0134 242.744 25.7241C242.744 26.4349 242.839 27.0732 243.023 27.6389C243.206 28.2046 243.47 28.6833 243.822 29.075C244.167 29.4666 244.592 29.764 245.098 29.9743C245.604 30.1774 246.176 30.2862 246.829 30.2862C247.467 30.2862 248.039 30.1847 248.545 29.9743C249.044 29.7712 249.469 29.4666 249.814 29.075C250.158 28.6833 250.422 28.2046 250.613 27.6389C250.804 27.0732 250.892 26.4349 250.892 25.7241ZM265.06 18.5946V21.2201H261.152V32.861H257.807V21.2201H253.898V18.5946H265.06ZM277.865 18.5946V21.2201H273.81V32.861H270.465V21.2201H266.557V18.5946H277.865Z" fill="#4B8A79"/>
<path d="M204.368 26.4816H204.325V32.2049C204.325 32.6179 204.655 32.9571 205.056 32.9571H210.78C210.73 29.3801 207.879 26.4816 204.368 26.4816ZM204.368 21.7614H204.325V24.1953C209.047 24.2174 212.887 28.1263 212.937 32.9571H215.387C215.344 26.7766 210.422 21.7614 204.368 21.7614ZM218.862 32.2122V27.0421C217.2 22.853 213.854 19.5414 209.691 18H205.056C204.655 18 204.325 18.3393 204.325 18.7523V19.4824C211.59 19.5046 217.501 25.5302 217.544 32.9645H218.131C218.54 32.9571 218.862 32.6252 218.862 32.2122ZM216.949 20.0872C217.623 20.7805 218.31 21.6582 218.862 22.4326V18.7449C218.862 18.647 218.844 18.55 218.808 18.4595C218.771 18.369 218.718 18.2868 218.651 18.2175C218.584 18.1483 218.504 18.0934 218.416 18.0561C218.328 18.0188 218.234 17.9997 218.139 18H214.449C215.309 18.6122 216.197 19.3128 216.949 20.0872Z" fill="#4B8A79"/>
<rect x="189.095" y="120" width="101.538" height="40" rx="5.85799" fill="url(#paint2_linear_17063_68013)"/>
<path d="M257 65.858C257 62.6227 259.623 60 262.858 60H352.142C355.377 60 358 62.6227 358 65.858V104.142C358 107.377 355.377 110 352.142 110H262.858C259.623 110 257 107.377 257 104.142V65.858Z" fill="white"/>
<path d="M292.432 86.0178L294.876 86.7841C294.501 88.1317 293.877 89.134 293.002 89.7909C292.134 90.4421 291.029 90.7678 289.689 90.7678C288.031 90.7678 286.669 90.2091 285.601 89.0917C284.534 87.9688 284 86.436 284 84.4934C284 82.4385 284.537 80.8439 285.61 79.7097C286.683 78.5699 288.094 78 289.843 78C291.37 78 292.611 78.4465 293.565 79.3392C294.132 79.867 294.558 80.625 294.842 81.6131L292.347 82.2027C292.199 81.5626 291.89 81.0572 291.418 80.6868C290.953 80.3161 290.385 80.1309 289.715 80.1309C288.789 80.1309 288.037 80.4593 287.458 81.1162C286.884 81.7731 286.598 82.837 286.598 84.3082C286.598 85.869 286.882 86.9807 287.449 87.6433C288.017 88.3057 288.755 88.6371 289.664 88.6371C290.334 88.6371 290.91 88.4265 291.393 88.0054C291.875 87.5843 292.222 86.9217 292.432 86.0178ZM296.789 85.9589C296.789 85.1728 296.985 84.4121 297.376 83.6765C297.768 82.9409 298.322 82.3795 299.037 81.992C299.758 81.6047 300.562 81.411 301.448 81.411C302.816 81.411 303.937 81.8517 304.812 82.7333C305.686 83.6092 306.123 84.718 306.123 86.0599C306.123 87.4129 305.681 88.536 304.795 89.4286C303.915 90.3158 302.805 90.7593 301.465 90.7593C300.636 90.7593 299.844 90.574 299.088 90.2034C298.339 89.833 297.768 89.2911 297.376 88.5781C296.985 87.8594 296.789 86.9864 296.789 85.9589ZM299.242 86.0851C299.242 86.9724 299.455 87.6516 299.88 88.1233C300.306 88.5948 300.832 88.8306 301.456 88.8306C302.081 88.8306 302.603 88.5948 303.023 88.1233C303.449 87.6516 303.662 86.9667 303.662 86.0682C303.662 85.1924 303.449 84.5186 303.023 84.0471C302.603 83.5754 302.081 83.3396 301.456 83.3396C300.832 83.3396 300.306 83.5754 299.88 84.0471C299.455 84.5186 299.242 85.1981 299.242 86.0851ZM319.593 90.5572H316.851L315.761 87.7527H310.77L309.739 90.5572H307.065L311.928 78.2106H314.594L319.593 90.5572ZM314.952 85.6724L313.231 81.0909L311.545 85.6724H314.952ZM321.251 90.5572V78.2106H325.296C326.829 78.2106 327.829 78.2724 328.294 78.3958C329.01 78.5813 329.609 78.9854 330.091 79.6086C330.574 80.2263 330.815 81.0263 330.815 82.0089C330.815 82.7669 330.676 83.4042 330.398 83.9207C330.12 84.4373 329.765 84.8443 329.333 85.1419C328.907 85.4339 328.473 85.6277 328.03 85.723C327.428 85.8409 326.557 85.8999 325.415 85.8999H323.772V90.5572H321.251ZM323.772 80.2993V83.8027H325.151C326.145 83.8027 326.809 83.7383 327.144 83.6092C327.479 83.4801 327.741 83.2778 327.928 83.0027C328.121 82.7276 328.217 82.4076 328.217 82.0427C328.217 81.5935 328.084 81.2229 327.817 80.9309C327.55 80.639 327.212 80.4564 326.804 80.3834C326.503 80.3273 325.898 80.2993 324.99 80.2993H323.772Z" fill="#4B8A79"/>
<path d="M96 65.858C96 62.6227 98.6227 60 101.858 60H173.142C176.377 60 179 62.6227 179 65.858V104.142C179 107.377 176.377 110 173.142 110H101.858C98.6227 110 96 107.377 96 104.142V65.858Z" fill="white"/>
<path d="M127.044 79H130.154V87.2264C130.154 88.2067 129.945 89.0371 129.525 89.7177C129.106 90.3924 128.518 90.9027 127.762 91.2488C127.006 91.5947 126.117 91.7678 125.095 91.7678C124.085 91.7678 123.196 91.5947 122.428 91.2488C121.666 90.9027 121.069 90.3924 120.638 89.7177C120.213 89.0371 120 88.2067 120 87.2264V79H123.119V87.2264C123.119 87.7454 123.196 88.1692 123.349 88.4979C123.503 88.8208 123.727 89.0573 124.023 89.2073C124.318 89.3572 124.675 89.4322 125.095 89.4322C125.52 89.4322 125.878 89.3572 126.167 89.2073C126.456 89.0573 126.675 88.8208 126.823 88.4979C126.97 88.1692 127.044 87.7454 127.044 87.2264V79ZM136.628 91.5947H133.766L133.783 89.2591H136.628C137.218 89.2591 137.718 89.1208 138.125 88.8439C138.539 88.5672 138.852 88.1549 139.064 87.6069C139.283 87.0533 139.392 86.3729 139.392 85.5656V85.0206C139.392 84.4151 139.33 83.8845 139.206 83.4289C139.088 82.9675 138.911 82.584 138.674 82.2785C138.438 81.967 138.143 81.7335 137.788 81.5778C137.44 81.4221 137.038 81.3443 136.583 81.3443H133.713V79H136.583C137.458 79 138.258 79.147 138.985 79.4412C139.717 79.7295 140.349 80.1447 140.881 80.6868C141.418 81.2231 141.832 81.8604 142.121 82.5985C142.417 83.3309 142.564 84.144 142.564 85.0378V85.5656C142.564 86.4537 142.417 87.2667 142.121 88.0049C141.832 88.743 141.421 89.3803 140.89 89.9166C140.358 90.4528 139.729 90.8682 139.002 91.1622C138.282 91.4506 137.49 91.5947 136.628 91.5947ZM135.547 79V91.5947H132.437V79H135.547ZM149.658 87.3216H146.45V84.9773H149.658C150.095 84.9773 150.45 84.9052 150.721 84.761C150.993 84.6169 151.191 84.418 151.315 84.1642C151.445 83.9047 151.51 83.6135 151.51 83.2906C151.51 82.9444 151.445 82.6245 151.315 82.3303C151.191 82.0362 150.993 81.7998 150.721 81.621C150.45 81.4364 150.095 81.3443 149.658 81.3443H147.62V91.5947H144.51V79H149.658C150.692 79 151.581 79.1845 152.325 79.5536C153.075 79.9227 153.651 80.4302 154.053 81.076C154.455 81.7162 154.655 82.4485 154.655 83.2732C154.655 84.0863 154.455 84.7957 154.053 85.4011C153.651 86.0066 153.075 86.4795 152.325 86.8198C151.581 87.1542 150.692 87.3216 149.658 87.3216Z" fill="#4B8A79"/>
<rect x="189" y="60" width="58" height="50" rx="5.85799" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M217.767 80.0992C222.988 75.2953 228.279 72.8314 229.992 74.5434C231.759 76.3111 229.078 81.888 223.968 87.2686C226.244 90.7343 227.1 93.6975 225.898 94.8994C224.637 96.1598 221.439 95.1558 217.755 92.6228V92.6405C214.082 95.1606 210.895 96.1567 209.637 94.8994C208.435 93.6976 209.289 90.7339 211.565 87.2686C206.54 81.9769 203.865 76.4954 205.46 74.6348L205.543 74.5445C207.256 72.8319 212.545 75.2959 217.767 80.0992ZM217.755 89.2033C219.206 90.3414 220.583 91.2303 221.78 91.8331C222.5 92.1954 223.092 92.4201 223.549 92.548C223.421 92.0911 223.195 91.4999 222.833 90.7806C221.849 88.8263 220.101 86.395 217.755 83.9457V89.2033ZM207.895 76.8948C208.022 77.3516 208.247 77.9431 208.609 78.6622C209.526 80.482 211.104 82.7163 213.211 84.9931C213.983 84.0142 214.849 83.0188 215.795 82.0308C213.587 80.0139 211.429 78.4993 209.662 77.6096C208.943 77.2478 208.351 77.0228 207.895 76.8948Z" fill="#4B8A79"/>
<rect x="300" width="58" height="51" rx="5.85799" fill="white"/>
<g clip-path="url(#clip2_17063_68013)">
<path d="M330.115 12H328.6C324.403 12 321 15.4707 321 19.752V30.248C321 34.5293 324.403 38 328.6 38H330.115C334.312 38 337.714 34.5293 337.714 30.248V19.752C337.714 15.4707 334.312 12 330.115 12Z" fill="#4B8A79"/>
<path d="M334.015 21.3373L330.262 25.0894L333.999 28.9258L328.535 35.6748V26.817L325.585 29.7667L324.616 28.7585L328.298 25.0762L324.609 21.2888L325.591 20.2937L328.535 23.3157V14.873L334.015 21.3373ZM329.919 31.7479L332.133 29.0133L329.919 26.7401V31.7479ZM329.919 23.4557L332.117 21.2575L329.919 18.6644V23.4557Z" fill="white"/>
</g>
<rect x="300.396" y="120" width="57.6035" height="40" rx="5.85799" fill="url(#paint3_linear_17063_68013)"/>
</g>
</g>
<defs>
<filter id="filter0_dddd_17063_68013" x="0.569185" y="-4.5718" width="384.862" height="260.58" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="4.5718"/>
<feGaussianBlur stdDeviation="4.5718"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.06 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_17063_68013"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="17.3729"/>
<feGaussianBlur stdDeviation="8.68643"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.05 0"/>
<feBlend mode="normal" in2="effect1_dropShadow_17063_68013" result="effect2_dropShadow_17063_68013"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="38.4031"/>
<feGaussianBlur stdDeviation="11.4295"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.03 0"/>
<feBlend mode="normal" in2="effect2_dropShadow_17063_68013" result="effect3_dropShadow_17063_68013"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="68.577"/>
<feGaussianBlur stdDeviation="13.7154"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.01 0"/>
<feBlend mode="normal" in2="effect3_dropShadow_17063_68013" result="effect4_dropShadow_17063_68013"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect4_dropShadow_17063_68013" result="shape"/>
</filter>
<linearGradient id="paint0_linear_17063_68013" x1="66.5651" y1="120" x2="66.5651" y2="148" gradientUnits="userSpaceOnUse">
<stop stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint1_linear_17063_68013" x1="147.112" y1="120" x2="147.112" y2="148" gradientUnits="userSpaceOnUse">
<stop stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint2_linear_17063_68013" x1="239.864" y1="120" x2="239.864" y2="148" gradientUnits="userSpaceOnUse">
<stop stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint3_linear_17063_68013" x1="329.198" y1="120" x2="329.198" y2="148" gradientUnits="userSpaceOnUse">
<stop stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</linearGradient>
<clipPath id="clip0_17063_68013">
<rect width="387" height="148" fill="white"/>
</clipPath>
<clipPath id="clip1_17063_68013">
<rect width="44.5714" height="30" fill="white" transform="translate(44.1328 11)"/>
</clipPath>
<clipPath id="clip2_17063_68013">
<rect width="16.7143" height="26" fill="white" transform="translate(321 12)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 19 KiB

107
ui-ngx/src/assets/iot-hub/category-rule-chains-img.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 36 KiB

BIN
ui-ngx/src/assets/iot-hub/category-solution-templates-img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

181
ui-ngx/src/assets/iot-hub/category-widgets-img.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 72 KiB

30
ui-ngx/src/assets/iot-hub/hero-dashboard-icon-1.svg

@ -0,0 +1,30 @@
<svg width="74" height="74" viewBox="0 0 74 74" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_ii_16977_25520)">
<rect y="8.09252" width="66.4017" height="66.4017" rx="6.15549" transform="rotate(-7 0 8.09252)" fill="#4D5FD0"/>
<rect x="0.571648" y="8.53914" width="65.3758" height="65.3758" rx="5.64254" transform="rotate(-7 0.571648 8.53914)" stroke="white" stroke-opacity="0.12" stroke-width="1.02592"/>
<g clip-path="url(#clip0_16977_25520)">
<path d="M22.2501 40.5846L35.2941 38.983L33.2921 22.6779L20.2481 24.2795L22.2501 40.5846ZM23.8517 53.6286L36.8957 52.027L35.6945 42.244L22.6505 43.8456L23.8517 53.6286ZM40.1568 51.6266L53.2008 50.025L51.1988 33.7199L38.1547 35.3216L40.1568 51.6266ZM36.5531 22.2775L37.7543 32.0605L50.7984 30.4589L49.5972 20.6759L36.5531 22.2775Z" fill="white"/>
</g>
</g>
<defs>
<filter id="filter0_ii_16977_25520" x="0" y="-2.07505" width="74" height="78.1501" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="-2.05183"/>
<feGaussianBlur stdDeviation="4.10366"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_16977_25520"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2.05183"/>
<feGaussianBlur stdDeviation="4.10366"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="effect1_innerShadow_16977_25520" result="effect2_innerShadow_16977_25520"/>
</filter>
<clipPath id="clip0_16977_25520">
<rect width="38.9848" height="38.9848" fill="white" transform="translate(14.7589 19.9893) scale(1.01132) rotate(-7)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

25
ui-ngx/src/assets/iot-hub/hero-dashboard-icon-2.svg

@ -0,0 +1,25 @@
<svg width="73" height="73" viewBox="0 0 73 73" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_ii_16977_25524)">
<rect x="6.94297" width="66.421" height="66.421" rx="6.15549" transform="rotate(6 6.94297 0)" fill="#4D5FD0"/>
<rect x="7.3995" y="0.563767" width="65.3951" height="65.3951" rx="5.64254" transform="rotate(6 7.3995 0.563767)" stroke="white" stroke-opacity="0.12" stroke-width="1.02592"/>
<path d="M21.3894 36.7069L20.187 48.1464L49.6031 51.2382L49.8607 48.7869L36.3551 35.8014L28.8734 44.1026L21.3894 36.7069ZM22.42 26.9015L28.4416 32.4912L37.815 21.9105L45.2991 29.3062L51.836 29.9933L50.2953 44.6523L36.1892 31.0915L28.7437 39.3634L21.8291 32.5232L22.42 26.9015Z" fill="white"/>
</g>
<defs>
<filter id="filter0_ii_16977_25524" x="0" y="-2.07566" width="73" height="77.1513" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="-2.05183"/>
<feGaussianBlur stdDeviation="4.10366"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_16977_25524"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2.05183"/>
<feGaussianBlur stdDeviation="4.10366"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="effect1_innerShadow_16977_25524" result="effect2_innerShadow_16977_25524"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

30
ui-ngx/src/assets/iot-hub/hero-dashboard-icon-3.svg

@ -0,0 +1,30 @@
<svg width="78" height="78" viewBox="0 0 78 78" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_ii_16977_25528)">
<rect y="13.6723" width="65.764" height="65.764" rx="6.15549" transform="rotate(-12 0 13.6723)" fill="#4D5FD0"/>
<rect x="0.608399" y="14.0674" width="64.7381" height="64.7381" rx="5.64254" transform="rotate(-12 0.608399 14.0674)" stroke="white" stroke-opacity="0.12" stroke-width="1.02592"/>
<g clip-path="url(#clip0_16977_25528)">
<path d="M41.5261 35.0443L37.9298 34.2452L40.8901 32.0524L41.6892 28.4561L43.882 31.4165L47.4783 32.2156L44.5179 34.4084L43.7188 38.0047L41.5261 35.0443ZM26.8897 44.9084L27.6888 41.3121L30.6492 39.1194L27.0529 38.3203L24.8601 35.3599L24.061 38.9562L21.1007 41.149L24.697 41.9481L26.8897 44.9084ZM32.3598 35.4291L33.2792 31.2251L36.7458 28.6752L32.5418 27.7558L29.9919 24.2892L29.0725 28.4932L25.6059 31.0431L29.8099 31.9625L32.3598 35.4291ZM29.8842 55.0835L37.3997 43.4895L45.1185 48.5021L55.4117 30.4129L52.6909 28.6459L44.1037 43.7279L36.3849 38.7152L26.9897 53.2038L29.8842 55.0835Z" fill="white"/>
</g>
</g>
<defs>
<filter id="filter0_ii_16977_25528" x="0" y="-2.05513" width="78" height="82.1103" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="-2.05183"/>
<feGaussianBlur stdDeviation="4.10366"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_16977_25528"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2.05183"/>
<feGaussianBlur stdDeviation="4.10366"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="effect1_innerShadow_16977_25528" result="effect2_innerShadow_16977_25528"/>
</filter>
<clipPath id="clip0_16977_25528">
<rect width="38.9848" height="38.9848" fill="white" transform="translate(15.787 23.9818) scale(1.00161) rotate(-12)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

30
ui-ngx/src/assets/iot-hub/hero-dashboard-icon-4.svg

@ -0,0 +1,30 @@
<svg width="83" height="83" viewBox="0 0 83 83" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_ii_16977_25533)">
<rect x="20.3542" width="65.8694" height="65.8694" rx="6.15549" transform="rotate(18 20.3542 0)" fill="#4D5FD0"/>
<rect x="20.6835" y="0.646365" width="64.8435" height="64.8435" rx="5.64254" transform="rotate(18 20.6835 0.646365)" stroke="white" stroke-opacity="0.12" stroke-width="1.02592"/>
<g clip-path="url(#clip0_16977_25533)">
<path d="M59.3825 28.4348L57.8718 33.0843L62.5213 34.595L61.5141 37.6946L56.8646 36.1839L55.3539 40.8334L52.2543 39.8263L53.765 35.1768L49.1155 33.6661L50.1227 30.5664L54.7721 32.0771L56.2828 27.4277L59.3825 28.4348ZM40.9411 43.0042C39.2363 42.4502 38.2946 40.6022 38.8486 38.8974C39.4025 37.1926 41.2505 36.2509 42.9553 36.8049C44.6601 37.3588 45.6018 39.2068 45.0479 40.9116C44.4939 42.6164 42.6459 43.5581 40.9411 43.0042ZM47.4964 28.1025L46.4792 31.2331C45.9928 30.9855 45.4881 30.7757 44.9696 30.6056C39.7777 28.9186 34.3765 31.5672 32.5485 37.1931C31.3702 40.8196 32.8313 46.6061 37.2449 54.3799C45.3849 50.685 49.9631 46.878 51.1464 43.2359L51.2471 42.9259L54.3468 43.9331L54.2461 44.243C52.5742 49.3884 46.4572 54.1347 35.9054 58.5024C29.9361 48.7667 27.777 41.3313 29.4489 36.1859C31.9567 28.4678 39.4675 25.3909 45.9768 27.5059C46.5037 27.6771 47.0051 27.8743 47.4964 28.1025Z" fill="white"/>
</g>
</g>
<defs>
<filter id="filter0_ii_16977_25533" x="0" y="-2.05842" width="83" height="87.1168" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="-2.05183"/>
<feGaussianBlur stdDeviation="4.10366"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_16977_25533"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2.05183"/>
<feGaussianBlur stdDeviation="4.10366"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="effect1_innerShadow_16977_25533" result="effect2_innerShadow_16977_25533"/>
</filter>
<clipPath id="clip0_16977_25533">
<rect width="38.9848" height="38.9848" fill="white" transform="translate(28.8893 16.8136) scale(1.00321) rotate(18)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

27
ui-ngx/src/assets/iot-hub/hero-widget-icon-1.svg

@ -0,0 +1,27 @@
<svg width="79" height="79" viewBox="0 0 79 79" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_ii_16977_25487)">
<rect y="16.6941" width="64.5028" height="64.5028" rx="5.99735" transform="rotate(-15 0 16.6941)" fill="#2C9755"/>
<rect x="0.612102" y="17.0475" width="63.5033" height="63.5033" rx="5.49758" transform="rotate(-15 0.612102 17.0475)" stroke="white" stroke-opacity="0.12" stroke-width="0.999559"/>
<path d="M28.3431 35.2648C27.6301 37.1079 27.3916 39.0997 27.6496 41.0577C27.6732 41.2124 27.6391 41.3703 27.5537 41.5016C27.4684 41.6329 27.3377 41.7284 27.1866 41.7699L21.365 43.3298C21.2798 43.3529 21.1907 43.3582 21.1033 43.3452C21.016 43.3323 20.9323 43.3014 20.8575 43.2545C20.7827 43.2076 20.7185 43.1458 20.6689 43.0729C20.6193 43.0001 20.5853 42.9177 20.5692 42.831C19.9007 39.0826 20.3753 35.2191 21.9316 31.7407C21.969 31.6598 22.0229 31.5876 22.0899 31.5287C22.1569 31.4698 22.2355 31.4256 22.3206 31.3988C22.4058 31.372 22.4956 31.3633 22.5842 31.3732C22.6729 31.3832 22.7585 31.4115 22.8355 31.4564L28.0732 34.4739C28.206 34.5512 28.3063 34.6737 28.3559 34.819C28.4055 34.9642 28.4009 35.1225 28.3431 35.2648Z" fill="white"/>
<path d="M47.5433 22.9025L44.5154 28.1356C44.4373 28.268 44.3142 28.3681 44.1685 28.4177C44.0228 28.4674 43.8641 28.4633 43.7213 28.4062C41.3783 27.5098 38.8104 27.3769 36.3856 28.0266C33.9607 28.6764 31.8033 30.0754 30.2224 32.0232C30.1278 32.1448 29.9924 32.2281 29.8412 32.258C29.69 32.2879 29.5331 32.2623 29.3994 32.1859L24.1606 29.1679C24.0834 29.1238 24.0162 29.0642 23.9633 28.9927C23.9105 28.9212 23.8733 28.8395 23.8539 28.7528C23.8346 28.666 23.8336 28.5762 23.851 28.489C23.8685 28.4019 23.9039 28.3193 23.9552 28.2466C26.5405 24.7018 30.2646 22.1481 34.5059 21.0116C38.7473 19.8752 43.2493 20.2247 47.2606 22.0019C47.3413 22.0393 47.4133 22.0931 47.472 22.1598C47.5307 22.2266 47.5747 22.3049 47.6014 22.3896C47.628 22.4744 47.6365 22.5638 47.6266 22.6521C47.6166 22.7405 47.5882 22.8257 47.5433 22.9025Z" fill="white"/>
<path d="M57.9955 34.5403C60.7268 44.7336 54.6568 55.2639 44.4167 58.0035C35.0048 60.5255 25.2716 55.6207 21.6825 46.7113C21.65 46.6274 21.6356 46.5377 21.6403 46.4479C21.645 46.358 21.6686 46.2702 21.7097 46.1901C21.7507 46.11 21.8083 46.0394 21.8785 45.9831C21.9488 45.9267 22.0302 45.8857 22.1173 45.8629L27.9767 44.2929C28.1225 44.2548 28.277 44.2693 28.413 44.3338C28.549 44.3983 28.6577 44.5087 28.7201 44.6455C29.9969 47.3101 32.2227 49.4033 34.9634 50.5169C37.7041 51.6304 40.7632 51.6845 43.5439 50.6685C48.8067 48.7627 52.0795 43.2914 51.2452 37.7682C50.8126 34.8222 49.2854 32.1476 46.9671 30.2758C46.8458 30.1814 46.7626 30.0464 46.733 29.8956C46.7034 29.7448 46.7293 29.5884 46.806 29.455L49.8338 24.2219C49.878 24.1447 49.9379 24.0776 50.0095 24.0248C50.0812 23.972 50.1631 23.9347 50.25 23.9153C50.3369 23.8959 50.4269 23.8949 50.5142 23.9122C50.6015 23.9295 50.6842 23.9648 50.757 24.0159C54.3131 26.5858 56.87 30.3034 57.9955 34.5403Z" fill="white"/>
</g>
<defs>
<filter id="filter0_ii_16977_25487" x="0" y="-2.01571" width="79" height="83.0314" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="-1.99912"/>
<feGaussianBlur stdDeviation="3.99824"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_16977_25487"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="1.99912"/>
<feGaussianBlur stdDeviation="3.99824"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="effect1_innerShadow_16977_25487" result="effect2_innerShadow_16977_25487"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

25
ui-ngx/src/assets/iot-hub/hero-widget-icon-2.svg

@ -0,0 +1,25 @@
<svg width="79" height="79" viewBox="0 0 79 79" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_ii_16977_25492)">
<rect x="16.6941" width="64.5028" height="64.5028" rx="5.99735" transform="rotate(15 16.6941 0)" fill="#2C9755"/>
<rect x="17.0475" y="0.612102" width="63.5033" height="63.5033" rx="5.49758" transform="rotate(15 17.0475 0.612102)" stroke="white" stroke-opacity="0.12" stroke-width="0.999559"/>
<path d="M24.4505 48.4841L47.664 54.7041C50.0377 55.3402 52.2072 53.1625 51.5696 50.7944L45.3363 27.6308C44.6987 25.2627 41.7392 24.4698 40.003 26.2018L23.0229 43.1454C21.2868 44.8774 22.0768 47.848 24.4505 48.4841ZM38.9484 40.8043C38.1006 40.5772 37.5928 39.6977 37.82 38.8499L38.646 35.7671C38.8732 34.9193 39.7527 34.4116 40.6004 34.6387C41.4482 34.8659 41.956 35.7454 41.7288 36.5931L40.9028 39.6759C40.6756 40.5237 39.7961 41.0315 38.9484 40.8043ZM38.8377 47.3829L35.7549 46.5569L36.5809 43.4741L39.6637 44.3001L38.8377 47.3829Z" fill="white"/>
</g>
<defs>
<filter id="filter0_ii_16977_25492" x="0" y="-2.01571" width="79" height="83.0314" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="-1.99912"/>
<feGaussianBlur stdDeviation="3.99824"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_16977_25492"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="1.99912"/>
<feGaussianBlur stdDeviation="3.99824"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="effect1_innerShadow_16977_25492" result="effect2_innerShadow_16977_25492"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

35
ui-ngx/src/assets/iot-hub/hero-widget-icon-3.svg

@ -0,0 +1,35 @@
<svg width="88" height="88" viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_ii_16977_25494)">
<g clip-path="url(#clip0_16977_25494)">
<rect y="32.2108" width="64.4207" height="64.4207" rx="5.99735" transform="rotate(-30 0 32.2108)" fill="#2C9755"/>
<g clip-path="url(#clip1_16977_25494)">
<path d="M38.3283 49.6292L45.5002 62.0512C45.7115 62.4172 45.7688 62.8522 45.6594 63.2605C45.55 63.6688 45.2829 64.0169 44.9168 64.2283L39.3959 67.4157C39.0299 67.6271 38.5949 67.6844 38.1866 67.575C37.7783 67.4656 37.4302 67.1984 37.2188 66.8324L30.047 54.4104C29.8357 54.0443 29.7784 53.6093 29.8878 53.201C29.9972 52.7928 30.2643 52.4447 30.6304 52.2333L36.1512 49.0458C36.5173 48.8345 36.9523 48.7772 37.3606 48.8866C37.7689 48.996 38.117 49.2631 38.3283 49.6292ZM38.4274 27.4884L32.9065 30.6759C32.5405 30.8873 32.2734 31.2354 32.164 31.6436C32.0546 32.0519 32.1119 32.4869 32.3232 32.853L48.2606 60.4574C48.472 60.8235 48.8201 61.0906 49.2283 61.2C49.6366 61.3094 50.0717 61.2521 50.4377 61.0408L55.9586 57.8533C56.3246 57.6419 56.5918 57.2938 56.7012 56.8856C56.8106 56.4773 56.7533 56.0423 56.5419 55.6762L40.6045 28.0718C40.3932 27.7057 40.0451 27.4386 39.6368 27.3292C39.2285 27.2198 38.7935 27.2771 38.4274 27.4884ZM53.4536 28.0146L47.9327 31.202C47.5666 31.4134 47.2995 31.7615 47.1901 32.1698C47.0807 32.5781 47.138 33.0131 47.3493 33.3791L59.3024 54.0825C59.5137 54.4485 59.8618 54.7156 60.2701 54.825C60.6784 54.9344 61.1134 54.8771 61.4795 54.6658L67.0004 51.4783C67.3664 51.267 67.6335 50.9189 67.7429 50.5106C67.8523 50.1023 67.7951 49.6673 67.5837 49.3012L55.6306 28.5979C55.4193 28.2319 55.0712 27.9647 54.6629 27.8553C54.2546 27.7459 53.8196 27.8032 53.4536 28.0146Z" fill="white"/>
</g>
</g>
<rect x="0.682712" y="32.3937" width="63.4212" height="63.4212" rx="5.49758" transform="rotate(-30 0.682712 32.3937)" stroke="white" stroke-opacity="0.12" stroke-width="0.999559"/>
</g>
<defs>
<filter id="filter0_ii_16977_25494" x="0" y="-2.01315" width="88" height="92.0263" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="-1.99912"/>
<feGaussianBlur stdDeviation="3.99824"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_16977_25494"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="1.99912"/>
<feGaussianBlur stdDeviation="3.99824"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="effect1_innerShadow_16977_25494" result="effect2_innerShadow_16977_25494"/>
</filter>
<clipPath id="clip0_16977_25494">
<rect y="32.2108" width="64.4207" height="64.4207" rx="5.99735" transform="rotate(-30 0 32.2108)" fill="white"/>
</clipPath>
<clipPath id="clip1_16977_25494">
<rect width="37.9832" height="37.9832" fill="white" transform="translate(18.3073 37.2636) scale(1.00702) rotate(-30)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

35
ui-ngx/src/assets/iot-hub/hero-widget-icon-4.svg

@ -0,0 +1,35 @@
<svg width="88" height="88" viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_ii_16977_25497)">
<g clip-path="url(#clip0_16977_25497)">
<rect x="32.2108" width="64.4207" height="64.4207" rx="5.99735" transform="rotate(30 32.2108 0)" fill="#2C9755"/>
<g clip-path="url(#clip1_16977_25497)">
<path d="M40.3148 24.9297C40.7549 24.1674 40.4937 23.1927 39.7315 22.7526C38.9692 22.3125 37.9945 22.5737 37.5544 23.336L27.9921 39.8983L24.8044 45.4195C23.4841 47.7064 24.2677 50.6305 26.5545 51.9508L48.638 64.7007C49.4003 65.1408 50.375 64.8797 50.8151 64.1174C51.2552 63.3551 50.9941 62.3804 50.2318 61.9403L28.1482 49.1903C27.386 48.7502 27.1248 47.7755 27.5649 47.0133L30.4223 42.0641L36.9536 40.314L38.2911 45.3058C38.519 46.156 39.3929 46.6606 40.2431 46.4328L56.1204 42.1785L57.4579 47.1703C57.6857 48.0205 58.5597 48.5251 59.4098 48.2973C60.26 48.0694 60.7646 47.1955 60.5368 46.3453L58.7867 39.8141C58.559 38.9639 57.685 38.4593 56.8348 38.6871L40.9575 42.9415L39.62 37.9496C39.3921 37.0994 38.5182 36.5948 37.668 36.8227L32.6762 38.1602L40.3148 24.9297Z" fill="white"/>
</g>
</g>
<rect x="32.3937" y="0.682712" width="63.4212" height="63.4212" rx="5.49758" transform="rotate(30 32.3937 0.682712)" stroke="white" stroke-opacity="0.12" stroke-width="0.999559"/>
</g>
<defs>
<filter id="filter0_ii_16977_25497" x="0" y="-2.01315" width="88" height="92.0263" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="-1.99912"/>
<feGaussianBlur stdDeviation="3.99824"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_16977_25497"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="1.99912"/>
<feGaussianBlur stdDeviation="3.99824"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="effect1_innerShadow_16977_25497" result="effect2_innerShadow_16977_25497"/>
</filter>
<clipPath id="clip0_16977_25497">
<rect x="32.2108" width="64.4207" height="64.4207" rx="5.99735" transform="rotate(30 32.2108 0)" fill="white"/>
</clipPath>
<clipPath id="clip1_16977_25497">
<rect width="37.9832" height="37.9832" fill="white" transform="translate(37.1849 17.6012) scale(1.00702) rotate(30)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

20
ui-ngx/src/assets/locale/locale.constant-en_US.json

@ -3684,14 +3684,32 @@
"item": {
"selected": "Selected",
"type-widget": "Widget",
"type-widget-plural": "Widgets",
"type-dashboard": "Dashboard",
"type-dashboard-plural": "Dashboards",
"type-solution-template": "Solution Template",
"type-solution-template-plural": "Solution Templates",
"type-calculated-field": "Calculated Field",
"type-calculated-field-plural": "Calculated Fields",
"type-rule-chain": "Rule Chain",
"type-device": "Device"
"type-rule-chain-plural": "Rule Chains",
"type-device": "Device",
"type-device-plural": "Devices"
},
"iot-hub": {
"iot-hub": "IoT Hub",
"home-title": "ThingsBoard IoT Hub",
"home-subtitle-prefix": "Discover ready-to-use",
"and-devices": "& Devices",
"search-placeholder": "Search in IoT Hub...",
"device-library": "Device Library",
"popular-widgets": "Popular Widgets",
"popular-dashboards": "Popular Dashboards",
"popular-solution-templates": "Popular Solution Templates",
"popular-calculated-fields": "Popular Calculated Fields",
"popular-rule-chains": "Popular Rule Chains",
"become-creator-text": "Submit your templates to the ThingsBoard IoT Hub to get featured and showcase your solutions to our global community.",
"submit-template": "Submit Template",
"browse": "Browse IoT Hub",
"creator-profile": "Creator Profile",
"title-widgets": "Widgets",

Loading…
Cancel
Save