Browse Source

done graph

feature/web_interface
dslak 2 years ago
parent
commit
12dee2bd23
  1. 2
      Arduino/Sensors/Sensors.ino
  2. 4
      Web/weather/.vscode/extensions.json
  3. 20
      Web/weather/.vscode/launch.json
  4. 42
      Web/weather/.vscode/tasks.json
  5. 3
      Web/weather/src/api/get_data.php
  6. 2
      Web/weather/src/api/station.php
  7. 1
      Web/weather/src/app/app-layout/app-layout.component.html
  8. 0
      Web/weather/src/app/app-layout/app-layout.component.scss
  9. 23
      Web/weather/src/app/app-layout/app-layout.component.spec.ts
  10. 15
      Web/weather/src/app/app-layout/app-layout.component.ts
  11. 6
      Web/weather/src/app/app.component.html
  12. 5
      Web/weather/src/app/app.component.scss
  13. 9
      Web/weather/src/app/app.component.ts
  14. 2
      Web/weather/src/app/app.module.ts
  15. 19
      Web/weather/src/app/dashboard/dashboard.component.html
  16. 44
      Web/weather/src/app/dashboard/dashboard.component.scss
  17. 21
      Web/weather/src/app/dashboard/dashboard.component.ts
  18. 2
      Web/weather/src/app/graph/graph.component.html
  19. 25
      Web/weather/src/app/graph/graph.component.scss
  20. 15
      Web/weather/src/app/graph/graph.component.ts
  21. 4
      Web/weather/src/app/station.service.ts
  22. BIN
      Web/weather/src/assets/fonts/icomoon.eot
  23. 7
      Web/weather/src/assets/fonts/icomoon.svg
  24. BIN
      Web/weather/src/assets/fonts/icomoon.ttf
  25. BIN
      Web/weather/src/assets/fonts/icomoon.woff
  26. 2
      Web/weather/src/assets/fonts/selection.json
  27. 16
      Web/weather/src/assets/scss/forms.scss
  28. 11
      Web/weather/src/assets/scss/global.scss
  29. 21
      Web/weather/src/assets/scss/icons.scss

2
Arduino/Sensors/Sensors.ino

@ -20,7 +20,7 @@ ESP8266WiFiMulti WiFiMulti;
BME280I2C bme;
const byte codes[] = {0x01 ,0x03 ,0x00 ,0x00 ,0x00 ,0x02 ,0xC4 ,0x0B};
const char server[] PROGMEM = "http://2.233.91.82/weather/api/station?data=%d|%d|%f|%f|%f";
const char server[] PROGMEM = "http://2.233.91.82/weather/api/station?data=capaccio|%d|%d|%f|%f|%f";
byte values[2][20];
SoftwareSerial sensor(SERIAL_RO, SERIAL_DI);

4
Web/weather/.vscode/extensions.json

@ -1,4 +0,0 @@
{
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846
"recommendations": ["angular.ng-template"]
}

20
Web/weather/.vscode/launch.json

@ -1,20 +0,0 @@
{
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "ng serve",
"type": "pwa-chrome",
"request": "launch",
"preLaunchTask": "npm: start",
"url": "http://localhost:4200/"
},
{
"name": "ng test",
"type": "chrome",
"request": "launch",
"preLaunchTask": "npm: test",
"url": "http://localhost:9876/debug.html"
}
]
}

42
Web/weather/.vscode/tasks.json

@ -1,42 +0,0 @@
{
// For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "start",
"isBackground": true,
"problemMatcher": {
"owner": "typescript",
"pattern": "$tsc",
"background": {
"activeOnStart": true,
"beginsPattern": {
"regexp": "(.*?)"
},
"endsPattern": {
"regexp": "bundle generation complete"
}
}
}
},
{
"type": "npm",
"script": "test",
"isBackground": true,
"problemMatcher": {
"owner": "typescript",
"pattern": "$tsc",
"background": {
"activeOnStart": true,
"beginsPattern": {
"regexp": "(.*?)"
},
"endsPattern": {
"regexp": "bundle generation complete"
}
}
}
}
]
}

3
Web/weather/src/api/get_data.php

