Add project files.

This commit is contained in:
Josh Deck 2025-07-21 14:01:24 -04:00
parent a829f70dfb
commit cad1df9c02
3244 changed files with 155733 additions and 0 deletions

56
Components/App.razor Normal file
View File

@ -0,0 +1,56 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<base href="/" />
<link rel="stylesheet" href="@Assets["app.css"]" />
<link rel="stylesheet" href="@Assets["style.css"]" />
<HeadOutlet @rendermode="InteractiveServer"/>
</head>
<body>
<Routes @rendermode="InteractiveServer"/>
<script src="_framework/blazor.web.js"></script>
<link rel="stylesheet" href="https://blazor.cdn.telerik.com/blazor/6.2.0/kendo-theme-bootstrap/swatches/bootstrap-urban.css" />
<script src="https://blazor.cdn.telerik.com/blazor/6.2.0/telerik-blazor.min.js" defer></script>
<!-- Font Imports -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<!-- Core Style -->
<link rel="stylesheet" href="style.css">
<!-- Font Icons -->
<link rel="stylesheet" href="css/font-icons.css">
<!-- Plugins/Components CSS -->
<link rel="stylesheet" href="css/swiper.css">
<link rel="stylesheet" href="include/rs-plugin/css/settings.css" media="screen">
<link rel="stylesheet" href="include/rs-plugin/css/layers.css">
<link rel="stylesheet" href="include/rs-plugin/css/navigation.css">
<!-- Niche Demos -->
<link rel="stylesheet" href="demos/crowdfunding/crowdfunding.css">
<!-- Custom CSS -->
<link rel="stylesheet" href="css/custom.css">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- JavaScripts
============================================= -->
<script src="js/plugins.min.js"></script>
<script src="js/functions.js"></script>
<script src="js/functions.bundle.js"></script>
<!-- Parallax Script
============================================= -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/skrollr/0.6.30/skrollr.min.js"></script>
<script>!SEMICOLON.Mobile.any() && skrollr.init({forceHeight: false});</script>
</body>
</html>

View File

@ -0,0 +1,11 @@
namespace TireTargets.Components.CSharp
{
public class Credentials
{
public static string GoogleClientId = "656434530552-03u6d8t2lpf1phuq6qkq0getfh9d7di9.apps.googleusercontent.com";
public static string GoogleClientSecret = "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";
public static string FacebookAppId = "791426466201326";
public static string FacebookClientSecret = "13ae28aac6727b898ba712eb78ab0f24";
}
}

View File

@ -0,0 +1,277 @@
using Microsoft.Data.SqlClient;
using System.Collections.Concurrent;
using System.Data;
using System.Threading.Tasks;
using Telerik.Windows.Documents.Fixed.Model.Editing.Lists;
using Telerik.Windows.Documents.Fixed.Model.Navigation;
using XAct;
namespace TireTargets.Components.CSharp
{
public class DatabaseDriver : IDisposable
{
private bool disposedValue;
private ConcurrentBag<System.Threading.Tasks.Task> _tasks = new ConcurrentBag<System.Threading.Tasks.Task>();
private bool isExiting = false;
private static string _connectionString = "Server=BigMac; Database=TireTargets; Integrated Security=SSPI;MultipleActiveResultSets=True;TrustServerCertificate=True;";
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
isExiting = true;
Task.WaitAll(_tasks.ToArray());
}
disposedValue = true;
}
}
public void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
public static async Task<bool> SignIn(string platform, string id, string fname, string email)
{
try
{
using (var cn = new SqlConnection(_connectionString))
{
await cn.OpenAsync();
await using var queryCmd = new SqlCommand(String.Format("SELECT COUNT(UniqID) FROM [dbo].[User] WHERE {0}ID = '{1}'", platform, id), cn);
await using var rd = await queryCmd.ExecuteReaderAsync();
// Get number of occurences of this ID/Platform combo
int count = -1;
while (await rd.ReadAsync())
{
count = rd.GetInt32(0);
}
if (count > 0) // If the account already exists, read from the DB for session info
{
}
else // Otherwise, we need to create a new account
{
await using var insertCmd = new SqlCommand(String.Format("INSERT INTO [dbo].[User] ({0}ID, {0}Name, {0}Email) VALUES (@id, @fname, @email)", platform), cn);
insertCmd.Parameters.AddWithValue("@id", id);
insertCmd.Parameters.AddWithValue("@fname", fname);
insertCmd.Parameters.AddWithValue("@email", email);
insertCmd.ExecuteNonQuery();
}
cn.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
return true;
}
public static async Task<List<Location>> GetLocationInfoForUser(string id, string platform)
{
try
{
using (var cn = new SqlConnection(_connectionString))
{
await cn.OpenAsync();
// Confirm that user has a valid location ID set
string locQueryString = "";
if (platform == "Google")
locQueryString = String.Format("SELECT [LocationID] FROM [dbo].[User] WHERE [GoogleID] = '{0}'", id.Replace("'","''"));
else if (platform == "FB")
locQueryString = String.Format("SELECT [LocationID] FROM [dbo].[User] WHERE [FBID] = '{0}'", id.Replace("'", "''"));
await using var locQuery = new SqlCommand(locQueryString, cn);
await using var locRd = await locQuery.ExecuteReaderAsync();
// Extract loc id
int locationId = -1;
while (await locRd.ReadAsync())
{
locationId = locRd.GetInt32(0);
}
// Check if user's LocID is a RootID
string rootString = String.Format("SELECT COUNT(*) FROM [dbo].[Location] WHERE RootID = {0}", ("" + locationId).Replace("'","''"));
SqlCommand cmd = new SqlCommand(rootString, cn);
Int32 val = (Int32)cmd.ExecuteScalar();
string locInfoString = "";
if (val > 1)
{
locInfoString = String.Format("SELECT * FROM [dbo].[Location] WHERE RootID = {0}", ("" + locationId).Replace("'", "''"));
}
else // Nothing matches
{
locInfoString = String.Format("SELECT * FROM [dbo].[Location] WHERE LocationID = {0}", ("" + locationId).Replace("'", "''"));
}
// Find the location in Location table
await using var queryCmd = new SqlCommand(locInfoString, cn);
await using var rd = await queryCmd.ExecuteReaderAsync();
// Extract loc id
List<Location> locations = new List<Location>();
while (await rd.ReadAsync())
{
var locID = rd.GetInt32(0);
var rootID = rd.GetInt32(1);
var locName = rd.GetString(2);
var lastSelected = rd.GetDateTime(3);
var needSelection = rd.GetInt32(4);
var selectionJson = rd.GetString(5);
var enabled = rd.GetInt32(6);
Location current = new Location(locID, rootID, locName, lastSelected, needSelection, selectionJson, enabled);
locations.Add(current);
}
cn.Close();
return locations;
}
}
catch (Exception ex) {
Console.WriteLine(ex.Message);
}
return new List<Location>();
}
public static async Task<(DateTime, DateTime)> GetSelectionTimes()
{
using (var cn = new SqlConnection(_connectionString))
{
await cn.OpenAsync();
await using var cmd = new SqlCommand("SELECT * FROM [cfg].[Selection]", cn);
await using var rd = await cmd.ExecuteReaderAsync();
(DateTime, DateTime) selectionTime = (default, default);
while (await rd.ReadAsync())
{
selectionTime.Item1 = rd.GetDateTime(0);
selectionTime.Item2 = rd.GetDateTime(1);
}
return selectionTime;
}
}
public static async Task<List<(int,bool)>> DoesLocationNeedSelection()
{
// Determine if offers need to be selected
var locInfo = await GetLocationInfoForUser(Layout.MainLayout.Session["id"], Layout.MainLayout.Session["login_method"]);
var selectionTime = await GetSelectionTimes();
List<(int, bool)> results = new List<(int, bool)> ();
foreach (Location current in locInfo)
{
// Location NeedSelection is effectively an override, forcing them to re-select for the flagged location(s)
if (current.NeedSelection == 1 || (current.LastSelected < selectionTime.Item1 && DateTime.Now < selectionTime.Item2))
{
results.Add((current.LocationID, true));
}
else
{
results.Add((current.LocationID, false));
}
}
return results;
}
public static async Task<bool> DoesUserHaveLocation(string id, string platform)
{
using (var cn = new SqlConnection(_connectionString))
{
await cn.OpenAsync();
string queryString = "";
if (platform == "Google")
queryString = String.Format("SELECT [LocationID] FROM [dbo].[User] WHERE [GoogleID] = '{0}'", id.Replace("'", "''"));
else if (platform == "FB")
queryString = String.Format("SELECT [LocationID] FROM [dbo].[User] WHERE [FBID] = '{0}'", id.Replace("'", "''"));
await using var cmd = new SqlCommand(queryString, cn);
await using var rd = await cmd.ExecuteReaderAsync();
while (await rd.ReadAsync())
{
if (rd.IsDBNull(0) || rd.GetInt32(0) == -1)
return false;
}
return true;
}
}
public static async Task<bool> UpdateSelection(Dictionary<int, string> locSelections)
{
using (var cn = new SqlConnection(_connectionString))
{
await cn.OpenAsync();
foreach (var current in locSelections)
{
var query = String.Format("UPDATE [dbo].[Location] SET [SelectionJson] = '{0}', [LastSelected] = GETDATE() WHERE LocationID = {1}", current.Value, current.Key);
await using var cmd = new SqlCommand(query, cn);
cmd.ExecuteNonQuery();
}
}
return true;
}
public class Location
{
public Location(int locID, int rootID, string locName, DateTime lastSelect, int needSelection, string selectionJson, int enabled)
{
LocationID = locID;
RootID = rootID;
LocationName = locName;
LastSelected = lastSelect;
NeedSelection = needSelection;
SelectionJson = selectionJson;
Enabled = enabled;
}
public int LocationID { get; set; }
public int RootID { get; set; }
public string LocationName { get; set; }
public DateTime LastSelected { get; set; }
public int NeedSelection { get; set; }
public string SelectionJson { get; set; }
public int Enabled { get; set; }
}
}
}

View File

@ -0,0 +1,9 @@
using TireTargets.Components.Layout;
namespace TireTargets.Components.CSharp
{
public class WebInfo
{
public static string BaseUrl = MainLayout.isDev ? "https://localhost:7219" : "INSERT REAL ADDRESS HERE";
}
}

View File

@ -0,0 +1,194 @@
@inherits LayoutComponentBase
@inject NavigationManager _navigationManager
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
</head>
<TelerikRootComponent>
<!-- Login/Register Modal -->
<div class="modal-register mfp-hide" id="modal-register">
<div class="card mx-auto" style="max-width: 400px;">
<div class="card-header py-3 bg-transparent text-center">
<h3 class="mb-0 fw-normal">Please Sign In:</h3>
<div class="container">
<div class="row justify-content-center align-items-center">
<div class="col-12 text-center justify-content-center align-items-center">
@if (MainLayout.Session.Count == 0)
{
<!-- Google Sign In-->
<script src="https://accounts.google.com/gsi/client" async></script>
<script>
function decodeJwtResponse(token) {
var base64Url = token.split(".")[1];
var base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
var jsonPayload = decodeURIComponent(
atob(base64)
.split("")
.map(function (c) {
return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2);
})
.join("")
);
return JSON.parse(jsonPayload);
}
var saved_response;
function onClickHandler(response) {
const responsePayload = decodeJwtResponse(response.credential);
saved_response = responsePayload;
/*
console.log("ID: " + responsePayload.sub);
console.log('Full Name: ' + responsePayload.name);
console.log('Given Name: ' + responsePayload.given_name);
console.log('Family Name: ' + responsePayload.family_name);
console.log("Image URL: " + responsePayload.picture);
console.log("Email: " + responsePayload.email); */
var url = new URL("https://localhost:7219/AuthGoogle/id=" + responsePayload.sub + "&fname=" + responsePayload.name + "&email=" + responsePayload.email);
window.location.href = url;
}
</script>
<div id="g_id_onload"
data-client_id="166700556504-8t29okj2dp63ak7navmauj3200uns3ci.apps.googleusercontent.com"
data-auto_prompt="false"
data-callback="onClickHandler">
</div>
<div class="g_id_signin"
data-type="standard"
data-size="large"
data-theme="outline"
data-text="sign_in_with"
data-shape="rectangular"
data-logo_alignment="left">
</div>
<!-- Facebook Sign In -->
<script>
let clicked = false;
function statusChangeCallback(response) { // Called with the results from FB.getLoginStatus().
if (response.status === 'connected') { // Logged into your webpage and Facebook.
loginFB();
}
}
function checkLoginState() { // Called when a person is finished with the Login Button.
FB.getLoginStatus(function (response) { // See the onlogin handler
statusChangeCallback(response);
});
}
window.fbAsyncInit = function () {
FB.init({
status: false,
appId: '1293246192236822',
cookie: false, // Enable cookies to allow the server to access the session.
xfbml: true, // Parse social plugins on this webpage.
version: 'v23.0' // Use this Graph API version for this call.
});
}
function clickButton() {
clicked = true;
console.log('Click!');
}
function loginFB() { // Testing Graph API after login. See statusChangeCallback() for when this call is made.
console.log('Welcome! Fetching your information.... ');
FB.api('/me', function (response) {
console.log('Successful login for: ' + response.name);
if (clicked) {
var url = new URL("https://localhost:7219/AuthFacebook/id=" + response.id + "&fname=" + response.name + "&email=" + response.email);
window.location.href = url;
}
});
}
/* LIST OF FIELDS RETURNED:
name = response.name
id = response.id
email = response.email
*/
</script>
<br />
<!-- The JS SDK Login Button -->
<fb:login-button class="text-center" scope="public_profile,email" onclick="clickButton();" onlogin="checkLoginState();">
</fb:login-button>
<!-- Load the JS SDK asynchronously -->
<script async defer crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js"></script>
}
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Header
============================================= -->
<header id="header" class="transparent-header" data-sticky-shrink="false">
<div id="header-wrap" class="border-default">
<div class="container">
<div class="header-row">
<!-- Logo
============================================= -->
<div id="logo">
<a href="/">
<img class="logo-default" srcset="demos/ecommerce/images/logo.png, demos/ecommerce/images/logo@2x.png 2x" src="demos/ecommerce/images/logo@2x.png" alt="TireTargets Logo">
</a>
</div><!-- #logo end -->
<div class="header-misc">
@if(MainLayout.Session.Count != 0)
{
<a href="/logout" data-lightbox="inline" class="button button-small fw-semibold button-border button-rounded ls-0 fw-medium text-transform-none">Sign Out</a>
}
</div>
<!-- Primary Navigation
============================================= -->
<nav class="primary-menu">
@if(MainLayout.Session.Count == 0)
{
<a href="#modal-register" onclick="clickButton(); return true;" data-lightbox="inline" class="button button-large fw-semibold button-border button-rounded ls-0 text-transform-none">Sign In</a>
<br>
}
else
{
}
</nav><!-- #primary-menu end -->
</div>
</div>
</div>
<div class="header-wrap-clone"></div>
</header><!-- #header end -->
@Body
</TelerikRootComponent>

View File

@ -0,0 +1,27 @@
using Microsoft.AspNetCore.Components;
namespace TireTargets.Components.Layout
{
public partial class MainLayout
{
public static readonly bool isDev = true;
public static Dictionary<string, string> Session = new Dictionary<string, string>();
public static bool isSignedIn = false;
private static bool isModalVisible = false;
public static void SignOut()
{
Session = new Dictionary<string, string>();
isSignedIn = false;
}
public static void ToggleModal()
{
isModalVisible = !isModalVisible;
Console.WriteLine("Modal is now " + isModalVisible);
}
}
}

