From 9838941992b4e7f4b4f5a7bf9d1568905939dced Mon Sep 17 00:00:00 2001 From: Artem Konkin Date: Thu, 8 Feb 2024 15:54:14 +0600 Subject: [PATCH 1/3] Refactor and add libs to local folder --- .../Abstractions/ITempDataService.cs | 8 +- .../Abstractions/IToastNotificationService.cs | 8 +- .../Abstractions/Notification.cs | 7 +- .../AspNetCoreHero.ToastNotification.csproj | 16 +- .../Extensions/EnumExtensions.cs | 4 - .../Extensions/ServiceCollectionExtensions.cs | 3 - .../Helpers/JsonSerialization.cs | 5 - .../Notyf/Models/Config.cs | 6 +- .../Notyf/Models/Icon.cs | 8 +- .../Notyf/Models/NotyfEntity.cs | 8 +- .../Notyf/Models/Position.cs | 6 +- .../Notyf/NotyfViewModel.cs | 6 +- .../Services/TempDataService.cs | 5 - .../Toastify/Enums/Gravity.cs | 7 +- .../Toastify/Enums/Position.cs | 7 +- .../Toastify/Models/ToastifyNotification.cs | 5 - .../Toastify/ToastifyService.cs | 1 - .../Toastify/ToastifyViewModel.cs | 4 - .../Shared/Components/Notyf/Default.cshtml | 13 +- .../Components/Notyf/NotyfViewComponent.cs | 3 +- .../Shared/Components/Toastify/Default.cshtml | 4 +- .../Toastify/ToastifyViewComponent.cs | 6 - .../wwwroot/libs/font-awesome.min.css | 4 + .../wwwroot/toastify.css | 4 +- .../wwwroot/toastify.js | 726 +++++++++--------- .../Controllers/HomeController.cs | 4 - .../Models/ErrorViewModel.cs | 2 - ToastNotification.Notyf/Program.cs | 6 - ToastNotification.Notyf/Startup.cs | 5 - .../Pages/Error.cshtml.cs | 4 - .../Pages/Privacy.cshtml.cs | 7 +- ToastNotification.Toastify/Program.cs | 6 - 32 files changed, 399 insertions(+), 509 deletions(-) create mode 100644 AspNetCoreHero.ToastNotification/wwwroot/libs/font-awesome.min.css diff --git a/AspNetCoreHero.ToastNotification/Abstractions/ITempDataService.cs b/AspNetCoreHero.ToastNotification/Abstractions/ITempDataService.cs index 98fab29..d879ae9 100644 --- a/AspNetCoreHero.ToastNotification/Abstractions/ITempDataService.cs +++ b/AspNetCoreHero.ToastNotification/Abstractions/ITempDataService.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AspNetCoreHero.ToastNotification.Abstractions +namespace AspNetCoreHero.ToastNotification.Abstractions { public interface ITempDataService { diff --git a/AspNetCoreHero.ToastNotification/Abstractions/IToastNotificationService.cs b/AspNetCoreHero.ToastNotification/Abstractions/IToastNotificationService.cs index 7ee32a1..cf5ce2b 100644 --- a/AspNetCoreHero.ToastNotification/Abstractions/IToastNotificationService.cs +++ b/AspNetCoreHero.ToastNotification/Abstractions/IToastNotificationService.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AspNetCoreHero.ToastNotification.Abstractions +namespace AspNetCoreHero.ToastNotification.Abstractions { public interface IToastNotificationService { diff --git a/AspNetCoreHero.ToastNotification/Abstractions/Notification.cs b/AspNetCoreHero.ToastNotification/Abstractions/Notification.cs index dae343b..051b1d4 100644 --- a/AspNetCoreHero.ToastNotification/Abstractions/Notification.cs +++ b/AspNetCoreHero.ToastNotification/Abstractions/Notification.cs @@ -1,9 +1,4 @@ using AspNetCoreHero.ToastNotification.Enums; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace AspNetCoreHero.ToastNotification.Abstractions { @@ -13,7 +8,7 @@ public Notification(ToastNotificationType type, string message, int? durationInS { Message = message; Type = type; - Duration = (durationInSeconds == null || durationInSeconds == 0) ? null : durationInSeconds * 1000; + Duration = durationInSeconds == null || durationInSeconds == 0 ? null : durationInSeconds * 1000; } public string Message { get; set; } public string BackgroundColor { get; set; } diff --git a/AspNetCoreHero.ToastNotification/AspNetCoreHero.ToastNotification.csproj b/AspNetCoreHero.ToastNotification/AspNetCoreHero.ToastNotification.csproj index efcc865..dfc2f76 100644 --- a/AspNetCoreHero.ToastNotification/AspNetCoreHero.ToastNotification.csproj +++ b/AspNetCoreHero.ToastNotification/AspNetCoreHero.ToastNotification.csproj @@ -5,7 +5,7 @@ true false true - Mukesh Murugan + Mukesh Murugan, Artem Konkin aspnetcorehero AspNetCoreHero.ToastNotification Elegant Toast Notifications for ASP.NET Core Applications. Compatilble with ASP.NET Core 3.1 and .NET 5. @@ -13,8 +13,7 @@ MIT 1.1.0 1.1.0 - 1.1.0 - logo-transparent.png + 1.1.1 https://github.com/aspnetcorehero/ToastNotification https://github.com/aspnetcorehero/ToastNotification @@ -27,13 +26,4 @@ - - - True - - - - - - - + \ No newline at end of file diff --git a/AspNetCoreHero.ToastNotification/Extensions/EnumExtensions.cs b/AspNetCoreHero.ToastNotification/Extensions/EnumExtensions.cs index 948ab6a..0aa980b 100644 --- a/AspNetCoreHero.ToastNotification/Extensions/EnumExtensions.cs +++ b/AspNetCoreHero.ToastNotification/Extensions/EnumExtensions.cs @@ -1,10 +1,6 @@ using System; -using System.Collections.Generic; using System.ComponentModel; -using System.Linq; using System.Reflection; -using System.Text; -using System.Threading.Tasks; namespace AspNetCoreHero.ToastNotification.Extensions { diff --git a/AspNetCoreHero.ToastNotification/Extensions/ServiceCollectionExtensions.cs b/AspNetCoreHero.ToastNotification/Extensions/ServiceCollectionExtensions.cs index 3adc1d9..696ed4c 100644 --- a/AspNetCoreHero.ToastNotification/Extensions/ServiceCollectionExtensions.cs +++ b/AspNetCoreHero.ToastNotification/Extensions/ServiceCollectionExtensions.cs @@ -10,10 +10,7 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.Extensions.DependencyInjection; using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace AspNetCoreHero.ToastNotification { diff --git a/AspNetCoreHero.ToastNotification/Helpers/JsonSerialization.cs b/AspNetCoreHero.ToastNotification/Helpers/JsonSerialization.cs index c9fda1a..ecd14fd 100644 --- a/AspNetCoreHero.ToastNotification/Helpers/JsonSerialization.cs +++ b/AspNetCoreHero.ToastNotification/Helpers/JsonSerialization.cs @@ -1,10 +1,5 @@ using Newtonsoft.Json; using Newtonsoft.Json.Serialization; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace AspNetCoreHero.ToastNotification.Helpers { diff --git a/AspNetCoreHero.ToastNotification/Notyf/Models/Config.cs b/AspNetCoreHero.ToastNotification/Notyf/Models/Config.cs index 61375eb..c68e922 100644 --- a/AspNetCoreHero.ToastNotification/Notyf/Models/Config.cs +++ b/AspNetCoreHero.ToastNotification/Notyf/Models/Config.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace AspNetCoreHero.ToastNotification.Notyf.Models +namespace AspNetCoreHero.ToastNotification.Notyf.Models { public class Config { diff --git a/AspNetCoreHero.ToastNotification/Notyf/Models/Icon.cs b/AspNetCoreHero.ToastNotification/Notyf/Models/Icon.cs index ec12e86..8dab2cc 100644 --- a/AspNetCoreHero.ToastNotification/Notyf/Models/Icon.cs +++ b/AspNetCoreHero.ToastNotification/Notyf/Models/Icon.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace AspNetCoreHero.ToastNotification.Notyf.Models +namespace AspNetCoreHero.ToastNotification.Notyf.Models { public class Icon { @@ -10,4 +6,4 @@ public class Icon public string tagName { get; set; } public string text { get; set; } } -} +} \ No newline at end of file diff --git a/AspNetCoreHero.ToastNotification/Notyf/Models/NotyfEntity.cs b/AspNetCoreHero.ToastNotification/Notyf/Models/NotyfEntity.cs index 2c25aff..f751bec 100644 --- a/AspNetCoreHero.ToastNotification/Notyf/Models/NotyfEntity.cs +++ b/AspNetCoreHero.ToastNotification/Notyf/Models/NotyfEntity.cs @@ -7,7 +7,7 @@ public class NotyfEntity { public NotyfEntity(int durationInSeconds = 5, NotyfPosition toastPosition = NotyfPosition.BottomRight, bool isDismissible = true) { - duration = (durationInSeconds > 0) ? durationInSeconds * 1000 : 5000; + duration = durationInSeconds > 0 ? durationInSeconds * 1000 : 5000; dismissible = isDismissible; ripple = true; try @@ -16,8 +16,8 @@ public NotyfEntity(int durationInSeconds = 5, NotyfPosition toastPosition = Noty var positionArray = description.Split('-'); position = new Position() { - x = (positionArray is null) ? "right" : positionArray[0], - y = (positionArray is null) ? "bottom" : positionArray[1] + x = positionArray is null ? "right" : positionArray[0], + y = positionArray is null ? "bottom" : positionArray[1] }; } catch @@ -81,4 +81,4 @@ private static string ToDescriptionString(NotyfPosition val) return attributes.Length > 0 ? attributes[0].Description : "right-bottom"; } } -} +} \ No newline at end of file diff --git a/AspNetCoreHero.ToastNotification/Notyf/Models/Position.cs b/AspNetCoreHero.ToastNotification/Notyf/Models/Position.cs index 3d80a8c..e2602dd 100644 --- a/AspNetCoreHero.ToastNotification/Notyf/Models/Position.cs +++ b/AspNetCoreHero.ToastNotification/Notyf/Models/Position.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace AspNetCoreHero.ToastNotification.Notyf.Models +namespace AspNetCoreHero.ToastNotification.Notyf.Models { public class Position { diff --git a/AspNetCoreHero.ToastNotification/Notyf/NotyfViewModel.cs b/AspNetCoreHero.ToastNotification/Notyf/NotyfViewModel.cs index e305c94..5b29b14 100644 --- a/AspNetCoreHero.ToastNotification/Notyf/NotyfViewModel.cs +++ b/AspNetCoreHero.ToastNotification/Notyf/NotyfViewModel.cs @@ -1,9 +1,5 @@ using AspNetCoreHero.ToastNotification.Notyf.Models; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace AspNetCoreHero.ToastNotification.Notyf { @@ -12,4 +8,4 @@ public class NotyfViewModel public string Configuration { get; set; } public IEnumerable Notifications { get; set; } } -} +} \ No newline at end of file diff --git a/AspNetCoreHero.ToastNotification/Services/TempDataService.cs b/AspNetCoreHero.ToastNotification/Services/TempDataService.cs index 65f8b28..a5f8737 100644 --- a/AspNetCoreHero.ToastNotification/Services/TempDataService.cs +++ b/AspNetCoreHero.ToastNotification/Services/TempDataService.cs @@ -3,11 +3,6 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace AspNetCoreHero.ToastNotification.Services { diff --git a/AspNetCoreHero.ToastNotification/Toastify/Enums/Gravity.cs b/AspNetCoreHero.ToastNotification/Toastify/Enums/Gravity.cs index 1d26ed2..463e922 100644 --- a/AspNetCoreHero.ToastNotification/Toastify/Enums/Gravity.cs +++ b/AspNetCoreHero.ToastNotification/Toastify/Enums/Gravity.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.ComponentModel; namespace AspNetCoreHero.ToastNotification { diff --git a/AspNetCoreHero.ToastNotification/Toastify/Enums/Position.cs b/AspNetCoreHero.ToastNotification/Toastify/Enums/Position.cs index 416b5ff..2e1bfa9 100644 --- a/AspNetCoreHero.ToastNotification/Toastify/Enums/Position.cs +++ b/AspNetCoreHero.ToastNotification/Toastify/Enums/Position.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.ComponentModel; namespace AspNetCoreHero.ToastNotification { diff --git a/AspNetCoreHero.ToastNotification/Toastify/Models/ToastifyNotification.cs b/AspNetCoreHero.ToastNotification/Toastify/Models/ToastifyNotification.cs index 9978716..6a17872 100644 --- a/AspNetCoreHero.ToastNotification/Toastify/Models/ToastifyNotification.cs +++ b/AspNetCoreHero.ToastNotification/Toastify/Models/ToastifyNotification.cs @@ -1,10 +1,5 @@ using AspNetCoreHero.ToastNotification.Abstractions; using AspNetCoreHero.ToastNotification.Enums; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace AspNetCoreHero.ToastNotification.Toastify.Models { diff --git a/AspNetCoreHero.ToastNotification/Toastify/ToastifyService.cs b/AspNetCoreHero.ToastNotification/Toastify/ToastifyService.cs index 8710a2b..df44c46 100644 --- a/AspNetCoreHero.ToastNotification/Toastify/ToastifyService.cs +++ b/AspNetCoreHero.ToastNotification/Toastify/ToastifyService.cs @@ -1,7 +1,6 @@ using AspNetCoreHero.ToastNotification.Abstractions; using AspNetCoreHero.ToastNotification.Enums; using AspNetCoreHero.ToastNotification.Toastify.Models; -using System; using System.Collections.Generic; namespace AspNetCoreHero.ToastNotification.Toastify diff --git a/AspNetCoreHero.ToastNotification/Toastify/ToastifyViewModel.cs b/AspNetCoreHero.ToastNotification/Toastify/ToastifyViewModel.cs index 9a7cffd..fd7a279 100644 --- a/AspNetCoreHero.ToastNotification/Toastify/ToastifyViewModel.cs +++ b/AspNetCoreHero.ToastNotification/Toastify/ToastifyViewModel.cs @@ -1,9 +1,5 @@ using AspNetCoreHero.ToastNotification.Toastify.Models; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace AspNetCoreHero.ToastNotification.Toastify { diff --git a/AspNetCoreHero.ToastNotification/Views/Shared/Components/Notyf/Default.cshtml b/AspNetCoreHero.ToastNotification/Views/Shared/Components/Notyf/Default.cshtml index b4de7f6..3fd9ac0 100644 --- a/AspNetCoreHero.ToastNotification/Views/Shared/Components/Notyf/Default.cshtml +++ b/AspNetCoreHero.ToastNotification/Views/Shared/Components/Notyf/Default.cshtml @@ -1,11 +1,15 @@ @model AspNetCoreHero.ToastNotification.Notyf.NotyfViewModel @using AspNetCoreHero.ToastNotification.Enums - - - + + + + + + + @{ @if (Model.Notifications != null) { @@ -48,10 +52,9 @@ break; } } - } - } + + + @{ @if (Model.Notifications != null) { diff --git a/AspNetCoreHero.ToastNotification/Views/Shared/Components/Toastify/ToastifyViewComponent.cs b/AspNetCoreHero.ToastNotification/Views/Shared/Components/Toastify/ToastifyViewComponent.cs index d39dd34..768a7ad 100644 --- a/AspNetCoreHero.ToastNotification/Views/Shared/Components/Toastify/ToastifyViewComponent.cs +++ b/AspNetCoreHero.ToastNotification/Views/Shared/Components/Toastify/ToastifyViewComponent.cs @@ -1,13 +1,7 @@ using AspNetCoreHero.ToastNotification.Abstractions; -using AspNetCoreHero.ToastNotification.Helpers; using AspNetCoreHero.ToastNotification.Toastify; using AspNetCoreHero.ToastNotification.Toastify.Models; using Microsoft.AspNetCore.Mvc; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace AspNetCoreHero.ToastNotification.Views.Shared.Components.Toastify { diff --git a/AspNetCoreHero.ToastNotification/wwwroot/libs/font-awesome.min.css b/AspNetCoreHero.ToastNotification/wwwroot/libs/font-awesome.min.css new file mode 100644 index 0000000..540440c --- /dev/null +++ b/AspNetCoreHero.ToastNotification/wwwroot/libs/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/AspNetCoreHero.ToastNotification/wwwroot/toastify.css b/AspNetCoreHero.ToastNotification/wwwroot/toastify.css index a571b7b..b2afae4 100644 --- a/AspNetCoreHero.ToastNotification/wwwroot/toastify.css +++ b/AspNetCoreHero.ToastNotification/wwwroot/toastify.css @@ -53,7 +53,7 @@ } .toast-close { - + } .toastify-right { @@ -100,4 +100,4 @@ right: 0; max-width: fit-content; } -} +} \ No newline at end of file diff --git a/AspNetCoreHero.ToastNotification/wwwroot/toastify.js b/AspNetCoreHero.ToastNotification/wwwroot/toastify.js index 1346c9b..3adf3d2 100644 --- a/AspNetCoreHero.ToastNotification/wwwroot/toastify.js +++ b/AspNetCoreHero.ToastNotification/wwwroot/toastify.js @@ -5,390 +5,390 @@ * * Copyright (C) 2018 Varun A P */ -(function(root, factory) { - if (typeof module === "object" && module.exports) { - module.exports = factory(); - } else { - root.Toastify = factory(); - } -})(this, function(global) { - // Object initialization - var Toastify = function(options) { - // Returning a new init object - return new Toastify.lib.init(options); - }, - // Library version - version = "1.9.3"; - - // Defining the prototype of the object - Toastify.lib = Toastify.prototype = { - toastify: version, - - constructor: Toastify, - - // Initializing the object with required parameters - init: function(options) { - // Verifying and validating the input object - if (!options) { - options = {}; - } - - // Creating the options object - this.options = {}; - - this.toastElement = null; - - // Validating the options - this.options.text = options.text || "Hi there!"; // Display message - this.options.node = options.node // Display content as node - this.options.duration = options.duration === 0 ? 0 : options.duration || 3000; // Display duration - this.options.selector = options.selector; // Parent selector - this.options.callback = options.callback || function() {}; // Callback after display - this.options.destination = options.destination; // On-click destination - this.options.newWindow = options.newWindow || false; // Open destination in new window - this.options.close = options.close || false; // Show toast close icon - this.options.gravity = options.gravity === "bottom" ? "toastify-bottom" : "toastify-top"; // toast position - top or bottom - this.options.positionLeft = options.positionLeft || false; // toast position - left or right - this.options.position = options.position || ''; // toast position - left or right - this.options.backgroundColor = options.backgroundColor; // toast background color - this.options.avatar = options.avatar || ""; // img element src - url or a path - this.options.className = options.className || ""; // additional class names for the toast - this.options.stopOnFocus = options.stopOnFocus === undefined? true: options.stopOnFocus; // stop timeout on focus - this.options.onClick = options.onClick; // Callback after click - - this.options.offset = options.offset || { x: 0, y: 0 }; // toast offset - - // Returning the current object for chaining functions - return this; - }, - - // Building the DOM element - buildToast: function() { - // Validating if the options are defined - if (!this.options) { - throw "Toastify is not initialized"; - } - - // Creating the DOM object - var divElement = document.createElement("div"); - divElement.className = "toastify on " + this.options.className; - - // Positioning toast to left or right or center - if (!!this.options.position) { - divElement.className += " toastify-" + this.options.position; - } else { - // To be depreciated in further versions - if (this.options.positionLeft === true) { - divElement.className += " toastify-left"; - console.warn('Property `positionLeft` will be depreciated in further versions. Please use `position` instead.') - } else { - // Default position - divElement.className += " toastify-right"; - } - } - - // Assigning gravity of element - divElement.className += " " + this.options.gravity; - - if (this.options.backgroundColor) { - divElement.style.background = this.options.backgroundColor; - } - - // Adding the toast message/node - if (this.options.node && this.options.node.nodeType === Node.ELEMENT_NODE) { - // If we have a valid node, we insert it - divElement.appendChild(this.options.node) - } else { - divElement.innerHTML = this.options.text; - - if (this.options.avatar !== "") { - var avatarElement = document.createElement("img"); - avatarElement.src = this.options.avatar; - - avatarElement.className = "toastify-avatar"; - - if (this.options.position == "left" || this.options.positionLeft === true) { - // Adding close icon on the left of content - divElement.appendChild(avatarElement); - } else { - // Adding close icon on the right of content - divElement.insertAdjacentElement("afterbegin", avatarElement); - } - } - } +(function (root, factory) { + if (typeof module === "object" && module.exports) { + module.exports = factory(); + } else { + root.Toastify = factory(); + } +})(this, function (global) { + // Object initialization + var Toastify = function (options) { + // Returning a new init object + return new Toastify.lib.init(options); + }, + // Library version + version = "1.9.3"; + + // Defining the prototype of the object + Toastify.lib = Toastify.prototype = { + toastify: version, + + constructor: Toastify, + + // Initializing the object with required parameters + init: function (options) { + // Verifying and validating the input object + if (!options) { + options = {}; + } - // Adding a close icon to the toast - if (this.options.close === true) { - // Create a span for close element - var closeElement = document.createElement("span"); - closeElement.innerHTML = "✖"; + // Creating the options object + this.options = {}; + + this.toastElement = null; + + // Validating the options + this.options.text = options.text || "Hi there!"; // Display message + this.options.node = options.node // Display content as node + this.options.duration = options.duration === 0 ? 0 : options.duration || 3000; // Display duration + this.options.selector = options.selector; // Parent selector + this.options.callback = options.callback || function () { + }; // Callback after display + this.options.destination = options.destination; // On-click destination + this.options.newWindow = options.newWindow || false; // Open destination in new window + this.options.close = options.close || false; // Show toast close icon + this.options.gravity = options.gravity === "bottom" ? "toastify-bottom" : "toastify-top"; // toast position - top or bottom + this.options.positionLeft = options.positionLeft || false; // toast position - left or right + this.options.position = options.position || ''; // toast position - left or right + this.options.backgroundColor = options.backgroundColor; // toast background color + this.options.avatar = options.avatar || ""; // img element src - url or a path + this.options.className = options.className || ""; // additional class names for the toast + this.options.stopOnFocus = options.stopOnFocus === undefined ? true : options.stopOnFocus; // stop timeout on focus + this.options.onClick = options.onClick; // Callback after click + + this.options.offset = options.offset || {x: 0, y: 0}; // toast offset + + // Returning the current object for chaining functions + return this; + }, + + // Building the DOM element + buildToast: function () { + // Validating if the options are defined + if (!this.options) { + throw "Toastify is not initialized"; + } - closeElement.className = "toast-close"; + // Creating the DOM object + var divElement = document.createElement("div"); + divElement.className = "toastify on " + this.options.className; - // Triggering the removal of toast from DOM on close click - closeElement.addEventListener( - "click", - function(event) { - event.stopPropagation(); - this.removeElement(this.toastElement); - window.clearTimeout(this.toastElement.timeOutValue); - }.bind(this) - ); - - //Calculating screen width - var width = window.innerWidth > 0 ? window.innerWidth : screen.width; - - // Adding the close icon to the toast element - // Display on the right if screen width is less than or equal to 360px - if ((this.options.position == "left" || this.options.positionLeft === true) && width > 360) { - // Adding close icon on the left of content - divElement.insertAdjacentElement("afterbegin", closeElement); - } else { - // Adding close icon on the right of content - divElement.appendChild(closeElement); - } - } - - // Clear timeout while toast is focused - if (this.options.stopOnFocus && this.options.duration > 0) { - var self = this; - // stop countdown - divElement.addEventListener( - "mouseover", - function(event) { - window.clearTimeout(divElement.timeOutValue); - } - ) - // add back the timeout - divElement.addEventListener( - "mouseleave", - function() { - divElement.timeOutValue = window.setTimeout( - function() { - // Remove the toast from DOM - self.removeElement(divElement); - }, - self.options.duration - ) - } - ) - } - - // Adding an on-click destination path - if (typeof this.options.destination !== "undefined") { - divElement.addEventListener( - "click", - function(event) { - event.stopPropagation(); - if (this.options.newWindow === true) { - window.open(this.options.destination, "_blank"); + // Positioning toast to left or right or center + if (!!this.options.position) { + divElement.className += " toastify-" + this.options.position; + } else { + // To be depreciated in further versions + if (this.options.positionLeft === true) { + divElement.className += " toastify-left"; + console.warn('Property `positionLeft` will be depreciated in further versions. Please use `position` instead.') + } else { + // Default position + divElement.className += " toastify-right"; + } + } + + // Assigning gravity of element + divElement.className += " " + this.options.gravity; + + if (this.options.backgroundColor) { + divElement.style.background = this.options.backgroundColor; + } + + // Adding the toast message/node + if (this.options.node && this.options.node.nodeType === Node.ELEMENT_NODE) { + // If we have a valid node, we insert it + divElement.appendChild(this.options.node) } else { - window.location = this.options.destination; + divElement.innerHTML = this.options.text; + + if (this.options.avatar !== "") { + var avatarElement = document.createElement("img"); + avatarElement.src = this.options.avatar; + + avatarElement.className = "toastify-avatar"; + + if (this.options.position == "left" || this.options.positionLeft === true) { + // Adding close icon on the left of content + divElement.appendChild(avatarElement); + } else { + // Adding close icon on the right of content + divElement.insertAdjacentElement("afterbegin", avatarElement); + } + } + } + + // Adding a close icon to the toast + if (this.options.close === true) { + // Create a span for close element + var closeElement = document.createElement("span"); + closeElement.innerHTML = "✖"; + + closeElement.className = "toast-close"; + + // Triggering the removal of toast from DOM on close click + closeElement.addEventListener( + "click", + function (event) { + event.stopPropagation(); + this.removeElement(this.toastElement); + window.clearTimeout(this.toastElement.timeOutValue); + }.bind(this) + ); + + //Calculating screen width + var width = window.innerWidth > 0 ? window.innerWidth : screen.width; + + // Adding the close icon to the toast element + // Display on the right if screen width is less than or equal to 360px + if ((this.options.position == "left" || this.options.positionLeft === true) && width > 360) { + // Adding close icon on the left of content + divElement.insertAdjacentElement("afterbegin", closeElement); + } else { + // Adding close icon on the right of content + divElement.appendChild(closeElement); + } + } + + // Clear timeout while toast is focused + if (this.options.stopOnFocus && this.options.duration > 0) { + var self = this; + // stop countdown + divElement.addEventListener( + "mouseover", + function (event) { + window.clearTimeout(divElement.timeOutValue); + } + ) + // add back the timeout + divElement.addEventListener( + "mouseleave", + function () { + divElement.timeOutValue = window.setTimeout( + function () { + // Remove the toast from DOM + self.removeElement(divElement); + }, + self.options.duration + ) + } + ) + } + + // Adding an on-click destination path + if (typeof this.options.destination !== "undefined") { + divElement.addEventListener( + "click", + function (event) { + event.stopPropagation(); + if (this.options.newWindow === true) { + window.open(this.options.destination, "_blank"); + } else { + window.location = this.options.destination; + } + }.bind(this) + ); + } + + if (typeof this.options.onClick === "function" && typeof this.options.destination === "undefined") { + divElement.addEventListener( + "click", + function (event) { + event.stopPropagation(); + this.options.onClick(); + }.bind(this) + ); + } + + // Adding offset + if (typeof this.options.offset === "object") { + + var x = getAxisOffsetAValue("x", this.options); + var y = getAxisOffsetAValue("y", this.options); + + var xOffset = this.options.position == "left" ? x : "-" + x; + var yOffset = this.options.gravity == "toastify-top" ? y : "-" + y; + + divElement.style.transform = "translate(" + xOffset + "," + yOffset + ")"; + + } + + // Returning the generated element + return divElement; + }, + + // Displaying the toast + showToast: function () { + // Creating the DOM object for the toast + this.toastElement = this.buildToast(); + + // Getting the root element to with the toast needs to be added + var rootElement; + if (typeof this.options.selector === "undefined") { + rootElement = document.body; + } else { + rootElement = document.getElementById(this.options.selector); + } + + // Validating if root element is present in DOM + if (!rootElement) { + throw "Root element is not defined"; + } + + // Adding the DOM element + rootElement.insertBefore(this.toastElement, rootElement.firstChild); + + // Repositioning the toasts in case multiple toasts are present + Toastify.reposition(); + + if (this.options.duration > 0) { + this.toastElement.timeOutValue = window.setTimeout( + function () { + // Remove the toast from DOM + this.removeElement(this.toastElement); + }.bind(this), + this.options.duration + ); // Binding `this` for function invocation + } + + // Supporting function chaining + return this; + }, + + hideToast: function () { + if (this.toastElement.timeOutValue) { + clearTimeout(this.toastElement.timeOutValue); } - }.bind(this) - ); - } - - if (typeof this.options.onClick === "function" && typeof this.options.destination === "undefined") { - divElement.addEventListener( - "click", - function(event) { - event.stopPropagation(); - this.options.onClick(); - }.bind(this) - ); - } - - // Adding offset - if(typeof this.options.offset === "object") { - - var x = getAxisOffsetAValue("x", this.options); - var y = getAxisOffsetAValue("y", this.options); - - var xOffset = this.options.position == "left" ? x : "-" + x; - var yOffset = this.options.gravity == "toastify-top" ? y : "-" + y; - - divElement.style.transform = "translate(" + xOffset + "," + yOffset + ")"; - - } - - // Returning the generated element - return divElement; - }, - - // Displaying the toast - showToast: function() { - // Creating the DOM object for the toast - this.toastElement = this.buildToast(); - - // Getting the root element to with the toast needs to be added - var rootElement; - if (typeof this.options.selector === "undefined") { - rootElement = document.body; - } else { - rootElement = document.getElementById(this.options.selector); - } - - // Validating if root element is present in DOM - if (!rootElement) { - throw "Root element is not defined"; - } - - // Adding the DOM element - rootElement.insertBefore(this.toastElement, rootElement.firstChild); - - // Repositioning the toasts in case multiple toasts are present - Toastify.reposition(); - - if (this.options.duration > 0) { - this.toastElement.timeOutValue = window.setTimeout( - function() { - // Remove the toast from DOM this.removeElement(this.toastElement); - }.bind(this), - this.options.duration - ); // Binding `this` for function invocation - } - - // Supporting function chaining - return this; - }, - - hideToast: function() { - if (this.toastElement.timeOutValue) { - clearTimeout(this.toastElement.timeOutValue); - } - this.removeElement(this.toastElement); - }, - - // Removing the element from the DOM - removeElement: function(toastElement) { - // Hiding the element - // toastElement.classList.remove("on"); - toastElement.className = toastElement.className.replace(" on", ""); - - // Removing the element from DOM after transition end - window.setTimeout( - function() { - // remove options node if any - if (this.options.node && this.options.node.parentNode) { - this.options.node.parentNode.removeChild(this.options.node); - } - - // Remove the elemenf from the DOM, only when the parent node was not removed before. - if (toastElement.parentNode) { - toastElement.parentNode.removeChild(toastElement); - } - - // Calling the callback function - this.options.callback.call(toastElement); - - // Repositioning the toasts again - Toastify.reposition(); - }.bind(this), - 400 - ); // Binding `this` for function invocation - }, - }; - - // Positioning the toasts on the DOM - Toastify.reposition = function() { - - // Top margins with gravity - var topLeftOffsetSize = { - top: 15, - bottom: 15, - }; - var topRightOffsetSize = { - top: 15, - bottom: 15, - }; - var offsetSize = { - top: 15, - bottom: 15, + }, + + // Removing the element from the DOM + removeElement: function (toastElement) { + // Hiding the element + // toastElement.classList.remove("on"); + toastElement.className = toastElement.className.replace(" on", ""); + + // Removing the element from DOM after transition end + window.setTimeout( + function () { + // remove options node if any + if (this.options.node && this.options.node.parentNode) { + this.options.node.parentNode.removeChild(this.options.node); + } + + // Remove the elemenf from the DOM, only when the parent node was not removed before. + if (toastElement.parentNode) { + toastElement.parentNode.removeChild(toastElement); + } + + // Calling the callback function + this.options.callback.call(toastElement); + + // Repositioning the toasts again + Toastify.reposition(); + }.bind(this), + 400 + ); // Binding `this` for function invocation + }, }; - // Get all toast messages on the DOM - var allToasts = document.getElementsByClassName("toastify"); + // Positioning the toasts on the DOM + Toastify.reposition = function () { + + // Top margins with gravity + var topLeftOffsetSize = { + top: 15, + bottom: 15, + }; + var topRightOffsetSize = { + top: 15, + bottom: 15, + }; + var offsetSize = { + top: 15, + bottom: 15, + }; + + // Get all toast messages on the DOM + var allToasts = document.getElementsByClassName("toastify"); + + var classUsed; + + // Modifying the position of each toast element + for (var i = 0; i < allToasts.length; i++) { + // Getting the applied gravity + if (containsClass(allToasts[i], "toastify-top") === true) { + classUsed = "toastify-top"; + } else { + classUsed = "toastify-bottom"; + } - var classUsed; + var height = allToasts[i].offsetHeight; + classUsed = classUsed.substr(9, classUsed.length - 1) + // Spacing between toasts + var offset = 15; - // Modifying the position of each toast element - for (var i = 0; i < allToasts.length; i++) { - // Getting the applied gravity - if (containsClass(allToasts[i], "toastify-top") === true) { - classUsed = "toastify-top"; - } else { - classUsed = "toastify-bottom"; - } + var width = window.innerWidth > 0 ? window.innerWidth : screen.width; - var height = allToasts[i].offsetHeight; - classUsed = classUsed.substr(9, classUsed.length-1) - // Spacing between toasts - var offset = 15; + // Show toast in center if screen with less than or qual to 360px + if (width <= 360) { + // Setting the position + allToasts[i].style[classUsed] = offsetSize[classUsed] + "px"; - var width = window.innerWidth > 0 ? window.innerWidth : screen.width; + offsetSize[classUsed] += height + offset; + } else { + if (containsClass(allToasts[i], "toastify-left") === true) { + // Setting the position + allToasts[i].style[classUsed] = topLeftOffsetSize[classUsed] + "px"; - // Show toast in center if screen with less than or qual to 360px - if (width <= 360) { - // Setting the position - allToasts[i].style[classUsed] = offsetSize[classUsed] + "px"; + topLeftOffsetSize[classUsed] += height + offset; + } else { + // Setting the position + allToasts[i].style[classUsed] = topRightOffsetSize[classUsed] + "px"; - offsetSize[classUsed] += height + offset; - } else { - if (containsClass(allToasts[i], "toastify-left") === true) { - // Setting the position - allToasts[i].style[classUsed] = topLeftOffsetSize[classUsed] + "px"; + topRightOffsetSize[classUsed] += height + offset; + } + } + } - topLeftOffsetSize[classUsed] += height + offset; - } else { - // Setting the position - allToasts[i].style[classUsed] = topRightOffsetSize[classUsed] + "px"; + // Supporting function chaining + return this; + }; - topRightOffsetSize[classUsed] += height + offset; - } - } - } + // Helper function to get offset. + function getAxisOffsetAValue(axis, options) { - // Supporting function chaining - return this; - }; + if (options.offset[axis]) { + if (isNaN(options.offset[axis])) { + return options.offset[axis]; + } else { + return options.offset[axis] + 'px'; + } + } - // Helper function to get offset. - function getAxisOffsetAValue(axis, options) { + return '0px'; - if(options.offset[axis]) { - if(isNaN(options.offset[axis])) { - return options.offset[axis]; - } - else { - return options.offset[axis] + 'px'; - } } - return '0px'; - - } - - function containsClass(elem, yourClass) { - if (!elem || typeof yourClass !== "string") { - return false; - } else if ( - elem.className && - elem.className - .trim() - .split(/\s+/gi) - .indexOf(yourClass) > -1 - ) { - return true; - } else { - return false; + function containsClass(elem, yourClass) { + if (!elem || typeof yourClass !== "string") { + return false; + } else if ( + elem.className && + elem.className + .trim() + .split(/\s+/gi) + .indexOf(yourClass) > -1 + ) { + return true; + } else { + return false; + } } - } - // Setting up the prototype for the init object - Toastify.lib.init.prototype = Toastify.lib; + // Setting up the prototype for the init object + Toastify.lib.init.prototype = Toastify.lib; - // Returning the Toastify function to be assigned to the window object/module - return Toastify; -}); + // Returning the Toastify function to be assigned to the window object/module + return Toastify; +}); \ No newline at end of file diff --git a/ToastNotification.Notyf/Controllers/HomeController.cs b/ToastNotification.Notyf/Controllers/HomeController.cs index 7fe6df6..1549c5b 100644 --- a/ToastNotification.Notyf/Controllers/HomeController.cs +++ b/ToastNotification.Notyf/Controllers/HomeController.cs @@ -1,11 +1,7 @@ using AspNetCoreHero.ToastNotification.Abstractions; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; -using System.Threading.Tasks; using ToastNotification.Notyf.Models; namespace ToastNotification.Notyf.Controllers diff --git a/ToastNotification.Notyf/Models/ErrorViewModel.cs b/ToastNotification.Notyf/Models/ErrorViewModel.cs index 56ff46d..0c1c27e 100644 --- a/ToastNotification.Notyf/Models/ErrorViewModel.cs +++ b/ToastNotification.Notyf/Models/ErrorViewModel.cs @@ -1,5 +1,3 @@ -using System; - namespace ToastNotification.Notyf.Models { public class ErrorViewModel diff --git a/ToastNotification.Notyf/Program.cs b/ToastNotification.Notyf/Program.cs index d46148f..e4b71e6 100644 --- a/ToastNotification.Notyf/Program.cs +++ b/ToastNotification.Notyf/Program.cs @@ -1,11 +1,5 @@ using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; namespace ToastNotification.Notyf { diff --git a/ToastNotification.Notyf/Startup.cs b/ToastNotification.Notyf/Startup.cs index 870fbb8..2cf017e 100644 --- a/ToastNotification.Notyf/Startup.cs +++ b/ToastNotification.Notyf/Startup.cs @@ -1,14 +1,9 @@ using AspNetCoreHero.ToastNotification; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; namespace ToastNotification.Notyf { diff --git a/ToastNotification.Toastify/Pages/Error.cshtml.cs b/ToastNotification.Toastify/Pages/Error.cshtml.cs index 7214203..a819266 100644 --- a/ToastNotification.Toastify/Pages/Error.cshtml.cs +++ b/ToastNotification.Toastify/Pages/Error.cshtml.cs @@ -1,11 +1,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; -using System.Threading.Tasks; namespace ToastNotification.Toastify.Pages { diff --git a/ToastNotification.Toastify/Pages/Privacy.cshtml.cs b/ToastNotification.Toastify/Pages/Privacy.cshtml.cs index 4ee1bbf..567534d 100644 --- a/ToastNotification.Toastify/Pages/Privacy.cshtml.cs +++ b/ToastNotification.Toastify/Pages/Privacy.cshtml.cs @@ -1,10 +1,5 @@ -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; namespace ToastNotification.Toastify.Pages { diff --git a/ToastNotification.Toastify/Program.cs b/ToastNotification.Toastify/Program.cs index 6dd1387..60fc234 100644 --- a/ToastNotification.Toastify/Program.cs +++ b/ToastNotification.Toastify/Program.cs @@ -1,11 +1,5 @@ using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; namespace ToastNotification.Toastify { From fc1d40538dc54074f86dc6fac6319bee357e8a63 Mon Sep 17 00:00:00 2001 From: Artem Konkin Date: Thu, 8 Feb 2024 16:18:41 +0600 Subject: [PATCH 2/3] Added the ability to specify the need to sign inline js code using the Hash amount received in the response from the server. Added ability to sign js code with nonce attribute. --- .../Middlewares/NotyfMiddleware.cs | 4 +++- AspNetCoreHero.ToastNotification/Notyf/Models/NotyfEntity.cs | 4 +++- AspNetCoreHero.ToastNotification/Notyf/NotyfViewModel.cs | 1 + .../Views/Shared/Components/Notyf/Default.cshtml | 4 ++-- .../Views/Shared/Components/Notyf/NotyfViewComponent.cs | 1 + .../Views/Shared/Components/Toastify/Default.cshtml | 2 ++ 6 files changed, 12 insertions(+), 4 deletions(-) diff --git a/AspNetCoreHero.ToastNotification/Middlewares/NotyfMiddleware.cs b/AspNetCoreHero.ToastNotification/Middlewares/NotyfMiddleware.cs index b81626f..b83c873 100644 --- a/AspNetCoreHero.ToastNotification/Middlewares/NotyfMiddleware.cs +++ b/AspNetCoreHero.ToastNotification/Middlewares/NotyfMiddleware.cs @@ -37,8 +37,10 @@ private Task Callback(object context) var messages = new NotyfViewModel { Configuration = _options.ToJson(), + isCspSecure = _options.cspSecure, Notifications = _toastNotification.ReadAllNotifications() }; + if (messages.Notifications != null && messages.Notifications.Any()) { var accessControlExposeHeaders = $"{GetControlExposeHeaders(httpContext.Response.Headers)}"; @@ -65,4 +67,4 @@ private object GetControlExposeHeaders(IHeaderDictionary headers) } } } -} +} \ No newline at end of file diff --git a/AspNetCoreHero.ToastNotification/Notyf/Models/NotyfEntity.cs b/AspNetCoreHero.ToastNotification/Notyf/Models/NotyfEntity.cs index f751bec..79f259e 100644 --- a/AspNetCoreHero.ToastNotification/Notyf/Models/NotyfEntity.cs +++ b/AspNetCoreHero.ToastNotification/Notyf/Models/NotyfEntity.cs @@ -5,11 +5,12 @@ namespace AspNetCoreHero.ToastNotification.Notyf.Models { public class NotyfEntity { - public NotyfEntity(int durationInSeconds = 5, NotyfPosition toastPosition = NotyfPosition.BottomRight, bool isDismissible = true) + public NotyfEntity(int durationInSeconds = 5, NotyfPosition toastPosition = NotyfPosition.BottomRight, bool isDismissible = true, bool isCspSecure = false) { duration = durationInSeconds > 0 ? durationInSeconds * 1000 : 5000; dismissible = isDismissible; ripple = true; + cspSecure = isCspSecure; try { string description = ToDescriptionString(toastPosition); @@ -73,6 +74,7 @@ public NotyfEntity(int durationInSeconds = 5, NotyfPosition toastPosition = Noty public int duration { get; set; } public Position position { get; set; } public bool dismissible { get; set; } = true; + public bool cspSecure { get; set; } = false; public bool ripple { get; set; } = true; public List types { get; set; } private static string ToDescriptionString(NotyfPosition val) diff --git a/AspNetCoreHero.ToastNotification/Notyf/NotyfViewModel.cs b/AspNetCoreHero.ToastNotification/Notyf/NotyfViewModel.cs index 5b29b14..2df5033 100644 --- a/AspNetCoreHero.ToastNotification/Notyf/NotyfViewModel.cs +++ b/AspNetCoreHero.ToastNotification/Notyf/NotyfViewModel.cs @@ -6,6 +6,7 @@ namespace AspNetCoreHero.ToastNotification.Notyf public class NotyfViewModel { public string Configuration { get; set; } + public bool isCspSecure { get; set; } public IEnumerable Notifications { get; set; } } } \ No newline at end of file diff --git a/AspNetCoreHero.ToastNotification/Views/Shared/Components/Notyf/Default.cshtml b/AspNetCoreHero.ToastNotification/Views/Shared/Components/Notyf/Default.cshtml index 3fd9ac0..edc73cf 100644 --- a/AspNetCoreHero.ToastNotification/Views/Shared/Components/Notyf/Default.cshtml +++ b/AspNetCoreHero.ToastNotification/Views/Shared/Components/Notyf/Default.cshtml @@ -6,7 +6,7 @@ - @@ -55,7 +55,7 @@ } } - + @{ @if (Model.Notifications != null) { From 753db0beabc711caedc25cc84a6bd07e36084f79 Mon Sep 17 00:00:00 2001 From: Artem Konkin Date: Thu, 8 Feb 2024 16:27:01 +0600 Subject: [PATCH 3/3] CspSecure option from configuration --- .../Extensions/ServiceCollectionExtensions.cs | 8 ++++---- .../Notyf/Models/NotyfConfig.cs | 3 ++- ToastNotification.Notyf/Startup.cs | 10 ++++++++-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/AspNetCoreHero.ToastNotification/Extensions/ServiceCollectionExtensions.cs b/AspNetCoreHero.ToastNotification/Extensions/ServiceCollectionExtensions.cs index 696ed4c..2bd10bc 100644 --- a/AspNetCoreHero.ToastNotification/Extensions/ServiceCollectionExtensions.cs +++ b/AspNetCoreHero.ToastNotification/Extensions/ServiceCollectionExtensions.cs @@ -32,7 +32,7 @@ public static void AddToastify(this IServiceCollection services, Action(); services.AddSingleton(toastify); - + } private static void AddFrameworkServices(this IServiceCollection services) { @@ -57,7 +57,7 @@ public static void AddNotyf(this IServiceCollection services, Action(); services.AddSingleton(options); - + } } -} +} \ No newline at end of file diff --git a/AspNetCoreHero.ToastNotification/Notyf/Models/NotyfConfig.cs b/AspNetCoreHero.ToastNotification/Notyf/Models/NotyfConfig.cs index 656ce9c..cb12aca 100644 --- a/AspNetCoreHero.ToastNotification/Notyf/Models/NotyfConfig.cs +++ b/AspNetCoreHero.ToastNotification/Notyf/Models/NotyfConfig.cs @@ -5,6 +5,7 @@ public class NotyfConfig public int DurationInSeconds { get; set; } public NotyfPosition Position { get; set; } = NotyfPosition.BottomRight; public bool IsDismissable { get; set; } = false; + public bool IsCspSecure { get; set; } = false; public bool HasRippleEffect { get; set; } = true; } -} +} \ No newline at end of file diff --git a/ToastNotification.Notyf/Startup.cs b/ToastNotification.Notyf/Startup.cs index 2cf017e..6426fa7 100644 --- a/ToastNotification.Notyf/Startup.cs +++ b/ToastNotification.Notyf/Startup.cs @@ -19,7 +19,13 @@ public Startup(IConfiguration configuration) // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { -services.AddNotyf(config=> { config.DurationInSeconds = 10;config.IsDismissable = true;config.Position = NotyfPosition.BottomRight; }); + services.AddNotyf(config => + { + config.DurationInSeconds = 10; + config.IsDismissable = true; + config.Position = NotyfPosition.BottomRight; + config.IsCspSecure = false; + }); services.AddControllersWithViews(); } @@ -51,4 +57,4 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) }); } } -} +} \ No newline at end of file