@ -5,8 +5,9 @@
$conn = @mysqli_connect($CONF['DB']['HOST'], $CONF['DB']['USER'], $CONF['DB']['PASS'], 'weather')or die("CONNECTION ERROR");
$day = $_GET['day'];
$spot = $_GET['spot'];
$q = mysqli_query($conn, "SELECT * FROM `data` WHERE `date` LIKE '$day%'");
$q = mysqli_query($conn, "SELECT * FROM `data` WHERE `date` LIKE '$day%' AND `spot` = '$spot'");
if($q) {

2
Web/weather/src/api/station.php

@ -6,7 +6,7 @@ $conn = @mysqli_connect($CONF['DB']['HOST'], $CONF['DB']['USER'], $CONF['DB']['P
$data = explode('|',$_GET['data']);
$query = "INSERT INTO `data` VALUES(NULL, NOW(), ".$data[0].", ".$data[1].", ".$data[2].", ".$data[3].", ".$data[4].")";
$query = "INSERT INTO `data` VALUES(NULL, '".$data[0]."', NOW(), ".$data[1].", ".$data[2].", ".$data[3].", ".$data[4].", ".$data[4].")";
if(mysqli_query($conn, $query)) {
http_response_code(200);

1
Web/weather/src/app/app-layout/app-layout.component.html

@ -1 +0,0 @@
<p>app-layout works!</p>

0
Web/weather/src/app/app-layout/app-layout.component.scss

23
Web/weather/src/app/app-layout/app-layout.component.spec.ts

@ -1,23 +0,0 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AppLayoutComponent } from './app-layout.component';
describe('AppLayoutComponent', () => {
let component: AppLayoutComponent;
let fixture: ComponentFixture<AppLayoutComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ AppLayoutComponent ]
})
.compileComponents();
fixture = TestBed.createComponent(AppLayoutComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

15
Web/weather/src/app/app-layout/app-layout.component.ts

@ -1,15 +0,0 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-app-layout',
templateUrl: './app-layout.component.html',
styleUrls: ['./app-layout.component.scss']
})
export class AppLayoutComponent implements OnInit {
constructor() { }
ngOnInit(): void {
}
}

6
Web/weather/src/app/app.component.html

@ -8,11 +8,11 @@
</div>
</div>
<div class="menu-items" [@slideInOut]="menuOpen ? 'open' : 'close'">
<div class="item" (click)="toggleMenu()">Capaccio</div>
<div class="item" (click)="toggleMenu()">Pisciotta</div>
<div class="item" (click)="setSpot('capaccio')">Capaccio</div>
<div class="item" (click)="setSpot('pisciotta')">Pisciotta</div>
</div>
</header>
<main class="main-content">
<app-dashboard [day]="day"></app-dashboard>
<app-dashboard [day]="day" [spot]="spot"></app-dashboard>
</main>

5
Web/weather/src/app/app.component.scss

@ -22,13 +22,14 @@
.title {
display: block;
padding: 0 50px;
padding: 0 50px 0 20px;
font-family: $font-serif;
font-size: $font-30;
font-weight: bold;
color: $white-alpha;
margin: auto auto 15px auto;
margin: auto auto 15px 0;
text-shadow: 0 0 2px $black;
text-align: left;
}
.menu {

9
Web/weather/src/app/app.component.ts

@ -23,11 +23,18 @@ import { trigger, state, style, animate, transition } from '@angular/animations'
export class AppComponent {
public title: string = 'Dslak weather station'
public title: string = 'Dslak WS'
public day: string = new Date().toISOString().substring(0,10)
public spot: string = 'capaccio'
public menuOpen: boolean = false
toggleMenu(): void {
this.menuOpen = !this.menuOpen
}
setSpot(spot: string): void {
this.spot = spot
this.menuOpen = false
}
}

2
Web/weather/src/app/app.module.ts

@ -7,14 +7,12 @@ import { NgxEchartsModule } from 'ngx-echarts';
import { environment } from '../environments/environment'
import { AppComponent } from './app.component';
import { AppLayoutComponent } from './app-layout/app-layout.component';
import { GraphComponent } from './graph/graph.component';
import { DashboardComponent } from './dashboard/dashboard.component';
@NgModule({
declarations: [
AppComponent,
AppLayoutComponent,
GraphComponent,
DashboardComponent
],

19
Web/weather/src/app/dashboard/dashboard.component.html

@ -1,3 +1,20 @@
<div class="dashboard-container">
<app-graph [data]="data"></app-graph>
<div class="date-container">
<input type="date" class="input-date" [(ngModel)]="day" (change)="getData()" [max]="today">
</div>
<div class="info-container" *ngIf="data.length">
<span class="item"><span class="icon-watch_later"></span> Date/Time: <span class="value">{{data[data.length-1].date}}</span></span>
<span class="item"><span class="icon-wind"></span> Speed: <span class="value">{{data[data.length-1].speed}} Km/h</span></span>
<span class="item"><span class="icon-compass"></span> Direction: <span class="value">{{dirLabels[data[data.length-1].direction]}} {{dirArrows[data[data.length-1].direction]}}</span></span>
<span class="item"><span class="icon-device_thermostat"></span> Temperature: <span class="value">{{data[data.length-1].temperature}} °C</span></span>
<span class="item"><span class="icon-play_for_work"></span> Pressure: <span class="value">{{data[data.length-1].pressure}} hpa</span></span>
<span class="item"><span class="icon-opacity"></span> Humidity: <span class="value">{{data[data.length-1].humidity}}%</span></span>
</div>
<div class="graph-container">
<div class="no-data" *ngIf="!data.length">No data for selected date</div>
<app-graph [data]="data" *ngIf="data.length"></app-graph>
</div>
</div>

44
Web/weather/src/app/dashboard/dashboard.component.scss

@ -0,0 +1,44 @@
@import "../../assets/scss/variables";
.dashboard-container {
display: flex;
flex-wrap: wrap;
.date-container {
display: block;
width: 100%;
text-align: center;
}
.info-container {
display: flex;
flex-wrap: wrap;
width: 100%;
.item {
display: inline-block;
padding: 5px 10px;
border: 1px solid $gray;
border-radius: 3px;
margin: 3px;
font-size: $font-14;
font-weight: bold;
.value {
font-weight: normal;
font-size: $font-18;
}
}
}
.graph-container {
display: block;
width: 100%;
padding: 0;
}
.no-data {
padding: 20px;
margin: auto;
}
}

21
Web/weather/src/app/dashboard/dashboard.component.ts

@ -1,4 +1,4 @@
import { Component, OnInit, Input, ViewEncapsulation } from '@angular/core'
import { Component, OnInit, Input, SimpleChanges, ViewEncapsulation } from '@angular/core'
import { StationService } from '../station.service'
import { environment } from '../../environments/environment'
@ -11,9 +11,16 @@ import { environment } from '../../environments/environment'
export class DashboardComponent implements OnInit {
@Input() day: string = ''
public today: string = new Date().toISOString().substring(0,10)
@Input() day: string = this.today
@Input() spot: string = this.today
public data: any = []
public dirLabels: any = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW']
public dirArrows: any = ['\u2B07', '\u2B0B', '\u2B05', '\u2B09', '\u2B06', '\u2B08', '\u27A1', '\u2B0A']
constructor(
private stationService: StationService
) { }
@ -22,9 +29,15 @@ export class DashboardComponent implements OnInit {
if(this.day) this.getData()
}
ngOnChanges(changes: SimpleChanges): void {
if(changes['spot'] && changes['spot'].currentValue) {
this.spot = changes['spot'].currentValue
this.getData()
}
}
getData(): void {
this.stationService.getData(this.day).toPromise().then( (data) => {
console.log(data)
this.stationService.getData(this.day, this.spot).toPromise().then( (data) => {
this.data = data.items
},(error) => {
console.error(error)

2
Web/weather/src/app/graph/graph.component.html

@ -1,6 +1,6 @@
<div class="graph">
<div class="canvas-container">
<div echarts class="canvas" [options]="graph.options" (chartInit)="onChartInit($event, graph)"></div>
<div echarts class="canvas" [options]="graph.options" (chartInit)="onChartInit($event, graph)" (chartFinished)="onChartInit($event, graph)"></div>
<div class="canvas-loader" *ngIf="graph.loading"><div class="spinner"></div></div>
</div>
</div>

25
Web/weather/src/app/graph/graph.component.scss

@ -4,23 +4,15 @@
position: relative;
display: block;
background: $white;
border-radius: 3px;
padding: 0px;
width: 100%;
height: calc(100vh - $header-height-mobile);
@media (min-width: map-get($grid-breakpoints, 'md')) {
height: calc(100vh - $header-height-mobile);
}
height: 500px;
.canvas-container {
position: relative;
display: block;
border-radius: 3px;
padding: 0px;
height: calc(100vh - $header-height-mobile);
@media (min-width: map-get($grid-breakpoints, 'md')) {
height: calc(100vh - $header-height-mobile);
}
height: 500px;
.canvas-loader {
position: absolute;
@ -30,13 +22,13 @@
background: $white;
margin-top: 0;
width: 100%;
height: 630px;
height: 100%;
z-index: 1;
>.spinner {
position: absolute;
top: calc(50% - 30px);
left: calc(50% - 30px);
top: calc(50% - 50px);
left: calc(50% - 50px);
border-radius: 50%;
width: 100px;
height: 100px;
@ -56,13 +48,8 @@
.canvas {
position: relative;
display: block;
border-radius: 3px;
padding: 0px;
height: calc(100vh - $header-height-mobile);
@media (min-width: map-get($grid-breakpoints, 'md')) {
height: calc(100vh - $header-height-mobile);
}
height: 500px;
}
}
}

15
Web/weather/src/app/graph/graph.component.ts

@ -50,29 +50,26 @@ export class GraphComponent implements OnInit {
color: ['#FFBF00', '#00DDFF', '#FFBF00', '#37A2FF', '#FF0087'],
tooltip: {
trigger: 'item',
//axisPointer: { type: 'cross', axis:'y', label: false},
formatter: (params: any) => {
const data = this.data[params.dataIndex]
return `<div class="tooltip">
<span class="title">${data.date.substring(11)}</span>
<span class="item"><b>Vento:</b> ${data.speed} Km/h ${this.dirArrows[data.direction]} ${this.directions[data.direction]}</span>
<span class="item"><b>Temperatura:</b> ${data.temperature} °C</span>
<span class="item"><b>Pressione:</b> ${data.pressure} hpa</span>
<span class="item"><b>Umidità:</b> ${data.humidity} %</span>`/* : null*/
<span class="item"><b>Wind:</b> ${data.speed} Km/h ${this.dirArrows[data.direction]} ${this.directions[data.direction]}</span>
<span class="item"><b>Temperature:</b> ${data.temperature} °C</span>
<span class="item"><b>Pressure:</b> ${data.pressure} hpa</span>
<span class="item"><b>Humidity:</b> ${data.humidity} %</span>`
}
},
grid: {left: 0, right: 0, containLabel: true },
legend: { data: ['Speed', 'Dir', 'Temp', 'Press', 'Umid'] },
grid: {left: 0, right: '20px', containLabel: true },
xAxis: { type: 'category', boundaryGap: true, axisTick: true, data: xAxis },
yAxis: [{ type: 'value', show: false }],
series: [
{ name: 'temp', type: 'line', data: yAxis2, yAxisIndex: 0, smooth: true, stack: 'Total',
areaStyle: {}, lineStyle: { width: 0 },
label: { show: false, position: 'top', formatter: (d: any) => {
label: { show: true, position: 'top', formatter: (d: any) => {
const temp = this.data[d.dataIndex].temperature
return `${temp} °C`
}}
},
{ name: 'speed', type: 'line', data: yAxis, yAxisIndex: 0, smooth: true, stack: 'Total',
areaStyle: {},

4
Web/weather/src/app/station.service.ts

@ -30,8 +30,8 @@ export class StationService {
}
getData(day: string): Observable<any> {
const apiUrl = `${this.restApi}/get_data?day=${day}`;
getData(day: string, spot: string): Observable<any> {
const apiUrl = `${this.restApi}/get_data?day=${day}&spot=${spot}`;
return this.http.get<any>(apiUrl, {headers: this.commonHeaders()}).pipe(
catchError(this.handleError)
)

BIN
Web/weather/src/assets/fonts/icomoon.eot

Binary file not shown.

7
Web/weather/src/assets/fonts/icomoon.svg

@ -38,4 +38,11 @@
<glyph unicode="&#xe91c;" glyph-name="download" horiz-adv-x="939" d="M28.479 182.797v-207.74c0-18.172 14.697-32.866 32.869-32.866h815.96c18.172 0 32.87 14.694 32.87 32.866v207.74c0 18.172-14.797 32.87-32.87 32.87h-80.333c-18.074 0-32.87-14.797-32.87-32.87v-94.336h-589.553v94.336c0 18.172-14.697 32.87-32.869 32.87h-80.335c-18.172 0-32.869-14.797-32.869-32.87zM343.366 803.625h251.928c19.362 0 35.055 15.69 35.055 35.054v68.518c0 19.364-15.693 35.053-35.055 35.053h-251.928c-19.364 0-35.054-15.69-35.054-35.053v-68.518c0-19.364 15.69-35.054 35.054-35.054zM306.225 598.685h-128.695c-21.251 0-39.621-10.228-46.97-25.918-5.76-12.512-3.674-26.513 5.66-37.536l291.849-341.994c9.331-10.923 24.329-17.178 41.207-17.178 16.883 0 31.974 6.255 41.31 17.178l291.849 342.094c9.331 10.923 11.418 24.925 5.658 37.536-7.249 15.789-25.719 25.918-46.869 25.918h-133.163v121.346c0 18.172-14.699 32.869-32.87 32.869h-256.097c-18.073 0-32.869-14.796-32.869-32.869v-121.446z" />
<glyph unicode="&#xe91d;" glyph-name="upload" d="M587 208h-150c-24.936 0-45 20.064-45 45v314.997h-164.436c-33.376 0-50.064 40.312-26.436 63.936l285.184 285.372c14.064 14.064 37.124 14.064 51.188 0l285.372-285.372c23.624-23.624 6.936-63.936-26.436-63.936h-164.436v-314.997c0-24.936-20.064-45-45-45zM991.996 223v-210c0-24.936-20.064-45-45-45h-869.994c-24.936 0-45 20.064-45 45v210c0 24.936 20.064 45 45 45h255v-15c0-57.936 47.064-105 105-105h150c57.936 0 105 47.064 105 105v15h255c24.936 0 45-20.064 45-45zM759.5 58.004c0 20.624-16.876 37.5-37.5 37.5s-37.5-16.876-37.5-37.5 16.876-37.5 37.5-37.5 37.5 16.876 37.5 37.5zM879.496 58.004c0 20.624-16.876 37.5-37.5 37.5s-37.5-16.876-37.5-37.5 16.876-37.5 37.5-37.5 37.5 16.876 37.5 37.5z" />
<glyph unicode="&#xe91e;" glyph-name="email" d="M128 622.037l359.552-251.691c14.507-10.027 33.92-10.496 48.939 0l359.509 251.691v-430.037c0-11.605-4.693-22.229-12.587-30.080s-18.475-12.587-30.080-12.587h-682.667c-11.605 0-22.229 4.693-30.080 12.587s-12.587 18.475-12.587 30.080zM42.667 704.725c0-0.427 0-0.853 0-1.28v-511.445c0-35.328 14.507-67.371 37.547-90.453s55.125-37.547 90.453-37.547h682.667c35.328 0 67.371 14.507 90.453 37.547s37.547 55.125 37.547 90.453v511.488c0 0.427 0 0.853 0 1.28-0.213 35.029-14.635 66.773-37.547 89.685-23.083 23.040-55.125 37.547-90.453 37.547h-682.667c-35.328 0-67.371-14.507-90.453-37.547-22.912-22.912-37.333-54.656-37.547-89.728zM891.477 723.029l-379.477-265.6-379.477 265.6c2.048 4.096 4.779 7.808 8.021 11.051 7.893 7.893 18.517 12.587 30.123 12.587h682.667c11.605 0 22.229-4.693 30.080-12.587 3.243-3.243 5.973-6.997 8.021-11.051z" />
<glyph unicode="&#xe91f;" glyph-name="device_thermostat" d="M470 724.667v-256h84v86h-42v42h42v86h-42v42h42q0 18-12 31t-30 13-30-13-12-31zM640 384.667q86-62 86-172 0-88-63-150t-151-62-151 62-63 150q0 110 86 172v340q0 52 38 90t90 38 90-38 38-90v-340z" />
<glyph unicode="&#xe920;" glyph-name="near_me" d="M896 810.667l-322-768h-42l-112 292-292 112v42z" />
<glyph unicode="&#xe921;" glyph-name="play_for_work" d="M256 340.667h86q0-70 50-120t120-50 120 50 50 120h86q0-106-75-181t-181-75-181 75-75 181zM470 724.667h84v-238h150l-192-192-192 192h150v238z" />
<glyph unicode="&#xe922;" glyph-name="opacity" d="M256 340.667h512q0 110-76 186l-180 188-180-186q-76-76-76-188zM754 596.667q100-100 100-240 0-142-100-242-42-42-113-71t-129-29-129 29-113 71q-100 100-100 242 0 58 29 128t71 112l242 242z" />
<glyph unicode="&#xe923;" glyph-name="watch_later" d="M692 246.667l34 56-192 116v222h-64v-256zM512 852.667q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125z" />
<glyph unicode="&#xe924;" glyph-name="wind" d="M862 576c-53 0-96-43-96-96 0-11.292 2.334-21.916 5.876-32h-613.876c-17.666 0-32-14.334-32-32s14.334-32 32-32h704c53 0 96 43 96 96s-43 96-96 96zM158 512h384c53 0 96 43 96 96s-43 96-96 96-96-43-96-96c0-11.292 2.334-21.916 5.876-32h-293.876c-17.666 0-32-14.334-32-32s14.334-32 32-32zM670 320c-1.876 0-3.668-0.416-5.582-0.582-1.25 0.082-2.292 0.582-3.542 0.582h-493.708c-22.75 0-41.168-14.334-41.168-32s18.418-32 41.168-32h412.708c-3.542-10.084-5.876-20.752-5.876-32 0-53 43-96 96-96s96 43 96 96-43 96-96 96z" />
<glyph unicode="&#xe925;" glyph-name="compass" d="M512 960c-282.792 0-512-229.208-512-512 0-282.75 229.208-512 512-512 282.75 0 512 229.25 512 512 0 282.792-229.25 512-512 512zM512 64c-211.75 0-384 172.25-384 384s172.25 384 384 384 384-172.25 384-384-172.25-384-384-384zM320 256l256 128 128 256-256-128-128-256z" />
</font></defs></svg>

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 37 KiB

BIN
Web/weather/src/assets/fonts/icomoon.ttf

Binary file not shown.

BIN
Web/weather/src/assets/fonts/icomoon.woff

Binary file not shown.

2
Web/weather/src/assets/fonts/selection.json

File diff suppressed because one or more lines are too long

16
Web/weather/src/assets/scss/forms.scss

@ -61,6 +61,22 @@ input[type="date"]::-webkit-calendar-picker-indicator {
cursor: pointer;
}
.input-date {
width: 100%;
border: 1px solid $gray;
padding: 10px 50px;
text-align: center;
color: $black;
border-radius: 2px;
background: $white;
background: url(/assets/images/icons/calendar.svg);
background-position: right 10px top 15px;
background-repeat: no-repeat;
background-size: 14px;
cursor: pointer;
}
.input-textarea {
border: 1px solid $gray;
padding: 10px;

11
Web/weather/src/assets/scss/global.scss

@ -117,15 +117,20 @@ section {
.tooltip {
display: block;
padding: 10px 30px;
padding: 10px 20px;
.title {
display: block;
font-weight: bold;
font-size: $font-20;
color: $black;
padding: 5px;
border-bottom: 2px solid $light-gray;
}
.item {
display: block;
padding: 5px 0;
padding: 5px;
font-size: $font-16;
border-bottom: 1px dotted $light-gray;
}
}

21
Web/weather/src/assets/scss/icons.scss

@ -25,6 +25,27 @@
}
.icon-device_thermostat:before {
content: "\e91f";
}
.icon-near_me:before {
content: "\e920";
}
.icon-play_for_work:before {
content: "\e921";
}
.icon-opacity:before {
content: "\e922";
}
.icon-watch_later:before {
content: "\e923";
}
.icon-wind:before {
content: "\e924";
}
.icon-compass:before {
content: "\e925";
}
.icon-angle-right:before {
content: "\e900";
}

Loading…
Cancel
Save