View File

@ -0,0 +1,20 @@
#blazor-error-ui {
color-scheme: light only;
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
box-sizing: border-box;
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}

View File

@ -0,0 +1,53 @@
@page "/AuthFacebook/id={id}&fname={fname}&email={email}"
@inject NavigationManager _navigationManager
<h3>AuthFB</h3>
<h1>@valid</h1>
@code {
[Parameter] public string? id { get; set; }
[Parameter] public string? fname { get; set; }
[Parameter] public string? email { get; set; }
public string valid = "FALSE";
protected override async Task OnInitializedAsync()
{
try
{
id = id ?? "NULL";
fname = fname ?? "NULL";
email = email ?? "NULL";
if (id != "NULL" && fname != "NULL" && email != "NULL")
{
valid = "TRUE\n" + id + " " + fname + " " + email;
Components.Layout.MainLayout.Session = new Dictionary<string, string>();
Components.Layout.MainLayout.Session.Add("login_method", "FB");
Components.Layout.MainLayout.Session.Add("id", id);
Components.Layout.MainLayout.Session.Add("fname", fname);
Components.Layout.MainLayout.Session.Add("email", email);
// Database call to add if it doesn't exist, or load LOCID if it does
await Components.CSharp.DatabaseDriver.SignIn("FB", id, fname, email);
}
}
catch (Exception e)
{
// This is literally just to stop Blazor from blowing up due to running the above code twice.
// Blazor lifecycle quirks are going to cause generational damage to my liver.
}
await Task.Delay(0);
}
// Runs after OnInit, so we just use this to redirect since we know session will be configured by now
protected override async Task OnParametersSetAsync()
{
_navigationManager.NavigateTo("/Portal", true);
Console.WriteLine("Redirected to Portal");
await Task.Delay(0);
}
}

View File

@ -0,0 +1,55 @@
@page "/AuthGoogle/id={id}&fname={fname}&email={email}"
@inject NavigationManager _navigationManager
<h3>AuthGoogle</h3>
<h1>@valid</h1>
@code {
[Parameter] public string? id { get; set; }
[Parameter] public string? fname { get; set; }
[Parameter] public string? email { get; set; }
public string valid = "FALSE";
protected override async Task OnInitializedAsync()
{
try
{
id = id ?? "NULL";
fname = fname ?? "NULL";
email = email ?? "NULL";
if (id != "NULL" && fname != "NULL" && email != "NULL")
{
valid = "TRUE\n" + id + " " + fname + " " + email;
Components.Layout.MainLayout.Session = new Dictionary<string, string>();
Components.Layout.MainLayout.Session.Add("login_method", "Google");
Components.Layout.MainLayout.Session.Add("id", id);
Components.Layout.MainLayout.Session.Add("fname", fname);
Components.Layout.MainLayout.Session.Add("email", email);
// Database call to add if it doesn't exist, or load LOCID if it does
await Components.CSharp.DatabaseDriver.SignIn("Google", id, fname, email);
}
}
catch (Exception e)
{
// This is literally just to stop Blazor from blowing up due to running the above code twice.
// Blazor lifecycle quirks are going to cause generational damage to my liver.
}
await Task.Delay(0);
}
// Runs after OnInit, so we just use this to redirect since we know session will be configured by now
protected override async Task OnParametersSetAsync()
{
_navigationManager.NavigateTo("/Portal", true);
Console.WriteLine("Redirected to Portal");
await Task.Delay(0);
}
}

View File

@ -0,0 +1,36 @@
@page "/Error"
@using System.Diagnostics
<PageTitle>Error</PageTitle>
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
@if (ShowRequestId)
{
<p>
<strong>Request ID:</strong> <code>@RequestId</code>
</p>
}
<h3>Development Mode</h3>
<p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
and restarting the app.
</p>
@code{
[CascadingParameter]
private HttpContext? HttpContext { get; set; }
private string? RequestId { get; set; }
private bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
protected override void OnInitialized() =>
RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier;
}

178
Components/Pages/Home.razor Normal file
View File

@ -0,0 +1,178 @@
@page "/"
@inject NavigationManager navigationManager
<head>
<!-- Document Title
============================================= -->
<title>Home | TireTargets</title>
</head>
<body class="stretched">
<!-- Document Wrapper
============================================= -->
<div id="wrapper">
<!-- Slider
============================================= -->
<section id="slider" class="slider-element min-vh-100 include-header" style="background: url('demos/crowdfunding/images/hero.svg') no-repeat center bottom / cover;">
<div class="slider-inner">
<div class="vertical-middle">
<div class="container py-5">
<div class="row">
<div class="col-lg-6 col-md-8">
<div class="slider-title">
<h1 class="fw-semibold">Great Offers Start Here</h1>
<p class="text-muted">With TireTargets, you can quickly and easily spread the word about great tire offers at your business!</p>
</div>
<a href="#modal-register" data-lightbox="inline" class="button button-large fw-semibold button-rounded ls-0 text-transform-none ms-0">Start A Campaign</a>
</div>
</div>
</div>
</div>
<img src="demos/crowdfunding/images/hero-img.svg" alt="Parallax Image" class="slider-img parallax" data-start="margin-top: 0px;" data-400="margin-top: 50px;">
</div>
</section><!-- #Slider End -->
<!-- Content
============================================= -->
<section id="content">
<div class="content-wrap p-0">
<div class="section bg-transparent mb-0 pb-0 border-0">
<div class="container bg-color-light border-0 rounded-3 p-4 p-md-5">
<div class="row justify-content-between align-items-center mb-4">
<div class="col-lg-7 col-sm-7">
<div class="heading-block border-bottom-0 mb-3">
<h2>How It Works</h2>
</div>
<p class="text-muted mb-0">We are TireTargets know how busy the industry gets, so our goal is to make it as quick and easy as possible to get your deals up and running!</p>
</div>
<div class="col-lg-3 col-sm-5 mt-4 mt-sm-0">
<div class="bg-white text-center px-5 py-3 border">
<div class="counter counter-large color fw-bold"><span data-from="0" data-to="650" data-refresh-interval="10" data-speed="1500"></span>%</div>
<div class="line my-2"></div>
<h5 class="fw-normal mb-1">Average Return on Investment</h5>
</div>
</div>
</div>
<div class="clear"></div>
<div class="row justify-content-around">
<div class="col-lg-3 col-md-4 mt-5">
<div class="feature-text">
<div class="fbox-text color">1.</div>
<h3>Register Your Account.</h3>
</div>
<p>Securely sign in with one of our supported systems and get connected with your business</p>
</div>
<div class="col-lg-3 col-md-4 mt-5">
<div class="feature-text">
<div class="fbox-text color">2.</div>
<h3>Choose your Offers.</h3>
</div>
<p>Choose from a list of Tire and Service deals to offer to your customers.</p>
</div>
<div class="col-lg-3 col-md-4 mt-5">
<div class="feature-text">
<div class="fbox-text color">3.</div>
<h3>Send them out!</h3>
</div>
<p>TireTargets will send out your selections to all of your customers.</p>
</div>
</div>
</div>
</div>
<div class="section border-0 bg-transparent mb-1">
<div class="container">
<div class="row justify-content-center mb-5">
<div class="col-lg-7 text-center">
<div class="heading-block">
<h3 class="text-transform-none mb-3 fw-semibold ls-0">Still Not Convinced?</h3>
<span class="text-black-50">Here's how we can energize your business:</span>
</div>
</div>
<div class="col-lg-8">
<div class="row align-items-center">
<div class="col-sm-6">
<img src="assets/mobile.png" alt="mobile">
</div>
<div class="col-sm-6">
<h3>Targeted SMS Campaigns Designed to Move Inventory.</h3>
<p class="mb-2">Our campaigns help break through to those tricky customers and get them through your door.</p>
</div>
</div>
<div class="row align-items-center mt-5">
<div class="col-sm-6 mb-4 mb-sm-0">
<h3>Decades of Experience</h3>
<p class="mb-2">Our team has decades of experience in helping shops like yours deliver excellence through precise marketing.</p>
</div>
<div class="col-sm-6">
<img src="assets/experience.png" alt="experience">
</div>
</div>
<div class="row align-items-center mt-5">
<div class="col-sm-6">
<img src="assets/growth.png" alt="growth">
</div>
<div class="col-sm-6">
<h3>Historically High Return on Investment</h3>
<p class="mb-2">Our campaigns have historically maintained a staggeringly high RoI, generating a significant amount of revenue per campaign.</p>
</div>
</div>
</div>
</div>
<br />
<div class="col-lg-4 col-sm-6 mb-4">
</div>
<!-- Row 2 -->
</div>
</div>
</div>
</section><!-- #content end -->
<!-- Footer
============================================= -->
<footer id="footer" class="dark" style="background-color: #373D52">
<div class="container">
<!-- Footer Widgets
============================================= -->
<div class="footer-widgets-wrap pb-4">
<p class="fw-light text-white-50 mt-4">
</p>
</div><!-- .footer-widgets-wrap end -->
</div>
<!-- Copyrights
============================================= -->
<div id="copyrights">
<div class="container">
<div class="row justify-content-between align-items-center">
<div class="col-md-6">
Copyrights &copy; 2025 All Rights Reserved by TireTargets.
</div>
</div>
</div>
</div><!-- #copyrights end -->
</footer><!-- #footer end -->
</div><!-- #wrapper end -->
<!-- Go To Top
============================================= -->
<div id="gotoTop" class="bi-arrow-up"></div>
</body>

View File

@ -0,0 +1,64 @@
using Telerik.Blazor.Components;
namespace TireTargets.Components.Pages
{
public partial class Home
{
private List<(string, string)> availableTireOffers = new List<(string, string)>();
private List<(string, string)> availableServiceOffers = new List<(string, string)>();
private List<CarouselModel> TireOffers { get; set; } = new List<CarouselModel>();
private List<CarouselModel> ServiceOffers { get; set; } = new List<CarouselModel>();
public int PageIndex = 1;
protected override void OnInitialized()
{
if (availableTireOffers.Count == 0)
{
// TODO: switch to read from server instead of local dir
string[] files = Directory.GetFiles(@"wwwroot\assets\TestTireDir");
foreach (var file in files)
{
availableTireOffers.Add((file.Substring(8), file.Substring(8)));
}
files = Directory.GetFiles(@"wwwroot\assets\TestServiceDir");
foreach (var file in files)
{
availableServiceOffers.Add((file.Substring(8), file.Substring(8)));
}
}
// Add the fetched offers to the Carousel
foreach ((string, string) current in availableTireOffers)
{
TireOffers.Add(new CarouselModel(current.Item2));
}
foreach ((string, string) current in availableServiceOffers)
{
ServiceOffers.Add(new CarouselModel(current.Item2));
}
//Console.WriteLine(String.Join(", ", TireOffers.);
}
public async Task PageChangeHandler(int newPage)
{
PageIndex = newPage;
}
public class CarouselModel
{
public CarouselModel(string filePath)
{
ImageID = filePath;
}
public string ImageID { get; set; }
}
}
}

View File

@ -0,0 +1,13 @@
@page "/logout"
<h3>Logout</h3>
@inject NavigationManager _navigationManager
@code {
protected override Task OnInitializedAsync()
{
Components.Layout.MainLayout.SignOut();
_navigationManager.NavigateTo("/", true);
return base.OnInitializedAsync();
}
}

View File

@ -0,0 +1,39 @@
@page "/portal"
<head>
<!-- Document Title
============================================= -->
<title>Portal | TireTargets</title>
</head>
@if(!userHasLocation)
{
<div class="alert alert-warning" role="alert">
Welcome! To link your business with your account, please contact us at <a href="mailto:support@keymotive.net">support@keymotive.net</a>
</div>
}
@if(needSelection)
{
<div class="alert alert-success" role="alert">
Your offers are ready for selection! <a href="/selection">Click here to select your offerings!</a>
</div>
}
else if (userHasLocation && !needSelection)
{
<div class="alert alert-primary" role="alert">
Your offers are all ready to go. If you wish to make revisions, <a href="/selection">click here to adjust your offerings!</a>
</div>
}
<div class="container">
<div class="row">
<div class="col-12 text-center mt-5">
<h3 style="text-align: center">Hello, @Components.Layout.MainLayout.Session["fname"].Split(" ")[0]! The portal is under construction. Come back later!</h3>
<img style="text-align: center;width:800px;height:600px" src="assets/construction.png" />
</div>
</div>
</div>

View File

@ -0,0 +1,31 @@

using TireTargets.Components.CSharp;
namespace TireTargets.Components.Pages
{
public partial class Portal
{
public string locText = "";
private bool needSelection = false;
private bool userHasLocation = false;
protected override async Task OnInitializedAsync()
{
userHasLocation = await DatabaseDriver.DoesUserHaveLocation(Layout.MainLayout.Session["id"], Layout.MainLayout.Session["login_method"]);
if (userHasLocation)
{
var needSelectionAll = await DatabaseDriver.DoesLocationNeedSelection();
foreach (var current in needSelectionAll)
{
if (current.Item2)
{
needSelection = true;
break;
}
}
}
await base.OnInitializedAsync();
}
}
}

View File

@ -0,0 +1,138 @@
@page "/selection"
@inject NavigationManager navigationManager
<head>
<!-- Document Title
============================================= -->
<title>Selection | TireTargets</title>
</head>
@if(!ShowWizard)
{
<div class="container">
<div class="row">
<div class="col-12 text-center mt-5">
<h4>Here are the locations associated with your account:</h4>
<div style="width:800px; margin:0 auto;">
<ul class="list-group list-group-horizontal-md">
<li class="list-group-item row w-25" style="text-align:center"><strong>ID</strong></li>
<li class="list-group-item row w-25" style="text-align:center"><strong>Location Name</strong></li>
<li class="list-group-item row w-25" style="text-align:center"><strong>Needs Selection</strong></li>
</ul>
@foreach (var current in locInfo)
{
<ul class="list-group list-group-horizontal-md">
<li class="list-group-item row w-25" style="text-align:center">@current.LocationID</li>
<li class="list-group-item row w-25" style="text-align:center">@current.LocationName</li>
<li class="list-group-item row w-25" style="text-align:center">@DoesLocIDNeedSelection(current.LocationID)</li>
<li class="list-group-item row" style="text-align:center"><input type="checkbox" @onchange="@((ChangeEventArgs c) => SelectLocation(current.LocationID))"></input></li>
</ul>
}
<TelerikButton OnClick="@ConfirmSelection">Modify Selected Locations</TelerikButton>
</div>
</div>
</div>
</div>
}
else if(ShowWizard && !WizardComplete)
{
<div class="container">
<div class="row">
<div class="col-12">
<TelerikWizard OnFinish="@OnFinishHandler" Width="1440px" Height="900px">
<WizardSteps>
@*
Step 1 - Select Tire Offers
*@
<WizardStep Label="Tire Offers" Icon="@SvgIcon.Car">
<Content>
<h1>Please select your Tire Offer(s):</h1>
<TelerikButtonGroup SelectionMode="@ButtonGroupSelectionMode.Multiple">
<!-- Programatically add each valid offer to the list-->
@{
@for (int index = 0; index < availableTireOffers.Count; index++)
{
int temp = index;
<ButtonGroupToggleButton @bind-Selected="@selectedTireOffers[temp]"><img src=@availableTireOffers[temp].Item2 /></ButtonGroupToggleButton>
<p style="width:35px"></p>
@if (temp > 0 && temp % 2 == 0)
{
<br />
}
}
}
</TelerikButtonGroup>
</Content>
</WizardStep>
@*
Step 2 - Select Service Offers
*@
<WizardStep Label="Service Offers" Icon="@SvgIcon.GaugeRadial">
<Content>
<h1>Please select your Service Offer(s):</h1>
<TelerikButtonGroup SelectionMode="@ButtonGroupSelectionMode.Multiple">
<!-- Programatically add each valid offer to the list-->
@{
@for (int index = 0; index < availableServiceOffers.Count; index++)
{
int temp = index;
<ButtonGroupToggleButton @bind-Selected="@selectedServiceOffers[temp]"><img src=@availableServiceOffers[temp].Item2 /></ButtonGroupToggleButton>
<p style="width:35px"></p>
@if (temp > 0 && temp % 2 == 0)
{
<br />
}
}
}
</TelerikButtonGroup>
</Content>
</WizardStep>
@*
Step 3 - Confirm Order
*@
<WizardStep Label="Confirmation" Icon="@SvgIcon.TrackChangesAcceptAll">
<Content>
<h1>Here are your selected offers: </h1>
@{
@for (int index = 0; index < selectedTireOffers.Count; index++)
{
int temp = index;
@if (selectedTireOffers[index])
{
<img src="@availableTireOffers[temp].Item2" />
<br />
}
}
<br />
@for (int index = 0; index < selectedServiceOffers.Count; index++)
{
int temp = index;
@if (selectedServiceOffers[index])
{
<img src="@availableServiceOffers[temp].Item2" />
<br />
}
}
}
</Content>
</WizardStep>
</WizardSteps>
</TelerikWizard>
</div>
</div>
</div>
}

