From 519c8d21304ce41a9ee6e42666a402aaa56c31f8 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 13 Apr 2022 10:58:13 +0200 Subject: [PATCH] Update MON --- MP.Data/DatabaseModels/MappaStatoExpl.cs | 14 +- MP.Data/MoonProContext.cs | 14 +- MP.Mon/Data/WeatherForecast.cs | 13 - MP.Mon/Data/WeatherForecastService.cs | 20 -- MP.Mon/MP.Mon.csproj | 8 + MP.Mon/Pages/Counter.razor | 18 -- MP.Mon/Pages/FetchData.razor | 48 ---- MP.Mon/Pages/Index.razor | 70 ++++- MP.Mon/Pages/Index.razor.cs | 56 ++++ MP.Mon/Program.cs | 2 - MP.Mon/Shared/MainLayout.razor | 20 +- MP.Mon/Shared/MainLayout.razor.css | 20 +- MP.Mon/compilerconfig.json | 10 + MP.Mon/compilerconfig.json.defaults | 71 +++++ MP.Mon/wwwroot/css/site.css | 342 +++++++++++----------- MP.Mon/wwwroot/css/site.less | 350 ++++++++++++----------- MP.Mon/wwwroot/css/site.min.css | 2 +- MP.Mon/wwwroot/images/LogoCliente.png | Bin 0 -> 3051 bytes MP.Mon/wwwroot/images/LogoMapo.png | Bin 0 -> 19861 bytes 19 files changed, 589 insertions(+), 489 deletions(-) delete mode 100644 MP.Mon/Data/WeatherForecast.cs delete mode 100644 MP.Mon/Data/WeatherForecastService.cs delete mode 100644 MP.Mon/Pages/Counter.razor delete mode 100644 MP.Mon/Pages/FetchData.razor create mode 100644 MP.Mon/compilerconfig.json create mode 100644 MP.Mon/compilerconfig.json.defaults create mode 100644 MP.Mon/wwwroot/images/LogoCliente.png create mode 100644 MP.Mon/wwwroot/images/LogoMapo.png diff --git a/MP.Data/DatabaseModels/MappaStatoExpl.cs b/MP.Data/DatabaseModels/MappaStatoExpl.cs index e529b4ea..bebcf16e 100644 --- a/MP.Data/DatabaseModels/MappaStatoExpl.cs +++ b/MP.Data/DatabaseModels/MappaStatoExpl.cs @@ -15,7 +15,7 @@ namespace MP.Data.DatabaseModels public string CodArticolo { get; set; } public string Disegno { get; set; } public int? NumPezzi { get; set; } - public decimal? Tcassegnato { get; set; } + public decimal? TCAssegnato { get; set; } public DateTime? DataInizioOdl { get; set; } public string Semaforo { get; set; } public int? IdxStato { get; set; } @@ -26,11 +26,11 @@ namespace MP.Data.DatabaseModels public decimal? TempoOn { get; set; } public decimal? TempoAuto { get; set; } public decimal? TempoRun { get; set; } - public decimal? Tcmedio { get; set; } - public decimal? Tclav { get; set; } - public decimal? Tceff { get; set; } - public decimal? TcmedioRt { get; set; } - public decimal? TclavRt { get; set; } - public decimal? TceffRt { get; set; } + public decimal? TCMedio { get; set; } + public decimal? TCLav { get; set; } + public decimal? TCEff { get; set; } + public decimal? TCMedioRt { get; set; } + public decimal? TCLavRt { get; set; } + public decimal? TCEffRt { get; set; } } } diff --git a/MP.Data/MoonProContext.cs b/MP.Data/MoonProContext.cs index 40b2ed1c..7cd12b19 100644 --- a/MP.Data/MoonProContext.cs +++ b/MP.Data/MoonProContext.cs @@ -153,37 +153,37 @@ namespace MP.Data .HasMaxLength(50) .HasDefaultValueSql("('')"); - entity.Property(e => e.Tcassegnato) + entity.Property(e => e.TCAssegnato) .HasColumnType("decimal(18, 8)") .HasColumnName("TCAssegnato") .HasDefaultValueSql("((1))"); - entity.Property(e => e.Tceff) + entity.Property(e => e.TCEff) .HasColumnType("decimal(18, 8)") .HasColumnName("TCEff") .HasDefaultValueSql("((0))"); - entity.Property(e => e.TceffRt) + entity.Property(e => e.TCEffRt) .HasColumnType("decimal(18, 8)") .HasColumnName("TCEffRT") .HasDefaultValueSql("((0))"); - entity.Property(e => e.Tclav) + entity.Property(e => e.TCLav) .HasColumnType("decimal(18, 8)") .HasColumnName("TCLav") .HasDefaultValueSql("((0))"); - entity.Property(e => e.TclavRt) + entity.Property(e => e.TCLavRt) .HasColumnType("decimal(18, 8)") .HasColumnName("TCLavRT") .HasDefaultValueSql("((0))"); - entity.Property(e => e.Tcmedio) + entity.Property(e => e.TCMedio) .HasColumnType("decimal(18, 8)") .HasColumnName("TCMedio") .HasDefaultValueSql("((0))"); - entity.Property(e => e.TcmedioRt) + entity.Property(e => e.TCMedioRt) .HasColumnType("decimal(18, 8)") .HasColumnName("TCMedioRT") .HasDefaultValueSql("((0))"); diff --git a/MP.Mon/Data/WeatherForecast.cs b/MP.Mon/Data/WeatherForecast.cs deleted file mode 100644 index c0004e5e..00000000 --- a/MP.Mon/Data/WeatherForecast.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace MP.Mon.Data -{ - public class WeatherForecast - { - public DateTime Date { get; set; } - - public int TemperatureC { get; set; } - - public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); - - public string? Summary { get; set; } - } -} \ No newline at end of file diff --git a/MP.Mon/Data/WeatherForecastService.cs b/MP.Mon/Data/WeatherForecastService.cs deleted file mode 100644 index 6b8e22db..00000000 --- a/MP.Mon/Data/WeatherForecastService.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace MP.Mon.Data -{ - public class WeatherForecastService - { - private static readonly string[] Summaries = new[] - { - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" - }; - - public Task GetForecastAsync(DateTime startDate) - { - return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast - { - Date = startDate.AddDays(index), - TemperatureC = Random.Shared.Next(-20, 55), - Summary = Summaries[Random.Shared.Next(Summaries.Length)] - }).ToArray()); - } - } -} \ No newline at end of file diff --git a/MP.Mon/MP.Mon.csproj b/MP.Mon/MP.Mon.csproj index 054f6762..12c79581 100644 --- a/MP.Mon/MP.Mon.csproj +++ b/MP.Mon/MP.Mon.csproj @@ -6,6 +6,14 @@ enable + + + + + + + + diff --git a/MP.Mon/Pages/Counter.razor b/MP.Mon/Pages/Counter.razor deleted file mode 100644 index ef23cb31..00000000 --- a/MP.Mon/Pages/Counter.razor +++ /dev/null @@ -1,18 +0,0 @@ -@page "/counter" - -Counter - -

Counter

- -

Current count: @currentCount

- - - -@code { - private int currentCount = 0; - - private void IncrementCount() - { - currentCount++; - } -} diff --git a/MP.Mon/Pages/FetchData.razor b/MP.Mon/Pages/FetchData.razor deleted file mode 100644 index b5ba00c3..00000000 --- a/MP.Mon/Pages/FetchData.razor +++ /dev/null @@ -1,48 +0,0 @@ -@page "/fetchdata" - -Weather forecast - -@using MP.Mon.Data -@inject WeatherForecastService ForecastService - -

Weather forecast

- -

This component demonstrates fetching data from a service.

- -@if (forecasts == null) -{ -

Loading...

-} -else -{ - - - - - - - - - - - @foreach (var forecast in forecasts) - { - - - - - - - } - -
DateTemp. (C)Temp. (F)Summary
@forecast.Date.ToShortDateString()@forecast.TemperatureC@forecast.TemperatureF@forecast.Summary
-} - -@code { - private WeatherForecast[]? forecasts; - - protected override async Task OnInitializedAsync() - { - forecasts = await ForecastService.GetForecastAsync(DateTime.Now); - } -} diff --git a/MP.Mon/Pages/Index.razor b/MP.Mon/Pages/Index.razor index 3f9202cf..76a6da3e 100644 --- a/MP.Mon/Pages/Index.razor +++ b/MP.Mon/Pages/Index.razor @@ -6,12 +6,7 @@ -
-
-

Hello, world!

- - Welcome to your new app. -
+
@if (ListMSE == null) {
@@ -28,11 +23,70 @@ } else { + int currIdx = 0; foreach (var macchina in ListMSE) { -
- @macchina.CodMacchina +
+
+
+
+
@macchina.Nome
+
+
+
+
Art.
+
@macchina.CodArticolo
+
+
+
@macchina.DescrizioneStato
+
@($"{macchina.Durata:0.00}")
+ @*
OEE
+
xx%
*@ +
T.Ciclo
+
std: @getMinSec(macchina.TCAssegnato)
+
act: @getMinSec(macchina.TCLavRt)
+
Pezzi(prod/ord)
+
@macchina.PezziProd / @macchina.NumPezzi
+
+
+
+
+
+ +
+
+
+ currIdx++; + if (currIdx >= maxCol) + { + @*
+
*@ + currIdx = 0; + @((MarkupString)"
") + ; + } + } + // controllo se devo "chiudere riga... + int currNum = (currIdx % maxCol); + while (currNum < (maxCol)) + { + @((MarkupString)"
 
") + ; + currNum++; + } }
diff --git a/MP.Mon/Pages/Index.razor.cs b/MP.Mon/Pages/Index.razor.cs index 3ae92d10..3df00241 100644 --- a/MP.Mon/Pages/Index.razor.cs +++ b/MP.Mon/Pages/Index.razor.cs @@ -24,12 +24,28 @@ namespace MP.Mon.Pages { protected List? ListMSE = null; + protected int keepAliveMin = 5; // leggere da conf? + + protected int maxCol = 6; // leggere da conf? + + protected bool doAnimate = true; // leggere da conf? + + //protected string baseCss = "sem"; + //protected string baseCss = "semBlink"; + protected string baseCss = ""; + protected override async Task OnInitializedAsync() { + setupConf(); await reloadData(); //return base.OnInitializedAsync(); } + private void setupConf() + { + baseCss = doAnimate ? "semBlink" : "sem"; + } + [Inject] protected MpDataService MMDataService { get; set; } @@ -38,5 +54,45 @@ namespace MP.Mon.Pages ListMSE = await MMDataService.MseGetAll(); } + private string cssStatus(string codSemaforo) + { + return $"{baseCss}{codSemaforo.Substring(1,2)}"; + } + + private string cssComStatus(string semaforo, DateTime? lastUpdateN) + { + DateTime lastUpdate = lastUpdateN.HasValue ? (DateTime)lastUpdateN : DateTime.Now.AddHours(-1); + string answ = cssStatus(semaforo); + if (DateTime.Now.Subtract(lastUpdate).TotalSeconds > (keepAliveMin * 60 / 2)) + { + answ = $"{baseCss}Ro"; + } + return answ; + } + + private bool showComErr(DateTime? lastUpdateN) + { + DateTime lastUpdate = lastUpdateN.HasValue ? (DateTime)lastUpdateN : DateTime.Now.AddHours(-1); + bool answ = false; + if (DateTime.Now.Subtract(lastUpdate).TotalSeconds > (keepAliveMin * 60 / 2)) + { + answ = true; + } + return answ; + } + + private string getMinSec(decimal? currTimeMin) + { + string answ = "nd"; + TimeSpan tSpan = new TimeSpan(0); + try + { + tSpan = TimeSpan.FromMinutes((double)currTimeMin); + answ = tSpan.ToString("mm:ss"); + } + catch + { } + return answ; + } } } \ No newline at end of file diff --git a/MP.Mon/Program.cs b/MP.Mon/Program.cs index 068f5954..5d1efe06 100644 --- a/MP.Mon/Program.cs +++ b/MP.Mon/Program.cs @@ -29,8 +29,6 @@ builder.Services.AddSingleton(redisMultiplexer); builder.Services.AddSingleton(); //builder.Services.AddScoped(); -builder.Services.AddSingleton(); - var app = builder.Build(); // Configure the HTTP request pipeline. diff --git a/MP.Mon/Shared/MainLayout.razor b/MP.Mon/Shared/MainLayout.razor index 7da4e90a..f17b6251 100644 --- a/MP.Mon/Shared/MainLayout.razor +++ b/MP.Mon/Shared/MainLayout.razor @@ -3,16 +3,22 @@ MP.Mon
- -
-
- About +
+
+ + MP MONitor +
+
+ + @($"{DateTime.Now:dddd dd MMMM yyyy, HH:mm}") + + + EgalWare +
-
+
@Body
diff --git a/MP.Mon/Shared/MainLayout.razor.css b/MP.Mon/Shared/MainLayout.razor.css index 495fb804..f46e7c65 100644 --- a/MP.Mon/Shared/MainLayout.razor.css +++ b/MP.Mon/Shared/MainLayout.razor.css @@ -8,19 +8,19 @@ main { flex: 1; } -.sidebar,.sidebarSmall { - background-image: linear-gradient(180deg, rgb(5, 39, 103) 20%, #3aa6ff 90%); -} - .top-row { - background-color: #f7f7f7; - border-bottom: 1px solid #d6d5d5; - justify-content: flex-end; - height: 3.5rem; + background-color: #000000; + /*border-bottom: 1px solid #696969;*/ + color: #696969; + font-size: 1.4em; + height: 3rem; display: flex; align-items: center; - /*justify-content: space-evenly; - display: flex;*/ + justify-content: space-evenly; +} + +.mainHead{ + font-size: 1.7rem; } .top-row ::deep a, diff --git a/MP.Mon/compilerconfig.json b/MP.Mon/compilerconfig.json new file mode 100644 index 00000000..caa3f6ec --- /dev/null +++ b/MP.Mon/compilerconfig.json @@ -0,0 +1,10 @@ +[ + { + "outputFile": "wwwroot/css/site.css", + "inputFile": "wwwroot/css/site.less" + }, + { + "outputFile": "wwwroot/css/fonts.css", + "inputFile": "wwwroot/css/fonts.less" + } +] \ No newline at end of file diff --git a/MP.Mon/compilerconfig.json.defaults b/MP.Mon/compilerconfig.json.defaults new file mode 100644 index 00000000..41870cc5 --- /dev/null +++ b/MP.Mon/compilerconfig.json.defaults @@ -0,0 +1,71 @@ +{ + "compilers": { + "less": { + "autoPrefix": "", + "cssComb": "none", + "ieCompat": true, + "math": null, + "strictMath": false, + "strictUnits": false, + "relativeUrls": true, + "rootPath": "", + "sourceMapRoot": "", + "sourceMapBasePath": "", + "sourceMap": false + }, + "sass": { + "autoPrefix": "", + "loadPaths": "", + "style": "expanded", + "relativeUrls": true, + "sourceMap": false + }, + "nodesass": { + "autoPrefix": "", + "includePath": "", + "indentType": "space", + "indentWidth": 2, + "outputStyle": "nested", + "precision": 5, + "relativeUrls": true, + "sourceMapRoot": "", + "lineFeed": "", + "sourceMap": false + }, + "stylus": { + "sourceMap": false + }, + "babel": { + "sourceMap": false + }, + "coffeescript": { + "bare": false, + "runtimeMode": "node", + "sourceMap": false + }, + "handlebars": { + "root": "", + "noBOM": false, + "name": "", + "namespace": "", + "knownHelpersOnly": false, + "forcePartial": false, + "knownHelpers": [], + "commonjs": "", + "amd": false, + "sourceMap": false + } + }, + "minifiers": { + "css": { + "enabled": true, + "termSemicolons": true, + "gzip": false + }, + "javascript": { + "enabled": true, + "termSemicolons": true, + "gzip": false + } + } +} \ No newline at end of file diff --git a/MP.Mon/wwwroot/css/site.css b/MP.Mon/wwwroot/css/site.css index 4a8ba847..331403ae 100644 --- a/MP.Mon/wwwroot/css/site.css +++ b/MP.Mon/wwwroot/css/site.css @@ -15,10 +15,17 @@ display-4 { font-family: 'Lato', sans-serif; } html, +body { + height: 100%; +} +html, body { /*font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;*/ font-family: 'Roboto Condensed', sans-serif; line-height: 1.3; + background-image: linear-gradient(180deg, #010816 20%, #3aa6ff 90%); + background-size: auto 100%; + background-repeat: no-repeat; } h1:focus { outline: none; @@ -53,89 +60,6 @@ a, .striked { text-decoration: line-through; } -/* Gestione dropdown menu x week planner */ -.dropdown { - position: relative; - display: inline-block; -} -.dropdown:hover .dropdown-content, -.dropdown:hover .dropdown-content-top, -.dropdown:hover .dropdown-content-left, -.dropdown:hover .dropdown-content-top-left { - display: block; -} -.dropdown-content { - display: none; - position: absolute; - left: -10em; - min-width: 8em; - box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); - z-index: 1; -} -.dropdown-content .a { - color: black; - padding: 12px 16px; - text-decoration: none; - display: block; -} -.dropdown-content .a:hover { - background-color: #ddd; -} -.dropdown-content-top { - display: none; - position: absolute; - min-width: 8em; - box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); - z-index: 1; - top: -13.5em; - left: -10em; -} -.dropdown-content-top .a { - color: black; - padding: 12px 16px; - text-decoration: none; - display: block; -} -.dropdown-content-top .a:hover { - background-color: #ddd; -} -.dropdown-content-left { - display: none; - position: absolute; - left: -10em; - min-width: 8em; - box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); - z-index: 1; - left: -24em; -} -.dropdown-content-left .a { - color: black; - padding: 12px 16px; - text-decoration: none; - display: block; -} -.dropdown-content-left .a:hover { - background-color: #ddd; -} -.dropdown-content-top-left { - display: none; - position: absolute; - left: -10em; - min-width: 8em; - box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); - z-index: 1; - top: -13.5em; - left: -24em; -} -.dropdown-content-top-left .a { - color: black; - padding: 12px 16px; - text-decoration: none; - display: block; -} -.dropdown-content-top-left .a:hover { - background-color: #ddd; -} .textTrim { white-space: nowrap; overflow: hidden; @@ -216,109 +140,165 @@ a, .blazor-error-boundary::after { content: "An error has occurred."; } -/*------------------------------------------------------------------ -[ Shortcuts / .shortcuts ] -*/ -.shortcuts { - text-align: center; +/* Gestione specifica oggetti MON*/ +/* MAIN: gestione layout dinamico mappa... */ +.fontSmall { + font-size: 0.75em; } -.shortcuts .shortcut-icon { - font-size: 2rem; +.fontSmaller { + font-size: 0.6em; } -.shortcuts .shortcut { - min-width: 9rem; - min-height: 5rem; - display: inline-block; - padding: 2rem/3 0; - margin: 0 2px 1em; - vertical-align: top; - text-decoration: none; - background: #F3F3F3; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#eeeeee)); - background-image: -webkit-linear-gradient(top, #ffffff, 0%, #eeeeee, 100%); - background-image: -moz-linear-gradient(top, #ffffff 0%, #eeeeee 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffeeeeee', GradientType=0); - border: 1px solid #ddd; - box-sizing: border-box; - border-radius: 1rem/2; +.statusMap { + background: #222; } -.shortcuts .shortcut-sm { - min-width: 4.5rem; - min-height: 3rem; - display: inline-block; - padding: 1rem/4 0; - margin: 0 2px 1em; - vertical-align: top; - text-decoration: none; - background: #F3F3F3; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#eeeeee)); - background-image: -webkit-linear-gradient(top, #ffffff, 0%, #eeeeee, 100%); - background-image: -moz-linear-gradient(top, #ffffff 0%, #eeeeee 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffeeeeee', GradientType=0); - border: 1px solid #ddd; - box-sizing: border-box; - border-radius: 1rem/2; -} -.shortcuts .shortcut .shortcut-icon { - width: 100%; - margin-top: 0; - margin-bottom: 0; - font-size: 2rem; - color: #333; -} -.shortcuts .shortcut-sm .shortcut-icon { - width: 100%; - margin-top: 0; - margin-bottom: 0; - font-size: 2rem; - color: #333; -} -.shortcuts .shortcut:hover { - background: #E8E8E8; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fafafa), to(#e1e1e1)); - background-image: -webkit-linear-gradient(top, #fafafa, 0%, #e1e1e1, 100%); - background-image: -moz-linear-gradient(top, #fafafa 0%, #e1e1e1 100%); - background-image: linear-gradient(to bottom, #fafafa 0%, #e1e1e1 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffafafa', endColorstr='#ffe1e1e1', GradientType=0); -} -.shortcuts .shortcut-sm:hover { - background: #E8E8E8; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fafafa), to(#e1e1e1)); - background-image: -webkit-linear-gradient(top, #fafafa, 0%, #e1e1e1, 100%); - background-image: -moz-linear-gradient(top, #fafafa 0%, #e1e1e1 100%); - background-image: linear-gradient(to bottom, #fafafa 0%, #e1e1e1 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffafafa', endColorstr='#ffe1e1e1', GradientType=0); -} -.shortcuts .shortcut:active { - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} -.shortcuts .shortcut-sm:active { - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} -.shortcuts .shortcut:hover .shortcut-icon { - color: #C93; -} -.shortcuts .shortcut-sm:hover .shortcut-icon { - color: #666; -} -.shortcuts .shortcut-label { - display: block; - margin-top: 0.75em; +.statusMap .ui-title, +.statusMap .ui-li-aside { font-weight: 400; - color: #666; + text-transform: uppercase; + font-size: 2.5em; + line-height: 1.1em; + color: #DEDEDE; + text-shadow: 2px 2px 4px #000; + text-align: center; + background: linear-gradient(270deg, rgba(20, 20, 20, 0.7), rgba(100, 100, 100, 0.7), rgba(20, 20, 20, 0.7)); } -@media (max-width: 640px) { - .shortcuts .shortcut { - min-width: 8rem; - min-height: 4rem; +.statusMap .ui-footer { + color: #CDCDCD; + background: linear-gradient(270deg, rgba(10, 10, 10, 0.7), rgba(80, 80, 80, 0.7), rgba(10, 10, 10, 0.7)); +} +/* END: gestione layout dinamico mappa... */ +/* area semafori*/ +.semBlinkVe, +.semFixVe, +.semFixVe_b, +.semVe, +.semVe_b { + background: #009036; + background: rgba(0, 255, 80, 0.6); + color: #FFFFAA; +} +.semBlinkGr, +.semFixGr, +.semFixGr_b, +.semGr, +.semGr_b { + background-color: #bcbcbc; + background: rgba(180, 180, 180, 0.6); +} +.semGi { + text-align: left; + background: #8a8d27; + background: rgba(230, 210, 0, 0.6); + padding: 0px 4px 0px 4px; + color: #000; +} +.semGi_b, +.semFixGi, +.semFixGi_b { + text-align: left; + background: #f9ff18; + background: rgba(255, 255, 0, 0.8); + padding: 0px 4px 0px 4px; + color: #333; +} +.semBl { + text-align: left; + background: #000E7A; + background: rgba(0, 5, 200, 0.6); + padding: 0px 4px 0px 4px; + color: #959500; +} +.semBl_b, +.semFixBl, +.semFixBl_b { + text-align: left; + background: #243FFF; + background: rgba(60, 80, 255, 0.8); + padding: 0px 4px 0px 4px; + color: #ffff32; +} +.semRo { + text-align: left; + background-color: #7a000e; + background: rgba(200, 0, 5, 0.6); + padding: 0px 4px 0px 4px; + color: #959500; +} +.semRo_b, +.semFixRo, +.semFixRo_b { + text-align: left; + background-color: #ff243f; + background: rgba(255, 60, 80, 0.8); + padding: 0px 4px 0px 4px; + color: #ffff32; +} +/* semafori con animazione blinking */ +.no-cpu { + -moz-transform: translateZ(0); + -o-transform: translateZ(0); + -webkit-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); +} +@-webkit-keyframes blinkBack { + 0% { + background-position: 0% 50%; } - body { - font-size: 0.8em; + 50% { + background-position: 100% 50%; } + 100% { + background-position: 0% 50%; + } +} +@-moz-keyframes blinkBack { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} +@-o-keyframes blinkBack { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} +@keyframes blinkBack { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} +.semBlinkGi { + background: linear-gradient(270deg, #8a8d27, #f9ff18); + background-size: 400% 400%; + -webkit-animation: blinkBack 2s ease infinite; + -moz-animation: blinkBack 2s ease infinite; + -o-animation: blinkBack 2s ease infinite; + animation: blinkBack 2s ease infinite; +} +.semBlinkRo { + background: linear-gradient(270deg, #7a000e, #ff243f); + background-size: 400% 400%; + -webkit-animation: blinkBack 2s ease infinite; + -moz-animation: blinkBack 2s ease infinite; + -o-animation: blinkBack 2s ease infinite; + animation: blinkBack 2s ease infinite; + color: Yellow; } \ No newline at end of file diff --git a/MP.Mon/wwwroot/css/site.less b/MP.Mon/wwwroot/css/site.less index bda17c4b..70bc5e66 100644 --- a/MP.Mon/wwwroot/css/site.less +++ b/MP.Mon/wwwroot/css/site.less @@ -6,10 +6,17 @@ h1, h2, h3, h4, h5, h6, b, display-1, display-2, display-3, display-4 { font-family: 'Lato', sans-serif; } +html, body { + height: 100%; +} + html, body { /*font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;*/ font-family: 'Roboto Condensed', sans-serif; line-height: 1.3; + background-image: linear-gradient(180deg, rgb(1, 8, 22) 20%, #3aa6ff 90%); + background-size: auto 100%; + background-repeat: no-repeat; } @@ -55,61 +62,6 @@ a, .btn-link { text-decoration: line-through; } - -/* Gestione dropdown menu x week planner */ - -@dropTop: -13.5em; -@dropLeftL: -10em; -@dropLeftR: -24em; - -.dropdown { - position: relative; - display: inline-block; - - &:hover .dropdown-content, &:hover .dropdown-content-top, &:hover .dropdown-content-left, &:hover .dropdown-content-top-left { - display: block; - } -} - -.dropdown-content { - display: none; - position: absolute; - left: @dropLeftL; - min-width: 8em; - box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); - z-index: 1; - - .a { - color: black; - padding: 12px 16px; - text-decoration: none; - display: block; - } - - .a:hover { - background-color: #ddd; - } -} - - -.dropdown-content-top { - .dropdown-content(); - top: @dropTop; - left: @dropLeftL; -} - -.dropdown-content-left { - .dropdown-content(); - left: @dropLeftR; -} - -.dropdown-content-top-left { - .dropdown-content(); - top: @dropTop; - left: @dropLeftR; -} - - .textTrim { white-space: nowrap; overflow: hidden; @@ -191,128 +143,192 @@ a, .btn-link { .blazor-error-boundary::after { content: "An error has occurred." } - - -/*------------------------------------------------------------------ -[ Shortcuts / .shortcuts ] -*/ - -@blSCut: 1rem; - -.shortcuts { - text-align: center; +/* Gestione specifica oggetti MON*/ +/* MAIN: gestione layout dinamico mappa... */ +.fontSmall { + font-size: 0.75em; } -.shortcuts .shortcut-icon { - font-size: 2*@blSCut; +.fontSmaller { + font-size: 0.6em; } -.shortcuts .shortcut { - min-width: @blSCut * 9; - min-height: @blSCut * 5; - display: inline-block; - padding: @blSCut*2/3 0; - margin: 0 2px 1em; - vertical-align: top; - text-decoration: none; - background: #F3F3F3; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#eeeeee)); - background-image: -webkit-linear-gradient(top, #ffffff, 0%, #eeeeee, 100%); - background-image: -moz-linear-gradient(top, #ffffff 0%, #eeeeee 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffeeeeee', GradientType=0); - border: 1px solid #ddd; - box-sizing: border-box; - border-radius: @blSCut/2; +.statusMap { + background: #222; } -.shortcuts .shortcut-sm { - min-width: @blSCut * 4.5; - min-height: @blSCut * 3; - display: inline-block; - padding: @blSCut/4 0; - margin: 0 2px 1em; - vertical-align: top; - text-decoration: none; - background: #F3F3F3; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#eeeeee)); - background-image: -webkit-linear-gradient(top, #ffffff, 0%, #eeeeee, 100%); - background-image: -moz-linear-gradient(top, #ffffff 0%, #eeeeee 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffeeeeee', GradientType=0); - border: 1px solid #ddd; - box-sizing: border-box; - border-radius: @blSCut/2; -} - -.shortcuts .shortcut .shortcut-icon { - width: 100%; - margin-top: 0; - margin-bottom: 0; - font-size: @blSCut*2; - color: #333; -} - -.shortcuts .shortcut-sm .shortcut-icon { - width: 100%; - margin-top: 0; - margin-bottom: 0; - font-size: @blSCut*2; - color: #333; -} - -.shortcuts .shortcut:hover { - background: #E8E8E8; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fafafa), to(#e1e1e1)); - background-image: -webkit-linear-gradient(top, #fafafa, 0%, #e1e1e1, 100%); - background-image: -moz-linear-gradient(top, #fafafa 0%, #e1e1e1 100%); - background-image: linear-gradient(to bottom, #fafafa 0%, #e1e1e1 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffafafa', endColorstr='#ffe1e1e1', GradientType=0); -} - -.shortcuts .shortcut-sm:hover { - background: #E8E8E8; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fafafa), to(#e1e1e1)); - background-image: -webkit-linear-gradient(top, #fafafa, 0%, #e1e1e1, 100%); - background-image: -moz-linear-gradient(top, #fafafa 0%, #e1e1e1 100%); - background-image: linear-gradient(to bottom, #fafafa 0%, #e1e1e1 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffafafa', endColorstr='#ffe1e1e1', GradientType=0); -} - -.shortcuts .shortcut:active { - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.shortcuts .shortcut-sm:active { - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.shortcuts .shortcut:hover .shortcut-icon { - color: #C93; -} - -.shortcuts .shortcut-sm:hover .shortcut-icon { - color: #666; -} - -.shortcuts .shortcut-label { - display: block; - margin-top: .75em; +.statusMap .ui-title, .statusMap .ui-li-aside { font-weight: 400; - color: #666; + text-transform: uppercase; + font-size: 2.5em; + line-height: 1.1em; + color: #DEDEDE; + text-shadow: 2px 2px 4px #000; + text-align: center; + background: linear-gradient(270deg, rgba(20,20,20,0.7), rgba(100,100,100,0.7), rgba(20,20,20,0.7)); } -@media (max-width: 640px) { - .shortcuts .shortcut { - min-width: @blSCut * 8; - min-height: @blSCut * 4; +.statusMap .ui-art { +} + +.statusMap .ui-footer { + color: #CDCDCD; + background: linear-gradient(270deg, rgba(10,10,10,0.7), rgba(80,80,80,0.7), rgba(10,10,10,0.7)); +} +/* END: gestione layout dinamico mappa... */ +/* area semafori*/ +.semBlinkVe, +.semFixVe, +.semFixVe_b, +.semVe, +.semVe_b { + background: #009036; + background: rgba(0,255,80,.6); + color: #FFFFAA; +} + +.semBlinkGr, +.semFixGr, +.semFixGr_b, +.semGr, +.semGr_b { + background-color: #bcbcbc; + background: rgba(180,180,180,.6); +} + +.semGi { + text-align: left; + background: #8a8d27; + background: rgba(230,210,0,.6); + padding: 0px 4px 0px 4px; + color: #000; +} + +.semGi_b, +.semFixGi, +.semFixGi_b { + text-align: left; + background: #f9ff18; + background: rgba(255,255,0,.8); + padding: 0px 4px 0px 4px; + color: #333; +} + +.semBl { + text-align: left; + background: #000E7A; + background: rgba(0,5,200,.6); + padding: 0px 4px 0px 4px; + color: #959500; +} + +.semBl_b, +.semFixBl, +.semFixBl_b { + text-align: left; + background: #243FFF; + background: rgba(60,80,255,.8); + padding: 0px 4px 0px 4px; + color: #ffff32; +} + +.semRo { + text-align: left; + background-color: #7a000e; + background: rgba(200,0,5,.6); + padding: 0px 4px 0px 4px; + color: #959500; +} + +.semRo_b, +.semFixRo, +.semFixRo_b { + text-align: left; + background-color: #ff243f; + background: rgba(255,60,80,.8); + padding: 0px 4px 0px 4px; + color: #ffff32; +} +/* semafori con animazione blinking */ +.no-cpu { + -moz-transform: translateZ(0); + -o-transform: translateZ(0); + -webkit-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); +} + +@-webkit-keyframes blinkBack { + 0% { + background-position: 0% 50%; } - body { - font-size: 0.8em; + 50% { + background-position: 100% 50%; + } + + 100% { + background-position: 0% 50%; } } + +@-moz-keyframes blinkBack { + 0% { + background-position: 0% 50%; + } + + 50% { + background-position: 100% 50%; + } + + 100% { + background-position: 0% 50%; + } +} + +@-o-keyframes blinkBack { + 0% { + background-position: 0% 50%; + } + + 50% { + background-position: 100% 50%; + } + + 100% { + background-position: 0% 50%; + } +} + +@keyframes blinkBack { + 0% { + background-position: 0% 50%; + } + + 50% { + background-position: 100% 50%; + } + + 100% { + background-position: 0% 50%; + } +} + +.semBlinkGi { + background: linear-gradient(270deg, #8a8d27, #f9ff18); + background-size: 400% 400%; + -webkit-animation: blinkBack 2s ease infinite; + -moz-animation: blinkBack 2s ease infinite; + -o-animation: blinkBack 2s ease infinite; + animation: blinkBack 2s ease infinite; +} + +.semBlinkRo { + background: linear-gradient(270deg, #7a000e, #ff243f); + background-size: 400% 400%; + -webkit-animation: blinkBack 2s ease infinite; + -moz-animation: blinkBack 2s ease infinite; + -o-animation: blinkBack 2s ease infinite; + animation: blinkBack 2s ease infinite; + color: Yellow; +} diff --git a/MP.Mon/wwwroot/css/site.min.css b/MP.Mon/wwwroot/css/site.min.css index ad652924..c5d46f4d 100644 --- a/MP.Mon/wwwroot/css/site.min.css +++ b/MP.Mon/wwwroot/css/site.min.css @@ -1 +1 @@ -@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');@import url('fonts.min.css');h1,h2,h3,h4,h5,h6,b,display-1,display-2,display-3,display-4{font-family:'Lato',sans-serif;}html,body{font-family:'Roboto Condensed',sans-serif;line-height:1.3;}h1:focus{outline:none;}a,.btn-link{color:#0071c1;}.btn-primary{color:#fff;background-color:#1b6ec2;border-color:#1861ac;}.content{padding-top:1.1rem;}.valid.modified:not([type=checkbox]){outline:1px solid #26b050;}.invalid{outline:1px solid #f00;}.validation-message{color:#f00;}.regionnotclicked{fill:white;}.regionclicked{fill:red;}.striked{text-decoration:line-through;}.dropdown{position:relative;display:inline-block;}.dropdown:hover .dropdown-content,.dropdown:hover .dropdown-content-top,.dropdown:hover .dropdown-content-left,.dropdown:hover .dropdown-content-top-left{display:block;}.dropdown-content{display:none;position:absolute;left:-10em;min-width:8em;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);z-index:1;}.dropdown-content .a{color:#000;padding:12px 16px;text-decoration:none;display:block;}.dropdown-content .a:hover{background-color:#ddd;}.dropdown-content-top{display:none;position:absolute;min-width:8em;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);z-index:1;top:-13.5em;left:-10em;}.dropdown-content-top .a{color:#000;padding:12px 16px;text-decoration:none;display:block;}.dropdown-content-top .a:hover{background-color:#ddd;}.dropdown-content-left{display:none;position:absolute;left:-10em;min-width:8em;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);z-index:1;left:-24em;}.dropdown-content-left .a{color:#000;padding:12px 16px;text-decoration:none;display:block;}.dropdown-content-left .a:hover{background-color:#ddd;}.dropdown-content-top-left{display:none;position:absolute;left:-10em;min-width:8em;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);z-index:1;top:-13.5em;left:-24em;}.dropdown-content-top-left .a{color:#000;padding:12px 16px;text-decoration:none;display:block;}.dropdown-content-top-left .a:hover{background-color:#ddd;}.textTrim{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.maxChar{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.max5Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:5rem;}.max10Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:10rem;}.max20Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:20rem;}.max30Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:30rem;}.max40Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:40rem;}.max50Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:50rem;}.max100Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100rem;}.footer{line-height:1.8em;}#blazor-error-ui{background:#ffffe0;bottom:0;box-shadow:0 -1px 2px rgba(0,0,0,.2);display:none;left:0;padding:.6rem 1.25rem .7rem 1.25rem;position:fixed;width:100%;z-index:1000;}#blazor-error-ui .dismiss{cursor:pointer;position:absolute;right:.75rem;top:.5rem;}.blazor-error-boundary{background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem,#b32121;padding:1rem 1rem 1rem 3.7rem;color:#fff;}.blazor-error-boundary::after{content:"An error has occurred.";}.shortcuts{text-align:center;}.shortcuts .shortcut-icon{font-size:2rem;}.shortcuts .shortcut{min-width:9rem;min-height:5rem;display:inline-block;padding:2rem/3 0;margin:0 2px 1em;vertical-align:top;text-decoration:none;background:#f3f3f3;background-image:-webkit-gradient(linear,left 0%,left 100%,from(#fff),to(#eee));background-image:-webkit-linear-gradient(top,#fff,0%,#eee,100%);background-image:-moz-linear-gradient(top,#fff 0%,#eee 100%);background-image:linear-gradient(to bottom,#fff 0%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffeeeeee',GradientType=0);border:1px solid #ddd;box-sizing:border-box;border-radius:1rem/2;}.shortcuts .shortcut-sm{min-width:4.5rem;min-height:3rem;display:inline-block;padding:1rem/4 0;margin:0 2px 1em;vertical-align:top;text-decoration:none;background:#f3f3f3;background-image:-webkit-gradient(linear,left 0%,left 100%,from(#fff),to(#eee));background-image:-webkit-linear-gradient(top,#fff,0%,#eee,100%);background-image:-moz-linear-gradient(top,#fff 0%,#eee 100%);background-image:linear-gradient(to bottom,#fff 0%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffeeeeee',GradientType=0);border:1px solid #ddd;box-sizing:border-box;border-radius:1rem/2;}.shortcuts .shortcut .shortcut-icon{width:100%;margin-top:0;margin-bottom:0;font-size:2rem;color:#333;}.shortcuts .shortcut-sm .shortcut-icon{width:100%;margin-top:0;margin-bottom:0;font-size:2rem;color:#333;}.shortcuts .shortcut:hover{background:#e8e8e8;background-image:-webkit-gradient(linear,left 0%,left 100%,from(#fafafa),to(#e1e1e1));background-image:-webkit-linear-gradient(top,#fafafa,0%,#e1e1e1,100%);background-image:-moz-linear-gradient(top,#fafafa 0%,#e1e1e1 100%);background-image:linear-gradient(to bottom,#fafafa 0%,#e1e1e1 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffafafa',endColorstr='#ffe1e1e1',GradientType=0);}.shortcuts .shortcut-sm:hover{background:#e8e8e8;background-image:-webkit-gradient(linear,left 0%,left 100%,from(#fafafa),to(#e1e1e1));background-image:-webkit-linear-gradient(top,#fafafa,0%,#e1e1e1,100%);background-image:-moz-linear-gradient(top,#fafafa 0%,#e1e1e1 100%);background-image:linear-gradient(to bottom,#fafafa 0%,#e1e1e1 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffafafa',endColorstr='#ffe1e1e1',GradientType=0);}.shortcuts .shortcut:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125);}.shortcuts .shortcut-sm:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125);}.shortcuts .shortcut:hover .shortcut-icon{color:#c93;}.shortcuts .shortcut-sm:hover .shortcut-icon{color:#666;}.shortcuts .shortcut-label{display:block;margin-top:.75em;font-weight:400;color:#666;}@media(max-width:640px){.shortcuts .shortcut{min-width:8rem;min-height:4rem;}body{font-size:.8em;}} \ No newline at end of file +@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');@import url('fonts.min.css');h1,h2,h3,h4,h5,h6,b,display-1,display-2,display-3,display-4{font-family:'Lato',sans-serif;}html,body{height:100%;}html,body{font-family:'Roboto Condensed',sans-serif;line-height:1.3;background-image:linear-gradient(180deg,#010816 20%,#3aa6ff 90%);background-size:auto 100%;background-repeat:no-repeat;}h1:focus{outline:none;}a,.btn-link{color:#0071c1;}.btn-primary{color:#fff;background-color:#1b6ec2;border-color:#1861ac;}.content{padding-top:1.1rem;}.valid.modified:not([type=checkbox]){outline:1px solid #26b050;}.invalid{outline:1px solid #f00;}.validation-message{color:#f00;}.regionnotclicked{fill:white;}.regionclicked{fill:red;}.striked{text-decoration:line-through;}.textTrim{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.maxChar{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.max5Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:5rem;}.max10Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:10rem;}.max20Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:20rem;}.max30Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:30rem;}.max40Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:40rem;}.max50Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:50rem;}.max100Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100rem;}.footer{line-height:1.8em;}#blazor-error-ui{background:#ffffe0;bottom:0;box-shadow:0 -1px 2px rgba(0,0,0,.2);display:none;left:0;padding:.6rem 1.25rem .7rem 1.25rem;position:fixed;width:100%;z-index:1000;}#blazor-error-ui .dismiss{cursor:pointer;position:absolute;right:.75rem;top:.5rem;}.blazor-error-boundary{background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem,#b32121;padding:1rem 1rem 1rem 3.7rem;color:#fff;}.blazor-error-boundary::after{content:"An error has occurred.";}.fontSmall{font-size:.75em;}.fontSmaller{font-size:.6em;}.statusMap{background:#222;}.statusMap .ui-title,.statusMap .ui-li-aside{font-weight:400;text-transform:uppercase;font-size:2.5em;line-height:1.1em;color:#dedede;text-shadow:2px 2px 4px #000;text-align:center;background:linear-gradient(270deg,rgba(20,20,20,.7),rgba(100,100,100,.7),rgba(20,20,20,.7));}.statusMap .ui-footer{color:#cdcdcd;background:linear-gradient(270deg,rgba(10,10,10,.7),rgba(80,80,80,.7),rgba(10,10,10,.7));}.semBlinkVe,.semFixVe,.semFixVe_b,.semVe,.semVe_b{background:#009036;background:rgba(0,255,80,.6);color:#ffa;}.semBlinkGr,.semFixGr,.semFixGr_b,.semGr,.semGr_b{background-color:#bcbcbc;background:rgba(180,180,180,.6);}.semGi{text-align:left;background:#8a8d27;background:rgba(230,210,0,.6);padding:0 4px 0 4px;color:#000;}.semGi_b,.semFixGi,.semFixGi_b{text-align:left;background:#f9ff18;background:rgba(255,255,0,.8);padding:0 4px 0 4px;color:#333;}.semBl{text-align:left;background:#000e7a;background:rgba(0,5,200,.6);padding:0 4px 0 4px;color:#959500;}.semBl_b,.semFixBl,.semFixBl_b{text-align:left;background:#243fff;background:rgba(60,80,255,.8);padding:0 4px 0 4px;color:#ffff32;}.semRo{text-align:left;background-color:#7a000e;background:rgba(200,0,5,.6);padding:0 4px 0 4px;color:#959500;}.semRo_b,.semFixRo,.semFixRo_b{text-align:left;background-color:#ff243f;background:rgba(255,60,80,.8);padding:0 4px 0 4px;color:#ffff32;}.no-cpu{-moz-transform:translateZ(0);-o-transform:translateZ(0);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);}@-webkit-keyframes blinkBack{0%{background-position:0% 50%;}50%{background-position:100% 50%;}100%{background-position:0% 50%;}}@-moz-keyframes blinkBack{0%{background-position:0% 50%;}50%{background-position:100% 50%;}100%{background-position:0% 50%;}}@-o-keyframes blinkBack{0%{background-position:0% 50%;}50%{background-position:100% 50%;}100%{background-position:0% 50%;}}@keyframes blinkBack{0%{background-position:0% 50%;}50%{background-position:100% 50%;}100%{background-position:0% 50%;}}.semBlinkGi{background:linear-gradient(270deg,#8a8d27,#f9ff18);background-size:400% 400%;-webkit-animation:blinkBack 2s ease infinite;-moz-animation:blinkBack 2s ease infinite;-o-animation:blinkBack 2s ease infinite;animation:blinkBack 2s ease infinite;}.semBlinkRo{background:linear-gradient(270deg,#7a000e,#ff243f);background-size:400% 400%;-webkit-animation:blinkBack 2s ease infinite;-moz-animation:blinkBack 2s ease infinite;-o-animation:blinkBack 2s ease infinite;animation:blinkBack 2s ease infinite;color:#ff0;} \ No newline at end of file diff --git a/MP.Mon/wwwroot/images/LogoCliente.png b/MP.Mon/wwwroot/images/LogoCliente.png new file mode 100644 index 0000000000000000000000000000000000000000..8d5a7c1fa3da8f7edbd0edfaa5b299fee87505ec GIT binary patch literal 3051 zcmds3YgAKL8jbZq0hOT&S|Xr8u}TBhLKG1gPy(!$hk&>wMZknm@Cp@>M0up*R79|Z zN0qk<6lE}oH*hI0k%AC`BvJ@)3E@q6n1n|vhygO^I{)VH{Fyab>zLJ0< zR8!9^(m4?Qn{aUQZ9(Hmqd@c;m3n6KUk{9xwN6yF35BCGH`xO{qYGSADw=wWbPO~I zM2YMHkz|Qk-hZW}7w(iiY8n+!D^fXwJh8mFcdqQ!#JyVaz~o~6o0;CR1;Nnd@QmWk z@O*3E+w!)FoVwwQ`Q2iPtfoucIXH*#rplVT2Pfx%cD<6IPrzgw?d9&R`Y%2>b&IC~ zAd&iyF6X0gxScK7v#CAe2^ELah;}{g;KR5e6VJj!i1w|Z^U3+guj~u)$a0EVjvpyj zHdWw!DF65-iF0LOZ=85u;eGam>4I^jbEfYo4RVwp`na-r9F} zFnsNV(=pb^AfCnOBIyFim>hujh3>PxV9e2!M}6m^M&B zGDmn;Ik;L?nt3cw#h}iE*dVm|7gGH2`kqjZ&`PsjEy(^)Eku4Ev+%0n-MWIlXgFBGTv@RJM4b{9s6u_|4i#NfF;B_o zH&VVw*V0G@Nq%nsgf?ni?t{*hbolnqcB}yLhcNM7H`y*(pu%3}6QN0m@449yB?ukN zQ+7X5g7&!)Rg2u)fcA?#RlSOZeIff7m2Y}%RbT>0&JaWbhe)czUQge$H!PA`t{FY` z0SMTQ4yBRW!3#M`1*L7rhgqq^t4&I+gi0NCxHiq11ayywM1f=0yNN9jvDUs0h z+DZUR=I6Z~nA<-z5hJMh<~0VqO1oaElLXm6w~g^+HvC>@0KGaO!iy+s@7gcrVftkn zijSv)U^TJ>(n+&s&$47iIk)_FpyqHvt_EtJGmVMTG(CYu8a}tfDpN>eF~+AThU4c< z?3&b}+E8GOn4kSuvoA|lrJe*r?zwX8u(t&GizUlC^l>j6+#=Rxaq43$eVEOW<>;Wk zyc4})T!dDEUA@b%N6pA)6zgkY&N7yV;*I?h=;x_025u_`v$axSeepn%E;%Q% zjB1np0YeTC0gLTJ?U?cUqO8>^E-mG*u@mxO@ZtoQb$R2)2Ja}9^BXB+zeoU;rMC)} zqsXCOE^<&uiuwb$iw~Kc88jj2?RHZJ5-@nQSiO)SAsoGq1fYjo)C*+&2$$g)!m--6 z+nU^Slr^>Th*bGEba7SKAmq?6>j z#oOI{-Su--9vS?5)1b0HQFz#>niIS)ZSNSAV^?Won$PoPWrQQGH7;XNEw+)ztFS*L zgscy8)rwF!K9K&MWuAY$UoN`zi*qU!i394ryYA5w;~r)c)(Kum$#a0D^WHVEai3>? z@>nhOy4{#WAj^S3KVrR9+6phqRloQm(p{6A%b*7$r&EXVHC)mmJXk-1n9skx_kj#?B`2y4YOz zt|QT|GM01zqzl=Cq2-3b0TO|le>69T zgPt9CL35KiUpv@6lJXkBzB~)IR?s+?TE7X7D&@5?CQD!&4vlg$(hn_k#c;(^K?(Z1 zQ{kEA5Iz(aNOwmc9^x$C5T6fDD(#}(Pr4eMMC$_Q8epegG)iKe16r)kL0^q!!On`{ z39%{zcKsGPhqUhu$Mo&_)!z?pthSB$F^X7kneQ7DiaNyqZ_#l@s?yVV&>@@zqA>=(^eT+?JI<9~B#;H*cjt`6kT5#~DHMk)9S8t~si zB3e^3PZM4L4~BV8<8%8PIM~%F&*VP`-gHxh`Sk}fVam!z&6;}YvN^t$<@QEYqf-0+ Y*WH$Z+O?m9KczTVC->78j)95)0#(IYY5)KL literal 0 HcmV?d00001 diff --git a/MP.Mon/wwwroot/images/LogoMapo.png b/MP.Mon/wwwroot/images/LogoMapo.png new file mode 100644 index 0000000000000000000000000000000000000000..579e0fe3e68e03fd91c795292b2927f03067f929 GIT binary patch literal 19861 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