add penalties for angle info
queue Tell/Say to prevent plugins from throwing exception when server is offlline fixed CPU usage issue over time sort penalties by type on webfront
This commit is contained in:
parent
f442f251f6
commit
3092a529e9
@ -23,7 +23,7 @@ namespace Application.RconParsers
|
|||||||
TempBan = "tempbanclient {0} \"{1}\""
|
TempBan = "tempbanclient {0} \"{1}\""
|
||||||
};
|
};
|
||||||
|
|
||||||
private static string StatusRegex = @"^( *[0-9]+) +([0-9]+) +((?:[A-Z]+|[0-9]+)) +((?:[a-z]|[0-9]){16}|bot[0-9]+) +(.{0,20}) +([0-9]+) +(\d+\.\d+\.\d+.\d+\:\d{1,5}|0+.0+:\d{1,5}) +(-*[0-9]+) +([0-9]+) *$";
|
private static string StatusRegex = @"^( *[0-9]+) +([0-9]+) +((?:[A-Z]+|[0-9]+)) +((?:[a-z]|[0-9]){16}|bot[0-9]+) +(.{0,20}) +([0-9]+) +(\d+\.\d+\.\d+.\d+\:-*\d{1,5}|0+.0+:-*\d{1,5}) +(-*[0-9]+) +([0-9]+) *$";
|
||||||
|
|
||||||
public async Task<string[]> ExecuteCommandAsync(Connection connection, string command)
|
public async Task<string[]> ExecuteCommandAsync(Connection connection, string command)
|
||||||
{
|
{
|
||||||
|
@ -559,6 +559,17 @@ namespace IW4MAdmin
|
|||||||
Logger.WriteInfo("Game ending...");
|
Logger.WriteInfo("Game ending...");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (E.Type == GameEvent.EventType.Tell)
|
||||||
|
{
|
||||||
|
await Tell(E.Message, E.Target);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (E.Type == GameEvent.EventType.Broadcast)
|
||||||
|
{
|
||||||
|
// this is a little ugly but I don't want to change the abstract class
|
||||||
|
await E.Owner.ExecuteCommandAsync(E.Message);
|
||||||
|
}
|
||||||
|
|
||||||
//todo: move
|
//todo: move
|
||||||
while (ChatHistory.Count > Math.Ceiling((double)ClientNum / 2))
|
while (ChatHistory.Count > Math.Ceiling((double)ClientNum / 2))
|
||||||
ChatHistory.RemoveAt(0);
|
ChatHistory.RemoveAt(0);
|
||||||
|
@ -75,22 +75,7 @@ namespace IW4MAdmin.Plugins.Stats.Cheat
|
|||||||
Kills++;
|
Kills++;
|
||||||
AverageKillTime = (AverageKillTime + (DateTime.UtcNow - LastKill).TotalSeconds) / Kills;
|
AverageKillTime = (AverageKillTime + (DateTime.UtcNow - LastKill).TotalSeconds) / Kills;
|
||||||
|
|
||||||
#region SNAPSHOTS
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region VIEWANGLES
|
#region VIEWANGLES
|
||||||
/*double distance = Vector3.Distance(kill.KillOrigin, kill.DeathOrigin);
|
|
||||||
double x = kill.KillOrigin.X + distance * Math.Cos(kill.ViewAngles.X.ToRadians()) * Math.Cos(kill.ViewAngles.Y.ToRadians());
|
|
||||||
double y = kill.KillOrigin.Y + (distance * Math.Sin(kill.ViewAngles.X.ToRadians()) * Math.Cos(kill.ViewAngles.Y.ToRadians()));
|
|
||||||
double z = kill.KillOrigin.Z + distance * Math.Sin((360.0f - kill.ViewAngles.Y).ToRadians());
|
|
||||||
var trueVector = Vector3.Subtract(kill.KillOrigin, kill.DeathOrigin);
|
|
||||||
var calculatedVector = Vector3.Subtract(kill.KillOrigin, new Vector3((float)x, (float)y, (float)z));
|
|
||||||
double angle = trueVector.AngleBetween(calculatedVector);*/
|
|
||||||
|
|
||||||
|
|
||||||
// make sure it's divisible by 2
|
// make sure it's divisible by 2
|
||||||
if (kill.AnglesList.Count % 2 == 0)
|
if (kill.AnglesList.Count % 2 == 0)
|
||||||
{
|
{
|
||||||
@ -127,6 +112,22 @@ namespace IW4MAdmin.Plugins.Stats.Cheat
|
|||||||
hitLoc.HitOffsetAverage = 0f;
|
hitLoc.HitOffsetAverage = 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var hitlocations = ClientStats.HitLocations
|
||||||
|
.Where(hl => new List<int>() { 4, 5, 2, 3, }.Contains((int)hl.Location))
|
||||||
|
.Where(hl => ClientStats.SessionKills > Thresholds.MediumSampleMinKills + 30);
|
||||||
|
|
||||||
|
double banAverage = hitlocations.Count() > 0 ? hitlocations.Average(c =>c.HitOffsetAverage) : 0;
|
||||||
|
|
||||||
|
if (banAverage > Thresholds.MaxOffset)
|
||||||
|
{
|
||||||
|
return new DetectionPenaltyResult()
|
||||||
|
{
|
||||||
|
ClientPenalty = Penalty.PenaltyType.Ban,
|
||||||
|
RatioAmount = banAverage,
|
||||||
|
KillCount = ClientStats.SessionKills,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
Log.WriteDebug($"MaxDistance={maxDistance}, PredictVsReal={realAgainstPredict}");
|
Log.WriteDebug($"MaxDistance={maxDistance}, PredictVsReal={realAgainstPredict}");
|
||||||
#endif
|
#endif
|
||||||
@ -137,28 +138,21 @@ namespace IW4MAdmin.Plugins.Stats.Cheat
|
|||||||
if (currentStrain > ClientStats.MaxStrain)
|
if (currentStrain > ClientStats.MaxStrain)
|
||||||
{
|
{
|
||||||
ClientStats.MaxStrain = currentStrain;
|
ClientStats.MaxStrain = currentStrain;
|
||||||
|
|
||||||
|
if (ClientStats.MaxStrain > Thresholds.MaxStrain)
|
||||||
|
{
|
||||||
|
return new DetectionPenaltyResult()
|
||||||
|
{
|
||||||
|
ClientPenalty = Penalty.PenaltyType.Ban,
|
||||||
|
RatioAmount = ClientStats.MaxStrain,
|
||||||
|
KillCount = ClientStats.SessionKills,
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
Log.WriteDebug($"Current Strain: {currentStrain}");
|
Log.WriteDebug($"Current Strain: {currentStrain}");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*if (kill.AdsPercent > 0.5 && kill.Distance > 3)
|
|
||||||
{
|
|
||||||
var hitLoc = ClientStats.HitLocations
|
|
||||||
.First(hl => hl.Location == kill.HitLoc);
|
|
||||||
float previousAverage = hitLoc.HitOffsetAverage;
|
|
||||||
double newAverage = (previousAverage * (hitLoc.HitCount - 1) + angle) / hitLoc.HitCount;
|
|
||||||
hitLoc.HitOffsetAverage = (float)newAverage;
|
|
||||||
|
|
||||||
if (double.IsNaN(hitLoc.HitOffsetAverage))
|
|
||||||
{
|
|
||||||
Log.WriteWarning("[Detection::ProcessKill] HitOffsetAvgerage NaN");
|
|
||||||
Log.WriteDebug($"{previousAverage}-{hitLoc.HitCount}-{hitLoc}-{newAverage}");
|
|
||||||
hitLoc.HitOffsetAverage = 0f;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
LastKill = kill.When;
|
LastKill = kill.When;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -31,6 +31,9 @@ namespace IW4MAdmin.Plugins.Stats.Cheat
|
|||||||
public const int HighSampleMinKills = 100;
|
public const int HighSampleMinKills = 100;
|
||||||
public const double KillTimeThreshold = 0.2;
|
public const double KillTimeThreshold = 0.2;
|
||||||
|
|
||||||
|
public const double MaxStrain = 0.4399;
|
||||||
|
public const double MaxOffset = 4.789;
|
||||||
|
|
||||||
public static double GetMarginOfError(int numKills) => 1.6455 / Math.Sqrt(numKills);
|
public static double GetMarginOfError(int numKills) => 1.6455 / Math.Sqrt(numKills);
|
||||||
|
|
||||||
public static double Lerp(double v1, double v2, double amount)
|
public static double Lerp(double v1, double v2, double amount)
|
||||||
|
@ -619,6 +619,10 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
|
|
||||||
Log.WriteDebug("Syncing servers");
|
Log.WriteDebug("Syncing servers");
|
||||||
await statsSvc.ServerSvc.SaveChangesAsync();
|
await statsSvc.ServerSvc.SaveChangesAsync();
|
||||||
|
|
||||||
|
statsSvc = null;
|
||||||
|
// this should prevent the gunk for having a long lasting context.
|
||||||
|
ContextThreads[serverId] = new ThreadSafeStatsService();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,16 @@ namespace SharedLibraryCore.Objects
|
|||||||
|
|
||||||
public async Task Tell(String Message)
|
public async Task Tell(String Message)
|
||||||
{
|
{
|
||||||
await CurrentServer.Tell(Message, this);
|
var e = new GameEvent()
|
||||||
|
{
|
||||||
|
Message = Message,
|
||||||
|
Target = this,
|
||||||
|
Owner = CurrentServer,
|
||||||
|
Type = GameEvent.EventType.Tell,
|
||||||
|
Data = Message
|
||||||
|
};
|
||||||
|
|
||||||
|
CurrentServer.Manager.GetEventHandler().AddEvent(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Kick(String Message, Player Sender)
|
public async Task Kick(String Message, Player Sender)
|
||||||
|
@ -127,6 +127,16 @@ namespace SharedLibraryCore
|
|||||||
{
|
{
|
||||||
#if !DEBUG
|
#if !DEBUG
|
||||||
string formattedMessage = String.Format(RconParser.GetCommandPrefixes().Say, Message);
|
string formattedMessage = String.Format(RconParser.GetCommandPrefixes().Say, Message);
|
||||||
|
|
||||||
|
var e = new GameEvent()
|
||||||
|
{
|
||||||
|
Message = formattedMessage,
|
||||||
|
Data = formattedMessage,
|
||||||
|
Owner = this,
|
||||||
|
Type = GameEvent.EventType.Broadcast,
|
||||||
|
};
|
||||||
|
|
||||||
|
Manager.GetEventHandler().AddEvent(e);
|
||||||
await this.ExecuteCommandAsync(formattedMessage);
|
await this.ExecuteCommandAsync(formattedMessage);
|
||||||
#else
|
#else
|
||||||
Logger.WriteVerbose(Message.StripColors());
|
Logger.WriteVerbose(Message.StripColors());
|
||||||
@ -141,7 +151,6 @@ namespace SharedLibraryCore
|
|||||||
/// <param name="Target">Player to send message to</param>
|
/// <param name="Target">Player to send message to</param>
|
||||||
public async Task Tell(String Message, Player Target)
|
public async Task Tell(String Message, Player Target)
|
||||||
{
|
{
|
||||||
|
|
||||||
#if !DEBUG
|
#if !DEBUG
|
||||||
string formattedMessage = String.Format(RconParser.GetCommandPrefixes().Tell, Target.ClientNumber, Message);
|
string formattedMessage = String.Format(RconParser.GetCommandPrefixes().Tell, Target.ClientNumber, Message);
|
||||||
if (Target.ClientNumber > -1 && Message.Length > 0 && Target.Level != Player.Permission.Console)
|
if (Target.ClientNumber > -1 && Message.Length > 0 && Target.Level != Player.Permission.Console)
|
||||||
|
@ -98,13 +98,14 @@ namespace SharedLibraryCore.Services
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IList<EFPenalty>> GetRecentPenalties(int count, int offset)
|
public async Task<IList<EFPenalty>> GetRecentPenalties(int count, int offset, Penalty.PenaltyType showOnly = Penalty.PenaltyType.Any)
|
||||||
{
|
{
|
||||||
using (var context = new DatabaseContext())
|
using (var context = new DatabaseContext())
|
||||||
return await context.Penalties
|
return await context.Penalties
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.Include(p => p.Offender.CurrentAlias)
|
.Include(p => p.Offender.CurrentAlias)
|
||||||
.Include(p => p.Punisher.CurrentAlias)
|
.Include(p => p.Punisher.CurrentAlias)
|
||||||
|
.Where(p => showOnly == Penalty.PenaltyType.Any ? p.Type != Penalty.PenaltyType.Any : p.Type == showOnly)
|
||||||
.Where(p => p.Active)
|
.Where(p => p.Active)
|
||||||
.OrderByDescending(p => p.When)
|
.OrderByDescending(p => p.When)
|
||||||
.Skip(offset)
|
.Skip(offset)
|
||||||
|
@ -13,18 +13,22 @@ namespace WebfrontCore.Controllers
|
|||||||
{
|
{
|
||||||
public class PenaltyController : BaseController
|
public class PenaltyController : BaseController
|
||||||
{
|
{
|
||||||
public IActionResult List()
|
public IActionResult List(int showOnly = (int)SharedLibraryCore.Objects.Penalty.PenaltyType.Any)
|
||||||
{
|
{
|
||||||
ViewBag.Description = "List of all the recent penalties (bans, kicks, warnings) on IW4MAdmin";
|
ViewBag.Description = "List of all the recent penalties (bans, kicks, warnings) on IW4MAdmin";
|
||||||
ViewBag.Title = "Client Penalties";
|
ViewBag.Title = "Client Penalties";
|
||||||
ViewBag.Keywords = "IW4MAdmin, penalties, ban, kick, warns";
|
ViewBag.Keywords = "IW4MAdmin, penalties, ban, kick, warns";
|
||||||
|
|
||||||
return View();
|
return View((SharedLibraryCore.Objects.Penalty.PenaltyType)showOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IActionResult> ListAsync(int offset = 0)
|
public async Task<IActionResult> ListAsync(int offset = 0, int showOnly = (int)SharedLibraryCore.Objects.Penalty.PenaltyType.Any)
|
||||||
{
|
{
|
||||||
return await Task.FromResult(View("_List", offset));
|
return await Task.FromResult(View("_List", new ViewModels.PenaltyFilterInfo()
|
||||||
|
{
|
||||||
|
Offset = offset,
|
||||||
|
ShowOnly = (SharedLibraryCore.Objects.Penalty.PenaltyType)showOnly
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IActionResult> PublicAsync()
|
public async Task<IActionResult> PublicAsync()
|
||||||
|
@ -10,9 +10,9 @@ namespace WebfrontCore.ViewComponents
|
|||||||
{
|
{
|
||||||
public class PenaltyListViewComponent : ViewComponent
|
public class PenaltyListViewComponent : ViewComponent
|
||||||
{
|
{
|
||||||
public async Task<IViewComponentResult> InvokeAsync(int offset)
|
public async Task<IViewComponentResult> InvokeAsync(int offset, Penalty.PenaltyType showOnly)
|
||||||
{
|
{
|
||||||
var penalties = await Program.Manager.GetPenaltyService().GetRecentPenalties(12, offset);
|
var penalties = await Program.Manager.GetPenaltyService().GetRecentPenalties(12, offset, showOnly);
|
||||||
var penaltiesDto = penalties.Select(p => new PenaltyInfo()
|
var penaltiesDto = penalties.Select(p => new PenaltyInfo()
|
||||||
{
|
{
|
||||||
OffenderId = p.OffenderId,
|
OffenderId = p.OffenderId,
|
||||||
|
13
WebfrontCore/ViewModels/PenaltyFilterInfo.cs
Normal file
13
WebfrontCore/ViewModels/PenaltyFilterInfo.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace WebfrontCore.ViewModels
|
||||||
|
{
|
||||||
|
public class PenaltyFilterInfo
|
||||||
|
{
|
||||||
|
public int Offset { get; set; }
|
||||||
|
public SharedLibraryCore.Objects.Penalty.PenaltyType ShowOnly { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,37 @@
|
|||||||
<h4 class="pb-2 text-center ">@ViewBag.Title</h4>
|
@model SharedLibraryCore.Objects.Penalty.PenaltyType
|
||||||
|
|
||||||
|
<h4 class="pb-2 text-center ">@ViewBag.Title</h4>
|
||||||
|
<div class="row">
|
||||||
|
<select class="form-control bg-dark text-muted" id="penalty_filter_selection">
|
||||||
|
@{
|
||||||
|
foreach (var penaltyType in Enum.GetValues(typeof(SharedLibraryCore.Objects.Penalty.PenaltyType)))
|
||||||
|
{
|
||||||
|
if ((SharedLibraryCore.Objects.Penalty.PenaltyType)penaltyType == SharedLibraryCore.Objects.Penalty.PenaltyType.Any)
|
||||||
|
{
|
||||||
|
if (Model == SharedLibraryCore.Objects.Penalty.PenaltyType.Any)
|
||||||
|
{
|
||||||
|
<option value="@Convert.ToInt32(penaltyType)" selected="selected" )>Show @penaltyType.ToString()</option>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<option value="@Convert.ToInt32(penaltyType)" )>Show @penaltyType.ToString()</option>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((SharedLibraryCore.Objects.Penalty.PenaltyType)penaltyType == Model)
|
||||||
|
{
|
||||||
|
<option value="@Convert.ToInt32(penaltyType)" selected="selected">Show only @penaltyType.ToString()s</option>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<option value="@Convert.ToInt32(penaltyType)" )>Show only @penaltyType.ToString()s</option>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<table class="table table-striped">
|
<table class="table table-striped">
|
||||||
<thead class="d-none d-md-table-header-group">
|
<thead class="d-none d-md-table-header-group">
|
||||||
@ -11,7 +44,11 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody id="penalty_table" class="border-bottom bg-dark">
|
<tbody id="penalty_table" class="border-bottom bg-dark">
|
||||||
@await Component.InvokeAsync("PenaltyList", new { offset = 0 })
|
@await Component.InvokeAsync("PenaltyList", new WebfrontCore.ViewModels.PenaltyFilterInfo()
|
||||||
|
{
|
||||||
|
Offset = 0,
|
||||||
|
ShowOnly = Model
|
||||||
|
})
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<table class="table d-table d-md-none">
|
<table class="table d-table d-md-none">
|
||||||
|
@ -2,6 +2,6 @@
|
|||||||
Layout = null;
|
Layout = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@model int
|
@model WebfrontCore.ViewModels.PenaltyFilterInfo
|
||||||
|
|
||||||
@await Component.InvokeAsync("PenaltyList", new { offset = Model })
|
@await Component.InvokeAsync("PenaltyList", new { offset = Model.Offset, showOnly = Model.ShowOnly })
|
@ -2,14 +2,14 @@
|
|||||||
"name": "asp.net",
|
"name": "asp.net",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bootstrap": "v4.1.0",
|
"bootstrap": "v4.1.1",
|
||||||
"jquery": "3.3.1",
|
"jquery": "3.3.1",
|
||||||
"popper.js": "v1.12.9",
|
"popper.js": "v1.12.9",
|
||||||
"open-iconic": "1.1.1",
|
"open-iconic": "1.1.1",
|
||||||
"moment-timezone": "0.5.14"
|
"moment-timezone": "0.5.14"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"bootstrap": "v4.1.0",
|
"bootstrap": "v4.1.1",
|
||||||
"jquery": "3.3.1"
|
"jquery": "3.3.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
39
WebfrontCore/wwwroot/css/bootstrap-custom.scss
vendored
39
WebfrontCore/wwwroot/css/bootstrap-custom.scss
vendored
@ -1,4 +1,32 @@
|
|||||||
@import '../lib/bootstrap/scss/bootstrap.scss';
|
$white: #fff !default;
|
||||||
|
$blue: #007ACC !default;
|
||||||
|
$red: rgba(255, 69, 69, 0.85) !default;
|
||||||
|
$green: rgba(116,147,99, 1) !default;
|
||||||
|
$orange: #fd7e14 !default;
|
||||||
|
$primary: $blue !default;
|
||||||
|
$secondary: $orange !default;
|
||||||
|
$light: rgb(204, 204, 204) !default;
|
||||||
|
$dark: rgb(24, 24, 24) !default;
|
||||||
|
$body-bg: rgb(34,34,34) !default;
|
||||||
|
$body-color: $white !default;
|
||||||
|
$link-color: $white !default;
|
||||||
|
$link-decoration: none !default;
|
||||||
|
$link-hover-color: $primary !default;
|
||||||
|
$link-hover-decoration: none !default;
|
||||||
|
$font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Open Sans", "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default;
|
||||||
|
|
||||||
|
$navbar-padding-y: 0 !default;
|
||||||
|
$navbar-nav-link-padding-x: 2rem !default;
|
||||||
|
$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`
|
||||||
|
$h5-font-size: $font-size-base * 1.25 !default;
|
||||||
|
$h1-font-size: $font-size-base * 2.5 !default;
|
||||||
|
$navbar-brand-font-size: $h1-font-size !default;
|
||||||
|
$navbar-toggler-font-size: $h5-font-size !default;
|
||||||
|
|
||||||
|
$navbar-dark-hover-color: $primary !default;
|
||||||
|
|
||||||
|
@import '../lib/bootstrap/scss/bootstrap.scss';
|
||||||
|
|
||||||
|
|
||||||
/*custom variables*/
|
/*custom variables*/
|
||||||
|
|
||||||
@ -83,10 +111,17 @@ a.link-inverse:hover {
|
|||||||
border-bottom-color: $orange;
|
border-bottom-color: $orange;
|
||||||
}
|
}
|
||||||
|
|
||||||
form * {
|
form *, select {
|
||||||
border-radius: 0 !important;
|
border-radius: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
border-left: none !important;
|
||||||
|
border-right: none !important;
|
||||||
|
border-bottom: none !important;
|
||||||
|
border-top: 2px solid rgba(0, 122, 204, 0.5) !important;
|
||||||
|
}
|
||||||
|
|
||||||
.oi-fix-navbar {
|
.oi-fix-navbar {
|
||||||
line-height: 1.5 !important;
|
line-height: 1.5 !important;
|
||||||
top: 0 !important;
|
top: 0 !important;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
function showLoader() {
|
function showLoader() {
|
||||||
$('.layout-loading-icon').attr('style', 'visibility:visible');
|
$('.layout-loading-icon').attr('style', 'visibility:visible');
|
||||||
$('.layout-loading-icon').removeClass('text-danger');
|
$('.layout-loading-icon').removeClass('text-danger');
|
||||||
|
$('.layout-loading-icon').removeClass('text-muted');
|
||||||
$('.layout-loading-icon').fadeIn();
|
$('.layout-loading-icon').fadeIn();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12,6 +13,10 @@ function errorLoader() {
|
|||||||
$('.layout-loading-icon').addClass('text-danger');
|
$('.layout-loading-icon').addClass('text-danger');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function staleLoader() {
|
||||||
|
$('.layout-loading-icon').addClass('text-muted');
|
||||||
|
}
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
hideLoader();
|
hideLoader();
|
||||||
|
|
||||||
|
@ -8,9 +8,12 @@ function loadMorePenalties() {
|
|||||||
|
|
||||||
showLoader();
|
showLoader();
|
||||||
isLoading = true;
|
isLoading = true;
|
||||||
$.get('/Penalty/ListAsync', { offset: offset })
|
$.get('/Penalty/ListAsync', { offset: offset, showOnly : $('#penalty_filter_selection').val() })
|
||||||
.done(function (response) {
|
.done(function (response) {
|
||||||
$('#penalty_table').append(response);
|
$('#penalty_table').append(response);
|
||||||
|
if (response.trim().length === 0) {
|
||||||
|
staleLoader();
|
||||||
|
}
|
||||||
hideLoader();
|
hideLoader();
|
||||||
isLoading = false;
|
isLoading = false;
|
||||||
})
|
})
|
||||||
@ -22,6 +25,12 @@ function loadMorePenalties() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($('#penalty_table').length === 1) {
|
if ($('#penalty_table').length === 1) {
|
||||||
|
|
||||||
|
$('#penalty_filter_selection').change(function() {
|
||||||
|
// if (offset === 0) {
|
||||||
|
location = location.href.split('?')[0] + "?showOnly=" + $('#penalty_filter_selection').val();
|
||||||
|
// }
|
||||||
|
});
|
||||||
/*
|
/*
|
||||||
https://stackoverflow.com/questions/19731730/jquery-js-detect-users-scroll-attempt-without-any-window-overflow-to-scroll
|
https://stackoverflow.com/questions/19731730/jquery-js-detect-users-scroll-attempt-without-any-window-overflow-to-scroll
|
||||||
*/
|
*/
|
||||||
|
@ -22,33 +22,66 @@ $gray-900: #212529 !default;
|
|||||||
$black: #000 !default;
|
$black: #000 !default;
|
||||||
|
|
||||||
$grays: () !default;
|
$grays: () !default;
|
||||||
$grays: map-merge(( "100": $gray-100, "200": $gray-200, "300": $gray-300, "400": $gray-400, "500": $gray-500, "600": $gray-600, "700": $gray-700, "800": $gray-800, "900": $gray-900 ), $grays);
|
$grays: map-merge((
|
||||||
|
"100": $gray-100,
|
||||||
|
"200": $gray-200,
|
||||||
|
"300": $gray-300,
|
||||||
|
"400": $gray-400,
|
||||||
|
"500": $gray-500,
|
||||||
|
"600": $gray-600,
|
||||||
|
"700": $gray-700,
|
||||||
|
"800": $gray-800,
|
||||||
|
"900": $gray-900
|
||||||
|
), $grays);
|
||||||
|
|
||||||
$blue: #007ACC !default;
|
$blue: #007bff !default;
|
||||||
$indigo: #6610f2 !default;
|
$indigo: #6610f2 !default;
|
||||||
$purple: #6f42c1 !default;
|
$purple: #6f42c1 !default;
|
||||||
$pink: #e83e8c !default;
|
$pink: #e83e8c !default;
|
||||||
$red: rgba(255, 69, 69, 0.85) !default;
|
$red: #dc3545 !default;
|
||||||
$orange: #fd7e14 !default;
|
$orange: #fd7e14 !default;
|
||||||
$yellow: #ffc107 !default;
|
$yellow: #ffc107 !default;
|
||||||
$green: rgba(116,147,99, 1) !default;
|
$green: #28a745 !default;
|
||||||
$teal: #20c997 !default;
|
$teal: #20c997 !default;
|
||||||
$cyan: #17a2b8 !default;
|
$cyan: #17a2b8 !default;
|
||||||
|
|
||||||
$colors: () !default;
|
$colors: () !default;
|
||||||
$colors: map-merge(( "blue": rgb(0, 122, 204), "indigo": $indigo, "purple": $purple, "pink": $pink, "red": $red, "orange": rgb(255, 102, 51), "yellow": $yellow, "green": $green, "teal": $teal, "cyan": $cyan, "white": $white, "gray": $gray-600, "gray-dark": $gray-800 ), $colors);
|
$colors: map-merge((
|
||||||
|
"blue": $blue,
|
||||||
|
"indigo": $indigo,
|
||||||
|
"purple": $purple,
|
||||||
|
"pink": $pink,
|
||||||
|
"red": $red,
|
||||||
|
"orange": $orange,
|
||||||
|
"yellow": $yellow,
|
||||||
|
"green": $green,
|
||||||
|
"teal": $teal,
|
||||||
|
"cyan": $cyan,
|
||||||
|
"white": $white,
|
||||||
|
"gray": $gray-600,
|
||||||
|
"gray-dark": $gray-800
|
||||||
|
), $colors);
|
||||||
|
|
||||||
$primary: $blue !default;
|
$primary: $blue !default;
|
||||||
$secondary: $orange !default;
|
$secondary: $gray-600 !default;
|
||||||
$success: $green !default;
|
$success: $green !default;
|
||||||
$info: $cyan !default;
|
$info: $cyan !default;
|
||||||
$warning: $yellow !default;
|
$warning: $yellow !default;
|
||||||
$danger: $red !default;
|
$danger: $red !default;
|
||||||
$light: rgb(204, 204, 204) !default;
|
$light: $gray-100 !default;
|
||||||
$dark: rgb(24, 24, 24) !default;
|
$dark: $gray-800 !default;
|
||||||
|
|
||||||
$theme-colors: () !default;
|
$theme-colors: () !default;
|
||||||
$theme-colors: map-merge(( "primary": $primary, "secondary": $secondary, "success": $success, "info": $info, "warning": $warning, "danger": $danger, "light": $light, "dark": $dark ), $theme-colors);
|
$theme-colors: map-merge((
|
||||||
|
"primary": $primary,
|
||||||
|
"secondary": $secondary,
|
||||||
|
"success": $success,
|
||||||
|
"info": $info,
|
||||||
|
"warning": $warning,
|
||||||
|
"danger": $danger,
|
||||||
|
"light": $light,
|
||||||
|
"dark": $dark
|
||||||
|
), $theme-colors);
|
||||||
// stylelint-enable
|
// stylelint-enable
|
||||||
|
|
||||||
// Set a specific jump point for requesting color jumps
|
// Set a specific jump point for requesting color jumps
|
||||||
@ -84,28 +117,41 @@ $enable-print-styles: true !default;
|
|||||||
// stylelint-disable
|
// stylelint-disable
|
||||||
$spacer: 1rem !default;
|
$spacer: 1rem !default;
|
||||||
$spacers: () !default;
|
$spacers: () !default;
|
||||||
$spacers: map-merge(( 0: 0, 1: ($spacer * .25), 2: ($spacer * .5), 3: $spacer, 4: ($spacer * 1.5), 5: ($spacer * 3) ), $spacers);
|
$spacers: map-merge((
|
||||||
|
0: 0,
|
||||||
|
1: ($spacer * .25),
|
||||||
|
2: ($spacer * .5),
|
||||||
|
3: $spacer,
|
||||||
|
4: ($spacer * 1.5),
|
||||||
|
5: ($spacer * 3)
|
||||||
|
), $spacers);
|
||||||
|
|
||||||
// This variable affects the `.h-*` and `.w-*` classes.
|
// This variable affects the `.h-*` and `.w-*` classes.
|
||||||
$sizes: () !default;
|
$sizes: () !default;
|
||||||
$sizes: map-merge(( 25: 25%, 50: 50%, 75: 75%, 100: 100% ), $sizes);
|
$sizes: map-merge((
|
||||||
|
25: 25%,
|
||||||
|
50: 50%,
|
||||||
|
75: 75%,
|
||||||
|
100: 100%,
|
||||||
|
auto: auto
|
||||||
|
), $sizes);
|
||||||
// stylelint-enable
|
// stylelint-enable
|
||||||
|
|
||||||
// Body
|
// Body
|
||||||
//
|
//
|
||||||
// Settings for the `<body>` element.
|
// Settings for the `<body>` element.
|
||||||
|
|
||||||
$body-bg: rgb(34,34,34) !default;
|
$body-bg: $white !default;
|
||||||
$body-color: $white !default;
|
$body-color: $gray-900 !default;
|
||||||
|
|
||||||
// Links
|
// Links
|
||||||
//
|
//
|
||||||
// Style anchor elements.
|
// Style anchor elements.
|
||||||
|
|
||||||
$link-color: $white !default;
|
$link-color: theme-color("primary") !default;
|
||||||
$link-decoration: none !default;
|
$link-decoration: none !default;
|
||||||
$link-hover-color: $primary !default;
|
$link-hover-color: darken($link-color, 15%) !default;
|
||||||
$link-hover-decoration: none !default;
|
$link-hover-decoration: underline !default;
|
||||||
|
|
||||||
// Paragraphs
|
// Paragraphs
|
||||||
//
|
//
|
||||||
@ -119,7 +165,13 @@ $paragraph-margin-bottom: 1rem !default;
|
|||||||
// Define the minimum dimensions at which your layout will change,
|
// Define the minimum dimensions at which your layout will change,
|
||||||
// adapting to different screen sizes, for use in media queries.
|
// adapting to different screen sizes, for use in media queries.
|
||||||
|
|
||||||
$grid-breakpoints: ( xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px ) !default;
|
$grid-breakpoints: (
|
||||||
|
xs: 0,
|
||||||
|
sm: 576px,
|
||||||
|
md: 768px,
|
||||||
|
lg: 992px,
|
||||||
|
xl: 1200px
|
||||||
|
) !default;
|
||||||
|
|
||||||
@include _assert-ascending($grid-breakpoints, "$grid-breakpoints");
|
@include _assert-ascending($grid-breakpoints, "$grid-breakpoints");
|
||||||
@include _assert-starts-at-zero($grid-breakpoints);
|
@include _assert-starts-at-zero($grid-breakpoints);
|
||||||
@ -129,7 +181,12 @@ $grid-breakpoints: ( xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px ) !defau
|
|||||||
//
|
//
|
||||||
// Define the maximum width of `.container` for different screen sizes.
|
// Define the maximum width of `.container` for different screen sizes.
|
||||||
|
|
||||||
$container-max-widths: ( sm: 540px, md: 720px, lg: 960px, xl: 1140px ) !default;
|
$container-max-widths: (
|
||||||
|
sm: 540px,
|
||||||
|
md: 720px,
|
||||||
|
lg: 960px,
|
||||||
|
xl: 1140px
|
||||||
|
) !default;
|
||||||
|
|
||||||
@include _assert-ascending($container-max-widths, "$container-max-widths");
|
@include _assert-ascending($container-max-widths, "$container-max-widths");
|
||||||
|
|
||||||
@ -155,6 +212,10 @@ $border-radius: .25rem !default;
|
|||||||
$border-radius-lg: .3rem !default;
|
$border-radius-lg: .3rem !default;
|
||||||
$border-radius-sm: .2rem !default;
|
$border-radius-sm: .2rem !default;
|
||||||
|
|
||||||
|
$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;
|
||||||
|
$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;
|
||||||
|
$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;
|
||||||
|
|
||||||
$component-active-color: $white !default;
|
$component-active-color: $white !default;
|
||||||
$component-active-bg: theme-color("primary") !default;
|
$component-active-bg: theme-color("primary") !default;
|
||||||
|
|
||||||
@ -170,7 +231,7 @@ $transition-collapse: height .35s ease !default;
|
|||||||
// Font, line-height, and color for body text, headings, and more.
|
// Font, line-height, and color for body text, headings, and more.
|
||||||
|
|
||||||
// stylelint-disable value-keyword-case
|
// stylelint-disable value-keyword-case
|
||||||
$font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Open Sans", "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default;
|
$font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default;
|
||||||
$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
|
$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
|
||||||
$font-family-base: $font-family-sans-serif !default;
|
$font-family-base: $font-family-sans-serif !default;
|
||||||
// stylelint-enable value-keyword-case
|
// stylelint-enable value-keyword-case
|
||||||
@ -261,6 +322,9 @@ $table-dark-hover-bg: rgba($white, .075) !default;
|
|||||||
$table-dark-border-color: lighten($gray-900, 7.5%) !default;
|
$table-dark-border-color: lighten($gray-900, 7.5%) !default;
|
||||||
$table-dark-color: $body-bg !default;
|
$table-dark-color: $body-bg !default;
|
||||||
|
|
||||||
|
$table-striped-order: odd !default;
|
||||||
|
|
||||||
|
$table-caption-color: $text-muted !default;
|
||||||
|
|
||||||
// Buttons + Forms
|
// Buttons + Forms
|
||||||
//
|
//
|
||||||
@ -324,6 +388,8 @@ $btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, bord
|
|||||||
|
|
||||||
// Forms
|
// Forms
|
||||||
|
|
||||||
|
$label-margin-bottom: .5rem !default;
|
||||||
|
|
||||||
$input-padding-y: $input-btn-padding-y !default;
|
$input-padding-y: $input-btn-padding-y !default;
|
||||||
$input-padding-x: $input-btn-padding-x !default;
|
$input-padding-x: $input-btn-padding-x !default;
|
||||||
$input-line-height: $input-btn-line-height !default;
|
$input-line-height: $input-btn-line-height !default;
|
||||||
@ -355,6 +421,7 @@ $input-focus-width: $input-btn-focus-width !default;
|
|||||||
$input-focus-box-shadow: $input-btn-focus-box-shadow !default;
|
$input-focus-box-shadow: $input-btn-focus-box-shadow !default;
|
||||||
|
|
||||||
$input-placeholder-color: $gray-600 !default;
|
$input-placeholder-color: $gray-600 !default;
|
||||||
|
$input-plaintext-color: $body-color !default;
|
||||||
|
|
||||||
$input-height-border: $input-border-width * 2 !default;
|
$input-height-border: $input-border-width * 2 !default;
|
||||||
|
|
||||||
@ -424,7 +491,7 @@ $custom-select-indicator-padding: 1rem !default; // Extra padding to account for
|
|||||||
$custom-select-line-height: $input-btn-line-height !default;
|
$custom-select-line-height: $input-btn-line-height !default;
|
||||||
$custom-select-color: $input-color !default;
|
$custom-select-color: $input-color !default;
|
||||||
$custom-select-disabled-color: $gray-600 !default;
|
$custom-select-disabled-color: $gray-600 !default;
|
||||||
$custom-select-bg: $white !default;
|
$custom-select-bg: $input-bg !default;
|
||||||
$custom-select-disabled-bg: $gray-200 !default;
|
$custom-select-disabled-bg: $gray-200 !default;
|
||||||
$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions
|
$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions
|
||||||
$custom-select-indicator-color: $gray-800 !default;
|
$custom-select-indicator-color: $gray-800 !default;
|
||||||
@ -442,7 +509,24 @@ $custom-select-height-sm: $input-height-sm !default;
|
|||||||
$custom-select-font-size-lg: 125% !default;
|
$custom-select-font-size-lg: 125% !default;
|
||||||
$custom-select-height-lg: $input-height-lg !default;
|
$custom-select-height-lg: $input-height-lg !default;
|
||||||
|
|
||||||
|
$custom-range-track-width: 100% !default;
|
||||||
|
$custom-range-track-height: .5rem !default;
|
||||||
|
$custom-range-track-cursor: pointer !default;
|
||||||
|
$custom-range-track-bg: $gray-300 !default;
|
||||||
|
$custom-range-track-border-radius: 1rem !default;
|
||||||
|
$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;
|
||||||
|
|
||||||
|
$custom-range-thumb-width: 1rem !default;
|
||||||
|
$custom-range-thumb-height: $custom-range-thumb-width !default;
|
||||||
|
$custom-range-thumb-bg: $component-active-bg !default;
|
||||||
|
$custom-range-thumb-border: 0 !default;
|
||||||
|
$custom-range-thumb-border-radius: 1rem !default;
|
||||||
|
$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;
|
||||||
|
$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-btn-focus-box-shadow !default;
|
||||||
|
$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;
|
||||||
|
|
||||||
$custom-file-height: $input-height !default;
|
$custom-file-height: $input-height !default;
|
||||||
|
$custom-file-height-inner: $input-height-inner !default;
|
||||||
$custom-file-focus-border-color: $input-focus-border-color !default;
|
$custom-file-focus-border-color: $input-focus-border-color !default;
|
||||||
$custom-file-focus-box-shadow: $input-btn-focus-box-shadow !default;
|
$custom-file-focus-box-shadow: $input-btn-focus-box-shadow !default;
|
||||||
|
|
||||||
@ -457,7 +541,9 @@ $custom-file-border-radius: $input-border-radius !default;
|
|||||||
$custom-file-box-shadow: $input-box-shadow !default;
|
$custom-file-box-shadow: $input-box-shadow !default;
|
||||||
$custom-file-button-color: $custom-file-color !default;
|
$custom-file-button-color: $custom-file-color !default;
|
||||||
$custom-file-button-bg: $input-group-addon-bg !default;
|
$custom-file-button-bg: $input-group-addon-bg !default;
|
||||||
$custom-file-text: ( en: "Browse" ) !default;
|
$custom-file-text: (
|
||||||
|
en: "Browse"
|
||||||
|
) !default;
|
||||||
|
|
||||||
|
|
||||||
// Form validation
|
// Form validation
|
||||||
@ -527,14 +613,17 @@ $nav-pills-border-radius: $border-radius !default;
|
|||||||
$nav-pills-link-active-color: $component-active-color !default;
|
$nav-pills-link-active-color: $component-active-color !default;
|
||||||
$nav-pills-link-active-bg: $component-active-bg !default;
|
$nav-pills-link-active-bg: $component-active-bg !default;
|
||||||
|
|
||||||
|
$nav-divider-color: $gray-200 !default;
|
||||||
|
$nav-divider-margin-y: ($spacer / 2) !default;
|
||||||
|
|
||||||
// Navbar
|
// Navbar
|
||||||
|
|
||||||
$navbar-padding-y: 0 !default;
|
$navbar-padding-y: ($spacer / 2) !default;
|
||||||
$navbar-padding-x: $spacer !default;
|
$navbar-padding-x: $spacer !default;
|
||||||
|
|
||||||
$navbar-nav-link-padding-x: 2rem !default;
|
$navbar-nav-link-padding-x: .5rem !default;
|
||||||
|
|
||||||
$navbar-brand-font-size: $h1-font-size !default;
|
$navbar-brand-font-size: $font-size-lg !default;
|
||||||
// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link
|
// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link
|
||||||
$nav-link-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;
|
$nav-link-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;
|
||||||
$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;
|
$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;
|
||||||
@ -542,11 +631,11 @@ $navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;
|
|||||||
|
|
||||||
$navbar-toggler-padding-y: .25rem !default;
|
$navbar-toggler-padding-y: .25rem !default;
|
||||||
$navbar-toggler-padding-x: .75rem !default;
|
$navbar-toggler-padding-x: .75rem !default;
|
||||||
$navbar-toggler-font-size: $h5-font-size !default;
|
$navbar-toggler-font-size: $font-size-lg !default;
|
||||||
$navbar-toggler-border-radius: $btn-border-radius !default;
|
$navbar-toggler-border-radius: $btn-border-radius !default;
|
||||||
|
|
||||||
$navbar-dark-color: rgba($white, .5) !default;
|
$navbar-dark-color: rgba($white, .5) !default;
|
||||||
$navbar-dark-hover-color: $primary !default;
|
$navbar-dark-hover-color: rgba($white, .75) !default;
|
||||||
$navbar-dark-active-color: $white !default;
|
$navbar-dark-active-color: $white !default;
|
||||||
$navbar-dark-disabled-color: rgba($white, .25) !default;
|
$navbar-dark-disabled-color: rgba($white, .25) !default;
|
||||||
$navbar-dark-toggler-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default;
|
$navbar-dark-toggler-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default;
|
||||||
@ -575,6 +664,7 @@ $pagination-border-width: $border-width !default;
|
|||||||
$pagination-border-color: $gray-300 !default;
|
$pagination-border-color: $gray-300 !default;
|
||||||
|
|
||||||
$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;
|
$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;
|
||||||
|
$pagination-focus-outline: 0 !default;
|
||||||
|
|
||||||
$pagination-hover-color: $link-hover-color !default;
|
$pagination-hover-color: $link-hover-color !default;
|
||||||
$pagination-hover-bg: $gray-200 !default;
|
$pagination-hover-bg: $gray-200 !default;
|
||||||
@ -686,6 +776,7 @@ $modal-title-line-height: $line-height-base !default;
|
|||||||
$modal-content-bg: $white !default;
|
$modal-content-bg: $white !default;
|
||||||
$modal-content-border-color: rgba($black, .2) !default;
|
$modal-content-border-color: rgba($black, .2) !default;
|
||||||
$modal-content-border-width: $border-width !default;
|
$modal-content-border-width: $border-width !default;
|
||||||
|
$modal-content-border-radius: $border-radius-lg !default;
|
||||||
$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;
|
$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;
|
||||||
$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;
|
$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;
|
||||||
|
|
||||||
@ -784,7 +875,9 @@ $breadcrumb-margin-bottom: 1rem !default;
|
|||||||
$breadcrumb-bg: $gray-200 !default;
|
$breadcrumb-bg: $gray-200 !default;
|
||||||
$breadcrumb-divider-color: $gray-600 !default;
|
$breadcrumb-divider-color: $gray-600 !default;
|
||||||
$breadcrumb-active-color: $gray-600 !default;
|
$breadcrumb-active-color: $gray-600 !default;
|
||||||
$breadcrumb-divider: "/" !default;
|
$breadcrumb-divider: quote("/") !default;
|
||||||
|
|
||||||
|
$breadcrumb-border-radius: $border-radius !default;
|
||||||
|
|
||||||
|
|
||||||
// Carousel
|
// Carousel
|
||||||
@ -806,7 +899,7 @@ $carousel-control-icon-width: 20px !default;
|
|||||||
$carousel-control-prev-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"), "#", "%23") !default;
|
$carousel-control-prev-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"), "#", "%23") !default;
|
||||||
$carousel-control-next-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"), "#", "%23") !default;
|
$carousel-control-next-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"), "#", "%23") !default;
|
||||||
|
|
||||||
$carousel-transition: transform .6s ease !default;
|
$carousel-transition: transform .6s ease !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)
|
||||||
|
|
||||||
|
|
||||||
// Close
|
// Close
|
||||||
|
Loading…
Reference in New Issue
Block a user