View File

@ -0,0 +1,207 @@
using Microsoft.AspNetCore.Components;
using Newtonsoft.Json;
using Telerik.Blazor;
using Telerik.Blazor.Components;
using TireTargets.Components.CSharp;
using TireTargets.Components.Layout;
namespace TireTargets.Components.Pages
{
public partial class Selection
{
/*
*
* Code relating to the location selection
*
*/
private List<DatabaseDriver.Location> locInfo = new List<DatabaseDriver.Location>();
private List<(int, bool)> locSelections = new List<(int, bool)> ();
private Dictionary<int, bool> locationState = new Dictionary<int, bool> ();
private bool dummy = false;
protected override async Task OnInitializedAsync()
{
await FetchAvailableOffers();
locInfo = await DatabaseDriver.GetLocationInfoForUser(MainLayout.Session["id"], MainLayout.Session["login_method"]);
locSelections = await DatabaseDriver.DoesLocationNeedSelection();
foreach (var location in locInfo)
{
locationState.Add(location.LocationID, false);
}
await base.OnInitializedAsync();
}
private bool DoesLocIDNeedSelection(int id)
{
foreach ((int, bool) value in locSelections)
{
if (value.Item1 == id)
return value.Item2;
}
return false;
}
private void ConfirmSelection()
{
//PrintLocStates();
ShowWizard = true;
}
private void PrintLocStates()
{
foreach(var current in locationState)
{
Console.WriteLine("" + current.Key + " | " + current.Value);
}
}
public void SelectLocation(int locID)
{
Console.WriteLine("Toggled value for " + locID);
locationState[locID] = !locationState[locID];
}
/*
*
*
* Wizard portion
*
*
*/
private bool ShowWizard = false;
private bool WizardComplete = false;
[CascadingParameter]
private DialogFactory Dialog { get; set; }
// Tire offer variables
private List<(string, string)> availableTireOffers = new List<(string, string)>();
private List<bool> selectedTireOffers = new List<bool>();
// Service offer variables
private List<(string, string)> availableServiceOffers = new List<(string, string)>();
private List<bool> selectedServiceOffers = new List<bool>();
private async Task FetchAvailableOffers()
{
if (availableTireOffers.Count == 0)
{
// TODO: switch to read from server instead of local dir
string[] files = Directory.GetFiles(@"wwwroot\assets\TestTireDir");
foreach (var file in files)
{
availableTireOffers.Add((file.Substring(8), file.Substring(8)));
selectedTireOffers.Add(false);
}
files = Directory.GetFiles(@"wwwroot\assets\TestServiceDir");
foreach (var file in files)
{
availableServiceOffers.Add((file.Substring(8), file.Substring(8)));
selectedServiceOffers.Add(false);
}
await Task.Delay(5);
}
}
public async Task<string> GetSelectionJson(int locID)
{
// Add tire offer information to JSON
SelectionObject sel = new SelectionObject();
for (int index = 0; index < selectedTireOffers.Count; index++)
{
if (selectedTireOffers[index])
{
sel.tireOffers.Add(availableTireOffers[index].Item2, availableTireOffers[index].Item2.Split("_")[0]);
}
}
for (int index = 0; index < selectedServiceOffers.Count; index++)
{
if (selectedServiceOffers[index])
{
sel.serviceOffers.Add(availableServiceOffers[index].Item2, availableServiceOffers[index].Item2.Split("_")[0]);
}
}
sel.lastUpdated = DateTime.Now;
await Task.Delay(5);
return JsonConvert.SerializeObject(sel, Newtonsoft.Json.Formatting.Indented);
}
private async Task OnFinishHandler()
{
// Update database for selected location(s)
Dictionary<int, string> locSelections = new Dictionary<int, string>();
foreach (DatabaseDriver.Location item in locInfo)
{
if (locationState[item.LocationID])
{
var json = await GetSelectionJson(item.LocationID);
locSelections.Add(item.LocationID, json);
}
}
await DatabaseDriver.UpdateSelection(locSelections);
await SendEmailNotice(locSelections);
navigationManager.NavigateTo("/portal", true);
}
private async Task SendEmailNotice(Dictionary<int, string> locSelections)
{
using (var em = new kmCommonLibsCore.Emails())
{
em.Subject = "TireTargets Offers Updated";
em.AddAddress(kmCommonLibsCore.enuAddressType.From, "support@keymotive.us", "TireTargets");
em.AddAddress(kmCommonLibsCore.enuAddressType.To, "joshdeck@keymotive.net", "TireTargets Support");
string locationInfoJson = "";
foreach (var current in locSelections)
{
locationInfoJson += "Location ID: " + current.Key + "<br /><pre><code>" + current.Value + "</pre></code><br /><br /><br />";
}
em.HtmlBody = "<b>A customer has modified their selections:</b><br /><br />" + locationInfoJson;
try
{
em.Send();
}
catch (Exception e)
{
await Console.Out.WriteLineAsync("ERROR: " + e.Message);
}
}
}
private class SelectionObject
{
public SelectionObject()
{
tireOffers = new Dictionary<string, string>();
serviceOffers = new Dictionary<string, string>();
}
public Dictionary<string, string> tireOffers;
public Dictionary<string, string> serviceOffers;
public DateTime lastUpdated;
}
}
}

6
Components/Routes.razor Normal file
View File

@ -0,0 +1,6 @@
<Router AppAssembly="typeof(Program).Assembly">
<Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
<FocusOnNavigate RouteData="routeData" Selector="h1" />
</Found>
</Router>

13
Components/_Imports.razor Normal file
View File

@ -0,0 +1,13 @@
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using static Microsoft.AspNetCore.Components.Web.RenderMode
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using TireTargets
@using TireTargets.Components
@using Telerik.Blazor
@using Telerik.Blazor.Components
@using Telerik.SvgIcons

40
Program.cs Normal file
View File

@ -0,0 +1,40 @@
using TireTargets.Components;
namespace TireTargets
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddTelerikBlazor();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>()
.DisableAntiforgery()
.AddInteractiveServerRenderMode();
app.Run();
}
}
}

View File

@ -0,0 +1,23 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5146",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7219;http://localhost:5146",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

19
TireTargets.csproj Normal file
View File

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<Folder Include="wwwroot\include\instagram\cache\" />
<Folder Include="wwwroot\include\twitter\cache\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="kmCommonLibsCore" Version="2.0.0.136" />
<PackageReference Include="Telerik.UI.for.Blazor" Version="9.1.0" />
</ItemGroup>
</Project>

25
TireTargets.sln Normal file
View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.13.35931.197
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TireTargets", "TireTargets.csproj", "{2EBA5828-9E26-4F4B-9E4F-81DCA1D92CA0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{2EBA5828-9E26-4F4B-9E4F-81DCA1D92CA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2EBA5828-9E26-4F4B-9E4F-81DCA1D92CA0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2EBA5828-9E26-4F4B-9E4F-81DCA1D92CA0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2EBA5828-9E26-4F4B-9E4F-81DCA1D92CA0}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {2F3D2352-C4F9-4A13-8C9B-D602B76935AA}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

9
appsettings.json Normal file
View File

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

38
wwwroot/app.css Normal file
View File

@ -0,0 +1,38 @@
h1:focus {
outline: none;
}
.valid.modified:not([type=checkbox]) {
outline: 1px solid #26b050;
}
.invalid {
outline: 1px solid #e50000;
}
.validation-message {
color: #e50000;
}
.blazor-error-boundary {
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
padding: 1rem 1rem 1rem 3.7rem;
color: white;
}
.blazor-error-boundary::after {
content: "An error has occurred."
}
.darker-border-checkbox.form-check-input {
border-color: #929292;
}
.form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder {
color: var(--bs-secondary-color);
text-align: end;
}
.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
text-align: start;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 954 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

BIN
wwwroot/assets/growth.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

BIN
wwwroot/assets/mobile.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

4076
wwwroot/css/animate.css vendored Normal file

File diff suppressed because it is too large Load Diff

518
wwwroot/css/calendar.css Normal file
View File

@ -0,0 +1,518 @@
.fc-calendar-container {
position: relative;
width: 100%;
height: auto;
}
.fc-calendar {
width: 100%;
height: 100%;
}
.fc-calendar .fc-head {
background: #ccc;
color: #fff;
}
.fc-calendar .fc-body {
position: relative;
width: 100%;
height: 100%;
height: -moz-calc(100% - 30px);
height: -webkit-calc(100% - 30px);
height: calc(100% - 30px);
border: 1px solid #ddd;
}
.fc-calendar .fc-row {
width: 100%;
border-bottom: 1px solid #ddd;
}
.fc-four-rows .fc-row {
height: 25%;
}
.fc-five-rows .fc-row {
height: 20%;
}
.fc-six-rows .fc-row {
height: 16.66%;
height: -moz-calc(100%/6);
height: -webkit-calc(100%/6);
height: calc(100%/6);
}
.fc-calendar .fc-row > div,
.fc-calendar .fc-head > div {
display: inline-block;
height: 100%;
width: 14.28%; /* 100% / 7 */
width: -moz-calc(100%/7);
width: -webkit-calc(100%/7);
width: calc(100%/7);
position: relative;
}
/* IE 9 is rounding up the calc it seems */
.ie9 .fc-calendar .fc-row > div,
.ie9 .fc-calendar .fc-head > div {
width: 14.2%;
}
.fc-calendar .fc-row > div {
border-right: 1px solid #ddd;
padding: 4px;
overflow: hidden;
position: relative;
vertical-align: middle;
}
.fc-calendar .fc-head > div {
text-align: center;
}
.fc-calendar .fc-row > div > span.fc-date {
width: 30px;
height: 20px;
font-size: 20px;
line-height: 20px;
font-weight: 700;
color: #ddd;
text-shadow: 0 -1px 0 rgba(255,255,255,0.8);
bottom: 5px;
right: 5px;
text-align: right;
}
.fc-calendar .fc-starttime,
.fc-calendar .fc-endtime {
display: none;
}
.fc-calendar .fc-row > div > span.fc-weekday {
padding-left: 5px;
display: none;
}
.fc-calendar .fc-row > div.fc-today {
background: #fff4c3;
}
.fc-calendar .fc-row > div.fc-out {
opacity: 0.6;
}
.fc-calendar .fc-row > div:last-child,
.fc-calendar .fc-head > div:last-child {
border-right: none;
}
.fc-calendar .fc-row:last-child {
border-bottom: none;
}
/* Custom Events Calendar
-----------------------------------------------------------------*/
.events-calendar {
position: relative;
width: 100%;
height: auto;
}
.fc-calendar-container {
height: auto;
bottom: 0px;
width: 100%;
}
.events-calendar-header {
height: 50px;
position: relative;
}
.events-calendar-header h2,
.events-calendar-header h3 {
float: left;
text-shadow: none;
margin-bottom: 0;
}
.events-calendar-header h2 {
width: 60%;
}
.events-calendar-header h2 a,
.events-calendar-header h2 span {
font-size: 18px;
white-space: nowrap;
}
.events-calendar-header h3 {
width: 40%;
color: #666;
font-size: 20px;
text-align: right;
padding-top: 7px;
padding-right: 130px;
}
.events-calendar-header h3 span { color: #666; }
.events-calendar-header nav {
position: absolute;
right: 0;
top: 5px;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.events-calendar-header nav span {
float: left;
width: 30px;
height: 30px;
line-height: 30px;
position: relative;
color: transparent;
cursor: pointer;
background: #444;
margin: 0 1px;
font-size: 14px;
border-radius: 0 3px 3px 0;
box-shadow: none;
}
.events-calendar-header nav span:first-child {
border-radius: 3px 0 0 3px;
}
.events-calendar-header nav span:hover {
background: #222;
}
.events-calendar-header span i {
color: #FFF;
text-align: center;
width: 100%;
}
.events-calendar-header nav span:last-child {
margin-left: 20px;
border-radius: 3px;
}
.fc-calendar {
background: #F5F5F5;
width: 100%;
height: auto;
margin-top: 10px;
border-radius: 5px;
}
.fc-calendar .fc-head {
background: #444;
color: rgba(255,255,255,0.9);
box-shadow: inset 0 1px 0 rgba(255,255,255,0.2);
border-radius: 5px 5px 0 0;
height: 40px;
line-height: 40px;
padding: 0 20px;
}
.fc-calendar .fc-head > div {
font-weight: 300;
text-transform: uppercase;
font-size: 14px;
letter-spacing: 2px;
text-shadow: 0 1px 1px rgba(0,0,0,0.4);
}
.fc-calendar .fc-row > div > span.fc-date {
position: absolute;
color: #333;
text-shadow: none;
font-size: 28px;
font-weight: 300;
bottom: auto;
right: auto;
top: 10px;
left: 8px;
text-align: left;
text-shadow: none;
}
.fc-calendar .fc-body {
border: none;
height: 568px;
padding: 20px;
}
.fc-calendar .fc-row {
box-shadow: inset 0 -1px 0 #E5E5E5;
border: none;
}
.fc-calendar .fc-row:last-child {
box-shadow: none !important;
}
.fc-calendar .fc-row:first-child > div:first-child {
border-radius: 5px 0 0 0;
}
.fc-calendar .fc-row:first-child > div:last-child {
border-radius: 0 5px 0 0;
}
.fc-calendar .fc-row:last-child > div:first-child {
border-radius: 0 0 0 5px;
}
.fc-calendar .fc-row:last-child > div:last-child {
border-radius: 0 0 5px 0;
}
.fc-calendar .fc-row > div {
box-shadow: -1px 0 0 #E5E5E5;
border: none;
padding: 10px;
}
.fc-calendar .fc-row > div:first-child{
box-shadow: none !important;
}
.fc-calendar .fc-row > div.fc-today {
background: #1E73BE;
box-shadow: inset 0 0 100px rgba(255,255,255,0.2);
}
.fc-calendar .fc-row > div.fc-today > span.fc-date {
color: #FFF;
text-shadow: 1px 1px 1px rgba(0,0,0,0.2);
}
.fc-calendar .fc-row > div.fc-today:after {
content: '';
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0.2;
background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255, 255, 255, 0.15)), to(rgba(0, 0, 0, 0.25))), -webkit-gradient(linear, left top, right bottom, color-stop(0, rgba(255, 255, 255, 0)), color-stop(0.5, rgba(255, 255, 255, .15)), color-stop(0.501, rgba(255, 255, 255, 0)), color-stop(1, rgba(255, 255, 255, 0)));
background: -moz-linear-gradient(top, rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0.25)), -moz-linear-gradient(left top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0));
background: -o-linear-gradient(top, rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0.25)), -o-llinear-gradient(left top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0));
background: -ms-linear-gradient(top, rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0.25)), -ms-linear-gradient(left top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0));
background: linear-gradient(top, rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0.25)), linear-gradient(left top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0));
}
.fc-calendar .fc-row > div > div {
margin-top: 35px;
}
.fc-calendar .fc-row > div > div a,
.fc-calendar .fc-row > div > div span {
position: relative;
z-index: 1;
color: #FFF;
text-shadow: 1px 1px 1px rgba(0,0,0,0.1);
font-size: 12px;
display: inline-block;
padding: 3px 5px;
border-radius: 2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
margin-bottom: 1px;
background: #1E73BE;
-webkit-transition: background-color .3s ease-in-out;
-moz-transition: background-color .3s ease-in-out;
-ms-transition: background-color .3s ease-in-out;
-o-transition: background-color .3s ease-in-out;
transition: background-color .3s ease-in-out;
}
.fc-calendar .fc-row > div > div a:hover { background: #444 !important; }
.fc-calendar .fc-row > div.fc-today > div a,
.fc-calendar .fc-row > div.fc-today > div span {
color: #FFF;
background: rgba(255,255,255,0.2);
}
.dark .events-calendar-header h2,
.dark .events-calendar-header h3 {
text-shadow: 1px 1px 0 rgba(0,0,0,0.1);
}
.dark .events-calendar-header h2 { color: #FFF; }
.dark .events-calendar-header h2 a,
.dark .events-calendar-header h2 span { color: rgba(255,255,255,0.3); }
.dark .events-calendar-header h2 a { color: rgba(255,255,255,0.5); }
.dark .events-calendar-header h2 a:hover { color: rgba(255,255,255,0.9); }
.dark .events-calendar-header h3 {
color: #CCC;
color: rgba(255,255,255,0.6);
}
.dark .events-calendar-header h3 span { color: #CCC; }
.dark .events-calendar-header nav span {
background: rgba(255,255,255,0.3);
box-shadow: inset 0 1px rgba(255,255,255,0.2);
}
.dark .events-calendar-header nav span:hover { background: rgba(255,255,255,0.5); }
.dark .events-calendar-header span i { color: #FFF; }
.dark .fc-calendar { background: rgba(255,255,255,0.1); }
.dark .fc-calendar .fc-head {
background: rgba(255,255,255,0.2);
color: rgba(255,255,255,0.9);
box-shadow: inset 0 1px 0 rgba(255,255,255,0.2);
}
.dark .fc-calendar .fc-head > div { text-shadow: 0 1px 1px rgba(0,0,0,0.4); }
.dark .fc-calendar .fc-row > div > span.fc-date {
color: rgba(255,255,255,0.9);
text-shadow: 0 1px 1px rgba(0,0,0,0.3);
}
.dark .fc-calendar .fc-row { box-shadow: inset 0 -1px 0 rgba(255,255,255,0.10); }
.dark .fc-calendar .fc-row > div { box-shadow: -1px 0 0 rgba(255, 255, 255, 0.10); }
.dark .fc-calendar .fc-row > div.fc-today {
background: transparent;
box-shadow: inset 0 0 100px rgba(255,255,255,0.2);
}
.dark .fc-calendar .fc-row > div > div a,
.dark .fc-calendar .fc-row > div > div span {
color: rgba(255,255,255,0.7);
text-shadow: 1px 1px 1px rgba(0,0,0,0.1);
background: rgba(255,255,255,0.1);
}
.dark .fc-calendar .fc-row > div > div a:hover { background: rgba(255,255,255,0.3) !important; }
@media screen and (max-width: 991px) {
.events-calendar-header,
.events-calendar-header nav,
.events-calendar,
.fc-calendar-container,
.fc-calendar,
.fc-calendar .fc-head,
.fc-calendar .fc-row > div > span.fc-date {
position: relative;
top: auto;
left: auto;
bottom: auto;
right: auto;
height: auto;
width: auto;
}
.fc-calendar .fc-body { height: auto; }
.fc-calendar { margin: 20px 0; }
.events-calendar-header h2,
.events-calendar-header h3 {
float: none;
width: auto;
text-align: left;
padding: 0;
}
.fc-calendar .fc-row,
.ie9 .fc-calendar .fc-row > div,
.fc-calendar .fc-row > div {
height: auto;
width: 100%;
border: none;
}
.fc-calendar .fc-row > div {
float: none;
min-height: 50px;
box-shadow: inset 0 -1px #E5E5E5 !important;
border-radius: 0px !important;
}
.fc-calendar .fc-row > div:first-child { box-shadow: inset 0 -1px #E5E5E5 !important; }
.fc-calendar .fc-row > div:empty{
min-height: 0;
height: 0;
box-shadow: none !important;
padding: 0;
}
.fc-calendar .fc-row {
box-shadow: none;
}
.fc-calendar .fc-head {
display: none;
}
.fc-calendar .fc-row > div > div {
margin-top: 0px;
padding-left: 10px;
max-width: 68%;
display: inline-block;
}
.fc-calendar .fc-row > div.fc-today {
background: #1E73BE;
}
.fc-calendar .fc-row > div.fc-today:after {
display: none;
}
.fc-calendar .fc-row > div > span.fc-date {
width: 30px;
display: inline-block;
text-align: right;
}
.fc-calendar .fc-row > div > span.fc-weekday {
display: inline-block;
width: 40px;
color: #999;
font-size: 10px;
text-transform: uppercase;
}
.dark .fc-calendar .fc-row > div { box-shadow: inset 0 -1px rgba(255,255,255,0.2) !important; }
.dark .fc-calendar .fc-row > div.fc-today { background: rgba(255, 255, 255, 0.2); }
.dark .fc-calendar .fc-row > div > span.fc-weekday,
.fc-calendar .fc-row > div.fc-today > span.fc-weekday {
color: #fff;
color: rgba(255,255,255,0.7);
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,11 @@
/*!
* bootstrap-star-rating v4.1.0
* http://plugins.krajee.com/star-rating
*
* Author: Kartik Visweswaran
* Copyright: 2013 - 2021, Kartik Visweswaran, Krajee.com
*
* Licensed under the BSD 3-Clause
* https://github.com/kartik-v/bootstrap-star-rating/blob/master/LICENSE.md
*/
.rating-loading{width:25px;height:25px;font-size:0;color:#fff;background:top left no-repeat;border:none}.rating-container .rating-stars{position:relative;cursor:pointer;vertical-align:middle;display:inline-block;overflow:hidden;white-space:nowrap}.rating-container .rating-stars:focus{outline:dotted 1px}.rating-input{display:absolute;cursor:pointer;width:100%;height:1px;bottom:0;left:0;font-size:1px;border:none;background:0 0;opacity:0;padding:0;margin:0}.caption-badge,.rating-container .caption .label{line-height:1;text-align:center;border-radius:.25rem}.rating-container.is-display-only .rating-stars{cursor:default}.rating-disabled .rating-stars{cursor:not-allowed}.rating-container .star{display:inline-block;margin:0 2px;text-align:center}.rating-container .empty-stars{color:#aaa}.rating-container .filled-stars{position:absolute;left:0;top:0;margin:auto;color:#fde16d;white-space:nowrap;overflow:hidden;-webkit-text-stroke:1px #777;text-shadow:1px 1px #999}.rating-rtl{float:right}.rating-animate .filled-stars{transition:width .25s ease}.rating-rtl .filled-stars{left:auto;right:0;transition:none;-webkit-transform:matrix(-1,0,0,1,0,0);transform:matrix(-1,0,0,1,0,0)}.rating-rtl.is-star .filled-stars{right:.06em}.rating-rtl.is-heart .empty-stars{margin-right:.07em}.rating-container .clear-rating{color:#aaa;cursor:not-allowed;display:inline-block;vertical-align:middle;font-size:60%;padding-right:5px}.clear-rating-active{cursor:pointer!important}.clear-rating-active:hover{color:#843534}.rating-container .caption .label{display:inline-block;padding:.25em .4em;vertical-align:baseline}.rating-container .caption{color:#999;display:inline-block;vertical-align:middle;line-height:1;margin-left:5px;margin-right:0}.rating-rtl .caption{margin-right:5px;margin-left:0}@media print{.rating-container .clear-rating{display:none}}.rating-xl{font-size:48px}.rating-lg{font-size:40px}.rating-md{font-size:32px}.rating-sm{font-size:24px}.rating-xs{font-size:16px}.rating-xl .caption{font-size:20px}.rating-lg .caption{font-size:18px}.rating-md .caption{font-size:16px}.rating-sm .caption{font-size:14px}.rating-xs .caption{font-size:12px}.caption-badge{font-family:Arial,Helvetica,sans-serif;display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;color:#fff;white-space:nowrap;vertical-align:baseline}.caption-secondary{background-color:#6c757d}.caption-danger{background-color:#dc3545}.caption-warning{background-color:#ffc107;color:#212529}.caption-info{background-color:#0dcaf0;color:#212529}.caption-primary{background-color:#0d6efd}.caption-success{background-color:#198754}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,520 @@
/* ========================================================================
* bootstrap-switch - v3.3.2
* ====================================================================== */
.bootstrap-switch {
display: inline-block;
direction: ltr;
cursor: pointer;
border-radius: 2px;
border: 1px solid;
border-color: #CCC;
position: relative;
text-align: left;
overflow: hidden;
line-height: 8px;
z-index: 0;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
vertical-align: middle;
-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}
.bootstrap-switch .bootstrap-switch-container {
display: inline-block;
top: 0;
border-radius: 2px;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.bootstrap-switch .bootstrap-switch-handle-on,
.bootstrap-switch .bootstrap-switch-handle-off,
.bootstrap-switch .bootstrap-switch-label {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
cursor: pointer;
display: inline-block !important;
height: 100%;
padding: 6px 12px;
font-size: 14px;
line-height: 20px;
}
.bootstrap-switch .bootstrap-switch-handle-on,
.bootstrap-switch .bootstrap-switch-handle-off {
text-align: center;
z-index: 1;
}
.bootstrap-switch .bootstrap-switch-handle-on i,
.bootstrap-switch .bootstrap-switch-handle-off i {
position: relative;
font-size: 16px;
left: -1px;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary {
color: #fff;
background: #337ab7;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info {
color: #fff;
background: #5bc0de;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success {
color: #fff;
background: #5cb85c;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning {
background: #f0ad4e;
color: #fff;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger {
color: #fff;
background: #d9534f;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default {
color: #000;
background: #eeeeee;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-themecolor,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-themecolor {
color: #FFF;
background: #1ABC9C;
background: var(--themecolor);
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-black,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-black {
color: #FFF;
background: #000;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-white,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-white {
color: #000;
background: #F5F5F5;
}
.bootstrap-switch .bootstrap-switch-label {
text-align: center;
margin-top: -1px;
margin-bottom: -1px;
z-index: 100;
color: #333333;
background: #ffffff;
}
.bootstrap-switch .bootstrap-switch-handle-on {
border-bottom-left-radius: 1px;
border-top-left-radius: 1px;
}
.bootstrap-switch .bootstrap-switch-handle-off {
border-bottom-right-radius: 1px;
border-top-right-radius: 1px;
}
.bootstrap-switch input[type='radio'],
.bootstrap-switch input[type='checkbox'] {
position: absolute !important;
top: 0;
left: 0;
margin: 0;
z-index: -1;
opacity: 0;
filter: alpha(opacity=0);
}
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label {
padding: 1px 5px;
font-size: 12px;
line-height: 1.5;
}
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label {
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
}
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label {
padding: 6px 16px;
font-size: 18px;
line-height: 1.3333333;
}
.bootstrap-switch.bootstrap-switch-disabled,
.bootstrap-switch.bootstrap-switch-readonly,
.bootstrap-switch.bootstrap-switch-indeterminate { cursor: default !important; }
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label,
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label,
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: default !important;
}
.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container {
-webkit-transition: margin-left 0.2s ease;
-o-transition: margin-left 0.2s ease;
transition: margin-left 0.2s ease;
}
.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-on {
border-bottom-left-radius: 0;
border-top-left-radius: 0;
border-bottom-right-radius: 1px;
border-top-right-radius: 1px;
}
.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-off {
border-bottom-right-radius: 0;
border-top-right-radius: 0;
border-bottom-left-radius: 1px;
border-top-left-radius: 1px;
}
.bootstrap-switch.bootstrap-switch-focused {
outline: 0;
}
.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label,
.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-off .bootstrap-switch-label {
border-bottom-right-radius: 1px;
border-top-right-radius: 1px;
}
.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label,
.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-on .bootstrap-switch-label {
border-bottom-left-radius: 1px;
border-top-left-radius: 1px;
}
.bootstrap-switch-label:after {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 10px;
height: 3px;
margin-top: -2px;
margin-left: -5px;
display: inline-block;
border-top: 1px solid #DDD;
border-bottom: 1px solid #DDD;
}
/* --------------------------------------------------------------
SWITCH
-------------------------------------------------------------- */
.switch-toggle {
position: absolute;
margin-left: -9999px;
visibility: hidden;
}
.switch-toggle + label {
display: block;
position: relative;
cursor: pointer;
outline: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
/* --------------------------------------------------------------
SWITCH 1 - ROUND
----------------------------------------------------------------- */
input.switch-toggle-round + label {
padding: 2px;
width: 60px;
height: 30px;
background-color: #DDD;
-webkit-border-radius: 15px;
-o-border-radius: 15px;
border-radius: 15px;
}
input.switch-toggle-round + label:before,
input.switch-toggle-round + label:after {
display: block;
position: absolute;
top: 1px;
left: 1px;
bottom: 1px;
content: "";
}
input.switch-toggle-round + label:before {
right: 1px;
background-color: #F1F1F1;
-webkit-border-radius: 15px;
-o-border-radius: 15px;
border-radius: 15px;
-webkit-transition: background 0.4s;
-moz-transition: background 0.4s;
-o-transition: background 0.4s;
transition: background 0.4s;
}
input.switch-toggle-round + label:after {
width: 28px;
background-color: #FFF;
-webkit-border-radius: 100%;
-o-border-radius: 100%;
border-radius: 100%;
-webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
-moz-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
-webkit-transition: margin 0.4s;
-moz-transition: margin 0.4s;
-o-transition: margin 0.4s;
transition: margin 0.4s;
}
input.switch-toggle-round:checked + label:before {
background-color: #1ABC9C;
background-color: var(--themecolor);
}
input.switch-toggle-round:checked + label:after { margin-left: 30px; }
/* --------------------------------------------------------------
SWITCH 1 - ROUND- MINI
----------------------------------------------------------------- */
input.switch-rounded-mini.switch-toggle-round + label {
padding: 1px;
width: 32px;
height: 16px;
-webkit-border-radius: 8px;
-o-border-radius: 8px;
border-radius: 8px;
}
input.switch-rounded-mini.switch-toggle-round + label:before {
-webkit-border-radius: 8px;
-o-border-radius: 8px;
border-radius: 8px;
}
input.switch-rounded-mini.switch-toggle-round + label:after { width: 15px; }
input.switch-rounded-mini.switch-toggle-round:checked + label:after { margin-left: 15px; }
/* --------------------------------------------------------------
SWITCH 1 - ROUND- LARGE
----------------------------------------------------------------- */
input.switch-rounded-large.switch-toggle-round + label {
width: 90px;
height: 45px;
-webkit-border-radius: 45px;
-o-border-radius: 45px;
border-radius: 45px;
}
input.switch-rounded-large.switch-toggle-round + label:before {
-webkit-border-radius: 45px;
-o-border-radius: 45px;
border-radius: 45px;
}
input.switch-rounded-large.switch-toggle-round + label:after { width: 43px; }
input.switch-rounded-large.switch-toggle-round:checked + label:after { margin-left: 45px; }
/* --------------------------------------------------------------
SWITCH 1 - ROUND- XLARGE
----------------------------------------------------------------- */
input.switch-rounded-xlarge.switch-toggle-round + label {
width: 120px;
height: 60px;
-webkit-border-radius: 60px;
-o-border-radius: 60px;
border-radius: 60px;
}
input.switch-rounded-xlarge.switch-toggle-round + label:before {
-webkit-border-radius: 60px;
-o-border-radius: 60px;
border-radius: 60px;
}
input.switch-rounded-xlarge.switch-toggle-round + label:after { width: 58px; }
input.switch-rounded-xlarge.switch-toggle-round:checked + label:after { margin-left: 60px; }
/* -----------------------------------------------------------
SWITCH 2 - ROUND FLAT
-------------------------------------------------------------- */
input.switch-toggle-flat + label {
padding: 2px;
width: 60px;
height: 30px;
background-color: #DDD;
-webkit-border-radius: 30px;
-moz-border-radius: 30px;
-ms-border-radius: 30px;
-o-border-radius: 30px;
border-radius: 30px;
-webkit-transition: background 0.4s;
-moz-transition: background 0.4s;
-o-transition: background 0.4s;
transition: background 0.4s;
}
input.switch-toggle-flat + label:before,
input.switch-toggle-flat + label:after {
display: block;
position: absolute;
content: "";
}
input.switch-toggle-flat + label:before {
top: 2px;
left: 2px;
bottom: 2px;
right: 2px;
background-color: #FFF;
-webkit-border-radius: 30px;
-moz-border-radius: 30px;
-ms-border-radius: 30px;
-o-border-radius: 30px;
border-radius: 30px;
-webkit-transition: background 0.4s;
-moz-transition: background 0.4s;
-o-transition: background 0.4s;
transition: background 0.4s;
}
input.switch-toggle-flat + label:after {
top: 4px;
left: 4px;
bottom: 4px;
width: 22px;
background-color: #DDD;
-webkit-border-radius: 22px;
-moz-border-radius: 22px;
-ms-border-radius: 22px;
-o-border-radius: 22px;
border-radius: 22px;
-webkit-transition: margin 0.4s, background 0.4s;
-moz-transition: margin 0.4s, background 0.4s;
-o-transition: margin 0.4s, background 0.4s;
transition: margin 0.4s, background 0.4s;
}
input.switch-toggle-flat:checked + label {
background-color: #1ABC9C;
background-color: var(--themecolor);
}
input.switch-toggle-flat:checked + label:after {
margin-left: 30px;
background-color: #1ABC9C;
background-color: var(--themecolor);
}
/* -----------------------------------------------------------
SWITCH 2 - FLAT - MINI
-------------------------------------------------------------- */
input.switch-flat-mini.switch-toggle-flat + label {
padding: 1px;
width: 32px;
height: 16px;
-webkit-border-radius: 16px;
-o-border-radius: 16px;
border-radius: 16px;
}
input.switch-flat-mini.switch-toggle-flat + label:before {
top: 1px;
left: 1px;
bottom: 1px;
right: 1px;
-webkit-border-radius: 16px;
-o-border-radius: 16px;
border-radius: 16px;
}
input.switch-flat-mini.switch-toggle-flat + label:after {
top: 2px;
left: 2px;
bottom: 2px;
width: 12px;
-webkit-border-radius: 12px;
-o-border-radius: 12px;
border-radius: 12px;
}
input.switch-flat-mini.switch-toggle-flat:checked + label:after { margin-left: 16px; }
/* -----------------------------------------------------------
SWITCH 2 - FLAT - LARGE
-------------------------------------------------------------- */
input.switch-flat-large.switch-toggle-flat + label {
width: 90px;
height: 45px;
-webkit-border-radius: 45px;
-o-border-radius: 45px;
border-radius: 45px;
}
input.switch-flat-large.switch-toggle-flat + label:before {
-webkit-border-radius: 45px;
-o-border-radius: 45px;
border-radius: 45px;
}
input.switch-flat-large.switch-toggle-flat + label:after {
width: 37px;
-webkit-border-radius: 37px;
-o-border-radius: 37px;
border-radius: 37px;
}
input.switch-flat-large.switch-toggle-flat:checked + label:after { margin-left: 45px; }
/* -----------------------------------------------------------
SWITCH 2 - FLAT - XLARGE
-------------------------------------------------------------- */
input.switch-flat-xlarge.switch-toggle-flat + label {
padding: 2px;
width: 120px;
height: 60px;
-webkit-border-radius: 60px;
-o-border-radius: 60px;
border-radius: 60px;
}
input.switch-flat-xlarge.switch-toggle-flat + label:before {
-webkit-border-radius: 60px;
-o-border-radius: 60px;
border-radius: 60px;
}
input.switch-flat-xlarge.switch-toggle-flat + label:after {
width: 52px;
-webkit-border-radius: 52px;
-o-border-radius: 52px;
border-radius: 52px;
}
input.switch-flat-xlarge.switch-toggle-flat:checked + label:after { margin-left: 60px; }

View File

@ -0,0 +1,184 @@
/**
* bootstrap-switch - Turn checkboxes and radio buttons into toggle switches.
*
* @version v3.4 for Bootstrap 4.x
* @homepage https://bttstrp.github.io/bootstrap-switch
* @author Mattia Larentis <mattia@larentis.eu> (http://larentis.eu)
* & djibe
* @license Apache-2.0
*/
.bootstrap-switch {
display: inline-block;
direction: ltr;
cursor: pointer;
border-radius: 4px;
border: 1px solid #ccc;
position: relative;
text-align: left;
overflow: hidden;
line-height: 8px;
z-index: 0;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
vertical-align: middle;
-webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
}
.bootstrap-switch .bootstrap-switch-container {
display: inline-block;
top: 0;
border-radius: 4px;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.bootstrap-switch .bootstrap-switch-handle-on,
.bootstrap-switch .bootstrap-switch-handle-off,
.bootstrap-switch .bootstrap-switch-label {
-webkit-box-sizing: border-box;
box-sizing: border-box;
cursor: pointer;
display: table-cell;
vertical-align: middle;
padding: 6px 12px;
font-size: 14px;
line-height: 20px;
font-weight: 500;
}
.bootstrap-switch .bootstrap-switch-handle-on,
.bootstrap-switch .bootstrap-switch-handle-off {
text-align: center;
z-index: 1;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary {
background: #007bff;
color: #fff;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default {
background: #eee;
color: rgba(0, 0, 0, 0.87);
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-secondary,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-secondary {
background: #6c757d;
color: #fff;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info {
background: #17a2b8;
color: #fff;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success {
background: #28a745;
color: #fff;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning {
background: #ffc107;
color: #fff;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger {
background: #dc3545;
color: #fff;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-themecolor,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-themecolor {
color: #FFF;
background: var(--cnvs-themecolor);
border-color: transparent !important;
outline: 0 !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
}
.bootstrap-switch .bootstrap-switch-label {
text-align: center;
margin-top: -1px;
margin-bottom: -1px;
z-index: 100;
color: #333;
background: #fff;
padding: 8px 12px;
}
.bootstrap-switch span::before {
content: "\200b";
}
.bootstrap-switch .bootstrap-switch-handle-on {
border-bottom-left-radius: 3px;
border-top-left-radius: 3px;
}
.bootstrap-switch .bootstrap-switch-handle-off {
border-bottom-right-radius: 3px;
border-top-right-radius: 3px;
}
.bootstrap-switch input[type='radio'],
.bootstrap-switch input[type='checkbox'] {
position: absolute !important;
top: 0;
left: 0;
margin: 0;
z-index: -1;
opacity: 0;
filter: alpha(opacity=0);
visibility: hidden;
}
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label {
padding: 1px 5px;
font-size: 12px;
line-height: 1.5;
}
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label {
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
}
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label {
padding: 6px 16px;
font-size: 18px;
line-height: 1.3333333;
}
.bootstrap-switch.bootstrap-switch-disabled, .bootstrap-switch.bootstrap-switch-readonly, .bootstrap-switch.bootstrap-switch-indeterminate {
cursor: default !important;
}
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on, .bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on, .bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on, .bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off, .bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off, .bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off, .bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label, .bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label, .bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: default !important;
}
.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container {
-webkit-transition: margin-left 0.5s;
transition: margin-left 0.5s;
}
.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-on {
border-radius: 0 3px 3px 0;
}
.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-off {
border-radius: 3px 0 0 3px;
}
.bootstrap-switch.bootstrap-switch-focused {
border-color: #66afe9;
outline: 0;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
}
.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label, .bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-off .bootstrap-switch-label {
border-bottom-right-radius: 3px;
border-top-right-radius: 3px;
}
.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label, .bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-on .bootstrap-switch-label {
border-bottom-left-radius: 3px;
border-top-left-radius: 3px;
}

View File

@ -0,0 +1,341 @@
/* ========================================================================
Dark - timepicker.css
======================================================================== */
.dark .bootstrap-datetimepicker-widget.dropdown-menu.bottom:before { border-bottom: 7px solid #444; }
.dark .bootstrap-datetimepicker-widget.dropdown-menu.bottom:after { border-bottom-color: #222; }
.dark .bootstrap-datetimepicker-widget.dropdown-menu.top:before { border-top-color: #DDD; }
.dark .bootstrap-datetimepicker-widget.dropdown-menu.top:after { border-top-color: #222; }
.dark .bootstrap-datetimepicker-widget table th.disabled,
.dark .bootstrap-datetimepicker-widget table th.disabled:hover { color: #AAA; }
.dark .bootstrap-datetimepicker-widget table thead tr:first-child th:hover { background: #444; }
.dark .bootstrap-datetimepicker-widget table td.cw { color: #AAA; }
.dark .bootstrap-datetimepicker-widget table td.day:hover,
.dark .bootstrap-datetimepicker-widget table td.hour:hover,
.dark .bootstrap-datetimepicker-widget table td.minute:hover,
.dark .bootstrap-datetimepicker-widget table td.second:hover { background: #444; }
.dark .bootstrap-datetimepicker-widget table td.old,
.dark .bootstrap-datetimepicker-widget table td.new { color: #AAA; }
.dark .bootstrap-datetimepicker-widget table td.active,
.dark .bootstrap-datetimepicker-widget table td.active:hover { color: #222; }
.dark .bootstrap-datetimepicker-widget table td.active.today:before { border-bottom-color: #222; }
.dark .bootstrap-datetimepicker-widget table td.disabled,
.dark .bootstrap-datetimepicker-widget table td.disabled:hover { color: #AAA; }
.dark .bootstrap-datetimepicker-widget table td span:hover { background: #444; }
.dark .bootstrap-datetimepicker-widget table td span.active { color: #222; }
.dark .bootstrap-datetimepicker-widget table td span.old { color: #AAA; }
.dark .bootstrap-datetimepicker-widget table td span.disabled,
.dark .bootstrap-datetimepicker-widget table td span.disabled:hover { color: #AAA; }
/* ========================================================================
select-boxes.css
======================================================================== */
.dark .select2-dropdown {
background-color: #333;
border-color: #555;
}
.dark .select2-close-mask { background-color: #333; }
.dark .select2-container--default .select2-selection--single {
background-color: #333;
border-color: #555;
}
.dark .select2-container--default .select2-selection--single .select2-selection__rendered { color: #EEE; }
.dark .select2-container--default .select2-selection--single .select2-selection__placeholder { color: #999; }
.dark .select2-container--default .select2-selection--multiple {
background-color: #333;
border-color: #555;
}
.dark .select2-container--default .select2-selection--multiple .select2-selection__placeholder { color: #999; }
.dark .select2-container--default .select2-selection--multiple .select2-selection__choice {
background-color: #444;
border-color: #555;
}
.dark .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { color: #999; }
.dark .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { color: #EEE; }
.dark .select2-container--default.select2-container--disabled .select2-selection--multiple { background-color: #444; }
.dark .select2-container--default .select2-search--dropdown .select2-search__field {
border-color: #555;
background-color: #555;
color: #EEE;
}
.dark .select2-container--default .select2-results__option[aria-disabled=true] { color: #999; }
.dark .select2-container--default .select2-results__option[aria-selected=true] { background-color: #444; }
.dark .select2-container--default .select2-results__option--highlighted[aria-selected] {
background-color: #5897fb;
color: #EEE; }
.dark .select2-container--classic .select2-selection--single {
background-color: #444;
border-color: #555;
background-image: -webkit-linear-gradient(top, white 50%, #444 100%);
background-image: -o-linear-gradient(top, white 50%, #444 100%);
background-image: linear-gradient(to bottom, white 50%, #444 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#44444444', endColorstr='#44EEEEEE', GradientType=0);
}
.dark .select2-container--classic .select2-selection--single:focus { border: 1px solid #5897fb; }
.dark .select2-container--classic .select2-selection--single .select2-selection__rendered { color: #444; }
.dark .select2-container--classic .select2-selection--single .select2-selection__placeholder { color: #999; }
.dark .select2-container--classic .select2-selection--single .select2-selection__arrow {
background-color: #444;
border-left-color: #555;
background-image: -webkit-linear-gradient(top, #444 50%, #444 100%);
background-image: -o-linear-gradient(top, #444 50%, #444 100%);
background-image: linear-gradient(to bottom, #444 50%, #444 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#44EEEEEE', endColorstr='#44CCCCCC', GradientType=0);
}
.dark .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { border-right-color: #555; }
.dark .select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
background-image: -webkit-linear-gradient(top, white 0%, #444 50%);
background-image: -o-linear-gradient(top, white 0%, #444 50%);
background-image: linear-gradient(to bottom, white 0%, #444 50%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#44444444', endColorstr='#44EEEEEE', GradientType=0);
}
.dark .select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
background-image: -webkit-linear-gradient(top, #444 50%, white 100%);
background-image: -o-linear-gradient(top, #444 50%, white 100%);
background-image: linear-gradient(to bottom, #444 50%, white 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#44EEEEEE', endColorstr='#444', GradientType=0);
}
.dark .select2-container--classic .select2-selection--multiple {
background-color: #333;
border-color: #555;
}
.dark .select2-container--classic .select2-selection--multiple:focus { border-color: #5897fb; }
.dark .select2-container--classic .select2-selection--multiple .select2-selection__choice {
background-color: #444;
border-color: #555;
}
.dark .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { color: #EEE; }
.dark .select2-container--classic .select2-search--dropdown .select2-search__field { border-color: #555; }
.dark .select2-container--classic .select2-dropdown { background-color: #333;}
.dark .select2-container--classic .select2-results__option[aria-disabled=true] { color: #444; }
.dark .select2-container--classic .select2-results__option--highlighted[aria-selected] { color: #333; }
.dark .select2-container--default.select2-container--disabled .select2-selection--single { background-color: rgba(255,255,255,0.1); }
/* ========================================================================
radio-checkbox.css
======================================================================== */
.dark .checkbox-style-1-label:before,
.dark .radio-style-1-label:before,
.dark .checkbox-style-2-label:before,
.dark .radio-style-2-label:before,
.dark .checkbox-style-3-label:before,
.dark .radio-style-3-label:before {
background: #333;
border-color: #444;
}
.dark .radio-style:checked + .radio-style-1-label:before { background: #CCC; }
/* Checkbox-small + Radio-small */
.dark .checkbox-style-1-label.checkbox-small:before,
.dark .radio-style-1-label.radio-small:before,
.dark .checkbox-style-2-label.checkbox-small:before,
.dark .radio-style-2-label.radio-small:before,
.dark .checkbox-style-3-label.checkbox-small:before,
.dark .radio-style-3-label.radio-small:before { border-color: #444; }
/* Style-2 */
.dark .checkbox-style:checked + .checkbox-style-2-label:before { box-shadow: inset 0px 0px 0px 4px #000; }
.dark .radio-style:checked + .radio-style-2-label:before {
background: #CCC;
box-shadow: inset 0px 0px 0px 4px #333;
}
.dark .checkbox-style:checked + .checkbox-style-2-label.checkbox-small:before { box-shadow: inset 0px 0px 0px 2px #000; }
.dark .radio-style:checked + .radio-style-2-label.radio-small:before { box-shadow: inset 0px 0px 0px 2px #000; }
/* style-3 */
.dark .checkbox-style:checked + .checkbox-style-3-label:before,
.dark .radio-style:checked + .radio-style-3-label:before { color: #222; }
.dark .radio-style:checked + .radio-style-3-label:before {
color: #CCC;
border-color: #CCC;
}
/* style-3 - Small */
.dark .checkbox-style + .checkbox-style-3-label.checkbox-small:before,
.dark .radio-style + .radio-style-3-label.radio-small:before { border-color: #555; }
/* ========================================================================
ion.rangeslider.css
======================================================================== */
.dark .irs-bar-edge,
.dark .irs-line-mid,
.dark .irs-line-left,
.dark .irs-line-right { background-color: #444; }
/*========================================================================
daterangepicker.css
======================================================================== */
.dark .daterangepicker { background: #222; }
.dark .daterangepicker.opensleft:before {
border-bottom-color: #444;
border-bottom-color: rgba(255, 255, 255, 0.2);
}
.dark .daterangepicker.opensleft:after {
border-bottom-color: #555;
border-left-color: transparent;
}
.dark .daterangepicker.openscenter:before {
border-bottom-color: #444;
border-left-color: transparent;
border-bottom-color: rgba(0, 0, 0, 0.2);
}
.dark .daterangepicker.openscenter:after {
border-bottom-color: #222;
border-left-color: transparent;
}
.dark .daterangepicker.opensright:before {
border-bottom-color: #444;
border-left-color: transparent;
border-bottom-color: rgba(0, 0, 0, 0.2);
}
.dark .daterangepicker.opensright:after {
border-bottom-color: #222;
border-left-color: transparent;
}
.dark .daterangepicker.dropup:before{ border-top-color: #444; }
.dark .daterangepicker.dropup:after{ border-top-color: #222; }
.dark .daterangepicker .calendar-table {
border-color: #444;
background: #222;
}
.dark .daterangepicker td.off, .dark .daterangepicker td.off.in-range, .dark .daterangepicker td.off.start-date, .dark .daterangepicker td.off.end-date {
color: #999;
background: #222;
}
.dark .daterangepicker td.disabled, .dark .daterangepicker option.disabled { color: #999; }
.dark .daterangepicker td.available:hover, .dark .daterangepicker th.available:hover { background: #555; }
.dark .daterangepicker td.in-range {
background: #444;
border-radius: 0;
}
.dark .daterangepicker td.active, .dark .daterangepicker td.active:hover {
background-color: #357ebd;
border-color: #3071a9;
color: #EEE;
}
.dark .daterangepicker td.week, .dark .daterangepicker th.week { color: #444; }
.dark .reportrange { border-color: #444 !important; }
/* Text Input Above Each Calendar */
.dark .daterangepicker .input-mini {
border-color: #444;
color: #555;
}
.dark .daterangepicker .input-mini.active { border-color: #357ebd; }
.dark .daterangepicker .calendar-time select.disabled { color: #444; }
.daterangepicker .daterangepicker_input i { color: #333; }
/* Predefined Ranges */
.dark .daterangepicker .ranges li {
background: #333;
border-color: #333;
color: #EEE;
}
.dark .daterangepicker .ranges li.active, .dark .daterangepicker .ranges li:hover {
background: #08c;
border-color: #08c;
color: #EEE;
}
.dark .input-daterange .input-group-addon {
background-color: #222;
border-color: #111;
text-shadow: none;
}
/* ========================================================================
* bs-switches.css
* ====================================================================== */
.dark .bootstrap-switch { border-color: #444; }
.dark .bootstrap-switch .bootstrap-switch-label {
color: #EEE;
background: #222;
}
.dark .bootstrap-switch-label:after {
border-top-color: #444;
border-bottom-color: #444;
}
/* Switches
-------------------------------------------------------------- */
.dark input.switch-toggle-round + label { background-color: #444; }
.dark input.switch-toggle-round + label:before,
.dark input.switch-toggle-flat + label:before { background-color: #222; }
.dark input.switch-toggle-flat + label,
.dark input.switch-toggle-flat + label:after { background-color: #AAA; }
.dark input.switch-toggle-round + label:after {
background-color: #AAA;
-webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.8);
-moz-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.8);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.8);
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,410 @@
.daterangepicker {
position: absolute;
color: inherit;
background-color: #fff;
border-radius: 4px;
border: 1px solid #ddd;
width: 278px;
max-width: none;
padding: 0;
margin-top: 7px;
top: 100px;
left: 20px;
z-index: 3001;
display: none;
font-family: arial;
font-size: 15px;
line-height: 1em;
}
.daterangepicker:before, .daterangepicker:after {
position: absolute;
display: inline-block;
border-bottom-color: rgba(0, 0, 0, 0.2);
content: '';
}
.daterangepicker:before {
top: -7px;
border-right: 7px solid transparent;
border-left: 7px solid transparent;
border-bottom: 7px solid #ccc;
}
.daterangepicker:after {
top: -6px;
border-right: 6px solid transparent;
border-bottom: 6px solid #fff;
border-left: 6px solid transparent;
}
.daterangepicker.opensleft:before {
right: 9px;
}
.daterangepicker.opensleft:after {
right: 10px;
}
.daterangepicker.openscenter:before {
left: 0;
right: 0;
width: 0;
margin-left: auto;
margin-right: auto;
}
.daterangepicker.openscenter:after {
left: 0;
right: 0;
width: 0;
margin-left: auto;
margin-right: auto;
}
.daterangepicker.opensright:before {
left: 9px;
}
.daterangepicker.opensright:after {
left: 10px;
}
.daterangepicker.drop-up {
margin-top: -7px;
}
.daterangepicker.drop-up:before {
top: initial;
bottom: -7px;
border-bottom: initial;
border-top: 7px solid #ccc;
}
.daterangepicker.drop-up:after {
top: initial;
bottom: -6px;
border-bottom: initial;
border-top: 6px solid #fff;
}
.daterangepicker.single .daterangepicker .ranges, .daterangepicker.single .drp-calendar {
float: none;
}
.daterangepicker.single .drp-selected {
display: none;
}
.daterangepicker.show-calendar .drp-calendar {
display: block;
}
.daterangepicker.show-calendar .drp-buttons {
display: block;
}
.daterangepicker.auto-apply .drp-buttons {
display: none;
}
.daterangepicker .drp-calendar {
display: none;
max-width: 270px;
}
.daterangepicker .drp-calendar.left {
padding: 8px 0 8px 8px;
}
.daterangepicker .drp-calendar.right {
padding: 8px;
}
.daterangepicker .drp-calendar.single .calendar-table {
border: none;
}
.daterangepicker .calendar-table .next span, .daterangepicker .calendar-table .prev span {
color: #fff;
border: solid black;
border-width: 0 2px 2px 0;
border-radius: 0;
display: inline-block;
padding: 3px;
}
.daterangepicker .calendar-table .next span {
transform: rotate(-45deg);
-webkit-transform: rotate(-45deg);
}
.daterangepicker .calendar-table .prev span {
transform: rotate(135deg);
-webkit-transform: rotate(135deg);
}
.daterangepicker .calendar-table th, .daterangepicker .calendar-table td {
white-space: nowrap;
text-align: center;
vertical-align: middle;
min-width: 32px;
width: 32px;
height: 24px;
line-height: 24px;
font-size: 12px;
border-radius: 4px;
border: 1px solid transparent;
white-space: nowrap;
cursor: pointer;
}
.daterangepicker .calendar-table {
border: 1px solid #fff;
border-radius: 4px;
background-color: #fff;
}
.daterangepicker .calendar-table table {
width: 100%;
margin: 0;
border-spacing: 0;
border-collapse: collapse;
}
.daterangepicker td.available:hover, .daterangepicker th.available:hover {
background-color: #eee;
border-color: transparent;
color: inherit;
}
.daterangepicker td.week, .daterangepicker th.week {
font-size: 80%;
color: #ccc;
}
.daterangepicker td.off, .daterangepicker td.off.in-range, .daterangepicker td.off.start-date, .daterangepicker td.off.end-date {
background-color: #fff;
border-color: transparent;
color: #999;
}
.daterangepicker td.in-range {
background-color: #ebf4f8;
border-color: transparent;
color: #000;
border-radius: 0;
}
.daterangepicker td.start-date {
border-radius: 4px 0 0 4px;
}
.daterangepicker td.end-date {
border-radius: 0 4px 4px 0;
}
.daterangepicker td.start-date.end-date {
border-radius: 4px;
}
.daterangepicker td.active, .daterangepicker td.active:hover {
background-color: #357ebd;
border-color: transparent;
color: #fff;
}
.daterangepicker th.month {
width: auto;
}
.daterangepicker td.disabled, .daterangepicker option.disabled {
color: #999;
cursor: not-allowed;
text-decoration: line-through;
}
.daterangepicker select.monthselect, .daterangepicker select.yearselect {
font-size: 12px;
padding: 1px;
height: auto;
margin: 0;
cursor: default;
}
.daterangepicker select.monthselect {
margin-right: 2%;
width: 56%;
}
.daterangepicker select.yearselect {
width: 40%;
}
.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect {
width: 50px;
margin: 0 auto;
background: #eee;
border: 1px solid #eee;
padding: 2px;
outline: 0;
font-size: 12px;
}
.daterangepicker .calendar-time {
text-align: center;
margin: 4px auto 0 auto;
line-height: 30px;
position: relative;
}
.daterangepicker .calendar-time select.disabled {
color: #ccc;
cursor: not-allowed;
}
.daterangepicker .drp-buttons {
clear: both;
text-align: right;
padding: 8px;
border-top: 1px solid #ddd;
display: none;
line-height: 12px;
vertical-align: middle;
}
.daterangepicker .drp-selected {
display: inline-block;
font-size: 12px;
padding-right: 8px;
}
.daterangepicker .drp-buttons .btn {
margin-left: 8px;
font-size: 12px;
font-weight: bold;
padding: 4px 8px;
}
.daterangepicker.show-ranges.single.rtl .drp-calendar.left {
border-right: 1px solid #ddd;
}
.daterangepicker.show-ranges.single.ltr .drp-calendar.left {
border-left: 1px solid #ddd;
}
.daterangepicker.show-ranges.rtl .drp-calendar.right {
border-right: 1px solid #ddd;
}
.daterangepicker.show-ranges.ltr .drp-calendar.left {
border-left: 1px solid #ddd;
}
.daterangepicker .ranges {
float: none;
text-align: left;
margin: 0;
}
.daterangepicker.show-calendar .ranges {
margin-top: 8px;
}
.daterangepicker .ranges ul {
list-style: none;
margin: 0 auto;
padding: 0;
width: 100%;
}
.daterangepicker .ranges li {
font-size: 12px;
padding: 8px 12px;
cursor: pointer;
}
.daterangepicker .ranges li:hover {
background-color: #eee;
}
.daterangepicker .ranges li.active {
background-color: #08c;
color: #fff;
}
/* Larger Screen Styling */
@media (min-width: 564px) {
.daterangepicker {
width: auto;
}
.daterangepicker .ranges ul {
width: 140px;
}
.daterangepicker.single .ranges ul {
width: 100%;
}
.daterangepicker.single .drp-calendar.left {
clear: none;
}
.daterangepicker.single .ranges, .daterangepicker.single .drp-calendar {
float: left;
}
.daterangepicker {
direction: ltr;
text-align: left;
}
.daterangepicker .drp-calendar.left {
clear: left;
margin-right: 0;
}
.daterangepicker .drp-calendar.left .calendar-table {
border-right: none;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.daterangepicker .drp-calendar.right {
margin-left: 0;
}
.daterangepicker .drp-calendar.right .calendar-table {
border-left: none;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.daterangepicker .drp-calendar.left .calendar-table {
padding-right: 8px;
}
.daterangepicker .ranges, .daterangepicker .drp-calendar {
float: left;
}
}
@media (min-width: 730px) {
.daterangepicker .ranges {
width: auto;
}
.daterangepicker .ranges {
float: left;
}
.daterangepicker.rtl .ranges {
float: right;
}
.daterangepicker .drp-calendar.left {
clear: none !important;
}
}

View File

@ -0,0 +1,269 @@
/* Ion.RangeSlider
// css version 2.0.3
// © 2013-2014 Denis Ineshin | IonDen.com
// ===================================================================================================================*/
/* =====================================================================================================================
// RangeSlider */
.irs {
position: relative; display: block;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.irs-line {
position: relative; display: block;
overflow: hidden;
outline: none !important;
}
.irs-line-left, .irs-line-mid, .irs-line-right {
position: absolute; display: block;
top: 0;
}
.irs-line-left {
left: 0; width: 11%;
}
.irs-line-mid {
left: 9%; width: 82%;
}
.irs-line-right {
right: 0; width: 11%;
}
.irs-bar {
position: absolute; display: block;
left: 0; width: 0;
}
.irs-bar-edge {
position: absolute; display: block;
top: 0; left: 0;
}
.irs-shadow {
position: absolute; display: none;
left: 0; width: 0;
}
.irs-slider {
position: absolute; display: block;
cursor: pointer;
z-index: 1;
}
.irs-slider.single {
}
.irs-slider.from {
}
.irs-slider.to {
}
.irs-slider.type_last {
z-index: 2;
}
.irs-min {
position: absolute; display: block;
left: 0;
cursor: default;
}
.irs-max {
position: absolute; display: block;
right: 0;
cursor: default;
}
.irs-from, .irs-to, .irs-single {
position: absolute; display: block;
top: 0; left: 0;
cursor: default;
white-space: nowrap;
}
.irs-grid {
position: absolute; display: none;
bottom: 0; left: 0;
width: 100%; height: 20px;
}
.irs-with-grid .irs-grid {
display: block;
}
.irs-grid-pol {
position: absolute;
top: 0; left: 0;
width: 1px; height: 8px;
background: #000;
}
.irs-grid-pol.small {
height: 4px;
}
.irs-grid-text {
position: absolute;
bottom: 0; left: 0;
white-space: nowrap;
text-align: center;
font-size: 9px; line-height: 9px;
padding: 0 3px;
color: #000;
}
.irs-disable-mask {
position: absolute; display: block;
top: 0; left: -1%;
width: 102%; height: 100%;
cursor: default;
background: rgba(0,0,0,0.0);
z-index: 2;
}
.lt-ie9 .irs-disable-mask {
background: #000;
filter: alpha(opacity=0);
cursor: not-allowed;
}
.irs-disabled {
opacity: 0.4;
}
.irs-hidden-input {
position: absolute !important;
display: block !important;
top: 0 !important;
left: 0 !important;
width: 0 !important;
height: 0 !important;
font-size: 0 !important;
line-height: 0 !important;
padding: 0 !important;
margin: 0 !important;
outline: none !important;
z-index: -9999 !important;
background: none !important;
border-style: solid !important;
border-color: transparent !important;
}
/* Ion.RangeSlider, Nice Skin
// css version 2.0.3
// © Denis Ineshin, 2014 https://github.com/IonDen
// ===================================================================================================================*/
/* =====================================================================================================================
// Skin details */
.irs-slider {
background: url(rangeslider/sprite-skin-nice.png) repeat-x;
}
.irs-bar-edge,
.irs-line-mid,
.irs-line-left,
.irs-line-right {
background-color: #EEE;
border-radius: 100px;
}
.irs {
height: 40px;
}
.irs-with-grid {
height: 60px;
}
.irs-line {
height: 8px; top: 25px;
}
.irs-line-left {
height: 8px;
background-position: 0 -30px;
}
.irs-line-mid {
height: 8px;
background-position: 0 0;
}
.irs-line-right {
height: 8px;
background-position: 100% -30px;
}
.irs-bar {
height: 8px;
top: 25px;
background-color: #1ABC9C;
background-color: var(--themecolor);
border-radius: 100px
}
.irs-bar-edge {
top: 25px;
height: 8px;
width: 11px;
background-position: 0 -90px;
}
.irs-shadow {
height: 8px;
top: 25px;
background: rgba(0,0,0,0.9);
opacity: 0.15;
}
.lt-ie9 .irs-shadow {
filter: alpha(opacity=15);
}
.irs-slider {
width: 22px; height: 22px;
top: 17px;
background-position: 0 -120px;
}
.irs-min, .irs-max {
color: #999;
font-size: 11px;
line-height: 1.333;
text-shadow: none;
top: -8px;
padding: 3px;
background: rgba(0,0,0,0.05);
-moz-border-radius: 2px;
border-radius: 2px;
}
.irs-from, .irs-to, .irs-single {
color: #FFF;
top: -8px;
font-size: 11px;
line-height: 1.333;
text-shadow: none;
padding: 3px;
background: #1ABC9C;
background: var(--themecolor);
-moz-border-radius: 2px;
border-radius: 2px;
}
.irs-from:after, .irs-single:after, .irs-to:after {
content: "";
position: absolute;
display: block;
bottom: -6px;
left: 50%;
width: 0;
height: 0;
margin-left: -3px;
overflow: hidden;
border: 3px solid transparent;
border-top-color: #1ABC9C;
border-top-color: var(--themecolor);
}
.lt-ie9 .irs-from, .lt-ie9 .irs-to, .lt-ie9 .irs-single { background: #DDD; }
.irs-grid-pol { background: #AAA; }
.irs-grid-text { color: #AAA }
.irs-disabled { }

View File

@ -0,0 +1,691 @@
@charset "UTF-8";
/**
Ion.RangeSlider, 2.3.1
© Denis Ineshin, 2010 - 2019, IonDen.com
Build date: 2019-12-19 16:51:02
*/
.irs {
--cnvs-range-slider-top: 25px;
--cnvs-range-slider-bottom: 16px;
--cnvs-range-slider-line_height: 12px;
--cnvs-range-slider-handle_width: 16px;
--cnvs-range-slider-handle_height: 18px;
--cnvs-range-slider-custom_radius: 4px;
--cnvs-range-slider-line_color: var(--cnvs-contrast-200);
--cnvs-range-slider-bar_color: var(--cnvs-themecolor);
--cnvs-range-slider-handle_color_1: var(--cnvs-range-slider-bar_color);
--cnvs-range-slider-handle_color_2: var(--cnvs-contrast-500);
--cnvs-range-slider-minmax_text_color: var(--cnvs-contrast-600);
--cnvs-range-slider-minmax_bg_color: var(--cnvs-range-slider-line_color);
--cnvs-range-slider-label_color_1: var(--cnvs-range-slider-bar_color);
--cnvs-range-slider-label_color_2: white;
--cnvs-range-slider-grid_color_1: var(--cnvs-range-slider-line_color);
--cnvs-range-slider-grid_color_2: var(--cnvs-range-slider-minmax_text_color);
position: relative;
display: block;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
font-size: 12px;
font-family: Arial, sans-serif;
}
.irs-line {
position: relative;
display: block;
overflow: hidden;
outline: none !important;
}
.irs-bar {
position: absolute;
display: block;
left: 0;
width: 0;
}
.irs-shadow {
position: absolute;
display: none;
left: 0;
width: 0;
}
.irs-handle {
position: absolute;
display: block;
box-sizing: border-box;
cursor: default;
z-index: 1;
}
.irs-handle.type_last {
z-index: 2;
}
.irs-min, .irs-max {
position: absolute;
display: block;
cursor: default;
}
.irs-min {
left: 0;
}
.irs-max {
right: 0;
}
.irs-from, .irs-to, .irs-single {
position: absolute;
display: block;
top: 0;
left: 0;
cursor: default;
white-space: nowrap;
}
.irs-grid {
position: absolute;
display: none;
bottom: 0;
left: 0;
width: 100%;
height: 20px;
}
.irs-with-grid .irs-grid {
display: block;
}
.irs-grid-pol {
position: absolute;
top: 0;
left: 0;
width: 1px;
height: 8px;
background: #000;
}
.irs-grid-pol.small {
height: 4px;
}
.irs-grid-text {
position: absolute;
bottom: 0;
left: 0;
white-space: nowrap;
text-align: center;
font-size: 9px;
line-height: 9px;
padding: 0 3px;
color: #000;
}
.irs-disable-mask {
position: absolute;
display: block;
top: 0;
left: -1%;
width: 102%;
height: 100%;
cursor: default;
background: rgba(0, 0, 0, 0);
z-index: 2;
}
.lt-ie9 .irs-disable-mask {
background: #000;
filter: alpha(opacity=0);
cursor: not-allowed;
}
.irs-disabled {
opacity: 0.4;
}
.irs-hidden-input {
position: absolute !important;
display: block !important;
top: 0 !important;
left: 0 !important;
width: 0 !important;
height: 0 !important;
font-size: 0 !important;
line-height: 0 !important;
padding: 0 !important;
margin: 0 !important;
overflow: hidden;
outline: none !important;
z-index: -9999 !important;
background: none !important;
border-style: solid !important;
border-color: transparent !important;
}
.irs--flat {
height: 40px;
}
.irs--flat.irs-with-grid {
height: 60px;
}
.irs--flat .irs-line {
top: var(--cnvs-range-slider-top);
height: var(--cnvs-range-slider-line_height);
background-color: var(--cnvs-range-slider-line_color);
border-radius: var(--cnvs-range-slider-custom_radius);
}
.irs--flat .irs-bar {
top: var(--cnvs-range-slider-top);
height: var(--cnvs-range-slider-line_height);
background-color: var(--cnvs-range-slider-bar_color);
}
.irs--flat .irs-bar--single {
border-radius: var(--cnvs-range-slider-custom_radius) 0 0 var(--cnvs-range-slider-custom_radius);
}
.irs--flat .irs-shadow {
height: 1px;
bottom: var(--cnvs-range-slider-bottom);
background-color: var(--cnvs-range-slider-line_color);
}
.irs--flat .irs-handle {
top: 22px;
width: var(--cnvs-range-slider-handle_width);
height: var(--cnvs-range-slider-handle_height);
background-color: transparent;
}
.irs--flat .irs-handle > i:first-child {
position: absolute;
display: block;
top: 0;
left: 50%;
width: 2px;
height: 100%;
margin-left: -1px;
background-color: var(--cnvs-range-slider-handle_color_1);
}
.irs--flat .irs-handle.state_hover > i:first-child, .irs--flat .irs-handle:hover > i:first-child {
background-color: var(--cnvs-range-slider-handle_color_2);
}
.irs--flat .irs-min,
.irs--flat .irs-max {
top: 0;
padding: 1px 3px;
color: var(--cnvs-range-slider-minmax_text_color);
font-size: 10px;
line-height: 1.333;
text-shadow: none;
background-color: var(--cnvs-range-slider-minmax_bg_color);
border-radius: var(--cnvs-range-slider-custom_radius);
}
.irs--flat .irs-from,
.irs--flat .irs-to,
.irs--flat .irs-single {
color: var(--cnvs-range-slider-label_color_2);
font-size: 10px;
line-height: 1.333;
text-shadow: none;
padding: 1px 5px;
background-color: var(--cnvs-range-slider-label_color_1);
border-radius: var(--cnvs-range-slider-custom_radius);
}
.irs--flat .irs-from:before,
.irs--flat .irs-to:before,
.irs--flat .irs-single:before {
position: absolute;
display: block;
content: "";
bottom: -6px;
left: 50%;
width: 0;
height: 0;
margin-left: -3px;
overflow: hidden;
border: 3px solid transparent;
border-top-color: var(--cnvs-range-slider-label_color_1);
}
.irs--flat .irs-grid-pol {
background-color: var(--cnvs-range-slider-grid_color_1);
}
.irs--flat .irs-grid-text {
color: var(--cnvs-range-slider-grid_color_2);
}
.irs--big {
height: 55px;
}
.irs--big.irs-with-grid {
height: 70px;
}
.irs--big .irs-line {
top: 33px;
height: 12px;
background-color: white;
background: linear-gradient(to bottom, #ddd -50%, white 150%);
border: 1px solid #ccc;
border-radius: 12px;
}
.irs--big .irs-bar {
top: 33px;
height: 12px;
background-color: #92bce0;
border: 1px solid #428bca;
background: linear-gradient(to bottom, #ffffff 0%, #428bca 30%, #b9d4ec 100%);
box-shadow: inset 0 0 1px 1px rgba(255, 255, 255, 0.5);
}
.irs--big .irs-bar--single {
border-radius: 12px 0 0 12px;
}
.irs--big .irs-shadow {
height: 1px;
bottom: 16px;
background-color: rgba(66, 139, 202, 0.5);
}
.irs--big .irs-handle {
top: 25px;
width: 30px;
height: 30px;
border: 1px solid rgba(0, 0, 0, 0.3);
background-color: #cbcfd5;
background: linear-gradient(to bottom, white 0%, #B4B9BE 30%, white 100%);
box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2), inset 0 0 3px 1px white;
border-radius: 30px;
}
.irs--big .irs-handle.state_hover,
.irs--big .irs-handle:hover {
border-color: rgba(0, 0, 0, 0.45);
background-color: #939ba7;
background: linear-gradient(to bottom, white 0%, #919BA5 30%, white 100%);
}
.irs--big .irs-min,
.irs--big .irs-max {
top: 0;
padding: 1px 5px;
color: white;
text-shadow: none;
background-color: #9f9f9f;
border-radius: 3px;
}
.irs--big .irs-from,
.irs--big .irs-to,
.irs--big .irs-single {
color: white;
text-shadow: none;
padding: 1px 5px;
background-color: #428bca;
background: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
border-radius: 3px;
}
.irs--big .irs-grid-pol {
background-color: #428bca;
}
.irs--big .irs-grid-text {
color: #428bca;
}
.irs--modern {
height: 55px;
}
.irs--modern.irs-with-grid {
height: 55px;
}
.irs--modern .irs-line {
top: 25px;
height: 5px;
background-color: #d1d6e0;
background: linear-gradient(to bottom, #e0e4ea 0%, #d1d6e0 100%);
border: 1px solid #a3adc1;
border-bottom-width: 0;
border-radius: 5px;
}
.irs--modern .irs-bar {
top: 25px;
height: 5px;
background: #20b426;
background: linear-gradient(to bottom, #20b426 0%, #18891d 100%);
}
.irs--modern .irs-bar--single {
border-radius: 5px 0 0 5px;
}
.irs--modern .irs-shadow {
height: 1px;
bottom: 21px;
background-color: rgba(209, 214, 224, 0.5);
}
.irs--modern .irs-handle {
top: 37px;
width: 12px;
height: 13px;
border: 1px solid #a3adc1;
border-top-width: 0;
box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1);
border-radius: 0 0 3px 3px;
}
.irs--modern .irs-handle > i:nth-child(1) {
position: absolute;
display: block;
top: -4px;
left: 1px;
width: 6px;
height: 6px;
border: 1px solid #a3adc1;
background: white;
transform: rotate(45deg);
}
.irs--modern .irs-handle > i:nth-child(2) {
position: absolute;
display: block;
box-sizing: border-box;
top: 0;
left: 0;
width: 10px;
height: 12px;
background: #e9e6e6;
background: linear-gradient(to bottom, white 0%, #e9e6e6 100%);
border-radius: 0 0 3px 3px;
}
.irs--modern .irs-handle > i:nth-child(3) {
position: absolute;
display: block;
box-sizing: border-box;
top: 3px;
left: 3px;
width: 4px;
height: 5px;
border-left: 1px solid #a3adc1;
border-right: 1px solid #a3adc1;
}
.irs--modern .irs-handle.state_hover,
.irs--modern .irs-handle:hover {
border-color: #7685a2;
background: #c3c7cd;
background: linear-gradient(to bottom, #ffffff 0%, #919ba5 30%, #ffffff 100%);
}
.irs--modern .irs-handle.state_hover > i:nth-child(1),
.irs--modern .irs-handle:hover > i:nth-child(1) {
border-color: #7685a2;
}
.irs--modern .irs-handle.state_hover > i:nth-child(3),
.irs--modern .irs-handle:hover > i:nth-child(3) {
border-color: #48536a;
}
.irs--modern .irs-min,
.irs--modern .irs-max {
top: 0;
font-size: 10px;
line-height: 1.333;
text-shadow: none;
padding: 1px 5px;
color: white;
background-color: #d1d6e0;
border-radius: 5px;
}
.irs--modern .irs-from,
.irs--modern .irs-to,
.irs--modern .irs-single {
font-size: 10px;
line-height: 1.333;
text-shadow: none;
padding: 1px 5px;
background-color: #20b426;
color: white;
border-radius: 5px;
}
.irs--modern .irs-from:before,
.irs--modern .irs-to:before,
.irs--modern .irs-single:before {
position: absolute;
display: block;
content: "";
bottom: -6px;
left: 50%;
width: 0;
height: 0;
margin-left: -3px;
overflow: hidden;
border: 3px solid transparent;
border-top-color: #20b426;
}
.irs--modern .irs-grid {
height: 25px;
}
.irs--modern .irs-grid-pol {
background-color: #dedede;
}
.irs--modern .irs-grid-text {
color: silver;
font-size: 13px;
}
.irs--sharp {
height: 50px;
font-size: 12px;
line-height: 1;
}
.irs--sharp.irs-with-grid {
height: 57px;
}
.irs--sharp .irs-line {
top: 30px;
height: 2px;
background-color: black;
border-radius: 2px;
}
.irs--sharp .irs-bar {
top: 30px;
height: 2px;
background-color: #ee22fa;
}
.irs--sharp .irs-bar--single {
border-radius: 2px 0 0 2px;
}
.irs--sharp .irs-shadow {
height: 1px;
bottom: 21px;
background-color: rgba(0, 0, 0, 0.5);
}
.irs--sharp .irs-handle {
top: 25px;
width: 10px;
height: 10px;
background-color: #a804b2;
}
.irs--sharp .irs-handle > i:first-child {
position: absolute;
display: block;
top: 100%;
left: 0;
width: 0;
height: 0;
border: 5px solid transparent;
border-top-color: #a804b2;
}
.irs--sharp .irs-handle.state_hover,
.irs--sharp .irs-handle:hover {
background-color: black;
}
.irs--sharp .irs-handle.state_hover > i:first-child,
.irs--sharp .irs-handle:hover > i:first-child {
border-top-color: black;
}
.irs--sharp .irs-min,
.irs--sharp .irs-max {
color: white;
font-size: 14px;
line-height: 1;
top: 0;
padding: 3px 4px;
opacity: 0.4;
background-color: #a804b2;
border-radius: 2px;
}
.irs--sharp .irs-from,
.irs--sharp .irs-to,
.irs--sharp .irs-single {
font-size: 14px;
line-height: 1;
text-shadow: none;
padding: 3px 4px;
background-color: #a804b2;
color: white;
border-radius: 2px;
}
.irs--sharp .irs-from:before,
.irs--sharp .irs-to:before,
.irs--sharp .irs-single:before {
position: absolute;
display: block;
content: "";
bottom: -6px;
left: 50%;
width: 0;
height: 0;
margin-left: -3px;
overflow: hidden;
border: 3px solid transparent;
border-top-color: #a804b2;
}
.irs--sharp .irs-grid {
height: 25px;
}
.irs--sharp .irs-grid-pol {
background-color: #dedede;
}
.irs--sharp .irs-grid-text {
color: silver;
font-size: 13px;
}
.irs--round {
height: 50px;
}
.irs--round.irs-with-grid {
height: 65px;
}
.irs--round .irs-line {
top: 36px;
height: 4px;
background-color: var(--cnvs-range-slider-bar_color);
border-radius: 4px;
}
.irs--round .irs-bar {
top: 36px;
height: 4px;
background-color: var(--cnvs-range-slider-bar_color);
}
.irs--round .irs-bar--single {
border-radius: 4px 0 0 4px;
}
.irs--round .irs-shadow {
height: 4px;
bottom: 21px;
background-color: rgba(222, 228, 236, 0.5);
}
.irs--round .irs-handle {
top: 26px;
width: 24px;
height: 24px;
border: 4px solid var(--cnvs-range-slider-bar_color);
background-color: white;
border-radius: 24px;
box-shadow: 0 1px 3px rgba(0, 0, 255, 0.3);
}
.irs--round .irs-handle.state_hover,
.irs--round .irs-handle:hover {
background-color: #f0f6ff;
}
.irs--round .irs-min,
.irs--round .irs-max {
color: #333;
font-size: 14px;
line-height: 1;
top: 0;
padding: 3px 5px;
background-color: rgba(0, 0, 0, 0.1);
border-radius: 4px;
}
.irs--round .irs-from,
.irs--round .irs-to,
.irs--round .irs-single {
font-size: 14px;
line-height: 1;
text-shadow: none;
padding: 3px 5px;
background-color: var(--cnvs-range-slider-bar_color);
color: white;
border-radius: 4px;
}
.irs--round .irs-from:before,
.irs--round .irs-to:before,
.irs--round .irs-single:before {
position: absolute;
display: block;
content: "";
bottom: -6px;
left: 50%;
width: 0;
height: 0;
margin-left: -3px;
overflow: hidden;
border: 3px solid transparent;
border-top-color: var(--cnvs-range-slider-bar_color);
}
.irs--round .irs-grid {
height: 25px;
}
.irs--round .irs-grid-pol {
background-color: #dedede;
}
.irs--round .irs-grid-text {
color: silver;
font-size: 13px;
}
.irs--square {
height: 50px;
}
.irs--square.irs-with-grid {
height: 60px;
}
.irs--square .irs-line {
top: 31px;
height: 4px;
background-color: #dedede;
}
.irs--square .irs-bar {
top: 31px;
height: 4px;
background-color: black;
}
.irs--square .irs-shadow {
height: 2px;
bottom: 21px;
background-color: #dedede;
}
.irs--square .irs-handle {
top: 25px;
width: 16px;
height: 16px;
border: 3px solid black;
background-color: white;
-webkit-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
}
.irs--square .irs-handle.state_hover,
.irs--square .irs-handle:hover {
background-color: #f0f6ff;
}
.irs--square .irs-min,
.irs--square .irs-max {
color: #333;
font-size: 14px;
line-height: 1;
top: 0;
padding: 3px 5px;
background-color: rgba(0, 0, 0, 0.1);
}
.irs--square .irs-from,
.irs--square .irs-to,
.irs--square .irs-single {
font-size: 14px;
line-height: 1;
text-shadow: none;
padding: 3px 5px;
background-color: black;
color: white;
}
.irs--square .irs-grid {
height: 25px;
}
.irs--square .irs-grid-pol {
background-color: #dedede;
}
.irs--square .irs-grid-text {
color: silver;
font-size: 11px;
}
/*# sourceMappingURL=ion.rangeslider.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}

View File

@ -0,0 +1,99 @@
/* Style-1 + Style-2 */
.checkbox-style,
.radio-style {
opacity: 0;
position: absolute;
}
.checkbox-style, .radio-style,
.checkbox-style-1-label, .radio-style-1-label,
.checkbox-style-2-label, .radio-style-2-label,
.checkbox-style-3-label, .radio-style-3-label {
display: inline-block;
vertical-align: middle;
margin: 5px;
cursor: pointer;
}
.checkbox-style-1-label, .radio-style-1-label,
.checkbox-style-2-label, .radio-style-2-label,
.checkbox-style-3-label, .radio-style-3-label { position: relative; }
.checkbox-style-1-label:before, .radio-style-1-label:before,
.checkbox-style-2-label:before, .radio-style-2-label:before,
.checkbox-style-3-label:before, .radio-style-3-label:before {
content: '';
background: #FFF;
border: 2px solid #DDD;
display: inline-block;
vertical-align: middle;
width: 24px;
height: 24px;
padding: 4px;
margin-right: 10px;
line-height: 1;
text-align: center;
}
.radio-style-1-label:before,
.radio-style-2-label:before,
.radio-style-3-label:before { border-radius: 50%; }
.checkbox-style:checked + .checkbox-style-1-label:before {
background: #1ABC9C;
background: var(--themecolor);
}
.radio-style:checked + .radio-style-1-label:before { background: #CCC; }
/* Checkbox-small + Radio-small */
.checkbox-style-1-label.checkbox-small:before,
.radio-style-1-label.radio-small:before,
.checkbox-style-2-label.checkbox-small:before,
.radio-style-2-label.radio-small:before,
.checkbox-style-3-label.checkbox-small:before,
.radio-style-3-label.radio-small:before {
border: 2px solid #DDD;
width: 16px;
height: 16px;
margin: 0 8px 1px 0;
}
/* Style-2 */
.checkbox-style:checked + .checkbox-style-2-label:before {
background: #1ABC9C;
background: var(--themecolor);
box-shadow: inset 0px 0px 0px 4px #fff;
}
.radio-style:checked + .radio-style-2-label:before {
background: #ccc;
box-shadow: inset 0px 0px 0px 4px #fff;
}
.checkbox-style:checked + .checkbox-style-2-label.checkbox-small:before { box-shadow: inset 0px 0px 0px 2px #fff; }
.radio-style:checked + .radio-style-2-label.radio-small:before { box-shadow: inset 0px 0px 0px 2px #fff; }
/* style-3 */
.checkbox-style:checked + .checkbox-style-3-label:before,
.radio-style:checked + .radio-style-3-label:before {
content: "\e116";
font-family: 'lined-icons';
background: #1ABC9C;
background: var(--themecolor);
color: #FFF;
}
.radio-style:checked + .radio-style-3-label:before {
color: #BBB;
background-color: transparent;
}
/* style-3 - Small */
.checkbox-style + .checkbox-style-3-label.checkbox-small:before,
.radio-style + .radio-style-3-label.radio-small:before {
border: 1px solid #BBB;
width: 16px;
height: 16px;
margin: 0 8px 1px 0;
font-size: 7px;
line-height: .8;
}

View File

@ -0,0 +1,93 @@
/* Style-1 + Style-2 */
.checkbox-style,
.radio-style {
opacity: 0;
position: absolute;
}
.checkbox-style, .radio-style,
.checkbox-style-1-label, .radio-style-1-label,
.checkbox-style-2-label, .radio-style-2-label,
.checkbox-style-3-label, .radio-style-3-label {
display: inline-block;
vertical-align: middle;
margin: 5px;
cursor: pointer;
}
.checkbox-style-1-label, .radio-style-1-label,
.checkbox-style-2-label, .radio-style-2-label,
.checkbox-style-3-label, .radio-style-3-label { position: relative; }
.checkbox-style-1-label:before, .radio-style-1-label:before,
.checkbox-style-2-label:before, .radio-style-2-label:before,
.checkbox-style-3-label:before, .radio-style-3-label:before {
content: '';
background: #FFF;
border: 2px solid #DDD;
display: inline-block;
vertical-align: middle;
width: 24px;
height: 24px;
margin-right: 10px;
line-height: 20px;
text-align: center;
}
.radio-style-1-label:before,
.radio-style-2-label:before,
.radio-style-3-label:before { border-radius: 50%; }
.checkbox-style:checked + .checkbox-style-1-label:before { background: var(--cnvs-themecolor); }
.radio-style:checked + .radio-style-1-label:before { background: #CCC; }
/* Checkbox-small + Radio-small */
.checkbox-style-1-label.checkbox-small:before,
.radio-style-1-label.radio-small:before,
.checkbox-style-2-label.checkbox-small:before,
.radio-style-2-label.radio-small:before,
.checkbox-style-3-label.checkbox-small:before,
.radio-style-3-label.radio-small:before {
border: 2px solid #DDD;
width: 16px;
height: 16px;
margin: 0 8px 1px 0;
}
/* Style-2 */
.checkbox-style:checked + .checkbox-style-2-label:before {
background: var(--cnvs-themecolor);
box-shadow: inset 0px 0px 0px 4px #fff;
}
.radio-style:checked + .radio-style-2-label:before {
background: #ccc;
box-shadow: inset 0px 0px 0px 4px #fff;
}
.checkbox-style:checked + .checkbox-style-2-label.checkbox-small:before { box-shadow: inset 0px 0px 0px 2px #fff; }
.radio-style:checked + .radio-style-2-label.radio-small:before { box-shadow: inset 0px 0px 0px 2px #fff; }
/* style-3 */
.checkbox-style:checked + .checkbox-style-3-label:before,
.radio-style:checked + .radio-style-3-label:before {
content: "\F633";
font-family: "bootstrap-icons";
background: var(--cnvs-themecolor);
color: #FFF;
}
.radio-style:checked + .radio-style-3-label:before {
color: #BBB;
background-color: transparent;
}
/* style-3 - Small */
.checkbox-style + .checkbox-style-3-label.checkbox-small:before,
.radio-style + .radio-style-3-label.radio-small:before {
border: 1px solid #BBB;
width: 16px;
height: 16px;
margin: 0 8px 1px 0;
font-size: 7px;
line-height: .8;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 694 B

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

7
wwwroot/css/custom.css Normal file
View File

@ -0,0 +1,7 @@
/* ----------------------------------------------------------------
Custom CSS
Add all your Custom Styled CSS here for New Styles or
Overwriting Default Theme Styles for Better Handling Updates
-----------------------------------------------------------------*/

175
wwwroot/css/font-icons.css Normal file
View File

@ -0,0 +1,175 @@
@import url("icons/font-awesome.css"); /* Ref: https://fontawesome.com/search?o=r&m=free */
@import url("icons/bootstrap-icons.css"); /* Ref: https://icons.getbootstrap.com/#icons */
@import url("icons/unicons.css"); /* Ref: https://iconscout.com/unicons/explore/line */
[class*="fa-"],
[class*=" fa-"],
[class*="bi-"],
[class*=" bi-"],
[class*="uil-"],
[class*=" uil-"] {
display: inline-block;
line-height: inherit;
font-display: swap;
}
[class*="fa-"]::before,
[class*=" fa-"]::before,
[class*="bi-"]::before,
[class*=" bi-"]::before,
[class*="uil-"]::before,
[class*=" uil-"]::before {
display: inline-flex;
align-self: center;
justify-self: center;
line-height: inherit;
}
.icon-lg {
font-size: 1.3333333333333333em;
line-height: 0.75em;
vertical-align: -15%;
}
.icon-2x {
font-size: 2em;
}
.icon-3x {
font-size: 3em;
}
.icon-4x {
font-size: 4em;
}
.icon-5x {
font-size: 5em;
}
.icon-fw {
width: 1.2857142857142858em;
text-align: center;
}
.icon-border {
padding: 0.2em 0.25em 0.15em;
border: solid 0.08em #eeeeee;
border-radius: 0.1em;
}
.icon.pull-left {
margin-right: 0.3em;
}
.icon.pull-right {
margin-left: 0.3em;
}
.icon-spin {
-webkit-animation: spin 2s infinite linear;
-moz-animation: spin 2s infinite linear;
-o-animation: spin 2s infinite linear;
animation: spin 2s infinite linear;
}
@-moz-keyframes spin {
0% {
-moz-transform: rotate(0deg);
}
100% {
-moz-transform: rotate(359deg);
}
}
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
}
}
@-o-keyframes spin {
0% {
-o-transform: rotate(0deg);
}
100% {
-o-transform: rotate(359deg);
}
}
@-ms-keyframes spin {
0% {
-ms-transform: rotate(0deg);
}
100% {
-ms-transform: rotate(359deg);
}
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(359deg);
}
}
.icon-rotate-90 {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-ms-transform: rotate(90deg);
-o-transform: rotate(90deg);
transform: rotate(90deg);
}
.icon-rotate-180 {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
-webkit-transform: rotate(180deg);
-moz-transform: rotate(180deg);
-ms-transform: rotate(180deg);
-o-transform: rotate(180deg);
transform: rotate(180deg);
}
.icon-rotate-270 {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
-webkit-transform: rotate(270deg);
-moz-transform: rotate(270deg);
-ms-transform: rotate(270deg);
-o-transform: rotate(270deg);
transform: rotate(270deg);
}
.icon-flip-horizontal {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
-webkit-transform: scale(-1, 1);
-moz-transform: scale(-1, 1);
-ms-transform: scale(-1, 1);
-o-transform: scale(-1, 1);
transform: scale(-1, 1);
}
.icon-flip-vertical {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
-webkit-transform: scale(1, -1);
-moz-transform: scale(1, -1);
-ms-transform: scale(1, -1);
-o-transform: scale(1, -1);
transform: scale(1, -1);
}
.icon-stacked {
position: relative;
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
vertical-align: middle;
}
.icon-stacked-1x,
.icon-stacked-2x {
position: absolute;
left: 0;
width: 100%;
text-align: center;
}
.rtl .icon-stacked-1x,
.rtl .icon-stacked-2x {
left: auto;
right: 0;
}
.icon-stacked-1x {
line-height: inherit;
}
.icon-stacked-2x {
font-size: 2em;
}
.icon-inverse {
color: #ffffff;
}

5
wwwroot/css/icons/bootstrap-icons.css vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

9
wwwroot/css/icons/font-awesome.css vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More