CARGA
CARGA
1215
staticfiles/assets/css/material-dashboard-rtl.css
Normal file
19756
staticfiles/assets/css/material-dashboard.css
Normal file
322
staticfiles/assets/css/material-dashboard.css.map
Normal file
14
staticfiles/assets/css/material-dashboard.min.css
vendored
Normal file
61
staticfiles/assets/demo/demo.css
Normal file
@@ -0,0 +1,61 @@
|
||||
.tim-typo {
|
||||
padding-left: 25%;
|
||||
margin-bottom: 40px;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.tim-typo .tim-note {
|
||||
bottom: 5px;
|
||||
color: #c0c1c2;
|
||||
display: block;
|
||||
font-weight: 400;
|
||||
font-size: 13px;
|
||||
line-height: 15px;
|
||||
left: 0;
|
||||
margin-left: 20px;
|
||||
position: absolute;
|
||||
width: 260px;
|
||||
}
|
||||
|
||||
/* offline-doc */
|
||||
|
||||
.offline-doc .navbar.navbar-transparent {
|
||||
padding-top: 25px;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.offline-doc .navbar.navbar-transparent .navbar-minimize {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.offline-doc .navbar.navbar-transparent .navbar-brand,
|
||||
.offline-doc .navbar.navbar-transparent .collapse .navbar-nav .nav-link {
|
||||
color: #FFFFFF !important;
|
||||
}
|
||||
|
||||
.offline-doc .footer {
|
||||
z-index: 3 !important;
|
||||
}
|
||||
|
||||
.offline-doc .page-header .container {
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
.offline-doc .page-header:after {
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
content: "";
|
||||
display: block;
|
||||
height: 100%;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
#map {
|
||||
z-index: 2;
|
||||
height: calc(100vh - 70px);
|
||||
margin-top: 70px;
|
||||
}
|
||||
237
staticfiles/assets/demo/demo.js
Normal file
@@ -0,0 +1,237 @@
|
||||
demo = {
|
||||
initDocumentationCharts: function() {
|
||||
if ($('#dailySalesChart').length != 0 && $('#websiteViewsChart').length != 0) {
|
||||
/* ----------========== Daily Sales Chart initialization For Documentation ==========---------- */
|
||||
|
||||
dataDailySalesChart = {
|
||||
labels: ['M', 'T', 'W', 'T', 'F', 'S', 'S'],
|
||||
series: [
|
||||
[12, 17, 7, 17, 23, 18, 38]
|
||||
]
|
||||
};
|
||||
|
||||
optionsDailySalesChart = {
|
||||
lineSmooth: Chartist.Interpolation.cardinal({
|
||||
tension: 0
|
||||
}),
|
||||
low: 0,
|
||||
high: 50, // creative tim: we recommend you to set the high sa the biggest value + something for a better look
|
||||
chartPadding: {
|
||||
top: 0,
|
||||
right: 0,
|
||||
bottom: 0,
|
||||
left: 0
|
||||
},
|
||||
}
|
||||
|
||||
var dailySalesChart = new Chartist.Line('#dailySalesChart', dataDailySalesChart, optionsDailySalesChart);
|
||||
|
||||
var animationHeaderChart = new Chartist.Line('#websiteViewsChart', dataDailySalesChart, optionsDailySalesChart);
|
||||
}
|
||||
},
|
||||
|
||||
initDashboardPageCharts: function() {
|
||||
|
||||
if ($('#dailySalesChart').length != 0 || $('#completedTasksChart').length != 0 || $('#websiteViewsChart').length != 0) {
|
||||
/* ----------========== Daily Sales Chart initialization ==========---------- */
|
||||
|
||||
dataDailySalesChart = {
|
||||
labels: ['M', 'T', 'W', 'T', 'F', 'S', 'S'],
|
||||
series: [
|
||||
[12, 17, 7, 17, 23, 18, 38]
|
||||
]
|
||||
};
|
||||
|
||||
optionsDailySalesChart = {
|
||||
lineSmooth: Chartist.Interpolation.cardinal({
|
||||
tension: 0
|
||||
}),
|
||||
low: 0,
|
||||
high: 50, // creative tim: we recommend you to set the high sa the biggest value + something for a better look
|
||||
chartPadding: {
|
||||
top: 0,
|
||||
right: 0,
|
||||
bottom: 0,
|
||||
left: 0
|
||||
},
|
||||
}
|
||||
|
||||
var dailySalesChart = new Chartist.Line('#dailySalesChart', dataDailySalesChart, optionsDailySalesChart);
|
||||
|
||||
md.startAnimationForLineChart(dailySalesChart);
|
||||
|
||||
|
||||
|
||||
/* ----------========== Completed Tasks Chart initialization ==========---------- */
|
||||
|
||||
dataCompletedTasksChart = {
|
||||
labels: ['12p', '3p', '6p', '9p', '12p', '3a', '6a', '9a'],
|
||||
series: [
|
||||
[230, 750, 450, 300, 280, 240, 200, 190]
|
||||
]
|
||||
};
|
||||
|
||||
optionsCompletedTasksChart = {
|
||||
lineSmooth: Chartist.Interpolation.cardinal({
|
||||
tension: 0
|
||||
}),
|
||||
low: 0,
|
||||
high: 1000, // creative tim: we recommend you to set the high sa the biggest value + something for a better look
|
||||
chartPadding: {
|
||||
top: 0,
|
||||
right: 0,
|
||||
bottom: 0,
|
||||
left: 0
|
||||
}
|
||||
}
|
||||
|
||||
var completedTasksChart = new Chartist.Line('#completedTasksChart', dataCompletedTasksChart, optionsCompletedTasksChart);
|
||||
|
||||
// start animation for the Completed Tasks Chart - Line Chart
|
||||
md.startAnimationForLineChart(completedTasksChart);
|
||||
|
||||
|
||||
/* ----------========== Emails Subscription Chart initialization ==========---------- */
|
||||
|
||||
var dataWebsiteViewsChart = {
|
||||
labels: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
|
||||
series: [
|
||||
[542, 443, 320, 780, 553, 453, 326, 434, 568, 610, 756, 895]
|
||||
|
||||
]
|
||||
};
|
||||
var optionsWebsiteViewsChart = {
|
||||
axisX: {
|
||||
showGrid: false
|
||||
},
|
||||
low: 0,
|
||||
high: 1000,
|
||||
chartPadding: {
|
||||
top: 0,
|
||||
right: 5,
|
||||
bottom: 0,
|
||||
left: 0
|
||||
}
|
||||
};
|
||||
var responsiveOptions = [
|
||||
['screen and (max-width: 640px)', {
|
||||
seriesBarDistance: 5,
|
||||
axisX: {
|
||||
labelInterpolationFnc: function(value) {
|
||||
return value[0];
|
||||
}
|
||||
}
|
||||
}]
|
||||
];
|
||||
var websiteViewsChart = Chartist.Bar('#websiteViewsChart', dataWebsiteViewsChart, optionsWebsiteViewsChart, responsiveOptions);
|
||||
|
||||
//start animation for the Emails Subscription Chart
|
||||
md.startAnimationForBarChart(websiteViewsChart);
|
||||
}
|
||||
},
|
||||
|
||||
initGoogleMaps: function() {
|
||||
var myLatlng = new google.maps.LatLng(40.748817, -73.985428);
|
||||
var mapOptions = {
|
||||
zoom: 13,
|
||||
center: myLatlng,
|
||||
scrollwheel: false, //we disable de scroll over the map, it is a really annoing when you scroll through page
|
||||
styles: [{
|
||||
"featureType": "water",
|
||||
"stylers": [{
|
||||
"saturation": 43
|
||||
}, {
|
||||
"lightness": -11
|
||||
}, {
|
||||
"hue": "#0088ff"
|
||||
}]
|
||||
}, {
|
||||
"featureType": "road",
|
||||
"elementType": "geometry.fill",
|
||||
"stylers": [{
|
||||
"hue": "#ff0000"
|
||||
}, {
|
||||
"saturation": -100
|
||||
}, {
|
||||
"lightness": 99
|
||||
}]
|
||||
}, {
|
||||
"featureType": "road",
|
||||
"elementType": "geometry.stroke",
|
||||
"stylers": [{
|
||||
"color": "#808080"
|
||||
}, {
|
||||
"lightness": 54
|
||||
}]
|
||||
}, {
|
||||
"featureType": "landscape.man_made",
|
||||
"elementType": "geometry.fill",
|
||||
"stylers": [{
|
||||
"color": "#ece2d9"
|
||||
}]
|
||||
}, {
|
||||
"featureType": "poi.park",
|
||||
"elementType": "geometry.fill",
|
||||
"stylers": [{
|
||||
"color": "#ccdca1"
|
||||
}]
|
||||
}, {
|
||||
"featureType": "road",
|
||||
"elementType": "labels.text.fill",
|
||||
"stylers": [{
|
||||
"color": "#767676"
|
||||
}]
|
||||
}, {
|
||||
"featureType": "road",
|
||||
"elementType": "labels.text.stroke",
|
||||
"stylers": [{
|
||||
"color": "#ffffff"
|
||||
}]
|
||||
}, {
|
||||
"featureType": "poi",
|
||||
"stylers": [{
|
||||
"visibility": "off"
|
||||
}]
|
||||
}, {
|
||||
"featureType": "landscape.natural",
|
||||
"elementType": "geometry.fill",
|
||||
"stylers": [{
|
||||
"visibility": "on"
|
||||
}, {
|
||||
"color": "#b8cb93"
|
||||
}]
|
||||
}, {
|
||||
"featureType": "poi.park",
|
||||
"stylers": [{
|
||||
"visibility": "on"
|
||||
}]
|
||||
}, {
|
||||
"featureType": "poi.sports_complex",
|
||||
"stylers": [{
|
||||
"visibility": "on"
|
||||
}]
|
||||
}, {
|
||||
"featureType": "poi.medical",
|
||||
"stylers": [{
|
||||
"visibility": "on"
|
||||
}]
|
||||
}, {
|
||||
"featureType": "poi.business",
|
||||
"stylers": [{
|
||||
"visibility": "simplified"
|
||||
}]
|
||||
}]
|
||||
|
||||
};
|
||||
var map = new google.maps.Map(document.getElementById("map"), mapOptions);
|
||||
|
||||
var marker = new google.maps.Marker({
|
||||
position: myLatlng,
|
||||
title: "Hello World!"
|
||||
});
|
||||
|
||||
// To add the marker to the map, call setMap();
|
||||
marker.setMap(map);
|
||||
}
|
||||
|
||||
}
|
||||
BIN
staticfiles/assets/img/Thumbs.db
Normal file
BIN
staticfiles/assets/img/apple-icon.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
staticfiles/assets/img/bg2.jpg
Normal file
|
After Width: | Height: | Size: 273 KiB |
BIN
staticfiles/assets/img/cds.jpg
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
staticfiles/assets/img/cdsalud.png
Normal file
|
After Width: | Height: | Size: 8.7 KiB |
BIN
staticfiles/assets/img/city-profile.jpg
Normal file
|
After Width: | Height: | Size: 454 KiB |
BIN
staticfiles/assets/img/city.jpg
Normal file
|
After Width: | Height: | Size: 208 KiB |
BIN
staticfiles/assets/img/cover.jpg
Normal file
|
After Width: | Height: | Size: 338 KiB |
BIN
staticfiles/assets/img/faces/avatar.jpg
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
staticfiles/assets/img/faces/card-profile1-square.jpg
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
staticfiles/assets/img/faces/card-profile2-square.jpg
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
staticfiles/assets/img/faces/marc.jpg
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
staticfiles/assets/img/favicon.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
staticfiles/assets/img/mask.png
Normal file
|
After Width: | Height: | Size: 756 B |
BIN
staticfiles/assets/img/new_logo.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
staticfiles/assets/img/sidebar-1.jpg
Normal file
|
After Width: | Height: | Size: 101 KiB |
BIN
staticfiles/assets/img/sidebar-2.jpg
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
staticfiles/assets/img/sidebar-3.jpg
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
staticfiles/assets/img/sidebar-4.jpg
Normal file
|
After Width: | Height: | Size: 104 KiB |
1
staticfiles/assets/js/core/bootstrap-material-design.min.js
vendored
Normal file
3240
staticfiles/assets/js/core/jquery.min.js
vendored
Normal file
834
staticfiles/assets/js/core/popper.min.js
vendored
Normal file
@@ -0,0 +1,834 @@
|
||||
/*
|
||||
Copyright (C) Federico Zivolo 2017
|
||||
Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT).
|
||||
*/
|
||||
(function(e, t) {
|
||||
'object' == typeof exports && 'undefined' != typeof module ? module.exports = t() : 'function' == typeof define && define.amd ? define(t) : e.Popper = t()
|
||||
})(this, function() {
|
||||
'use strict';
|
||||
|
||||
function e(e) {
|
||||
return e && '[object Function]' === {}.toString.call(e)
|
||||
}
|
||||
|
||||
function t(e, t) {
|
||||
if (1 !== e.nodeType) return [];
|
||||
var o = window.getComputedStyle(e, null);
|
||||
return t ? o[t] : o
|
||||
}
|
||||
|
||||
function o(e) {
|
||||
return 'HTML' === e.nodeName ? e : e.parentNode || e.host
|
||||
}
|
||||
|
||||
function n(e) {
|
||||
if (!e || -1 !== ['HTML', 'BODY', '#document'].indexOf(e.nodeName)) return window.document.body;
|
||||
var i = t(e),
|
||||
r = i.overflow,
|
||||
p = i.overflowX,
|
||||
s = i.overflowY;
|
||||
return /(auto|scroll)/.test(r + s + p) ? e : n(o(e))
|
||||
}
|
||||
|
||||
function r(e) {
|
||||
var o = e && e.offsetParent,
|
||||
i = o && o.nodeName;
|
||||
return i && 'BODY' !== i && 'HTML' !== i ? -1 !== ['TD', 'TABLE'].indexOf(o.nodeName) && 'static' === t(o, 'position') ? r(o) : o : window.document.documentElement
|
||||
}
|
||||
|
||||
function p(e) {
|
||||
var t = e.nodeName;
|
||||
return 'BODY' !== t && ('HTML' === t || r(e.firstElementChild) === e)
|
||||
}
|
||||
|
||||
function s(e) {
|
||||
return null === e.parentNode ? e : s(e.parentNode)
|
||||
}
|
||||
|
||||
function d(e, t) {
|
||||
if (!e || !e.nodeType || !t || !t.nodeType) return window.document.documentElement;
|
||||
var o = e.compareDocumentPosition(t) & Node.DOCUMENT_POSITION_FOLLOWING,
|
||||
i = o ? e : t,
|
||||
n = o ? t : e,
|
||||
a = document.createRange();
|
||||
a.setStart(i, 0), a.setEnd(n, 0);
|
||||
var f = a.commonAncestorContainer;
|
||||
if (e !== f && t !== f || i.contains(n)) return p(f) ? f : r(f);
|
||||
var l = s(e);
|
||||
return l.host ? d(l.host, t) : d(e, s(t).host)
|
||||
}
|
||||
|
||||
function a(e) {
|
||||
var t = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : 'top',
|
||||
o = 'top' === t ? 'scrollTop' : 'scrollLeft',
|
||||
i = e.nodeName;
|
||||
if ('BODY' === i || 'HTML' === i) {
|
||||
var n = window.document.documentElement,
|
||||
r = window.document.scrollingElement || n;
|
||||
return r[o]
|
||||
}
|
||||
return e[o]
|
||||
}
|
||||
|
||||
function f(e, t) {
|
||||
var o = 2 < arguments.length && void 0 !== arguments[2] && arguments[2],
|
||||
i = a(t, 'top'),
|
||||
n = a(t, 'left'),
|
||||
r = o ? -1 : 1;
|
||||
return e.top += i * r, e.bottom += i * r, e.left += n * r, e.right += n * r, e
|
||||
}
|
||||
|
||||
function l(e, t) {
|
||||
var o = 'x' === t ? 'Left' : 'Top',
|
||||
i = 'Left' == o ? 'Right' : 'Bottom';
|
||||
return +e['border' + o + 'Width'].split('px')[0] + +e['border' + i + 'Width'].split('px')[0]
|
||||
}
|
||||
|
||||
function m(e, t, o, i) {
|
||||
return _(t['offset' + e], o['client' + e], o['offset' + e], ie() ? o['offset' + e] + i['margin' + ('Height' === e ? 'Top' : 'Left')] + i['margin' + ('Height' === e ? 'Bottom' : 'Right')] : 0)
|
||||
}
|
||||
|
||||
function h() {
|
||||
var e = window.document.body,
|
||||
t = window.document.documentElement,
|
||||
o = ie() && window.getComputedStyle(t);
|
||||
return {
|
||||
height: m('Height', e, t, o),
|
||||
width: m('Width', e, t, o)
|
||||
}
|
||||
}
|
||||
|
||||
function c(e) {
|
||||
return se({}, e, {
|
||||
right: e.left + e.width,
|
||||
bottom: e.top + e.height
|
||||
})
|
||||
}
|
||||
|
||||
function g(e) {
|
||||
var o = {};
|
||||
if (ie()) try {
|
||||
o = e.getBoundingClientRect();
|
||||
var i = a(e, 'top'),
|
||||
n = a(e, 'left');
|
||||
o.top += i, o.left += n, o.bottom += i, o.right += n
|
||||
} catch (e) {} else o = e.getBoundingClientRect();
|
||||
var r = {
|
||||
left: o.left,
|
||||
top: o.top,
|
||||
width: o.right - o.left,
|
||||
height: o.bottom - o.top
|
||||
},
|
||||
p = 'HTML' === e.nodeName ? h() : {},
|
||||
s = p.width || e.clientWidth || r.right - r.left,
|
||||
d = p.height || e.clientHeight || r.bottom - r.top,
|
||||
f = e.offsetWidth - s,
|
||||
m = e.offsetHeight - d;
|
||||
if (f || m) {
|
||||
var g = t(e);
|
||||
f -= l(g, 'x'), m -= l(g, 'y'), r.width -= f, r.height -= m
|
||||
}
|
||||
return c(r)
|
||||
}
|
||||
|
||||
function u(e, o) {
|
||||
var i = ie(),
|
||||
r = 'HTML' === o.nodeName,
|
||||
p = g(e),
|
||||
s = g(o),
|
||||
d = n(e),
|
||||
a = t(o),
|
||||
l = +a.borderTopWidth.split('px')[0],
|
||||
m = +a.borderLeftWidth.split('px')[0],
|
||||
h = c({
|
||||
top: p.top - s.top - l,
|
||||
left: p.left - s.left - m,
|
||||
width: p.width,
|
||||
height: p.height
|
||||
});
|
||||
if (h.marginTop = 0, h.marginLeft = 0, !i && r) {
|
||||
var u = +a.marginTop.split('px')[0],
|
||||
b = +a.marginLeft.split('px')[0];
|
||||
h.top -= l - u, h.bottom -= l - u, h.left -= m - b, h.right -= m - b, h.marginTop = u, h.marginLeft = b
|
||||
}
|
||||
return (i ? o.contains(d) : o === d && 'BODY' !== d.nodeName) && (h = f(h, o)), h
|
||||
}
|
||||
|
||||
function b(e) {
|
||||
var t = window.document.documentElement,
|
||||
o = u(e, t),
|
||||
i = _(t.clientWidth, window.innerWidth || 0),
|
||||
n = _(t.clientHeight, window.innerHeight || 0),
|
||||
r = a(t),
|
||||
p = a(t, 'left'),
|
||||
s = {
|
||||
top: r - o.top + o.marginTop,
|
||||
left: p - o.left + o.marginLeft,
|
||||
width: i,
|
||||
height: n
|
||||
};
|
||||
return c(s)
|
||||
}
|
||||
|
||||
function y(e) {
|
||||
var i = e.nodeName;
|
||||
return 'BODY' === i || 'HTML' === i ? !1 : 'fixed' === t(e, 'position') || y(o(e))
|
||||
}
|
||||
|
||||
function w(e, t, i, r) {
|
||||
var p = {
|
||||
top: 0,
|
||||
left: 0
|
||||
},
|
||||
s = d(e, t);
|
||||
if ('viewport' === r) p = b(s);
|
||||
else {
|
||||
var a;
|
||||
'scrollParent' === r ? (a = n(o(e)), 'BODY' === a.nodeName && (a = window.document.documentElement)) : 'window' === r ? a = window.document.documentElement : a = r;
|
||||
var f = u(a, s);
|
||||
if ('HTML' === a.nodeName && !y(s)) {
|
||||
var l = h(),
|
||||
m = l.height,
|
||||
c = l.width;
|
||||
p.top += f.top - f.marginTop, p.bottom = m + f.top, p.left += f.left - f.marginLeft, p.right = c + f.left
|
||||
} else p = f
|
||||
}
|
||||
return p.left += i, p.top += i, p.right -= i, p.bottom -= i, p
|
||||
}
|
||||
|
||||
function v(e) {
|
||||
var t = e.width,
|
||||
o = e.height;
|
||||
return t * o
|
||||
}
|
||||
|
||||
function E(e, t, o, i, n) {
|
||||
var r = 5 < arguments.length && void 0 !== arguments[5] ? arguments[5] : 0;
|
||||
if (-1 === e.indexOf('auto')) return e;
|
||||
var p = w(o, i, r, n),
|
||||
s = {
|
||||
top: {
|
||||
width: p.width,
|
||||
height: t.top - p.top
|
||||
},
|
||||
right: {
|
||||
width: p.right - t.right,
|
||||
height: p.height
|
||||
},
|
||||
bottom: {
|
||||
width: p.width,
|
||||
height: p.bottom - t.bottom
|
||||
},
|
||||
left: {
|
||||
width: t.left - p.left,
|
||||
height: p.height
|
||||
}
|
||||
},
|
||||
d = Object.keys(s).map(function(e) {
|
||||
return se({
|
||||
key: e
|
||||
}, s[e], {
|
||||
area: v(s[e])
|
||||
})
|
||||
}).sort(function(e, t) {
|
||||
return t.area - e.area
|
||||
}),
|
||||
a = d.filter(function(e) {
|
||||
var t = e.width,
|
||||
i = e.height;
|
||||
return t >= o.clientWidth && i >= o.clientHeight
|
||||
}),
|
||||
f = 0 < a.length ? a[0].key : d[0].key,
|
||||
l = e.split('-')[1];
|
||||
return f + (l ? '-' + l : '')
|
||||
}
|
||||
|
||||
function x(e, t, o) {
|
||||
var i = d(t, o);
|
||||
return u(o, i)
|
||||
}
|
||||
|
||||
function O(e) {
|
||||
var t = window.getComputedStyle(e),
|
||||
o = parseFloat(t.marginTop) + parseFloat(t.marginBottom),
|
||||
i = parseFloat(t.marginLeft) + parseFloat(t.marginRight),
|
||||
n = {
|
||||
width: e.offsetWidth + i,
|
||||
height: e.offsetHeight + o
|
||||
};
|
||||
return n
|
||||
}
|
||||
|
||||
function L(e) {
|
||||
var t = {
|
||||
left: 'right',
|
||||
right: 'left',
|
||||
bottom: 'top',
|
||||
top: 'bottom'
|
||||
};
|
||||
return e.replace(/left|right|bottom|top/g, function(e) {
|
||||
return t[e]
|
||||
})
|
||||
}
|
||||
|
||||
function S(e, t, o) {
|
||||
o = o.split('-')[0];
|
||||
var i = O(e),
|
||||
n = {
|
||||
width: i.width,
|
||||
height: i.height
|
||||
},
|
||||
r = -1 !== ['right', 'left'].indexOf(o),
|
||||
p = r ? 'top' : 'left',
|
||||
s = r ? 'left' : 'top',
|
||||
d = r ? 'height' : 'width',
|
||||
a = r ? 'width' : 'height';
|
||||
return n[p] = t[p] + t[d] / 2 - i[d] / 2, n[s] = o === s ? t[s] - i[a] : t[L(s)], n
|
||||
}
|
||||
|
||||
function T(e, t) {
|
||||
return Array.prototype.find ? e.find(t) : e.filter(t)[0]
|
||||
}
|
||||
|
||||
function C(e, t, o) {
|
||||
if (Array.prototype.findIndex) return e.findIndex(function(e) {
|
||||
return e[t] === o
|
||||
});
|
||||
var i = T(e, function(e) {
|
||||
return e[t] === o
|
||||
});
|
||||
return e.indexOf(i)
|
||||
}
|
||||
|
||||
function N(t, o, i) {
|
||||
var n = void 0 === i ? t : t.slice(0, C(t, 'name', i));
|
||||
return n.forEach(function(t) {
|
||||
t.function && console.warn('`modifier.function` is deprecated, use `modifier.fn`!');
|
||||
var i = t.function || t.fn;
|
||||
t.enabled && e(i) && (o.offsets.popper = c(o.offsets.popper), o.offsets.reference = c(o.offsets.reference), o = i(o, t))
|
||||
}), o
|
||||
}
|
||||
|
||||
function k() {
|
||||
if (!this.state.isDestroyed) {
|
||||
var e = {
|
||||
instance: this,
|
||||
styles: {},
|
||||
attributes: {},
|
||||
flipped: !1,
|
||||
offsets: {}
|
||||
};
|
||||
e.offsets.reference = x(this.state, this.popper, this.reference), e.placement = E(this.options.placement, e.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding), e.originalPlacement = e.placement, e.offsets.popper = S(this.popper, e.offsets.reference, e.placement), e.offsets.popper.position = 'absolute', e = N(this.modifiers, e), this.state.isCreated ? this.options.onUpdate(e) : (this.state.isCreated = !0, this.options.onCreate(e))
|
||||
}
|
||||
}
|
||||
|
||||
function W(e, t) {
|
||||
return e.some(function(e) {
|
||||
var o = e.name,
|
||||
i = e.enabled;
|
||||
return i && o === t
|
||||
})
|
||||
}
|
||||
|
||||
function B(e) {
|
||||
for (var t = [!1, 'ms', 'Webkit', 'Moz', 'O'], o = e.charAt(0).toUpperCase() + e.slice(1), n = 0; n < t.length - 1; n++) {
|
||||
var i = t[n],
|
||||
r = i ? '' + i + o : e;
|
||||
if ('undefined' != typeof window.document.body.style[r]) return r
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
function D() {
|
||||
return this.state.isDestroyed = !0, W(this.modifiers, 'applyStyle') && (this.popper.removeAttribute('x-placement'), this.popper.style.left = '', this.popper.style.position = '', this.popper.style.top = '', this.popper.style[B('transform')] = ''), this.disableEventListeners(), this.options.removeOnDestroy && this.popper.parentNode.removeChild(this.popper), this
|
||||
}
|
||||
|
||||
function H(e, t, o, i) {
|
||||
var r = 'BODY' === e.nodeName,
|
||||
p = r ? window : e;
|
||||
p.addEventListener(t, o, {
|
||||
passive: !0
|
||||
}), r || H(n(p.parentNode), t, o, i), i.push(p)
|
||||
}
|
||||
|
||||
function P(e, t, o, i) {
|
||||
o.updateBound = i, window.addEventListener('resize', o.updateBound, {
|
||||
passive: !0
|
||||
});
|
||||
var r = n(e);
|
||||
return H(r, 'scroll', o.updateBound, o.scrollParents), o.scrollElement = r, o.eventsEnabled = !0, o
|
||||
}
|
||||
|
||||
function A() {
|
||||
this.state.eventsEnabled || (this.state = P(this.reference, this.options, this.state, this.scheduleUpdate))
|
||||
}
|
||||
|
||||
function M(e, t) {
|
||||
return window.removeEventListener('resize', t.updateBound), t.scrollParents.forEach(function(e) {
|
||||
e.removeEventListener('scroll', t.updateBound)
|
||||
}), t.updateBound = null, t.scrollParents = [], t.scrollElement = null, t.eventsEnabled = !1, t
|
||||
}
|
||||
|
||||
function I() {
|
||||
this.state.eventsEnabled && (window.cancelAnimationFrame(this.scheduleUpdate), this.state = M(this.reference, this.state))
|
||||
}
|
||||
|
||||
function R(e) {
|
||||
return '' !== e && !isNaN(parseFloat(e)) && isFinite(e)
|
||||
}
|
||||
|
||||
function U(e, t) {
|
||||
Object.keys(t).forEach(function(o) {
|
||||
var i = ''; - 1 !== ['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(o) && R(t[o]) && (i = 'px'), e.style[o] = t[o] + i
|
||||
})
|
||||
}
|
||||
|
||||
function Y(e, t) {
|
||||
Object.keys(t).forEach(function(o) {
|
||||
var i = t[o];
|
||||
!1 === i ? e.removeAttribute(o) : e.setAttribute(o, t[o])
|
||||
})
|
||||
}
|
||||
|
||||
function F(e, t, o) {
|
||||
var i = T(e, function(e) {
|
||||
var o = e.name;
|
||||
return o === t
|
||||
}),
|
||||
n = !!i && e.some(function(e) {
|
||||
return e.name === o && e.enabled && e.order < i.order
|
||||
});
|
||||
if (!n) {
|
||||
var r = '`' + t + '`';
|
||||
console.warn('`' + o + '`' + ' modifier is required by ' + r + ' modifier in order to work, be sure to include it before ' + r + '!')
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
function j(e) {
|
||||
return 'end' === e ? 'start' : 'start' === e ? 'end' : e
|
||||
}
|
||||
|
||||
function K(e) {
|
||||
var t = 1 < arguments.length && void 0 !== arguments[1] && arguments[1],
|
||||
o = ae.indexOf(e),
|
||||
i = ae.slice(o + 1).concat(ae.slice(0, o));
|
||||
return t ? i.reverse() : i
|
||||
}
|
||||
|
||||
function q(e, t, o, i) {
|
||||
var n = e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),
|
||||
r = +n[1],
|
||||
p = n[2];
|
||||
if (!r) return e;
|
||||
if (0 === p.indexOf('%')) {
|
||||
var s;
|
||||
switch (p) {
|
||||
case '%p':
|
||||
s = o;
|
||||
break;
|
||||
case '%':
|
||||
case '%r':
|
||||
default:
|
||||
s = i;
|
||||
}
|
||||
var d = c(s);
|
||||
return d[t] / 100 * r
|
||||
}
|
||||
if ('vh' === p || 'vw' === p) {
|
||||
var a;
|
||||
return a = 'vh' === p ? _(document.documentElement.clientHeight, window.innerHeight || 0) : _(document.documentElement.clientWidth, window.innerWidth || 0), a / 100 * r
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
function G(e, t, o, i) {
|
||||
var n = [0, 0],
|
||||
r = -1 !== ['right', 'left'].indexOf(i),
|
||||
p = e.split(/(\+|\-)/).map(function(e) {
|
||||
return e.trim()
|
||||
}),
|
||||
s = p.indexOf(T(p, function(e) {
|
||||
return -1 !== e.search(/,|\s/)
|
||||
}));
|
||||
p[s] && -1 === p[s].indexOf(',') && console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');
|
||||
var d = /\s*,\s*|\s+/,
|
||||
a = -1 === s ? [p] : [p.slice(0, s).concat([p[s].split(d)[0]]), [p[s].split(d)[1]].concat(p.slice(s + 1))];
|
||||
return a = a.map(function(e, i) {
|
||||
var n = (1 === i ? !r : r) ? 'height' : 'width',
|
||||
p = !1;
|
||||
return e.reduce(function(e, t) {
|
||||
return '' === e[e.length - 1] && -1 !== ['+', '-'].indexOf(t) ? (e[e.length - 1] = t, p = !0, e) : p ? (e[e.length - 1] += t, p = !1, e) : e.concat(t)
|
||||
}, []).map(function(e) {
|
||||
return q(e, n, t, o)
|
||||
})
|
||||
}), a.forEach(function(e, t) {
|
||||
e.forEach(function(o, i) {
|
||||
R(o) && (n[t] += o * ('-' === e[i - 1] ? -1 : 1))
|
||||
})
|
||||
}), n
|
||||
}
|
||||
for (var z = Math.min, V = Math.floor, _ = Math.max, X = ['native code', '[object MutationObserverConstructor]'], Q = function(e) {
|
||||
return X.some(function(t) {
|
||||
return -1 < (e || '').toString().indexOf(t)
|
||||
})
|
||||
}, J = 'undefined' != typeof window, Z = ['Edge', 'Trident', 'Firefox'], $ = 0, ee = 0; ee < Z.length; ee += 1)
|
||||
if (J && 0 <= navigator.userAgent.indexOf(Z[ee])) {
|
||||
$ = 1;
|
||||
break
|
||||
}
|
||||
var i, te = J && Q(window.MutationObserver),
|
||||
oe = te ? function(e) {
|
||||
var t = !1,
|
||||
o = 0,
|
||||
i = document.createElement('span'),
|
||||
n = new MutationObserver(function() {
|
||||
e(), t = !1
|
||||
});
|
||||
return n.observe(i, {
|
||||
attributes: !0
|
||||
}),
|
||||
function() {
|
||||
t || (t = !0, i.setAttribute('x-index', o), ++o)
|
||||
}
|
||||
} : function(e) {
|
||||
var t = !1;
|
||||
return function() {
|
||||
t || (t = !0, setTimeout(function() {
|
||||
t = !1, e()
|
||||
}, $))
|
||||
}
|
||||
},
|
||||
ie = function() {
|
||||
return void 0 == i && (i = -1 !== navigator.appVersion.indexOf('MSIE 10')), i
|
||||
},
|
||||
ne = function(e, t) {
|
||||
if (!(e instanceof t)) throw new TypeError('Cannot call a class as a function')
|
||||
},
|
||||
re = function() {
|
||||
function e(e, t) {
|
||||
for (var o, n = 0; n < t.length; n++) o = t[n], o.enumerable = o.enumerable || !1, o.configurable = !0, 'value' in o && (o.writable = !0), Object.defineProperty(e, o.key, o)
|
||||
}
|
||||
return function(t, o, i) {
|
||||
return o && e(t.prototype, o), i && e(t, i), t
|
||||
}
|
||||
}(),
|
||||
pe = function(e, t, o) {
|
||||
return t in e ? Object.defineProperty(e, t, {
|
||||
value: o,
|
||||
enumerable: !0,
|
||||
configurable: !0,
|
||||
writable: !0
|
||||
}) : e[t] = o, e
|
||||
},
|
||||
se = Object.assign || function(e) {
|
||||
for (var t, o = 1; o < arguments.length; o++)
|
||||
for (var i in t = arguments[o], t) Object.prototype.hasOwnProperty.call(t, i) && (e[i] = t[i]);
|
||||
return e
|
||||
},
|
||||
de = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'],
|
||||
ae = de.slice(3),
|
||||
fe = {
|
||||
FLIP: 'flip',
|
||||
CLOCKWISE: 'clockwise',
|
||||
COUNTERCLOCKWISE: 'counterclockwise'
|
||||
},
|
||||
le = function() {
|
||||
function t(o, i) {
|
||||
var n = this,
|
||||
r = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : {};
|
||||
ne(this, t), this.scheduleUpdate = function() {
|
||||
return requestAnimationFrame(n.update)
|
||||
}, this.update = oe(this.update.bind(this)), this.options = se({}, t.Defaults, r), this.state = {
|
||||
isDestroyed: !1,
|
||||
isCreated: !1,
|
||||
scrollParents: []
|
||||
}, this.reference = o.jquery ? o[0] : o, this.popper = i.jquery ? i[0] : i, this.options.modifiers = {}, Object.keys(se({}, t.Defaults.modifiers, r.modifiers)).forEach(function(e) {
|
||||
n.options.modifiers[e] = se({}, t.Defaults.modifiers[e] || {}, r.modifiers ? r.modifiers[e] : {})
|
||||
}), this.modifiers = Object.keys(this.options.modifiers).map(function(e) {
|
||||
return se({
|
||||
name: e
|
||||
}, n.options.modifiers[e])
|
||||
}).sort(function(e, t) {
|
||||
return e.order - t.order
|
||||
}), this.modifiers.forEach(function(t) {
|
||||
t.enabled && e(t.onLoad) && t.onLoad(n.reference, n.popper, n.options, t, n.state)
|
||||
}), this.update();
|
||||
var p = this.options.eventsEnabled;
|
||||
p && this.enableEventListeners(), this.state.eventsEnabled = p
|
||||
}
|
||||
return re(t, [{
|
||||
key: 'update',
|
||||
value: function() {
|
||||
return k.call(this)
|
||||
}
|
||||
}, {
|
||||
key: 'destroy',
|
||||
value: function() {
|
||||
return D.call(this)
|
||||
}
|
||||
}, {
|
||||
key: 'enableEventListeners',
|
||||
value: function() {
|
||||
return A.call(this)
|
||||
}
|
||||
}, {
|
||||
key: 'disableEventListeners',
|
||||
value: function() {
|
||||
return I.call(this)
|
||||
}
|
||||
}]), t
|
||||
}();
|
||||
return le.Utils = ('undefined' == typeof window ? global : window).PopperUtils, le.placements = de, le.Defaults = {
|
||||
placement: 'bottom',
|
||||
eventsEnabled: !0,
|
||||
removeOnDestroy: !1,
|
||||
onCreate: function() {},
|
||||
onUpdate: function() {},
|
||||
modifiers: {
|
||||
shift: {
|
||||
order: 100,
|
||||
enabled: !0,
|
||||
fn: function(e) {
|
||||
var t = e.placement,
|
||||
o = t.split('-')[0],
|
||||
i = t.split('-')[1];
|
||||
if (i) {
|
||||
var n = e.offsets,
|
||||
r = n.reference,
|
||||
p = n.popper,
|
||||
s = -1 !== ['bottom', 'top'].indexOf(o),
|
||||
d = s ? 'left' : 'top',
|
||||
a = s ? 'width' : 'height',
|
||||
f = {
|
||||
start: pe({}, d, r[d]),
|
||||
end: pe({}, d, r[d] + r[a] - p[a])
|
||||
};
|
||||
e.offsets.popper = se({}, p, f[i])
|
||||
}
|
||||
return e
|
||||
}
|
||||
},
|
||||
offset: {
|
||||
order: 200,
|
||||
enabled: !0,
|
||||
fn: function(e, t) {
|
||||
var o, i = t.offset,
|
||||
n = e.placement,
|
||||
r = e.offsets,
|
||||
p = r.popper,
|
||||
s = r.reference,
|
||||
d = n.split('-')[0];
|
||||
return o = R(+i) ? [+i, 0] : G(i, p, s, d), 'left' === d ? (p.top += o[0], p.left -= o[1]) : 'right' === d ? (p.top += o[0], p.left += o[1]) : 'top' === d ? (p.left += o[0], p.top -= o[1]) : 'bottom' === d && (p.left += o[0], p.top += o[1]), e.popper = p, e
|
||||
},
|
||||
offset: 0
|
||||
},
|
||||
preventOverflow: {
|
||||
order: 300,
|
||||
enabled: !0,
|
||||
fn: function(e, t) {
|
||||
var o = t.boundariesElement || r(e.instance.popper);
|
||||
e.instance.reference === o && (o = r(o));
|
||||
var i = w(e.instance.popper, e.instance.reference, t.padding, o);
|
||||
t.boundaries = i;
|
||||
var n = t.priority,
|
||||
p = e.offsets.popper,
|
||||
s = {
|
||||
primary: function(e) {
|
||||
var o = p[e];
|
||||
return p[e] < i[e] && !t.escapeWithReference && (o = _(p[e], i[e])), pe({}, e, o)
|
||||
},
|
||||
secondary: function(e) {
|
||||
var o = 'right' === e ? 'left' : 'top',
|
||||
n = p[o];
|
||||
return p[e] > i[e] && !t.escapeWithReference && (n = z(p[o], i[e] - ('right' === e ? p.width : p.height))), pe({}, o, n)
|
||||
}
|
||||
};
|
||||
return n.forEach(function(e) {
|
||||
var t = -1 === ['left', 'top'].indexOf(e) ? 'secondary' : 'primary';
|
||||
p = se({}, p, s[t](e))
|
||||
}), e.offsets.popper = p, e
|
||||
},
|
||||
priority: ['left', 'right', 'top', 'bottom'],
|
||||
padding: 5,
|
||||
boundariesElement: 'scrollParent'
|
||||
},
|
||||
keepTogether: {
|
||||
order: 400,
|
||||
enabled: !0,
|
||||
fn: function(e) {
|
||||
var t = e.offsets,
|
||||
o = t.popper,
|
||||
i = t.reference,
|
||||
n = e.placement.split('-')[0],
|
||||
r = V,
|
||||
p = -1 !== ['top', 'bottom'].indexOf(n),
|
||||
s = p ? 'right' : 'bottom',
|
||||
d = p ? 'left' : 'top',
|
||||
a = p ? 'width' : 'height';
|
||||
return o[s] < r(i[d]) && (e.offsets.popper[d] = r(i[d]) - o[a]), o[d] > r(i[s]) && (e.offsets.popper[d] = r(i[s])), e
|
||||
}
|
||||
},
|
||||
arrow: {
|
||||
order: 500,
|
||||
enabled: !0,
|
||||
fn: function(e, t) {
|
||||
if (!F(e.instance.modifiers, 'arrow', 'keepTogether')) return e;
|
||||
var o = t.element;
|
||||
if ('string' == typeof o) {
|
||||
if (o = e.instance.popper.querySelector(o), !o) return e;
|
||||
} else if (!e.instance.popper.contains(o)) return console.warn('WARNING: `arrow.element` must be child of its popper element!'), e;
|
||||
var i = e.placement.split('-')[0],
|
||||
n = e.offsets,
|
||||
r = n.popper,
|
||||
p = n.reference,
|
||||
s = -1 !== ['left', 'right'].indexOf(i),
|
||||
d = s ? 'height' : 'width',
|
||||
a = s ? 'top' : 'left',
|
||||
f = s ? 'left' : 'top',
|
||||
l = s ? 'bottom' : 'right',
|
||||
m = O(o)[d];
|
||||
p[l] - m < r[a] && (e.offsets.popper[a] -= r[a] - (p[l] - m)), p[a] + m > r[l] && (e.offsets.popper[a] += p[a] + m - r[l]);
|
||||
var h = p[a] + p[d] / 2 - m / 2,
|
||||
g = h - c(e.offsets.popper)[a];
|
||||
return g = _(z(r[d] - m, g), 0), e.arrowElement = o, e.offsets.arrow = {}, e.offsets.arrow[a] = Math.round(g), e.offsets.arrow[f] = '', e
|
||||
},
|
||||
element: '[x-arrow]'
|
||||
},
|
||||
flip: {
|
||||
order: 600,
|
||||
enabled: !0,
|
||||
fn: function(e, t) {
|
||||
if (W(e.instance.modifiers, 'inner')) return e;
|
||||
if (e.flipped && e.placement === e.originalPlacement) return e;
|
||||
var o = w(e.instance.popper, e.instance.reference, t.padding, t.boundariesElement),
|
||||
i = e.placement.split('-')[0],
|
||||
n = L(i),
|
||||
r = e.placement.split('-')[1] || '',
|
||||
p = [];
|
||||
switch (t.behavior) {
|
||||
case fe.FLIP:
|
||||
p = [i, n];
|
||||
break;
|
||||
case fe.CLOCKWISE:
|
||||
p = K(i);
|
||||
break;
|
||||
case fe.COUNTERCLOCKWISE:
|
||||
p = K(i, !0);
|
||||
break;
|
||||
default:
|
||||
p = t.behavior;
|
||||
}
|
||||
return p.forEach(function(s, d) {
|
||||
if (i !== s || p.length === d + 1) return e;
|
||||
i = e.placement.split('-')[0], n = L(i);
|
||||
var a = e.offsets.popper,
|
||||
f = e.offsets.reference,
|
||||
l = V,
|
||||
m = 'left' === i && l(a.right) > l(f.left) || 'right' === i && l(a.left) < l(f.right) || 'top' === i && l(a.bottom) > l(f.top) || 'bottom' === i && l(a.top) < l(f.bottom),
|
||||
h = l(a.left) < l(o.left),
|
||||
c = l(a.right) > l(o.right),
|
||||
g = l(a.top) < l(o.top),
|
||||
u = l(a.bottom) > l(o.bottom),
|
||||
b = 'left' === i && h || 'right' === i && c || 'top' === i && g || 'bottom' === i && u,
|
||||
y = -1 !== ['top', 'bottom'].indexOf(i),
|
||||
w = !!t.flipVariations && (y && 'start' === r && h || y && 'end' === r && c || !y && 'start' === r && g || !y && 'end' === r && u);
|
||||
(m || b || w) && (e.flipped = !0, (m || b) && (i = p[d + 1]), w && (r = j(r)), e.placement = i + (r ? '-' + r : ''), e.offsets.popper = se({}, e.offsets.popper, S(e.instance.popper, e.offsets.reference, e.placement)), e = N(e.instance.modifiers, e, 'flip'))
|
||||
}), e
|
||||
},
|
||||
behavior: 'flip',
|
||||
padding: 5,
|
||||
boundariesElement: 'viewport'
|
||||
},
|
||||
inner: {
|
||||
order: 700,
|
||||
enabled: !1,
|
||||
fn: function(e) {
|
||||
var t = e.placement,
|
||||
o = t.split('-')[0],
|
||||
i = e.offsets,
|
||||
n = i.popper,
|
||||
r = i.reference,
|
||||
p = -1 !== ['left', 'right'].indexOf(o),
|
||||
s = -1 === ['top', 'left'].indexOf(o);
|
||||
return n[p ? 'left' : 'top'] = r[t] - (s ? n[p ? 'width' : 'height'] : 0), e.placement = L(t), e.offsets.popper = c(n), e
|
||||
}
|
||||
},
|
||||
hide: {
|
||||
order: 800,
|
||||
enabled: !0,
|
||||
fn: function(e) {
|
||||
if (!F(e.instance.modifiers, 'hide', 'preventOverflow')) return e;
|
||||
var t = e.offsets.reference,
|
||||
o = T(e.instance.modifiers, function(e) {
|
||||
return 'preventOverflow' === e.name
|
||||
}).boundaries;
|
||||
if (t.bottom < o.top || t.left > o.right || t.top > o.bottom || t.right < o.left) {
|
||||
if (!0 === e.hide) return e;
|
||||
e.hide = !0, e.attributes['x-out-of-boundaries'] = ''
|
||||
} else {
|
||||
if (!1 === e.hide) return e;
|
||||
e.hide = !1, e.attributes['x-out-of-boundaries'] = !1
|
||||
}
|
||||
return e
|
||||
}
|
||||
},
|
||||
computeStyle: {
|
||||
order: 850,
|
||||
enabled: !0,
|
||||
fn: function(e, t) {
|
||||
var o = t.x,
|
||||
i = t.y,
|
||||
n = e.offsets.popper,
|
||||
p = T(e.instance.modifiers, function(e) {
|
||||
return 'applyStyle' === e.name
|
||||
}).gpuAcceleration;
|
||||
void 0 !== p && console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');
|
||||
var s, d, a = void 0 === p ? t.gpuAcceleration : p,
|
||||
f = r(e.instance.popper),
|
||||
l = g(f),
|
||||
m = {
|
||||
position: n.position
|
||||
},
|
||||
h = {
|
||||
left: V(n.left),
|
||||
top: V(n.top),
|
||||
bottom: V(n.bottom),
|
||||
right: V(n.right)
|
||||
},
|
||||
c = 'bottom' === o ? 'top' : 'bottom',
|
||||
u = 'right' === i ? 'left' : 'right',
|
||||
b = B('transform');
|
||||
if (d = 'bottom' == c ? -l.height + h.bottom : h.top, s = 'right' == u ? -l.width + h.right : h.left, a && b) m[b] = 'translate3d(' + s + 'px, ' + d + 'px, 0)', m[c] = 0, m[u] = 0, m.willChange = 'transform';
|
||||
else {
|
||||
var y = 'bottom' == c ? -1 : 1,
|
||||
w = 'right' == u ? -1 : 1;
|
||||
m[c] = d * y, m[u] = s * w, m.willChange = c + ', ' + u
|
||||
}
|
||||
var v = {
|
||||
"x-placement": e.placement
|
||||
};
|
||||
return e.attributes = se({}, v, e.attributes), e.styles = se({}, m, e.styles), e
|
||||
},
|
||||
gpuAcceleration: !0,
|
||||
x: 'bottom',
|
||||
y: 'right'
|
||||
},
|
||||
applyStyle: {
|
||||
order: 900,
|
||||
enabled: !0,
|
||||
fn: function(e) {
|
||||
return U(e.instance.popper, e.styles), Y(e.instance.popper, e.attributes), e.offsets.arrow && U(e.arrowElement, e.offsets.arrow), e
|
||||
},
|
||||
onLoad: function(e, t, o, i, n) {
|
||||
var r = x(n, t, e),
|
||||
p = E(o.placement, r, t, e, o.modifiers.flip.boundariesElement, o.modifiers.flip.padding);
|
||||
return t.setAttribute('x-placement', p), U(t, {
|
||||
position: 'absolute'
|
||||
}), o
|
||||
},
|
||||
gpuAcceleration: void 0
|
||||
}
|
||||
}
|
||||
}, le
|
||||
});
|
||||
734
staticfiles/assets/js/material-dashboard.js
Normal file
@@ -0,0 +1,734 @@
|
||||
/*!
|
||||
|
||||
=========================================================
|
||||
* Material Dashboard - v2.1.2
|
||||
=========================================================
|
||||
|
||||
* Product Page: https://www.creative-tim.com/product/material-dashboard
|
||||
* Copyright 2020 Creative Tim (http://www.creative-tim.com)
|
||||
|
||||
* Designed by www.invisionapp.com Coded by www.creative-tim.com
|
||||
|
||||
=========================================================
|
||||
|
||||
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
*/
|
||||
|
||||
(function() {
|
||||
isWindows = navigator.platform.indexOf('Win') > -1 ? true : false;
|
||||
|
||||
if (isWindows) {
|
||||
// if we are on windows OS we activate the perfectScrollbar function
|
||||
$('.sidebar .sidebar-wrapper, .main-panel, .main').perfectScrollbar();
|
||||
|
||||
$('html').addClass('perfect-scrollbar-on');
|
||||
} else {
|
||||
$('html').addClass('perfect-scrollbar-off');
|
||||
}
|
||||
})();
|
||||
|
||||
|
||||
var breakCards = true;
|
||||
|
||||
var searchVisible = 0;
|
||||
var transparent = true;
|
||||
|
||||
var transparentDemo = true;
|
||||
var fixedTop = false;
|
||||
|
||||
var mobile_menu_visible = 0,
|
||||
mobile_menu_initialized = false,
|
||||
toggle_initialized = false,
|
||||
bootstrap_nav_initialized = false;
|
||||
|
||||
var seq = 0,
|
||||
delays = 80,
|
||||
durations = 500;
|
||||
var seq2 = 0,
|
||||
delays2 = 80,
|
||||
durations2 = 500;
|
||||
|
||||
$(document).ready(function() {
|
||||
|
||||
$('body').bootstrapMaterialDesign();
|
||||
|
||||
$sidebar = $('.sidebar');
|
||||
|
||||
md.initSidebarsCheck();
|
||||
|
||||
window_width = $(window).width();
|
||||
|
||||
// check if there is an image set for the sidebar's background
|
||||
md.checkSidebarImage();
|
||||
|
||||
// Activate bootstrap-select
|
||||
if ($(".selectpicker").length != 0) {
|
||||
$(".selectpicker").selectpicker();
|
||||
}
|
||||
|
||||
// Activate the tooltips
|
||||
$('[rel="tooltip"]').tooltip();
|
||||
|
||||
$('.form-control').on("focus", function() {
|
||||
$(this).parent('.input-group').addClass("input-group-focus");
|
||||
}).on("blur", function() {
|
||||
$(this).parent(".input-group").removeClass("input-group-focus");
|
||||
});
|
||||
|
||||
// remove class has-error for checkbox validation
|
||||
$('input[type="checkbox"][required="true"], input[type="radio"][required="true"]').on('click', function() {
|
||||
if ($(this).hasClass('error')) {
|
||||
$(this).closest('div').removeClass('has-error');
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
$(document).on('click', '.navbar-toggler', function() {
|
||||
$toggle = $(this);
|
||||
|
||||
if (mobile_menu_visible == 1) {
|
||||
$('html').removeClass('nav-open');
|
||||
|
||||
$('.close-layer').remove();
|
||||
setTimeout(function() {
|
||||
$toggle.removeClass('toggled');
|
||||
}, 400);
|
||||
|
||||
mobile_menu_visible = 0;
|
||||
} else {
|
||||
setTimeout(function() {
|
||||
$toggle.addClass('toggled');
|
||||
}, 430);
|
||||
|
||||
var $layer = $('<div class="close-layer"></div>');
|
||||
|
||||
if ($('body').find('.main-panel').length != 0) {
|
||||
$layer.appendTo(".main-panel");
|
||||
|
||||
} else if (($('body').hasClass('off-canvas-sidebar'))) {
|
||||
$layer.appendTo(".wrapper-full-page");
|
||||
}
|
||||
|
||||
setTimeout(function() {
|
||||
$layer.addClass('visible');
|
||||
}, 100);
|
||||
|
||||
$layer.click(function() {
|
||||
$('html').removeClass('nav-open');
|
||||
mobile_menu_visible = 0;
|
||||
|
||||
$layer.removeClass('visible');
|
||||
|
||||
setTimeout(function() {
|
||||
$layer.remove();
|
||||
$toggle.removeClass('toggled');
|
||||
|
||||
}, 400);
|
||||
});
|
||||
|
||||
$('html').addClass('nav-open');
|
||||
mobile_menu_visible = 1;
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// activate collapse right menu when the windows is resized
|
||||
$(window).resize(function() {
|
||||
md.initSidebarsCheck();
|
||||
|
||||
// reset the seq for charts drawing animations
|
||||
seq = seq2 = 0;
|
||||
|
||||
setTimeout(function() {
|
||||
md.initDashboardPageCharts();
|
||||
}, 500);
|
||||
});
|
||||
|
||||
md = {
|
||||
misc: {
|
||||
navbar_menu_visible: 0,
|
||||
active_collapse: true,
|
||||
disabled_collapse_init: 0,
|
||||
},
|
||||
|
||||
checkSidebarImage: function() {
|
||||
$sidebar = $('.sidebar');
|
||||
image_src = $sidebar.data('image');
|
||||
|
||||
if (image_src !== undefined) {
|
||||
sidebar_container = '<div class="sidebar-background" style="background-image: url(' + image_src + ') "/>';
|
||||
$sidebar.append(sidebar_container);
|
||||
}
|
||||
},
|
||||
|
||||
showNotification: function(from, align) {
|
||||
type = ['', 'info', 'danger', 'success', 'warning', 'rose', 'primary'];
|
||||
|
||||
color = Math.floor((Math.random() * 6) + 1);
|
||||
|
||||
$.notify({
|
||||
icon: "add_alert",
|
||||
message: "Welcome to <b>Material Dashboard Pro</b> - a beautiful admin panel for every web developer."
|
||||
|
||||
}, {
|
||||
type: type[color],
|
||||
timer: 3000,
|
||||
placement: {
|
||||
from: from,
|
||||
align: align
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
initDocumentationCharts: function() {
|
||||
if ($('#dailySalesChart').length != 0 && $('#websiteViewsChart').length != 0) {
|
||||
/* ----------========== Daily Sales Chart initialization For Documentation ==========---------- */
|
||||
|
||||
dataDailySalesChart = {
|
||||
labels: ['M', 'T', 'W', 'T', 'F', 'S', 'S'],
|
||||
series: [
|
||||
[12, 17, 7, 17, 23, 18, 38]
|
||||
]
|
||||
};
|
||||
|
||||
optionsDailySalesChart = {
|
||||
lineSmooth: Chartist.Interpolation.cardinal({
|
||||
tension: 0
|
||||
}),
|
||||
low: 0,
|
||||
high: 50, // creative tim: we recommend you to set the high sa the biggest value + something for a better look
|
||||
chartPadding: {
|
||||
top: 0,
|
||||
right: 0,
|
||||
bottom: 0,
|
||||
left: 0
|
||||
},
|
||||
}
|
||||
|
||||
var dailySalesChart = new Chartist.Line('#dailySalesChart', dataDailySalesChart, optionsDailySalesChart);
|
||||
|
||||
var animationHeaderChart = new Chartist.Line('#websiteViewsChart', dataDailySalesChart, optionsDailySalesChart);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
initFormExtendedDatetimepickers: function() {
|
||||
$('.datetimepicker').datetimepicker({
|
||||
icons: {
|
||||
time: "fa fa-clock-o",
|
||||
date: "fa fa-calendar",
|
||||
up: "fa fa-chevron-up",
|
||||
down: "fa fa-chevron-down",
|
||||
previous: 'fa fa-chevron-left',
|
||||
next: 'fa fa-chevron-right',
|
||||
today: 'fa fa-screenshot',
|
||||
clear: 'fa fa-trash',
|
||||
close: 'fa fa-remove'
|
||||
}
|
||||
});
|
||||
|
||||
$('.datepicker').datetimepicker({
|
||||
format: 'MM/DD/YYYY',
|
||||
icons: {
|
||||
time: "fa fa-clock-o",
|
||||
date: "fa fa-calendar",
|
||||
up: "fa fa-chevron-up",
|
||||
down: "fa fa-chevron-down",
|
||||
previous: 'fa fa-chevron-left',
|
||||
next: 'fa fa-chevron-right',
|
||||
today: 'fa fa-screenshot',
|
||||
clear: 'fa fa-trash',
|
||||
close: 'fa fa-remove'
|
||||
}
|
||||
});
|
||||
|
||||
$('.timepicker').datetimepicker({
|
||||
// format: 'H:mm', // use this format if you want the 24hours timepicker
|
||||
format: 'h:mm A', //use this format if you want the 12hours timpiecker with AM/PM toggle
|
||||
icons: {
|
||||
time: "fa fa-clock-o",
|
||||
date: "fa fa-calendar",
|
||||
up: "fa fa-chevron-up",
|
||||
down: "fa fa-chevron-down",
|
||||
previous: 'fa fa-chevron-left',
|
||||
next: 'fa fa-chevron-right',
|
||||
today: 'fa fa-screenshot',
|
||||
clear: 'fa fa-trash',
|
||||
close: 'fa fa-remove'
|
||||
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
initSliders: function() {
|
||||
// Sliders for demo purpose
|
||||
var slider = document.getElementById('sliderRegular');
|
||||
|
||||
noUiSlider.create(slider, {
|
||||
start: 40,
|
||||
connect: [true, false],
|
||||
range: {
|
||||
min: 0,
|
||||
max: 100
|
||||
}
|
||||
});
|
||||
|
||||
var slider2 = document.getElementById('sliderDouble');
|
||||
|
||||
noUiSlider.create(slider2, {
|
||||
start: [20, 60],
|
||||
connect: true,
|
||||
range: {
|
||||
min: 0,
|
||||
max: 100
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
initSidebarsCheck: function() {
|
||||
if ($(window).width() <= 991) {
|
||||
if ($sidebar.length != 0) {
|
||||
md.initRightMenu();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
checkFullPageBackgroundImage: function() {
|
||||
$page = $('.full-page');
|
||||
image_src = $page.data('image');
|
||||
|
||||
if (image_src !== undefined) {
|
||||
image_container = '<div class="full-page-background" style="background-image: url(' + image_src + ') "/>'
|
||||
$page.append(image_container);
|
||||
}
|
||||
},
|
||||
|
||||
initDashboardPageCharts: function() {
|
||||
|
||||
if ($('#dailySalesChart').length != 0 || $('#completedTasksChart').length != 0 || $('#websiteViewsChart').length != 0) {
|
||||
/* ----------========== Daily Sales Chart initialization ==========---------- */
|
||||
|
||||
dataDailySalesChart = {
|
||||
labels: ['M', 'T', 'W', 'T', 'F', 'S', 'S'],
|
||||
series: [
|
||||
[12, 17, 7, 17, 23, 18, 38]
|
||||
]
|
||||
};
|
||||
|
||||
optionsDailySalesChart = {
|
||||
lineSmooth: Chartist.Interpolation.cardinal({
|
||||
tension: 0
|
||||
}),
|
||||
low: 0,
|
||||
high: 50, // creative tim: we recommend you to set the high sa the biggest value + something for a better look
|
||||
chartPadding: {
|
||||
top: 0,
|
||||
right: 0,
|
||||
bottom: 0,
|
||||
left: 0
|
||||
},
|
||||
}
|
||||
|
||||
var dailySalesChart = new Chartist.Line('#dailySalesChart', dataDailySalesChart, optionsDailySalesChart);
|
||||
|
||||
md.startAnimationForLineChart(dailySalesChart);
|
||||
|
||||
|
||||
|
||||
/* ----------========== Completed Tasks Chart initialization ==========---------- */
|
||||
|
||||
dataCompletedTasksChart = {
|
||||
labels: ['12p', '3p', '6p', '9p', '12p', '3a', '6a', '9a'],
|
||||
series: [
|
||||
[230, 750, 450, 300, 280, 240, 200, 190]
|
||||
]
|
||||
};
|
||||
|
||||
optionsCompletedTasksChart = {
|
||||
lineSmooth: Chartist.Interpolation.cardinal({
|
||||
tension: 0
|
||||
}),
|
||||
low: 0,
|
||||
high: 1000, // creative tim: we recommend you to set the high sa the biggest value + something for a better look
|
||||
chartPadding: {
|
||||
top: 0,
|
||||
right: 0,
|
||||
bottom: 0,
|
||||
left: 0
|
||||
}
|
||||
}
|
||||
|
||||
var completedTasksChart = new Chartist.Line('#completedTasksChart', dataCompletedTasksChart, optionsCompletedTasksChart);
|
||||
|
||||
// start animation for the Completed Tasks Chart - Line Chart
|
||||
md.startAnimationForLineChart(completedTasksChart);
|
||||
|
||||
|
||||
/* ----------========== Emails Subscription Chart initialization ==========---------- */
|
||||
|
||||
var dataWebsiteViewsChart = {
|
||||
labels: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
|
||||
series: [
|
||||
[542, 443, 320, 780, 553, 453, 326, 434, 568, 610, 756, 895]
|
||||
|
||||
]
|
||||
};
|
||||
var optionsWebsiteViewsChart = {
|
||||
axisX: {
|
||||
showGrid: false
|
||||
},
|
||||
low: 0,
|
||||
high: 1000,
|
||||
chartPadding: {
|
||||
top: 0,
|
||||
right: 5,
|
||||
bottom: 0,
|
||||
left: 0
|
||||
}
|
||||
};
|
||||
var responsiveOptions = [
|
||||
['screen and (max-width: 640px)', {
|
||||
seriesBarDistance: 5,
|
||||
axisX: {
|
||||
labelInterpolationFnc: function(value) {
|
||||
return value[0];
|
||||
}
|
||||
}
|
||||
}]
|
||||
];
|
||||
var websiteViewsChart = Chartist.Bar('#websiteViewsChart', dataWebsiteViewsChart, optionsWebsiteViewsChart, responsiveOptions);
|
||||
|
||||
//start animation for the Emails Subscription Chart
|
||||
md.startAnimationForBarChart(websiteViewsChart);
|
||||
}
|
||||
},
|
||||
|
||||
initMinimizeSidebar: function() {
|
||||
|
||||
$('#minimizeSidebar').click(function() {
|
||||
var $btn = $(this);
|
||||
|
||||
if (md.misc.sidebar_mini_active == true) {
|
||||
$('body').removeClass('sidebar-mini');
|
||||
md.misc.sidebar_mini_active = false;
|
||||
} else {
|
||||
$('body').addClass('sidebar-mini');
|
||||
md.misc.sidebar_mini_active = true;
|
||||
}
|
||||
|
||||
// we simulate the window Resize so the charts will get updated in realtime.
|
||||
var simulateWindowResize = setInterval(function() {
|
||||
window.dispatchEvent(new Event('resize'));
|
||||
}, 180);
|
||||
|
||||
// we stop the simulation of Window Resize after the animations are completed
|
||||
setTimeout(function() {
|
||||
clearInterval(simulateWindowResize);
|
||||
}, 1000);
|
||||
});
|
||||
},
|
||||
|
||||
checkScrollForTransparentNavbar: debounce(function() {
|
||||
if ($(document).scrollTop() > 260) {
|
||||
if (transparent) {
|
||||
transparent = false;
|
||||
$('.navbar-color-on-scroll').removeClass('navbar-transparent');
|
||||
}
|
||||
} else {
|
||||
if (!transparent) {
|
||||
transparent = true;
|
||||
$('.navbar-color-on-scroll').addClass('navbar-transparent');
|
||||
}
|
||||
}
|
||||
}, 17),
|
||||
|
||||
|
||||
initRightMenu: debounce(function() {
|
||||
$sidebar_wrapper = $('.sidebar-wrapper');
|
||||
|
||||
if (!mobile_menu_initialized) {
|
||||
$navbar = $('nav').find('.navbar-collapse').children('.navbar-nav');
|
||||
|
||||
mobile_menu_content = '';
|
||||
|
||||
nav_content = $navbar.html();
|
||||
|
||||
nav_content = '<ul class="nav navbar-nav nav-mobile-menu">' + nav_content + '</ul>';
|
||||
|
||||
navbar_form = $('nav').find('.navbar-form').get(0).outerHTML;
|
||||
|
||||
$sidebar_nav = $sidebar_wrapper.find(' > .nav');
|
||||
|
||||
// insert the navbar form before the sidebar list
|
||||
$nav_content = $(nav_content);
|
||||
$navbar_form = $(navbar_form);
|
||||
$nav_content.insertBefore($sidebar_nav);
|
||||
$navbar_form.insertBefore($nav_content);
|
||||
|
||||
$(".sidebar-wrapper .dropdown .dropdown-menu > li > a").click(function(event) {
|
||||
event.stopPropagation();
|
||||
|
||||
});
|
||||
|
||||
// simulate resize so all the charts/maps will be redrawn
|
||||
window.dispatchEvent(new Event('resize'));
|
||||
|
||||
mobile_menu_initialized = true;
|
||||
} else {
|
||||
if ($(window).width() > 991) {
|
||||
// reset all the additions that we made for the sidebar wrapper only if the screen is bigger than 991px
|
||||
$sidebar_wrapper.find('.navbar-form').remove();
|
||||
$sidebar_wrapper.find('.nav-mobile-menu').remove();
|
||||
|
||||
mobile_menu_initialized = false;
|
||||
}
|
||||
}
|
||||
}, 200),
|
||||
|
||||
startAnimationForLineChart: function(chart) {
|
||||
|
||||
chart.on('draw', function(data) {
|
||||
if (data.type === 'line' || data.type === 'area') {
|
||||
data.element.animate({
|
||||
d: {
|
||||
begin: 600,
|
||||
dur: 700,
|
||||
from: data.path.clone().scale(1, 0).translate(0, data.chartRect.height()).stringify(),
|
||||
to: data.path.clone().stringify(),
|
||||
easing: Chartist.Svg.Easing.easeOutQuint
|
||||
}
|
||||
});
|
||||
} else if (data.type === 'point') {
|
||||
seq++;
|
||||
data.element.animate({
|
||||
opacity: {
|
||||
begin: seq * delays,
|
||||
dur: durations,
|
||||
from: 0,
|
||||
to: 1,
|
||||
easing: 'ease'
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
seq = 0;
|
||||
},
|
||||
startAnimationForBarChart: function(chart) {
|
||||
|
||||
chart.on('draw', function(data) {
|
||||
if (data.type === 'bar') {
|
||||
seq2++;
|
||||
data.element.animate({
|
||||
opacity: {
|
||||
begin: seq2 * delays2,
|
||||
dur: durations2,
|
||||
from: 0,
|
||||
to: 1,
|
||||
easing: 'ease'
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
seq2 = 0;
|
||||
},
|
||||
|
||||
|
||||
initFullCalendar: function() {
|
||||
$calendar = $('#fullCalendar');
|
||||
|
||||
today = new Date();
|
||||
y = today.getFullYear();
|
||||
m = today.getMonth();
|
||||
d = today.getDate();
|
||||
|
||||
$calendar.fullCalendar({
|
||||
viewRender: function(view, element) {
|
||||
// We make sure that we activate the perfect scrollbar when the view isn't on Month
|
||||
if (view.name != 'month') {
|
||||
$(element).find('.fc-scroller').perfectScrollbar();
|
||||
}
|
||||
},
|
||||
header: {
|
||||
left: 'title',
|
||||
center: 'month,agendaWeek,agendaDay',
|
||||
right: 'prev,next,today'
|
||||
},
|
||||
defaultDate: today,
|
||||
selectable: true,
|
||||
selectHelper: true,
|
||||
views: {
|
||||
month: { // name of view
|
||||
titleFormat: 'MMMM YYYY'
|
||||
// other view-specific options here
|
||||
},
|
||||
week: {
|
||||
titleFormat: " MMMM D YYYY"
|
||||
},
|
||||
day: {
|
||||
titleFormat: 'D MMM, YYYY'
|
||||
}
|
||||
},
|
||||
|
||||
select: function(start, end) {
|
||||
|
||||
// on select we show the Sweet Alert modal with an input
|
||||
swal({
|
||||
title: 'Create an Event',
|
||||
html: '<div class="form-group">' +
|
||||
'<input class="form-control" placeholder="Event Title" id="input-field">' +
|
||||
'</div>',
|
||||
showCancelButton: true,
|
||||
confirmButtonClass: 'btn btn-success',
|
||||
cancelButtonClass: 'btn btn-danger',
|
||||
buttonsStyling: false
|
||||
}).then(function(result) {
|
||||
|
||||
var eventData;
|
||||
event_title = $('#input-field').val();
|
||||
|
||||
if (event_title) {
|
||||
eventData = {
|
||||
title: event_title,
|
||||
start: start,
|
||||
end: end
|
||||
};
|
||||
$calendar.fullCalendar('renderEvent', eventData, true); // stick? = true
|
||||
}
|
||||
|
||||
$calendar.fullCalendar('unselect');
|
||||
|
||||
})
|
||||
.catch(swal.noop);
|
||||
},
|
||||
editable: true,
|
||||
eventLimit: true, // allow "more" link when too many events
|
||||
|
||||
|
||||
// color classes: [ event-blue | event-azure | event-green | event-orange | event-red ]
|
||||
events: [{
|
||||
title: 'All Day Event',
|
||||
start: new Date(y, m, 1),
|
||||
className: 'event-default'
|
||||
},
|
||||
{
|
||||
id: 999,
|
||||
title: 'Repeating Event',
|
||||
start: new Date(y, m, d - 4, 6, 0),
|
||||
allDay: false,
|
||||
className: 'event-rose'
|
||||
},
|
||||
{
|
||||
id: 999,
|
||||
title: 'Repeating Event',
|
||||
start: new Date(y, m, d + 3, 6, 0),
|
||||
allDay: false,
|
||||
className: 'event-rose'
|
||||
},
|
||||
{
|
||||
title: 'Meeting',
|
||||
start: new Date(y, m, d - 1, 10, 30),
|
||||
allDay: false,
|
||||
className: 'event-green'
|
||||
},
|
||||
{
|
||||
title: 'Lunch',
|
||||
start: new Date(y, m, d + 7, 12, 0),
|
||||
end: new Date(y, m, d + 7, 14, 0),
|
||||
allDay: false,
|
||||
className: 'event-red'
|
||||
},
|
||||
{
|
||||
title: 'Md-pro Launch',
|
||||
start: new Date(y, m, d - 2, 12, 0),
|
||||
allDay: true,
|
||||
className: 'event-azure'
|
||||
},
|
||||
{
|
||||
title: 'Birthday Party',
|
||||
start: new Date(y, m, d + 1, 19, 0),
|
||||
end: new Date(y, m, d + 1, 22, 30),
|
||||
allDay: false,
|
||||
className: 'event-azure'
|
||||
},
|
||||
{
|
||||
title: 'Click for Creative Tim',
|
||||
start: new Date(y, m, 21),
|
||||
end: new Date(y, m, 22),
|
||||
url: 'http://www.creative-tim.com/',
|
||||
className: 'event-orange'
|
||||
},
|
||||
{
|
||||
title: 'Click for Google',
|
||||
start: new Date(y, m, 21),
|
||||
end: new Date(y, m, 22),
|
||||
url: 'http://www.creative-tim.com/',
|
||||
className: 'event-orange'
|
||||
}
|
||||
]
|
||||
});
|
||||
},
|
||||
|
||||
initVectorMap: function() {
|
||||
var mapData = {
|
||||
"AU": 760,
|
||||
"BR": 550,
|
||||
"CA": 120,
|
||||
"DE": 1300,
|
||||
"FR": 540,
|
||||
"GB": 690,
|
||||
"GE": 200,
|
||||
"IN": 200,
|
||||
"RO": 600,
|
||||
"RU": 300,
|
||||
"US": 2920,
|
||||
};
|
||||
|
||||
$('#worldMap').vectorMap({
|
||||
map: 'world_mill_en',
|
||||
backgroundColor: "transparent",
|
||||
zoomOnScroll: false,
|
||||
regionStyle: {
|
||||
initial: {
|
||||
fill: '#e4e4e4',
|
||||
"fill-opacity": 0.9,
|
||||
stroke: 'none',
|
||||
"stroke-width": 0,
|
||||
"stroke-opacity": 0
|
||||
}
|
||||
},
|
||||
|
||||
series: {
|
||||
regions: [{
|
||||
values: mapData,
|
||||
scale: ["#AAAAAA", "#444444"],
|
||||
normalizeFunction: 'polynomial'
|
||||
}]
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Returns a function, that, as long as it continues to be invoked, will not
|
||||
// be triggered. The function will be called after it stops being called for
|
||||
// N milliseconds. If `immediate` is passed, trigger the function on the
|
||||
// leading edge, instead of the trailing.
|
||||
|
||||
function debounce(func, wait, immediate) {
|
||||
var timeout;
|
||||
return function() {
|
||||
var context = this,
|
||||
args = arguments;
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(function() {
|
||||
timeout = null;
|
||||
if (!immediate) func.apply(context, args);
|
||||
}, wait);
|
||||
if (immediate && !timeout) func.apply(context, args);
|
||||
};
|
||||
};
|
||||
1
staticfiles/assets/js/material-dashboard.js.map
Normal file
2
staticfiles/assets/js/material-dashboard.min.js
vendored
Normal file
10
staticfiles/assets/js/plugins/arrive.min.js
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
/*
|
||||
* arrive.js
|
||||
* v2.4.1
|
||||
* https://github.com/uzairfarooq/arrive
|
||||
* MIT licensed
|
||||
*
|
||||
* Copyright (c) 2014-2017 Uzair Farooq
|
||||
*/
|
||||
|
||||
var Arrive=function(e,t,n){"use strict";function r(e,t,n){l.addMethod(t,n,e.unbindEvent),l.addMethod(t,n,e.unbindEventWithSelectorOrCallback),l.addMethod(t,n,e.unbindEventWithSelectorAndCallback)}function i(e){e.arrive=f.bindEvent,r(f,e,"unbindArrive"),e.leave=d.bindEvent,r(d,e,"unbindLeave")}if(e.MutationObserver&&"undefined"!=typeof HTMLElement){var o=0,l=function(){var t=HTMLElement.prototype.matches||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector;return{matchesSelector:function(e,n){return e instanceof HTMLElement&&t.call(e,n)},addMethod:function(e,t,r){var i=e[t];e[t]=function(){return r.length==arguments.length?r.apply(this,arguments):"function"==typeof i?i.apply(this,arguments):n}},callCallbacks:function(e,t){t&&t.options.onceOnly&&1==t.firedElems.length&&(e=[e[0]]);for(var n,r=0;n=e[r];r++)n&&n.callback&&n.callback.call(n.elem,n.elem);t&&t.options.onceOnly&&1==t.firedElems.length&&t.me.unbindEventWithSelectorAndCallback.call(t.target,t.selector,t.callback)},checkChildNodesRecursively:function(e,t,n,r){for(var i,o=0;i=e[o];o++)n(i,t,r)&&r.push({callback:t.callback,elem:i}),i.childNodes.length>0&&l.checkChildNodesRecursively(i.childNodes,t,n,r)},mergeArrays:function(e,t){var n,r={};for(n in e)e.hasOwnProperty(n)&&(r[n]=e[n]);for(n in t)t.hasOwnProperty(n)&&(r[n]=t[n]);return r},toElementsArray:function(t){return n===t||"number"==typeof t.length&&t!==e||(t=[t]),t}}}(),c=function(){var e=function(){this._eventsBucket=[],this._beforeAdding=null,this._beforeRemoving=null};return e.prototype.addEvent=function(e,t,n,r){var i={target:e,selector:t,options:n,callback:r,firedElems:[]};return this._beforeAdding&&this._beforeAdding(i),this._eventsBucket.push(i),i},e.prototype.removeEvent=function(e){for(var t,n=this._eventsBucket.length-1;t=this._eventsBucket[n];n--)if(e(t)){this._beforeRemoving&&this._beforeRemoving(t);var r=this._eventsBucket.splice(n,1);r&&r.length&&(r[0].callback=null)}},e.prototype.beforeAdding=function(e){this._beforeAdding=e},e.prototype.beforeRemoving=function(e){this._beforeRemoving=e},e}(),a=function(t,r){var i=new c,o=this,a={fireOnAttributesModification:!1};return i.beforeAdding(function(n){var i,l=n.target;(l===e.document||l===e)&&(l=document.getElementsByTagName("html")[0]),i=new MutationObserver(function(e){r.call(this,e,n)});var c=t(n.options);i.observe(l,c),n.observer=i,n.me=o}),i.beforeRemoving(function(e){e.observer.disconnect()}),this.bindEvent=function(e,t,n){t=l.mergeArrays(a,t);for(var r=l.toElementsArray(this),o=0;o<r.length;o++)i.addEvent(r[o],e,t,n)},this.unbindEvent=function(){var e=l.toElementsArray(this);i.removeEvent(function(t){for(var r=0;r<e.length;r++)if(this===n||t.target===e[r])return!0;return!1})},this.unbindEventWithSelectorOrCallback=function(e){var t,r=l.toElementsArray(this),o=e;t="function"==typeof e?function(e){for(var t=0;t<r.length;t++)if((this===n||e.target===r[t])&&e.callback===o)return!0;return!1}:function(t){for(var i=0;i<r.length;i++)if((this===n||t.target===r[i])&&t.selector===e)return!0;return!1},i.removeEvent(t)},this.unbindEventWithSelectorAndCallback=function(e,t){var r=l.toElementsArray(this);i.removeEvent(function(i){for(var o=0;o<r.length;o++)if((this===n||i.target===r[o])&&i.selector===e&&i.callback===t)return!0;return!1})},this},s=function(){function e(e){var t={attributes:!1,childList:!0,subtree:!0};return e.fireOnAttributesModification&&(t.attributes=!0),t}function t(e,t){e.forEach(function(e){var n=e.addedNodes,i=e.target,o=[];null!==n&&n.length>0?l.checkChildNodesRecursively(n,t,r,o):"attributes"===e.type&&r(i,t,o)&&o.push({callback:t.callback,elem:i}),l.callCallbacks(o,t)})}function r(e,t){return l.matchesSelector(e,t.selector)&&(e._id===n&&(e._id=o++),-1==t.firedElems.indexOf(e._id))?(t.firedElems.push(e._id),!0):!1}var i={fireOnAttributesModification:!1,onceOnly:!1,existing:!1};f=new a(e,t);var c=f.bindEvent;return f.bindEvent=function(e,t,r){n===r?(r=t,t=i):t=l.mergeArrays(i,t);var o=l.toElementsArray(this);if(t.existing){for(var a=[],s=0;s<o.length;s++)for(var u=o[s].querySelectorAll(e),f=0;f<u.length;f++)a.push({callback:r,elem:u[f]});if(t.onceOnly&&a.length)return r.call(a[0].elem,a[0].elem);setTimeout(l.callCallbacks,1,a)}c.call(this,e,t,r)},f},u=function(){function e(){var e={childList:!0,subtree:!0};return e}function t(e,t){e.forEach(function(e){var n=e.removedNodes,i=[];null!==n&&n.length>0&&l.checkChildNodesRecursively(n,t,r,i),l.callCallbacks(i,t)})}function r(e,t){return l.matchesSelector(e,t.selector)}var i={};d=new a(e,t);var o=d.bindEvent;return d.bindEvent=function(e,t,r){n===r?(r=t,t=i):t=l.mergeArrays(i,t),o.call(this,e,t,r)},d},f=new s,d=new u;t&&i(t.fn),i(HTMLElement.prototype),i(NodeList.prototype),i(HTMLCollection.prototype),i(HTMLDocument.prototype),i(Window.prototype);var h={};return r(f,h,"unbindAllArrive"),r(d,h,"unbindAllLeave"),h}}(window,"undefined"==typeof jQuery?null:jQuery,void 0);
|
||||
47
staticfiles/assets/js/plugins/bootstrap-datetimepicker.min.js
vendored
Normal file
404
staticfiles/assets/js/plugins/bootstrap-notify.js
vendored
Normal file
@@ -0,0 +1,404 @@
|
||||
/*
|
||||
|
||||
|
||||
|
||||
Creative Tim Modifications
|
||||
|
||||
Lines: 236 was changed from top: 5px to top: 50% and we added margin-top: -9px. In this way the close button will be aligned vertically
|
||||
Line:219 - modified when the icon is set, we add the class "alert-with-icon", so there will be enough space for the icon.
|
||||
Lines: 179/222 - class() was changed to html() so we can add the Material Design Icons
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Project: Bootstrap Notify = v3.1.5
|
||||
* Description: Turns standard Bootstrap alerts into "Growl-like" notifications.
|
||||
* Author: Mouse0270 aka Robert McIntosh
|
||||
* License: MIT License
|
||||
* Website: https://github.com/mouse0270/bootstrap-growl
|
||||
*/
|
||||
|
||||
/* global define:false, require: false, jQuery:false */
|
||||
|
||||
(function(factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define(['jquery'], factory);
|
||||
} else if (typeof exports === 'object') {
|
||||
// Node/CommonJS
|
||||
factory(require('jquery'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function($) {
|
||||
// Create the defaults once
|
||||
var defaults = {
|
||||
element: 'body',
|
||||
position: null,
|
||||
type: "info",
|
||||
allow_dismiss: true,
|
||||
allow_duplicates: true,
|
||||
newest_on_top: false,
|
||||
showProgressbar: false,
|
||||
placement: {
|
||||
from: "top",
|
||||
align: "right"
|
||||
},
|
||||
offset: 20,
|
||||
spacing: 10,
|
||||
z_index: 1031,
|
||||
delay: 5000,
|
||||
timer: 1000,
|
||||
url_target: '_blank',
|
||||
mouse_over: null,
|
||||
animate: {
|
||||
enter: 'animated fadeInDown',
|
||||
exit: 'animated fadeOutUp'
|
||||
},
|
||||
onShow: null,
|
||||
onShown: null,
|
||||
onClose: null,
|
||||
onClosed: null,
|
||||
icon_type: 'class',
|
||||
template: '<div data-notify="container" class="col-11 col-md-4 alert alert-{0}" role="alert"><button type="button" aria-hidden="true" class="close" data-notify="dismiss"><i class="material-icons">close</i></button><i data-notify="icon" class="material-icons"></i><span data-notify="title">{1}</span> <span data-notify="message">{2}</span><div class="progress" data-notify="progressbar"><div class="progress-bar progress-bar-{0}" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;"></div></div><a href="{3}" target="{4}" data-notify="url"></a></div>'
|
||||
};
|
||||
|
||||
String.format = function() {
|
||||
var str = arguments[0];
|
||||
for (var i = 1; i < arguments.length; i++) {
|
||||
str = str.replace(RegExp("\\{" + (i - 1) + "\\}", "gm"), arguments[i]);
|
||||
}
|
||||
return str;
|
||||
};
|
||||
|
||||
function isDuplicateNotification(notification) {
|
||||
var isDupe = false;
|
||||
|
||||
$('[data-notify="container"]').each(function(i, el) {
|
||||
var $el = $(el);
|
||||
var title = $el.find('[data-notify="title"]').text().trim();
|
||||
var message = $el.find('[data-notify="message"]').html().trim();
|
||||
|
||||
// The input string might be different than the actual parsed HTML string!
|
||||
// (<br> vs <br /> for example)
|
||||
// So we have to force-parse this as HTML here!
|
||||
var isSameTitle = title === $("<div>" + notification.settings.content.title + "</div>").html().trim();
|
||||
var isSameMsg = message === $("<div>" + notification.settings.content.message + "</div>").html().trim();
|
||||
var isSameType = $el.hasClass('alert-' + notification.settings.type);
|
||||
|
||||
if (isSameTitle && isSameMsg && isSameType) {
|
||||
//we found the dupe. Set the var and stop checking.
|
||||
isDupe = true;
|
||||
}
|
||||
return !isDupe;
|
||||
});
|
||||
|
||||
return isDupe;
|
||||
}
|
||||
|
||||
function Notify(element, content, options) {
|
||||
// Setup Content of Notify
|
||||
var contentObj = {
|
||||
content: {
|
||||
message: typeof content === 'object' ? content.message : content,
|
||||
title: content.title ? content.title : '',
|
||||
icon: content.icon ? content.icon : '',
|
||||
url: content.url ? content.url : '#',
|
||||
target: content.target ? content.target : '-'
|
||||
}
|
||||
};
|
||||
|
||||
options = $.extend(true, {}, contentObj, options);
|
||||
this.settings = $.extend(true, {}, defaults, options);
|
||||
this._defaults = defaults;
|
||||
if (this.settings.content.target === "-") {
|
||||
this.settings.content.target = this.settings.url_target;
|
||||
}
|
||||
this.animations = {
|
||||
start: 'webkitAnimationStart oanimationstart MSAnimationStart animationstart',
|
||||
end: 'webkitAnimationEnd oanimationend MSAnimationEnd animationend'
|
||||
};
|
||||
|
||||
if (typeof this.settings.offset === 'number') {
|
||||
this.settings.offset = {
|
||||
x: this.settings.offset,
|
||||
y: this.settings.offset
|
||||
};
|
||||
}
|
||||
|
||||
//if duplicate messages are not allowed, then only continue if this new message is not a duplicate of one that it already showing
|
||||
if (this.settings.allow_duplicates || (!this.settings.allow_duplicates && !isDuplicateNotification(this))) {
|
||||
this.init();
|
||||
}
|
||||
}
|
||||
|
||||
$.extend(Notify.prototype, {
|
||||
init: function() {
|
||||
var self = this;
|
||||
|
||||
this.buildNotify();
|
||||
if (this.settings.content.icon) {
|
||||
this.setIcon();
|
||||
}
|
||||
if (this.settings.content.url != "#") {
|
||||
this.styleURL();
|
||||
}
|
||||
this.styleDismiss();
|
||||
this.placement();
|
||||
this.bind();
|
||||
|
||||
this.notify = {
|
||||
$ele: this.$ele,
|
||||
update: function(command, update) {
|
||||
var commands = {};
|
||||
if (typeof command === "string") {
|
||||
commands[command] = update;
|
||||
} else {
|
||||
commands = command;
|
||||
}
|
||||
for (var cmd in commands) {
|
||||
switch (cmd) {
|
||||
case "type":
|
||||
this.$ele.removeClass('alert-' + self.settings.type);
|
||||
this.$ele.find('[data-notify="progressbar"] > .progress-bar').removeClass('progress-bar-' + self.settings.type);
|
||||
self.settings.type = commands[cmd];
|
||||
this.$ele.addClass('alert-' + commands[cmd]).find('[data-notify="progressbar"] > .progress-bar').addClass('progress-bar-' + commands[cmd]);
|
||||
break;
|
||||
case "icon":
|
||||
var $icon = this.$ele.find('[data-notify="icon"]');
|
||||
if (self.settings.icon_type.toLowerCase() === 'class') {
|
||||
$icon.html(commands[cmd]);
|
||||
} else {
|
||||
if (!$icon.is('img')) {
|
||||
$icon.find('img');
|
||||
}
|
||||
$icon.attr('src', commands[cmd]);
|
||||
}
|
||||
break;
|
||||
case "progress":
|
||||
var newDelay = self.settings.delay - (self.settings.delay * (commands[cmd] / 100));
|
||||
this.$ele.data('notify-delay', newDelay);
|
||||
this.$ele.find('[data-notify="progressbar"] > div').attr('aria-valuenow', commands[cmd]).css('width', commands[cmd] + '%');
|
||||
break;
|
||||
case "url":
|
||||
this.$ele.find('[data-notify="url"]').attr('href', commands[cmd]);
|
||||
break;
|
||||
case "target":
|
||||
this.$ele.find('[data-notify="url"]').attr('target', commands[cmd]);
|
||||
break;
|
||||
default:
|
||||
this.$ele.find('[data-notify="' + cmd + '"]').html(commands[cmd]);
|
||||
}
|
||||
}
|
||||
var posX = this.$ele.outerHeight() + parseInt(self.settings.spacing) + parseInt(self.settings.offset.y);
|
||||
self.reposition(posX);
|
||||
},
|
||||
close: function() {
|
||||
self.close();
|
||||
}
|
||||
};
|
||||
|
||||
},
|
||||
buildNotify: function() {
|
||||
var content = this.settings.content;
|
||||
this.$ele = $(String.format(this.settings.template, this.settings.type, content.title, content.message, content.url, content.target));
|
||||
this.$ele.attr('data-notify-position', this.settings.placement.from + '-' + this.settings.placement.align);
|
||||
if (!this.settings.allow_dismiss) {
|
||||
this.$ele.find('[data-notify="dismiss"]').css('display', 'none');
|
||||
}
|
||||
if ((this.settings.delay <= 0 && !this.settings.showProgressbar) || !this.settings.showProgressbar) {
|
||||
this.$ele.find('[data-notify="progressbar"]').remove();
|
||||
}
|
||||
},
|
||||
setIcon: function() {
|
||||
|
||||
this.$ele.addClass('alert-with-icon');
|
||||
|
||||
if (this.settings.icon_type.toLowerCase() === 'class') {
|
||||
this.$ele.find('[data-notify="icon"]').html(this.settings.content.icon);
|
||||
} else {
|
||||
if (this.$ele.find('[data-notify="icon"]').is('img')) {
|
||||
this.$ele.find('[data-notify="icon"]').attr('src', this.settings.content.icon);
|
||||
} else {
|
||||
this.$ele.find('[data-notify="icon"]').append('<img src="' + this.settings.content.icon + '" alt="Notify Icon" />');
|
||||
}
|
||||
}
|
||||
},
|
||||
styleDismiss: function() {
|
||||
this.$ele.find('[data-notify="dismiss"]').css({
|
||||
position: 'absolute',
|
||||
right: '10px',
|
||||
top: '50%',
|
||||
marginTop: '-9px',
|
||||
zIndex: this.settings.z_index + 2
|
||||
});
|
||||
},
|
||||
styleURL: function() {
|
||||
this.$ele.find('[data-notify="url"]').css({
|
||||
backgroundImage: 'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)',
|
||||
height: '100%',
|
||||
left: 0,
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
width: '100%',
|
||||
zIndex: this.settings.z_index + 1
|
||||
});
|
||||
},
|
||||
placement: function() {
|
||||
var self = this,
|
||||
offsetAmt = this.settings.offset.y,
|
||||
css = {
|
||||
display: 'inline-block',
|
||||
margin: '15px auto',
|
||||
position: this.settings.position ? this.settings.position : (this.settings.element === 'body' ? 'fixed' : 'absolute'),
|
||||
transition: 'all .5s ease-in-out',
|
||||
zIndex: this.settings.z_index
|
||||
},
|
||||
hasAnimation = false,
|
||||
settings = this.settings;
|
||||
|
||||
$('[data-notify-position="' + this.settings.placement.from + '-' + this.settings.placement.align + '"]:not([data-closing="true"])').each(function() {
|
||||
offsetAmt = Math.max(offsetAmt, parseInt($(this).css(settings.placement.from)) + parseInt($(this).outerHeight()) + parseInt(settings.spacing));
|
||||
});
|
||||
if (this.settings.newest_on_top === true) {
|
||||
offsetAmt = this.settings.offset.y;
|
||||
}
|
||||
css[this.settings.placement.from] = offsetAmt + 'px';
|
||||
|
||||
switch (this.settings.placement.align) {
|
||||
case "left":
|
||||
case "right":
|
||||
css[this.settings.placement.align] = this.settings.offset.x + 'px';
|
||||
break;
|
||||
case "center":
|
||||
css.left = 0;
|
||||
css.right = 0;
|
||||
break;
|
||||
}
|
||||
this.$ele.css(css).addClass(this.settings.animate.enter);
|
||||
$.each(Array('webkit-', 'moz-', 'o-', 'ms-', ''), function(index, prefix) {
|
||||
self.$ele[0].style[prefix + 'AnimationIterationCount'] = 1;
|
||||
});
|
||||
|
||||
$(this.settings.element).append(this.$ele);
|
||||
|
||||
if (this.settings.newest_on_top === true) {
|
||||
offsetAmt = (parseInt(offsetAmt) + parseInt(this.settings.spacing)) + this.$ele.outerHeight();
|
||||
this.reposition(offsetAmt);
|
||||
}
|
||||
|
||||
if ($.isFunction(self.settings.onShow)) {
|
||||
self.settings.onShow.call(this.$ele);
|
||||
}
|
||||
|
||||
this.$ele.one(this.animations.start, function() {
|
||||
hasAnimation = true;
|
||||
}).one(this.animations.end, function() {
|
||||
if ($.isFunction(self.settings.onShown)) {
|
||||
self.settings.onShown.call(this);
|
||||
}
|
||||
});
|
||||
|
||||
setTimeout(function() {
|
||||
if (!hasAnimation) {
|
||||
if ($.isFunction(self.settings.onShown)) {
|
||||
self.settings.onShown.call(this);
|
||||
}
|
||||
}
|
||||
}, 600);
|
||||
},
|
||||
bind: function() {
|
||||
var self = this;
|
||||
|
||||
this.$ele.find('[data-notify="dismiss"]').on('click', function() {
|
||||
self.close();
|
||||
});
|
||||
|
||||
this.$ele.mouseover(function() {
|
||||
$(this).data('data-hover', "true");
|
||||
}).mouseout(function() {
|
||||
$(this).data('data-hover', "false");
|
||||
});
|
||||
this.$ele.data('data-hover', "false");
|
||||
|
||||
if (this.settings.delay > 0) {
|
||||
self.$ele.data('notify-delay', self.settings.delay);
|
||||
var timer = setInterval(function() {
|
||||
var delay = parseInt(self.$ele.data('notify-delay')) - self.settings.timer;
|
||||
if ((self.$ele.data('data-hover') === 'false' && self.settings.mouse_over === "pause") || self.settings.mouse_over != "pause") {
|
||||
var percent = ((self.settings.delay - delay) / self.settings.delay) * 100;
|
||||
self.$ele.data('notify-delay', delay);
|
||||
self.$ele.find('[data-notify="progressbar"] > div').attr('aria-valuenow', percent).css('width', percent + '%');
|
||||
}
|
||||
if (delay <= -(self.settings.timer)) {
|
||||
clearInterval(timer);
|
||||
self.close();
|
||||
}
|
||||
}, self.settings.timer);
|
||||
}
|
||||
},
|
||||
close: function() {
|
||||
var self = this,
|
||||
posX = parseInt(this.$ele.css(this.settings.placement.from)),
|
||||
hasAnimation = false;
|
||||
|
||||
this.$ele.data('closing', 'true').addClass(this.settings.animate.exit);
|
||||
self.reposition(posX);
|
||||
|
||||
if ($.isFunction(self.settings.onClose)) {
|
||||
self.settings.onClose.call(this.$ele);
|
||||
}
|
||||
|
||||
this.$ele.one(this.animations.start, function() {
|
||||
hasAnimation = true;
|
||||
}).one(this.animations.end, function() {
|
||||
$(this).remove();
|
||||
if ($.isFunction(self.settings.onClosed)) {
|
||||
self.settings.onClosed.call(this);
|
||||
}
|
||||
});
|
||||
|
||||
setTimeout(function() {
|
||||
if (!hasAnimation) {
|
||||
self.$ele.remove();
|
||||
if (self.settings.onClosed) {
|
||||
self.settings.onClosed(self.$ele);
|
||||
}
|
||||
}
|
||||
}, 600);
|
||||
},
|
||||
reposition: function(posX) {
|
||||
var self = this,
|
||||
notifies = '[data-notify-position="' + this.settings.placement.from + '-' + this.settings.placement.align + '"]:not([data-closing="true"])',
|
||||
$elements = this.$ele.nextAll(notifies);
|
||||
if (this.settings.newest_on_top === true) {
|
||||
$elements = this.$ele.prevAll(notifies);
|
||||
}
|
||||
$elements.each(function() {
|
||||
$(this).css(self.settings.placement.from, posX);
|
||||
posX = (parseInt(posX) + parseInt(self.settings.spacing)) + $(this).outerHeight();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$.notify = function(content, options) {
|
||||
var plugin = new Notify(this, content, options);
|
||||
return plugin.notify;
|
||||
};
|
||||
$.notifyDefaults = function(options) {
|
||||
defaults = $.extend(true, {}, defaults, options);
|
||||
return defaults;
|
||||
};
|
||||
$.notifyClose = function(command) {
|
||||
if (typeof command === "undefined" || command === "all") {
|
||||
$('[data-notify]').find('[data-notify="dismiss"]').trigger('click');
|
||||
} else {
|
||||
$('[data-notify-position="' + command + '"]').find('[data-notify="dismiss"]').trigger('click');
|
||||
}
|
||||
};
|
||||
|
||||
}));
|
||||
2699
staticfiles/assets/js/plugins/bootstrap-selectpicker.js
vendored
Normal file
718
staticfiles/assets/js/plugins/bootstrap-tagsinput.js
vendored
Normal file
@@ -0,0 +1,718 @@
|
||||
/*
|
||||
* bootstrap-tagsinput v0.8.0
|
||||
*
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
"use strict";
|
||||
|
||||
var defaultOptions = {
|
||||
tagClass: function(item) {
|
||||
return 'badge';
|
||||
},
|
||||
focusClass: 'focus',
|
||||
itemValue: function(item) {
|
||||
return item ? item.toString() : item;
|
||||
},
|
||||
itemText: function(item) {
|
||||
return this.itemValue(item);
|
||||
},
|
||||
itemTitle: function(item) {
|
||||
return null;
|
||||
},
|
||||
freeInput: true,
|
||||
addOnBlur: true,
|
||||
maxTags: undefined,
|
||||
maxChars: undefined,
|
||||
confirmKeys: [13, 44],
|
||||
delimiter: ',',
|
||||
delimiterRegex: null,
|
||||
cancelConfirmKeysOnEmpty: false,
|
||||
onTagExists: function(item, $tag) {
|
||||
$tag.hide().fadeIn();
|
||||
},
|
||||
trimValue: false,
|
||||
allowDuplicates: false,
|
||||
triggerChange: true
|
||||
};
|
||||
|
||||
/**
|
||||
* Constructor function
|
||||
*/
|
||||
function TagsInput(element, options) {
|
||||
this.isInit = true;
|
||||
this.itemsArray = [];
|
||||
|
||||
this.$element = $(element);
|
||||
this.$element.hide();
|
||||
|
||||
this.isSelect = (element.tagName === 'SELECT');
|
||||
this.multiple = (this.isSelect && element.hasAttribute('multiple'));
|
||||
this.objectItems = options && options.itemValue;
|
||||
this.placeholderText = element.hasAttribute('placeholder') ? this.$element.attr('placeholder') : '';
|
||||
this.inputSize = Math.max(1, this.placeholderText.length);
|
||||
|
||||
this.$container = $('<div class="bootstrap-tagsinput"></div>');
|
||||
this.$input = $('<input type="text" class="form-control" placeholder="' + this.placeholderText + '"/>').appendTo(this.$container);
|
||||
|
||||
this.$element.before(this.$container);
|
||||
|
||||
this.build(options);
|
||||
this.isInit = false;
|
||||
}
|
||||
|
||||
TagsInput.prototype = {
|
||||
constructor: TagsInput,
|
||||
|
||||
/**
|
||||
* Adds the given item as a new tag. Pass true to dontPushVal to prevent
|
||||
* updating the elements val()
|
||||
*/
|
||||
add: function(item, dontPushVal, options) {
|
||||
var self = this;
|
||||
|
||||
if (self.options.maxTags && self.itemsArray.length >= self.options.maxTags)
|
||||
return;
|
||||
|
||||
// Ignore falsey values, except false
|
||||
if (item !== false && !item)
|
||||
return;
|
||||
|
||||
// Trim value
|
||||
if (typeof item === "string" && self.options.trimValue) {
|
||||
item = $.trim(item);
|
||||
}
|
||||
|
||||
// Throw an error when trying to add an object while the itemValue option was not set
|
||||
if (typeof item === "object" && !self.objectItems)
|
||||
throw ("Can't add objects when itemValue option is not set");
|
||||
|
||||
// Ignore strings only containg whitespace
|
||||
if (item.toString().match(/^\s*$/))
|
||||
return;
|
||||
|
||||
// If SELECT but not multiple, remove current tag
|
||||
if (self.isSelect && !self.multiple && self.itemsArray.length > 0)
|
||||
self.remove(self.itemsArray[0]);
|
||||
|
||||
if (typeof item === "string" && this.$element[0].tagName === 'INPUT') {
|
||||
var delimiter = (self.options.delimiterRegex) ? self.options.delimiterRegex : self.options.delimiter;
|
||||
var items = item.split(delimiter);
|
||||
if (items.length > 1) {
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
this.add(items[i], true);
|
||||
}
|
||||
|
||||
if (!dontPushVal)
|
||||
self.pushVal(self.options.triggerChange);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
var itemValue = self.options.itemValue(item),
|
||||
itemText = self.options.itemText(item),
|
||||
tagClass = self.options.tagClass(item),
|
||||
itemTitle = self.options.itemTitle(item);
|
||||
|
||||
// Ignore items allready added
|
||||
var existing = $.grep(self.itemsArray, function(item) {
|
||||
return self.options.itemValue(item) === itemValue;
|
||||
})[0];
|
||||
if (existing && !self.options.allowDuplicates) {
|
||||
// Invoke onTagExists
|
||||
if (self.options.onTagExists) {
|
||||
var $existingTag = $(".tag", self.$container).filter(function() {
|
||||
return $(this).data("item") === existing;
|
||||
});
|
||||
self.options.onTagExists(item, $existingTag);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// if length greater than limit
|
||||
if (self.items().toString().length + item.length + 1 > self.options.maxInputLength)
|
||||
return;
|
||||
|
||||
// raise beforeItemAdd arg
|
||||
var beforeItemAddEvent = $.Event('beforeItemAdd', {
|
||||
item: item,
|
||||
cancel: false,
|
||||
options: options
|
||||
});
|
||||
self.$element.trigger(beforeItemAddEvent);
|
||||
if (beforeItemAddEvent.cancel)
|
||||
return;
|
||||
|
||||
// register item in internal array and map
|
||||
self.itemsArray.push(item);
|
||||
|
||||
// add a tag element
|
||||
|
||||
var $tag = $('<span class="tag ' + htmlEncode(tagClass) + (itemTitle !== null ? ('" title="' + itemTitle) : '') + '">' + htmlEncode(itemText) + '<span data-role="remove"></span></span>');
|
||||
$tag.data('item', item);
|
||||
self.findInputWrapper().before($tag);
|
||||
$tag.after(' ');
|
||||
|
||||
// Check to see if the tag exists in its raw or uri-encoded form
|
||||
var optionExists = (
|
||||
$('option[value="' + encodeURIComponent(itemValue) + '"]', self.$element).length ||
|
||||
$('option[value="' + htmlEncode(itemValue) + '"]', self.$element).length
|
||||
);
|
||||
|
||||
// add <option /> if item represents a value not present in one of the <select />'s options
|
||||
if (self.isSelect && !optionExists) {
|
||||
var $option = $('<option selected>' + htmlEncode(itemText) + '</option>');
|
||||
$option.data('item', item);
|
||||
$option.attr('value', itemValue);
|
||||
self.$element.append($option);
|
||||
}
|
||||
|
||||
if (!dontPushVal)
|
||||
self.pushVal(self.options.triggerChange);
|
||||
|
||||
// Add class when reached maxTags
|
||||
if (self.options.maxTags === self.itemsArray.length || self.items().toString().length === self.options.maxInputLength)
|
||||
self.$container.addClass('bootstrap-tagsinput-max');
|
||||
|
||||
// If using typeahead, once the tag has been added, clear the typeahead value so it does not stick around in the input.
|
||||
if ($('.typeahead, .twitter-typeahead', self.$container).length) {
|
||||
self.$input.typeahead('val', '');
|
||||
}
|
||||
|
||||
if (this.isInit) {
|
||||
self.$element.trigger($.Event('itemAddedOnInit', {
|
||||
item: item,
|
||||
options: options
|
||||
}));
|
||||
} else {
|
||||
self.$element.trigger($.Event('itemAdded', {
|
||||
item: item,
|
||||
options: options
|
||||
}));
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Removes the given item. Pass true to dontPushVal to prevent updating the
|
||||
* elements val()
|
||||
*/
|
||||
remove: function(item, dontPushVal, options) {
|
||||
var self = this;
|
||||
|
||||
if (self.objectItems) {
|
||||
if (typeof item === "object")
|
||||
item = $.grep(self.itemsArray, function(other) {
|
||||
return self.options.itemValue(other) == self.options.itemValue(item);
|
||||
});
|
||||
else
|
||||
item = $.grep(self.itemsArray, function(other) {
|
||||
return self.options.itemValue(other) == item;
|
||||
});
|
||||
|
||||
item = item[item.length - 1];
|
||||
}
|
||||
|
||||
if (item) {
|
||||
var beforeItemRemoveEvent = $.Event('beforeItemRemove', {
|
||||
item: item,
|
||||
cancel: false,
|
||||
options: options
|
||||
});
|
||||
self.$element.trigger(beforeItemRemoveEvent);
|
||||
if (beforeItemRemoveEvent.cancel)
|
||||
return;
|
||||
|
||||
$('.tag', self.$container).filter(function() {
|
||||
return $(this).data('item') === item;
|
||||
}).remove();
|
||||
$('option', self.$element).filter(function() {
|
||||
return $(this).data('item') === item;
|
||||
}).remove();
|
||||
if ($.inArray(item, self.itemsArray) !== -1)
|
||||
self.itemsArray.splice($.inArray(item, self.itemsArray), 1);
|
||||
}
|
||||
|
||||
if (!dontPushVal)
|
||||
self.pushVal(self.options.triggerChange);
|
||||
|
||||
// Remove class when reached maxTags
|
||||
if (self.options.maxTags > self.itemsArray.length)
|
||||
self.$container.removeClass('bootstrap-tagsinput-max');
|
||||
|
||||
self.$element.trigger($.Event('itemRemoved', {
|
||||
item: item,
|
||||
options: options
|
||||
}));
|
||||
},
|
||||
|
||||
/**
|
||||
* Removes all items
|
||||
*/
|
||||
removeAll: function() {
|
||||
var self = this;
|
||||
|
||||
$('.tag', self.$container).remove();
|
||||
$('option', self.$element).remove();
|
||||
|
||||
while (self.itemsArray.length > 0)
|
||||
self.itemsArray.pop();
|
||||
|
||||
self.pushVal(self.options.triggerChange);
|
||||
},
|
||||
|
||||
/**
|
||||
* Refreshes the tags so they match the text/value of their corresponding
|
||||
* item.
|
||||
*/
|
||||
refresh: function() {
|
||||
var self = this;
|
||||
$('.tag', self.$container).each(function() {
|
||||
var $tag = $(this),
|
||||
item = $tag.data('item'),
|
||||
itemValue = self.options.itemValue(item),
|
||||
itemText = self.options.itemText(item),
|
||||
tagClass = self.options.tagClass(item);
|
||||
|
||||
// Update tag's class and inner text
|
||||
$tag.attr('class', null);
|
||||
$tag.addClass('tag ' + htmlEncode(tagClass));
|
||||
$tag.contents().filter(function() {
|
||||
return this.nodeType == 3;
|
||||
})[0].nodeValue = htmlEncode(itemText);
|
||||
|
||||
if (self.isSelect) {
|
||||
var option = $('option', self.$element).filter(function() {
|
||||
return $(this).data('item') === item;
|
||||
});
|
||||
option.attr('value', itemValue);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the items added as tags
|
||||
*/
|
||||
items: function() {
|
||||
return this.itemsArray;
|
||||
},
|
||||
|
||||
/**
|
||||
* Assembly value by retrieving the value of each item, and set it on the
|
||||
* element.
|
||||
*/
|
||||
pushVal: function() {
|
||||
var self = this,
|
||||
val = $.map(self.items(), function(item) {
|
||||
return self.options.itemValue(item).toString();
|
||||
});
|
||||
|
||||
self.$element.val(val, true);
|
||||
|
||||
if (self.options.triggerChange)
|
||||
self.$element.trigger('change');
|
||||
},
|
||||
|
||||
/**
|
||||
* Initializes the tags input behaviour on the element
|
||||
*/
|
||||
build: function(options) {
|
||||
var self = this;
|
||||
|
||||
self.options = $.extend({}, defaultOptions, options);
|
||||
// When itemValue is set, freeInput should always be false
|
||||
if (self.objectItems)
|
||||
self.options.freeInput = false;
|
||||
|
||||
makeOptionItemFunction(self.options, 'itemValue');
|
||||
makeOptionItemFunction(self.options, 'itemText');
|
||||
makeOptionFunction(self.options, 'tagClass');
|
||||
|
||||
// Typeahead Bootstrap version 2.3.2
|
||||
if (self.options.typeahead) {
|
||||
var typeahead = self.options.typeahead || {};
|
||||
|
||||
makeOptionFunction(typeahead, 'source');
|
||||
|
||||
self.$input.typeahead($.extend({}, typeahead, {
|
||||
source: function(query, process) {
|
||||
function processItems(items) {
|
||||
var texts = [];
|
||||
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
var text = self.options.itemText(items[i]);
|
||||
map[text] = items[i];
|
||||
texts.push(text);
|
||||
}
|
||||
process(texts);
|
||||
}
|
||||
|
||||
this.map = {};
|
||||
var map = this.map,
|
||||
data = typeahead.source(query);
|
||||
|
||||
if ($.isFunction(data.success)) {
|
||||
// support for Angular callbacks
|
||||
data.success(processItems);
|
||||
} else if ($.isFunction(data.then)) {
|
||||
// support for Angular promises
|
||||
data.then(processItems);
|
||||
} else {
|
||||
// support for functions and jquery promises
|
||||
$.when(data)
|
||||
.then(processItems);
|
||||
}
|
||||
},
|
||||
updater: function(text) {
|
||||
self.add(this.map[text]);
|
||||
return this.map[text];
|
||||
},
|
||||
matcher: function(text) {
|
||||
return (text.toLowerCase().indexOf(this.query.trim().toLowerCase()) !== -1);
|
||||
},
|
||||
sorter: function(texts) {
|
||||
return texts.sort();
|
||||
},
|
||||
highlighter: function(text) {
|
||||
var regex = new RegExp('(' + this.query + ')', 'gi');
|
||||
return text.replace(regex, "<strong>$1</strong>");
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
// typeahead.js
|
||||
if (self.options.typeaheadjs) {
|
||||
|
||||
// Determine if main configurations were passed or simply a dataset
|
||||
var typeaheadjs = self.options.typeaheadjs;
|
||||
if (!$.isArray(typeaheadjs)) {
|
||||
typeaheadjs = [null, typeaheadjs];
|
||||
}
|
||||
var valueKey = typeaheadjs[1].valueKey; // We should test typeaheadjs.size >= 1
|
||||
var f_datum = valueKey ? function(datum) {
|
||||
return datum[valueKey];
|
||||
} :
|
||||
function(datum) {
|
||||
return datum;
|
||||
}
|
||||
$.fn.typeahead.apply(self.$input, typeaheadjs).on('typeahead:selected', $.proxy(function(obj, datum) {
|
||||
self.add(f_datum(datum));
|
||||
self.$input.typeahead('val', '');
|
||||
}, self));
|
||||
|
||||
}
|
||||
|
||||
self.$container.on('click', $.proxy(function(event) {
|
||||
if (!self.$element.attr('disabled')) {
|
||||
self.$input.removeAttr('disabled');
|
||||
}
|
||||
self.$input.focus();
|
||||
}, self));
|
||||
|
||||
if (self.options.addOnBlur && self.options.freeInput) {
|
||||
self.$input.on('focusout', $.proxy(function(event) {
|
||||
// HACK: only process on focusout when no typeahead opened, to
|
||||
// avoid adding the typeahead text as tag
|
||||
if ($('.typeahead, .twitter-typeahead', self.$container).length === 0) {
|
||||
self.add(self.$input.val());
|
||||
self.$input.val('');
|
||||
}
|
||||
}, self));
|
||||
}
|
||||
|
||||
// Toggle the 'focus' css class on the container when it has focus
|
||||
self.$container.on({
|
||||
focusin: function() {
|
||||
self.$container.addClass(self.options.focusClass);
|
||||
},
|
||||
focusout: function() {
|
||||
self.$container.removeClass(self.options.focusClass);
|
||||
},
|
||||
});
|
||||
|
||||
self.$container.on('keydown', 'input', $.proxy(function(event) {
|
||||
var $input = $(event.target),
|
||||
$inputWrapper = self.findInputWrapper();
|
||||
|
||||
if (self.$element.attr('disabled')) {
|
||||
self.$input.attr('disabled', 'disabled');
|
||||
return;
|
||||
}
|
||||
|
||||
switch (event.which) {
|
||||
// BACKSPACE
|
||||
case 8:
|
||||
if (doGetCaretPosition($input[0]) === 0) {
|
||||
var prev = $inputWrapper.prev();
|
||||
if (prev.length) {
|
||||
self.remove(prev.data('item'));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// DELETE
|
||||
case 46:
|
||||
if (doGetCaretPosition($input[0]) === 0) {
|
||||
var next = $inputWrapper.next();
|
||||
if (next.length) {
|
||||
self.remove(next.data('item'));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// LEFT ARROW
|
||||
case 37:
|
||||
// Try to move the input before the previous tag
|
||||
var $prevTag = $inputWrapper.prev();
|
||||
if ($input.val().length === 0 && $prevTag[0]) {
|
||||
$prevTag.before($inputWrapper);
|
||||
$input.focus();
|
||||
}
|
||||
break;
|
||||
// RIGHT ARROW
|
||||
case 39:
|
||||
// Try to move the input after the next tag
|
||||
var $nextTag = $inputWrapper.next();
|
||||
if ($input.val().length === 0 && $nextTag[0]) {
|
||||
$nextTag.after($inputWrapper);
|
||||
$input.focus();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// ignore
|
||||
}
|
||||
|
||||
// Reset internal input's size
|
||||
var textLength = $input.val().length,
|
||||
wordSpace = Math.ceil(textLength / 5),
|
||||
size = textLength + wordSpace + 1;
|
||||
$input.attr('size', Math.max(this.inputSize, $input.val().length));
|
||||
}, self));
|
||||
|
||||
self.$container.on('keypress', 'input', $.proxy(function(event) {
|
||||
var $input = $(event.target);
|
||||
|
||||
if (self.$element.attr('disabled')) {
|
||||
self.$input.attr('disabled', 'disabled');
|
||||
return;
|
||||
}
|
||||
|
||||
var text = $input.val(),
|
||||
maxLengthReached = self.options.maxChars && text.length >= self.options.maxChars;
|
||||
if (self.options.freeInput && (keyCombinationInList(event, self.options.confirmKeys) || maxLengthReached)) {
|
||||
// Only attempt to add a tag if there is data in the field
|
||||
if (text.length !== 0) {
|
||||
self.add(maxLengthReached ? text.substr(0, self.options.maxChars) : text);
|
||||
$input.val('');
|
||||
}
|
||||
|
||||
// If the field is empty, let the event triggered fire as usual
|
||||
if (self.options.cancelConfirmKeysOnEmpty === false) {
|
||||
event.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
// Reset internal input's size
|
||||
var textLength = $input.val().length,
|
||||
wordSpace = Math.ceil(textLength / 5),
|
||||
size = textLength + wordSpace + 1;
|
||||
$input.attr('size', Math.max(this.inputSize, $input.val().length));
|
||||
}, self));
|
||||
|
||||
// Remove icon clicked
|
||||
self.$container.on('click', '[data-role=remove]', $.proxy(function(event) {
|
||||
if (self.$element.attr('disabled')) {
|
||||
return;
|
||||
}
|
||||
self.remove($(event.target).closest('.tag').data('item'));
|
||||
}, self));
|
||||
|
||||
// Only add existing value as tags when using strings as tags
|
||||
if (self.options.itemValue === defaultOptions.itemValue) {
|
||||
if (self.$element[0].tagName === 'INPUT') {
|
||||
self.add(self.$element.val());
|
||||
} else {
|
||||
$('option', self.$element).each(function() {
|
||||
self.add($(this).attr('value'), true);
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Removes all tagsinput behaviour and unregsiter all event handlers
|
||||
*/
|
||||
destroy: function() {
|
||||
var self = this;
|
||||
|
||||
// Unbind events
|
||||
self.$container.off('keypress', 'input');
|
||||
self.$container.off('click', '[role=remove]');
|
||||
|
||||
self.$container.remove();
|
||||
self.$element.removeData('tagsinput');
|
||||
self.$element.show();
|
||||
},
|
||||
|
||||
/**
|
||||
* Sets focus on the tagsinput
|
||||
*/
|
||||
focus: function() {
|
||||
this.$input.focus();
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the internal input element
|
||||
*/
|
||||
input: function() {
|
||||
return this.$input;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the element which is wrapped around the internal input. This
|
||||
* is normally the $container, but typeahead.js moves the $input element.
|
||||
*/
|
||||
findInputWrapper: function() {
|
||||
var elt = this.$input[0],
|
||||
container = this.$container[0];
|
||||
while (elt && elt.parentNode !== container)
|
||||
elt = elt.parentNode;
|
||||
|
||||
return $(elt);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Register JQuery plugin
|
||||
*/
|
||||
$.fn.tagsinput = function(arg1, arg2, arg3) {
|
||||
var results = [];
|
||||
|
||||
this.each(function() {
|
||||
var tagsinput = $(this).data('tagsinput');
|
||||
// Initialize a new tags input
|
||||
if (!tagsinput) {
|
||||
tagsinput = new TagsInput(this, arg1);
|
||||
$(this).data('tagsinput', tagsinput);
|
||||
results.push(tagsinput);
|
||||
|
||||
if (this.tagName === 'SELECT') {
|
||||
$('option', $(this)).attr('selected', 'selected');
|
||||
}
|
||||
|
||||
// Init tags from $(this).val()
|
||||
$(this).val($(this).val());
|
||||
} else if (!arg1 && !arg2) {
|
||||
// tagsinput already exists
|
||||
// no function, trying to init
|
||||
results.push(tagsinput);
|
||||
} else if (tagsinput[arg1] !== undefined) {
|
||||
// Invoke function on existing tags input
|
||||
if (tagsinput[arg1].length === 3 && arg3 !== undefined) {
|
||||
var retVal = tagsinput[arg1](arg2, null, arg3);
|
||||
} else {
|
||||
var retVal = tagsinput[arg1](arg2);
|
||||
}
|
||||
if (retVal !== undefined)
|
||||
results.push(retVal);
|
||||
}
|
||||
});
|
||||
|
||||
if (typeof arg1 == 'string') {
|
||||
// Return the results from the invoked function calls
|
||||
return results.length > 1 ? results : results[0];
|
||||
} else {
|
||||
return results;
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.tagsinput.Constructor = TagsInput;
|
||||
|
||||
/**
|
||||
* Most options support both a string or number as well as a function as
|
||||
* option value. This function makes sure that the option with the given
|
||||
* key in the given options is wrapped in a function
|
||||
*/
|
||||
function makeOptionItemFunction(options, key) {
|
||||
if (typeof options[key] !== 'function') {
|
||||
var propertyName = options[key];
|
||||
options[key] = function(item) {
|
||||
return item[propertyName];
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function makeOptionFunction(options, key) {
|
||||
if (typeof options[key] !== 'function') {
|
||||
var value = options[key];
|
||||
options[key] = function() {
|
||||
return value;
|
||||
};
|
||||
}
|
||||
}
|
||||
/**
|
||||
* HtmlEncodes the given value
|
||||
*/
|
||||
var htmlEncodeContainer = $('<div />');
|
||||
|
||||
function htmlEncode(value) {
|
||||
if (value) {
|
||||
return htmlEncodeContainer.text(value).html();
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the position of the caret in the given input field
|
||||
* http://flightschool.acylt.com/devnotes/caret-position-woes/
|
||||
*/
|
||||
function doGetCaretPosition(oField) {
|
||||
var iCaretPos = 0;
|
||||
if (document.selection) {
|
||||
oField.focus();
|
||||
var oSel = document.selection.createRange();
|
||||
oSel.moveStart('character', -oField.value.length);
|
||||
iCaretPos = oSel.text.length;
|
||||
} else if (oField.selectionStart || oField.selectionStart == '0') {
|
||||
iCaretPos = oField.selectionStart;
|
||||
}
|
||||
return (iCaretPos);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns boolean indicates whether user has pressed an expected key combination.
|
||||
* @param object keyPressEvent: JavaScript event object, refer
|
||||
* http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
|
||||
* @param object lookupList: expected key combinations, as in:
|
||||
* [13, {which: 188, shiftKey: true}]
|
||||
*/
|
||||
function keyCombinationInList(keyPressEvent, lookupList) {
|
||||
var found = false;
|
||||
$.each(lookupList, function(index, keyCombination) {
|
||||
if (typeof(keyCombination) === 'number' && keyPressEvent.which === keyCombination) {
|
||||
found = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (keyPressEvent.which === keyCombination.which) {
|
||||
var alt = !keyCombination.hasOwnProperty('altKey') || keyPressEvent.altKey === keyCombination.altKey,
|
||||
shift = !keyCombination.hasOwnProperty('shiftKey') || keyPressEvent.shiftKey === keyCombination.shiftKey,
|
||||
ctrl = !keyCombination.hasOwnProperty('ctrlKey') || keyPressEvent.ctrlKey === keyCombination.ctrlKey;
|
||||
if (alt && shift && ctrl) {
|
||||
found = true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize tagsinput behaviour on inputs and selects which have
|
||||
* data-role=tagsinput
|
||||
*/
|
||||
$(function() {
|
||||
$("input[data-role=tagsinput], select[multiple][data-role=tagsinput]").tagsinput();
|
||||
});
|
||||
})(window.jQuery);
|
||||
9
staticfiles/assets/js/plugins/chartist.min.js
vendored
Normal file
12
staticfiles/assets/js/plugins/fullcalendar.min.js
vendored
Normal file
6
staticfiles/assets/js/plugins/jasny-bootstrap.min.js
vendored
Normal file
4183
staticfiles/assets/js/plugins/jquery-jvectormap.js
vendored
Normal file
345
staticfiles/assets/js/plugins/jquery.bootstrap-wizard.js
Normal file
@@ -0,0 +1,345 @@
|
||||
/*!
|
||||
* jQuery twitter bootstrap wizard plugin
|
||||
* Examples and documentation at: http://github.com/VinceG/twitter-bootstrap-wizard
|
||||
* version 1.4.2
|
||||
* Requires jQuery v1.3.2 or later
|
||||
* Supports Bootstrap 2.2.x, 2.3.x, 3.0
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
* Authors: Vadim Vincent Gabriel (http://vadimg.com), Jason Gill (www.gilluminate.com)
|
||||
*/
|
||||
;
|
||||
(function($) {
|
||||
var bootstrapWizardCreate = function(element, options) {
|
||||
var element = $(element);
|
||||
var obj = this;
|
||||
|
||||
// selector skips any 'li' elements that do not contain a child with a tab data-toggle
|
||||
var baseItemSelector = 'li:has([data-toggle="tab"])';
|
||||
var historyStack = [];
|
||||
|
||||
// Merge options with defaults
|
||||
var $settings = $.extend({}, $.fn.bootstrapWizard.defaults, options);
|
||||
var $activeTab = null;
|
||||
var $navigation = null;
|
||||
|
||||
this.rebindClick = function(selector, fn) {
|
||||
selector.unbind('click', fn).bind('click', fn);
|
||||
}
|
||||
|
||||
this.fixNavigationButtons = function() {
|
||||
// Get the current active tab
|
||||
if (!$activeTab.length) {
|
||||
// Select first one
|
||||
$navigation.find('a:first').tab('show');
|
||||
$activeTab = $navigation.find(baseItemSelector + ':first');
|
||||
}
|
||||
|
||||
// See if we're currently in the first/last then disable the previous and last buttons
|
||||
$($settings.previousSelector, element).toggleClass('disabled', (obj.firstIndex() >= obj.currentIndex()));
|
||||
$($settings.nextSelector, element).toggleClass('disabled', (obj.currentIndex() >= obj.navigationLength()));
|
||||
$($settings.nextSelector, element).toggleClass('hidden', (obj.currentIndex() >= obj.navigationLength() && $($settings.finishSelector, element).length > 0));
|
||||
$($settings.lastSelector, element).toggleClass('hidden', (obj.currentIndex() >= obj.navigationLength() && $($settings.finishSelector, element).length > 0));
|
||||
$($settings.finishSelector, element).toggleClass('hidden', (obj.currentIndex() < obj.navigationLength()));
|
||||
$($settings.backSelector, element).toggleClass('disabled', (historyStack.length == 0));
|
||||
$($settings.backSelector, element).toggleClass('hidden', (obj.currentIndex() >= obj.navigationLength() && $($settings.finishSelector, element).length > 0));
|
||||
|
||||
// We are unbinding and rebinding to ensure single firing and no double-click errors
|
||||
obj.rebindClick($($settings.nextSelector, element), obj.next);
|
||||
obj.rebindClick($($settings.previousSelector, element), obj.previous);
|
||||
obj.rebindClick($($settings.lastSelector, element), obj.last);
|
||||
obj.rebindClick($($settings.firstSelector, element), obj.first);
|
||||
obj.rebindClick($($settings.finishSelector, element), obj.finish);
|
||||
obj.rebindClick($($settings.backSelector, element), obj.back);
|
||||
|
||||
if ($settings.onTabShow && typeof $settings.onTabShow === 'function' && $settings.onTabShow($activeTab, $navigation, obj.currentIndex()) === false) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
this.next = function(e) {
|
||||
// If we clicked the last then dont activate this
|
||||
if (element.hasClass('last')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($settings.onNext && typeof $settings.onNext === 'function' && $settings.onNext($activeTab, $navigation, obj.nextIndex()) === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var formerIndex = obj.currentIndex();
|
||||
var $index = obj.nextIndex();
|
||||
|
||||
// Did we click the last button
|
||||
if ($index > obj.navigationLength()) {} else {
|
||||
historyStack.push(formerIndex);
|
||||
$navigation.find(baseItemSelector + ($settings.withVisible ? ':visible' : '') + ':eq(' + $index + ') a').tab('show');
|
||||
}
|
||||
};
|
||||
|
||||
this.previous = function(e) {
|
||||
// If we clicked the first then dont activate this
|
||||
if (element.hasClass('first')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($settings.onPrevious && typeof $settings.onPrevious === 'function' && $settings.onPrevious($activeTab, $navigation, obj.previousIndex()) === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var formerIndex = obj.currentIndex();
|
||||
var $index = obj.previousIndex();
|
||||
|
||||
if ($index < 0) {} else {
|
||||
historyStack.push(formerIndex);
|
||||
$navigation.find(baseItemSelector + ($settings.withVisible ? ':visible' : '') + ':eq(' + $index + ') a').tab('show');
|
||||
}
|
||||
};
|
||||
|
||||
this.first = function(e) {
|
||||
if ($settings.onFirst && typeof $settings.onFirst === 'function' && $settings.onFirst($activeTab, $navigation, obj.firstIndex()) === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// If the element is disabled then we won't do anything
|
||||
if (element.hasClass('disabled')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
historyStack.push(obj.currentIndex());
|
||||
$navigation.find(baseItemSelector + ':eq(0) a').tab('show');
|
||||
};
|
||||
|
||||
this.last = function(e) {
|
||||
if ($settings.onLast && typeof $settings.onLast === 'function' && $settings.onLast($activeTab, $navigation, obj.lastIndex()) === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// If the element is disabled then we won't do anything
|
||||
if (element.hasClass('disabled')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
historyStack.push(obj.currentIndex());
|
||||
$navigation.find(baseItemSelector + ':eq(' + obj.navigationLength() + ') a').tab('show');
|
||||
};
|
||||
|
||||
this.finish = function(e) {
|
||||
if ($settings.onFinish && typeof $settings.onFinish === 'function') {
|
||||
$settings.onFinish($activeTab, $navigation, obj.lastIndex());
|
||||
}
|
||||
};
|
||||
|
||||
this.back = function() {
|
||||
if (historyStack.length == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var formerIndex = historyStack.pop();
|
||||
if ($settings.onBack && typeof $settings.onBack === 'function' && $settings.onBack($activeTab, $navigation, formerIndex) === false) {
|
||||
historyStack.push(formerIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
element.find(baseItemSelector + ':eq(' + formerIndex + ') a').tab('show');
|
||||
};
|
||||
|
||||
this.currentIndex = function() {
|
||||
return $navigation.find(baseItemSelector + ($settings.withVisible ? ':visible' : '')).index($activeTab);
|
||||
};
|
||||
|
||||
this.firstIndex = function() {
|
||||
return 0;
|
||||
};
|
||||
|
||||
this.lastIndex = function() {
|
||||
return obj.navigationLength();
|
||||
};
|
||||
|
||||
this.getIndex = function(e) {
|
||||
return $navigation.find(baseItemSelector + ($settings.withVisible ? ':visible' : '')).index(e);
|
||||
};
|
||||
|
||||
this.nextIndex = function() {
|
||||
var nextIndexCandidate = this.currentIndex();
|
||||
var nextTabCandidate = null;
|
||||
do {
|
||||
nextIndexCandidate++;
|
||||
nextTabCandidate = $navigation.find(baseItemSelector + ($settings.withVisible ? ':visible' : '') + ":eq(" + nextIndexCandidate + ")");
|
||||
} while ((nextTabCandidate) && (nextTabCandidate.hasClass("disabled")));
|
||||
return nextIndexCandidate;
|
||||
};
|
||||
this.previousIndex = function() {
|
||||
var prevIndexCandidate = this.currentIndex();
|
||||
var prevTabCandidate = null;
|
||||
do {
|
||||
prevIndexCandidate--;
|
||||
prevTabCandidate = $navigation.find(baseItemSelector + ($settings.withVisible ? ':visible' : '') + ":eq(" + prevIndexCandidate + ")");
|
||||
} while ((prevTabCandidate) && (prevTabCandidate.hasClass("disabled")));
|
||||
return prevIndexCandidate;
|
||||
};
|
||||
this.navigationLength = function() {
|
||||
return $navigation.find(baseItemSelector + ($settings.withVisible ? ':visible' : '')).length - 1;
|
||||
};
|
||||
this.activeTab = function() {
|
||||
return $activeTab;
|
||||
};
|
||||
this.nextTab = function() {
|
||||
return $navigation.find(baseItemSelector + ':eq(' + (obj.currentIndex() + 1) + ')').length ? $navigation.find(baseItemSelector + ':eq(' + (obj.currentIndex() + 1) + ')') : null;
|
||||
};
|
||||
this.previousTab = function() {
|
||||
if (obj.currentIndex() <= 0) {
|
||||
return null;
|
||||
}
|
||||
return $navigation.find(baseItemSelector + ':eq(' + parseInt(obj.currentIndex() - 1) + ')');
|
||||
};
|
||||
this.show = function(index) {
|
||||
var tabToShow = isNaN(index) ?
|
||||
element.find(baseItemSelector + ' a[href="#' + index + '"]') :
|
||||
element.find(baseItemSelector + ':eq(' + index + ') a');
|
||||
if (tabToShow.length > 0) {
|
||||
historyStack.push(obj.currentIndex());
|
||||
tabToShow.tab('show');
|
||||
}
|
||||
};
|
||||
this.disable = function(index) {
|
||||
$navigation.find(baseItemSelector + ':eq(' + index + ')').addClass('disabled');
|
||||
};
|
||||
this.enable = function(index) {
|
||||
$navigation.find(baseItemSelector + ':eq(' + index + ')').removeClass('disabled');
|
||||
};
|
||||
this.hide = function(index) {
|
||||
$navigation.find(baseItemSelector + ':eq(' + index + ')').hide();
|
||||
};
|
||||
this.display = function(index) {
|
||||
$navigation.find(baseItemSelector + ':eq(' + index + ')').show();
|
||||
};
|
||||
this.remove = function(args) {
|
||||
var $index = args[0];
|
||||
var $removeTabPane = typeof args[1] != 'undefined' ? args[1] : false;
|
||||
var $item = $navigation.find(baseItemSelector + ':eq(' + $index + ')');
|
||||
|
||||
// Remove the tab pane first if needed
|
||||
if ($removeTabPane) {
|
||||
var $href = $item.find('a').attr('href');
|
||||
$($href).remove();
|
||||
}
|
||||
|
||||
// Remove menu item
|
||||
$item.remove();
|
||||
};
|
||||
|
||||
var innerTabClick = function(e) {
|
||||
// Get the index of the clicked tab
|
||||
var $ul = $navigation.find(baseItemSelector);
|
||||
var clickedIndex = $ul.index($(e.currentTarget).parent(baseItemSelector));
|
||||
var $clickedTab = $($ul[clickedIndex]);
|
||||
if ($settings.onTabClick && typeof $settings.onTabClick === 'function' && $settings.onTabClick($activeTab, $navigation, obj.currentIndex(), clickedIndex, $clickedTab) === false) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
var innerTabShown = function(e) {
|
||||
var $element = $(e.target).parent();
|
||||
var nextTab = $navigation.find(baseItemSelector).index($element);
|
||||
|
||||
// If it's disabled then do not change
|
||||
if ($element.hasClass('disabled')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($settings.onTabChange && typeof $settings.onTabChange === 'function' && $settings.onTabChange($activeTab, $navigation, obj.currentIndex(), nextTab) === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$activeTab = $element; // activated tab
|
||||
obj.fixNavigationButtons();
|
||||
};
|
||||
|
||||
this.resetWizard = function() {
|
||||
|
||||
// remove the existing handlers
|
||||
$('a[data-toggle="tab"]', $navigation).off('click', innerTabClick);
|
||||
$('a[data-toggle="tab"]', $navigation).off('show show.bs.tab', innerTabShown);
|
||||
|
||||
// reset elements based on current state of the DOM
|
||||
$navigation = element.find('ul:first', element);
|
||||
$activeTab = $navigation.find(baseItemSelector + '.active', element);
|
||||
|
||||
// re-add handlers
|
||||
$('a[data-toggle="tab"]', $navigation).on('click', innerTabClick);
|
||||
$('a[data-toggle="tab"]', $navigation).on('show show.bs.tab', innerTabShown);
|
||||
|
||||
obj.fixNavigationButtons();
|
||||
};
|
||||
|
||||
$navigation = element.find('ul:first', element);
|
||||
$activeTab = $navigation.find(baseItemSelector + '.active', element);
|
||||
|
||||
if (!$navigation.hasClass($settings.tabClass)) {
|
||||
$navigation.addClass($settings.tabClass);
|
||||
}
|
||||
|
||||
// Load onInit
|
||||
if ($settings.onInit && typeof $settings.onInit === 'function') {
|
||||
$settings.onInit($activeTab, $navigation, 0);
|
||||
}
|
||||
|
||||
// Load onShow
|
||||
if ($settings.onShow && typeof $settings.onShow === 'function') {
|
||||
$settings.onShow($activeTab, $navigation, obj.nextIndex());
|
||||
}
|
||||
|
||||
$('a[data-toggle="tab"]', $navigation).on('click', innerTabClick);
|
||||
|
||||
// attach to both show and show.bs.tab to support Bootstrap versions 2.3.2 and 3.0.0
|
||||
$('a[data-toggle="tab"]', $navigation).on('show show.bs.tab', innerTabShown);
|
||||
};
|
||||
$.fn.bootstrapWizard = function(options) {
|
||||
//expose methods
|
||||
if (typeof options == 'string') {
|
||||
var args = Array.prototype.slice.call(arguments, 1)
|
||||
if (args.length === 1) {
|
||||
args.toString();
|
||||
}
|
||||
return this.data('bootstrapWizard')[options](args);
|
||||
}
|
||||
return this.each(function(index) {
|
||||
var element = $(this);
|
||||
// Return early if this element already has a plugin instance
|
||||
if (element.data('bootstrapWizard')) return;
|
||||
// pass options to plugin constructor
|
||||
var wizard = new bootstrapWizardCreate(element, options);
|
||||
// Store plugin object in this element's data
|
||||
element.data('bootstrapWizard', wizard);
|
||||
// and then trigger initial change
|
||||
wizard.fixNavigationButtons();
|
||||
});
|
||||
};
|
||||
|
||||
// expose options
|
||||
$.fn.bootstrapWizard.defaults = {
|
||||
withVisible: true,
|
||||
tabClass: 'nav nav-pills',
|
||||
nextSelector: '.card-wizard .nav-item.next',
|
||||
previousSelector: '.card-wizard .nav-item.previous',
|
||||
firstSelector: '.card-wizard .nav-item.first',
|
||||
lastSelector: '.card-wizard .nav-item.last',
|
||||
finishSelector: '.card-wizard .nav-item.finish',
|
||||
backSelector: '.card-wizard .nav-item.back',
|
||||
onShow: null,
|
||||
onInit: null,
|
||||
onNext: null,
|
||||
onPrevious: null,
|
||||
onLast: null,
|
||||
onFirst: null,
|
||||
onFinish: null,
|
||||
onBack: null,
|
||||
onTabChange: null,
|
||||
onTabClick: null,
|
||||
onTabShow: null
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
623
staticfiles/assets/js/plugins/jquery.dataTables.min.js
vendored
Normal file
718
staticfiles/assets/js/plugins/jquery.tagsinput.js
Normal file
@@ -0,0 +1,718 @@
|
||||
/*
|
||||
* bootstrap-tagsinput v0.8.0
|
||||
*
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
"use strict";
|
||||
|
||||
var defaultOptions = {
|
||||
tagClass: function(item) {
|
||||
return 'label label-info';
|
||||
},
|
||||
focusClass: 'focus',
|
||||
itemValue: function(item) {
|
||||
return item ? item.toString() : item;
|
||||
},
|
||||
itemText: function(item) {
|
||||
return this.itemValue(item);
|
||||
},
|
||||
itemTitle: function(item) {
|
||||
return null;
|
||||
},
|
||||
freeInput: true,
|
||||
addOnBlur: true,
|
||||
maxTags: undefined,
|
||||
maxChars: undefined,
|
||||
confirmKeys: [13, 44],
|
||||
delimiter: ',',
|
||||
delimiterRegex: null,
|
||||
cancelConfirmKeysOnEmpty: false,
|
||||
onTagExists: function(item, $tag) {
|
||||
$tag.hide().fadeIn();
|
||||
},
|
||||
trimValue: false,
|
||||
allowDuplicates: false,
|
||||
triggerChange: true
|
||||
};
|
||||
|
||||
/**
|
||||
* Constructor function
|
||||
*/
|
||||
function TagsInput(element, options) {
|
||||
this.isInit = true;
|
||||
this.itemsArray = [];
|
||||
|
||||
this.$element = $(element);
|
||||
this.$element.hide();
|
||||
|
||||
this.isSelect = (element.tagName === 'SELECT');
|
||||
this.multiple = (this.isSelect && element.hasAttribute('multiple'));
|
||||
this.objectItems = options && options.itemValue;
|
||||
this.placeholderText = element.hasAttribute('placeholder') ? this.$element.attr('placeholder') : '';
|
||||
this.inputSize = Math.max(1, this.placeholderText.length);
|
||||
|
||||
this.$container = $('<div class="bootstrap-tagsinput"></div>');
|
||||
this.$input = $('<input type="text" placeholder="' + this.placeholderText + '"/>').appendTo(this.$container);
|
||||
|
||||
this.$element.before(this.$container);
|
||||
|
||||
this.build(options);
|
||||
this.isInit = false;
|
||||
}
|
||||
|
||||
TagsInput.prototype = {
|
||||
constructor: TagsInput,
|
||||
|
||||
/**
|
||||
* Adds the given item as a new tag. Pass true to dontPushVal to prevent
|
||||
* updating the elements val()
|
||||
*/
|
||||
add: function(item, dontPushVal, options) {
|
||||
var self = this;
|
||||
|
||||
if (self.options.maxTags && self.itemsArray.length >= self.options.maxTags)
|
||||
return;
|
||||
|
||||
// Ignore falsey values, except false
|
||||
if (item !== false && !item)
|
||||
return;
|
||||
|
||||
// Trim value
|
||||
if (typeof item === "string" && self.options.trimValue) {
|
||||
item = $.trim(item);
|
||||
}
|
||||
|
||||
// Throw an error when trying to add an object while the itemValue option was not set
|
||||
if (typeof item === "object" && !self.objectItems)
|
||||
throw ("Can't add objects when itemValue option is not set");
|
||||
|
||||
// Ignore strings only containg whitespace
|
||||
if (item.toString().match(/^\s*$/))
|
||||
return;
|
||||
|
||||
// If SELECT but not multiple, remove current tag
|
||||
if (self.isSelect && !self.multiple && self.itemsArray.length > 0)
|
||||
self.remove(self.itemsArray[0]);
|
||||
|
||||
if (typeof item === "string" && this.$element[0].tagName === 'INPUT') {
|
||||
var delimiter = (self.options.delimiterRegex) ? self.options.delimiterRegex : self.options.delimiter;
|
||||
var items = item.split(delimiter);
|
||||
if (items.length > 1) {
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
this.add(items[i], true);
|
||||
}
|
||||
|
||||
if (!dontPushVal)
|
||||
self.pushVal(self.options.triggerChange);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
var itemValue = self.options.itemValue(item),
|
||||
itemText = self.options.itemText(item),
|
||||
tagClass = self.options.tagClass(item),
|
||||
itemTitle = self.options.itemTitle(item);
|
||||
|
||||
// Ignore items allready added
|
||||
var existing = $.grep(self.itemsArray, function(item) {
|
||||
return self.options.itemValue(item) === itemValue;
|
||||
})[0];
|
||||
if (existing && !self.options.allowDuplicates) {
|
||||
// Invoke onTagExists
|
||||
if (self.options.onTagExists) {
|
||||
var $existingTag = $(".tag", self.$container).filter(function() {
|
||||
return $(this).data("item") === existing;
|
||||
});
|
||||
self.options.onTagExists(item, $existingTag);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// if length greater than limit
|
||||
if (self.items().toString().length + item.length + 1 > self.options.maxInputLength)
|
||||
return;
|
||||
|
||||
// raise beforeItemAdd arg
|
||||
var beforeItemAddEvent = $.Event('beforeItemAdd', {
|
||||
item: item,
|
||||
cancel: false,
|
||||
options: options
|
||||
});
|
||||
self.$element.trigger(beforeItemAddEvent);
|
||||
if (beforeItemAddEvent.cancel)
|
||||
return;
|
||||
|
||||
// register item in internal array and map
|
||||
self.itemsArray.push(item);
|
||||
|
||||
// add a tag element
|
||||
|
||||
var $tag = $('<span class="tag ' + htmlEncode(tagClass) + (itemTitle !== null ? ('" title="' + itemTitle) : '') + '">' + htmlEncode(itemText) + '<span data-role="remove"></span></span>');
|
||||
$tag.data('item', item);
|
||||
self.findInputWrapper().before($tag);
|
||||
$tag.after(' ');
|
||||
|
||||
// Check to see if the tag exists in its raw or uri-encoded form
|
||||
var optionExists = (
|
||||
$('option[value="' + encodeURIComponent(itemValue) + '"]', self.$element).length ||
|
||||
$('option[value="' + htmlEncode(itemValue) + '"]', self.$element).length
|
||||
);
|
||||
|
||||
// add <option /> if item represents a value not present in one of the <select />'s options
|
||||
if (self.isSelect && !optionExists) {
|
||||
var $option = $('<option selected>' + htmlEncode(itemText) + '</option>');
|
||||
$option.data('item', item);
|
||||
$option.attr('value', itemValue);
|
||||
self.$element.append($option);
|
||||
}
|
||||
|
||||
if (!dontPushVal)
|
||||
self.pushVal(self.options.triggerChange);
|
||||
|
||||
// Add class when reached maxTags
|
||||
if (self.options.maxTags === self.itemsArray.length || self.items().toString().length === self.options.maxInputLength)
|
||||
self.$container.addClass('bootstrap-tagsinput-max');
|
||||
|
||||
// If using typeahead, once the tag has been added, clear the typeahead value so it does not stick around in the input.
|
||||
if ($('.typeahead, .twitter-typeahead', self.$container).length) {
|
||||
self.$input.typeahead('val', '');
|
||||
}
|
||||
|
||||
if (this.isInit) {
|
||||
self.$element.trigger($.Event('itemAddedOnInit', {
|
||||
item: item,
|
||||
options: options
|
||||
}));
|
||||
} else {
|
||||
self.$element.trigger($.Event('itemAdded', {
|
||||
item: item,
|
||||
options: options
|
||||
}));
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Removes the given item. Pass true to dontPushVal to prevent updating the
|
||||
* elements val()
|
||||
*/
|
||||
remove: function(item, dontPushVal, options) {
|
||||
var self = this;
|
||||
|
||||
if (self.objectItems) {
|
||||
if (typeof item === "object")
|
||||
item = $.grep(self.itemsArray, function(other) {
|
||||
return self.options.itemValue(other) == self.options.itemValue(item);
|
||||
});
|
||||
else
|
||||
item = $.grep(self.itemsArray, function(other) {
|
||||
return self.options.itemValue(other) == item;
|
||||
});
|
||||
|
||||
item = item[item.length - 1];
|
||||
}
|
||||
|
||||
if (item) {
|
||||
var beforeItemRemoveEvent = $.Event('beforeItemRemove', {
|
||||
item: item,
|
||||
cancel: false,
|
||||
options: options
|
||||
});
|
||||
self.$element.trigger(beforeItemRemoveEvent);
|
||||
if (beforeItemRemoveEvent.cancel)
|
||||
return;
|
||||
|
||||
$('.tag', self.$container).filter(function() {
|
||||
return $(this).data('item') === item;
|
||||
}).remove();
|
||||
$('option', self.$element).filter(function() {
|
||||
return $(this).data('item') === item;
|
||||
}).remove();
|
||||
if ($.inArray(item, self.itemsArray) !== -1)
|
||||
self.itemsArray.splice($.inArray(item, self.itemsArray), 1);
|
||||
}
|
||||
|
||||
if (!dontPushVal)
|
||||
self.pushVal(self.options.triggerChange);
|
||||
|
||||
// Remove class when reached maxTags
|
||||
if (self.options.maxTags > self.itemsArray.length)
|
||||
self.$container.removeClass('bootstrap-tagsinput-max');
|
||||
|
||||
self.$element.trigger($.Event('itemRemoved', {
|
||||
item: item,
|
||||
options: options
|
||||
}));
|
||||
},
|
||||
|
||||
/**
|
||||
* Removes all items
|
||||
*/
|
||||
removeAll: function() {
|
||||
var self = this;
|
||||
|
||||
$('.tag', self.$container).remove();
|
||||
$('option', self.$element).remove();
|
||||
|
||||
while (self.itemsArray.length > 0)
|
||||
self.itemsArray.pop();
|
||||
|
||||
self.pushVal(self.options.triggerChange);
|
||||
},
|
||||
|
||||
/**
|
||||
* Refreshes the tags so they match the text/value of their corresponding
|
||||
* item.
|
||||
*/
|
||||
refresh: function() {
|
||||
var self = this;
|
||||
$('.tag', self.$container).each(function() {
|
||||
var $tag = $(this),
|
||||
item = $tag.data('item'),
|
||||
itemValue = self.options.itemValue(item),
|
||||
itemText = self.options.itemText(item),
|
||||
tagClass = self.options.tagClass(item);
|
||||
|
||||
// Update tag's class and inner text
|
||||
$tag.attr('class', null);
|
||||
$tag.addClass('tag ' + htmlEncode(tagClass));
|
||||
$tag.contents().filter(function() {
|
||||
return this.nodeType == 3;
|
||||
})[0].nodeValue = htmlEncode(itemText);
|
||||
|
||||
if (self.isSelect) {
|
||||
var option = $('option', self.$element).filter(function() {
|
||||
return $(this).data('item') === item;
|
||||
});
|
||||
option.attr('value', itemValue);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the items added as tags
|
||||
*/
|
||||
items: function() {
|
||||
return this.itemsArray;
|
||||
},
|
||||
|
||||
/**
|
||||
* Assembly value by retrieving the value of each item, and set it on the
|
||||
* element.
|
||||
*/
|
||||
pushVal: function() {
|
||||
var self = this,
|
||||
val = $.map(self.items(), function(item) {
|
||||
return self.options.itemValue(item).toString();
|
||||
});
|
||||
|
||||
self.$element.val(val, true);
|
||||
|
||||
if (self.options.triggerChange)
|
||||
self.$element.trigger('change');
|
||||
},
|
||||
|
||||
/**
|
||||
* Initializes the tags input behaviour on the element
|
||||
*/
|
||||
build: function(options) {
|
||||
var self = this;
|
||||
|
||||
self.options = $.extend({}, defaultOptions, options);
|
||||
// When itemValue is set, freeInput should always be false
|
||||
if (self.objectItems)
|
||||
self.options.freeInput = false;
|
||||
|
||||
makeOptionItemFunction(self.options, 'itemValue');
|
||||
makeOptionItemFunction(self.options, 'itemText');
|
||||
makeOptionFunction(self.options, 'tagClass');
|
||||
|
||||
// Typeahead Bootstrap version 2.3.2
|
||||
if (self.options.typeahead) {
|
||||
var typeahead = self.options.typeahead || {};
|
||||
|
||||
makeOptionFunction(typeahead, 'source');
|
||||
|
||||
self.$input.typeahead($.extend({}, typeahead, {
|
||||
source: function(query, process) {
|
||||
function processItems(items) {
|
||||
var texts = [];
|
||||
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
var text = self.options.itemText(items[i]);
|
||||
map[text] = items[i];
|
||||
texts.push(text);
|
||||
}
|
||||
process(texts);
|
||||
}
|
||||
|
||||
this.map = {};
|
||||
var map = this.map,
|
||||
data = typeahead.source(query);
|
||||
|
||||
if ($.isFunction(data.success)) {
|
||||
// support for Angular callbacks
|
||||
data.success(processItems);
|
||||
} else if ($.isFunction(data.then)) {
|
||||
// support for Angular promises
|
||||
data.then(processItems);
|
||||
} else {
|
||||
// support for functions and jquery promises
|
||||
$.when(data)
|
||||
.then(processItems);
|
||||
}
|
||||
},
|
||||
updater: function(text) {
|
||||
self.add(this.map[text]);
|
||||
return this.map[text];
|
||||
},
|
||||
matcher: function(text) {
|
||||
return (text.toLowerCase().indexOf(this.query.trim().toLowerCase()) !== -1);
|
||||
},
|
||||
sorter: function(texts) {
|
||||
return texts.sort();
|
||||
},
|
||||
highlighter: function(text) {
|
||||
var regex = new RegExp('(' + this.query + ')', 'gi');
|
||||
return text.replace(regex, "<strong>$1</strong>");
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
// typeahead.js
|
||||
if (self.options.typeaheadjs) {
|
||||
|
||||
// Determine if main configurations were passed or simply a dataset
|
||||
var typeaheadjs = self.options.typeaheadjs;
|
||||
if (!$.isArray(typeaheadjs)) {
|
||||
typeaheadjs = [null, typeaheadjs];
|
||||
}
|
||||
var valueKey = typeaheadjs[1].valueKey; // We should test typeaheadjs.size >= 1
|
||||
var f_datum = valueKey ? function(datum) {
|
||||
return datum[valueKey];
|
||||
} :
|
||||
function(datum) {
|
||||
return datum;
|
||||
}
|
||||
$.fn.typeahead.apply(self.$input, typeaheadjs).on('typeahead:selected', $.proxy(function(obj, datum) {
|
||||
self.add(f_datum(datum));
|
||||
self.$input.typeahead('val', '');
|
||||
}, self));
|
||||
|
||||
}
|
||||
|
||||
self.$container.on('click', $.proxy(function(event) {
|
||||
if (!self.$element.attr('disabled')) {
|
||||
self.$input.removeAttr('disabled');
|
||||
}
|
||||
self.$input.focus();
|
||||
}, self));
|
||||
|
||||
if (self.options.addOnBlur && self.options.freeInput) {
|
||||
self.$input.on('focusout', $.proxy(function(event) {
|
||||
// HACK: only process on focusout when no typeahead opened, to
|
||||
// avoid adding the typeahead text as tag
|
||||
if ($('.typeahead, .twitter-typeahead', self.$container).length === 0) {
|
||||
self.add(self.$input.val());
|
||||
self.$input.val('');
|
||||
}
|
||||
}, self));
|
||||
}
|
||||
|
||||
// Toggle the 'focus' css class on the container when it has focus
|
||||
self.$container.on({
|
||||
focusin: function() {
|
||||
self.$container.addClass(self.options.focusClass);
|
||||
},
|
||||
focusout: function() {
|
||||
self.$container.removeClass(self.options.focusClass);
|
||||
},
|
||||
});
|
||||
|
||||
self.$container.on('keydown', 'input', $.proxy(function(event) {
|
||||
var $input = $(event.target),
|
||||
$inputWrapper = self.findInputWrapper();
|
||||
|
||||
if (self.$element.attr('disabled')) {
|
||||
self.$input.attr('disabled', 'disabled');
|
||||
return;
|
||||
}
|
||||
|
||||
switch (event.which) {
|
||||
// BACKSPACE
|
||||
case 8:
|
||||
if (doGetCaretPosition($input[0]) === 0) {
|
||||
var prev = $inputWrapper.prev();
|
||||
if (prev.length) {
|
||||
self.remove(prev.data('item'));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// DELETE
|
||||
case 46:
|
||||
if (doGetCaretPosition($input[0]) === 0) {
|
||||
var next = $inputWrapper.next();
|
||||
if (next.length) {
|
||||
self.remove(next.data('item'));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// LEFT ARROW
|
||||
case 37:
|
||||
// Try to move the input before the previous tag
|
||||
var $prevTag = $inputWrapper.prev();
|
||||
if ($input.val().length === 0 && $prevTag[0]) {
|
||||
$prevTag.before($inputWrapper);
|
||||
$input.focus();
|
||||
}
|
||||
break;
|
||||
// RIGHT ARROW
|
||||
case 39:
|
||||
// Try to move the input after the next tag
|
||||
var $nextTag = $inputWrapper.next();
|
||||
if ($input.val().length === 0 && $nextTag[0]) {
|
||||
$nextTag.after($inputWrapper);
|
||||
$input.focus();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// ignore
|
||||
}
|
||||
|
||||
// Reset internal input's size
|
||||
var textLength = $input.val().length,
|
||||
wordSpace = Math.ceil(textLength / 5),
|
||||
size = textLength + wordSpace + 1;
|
||||
$input.attr('size', Math.max(this.inputSize, $input.val().length));
|
||||
}, self));
|
||||
|
||||
self.$container.on('keypress', 'input', $.proxy(function(event) {
|
||||
var $input = $(event.target);
|
||||
|
||||
if (self.$element.attr('disabled')) {
|
||||
self.$input.attr('disabled', 'disabled');
|
||||
return;
|
||||
}
|
||||
|
||||
var text = $input.val(),
|
||||
maxLengthReached = self.options.maxChars && text.length >= self.options.maxChars;
|
||||
if (self.options.freeInput && (keyCombinationInList(event, self.options.confirmKeys) || maxLengthReached)) {
|
||||
// Only attempt to add a tag if there is data in the field
|
||||
if (text.length !== 0) {
|
||||
self.add(maxLengthReached ? text.substr(0, self.options.maxChars) : text);
|
||||
$input.val('');
|
||||
}
|
||||
|
||||
// If the field is empty, let the event triggered fire as usual
|
||||
if (self.options.cancelConfirmKeysOnEmpty === false) {
|
||||
event.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
// Reset internal input's size
|
||||
var textLength = $input.val().length,
|
||||
wordSpace = Math.ceil(textLength / 5),
|
||||
size = textLength + wordSpace + 1;
|
||||
$input.attr('size', Math.max(this.inputSize, $input.val().length));
|
||||
}, self));
|
||||
|
||||
// Remove icon clicked
|
||||
self.$container.on('click', '[data-role=remove]', $.proxy(function(event) {
|
||||
if (self.$element.attr('disabled')) {
|
||||
return;
|
||||
}
|
||||
self.remove($(event.target).closest('.tag').data('item'));
|
||||
}, self));
|
||||
|
||||
// Only add existing value as tags when using strings as tags
|
||||
if (self.options.itemValue === defaultOptions.itemValue) {
|
||||
if (self.$element[0].tagName === 'INPUT') {
|
||||
self.add(self.$element.val());
|
||||
} else {
|
||||
$('option', self.$element).each(function() {
|
||||
self.add($(this).attr('value'), true);
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Removes all tagsinput behaviour and unregsiter all event handlers
|
||||
*/
|
||||
destroy: function() {
|
||||
var self = this;
|
||||
|
||||
// Unbind events
|
||||
self.$container.off('keypress', 'input');
|
||||
self.$container.off('click', '[role=remove]');
|
||||
|
||||
self.$container.remove();
|
||||
self.$element.removeData('tagsinput');
|
||||
self.$element.show();
|
||||
},
|
||||
|
||||
/**
|
||||
* Sets focus on the tagsinput
|
||||
*/
|
||||
focus: function() {
|
||||
this.$input.focus();
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the internal input element
|
||||
*/
|
||||
input: function() {
|
||||
return this.$input;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the element which is wrapped around the internal input. This
|
||||
* is normally the $container, but typeahead.js moves the $input element.
|
||||
*/
|
||||
findInputWrapper: function() {
|
||||
var elt = this.$input[0],
|
||||
container = this.$container[0];
|
||||
while (elt && elt.parentNode !== container)
|
||||
elt = elt.parentNode;
|
||||
|
||||
return $(elt);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Register JQuery plugin
|
||||
*/
|
||||
$.fn.tagsinput = function(arg1, arg2, arg3) {
|
||||
var results = [];
|
||||
|
||||
this.each(function() {
|
||||
var tagsinput = $(this).data('tagsinput');
|
||||
// Initialize a new tags input
|
||||
if (!tagsinput) {
|
||||
tagsinput = new TagsInput(this, arg1);
|
||||
$(this).data('tagsinput', tagsinput);
|
||||
results.push(tagsinput);
|
||||
|
||||
if (this.tagName === 'SELECT') {
|
||||
$('option', $(this)).attr('selected', 'selected');
|
||||
}
|
||||
|
||||
// Init tags from $(this).val()
|
||||
$(this).val($(this).val());
|
||||
} else if (!arg1 && !arg2) {
|
||||
// tagsinput already exists
|
||||
// no function, trying to init
|
||||
results.push(tagsinput);
|
||||
} else if (tagsinput[arg1] !== undefined) {
|
||||
// Invoke function on existing tags input
|
||||
if (tagsinput[arg1].length === 3 && arg3 !== undefined) {
|
||||
var retVal = tagsinput[arg1](arg2, null, arg3);
|
||||
} else {
|
||||
var retVal = tagsinput[arg1](arg2);
|
||||
}
|
||||
if (retVal !== undefined)
|
||||
results.push(retVal);
|
||||
}
|
||||
});
|
||||
|
||||
if (typeof arg1 == 'string') {
|
||||
// Return the results from the invoked function calls
|
||||
return results.length > 1 ? results : results[0];
|
||||
} else {
|
||||
return results;
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.tagsinput.Constructor = TagsInput;
|
||||
|
||||
/**
|
||||
* Most options support both a string or number as well as a function as
|
||||
* option value. This function makes sure that the option with the given
|
||||
* key in the given options is wrapped in a function
|
||||
*/
|
||||
function makeOptionItemFunction(options, key) {
|
||||
if (typeof options[key] !== 'function') {
|
||||
var propertyName = options[key];
|
||||
options[key] = function(item) {
|
||||
return item[propertyName];
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function makeOptionFunction(options, key) {
|
||||
if (typeof options[key] !== 'function') {
|
||||
var value = options[key];
|
||||
options[key] = function() {
|
||||
return value;
|
||||
};
|
||||
}
|
||||
}
|
||||
/**
|
||||
* HtmlEncodes the given value
|
||||
*/
|
||||
var htmlEncodeContainer = $('<div />');
|
||||
|
||||
function htmlEncode(value) {
|
||||
if (value) {
|
||||
return htmlEncodeContainer.text(value).html();
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the position of the caret in the given input field
|
||||
* http://flightschool.acylt.com/devnotes/caret-position-woes/
|
||||
*/
|
||||
function doGetCaretPosition(oField) {
|
||||
var iCaretPos = 0;
|
||||
if (document.selection) {
|
||||
oField.focus();
|
||||
var oSel = document.selection.createRange();
|
||||
oSel.moveStart('character', -oField.value.length);
|
||||
iCaretPos = oSel.text.length;
|
||||
} else if (oField.selectionStart || oField.selectionStart == '0') {
|
||||
iCaretPos = oField.selectionStart;
|
||||
}
|
||||
return (iCaretPos);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns boolean indicates whether user has pressed an expected key combination.
|
||||
* @param object keyPressEvent: JavaScript event object, refer
|
||||
* http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
|
||||
* @param object lookupList: expected key combinations, as in:
|
||||
* [13, {which: 188, shiftKey: true}]
|
||||
*/
|
||||
function keyCombinationInList(keyPressEvent, lookupList) {
|
||||
var found = false;
|
||||
$.each(lookupList, function(index, keyCombination) {
|
||||
if (typeof(keyCombination) === 'number' && keyPressEvent.which === keyCombination) {
|
||||
found = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (keyPressEvent.which === keyCombination.which) {
|
||||
var alt = !keyCombination.hasOwnProperty('altKey') || keyPressEvent.altKey === keyCombination.altKey,
|
||||
shift = !keyCombination.hasOwnProperty('shiftKey') || keyPressEvent.shiftKey === keyCombination.shiftKey,
|
||||
ctrl = !keyCombination.hasOwnProperty('ctrlKey') || keyPressEvent.ctrlKey === keyCombination.ctrlKey;
|
||||
if (alt && shift && ctrl) {
|
||||
found = true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize tagsinput behaviour on inputs and selects which have
|
||||
* data-role=tagsinput
|
||||
*/
|
||||
$(function() {
|
||||
$("input[data-role=tagsinput], select[multiple][data-role=tagsinput]").tagsinput();
|
||||
});
|
||||
})(window.jQuery);
|
||||
4
staticfiles/assets/js/plugins/jquery.validate.min.js
vendored
Normal file
492
staticfiles/assets/js/plugins/moment.min.js
vendored
Normal file
@@ -0,0 +1,492 @@
|
||||
//! moment.js
|
||||
//! version : 2.14.1
|
||||
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
|
||||
//! license : MIT
|
||||
//! momentjs.com
|
||||
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return md.apply(null,arguments)}
|
||||
// This is done to register the method called with moment()
|
||||
// without creating circular dependencies.
|
||||
function b(a){md=a}function c(a){return a instanceof Array||"[object Array]"===Object.prototype.toString.call(a)}function d(a){return"[object Object]"===Object.prototype.toString.call(a)}function e(a){var b;for(b in a)
|
||||
// even if its not own property I'd still call it non-empty
|
||||
return!1;return!0}function f(a){return a instanceof Date||"[object Date]"===Object.prototype.toString.call(a)}function g(a,b){var c,d=[];for(c=0;c<a.length;++c)d.push(b(a[c],c));return d}function h(a,b){return Object.prototype.hasOwnProperty.call(a,b)}function i(a,b){for(var c in b)h(b,c)&&(a[c]=b[c]);return h(b,"toString")&&(a.toString=b.toString),h(b,"valueOf")&&(a.valueOf=b.valueOf),a}function j(a,b,c,d){return qb(a,b,c,d,!0).utc()}function k(){
|
||||
// We need to deep clone this object.
|
||||
return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null}}function l(a){return null==a._pf&&(a._pf=k()),a._pf}function m(a){if(null==a._isValid){var b=l(a),c=nd.call(b.parsedDateParts,function(a){return null!=a});a._isValid=!isNaN(a._d.getTime())&&b.overflow<0&&!b.empty&&!b.invalidMonth&&!b.invalidWeekday&&!b.nullInput&&!b.invalidFormat&&!b.userInvalidated&&(!b.meridiem||b.meridiem&&c),a._strict&&(a._isValid=a._isValid&&0===b.charsLeftOver&&0===b.unusedTokens.length&&void 0===b.bigHour)}return a._isValid}function n(a){var b=j(NaN);return null!=a?i(l(b),a):l(b).userInvalidated=!0,b}function o(a){return void 0===a}function p(a,b){var c,d,e;if(o(b._isAMomentObject)||(a._isAMomentObject=b._isAMomentObject),o(b._i)||(a._i=b._i),o(b._f)||(a._f=b._f),o(b._l)||(a._l=b._l),o(b._strict)||(a._strict=b._strict),o(b._tzm)||(a._tzm=b._tzm),o(b._isUTC)||(a._isUTC=b._isUTC),o(b._offset)||(a._offset=b._offset),o(b._pf)||(a._pf=l(b)),o(b._locale)||(a._locale=b._locale),od.length>0)for(c in od)d=od[c],e=b[d],o(e)||(a[d]=e);return a}
|
||||
// Moment prototype object
|
||||
function q(b){p(this,b),this._d=new Date(null!=b._d?b._d.getTime():NaN),pd===!1&&(pd=!0,a.updateOffset(this),pd=!1)}function r(a){return a instanceof q||null!=a&&null!=a._isAMomentObject}function s(a){return 0>a?Math.ceil(a)||0:Math.floor(a)}function t(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=s(b)),c}
|
||||
// compare two arrays, return the number of differences
|
||||
function u(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&t(a[d])!==t(b[d]))&&g++;return g+f}function v(b){a.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+b)}function w(b,c){var d=!0;return i(function(){return null!=a.deprecationHandler&&a.deprecationHandler(null,b),d&&(v(b+"\nArguments: "+Array.prototype.slice.call(arguments).join(", ")+"\n"+(new Error).stack),d=!1),c.apply(this,arguments)},c)}function x(b,c){null!=a.deprecationHandler&&a.deprecationHandler(b,c),qd[b]||(v(c),qd[b]=!0)}function y(a){return a instanceof Function||"[object Function]"===Object.prototype.toString.call(a)}function z(a){var b,c;for(c in a)b=a[c],y(b)?this[c]=b:this["_"+c]=b;this._config=a,
|
||||
// Lenient ordinal parsing accepts just a number in addition to
|
||||
// number + (possibly) stuff coming from _ordinalParseLenient.
|
||||
this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function A(a,b){var c,e=i({},a);for(c in b)h(b,c)&&(d(a[c])&&d(b[c])?(e[c]={},i(e[c],a[c]),i(e[c],b[c])):null!=b[c]?e[c]=b[c]:delete e[c]);for(c in a)h(a,c)&&!h(b,c)&&d(a[c])&&(
|
||||
// make sure changes to properties don't modify parent config
|
||||
e[c]=i({},e[c]));return e}function B(a){null!=a&&this.set(a)}function C(a,b,c){var d=this._calendar[a]||this._calendar.sameElse;return y(d)?d.call(b,c):d}function D(a){var b=this._longDateFormat[a],c=this._longDateFormat[a.toUpperCase()];return b||!c?b:(this._longDateFormat[a]=c.replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a])}function E(){return this._invalidDate}function F(a){return this._ordinal.replace("%d",a)}function G(a,b,c,d){var e=this._relativeTime[c];return y(e)?e(a,b,c,d):e.replace(/%d/i,a)}function H(a,b){var c=this._relativeTime[a>0?"future":"past"];return y(c)?c(b):c.replace(/%s/i,b)}function I(a,b){var c=a.toLowerCase();zd[c]=zd[c+"s"]=zd[b]=a}function J(a){return"string"==typeof a?zd[a]||zd[a.toLowerCase()]:void 0}function K(a){var b,c,d={};for(c in a)h(a,c)&&(b=J(c),b&&(d[b]=a[c]));return d}function L(a,b){Ad[a]=b}function M(a){var b=[];for(var c in a)b.push({unit:c,priority:Ad[c]});return b.sort(function(a,b){return a.priority-b.priority}),b}function N(b,c){return function(d){return null!=d?(P(this,b,d),a.updateOffset(this,c),this):O(this,b)}}function O(a,b){return a.isValid()?a._d["get"+(a._isUTC?"UTC":"")+b]():NaN}function P(a,b,c){a.isValid()&&a._d["set"+(a._isUTC?"UTC":"")+b](c)}
|
||||
// MOMENTS
|
||||
function Q(a){return a=J(a),y(this[a])?this[a]():this}function R(a,b){if("object"==typeof a){a=K(a);for(var c=M(a),d=0;d<c.length;d++)this[c[d].unit](a[c[d].unit])}else if(a=J(a),y(this[a]))return this[a](b);return this}function S(a,b,c){var d=""+Math.abs(a),e=b-d.length,f=a>=0;return(f?c?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+d}
|
||||
// token: 'M'
|
||||
// padded: ['MM', 2]
|
||||
// ordinal: 'Mo'
|
||||
// callback: function () { this.month() + 1 }
|
||||
function T(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(Ed[a]=e),b&&(Ed[b[0]]=function(){return S(e.apply(this,arguments),b[1],b[2])}),c&&(Ed[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function U(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function V(a){var b,c,d=a.match(Bd);for(b=0,c=d.length;c>b;b++)Ed[d[b]]?d[b]=Ed[d[b]]:d[b]=U(d[b]);return function(b){var e,f="";for(e=0;c>e;e++)f+=d[e]instanceof Function?d[e].call(b,a):d[e];return f}}
|
||||
// format date using native date object
|
||||
function W(a,b){return a.isValid()?(b=X(b,a.localeData()),Dd[b]=Dd[b]||V(b),Dd[b](a)):a.localeData().invalidDate()}function X(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Cd.lastIndex=0;d>=0&&Cd.test(a);)a=a.replace(Cd,c),Cd.lastIndex=0,d-=1;return a}function Y(a,b,c){Wd[a]=y(b)?b:function(a,d){return a&&c?c:b}}function Z(a,b){return h(Wd,a)?Wd[a](b._strict,b._locale):new RegExp($(a))}
|
||||
// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
|
||||
function $(a){return _(a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}))}function _(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function aa(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),"number"==typeof b&&(d=function(a,c){c[b]=t(a)}),c=0;c<a.length;c++)Xd[a[c]]=d}function ba(a,b){aa(a,function(a,c,d,e){d._w=d._w||{},b(a,d._w,d,e)})}function ca(a,b,c){null!=b&&h(Xd,a)&&Xd[a](b,c._a,c,a)}function da(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function ea(a,b){return c(this._months)?this._months[a.month()]:this._months[(this._months.isFormat||fe).test(b)?"format":"standalone"][a.month()]}function fa(a,b){return c(this._monthsShort)?this._monthsShort[a.month()]:this._monthsShort[fe.test(b)?"format":"standalone"][a.month()]}function ga(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._monthsParse)for(
|
||||
// this is not used
|
||||
this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],d=0;12>d;++d)f=j([2e3,d]),this._shortMonthsParse[d]=this.monthsShort(f,"").toLocaleLowerCase(),this._longMonthsParse[d]=this.months(f,"").toLocaleLowerCase();return c?"MMM"===b?(e=sd.call(this._shortMonthsParse,g),-1!==e?e:null):(e=sd.call(this._longMonthsParse,g),-1!==e?e:null):"MMM"===b?(e=sd.call(this._shortMonthsParse,g),-1!==e?e:(e=sd.call(this._longMonthsParse,g),-1!==e?e:null)):(e=sd.call(this._longMonthsParse,g),-1!==e?e:(e=sd.call(this._shortMonthsParse,g),-1!==e?e:null))}function ha(a,b,c){var d,e,f;if(this._monthsParseExact)return ga.call(this,a,b,c);
|
||||
// TODO: add sorting
|
||||
// Sorting makes sure if one month (or abbr) is a prefix of another
|
||||
// see sorting in computeMonthsParse
|
||||
for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){
|
||||
// test the regex
|
||||
if(e=j([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}}
|
||||
// MOMENTS
|
||||
function ia(a,b){var c;if(!a.isValid())
|
||||
// No op
|
||||
return a;if("string"==typeof b)if(/^\d+$/.test(b))b=t(b);else
|
||||
// TODO: Another silent failure?
|
||||
if(b=a.localeData().monthsParse(b),"number"!=typeof b)return a;return c=Math.min(a.date(),da(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a}function ja(b){return null!=b?(ia(this,b),a.updateOffset(this,!0),this):O(this,"Month")}function ka(){return da(this.year(),this.month())}function la(a){return this._monthsParseExact?(h(this,"_monthsRegex")||na.call(this),a?this._monthsShortStrictRegex:this._monthsShortRegex):(h(this,"_monthsShortRegex")||(this._monthsShortRegex=ie),this._monthsShortStrictRegex&&a?this._monthsShortStrictRegex:this._monthsShortRegex)}function ma(a){return this._monthsParseExact?(h(this,"_monthsRegex")||na.call(this),a?this._monthsStrictRegex:this._monthsRegex):(h(this,"_monthsRegex")||(this._monthsRegex=je),this._monthsStrictRegex&&a?this._monthsStrictRegex:this._monthsRegex)}function na(){function a(a,b){return b.length-a.length}var b,c,d=[],e=[],f=[];for(b=0;12>b;b++)c=j([2e3,b]),d.push(this.monthsShort(c,"")),e.push(this.months(c,"")),f.push(this.months(c,"")),f.push(this.monthsShort(c,""));for(
|
||||
// Sorting makes sure if one month (or abbr) is a prefix of another it
|
||||
// will match the longer piece.
|
||||
d.sort(a),e.sort(a),f.sort(a),b=0;12>b;b++)d[b]=_(d[b]),e[b]=_(e[b]);for(b=0;24>b;b++)f[b]=_(f[b]);this._monthsRegex=new RegExp("^("+f.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+e.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+d.join("|")+")","i")}
|
||||
// HELPERS
|
||||
function oa(a){return pa(a)?366:365}function pa(a){return a%4===0&&a%100!==0||a%400===0}function qa(){return pa(this.year())}function ra(a,b,c,d,e,f,g){
|
||||
//can't just apply() to create a date:
|
||||
//http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
|
||||
var h=new Date(a,b,c,d,e,f,g);
|
||||
//the date constructor remaps years 0-99 to 1900-1999
|
||||
return 100>a&&a>=0&&isFinite(h.getFullYear())&&h.setFullYear(a),h}function sa(a){var b=new Date(Date.UTC.apply(null,arguments));
|
||||
//the Date.UTC function remaps years 0-99 to 1900-1999
|
||||
return 100>a&&a>=0&&isFinite(b.getUTCFullYear())&&b.setUTCFullYear(a),b}
|
||||
// start-of-first-week - start-of-year
|
||||
function ta(a,b,c){var// first-week day -- which january is always in the first week (4 for iso, 1 for other)
|
||||
d=7+b-c,
|
||||
// first-week day local weekday -- which local weekday is fwd
|
||||
e=(7+sa(a,0,d).getUTCDay()-b)%7;return-e+d-1}
|
||||
//http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
|
||||
function ua(a,b,c,d,e){var f,g,h=(7+c-d)%7,i=ta(a,d,e),j=1+7*(b-1)+h+i;return 0>=j?(f=a-1,g=oa(f)+j):j>oa(a)?(f=a+1,g=j-oa(a)):(f=a,g=j),{year:f,dayOfYear:g}}function va(a,b,c){var d,e,f=ta(a.year(),b,c),g=Math.floor((a.dayOfYear()-f-1)/7)+1;return 1>g?(e=a.year()-1,d=g+wa(e,b,c)):g>wa(a.year(),b,c)?(d=g-wa(a.year(),b,c),e=a.year()+1):(e=a.year(),d=g),{week:d,year:e}}function wa(a,b,c){var d=ta(a,b,c),e=ta(a+1,b,c);return(oa(a)-d+e)/7}
|
||||
// HELPERS
|
||||
// LOCALES
|
||||
function xa(a){return va(a,this._week.dow,this._week.doy).week}function ya(){return this._week.dow}function za(){return this._week.doy}
|
||||
// MOMENTS
|
||||
function Aa(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function Ba(a){var b=va(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")}
|
||||
// HELPERS
|
||||
function Ca(a,b){return"string"!=typeof a?a:isNaN(a)?(a=b.weekdaysParse(a),"number"==typeof a?a:null):parseInt(a,10)}function Da(a,b){return"string"==typeof a?b.weekdaysParse(a)%7||7:isNaN(a)?null:a}function Ea(a,b){return c(this._weekdays)?this._weekdays[a.day()]:this._weekdays[this._weekdays.isFormat.test(b)?"format":"standalone"][a.day()]}function Fa(a){return this._weekdaysShort[a.day()]}function Ga(a){return this._weekdaysMin[a.day()]}function Ha(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],d=0;7>d;++d)f=j([2e3,1]).day(d),this._minWeekdaysParse[d]=this.weekdaysMin(f,"").toLocaleLowerCase(),this._shortWeekdaysParse[d]=this.weekdaysShort(f,"").toLocaleLowerCase(),this._weekdaysParse[d]=this.weekdays(f,"").toLocaleLowerCase();return c?"dddd"===b?(e=sd.call(this._weekdaysParse,g),-1!==e?e:null):"ddd"===b?(e=sd.call(this._shortWeekdaysParse,g),-1!==e?e:null):(e=sd.call(this._minWeekdaysParse,g),-1!==e?e:null):"dddd"===b?(e=sd.call(this._weekdaysParse,g),-1!==e?e:(e=sd.call(this._shortWeekdaysParse,g),-1!==e?e:(e=sd.call(this._minWeekdaysParse,g),-1!==e?e:null))):"ddd"===b?(e=sd.call(this._shortWeekdaysParse,g),-1!==e?e:(e=sd.call(this._weekdaysParse,g),-1!==e?e:(e=sd.call(this._minWeekdaysParse,g),-1!==e?e:null))):(e=sd.call(this._minWeekdaysParse,g),-1!==e?e:(e=sd.call(this._weekdaysParse,g),-1!==e?e:(e=sd.call(this._shortWeekdaysParse,g),-1!==e?e:null)))}function Ia(a,b,c){var d,e,f;if(this._weekdaysParseExact)return Ha.call(this,a,b,c);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),d=0;7>d;d++){
|
||||
// test the regex
|
||||
if(e=j([2e3,1]).day(d),c&&!this._fullWeekdaysParse[d]&&(this._fullWeekdaysParse[d]=new RegExp("^"+this.weekdays(e,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[d]=new RegExp("^"+this.weekdaysShort(e,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[d]=new RegExp("^"+this.weekdaysMin(e,"").replace(".",".?")+"$","i")),this._weekdaysParse[d]||(f="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[d]=new RegExp(f.replace(".",""),"i")),c&&"dddd"===b&&this._fullWeekdaysParse[d].test(a))return d;if(c&&"ddd"===b&&this._shortWeekdaysParse[d].test(a))return d;if(c&&"dd"===b&&this._minWeekdaysParse[d].test(a))return d;if(!c&&this._weekdaysParse[d].test(a))return d}}
|
||||
// MOMENTS
|
||||
function Ja(a){if(!this.isValid())return null!=a?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=Ca(a,this.localeData()),this.add(a-b,"d")):b}function Ka(a){if(!this.isValid())return null!=a?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function La(a){if(!this.isValid())return null!=a?this:NaN;
|
||||
// behaves the same as moment#day except
|
||||
// as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
|
||||
// as a setter, sunday should belong to the previous week.
|
||||
if(null!=a){var b=Da(a,this.localeData());return this.day(this.day()%7?b:b-7)}return this.day()||7}function Ma(a){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||Pa.call(this),a?this._weekdaysStrictRegex:this._weekdaysRegex):(h(this,"_weekdaysRegex")||(this._weekdaysRegex=pe),this._weekdaysStrictRegex&&a?this._weekdaysStrictRegex:this._weekdaysRegex)}function Na(a){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||Pa.call(this),a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(h(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=qe),this._weekdaysShortStrictRegex&&a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Oa(a){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||Pa.call(this),a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(h(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=re),this._weekdaysMinStrictRegex&&a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Pa(){function a(a,b){return b.length-a.length}var b,c,d,e,f,g=[],h=[],i=[],k=[];for(b=0;7>b;b++)c=j([2e3,1]).day(b),d=this.weekdaysMin(c,""),e=this.weekdaysShort(c,""),f=this.weekdays(c,""),g.push(d),h.push(e),i.push(f),k.push(d),k.push(e),k.push(f);for(
|
||||
// Sorting makes sure if one weekday (or abbr) is a prefix of another it
|
||||
// will match the longer piece.
|
||||
g.sort(a),h.sort(a),i.sort(a),k.sort(a),b=0;7>b;b++)h[b]=_(h[b]),i[b]=_(i[b]),k[b]=_(k[b]);this._weekdaysRegex=new RegExp("^("+k.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+g.join("|")+")","i")}
|
||||
// FORMATTING
|
||||
function Qa(){return this.hours()%12||12}function Ra(){return this.hours()||24}function Sa(a,b){T(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}
|
||||
// PARSING
|
||||
function Ta(a,b){return b._meridiemParse}
|
||||
// LOCALES
|
||||
function Ua(a){
|
||||
// IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
|
||||
// Using charAt should be more compatible.
|
||||
return"p"===(a+"").toLowerCase().charAt(0)}function Va(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function Wa(a){return a?a.toLowerCase().replace("_","-"):a}
|
||||
// pick the locale from the array
|
||||
// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
|
||||
// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
|
||||
function Xa(a){for(var b,c,d,e,f=0;f<a.length;){for(e=Wa(a[f]).split("-"),b=e.length,c=Wa(a[f+1]),c=c?c.split("-"):null;b>0;){if(d=Ya(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&u(e,c,!0)>=b-1)
|
||||
//the next array item is better than a shallower substring of this one
|
||||
break;b--}f++}return null}function Ya(a){var b=null;
|
||||
// TODO: Find a better way to register and load all the locales in Node
|
||||
if(!we[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=se._abbr,require("./locale/"+a),
|
||||
// because defineLocale currently also sets the global locale, we
|
||||
// want to undo that for lazy loaded locales
|
||||
Za(b)}catch(c){}return we[a]}
|
||||
// This function will load locale and then set the global locale. If
|
||||
// no arguments are passed in, it will simply return the current global
|
||||
// locale key.
|
||||
function Za(a,b){var c;
|
||||
// moment.duration._locale = moment._locale = data;
|
||||
return a&&(c=o(b)?ab(a):$a(a,b),c&&(se=c)),se._abbr}function $a(a,b){if(null!==b){var c=ve;
|
||||
// treat as if there is no base config
|
||||
// backwards compat for now: also set the locale
|
||||
return b.abbr=a,null!=we[a]?(x("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),c=we[a]._config):null!=b.parentLocale&&(null!=we[b.parentLocale]?c=we[b.parentLocale]._config:x("parentLocaleUndefined","specified parentLocale is not defined yet. See http://momentjs.com/guides/#/warnings/parent-locale/")),we[a]=new B(A(c,b)),Za(a),we[a]}
|
||||
// useful for testing
|
||||
return delete we[a],null}function _a(a,b){if(null!=b){var c,d=ve;
|
||||
// MERGE
|
||||
null!=we[a]&&(d=we[a]._config),b=A(d,b),c=new B(b),c.parentLocale=we[a],we[a]=c,
|
||||
// backwards compat for now: also set the locale
|
||||
Za(a)}else
|
||||
// pass null for config to unupdate, useful for tests
|
||||
null!=we[a]&&(null!=we[a].parentLocale?we[a]=we[a].parentLocale:null!=we[a]&&delete we[a]);return we[a]}
|
||||
// returns locale data
|
||||
function ab(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return se;if(!c(a)){if(b=Ya(a))return b;a=[a]}return Xa(a)}function bb(){return rd(we)}function cb(a){var b,c=a._a;return c&&-2===l(a).overflow&&(b=c[Zd]<0||c[Zd]>11?Zd:c[$d]<1||c[$d]>da(c[Yd],c[Zd])?$d:c[_d]<0||c[_d]>24||24===c[_d]&&(0!==c[ae]||0!==c[be]||0!==c[ce])?_d:c[ae]<0||c[ae]>59?ae:c[be]<0||c[be]>59?be:c[ce]<0||c[ce]>999?ce:-1,l(a)._overflowDayOfYear&&(Yd>b||b>$d)&&(b=$d),l(a)._overflowWeeks&&-1===b&&(b=de),l(a)._overflowWeekday&&-1===b&&(b=ee),l(a).overflow=b),a}
|
||||
// date from iso format
|
||||
function db(a){var b,c,d,e,f,g,h=a._i,i=xe.exec(h)||ye.exec(h);if(i){for(l(a).iso=!0,b=0,c=Ae.length;c>b;b++)if(Ae[b][1].exec(i[1])){e=Ae[b][0],d=Ae[b][2]!==!1;break}if(null==e)return void(a._isValid=!1);if(i[3]){for(b=0,c=Be.length;c>b;b++)if(Be[b][1].exec(i[3])){
|
||||
// match[2] should be 'T' or space
|
||||
f=(i[2]||" ")+Be[b][0];break}if(null==f)return void(a._isValid=!1)}if(!d&&null!=f)return void(a._isValid=!1);if(i[4]){if(!ze.exec(i[4]))return void(a._isValid=!1);g="Z"}a._f=e+(f||"")+(g||""),jb(a)}else a._isValid=!1}
|
||||
// date from iso format or fallback
|
||||
function eb(b){var c=Ce.exec(b._i);return null!==c?void(b._d=new Date(+c[1])):(db(b),void(b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b))))}
|
||||
// Pick the first defined of two or three arguments.
|
||||
function fb(a,b,c){return null!=a?a:null!=b?b:c}function gb(b){
|
||||
// hooks is actually the exported moment object
|
||||
var c=new Date(a.now());return b._useUTC?[c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()]:[c.getFullYear(),c.getMonth(),c.getDate()]}
|
||||
// convert an array to a date.
|
||||
// the array should mirror the parameters below
|
||||
// note: all values past the year are optional and will default to the lowest possible value.
|
||||
// [year, month, day , hour, minute, second, millisecond]
|
||||
function hb(a){var b,c,d,e,f=[];if(!a._d){
|
||||
// Default to current date.
|
||||
// * if no year, month, day of month are given, default to today
|
||||
// * if day of month is given, default month and year
|
||||
// * if month is given, default only year
|
||||
// * if year is given, don't default anything
|
||||
for(d=gb(a),a._w&&null==a._a[$d]&&null==a._a[Zd]&&ib(a),a._dayOfYear&&(e=fb(a._a[Yd],d[Yd]),a._dayOfYear>oa(e)&&(l(a)._overflowDayOfYear=!0),c=sa(e,0,a._dayOfYear),a._a[Zd]=c.getUTCMonth(),a._a[$d]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=f[b]=d[b];
|
||||
// Zero out whatever was not defaulted, including time
|
||||
for(;7>b;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];
|
||||
// Check for 24:00:00.000
|
||||
24===a._a[_d]&&0===a._a[ae]&&0===a._a[be]&&0===a._a[ce]&&(a._nextDay=!0,a._a[_d]=0),a._d=(a._useUTC?sa:ra).apply(null,f),
|
||||
// Apply timezone offset from input. The actual utcOffset can be changed
|
||||
// with parseZone.
|
||||
null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[_d]=24)}}function ib(a){var b,c,d,e,f,g,h,i;b=a._w,null!=b.GG||null!=b.W||null!=b.E?(f=1,g=4,c=fb(b.GG,a._a[Yd],va(rb(),1,4).year),d=fb(b.W,1),e=fb(b.E,1),(1>e||e>7)&&(i=!0)):(f=a._locale._week.dow,g=a._locale._week.doy,c=fb(b.gg,a._a[Yd],va(rb(),f,g).year),d=fb(b.w,1),null!=b.d?(e=b.d,(0>e||e>6)&&(i=!0)):null!=b.e?(e=b.e+f,(b.e<0||b.e>6)&&(i=!0)):e=f),1>d||d>wa(c,f,g)?l(a)._overflowWeeks=!0:null!=i?l(a)._overflowWeekday=!0:(h=ua(c,d,e,f,g),a._a[Yd]=h.year,a._dayOfYear=h.dayOfYear)}
|
||||
// date from string and format string
|
||||
function jb(b){
|
||||
// TODO: Move this to another part of the creation flow to prevent circular deps
|
||||
if(b._f===a.ISO_8601)return void db(b);b._a=[],l(b).empty=!0;
|
||||
// This array is used to make a Date, either with `new Date` or `Date.UTC`
|
||||
var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=X(b._f,b._locale).match(Bd)||[],c=0;c<e.length;c++)f=e[c],d=(h.match(Z(f,b))||[])[0],d&&(g=h.substr(0,h.indexOf(d)),g.length>0&&l(b).unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),Ed[f]?(d?l(b).empty=!1:l(b).unusedTokens.push(f),ca(f,d,b)):b._strict&&!d&&l(b).unusedTokens.push(f);
|
||||
// add remaining unparsed input length to the string
|
||||
l(b).charsLeftOver=i-j,h.length>0&&l(b).unusedInput.push(h),
|
||||
// clear _12h flag if hour is <= 12
|
||||
b._a[_d]<=12&&l(b).bigHour===!0&&b._a[_d]>0&&(l(b).bigHour=void 0),l(b).parsedDateParts=b._a.slice(0),l(b).meridiem=b._meridiem,
|
||||
// handle meridiem
|
||||
b._a[_d]=kb(b._locale,b._a[_d],b._meridiem),hb(b),cb(b)}function kb(a,b,c){var d;
|
||||
// Fallback
|
||||
return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}
|
||||
// date from string and array of format strings
|
||||
function lb(a){var b,c,d,e,f;if(0===a._f.length)return l(a).invalidFormat=!0,void(a._d=new Date(NaN));for(e=0;e<a._f.length;e++)f=0,b=p({},a),null!=a._useUTC&&(b._useUTC=a._useUTC),b._f=a._f[e],jb(b),m(b)&&(f+=l(b).charsLeftOver,f+=10*l(b).unusedTokens.length,l(b).score=f,(null==d||d>f)&&(d=f,c=b));i(a,c||b)}function mb(a){if(!a._d){var b=K(a._i);a._a=g([b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],function(a){return a&&parseInt(a,10)}),hb(a)}}function nb(a){var b=new q(cb(ob(a)));
|
||||
// Adding is smart enough around DST
|
||||
return b._nextDay&&(b.add(1,"d"),b._nextDay=void 0),b}function ob(a){var b=a._i,d=a._f;return a._locale=a._locale||ab(a._l),null===b||void 0===d&&""===b?n({nullInput:!0}):("string"==typeof b&&(a._i=b=a._locale.preparse(b)),r(b)?new q(cb(b)):(c(d)?lb(a):f(b)?a._d=b:d?jb(a):pb(a),m(a)||(a._d=null),a))}function pb(b){var d=b._i;void 0===d?b._d=new Date(a.now()):f(d)?b._d=new Date(d.valueOf()):"string"==typeof d?eb(b):c(d)?(b._a=g(d.slice(0),function(a){return parseInt(a,10)}),hb(b)):"object"==typeof d?mb(b):"number"==typeof d?
|
||||
// from milliseconds
|
||||
b._d=new Date(d):a.createFromInputFallback(b)}function qb(a,b,f,g,h){var i={};
|
||||
// object construction must be done this way.
|
||||
// https://github.com/moment/moment/issues/1423
|
||||
return"boolean"==typeof f&&(g=f,f=void 0),(d(a)&&e(a)||c(a)&&0===a.length)&&(a=void 0),i._isAMomentObject=!0,i._useUTC=i._isUTC=h,i._l=f,i._i=a,i._f=b,i._strict=g,nb(i)}function rb(a,b,c,d){return qb(a,b,c,d,!1)}
|
||||
// Pick a moment m from moments so that m[fn](other) is true for all
|
||||
// other. This relies on the function fn to be transitive.
|
||||
//
|
||||
// moments should either be an array of moment objects or an array, whose
|
||||
// first element is an array of moment objects.
|
||||
function sb(a,b){var d,e;if(1===b.length&&c(b[0])&&(b=b[0]),!b.length)return rb();for(d=b[0],e=1;e<b.length;++e)b[e].isValid()&&!b[e][a](d)||(d=b[e]);return d}
|
||||
// TODO: Use [].sort instead?
|
||||
function tb(){var a=[].slice.call(arguments,0);return sb("isBefore",a)}function ub(){var a=[].slice.call(arguments,0);return sb("isAfter",a)}function vb(a){var b=K(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;
|
||||
// representation for dateAddRemove
|
||||
this._milliseconds=+k+1e3*j+// 1000
|
||||
6e4*i+// 1000 * 60
|
||||
1e3*h*60*60,//using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
|
||||
// Because of dateAddRemove treats 24 hours as different from a
|
||||
// day when working around DST, we need to store them separately
|
||||
this._days=+g+7*f,
|
||||
// It is impossible translate months into days without knowing
|
||||
// which months you are are talking about, so we have to store
|
||||
// it separately.
|
||||
this._months=+e+3*d+12*c,this._data={},this._locale=ab(),this._bubble()}function wb(a){return a instanceof vb}
|
||||
// FORMATTING
|
||||
function xb(a,b){T(a,0,0,function(){var a=this.utcOffset(),c="+";return 0>a&&(a=-a,c="-"),c+S(~~(a/60),2)+b+S(~~a%60,2)})}function yb(a,b){var c=(b||"").match(a)||[],d=c[c.length-1]||[],e=(d+"").match(Ge)||["-",0,0],f=+(60*e[1])+t(e[2]);return"+"===e[0]?f:-f}
|
||||
// Return a moment from input, that is local/utc/zone equivalent to model.
|
||||
function zb(b,c){var d,e;
|
||||
// Use low-level api, because this fn is low-level api.
|
||||
return c._isUTC?(d=c.clone(),e=(r(b)||f(b)?b.valueOf():rb(b).valueOf())-d.valueOf(),d._d.setTime(d._d.valueOf()+e),a.updateOffset(d,!1),d):rb(b).local()}function Ab(a){
|
||||
// On Firefox.24 Date#getTimezoneOffset returns a floating point.
|
||||
// https://github.com/moment/moment/pull/1871
|
||||
return 15*-Math.round(a._d.getTimezoneOffset()/15)}
|
||||
// MOMENTS
|
||||
// keepLocalTime = true means only change the timezone, without
|
||||
// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
|
||||
// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
|
||||
// +0200, so we adjust the time as needed, to be valid.
|
||||
//
|
||||
// Keeping the time actually adds/subtracts (one hour)
|
||||
// from the actual represented time. That is why we call updateOffset
|
||||
// a second time. In case it wants us to change the offset again
|
||||
// _changeInProgress == true case, then we have to adjust, because
|
||||
// there is no such time in the given timezone.
|
||||
function Bb(b,c){var d,e=this._offset||0;return this.isValid()?null!=b?("string"==typeof b?b=yb(Td,b):Math.abs(b)<16&&(b=60*b),!this._isUTC&&c&&(d=Ab(this)),this._offset=b,this._isUTC=!0,null!=d&&this.add(d,"m"),e!==b&&(!c||this._changeInProgress?Sb(this,Mb(b-e,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?e:Ab(this):null!=b?this:NaN}function Cb(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function Db(a){return this.utcOffset(0,a)}function Eb(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Ab(this),"m")),this}function Fb(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(yb(Sd,this._i)),this}function Gb(a){return this.isValid()?(a=a?rb(a).utcOffset():0,(this.utcOffset()-a)%60===0):!1}function Hb(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ib(){if(!o(this._isDSTShifted))return this._isDSTShifted;var a={};if(p(a,this),a=ob(a),a._a){var b=a._isUTC?j(a._a):rb(a._a);this._isDSTShifted=this.isValid()&&u(a._a,b.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Jb(){return this.isValid()?!this._isUTC:!1}function Kb(){return this.isValid()?this._isUTC:!1}function Lb(){return this.isValid()?this._isUTC&&0===this._offset:!1}function Mb(a,b){var c,d,e,f=a,
|
||||
// matching against regexp is expensive, do it on demand
|
||||
g=null;// checks for null or undefined
|
||||
return wb(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(f={},b?f[b]=a:f.milliseconds=a):(g=He.exec(a))?(c="-"===g[1]?-1:1,f={y:0,d:t(g[$d])*c,h:t(g[_d])*c,m:t(g[ae])*c,s:t(g[be])*c,ms:t(g[ce])*c}):(g=Ie.exec(a))?(c="-"===g[1]?-1:1,f={y:Nb(g[2],c),M:Nb(g[3],c),w:Nb(g[4],c),d:Nb(g[5],c),h:Nb(g[6],c),m:Nb(g[7],c),s:Nb(g[8],c)}):null==f?f={}:"object"==typeof f&&("from"in f||"to"in f)&&(e=Pb(rb(f.from),rb(f.to)),f={},f.ms=e.milliseconds,f.M=e.months),d=new vb(f),wb(a)&&h(a,"_locale")&&(d._locale=a._locale),d}function Nb(a,b){
|
||||
// We'd normally use ~~inp for this, but unfortunately it also
|
||||
// converts floats to ints.
|
||||
// inp may be undefined, so careful calling replace on it.
|
||||
var c=a&&parseFloat(a.replace(",","."));
|
||||
// apply sign while we're at it
|
||||
return(isNaN(c)?0:c)*b}function Ob(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function Pb(a,b){var c;return a.isValid()&&b.isValid()?(b=zb(b,a),a.isBefore(b)?c=Ob(a,b):(c=Ob(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c):{milliseconds:0,months:0}}function Qb(a){return 0>a?-1*Math.round(-1*a):Math.round(a)}
|
||||
// TODO: remove 'name' arg after deprecation is removed
|
||||
function Rb(a,b){return function(c,d){var e,f;
|
||||
//invert the arguments, but complain about it
|
||||
return null===d||isNaN(+d)||(x(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=Mb(c,d),Sb(this,e,a),this}}function Sb(b,c,d,e){var f=c._milliseconds,g=Qb(c._days),h=Qb(c._months);b.isValid()&&(e=null==e?!0:e,f&&b._d.setTime(b._d.valueOf()+f*d),g&&P(b,"Date",O(b,"Date")+g*d),h&&ia(b,O(b,"Month")+h*d),e&&a.updateOffset(b,g||h))}function Tb(a,b){var c=a.diff(b,"days",!0);return-6>c?"sameElse":-1>c?"lastWeek":0>c?"lastDay":1>c?"sameDay":2>c?"nextDay":7>c?"nextWeek":"sameElse"}function Ub(b,c){
|
||||
// We want to compare the start of today, vs this.
|
||||
// Getting start-of-today depends on whether we're local/utc/offset or not.
|
||||
var d=b||rb(),e=zb(d,this).startOf("day"),f=a.calendarFormat(this,e)||"sameElse",g=c&&(y(c[f])?c[f].call(this,d):c[f]);return this.format(g||this.localeData().calendar(f,this,rb(d)))}function Vb(){return new q(this)}function Wb(a,b){var c=r(a)?a:rb(a);return this.isValid()&&c.isValid()?(b=J(o(b)?"millisecond":b),"millisecond"===b?this.valueOf()>c.valueOf():c.valueOf()<this.clone().startOf(b).valueOf()):!1}function Xb(a,b){var c=r(a)?a:rb(a);return this.isValid()&&c.isValid()?(b=J(o(b)?"millisecond":b),"millisecond"===b?this.valueOf()<c.valueOf():this.clone().endOf(b).valueOf()<c.valueOf()):!1}function Yb(a,b,c,d){return d=d||"()",("("===d[0]?this.isAfter(a,c):!this.isBefore(a,c))&&(")"===d[1]?this.isBefore(b,c):!this.isAfter(b,c))}function Zb(a,b){var c,d=r(a)?a:rb(a);return this.isValid()&&d.isValid()?(b=J(b||"millisecond"),"millisecond"===b?this.valueOf()===d.valueOf():(c=d.valueOf(),this.clone().startOf(b).valueOf()<=c&&c<=this.clone().endOf(b).valueOf())):!1}function $b(a,b){return this.isSame(a,b)||this.isAfter(a,b)}function _b(a,b){return this.isSame(a,b)||this.isBefore(a,b)}function ac(a,b,c){var d,e,f,g;// 1000
|
||||
// 1000 * 60
|
||||
// 1000 * 60 * 60
|
||||
// 1000 * 60 * 60 * 24, negate dst
|
||||
// 1000 * 60 * 60 * 24 * 7, negate dst
|
||||
return this.isValid()?(d=zb(a,this),d.isValid()?(e=6e4*(d.utcOffset()-this.utcOffset()),b=J(b),"year"===b||"month"===b||"quarter"===b?(g=bc(this,d),"quarter"===b?g/=3:"year"===b&&(g/=12)):(f=this-d,g="second"===b?f/1e3:"minute"===b?f/6e4:"hour"===b?f/36e5:"day"===b?(f-e)/864e5:"week"===b?(f-e)/6048e5:f),c?g:s(g)):NaN):NaN}function bc(a,b){
|
||||
// difference in months
|
||||
var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),
|
||||
// b is in (anchor - 1 month, anchor + 1 month)
|
||||
f=a.clone().add(e,"months");
|
||||
//check for negative zero, return zero if negative zero
|
||||
// linear across the month
|
||||
// linear across the month
|
||||
return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)||0}function cc(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function dc(){var a=this.clone().utc();return 0<a.year()&&a.year()<=9999?y(Date.prototype.toISOString)?this.toDate().toISOString():W(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):W(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function ec(b){b||(b=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var c=W(this,b);return this.localeData().postformat(c)}function fc(a,b){return this.isValid()&&(r(a)&&a.isValid()||rb(a).isValid())?Mb({to:this,from:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function gc(a){return this.from(rb(),a)}function hc(a,b){return this.isValid()&&(r(a)&&a.isValid()||rb(a).isValid())?Mb({from:this,to:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function ic(a){return this.to(rb(),a)}
|
||||
// If passed a locale key, it will set the locale for this
|
||||
// instance. Otherwise, it will return the locale configuration
|
||||
// variables for this instance.
|
||||
function jc(a){var b;return void 0===a?this._locale._abbr:(b=ab(a),null!=b&&(this._locale=b),this)}function kc(){return this._locale}function lc(a){
|
||||
// the following switch intentionally omits break keywords
|
||||
// to utilize falling through the cases.
|
||||
switch(a=J(a)){case"year":this.month(0);/* falls through */
|
||||
case"quarter":case"month":this.date(1);/* falls through */
|
||||
case"week":case"isoWeek":case"day":case"date":this.hours(0);/* falls through */
|
||||
case"hour":this.minutes(0);/* falls through */
|
||||
case"minute":this.seconds(0);/* falls through */
|
||||
case"second":this.milliseconds(0)}
|
||||
// weeks are a special case
|
||||
// quarters are also special
|
||||
return"week"===a&&this.weekday(0),"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this}function mc(a){
|
||||
// 'date' is an alias for 'day', so it should be considered as such.
|
||||
return a=J(a),void 0===a||"millisecond"===a?this:("date"===a&&(a="day"),this.startOf(a).add(1,"isoWeek"===a?"week":a).subtract(1,"ms"))}function nc(){return this._d.valueOf()-6e4*(this._offset||0)}function oc(){return Math.floor(this.valueOf()/1e3)}function pc(){return new Date(this.valueOf())}function qc(){var a=this;return[a.year(),a.month(),a.date(),a.hour(),a.minute(),a.second(),a.millisecond()]}function rc(){var a=this;return{years:a.year(),months:a.month(),date:a.date(),hours:a.hours(),minutes:a.minutes(),seconds:a.seconds(),milliseconds:a.milliseconds()}}function sc(){
|
||||
// new Date(NaN).toJSON() === null
|
||||
return this.isValid()?this.toISOString():null}function tc(){return m(this)}function uc(){return i({},l(this))}function vc(){return l(this).overflow}function wc(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function xc(a,b){T(0,[a,a.length],0,b)}
|
||||
// MOMENTS
|
||||
function yc(a){return Cc.call(this,a,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function zc(a){return Cc.call(this,a,this.isoWeek(),this.isoWeekday(),1,4)}function Ac(){return wa(this.year(),1,4)}function Bc(){var a=this.localeData()._week;return wa(this.year(),a.dow,a.doy)}function Cc(a,b,c,d,e){var f;return null==a?va(this,d,e).year:(f=wa(a,d,e),b>f&&(b=f),Dc.call(this,a,b,c,d,e))}function Dc(a,b,c,d,e){var f=ua(a,b,c,d,e),g=sa(f.year,0,f.dayOfYear);return this.year(g.getUTCFullYear()),this.month(g.getUTCMonth()),this.date(g.getUTCDate()),this}
|
||||
// MOMENTS
|
||||
function Ec(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)}
|
||||
// HELPERS
|
||||
// MOMENTS
|
||||
function Fc(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function Gc(a,b){b[ce]=t(1e3*("0."+a))}
|
||||
// MOMENTS
|
||||
function Hc(){return this._isUTC?"UTC":""}function Ic(){return this._isUTC?"Coordinated Universal Time":""}function Jc(a){return rb(1e3*a)}function Kc(){return rb.apply(null,arguments).parseZone()}function Lc(a){return a}function Mc(a,b,c,d){var e=ab(),f=j().set(d,b);return e[c](f,a)}function Nc(a,b,c){if("number"==typeof a&&(b=a,a=void 0),a=a||"",null!=b)return Mc(a,b,c,"month");var d,e=[];for(d=0;12>d;d++)e[d]=Mc(a,d,c,"month");return e}
|
||||
// ()
|
||||
// (5)
|
||||
// (fmt, 5)
|
||||
// (fmt)
|
||||
// (true)
|
||||
// (true, 5)
|
||||
// (true, fmt, 5)
|
||||
// (true, fmt)
|
||||
function Oc(a,b,c,d){"boolean"==typeof a?("number"==typeof b&&(c=b,b=void 0),b=b||""):(b=a,c=b,a=!1,"number"==typeof b&&(c=b,b=void 0),b=b||"");var e=ab(),f=a?e._week.dow:0;if(null!=c)return Mc(b,(c+f)%7,d,"day");var g,h=[];for(g=0;7>g;g++)h[g]=Mc(b,(g+f)%7,d,"day");return h}function Pc(a,b){return Nc(a,b,"months")}function Qc(a,b){return Nc(a,b,"monthsShort")}function Rc(a,b,c){return Oc(a,b,c,"weekdays")}function Sc(a,b,c){return Oc(a,b,c,"weekdaysShort")}function Tc(a,b,c){return Oc(a,b,c,"weekdaysMin")}function Uc(){var a=this._data;return this._milliseconds=Ue(this._milliseconds),this._days=Ue(this._days),this._months=Ue(this._months),a.milliseconds=Ue(a.milliseconds),a.seconds=Ue(a.seconds),a.minutes=Ue(a.minutes),a.hours=Ue(a.hours),a.months=Ue(a.months),a.years=Ue(a.years),this}function Vc(a,b,c,d){var e=Mb(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}
|
||||
// supports only 2.0-style add(1, 's') or add(duration)
|
||||
function Wc(a,b){return Vc(this,a,b,1)}
|
||||
// supports only 2.0-style subtract(1, 's') or subtract(duration)
|
||||
function Xc(a,b){return Vc(this,a,b,-1)}function Yc(a){return 0>a?Math.floor(a):Math.ceil(a)}function Zc(){var a,b,c,d,e,f=this._milliseconds,g=this._days,h=this._months,i=this._data;
|
||||
// if we have a mix of positive and negative values, bubble down first
|
||||
// check: https://github.com/moment/moment/issues/2166
|
||||
// The following code bubbles up values, see the tests for
|
||||
// examples of what that means.
|
||||
// convert days to months
|
||||
// 12 months -> 1 year
|
||||
return f>=0&&g>=0&&h>=0||0>=f&&0>=g&&0>=h||(f+=864e5*Yc(_c(h)+g),g=0,h=0),i.milliseconds=f%1e3,a=s(f/1e3),i.seconds=a%60,b=s(a/60),i.minutes=b%60,c=s(b/60),i.hours=c%24,g+=s(c/24),e=s($c(g)),h+=e,g-=Yc(_c(e)),d=s(h/12),h%=12,i.days=g,i.months=h,i.years=d,this}function $c(a){
|
||||
// 400 years have 146097 days (taking into account leap year rules)
|
||||
// 400 years have 12 months === 4800
|
||||
return 4800*a/146097}function _c(a){
|
||||
// the reverse of daysToMonths
|
||||
return 146097*a/4800}function ad(a){var b,c,d=this._milliseconds;if(a=J(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+$c(b),"month"===a?c:c/12;switch(b=this._days+Math.round(_c(this._months)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 1440*b+d/6e4;case"second":return 86400*b+d/1e3;
|
||||
// Math.floor prevents floating point math errors here
|
||||
case"millisecond":return Math.floor(864e5*b)+d;default:throw new Error("Unknown unit "+a)}}
|
||||
// TODO: Use this.as('ms')?
|
||||
function bd(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*t(this._months/12)}function cd(a){return function(){return this.as(a)}}function dd(a){return a=J(a),this[a+"s"]()}function ed(a){return function(){return this._data[a]}}function fd(){return s(this.days()/7)}
|
||||
// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
|
||||
function gd(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function hd(a,b,c){var d=Mb(a).abs(),e=jf(d.as("s")),f=jf(d.as("m")),g=jf(d.as("h")),h=jf(d.as("d")),i=jf(d.as("M")),j=jf(d.as("y")),k=e<kf.s&&["s",e]||1>=f&&["m"]||f<kf.m&&["mm",f]||1>=g&&["h"]||g<kf.h&&["hh",g]||1>=h&&["d"]||h<kf.d&&["dd",h]||1>=i&&["M"]||i<kf.M&&["MM",i]||1>=j&&["y"]||["yy",j];return k[2]=b,k[3]=+a>0,k[4]=c,gd.apply(null,k)}
|
||||
// This function allows you to set the rounding function for relative time strings
|
||||
function id(a){return void 0===a?jf:"function"==typeof a?(jf=a,!0):!1}
|
||||
// This function allows you to set a threshold for relative time strings
|
||||
function jd(a,b){return void 0===kf[a]?!1:void 0===b?kf[a]:(kf[a]=b,!0)}function kd(a){var b=this.localeData(),c=hd(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function ld(){
|
||||
// for ISO strings we do not use the normal bubbling rules:
|
||||
// * milliseconds bubble up until they become hours
|
||||
// * days do not bubble at all
|
||||
// * months bubble up until they become years
|
||||
// This is because there is no context-free conversion between hours and days
|
||||
// (think of clock changes)
|
||||
// and also not between days and months (28-31 days per month)
|
||||
var a,b,c,d=lf(this._milliseconds)/1e3,e=lf(this._days),f=lf(this._months);a=s(d/60),b=s(a/60),d%=60,a%=60,c=s(f/12),f%=12;
|
||||
// inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
|
||||
var g=c,h=f,i=e,j=b,k=a,l=d,m=this.asSeconds();return m?(0>m?"-":"")+"P"+(g?g+"Y":"")+(h?h+"M":"")+(i?i+"D":"")+(j||k||l?"T":"")+(j?j+"H":"")+(k?k+"M":"")+(l?l+"S":""):"P0D"}var md,nd;nd=Array.prototype.some?Array.prototype.some:function(a){for(var b=Object(this),c=b.length>>>0,d=0;c>d;d++)if(d in b&&a.call(this,b[d],d,b))return!0;return!1};
|
||||
// Plugins that add properties should also add the key here (null value),
|
||||
// so we can properly clone ourselves.
|
||||
var od=a.momentProperties=[],pd=!1,qd={};a.suppressDeprecationWarnings=!1,a.deprecationHandler=null;var rd;rd=Object.keys?Object.keys:function(a){var b,c=[];for(b in a)h(a,b)&&c.push(b);return c};var sd,td={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},ud={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},vd="Invalid date",wd="%d",xd=/\d{1,2}/,yd={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},zd={},Ad={},Bd=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Cd=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Dd={},Ed={},Fd=/\d/,Gd=/\d\d/,Hd=/\d{3}/,Id=/\d{4}/,Jd=/[+-]?\d{6}/,Kd=/\d\d?/,Ld=/\d\d\d\d?/,Md=/\d\d\d\d\d\d?/,Nd=/\d{1,3}/,Od=/\d{1,4}/,Pd=/[+-]?\d{1,6}/,Qd=/\d+/,Rd=/[+-]?\d+/,Sd=/Z|[+-]\d\d:?\d\d/gi,Td=/Z|[+-]\d\d(?::?\d\d)?/gi,Ud=/[+-]?\d+(\.\d{1,3})?/,Vd=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Wd={},Xd={},Yd=0,Zd=1,$d=2,_d=3,ae=4,be=5,ce=6,de=7,ee=8;sd=Array.prototype.indexOf?Array.prototype.indexOf:function(a){
|
||||
// I know
|
||||
var b;for(b=0;b<this.length;++b)if(this[b]===a)return b;return-1},T("M",["MM",2],"Mo",function(){return this.month()+1}),T("MMM",0,0,function(a){return this.localeData().monthsShort(this,a)}),T("MMMM",0,0,function(a){return this.localeData().months(this,a)}),I("month","M"),L("month",8),Y("M",Kd),Y("MM",Kd,Gd),Y("MMM",function(a,b){return b.monthsShortRegex(a)}),Y("MMMM",function(a,b){return b.monthsRegex(a)}),aa(["M","MM"],function(a,b){b[Zd]=t(a)-1}),aa(["MMM","MMMM"],function(a,b,c,d){var e=c._locale.monthsParse(a,d,c._strict);null!=e?b[Zd]=e:l(c).invalidMonth=a});
|
||||
// LOCALES
|
||||
var fe=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/,ge="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),he="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),ie=Vd,je=Vd;
|
||||
// FORMATTING
|
||||
T("Y",0,0,function(){var a=this.year();return 9999>=a?""+a:"+"+a}),T(0,["YY",2],0,function(){return this.year()%100}),T(0,["YYYY",4],0,"year"),T(0,["YYYYY",5],0,"year"),T(0,["YYYYYY",6,!0],0,"year"),
|
||||
// ALIASES
|
||||
I("year","y"),
|
||||
// PRIORITIES
|
||||
L("year",1),
|
||||
// PARSING
|
||||
Y("Y",Rd),Y("YY",Kd,Gd),Y("YYYY",Od,Id),Y("YYYYY",Pd,Jd),Y("YYYYYY",Pd,Jd),aa(["YYYYY","YYYYYY"],Yd),aa("YYYY",function(b,c){c[Yd]=2===b.length?a.parseTwoDigitYear(b):t(b)}),aa("YY",function(b,c){c[Yd]=a.parseTwoDigitYear(b)}),aa("Y",function(a,b){b[Yd]=parseInt(a,10)}),
|
||||
// HOOKS
|
||||
a.parseTwoDigitYear=function(a){return t(a)+(t(a)>68?1900:2e3)};
|
||||
// MOMENTS
|
||||
var ke=N("FullYear",!0);
|
||||
// FORMATTING
|
||||
T("w",["ww",2],"wo","week"),T("W",["WW",2],"Wo","isoWeek"),
|
||||
// ALIASES
|
||||
I("week","w"),I("isoWeek","W"),
|
||||
// PRIORITIES
|
||||
L("week",5),L("isoWeek",5),
|
||||
// PARSING
|
||||
Y("w",Kd),Y("ww",Kd,Gd),Y("W",Kd),Y("WW",Kd,Gd),ba(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=t(a)});var le={dow:0,// Sunday is the first day of the week.
|
||||
doy:6};
|
||||
// FORMATTING
|
||||
T("d",0,"do","day"),T("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),T("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),T("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),T("e",0,0,"weekday"),T("E",0,0,"isoWeekday"),
|
||||
// ALIASES
|
||||
I("day","d"),I("weekday","e"),I("isoWeekday","E"),
|
||||
// PRIORITY
|
||||
L("day",11),L("weekday",11),L("isoWeekday",11),
|
||||
// PARSING
|
||||
Y("d",Kd),Y("e",Kd),Y("E",Kd),Y("dd",function(a,b){return b.weekdaysMinRegex(a)}),Y("ddd",function(a,b){return b.weekdaysShortRegex(a)}),Y("dddd",function(a,b){return b.weekdaysRegex(a)}),ba(["dd","ddd","dddd"],function(a,b,c,d){var e=c._locale.weekdaysParse(a,d,c._strict);
|
||||
// if we didn't get a weekday name, mark the date as invalid
|
||||
null!=e?b.d=e:l(c).invalidWeekday=a}),ba(["d","e","E"],function(a,b,c,d){b[d]=t(a)});
|
||||
// LOCALES
|
||||
var me="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),ne="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),oe="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),pe=Vd,qe=Vd,re=Vd;T("H",["HH",2],0,"hour"),T("h",["hh",2],0,Qa),T("k",["kk",2],0,Ra),T("hmm",0,0,function(){return""+Qa.apply(this)+S(this.minutes(),2)}),T("hmmss",0,0,function(){return""+Qa.apply(this)+S(this.minutes(),2)+S(this.seconds(),2)}),T("Hmm",0,0,function(){return""+this.hours()+S(this.minutes(),2)}),T("Hmmss",0,0,function(){return""+this.hours()+S(this.minutes(),2)+S(this.seconds(),2)}),Sa("a",!0),Sa("A",!1),
|
||||
// ALIASES
|
||||
I("hour","h"),
|
||||
// PRIORITY
|
||||
L("hour",13),Y("a",Ta),Y("A",Ta),Y("H",Kd),Y("h",Kd),Y("HH",Kd,Gd),Y("hh",Kd,Gd),Y("hmm",Ld),Y("hmmss",Md),Y("Hmm",Ld),Y("Hmmss",Md),aa(["H","HH"],_d),aa(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),aa(["h","hh"],function(a,b,c){b[_d]=t(a),l(c).bigHour=!0}),aa("hmm",function(a,b,c){var d=a.length-2;b[_d]=t(a.substr(0,d)),b[ae]=t(a.substr(d)),l(c).bigHour=!0}),aa("hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[_d]=t(a.substr(0,d)),b[ae]=t(a.substr(d,2)),b[be]=t(a.substr(e)),l(c).bigHour=!0}),aa("Hmm",function(a,b,c){var d=a.length-2;b[_d]=t(a.substr(0,d)),b[ae]=t(a.substr(d))}),aa("Hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[_d]=t(a.substr(0,d)),b[ae]=t(a.substr(d,2)),b[be]=t(a.substr(e))});var se,te=/[ap]\.?m?\.?/i,ue=N("Hours",!0),ve={calendar:td,longDateFormat:ud,invalidDate:vd,ordinal:wd,ordinalParse:xd,relativeTime:yd,months:ge,monthsShort:he,week:le,weekdays:me,weekdaysMin:oe,weekdaysShort:ne,meridiemParse:te},we={},xe=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,ye=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,ze=/Z|[+-]\d\d(?::?\d\d)?/,Ae=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],
|
||||
// YYYYMM is NOT allowed by the standard
|
||||
["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Be=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Ce=/^\/?Date\((\-?\d+)/i;a.createFromInputFallback=w("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),
|
||||
// constant that refers to the ISO standard
|
||||
a.ISO_8601=function(){};var De=w("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=rb.apply(null,arguments);return this.isValid()&&a.isValid()?this>a?this:a:n()}),Ee=w("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=rb.apply(null,arguments);return this.isValid()&&a.isValid()?a>this?this:a:n()}),Fe=function(){return Date.now?Date.now():+new Date};xb("Z",":"),xb("ZZ",""),
|
||||
// PARSING
|
||||
Y("Z",Td),Y("ZZ",Td),aa(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=yb(Td,a)});
|
||||
// HELPERS
|
||||
// timezone chunker
|
||||
// '+10:00' > ['10', '00']
|
||||
// '-1530' > ['-15', '30']
|
||||
var Ge=/([\+\-]|\d\d)/gi;
|
||||
// HOOKS
|
||||
// This function will be called whenever a moment is mutated.
|
||||
// It is intended to keep the offset in sync with the timezone.
|
||||
a.updateOffset=function(){};
|
||||
// ASP.NET json date format regex
|
||||
var He=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/,Ie=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;Mb.fn=vb.prototype;var Je=Rb(1,"add"),Ke=Rb(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Le=w("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)});
|
||||
// FORMATTING
|
||||
T(0,["gg",2],0,function(){return this.weekYear()%100}),T(0,["GG",2],0,function(){return this.isoWeekYear()%100}),xc("gggg","weekYear"),xc("ggggg","weekYear"),xc("GGGG","isoWeekYear"),xc("GGGGG","isoWeekYear"),
|
||||
// ALIASES
|
||||
I("weekYear","gg"),I("isoWeekYear","GG"),
|
||||
// PRIORITY
|
||||
L("weekYear",1),L("isoWeekYear",1),
|
||||
// PARSING
|
||||
Y("G",Rd),Y("g",Rd),Y("GG",Kd,Gd),Y("gg",Kd,Gd),Y("GGGG",Od,Id),Y("gggg",Od,Id),Y("GGGGG",Pd,Jd),Y("ggggg",Pd,Jd),ba(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=t(a)}),ba(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),
|
||||
// FORMATTING
|
||||
T("Q",0,"Qo","quarter"),
|
||||
// ALIASES
|
||||
I("quarter","Q"),
|
||||
// PRIORITY
|
||||
L("quarter",7),
|
||||
// PARSING
|
||||
Y("Q",Fd),aa("Q",function(a,b){b[Zd]=3*(t(a)-1)}),
|
||||
// FORMATTING
|
||||
T("D",["DD",2],"Do","date"),
|
||||
// ALIASES
|
||||
I("date","D"),
|
||||
// PRIOROITY
|
||||
L("date",9),
|
||||
// PARSING
|
||||
Y("D",Kd),Y("DD",Kd,Gd),Y("Do",function(a,b){return a?b._ordinalParse:b._ordinalParseLenient}),aa(["D","DD"],$d),aa("Do",function(a,b){b[$d]=t(a.match(Kd)[0],10)});
|
||||
// MOMENTS
|
||||
var Me=N("Date",!0);
|
||||
// FORMATTING
|
||||
T("DDD",["DDDD",3],"DDDo","dayOfYear"),
|
||||
// ALIASES
|
||||
I("dayOfYear","DDD"),
|
||||
// PRIORITY
|
||||
L("dayOfYear",4),
|
||||
// PARSING
|
||||
Y("DDD",Nd),Y("DDDD",Hd),aa(["DDD","DDDD"],function(a,b,c){c._dayOfYear=t(a)}),
|
||||
// FORMATTING
|
||||
T("m",["mm",2],0,"minute"),
|
||||
// ALIASES
|
||||
I("minute","m"),
|
||||
// PRIORITY
|
||||
L("minute",14),
|
||||
// PARSING
|
||||
Y("m",Kd),Y("mm",Kd,Gd),aa(["m","mm"],ae);
|
||||
// MOMENTS
|
||||
var Ne=N("Minutes",!1);
|
||||
// FORMATTING
|
||||
T("s",["ss",2],0,"second"),
|
||||
// ALIASES
|
||||
I("second","s"),
|
||||
// PRIORITY
|
||||
L("second",15),
|
||||
// PARSING
|
||||
Y("s",Kd),Y("ss",Kd,Gd),aa(["s","ss"],be);
|
||||
// MOMENTS
|
||||
var Oe=N("Seconds",!1);
|
||||
// FORMATTING
|
||||
T("S",0,0,function(){return~~(this.millisecond()/100)}),T(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),T(0,["SSS",3],0,"millisecond"),T(0,["SSSS",4],0,function(){return 10*this.millisecond()}),T(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),T(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),T(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),T(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),T(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),
|
||||
// ALIASES
|
||||
I("millisecond","ms"),
|
||||
// PRIORITY
|
||||
L("millisecond",16),
|
||||
// PARSING
|
||||
Y("S",Nd,Fd),Y("SS",Nd,Gd),Y("SSS",Nd,Hd);var Pe;for(Pe="SSSS";Pe.length<=9;Pe+="S")Y(Pe,Qd);for(Pe="S";Pe.length<=9;Pe+="S")aa(Pe,Gc);
|
||||
// MOMENTS
|
||||
var Qe=N("Milliseconds",!1);
|
||||
// FORMATTING
|
||||
T("z",0,0,"zoneAbbr"),T("zz",0,0,"zoneName");var Re=q.prototype;Re.add=Je,Re.calendar=Ub,Re.clone=Vb,Re.diff=ac,Re.endOf=mc,Re.format=ec,Re.from=fc,Re.fromNow=gc,Re.to=hc,Re.toNow=ic,Re.get=Q,Re.invalidAt=vc,Re.isAfter=Wb,Re.isBefore=Xb,Re.isBetween=Yb,Re.isSame=Zb,Re.isSameOrAfter=$b,Re.isSameOrBefore=_b,Re.isValid=tc,Re.lang=Le,Re.locale=jc,Re.localeData=kc,Re.max=Ee,Re.min=De,Re.parsingFlags=uc,Re.set=R,Re.startOf=lc,Re.subtract=Ke,Re.toArray=qc,Re.toObject=rc,Re.toDate=pc,Re.toISOString=dc,Re.toJSON=sc,Re.toString=cc,Re.unix=oc,Re.valueOf=nc,Re.creationData=wc,
|
||||
// Year
|
||||
Re.year=ke,Re.isLeapYear=qa,
|
||||
// Week Year
|
||||
Re.weekYear=yc,Re.isoWeekYear=zc,
|
||||
// Quarter
|
||||
Re.quarter=Re.quarters=Ec,
|
||||
// Month
|
||||
Re.month=ja,Re.daysInMonth=ka,
|
||||
// Week
|
||||
Re.week=Re.weeks=Aa,Re.isoWeek=Re.isoWeeks=Ba,Re.weeksInYear=Bc,Re.isoWeeksInYear=Ac,
|
||||
// Day
|
||||
Re.date=Me,Re.day=Re.days=Ja,Re.weekday=Ka,Re.isoWeekday=La,Re.dayOfYear=Fc,
|
||||
// Hour
|
||||
Re.hour=Re.hours=ue,
|
||||
// Minute
|
||||
Re.minute=Re.minutes=Ne,
|
||||
// Second
|
||||
Re.second=Re.seconds=Oe,
|
||||
// Millisecond
|
||||
Re.millisecond=Re.milliseconds=Qe,
|
||||
// Offset
|
||||
Re.utcOffset=Bb,Re.utc=Db,Re.local=Eb,Re.parseZone=Fb,Re.hasAlignedHourOffset=Gb,Re.isDST=Hb,Re.isLocal=Jb,Re.isUtcOffset=Kb,Re.isUtc=Lb,Re.isUTC=Lb,
|
||||
// Timezone
|
||||
Re.zoneAbbr=Hc,Re.zoneName=Ic,
|
||||
// Deprecations
|
||||
Re.dates=w("dates accessor is deprecated. Use date instead.",Me),Re.months=w("months accessor is deprecated. Use month instead",ja),Re.years=w("years accessor is deprecated. Use year instead",ke),Re.zone=w("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",Cb),Re.isDSTShifted=w("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ib);var Se=Re,Te=B.prototype;Te.calendar=C,Te.longDateFormat=D,Te.invalidDate=E,Te.ordinal=F,Te.preparse=Lc,Te.postformat=Lc,Te.relativeTime=G,Te.pastFuture=H,Te.set=z,
|
||||
// Month
|
||||
Te.months=ea,Te.monthsShort=fa,Te.monthsParse=ha,Te.monthsRegex=ma,Te.monthsShortRegex=la,
|
||||
// Week
|
||||
Te.week=xa,Te.firstDayOfYear=za,Te.firstDayOfWeek=ya,
|
||||
// Day of Week
|
||||
Te.weekdays=Ea,Te.weekdaysMin=Ga,Te.weekdaysShort=Fa,Te.weekdaysParse=Ia,Te.weekdaysRegex=Ma,Te.weekdaysShortRegex=Na,Te.weekdaysMinRegex=Oa,
|
||||
// Hours
|
||||
Te.isPM=Ua,Te.meridiem=Va,Za("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===t(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),
|
||||
// Side effect imports
|
||||
a.lang=w("moment.lang is deprecated. Use moment.locale instead.",Za),a.langData=w("moment.langData is deprecated. Use moment.localeData instead.",ab);var Ue=Math.abs,Ve=cd("ms"),We=cd("s"),Xe=cd("m"),Ye=cd("h"),Ze=cd("d"),$e=cd("w"),_e=cd("M"),af=cd("y"),bf=ed("milliseconds"),cf=ed("seconds"),df=ed("minutes"),ef=ed("hours"),ff=ed("days"),gf=ed("months"),hf=ed("years"),jf=Math.round,kf={s:45,// seconds to minute
|
||||
m:45,// minutes to hour
|
||||
h:22,// hours to day
|
||||
d:26,// days to month
|
||||
M:11},lf=Math.abs,mf=vb.prototype;mf.abs=Uc,mf.add=Wc,mf.subtract=Xc,mf.as=ad,mf.asMilliseconds=Ve,mf.asSeconds=We,mf.asMinutes=Xe,mf.asHours=Ye,mf.asDays=Ze,mf.asWeeks=$e,mf.asMonths=_e,mf.asYears=af,mf.valueOf=bd,mf._bubble=Zc,mf.get=dd,mf.milliseconds=bf,mf.seconds=cf,mf.minutes=df,mf.hours=ef,mf.days=ff,mf.weeks=fd,mf.months=gf,mf.years=hf,mf.humanize=kd,mf.toISOString=ld,mf.toString=ld,mf.toJSON=ld,mf.locale=jc,mf.localeData=kc,
|
||||
// Deprecations
|
||||
mf.toIsoString=w("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ld),mf.lang=Le,
|
||||
// Side effect imports
|
||||
// FORMATTING
|
||||
T("X",0,0,"unix"),T("x",0,0,"valueOf"),
|
||||
// PARSING
|
||||
Y("x",Rd),Y("X",Ud),aa("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),aa("x",function(a,b,c){c._d=new Date(t(a))}),
|
||||
// Side effect imports
|
||||
a.version="2.14.1",b(rb),a.fn=Se,a.min=tb,a.max=ub,a.now=Fe,a.utc=j,a.unix=Jc,a.months=Pc,a.isDate=f,a.locale=Za,a.invalid=n,a.duration=Mb,a.isMoment=r,a.weekdays=Rc,a.parseZone=Kc,a.localeData=ab,a.isDuration=wb,a.monthsShort=Qc,a.weekdaysMin=Tc,a.defineLocale=$a,a.updateLocale=_a,a.locales=bb,a.weekdaysShort=Sc,a.normalizeUnits=J,a.relativeTimeRounding=id,a.relativeTimeThreshold=jd,a.calendarFormat=Tb,a.prototype=Se;var nf=a;return nf});
|
||||
3
staticfiles/assets/js/plugins/nouislider.min.js
vendored
Normal file
2
staticfiles/assets/js/plugins/perfect-scrollbar.jquery.min.js
vendored
Normal file
3514
staticfiles/assets/js/plugins/sweetalert2.js
Normal file
54
staticfiles/assets/scss/material-dashboard.scss
Normal file
@@ -0,0 +1,54 @@
|
||||
/*!
|
||||
|
||||
=========================================================
|
||||
* Material Dashboard - v2.1.0
|
||||
=========================================================
|
||||
|
||||
* Product Page: https://www.creative-tim.com/product/material-dashboard
|
||||
* Copyright 2020 Creative Tim (http://www.creative-tim.com)
|
||||
|
||||
=========================================================
|
||||
|
||||
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
*/
|
||||
|
||||
@import "material-dashboard/variables";
|
||||
@import "material-dashboard/mixins";
|
||||
@import "material-dashboard/core-bootstrap";
|
||||
|
||||
// Core Components
|
||||
@import "material-dashboard/buttons";
|
||||
@import "material-dashboard/checkboxes";
|
||||
@import "material-dashboard/radios";
|
||||
@import "material-dashboard/forms";
|
||||
@import "material-dashboard/input-group";
|
||||
@import "material-dashboard/images";
|
||||
@import "material-dashboard/navbar";
|
||||
@import "material-dashboard/alerts";
|
||||
@import "material-dashboard/headers";
|
||||
@import "material-dashboard/type";
|
||||
@import "material-dashboard/tabs";
|
||||
@import "material-dashboard/tooltip";
|
||||
@import "material-dashboard/popover";
|
||||
@import "material-dashboard/dropdown";
|
||||
@import "material-dashboard/togglebutton";
|
||||
@import "material-dashboard/ripples";
|
||||
@import "material-dashboard/footers";
|
||||
@import "material-dashboard/sidebar-and-main-panel";
|
||||
@import "material-dashboard/fixed-plugin";
|
||||
@import "material-dashboard/tables";
|
||||
@import "material-dashboard/misc";
|
||||
@import "material-dashboard/social-buttons";
|
||||
|
||||
@import "material-dashboard/cards";
|
||||
@import "material-dashboard/cards/card-stats";
|
||||
@import "material-dashboard/cards/card-profile";
|
||||
@import "material-dashboard/cards/card-plain";
|
||||
|
||||
//plugin scss
|
||||
@import "material-dashboard/plugins/animate";
|
||||
@import "material-dashboard/plugins/chartist";
|
||||
@import "material-dashboard/plugins/perfect-scrollbar";
|
||||
|
||||
@import "material-dashboard/responsive";
|
||||
101
staticfiles/assets/scss/material-dashboard/_alerts.scss
Normal file
@@ -0,0 +1,101 @@
|
||||
.alert {
|
||||
border: 0;
|
||||
border-radius: 3px;
|
||||
position: relative;
|
||||
padding: 20px 15px;
|
||||
line-height: 20px;
|
||||
|
||||
b{
|
||||
font-weight: $font-weight-bold;
|
||||
text-transform: uppercase;
|
||||
font-size: $font-size-small;
|
||||
}
|
||||
// SASS conversion note: please mirror any content change in _mixins-shared.scss alert-variations-content
|
||||
@include alert-variations(unquote(".alert"), unquote(""), $mdb-text-color-light);
|
||||
|
||||
&-info, &-danger, &-warning, &-success, &-rose {
|
||||
color: $mdb-text-color-light;
|
||||
}
|
||||
|
||||
&-default {
|
||||
a, .alert-link {
|
||||
color: $mdb-text-color-primary;
|
||||
}
|
||||
}
|
||||
|
||||
span{
|
||||
display: block;
|
||||
max-width: 89%;
|
||||
}
|
||||
|
||||
&.alert-danger{
|
||||
@include shadow-alert-color($brand-danger);
|
||||
@include alert-icon-color($brand-danger);
|
||||
}
|
||||
&.alert-warning{
|
||||
@include shadow-alert-color($brand-warning);
|
||||
@include alert-icon-color($brand-warning);
|
||||
}
|
||||
&.alert-success{
|
||||
@include shadow-alert-color($brand-success);
|
||||
@include alert-icon-color($brand-success);
|
||||
}
|
||||
&.alert-info{
|
||||
@include shadow-alert-color($brand-info);
|
||||
@include alert-icon-color($brand-info);
|
||||
}
|
||||
&.alert-primary{
|
||||
@include shadow-alert-color($brand-primary);
|
||||
@include alert-icon-color($brand-primary);
|
||||
}
|
||||
&.alert-rose{
|
||||
@include shadow-alert-color($brand-rose);
|
||||
@include alert-icon-color($brand-rose);
|
||||
}
|
||||
|
||||
&.alert-with-icon{
|
||||
padding-left: 66px;
|
||||
|
||||
i[data-notify="icon"] {
|
||||
font-size: 30px;
|
||||
display: block;
|
||||
left: 15px;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
margin-top: -15px;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
.close{
|
||||
line-height: .5;
|
||||
i{
|
||||
color: $white-color;
|
||||
font-size: 11px;
|
||||
}
|
||||
}
|
||||
|
||||
i[data-notify="icon"]{
|
||||
display: none;
|
||||
}
|
||||
|
||||
.alert-icon{
|
||||
display: block;
|
||||
float: left;
|
||||
margin-right: $margin-base;
|
||||
|
||||
i{
|
||||
margin-top: -7px;
|
||||
top: 5px;
|
||||
position: relative;
|
||||
}
|
||||
}
|
||||
|
||||
[data-notify="dismiss"]{
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.places-buttons .btn {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
219
staticfiles/assets/scss/material-dashboard/_buttons.scss
Normal file
@@ -0,0 +1,219 @@
|
||||
.btn{
|
||||
position: relative;
|
||||
padding: 12px 30px;
|
||||
margin: $bmd-btn-margin-bottom 1px;
|
||||
font-size: .75rem; // 12px
|
||||
font-weight: 400;
|
||||
line-height: $bmd-line-height;
|
||||
text-decoration: none;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0;
|
||||
cursor: pointer;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
border-radius: $border-radius-sm;
|
||||
outline: 0;
|
||||
transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
will-change: box-shadow, transform;
|
||||
@include undo-bs-tab-focus();
|
||||
|
||||
//--
|
||||
// Colors
|
||||
@include bmd-raised-button-color();
|
||||
&.btn-white {
|
||||
&,
|
||||
&:focus,
|
||||
&:hover {
|
||||
background-color: $white-color;
|
||||
color: $gray-color;
|
||||
}
|
||||
&.btn-link {
|
||||
color: $white-color;
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
&.btn-link:hover,
|
||||
&.btn-link:focus,
|
||||
&.btn-link:active {
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
@include hover-focus();
|
||||
|
||||
//---
|
||||
// btn-raised
|
||||
&.btn-raised,
|
||||
.btn-group-raised & {
|
||||
// baseline shadow
|
||||
// @include box-shadow($bmd-shadow-2dp);
|
||||
|
||||
// reverse any of the above for links
|
||||
&.btn-link {
|
||||
box-shadow: none;
|
||||
@include bmd-hover-focus-active() {
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
@include bmd-disabled() {
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
//---
|
||||
// btn-outline
|
||||
@include bmd-outline-button-color();
|
||||
|
||||
// Size variations
|
||||
&.btn-lg,
|
||||
.btn-group-lg & {
|
||||
@include button-size($input-btn-padding-y-lg, $input-btn-padding-x-lg, $bmd-btn-font-size, $btn-lg-line-height, $border-radius-sm);
|
||||
}
|
||||
&.btn-sm,
|
||||
.btn-group-sm & {
|
||||
@include button-size($input-btn-padding-y-sm, $input-btn-padding-x-sm, $bmd-btn-font-size-sm, $line-height-sm, $border-radius-sm);
|
||||
}
|
||||
|
||||
&.btn-round {
|
||||
border-radius: $border-radius-extreme;
|
||||
}
|
||||
|
||||
&.btn-fab,
|
||||
&.btn-just-icon {
|
||||
// see above for color variations
|
||||
font-size: $mdb-btn-fab-font-size;
|
||||
height: $mdb-btn-fab-size;
|
||||
min-width: $mdb-btn-fab-size;
|
||||
width: $mdb-btn-fab-size;
|
||||
// margin: auto;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
line-height: $mdb-btn-fab-size;
|
||||
|
||||
&.btn-round{
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.btn-group-sm &,
|
||||
&.btn-sm,
|
||||
&.btn-fab-mini{
|
||||
height: $mdb-btn-fab-size-mini + 1;
|
||||
min-width: $mdb-btn-fab-size-mini + 1;
|
||||
width: $mdb-btn-fab-size-mini + 1;
|
||||
|
||||
.material-icons,
|
||||
.fa{
|
||||
font-size: $mdb-btn-icon-size-mini;
|
||||
line-height: $mdb-btn-fab-size-mini;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-group-lg &,
|
||||
&.btn-lg{
|
||||
height: $mdb-btn-fab-size-lg + 1;
|
||||
min-width: $mdb-btn-fab-size-lg + 1;
|
||||
width: $mdb-btn-fab-size-lg + 1;
|
||||
line-height: $mdb-btn-fab-size-lg;
|
||||
|
||||
.material-icons,
|
||||
.fa{
|
||||
font-size: $mdb-btn-icon-size;
|
||||
line-height: $mdb-btn-fab-size-lg;
|
||||
}
|
||||
}
|
||||
|
||||
.material-icons,
|
||||
.fa {
|
||||
margin-top: 0;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
transform: none;
|
||||
left: 0;
|
||||
top: 0;
|
||||
height: 100%;
|
||||
|
||||
line-height: $mdb-btn-fab-size;
|
||||
font-size: $mdb-btn-just-icon-font-size;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.btn-just-icon{
|
||||
&.btn-lg{
|
||||
font-size: $mdb-btn-fab-font-size;
|
||||
height: $mdb-btn-fab-size;
|
||||
min-width: $mdb-btn-fab-size;
|
||||
width: $mdb-btn-fab-size;
|
||||
}
|
||||
}
|
||||
|
||||
.input-group-btn > .btn{
|
||||
border: 0;
|
||||
}
|
||||
|
||||
|
||||
// Align icons inside buttons with text
|
||||
.btn .material-icons,
|
||||
.btn:not(.btn-just-icon):not(.btn-fab) .fa{
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
top: 0;
|
||||
margin-top: -1em;
|
||||
margin-bottom: -1em;
|
||||
font-size: 1.1rem;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
// Disabled buttons and button groups
|
||||
.btn,
|
||||
.input-group-btn .btn,
|
||||
.btn-group,
|
||||
.btn-group-vertical {
|
||||
// have to ratchet up the specificity to kill drop shadows on disabled raised buttons
|
||||
@include bmd-disabled() {
|
||||
.bg-inverse & {
|
||||
color: $bmd-inverse-btn-disabled;
|
||||
}
|
||||
|
||||
// flat buttons shouldn't lose transparency on disabled hover/focus
|
||||
}
|
||||
}
|
||||
|
||||
// btn-group variations
|
||||
.btn-group,
|
||||
.btn-group-vertical {
|
||||
position: relative;
|
||||
margin: 10px 1px;
|
||||
|
||||
// spec: https://www.google.com/design/spec/components/buttons.html#buttons-toggle-buttons
|
||||
//&.open {
|
||||
// .dropdown-toggle {
|
||||
// }
|
||||
//
|
||||
// > .dropdown-toggle.btn {
|
||||
// @include bmd-raised-button-color-bg();
|
||||
// }
|
||||
//}
|
||||
|
||||
.dropdown-menu {
|
||||
border-radius: 0 0 $border-radius $border-radius;
|
||||
}
|
||||
|
||||
&.btn-group-raised {
|
||||
@include box-shadow($bmd-shadow-2dp);
|
||||
}
|
||||
|
||||
.btn + .btn,
|
||||
.btn,
|
||||
.btn:active,
|
||||
.btn-group {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
// remove margin from nested btn-group(s) to properly align them with the outer buttons
|
||||
> .btn-group {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
661
staticfiles/assets/scss/material-dashboard/_cards.scss
Normal file
@@ -0,0 +1,661 @@
|
||||
//https://www.google.com/design/spec/components/cards.html#cards-content-blocks
|
||||
// Card resting elevation: 2dp
|
||||
.card {
|
||||
border: 0;
|
||||
margin-bottom: 30px;
|
||||
margin-top: 30px;
|
||||
border-radius: $border-radius-large;
|
||||
color: $gray-dark;
|
||||
background: $white-color;
|
||||
width: 100%;
|
||||
|
||||
.card-category:not([class*="text-"]) {
|
||||
color: $gray-color;
|
||||
}
|
||||
.card-category{
|
||||
margin-top: 10px;
|
||||
|
||||
.material-icons{
|
||||
position: relative;
|
||||
top: 8px;
|
||||
line-height: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.form-check {
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.card-title{
|
||||
margin-top: 0.625rem;
|
||||
|
||||
&:last-child{
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Cards have a default elevation of 2dp.
|
||||
@include box-shadow($bmd-shadow-2dp);
|
||||
@extend %std-font;
|
||||
|
||||
|
||||
&.no-shadow {
|
||||
.card-header-image,
|
||||
.card-header-image img {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
.card-body,
|
||||
.card-footer {
|
||||
padding: $padding-card-body-y $padding-card-body-x;
|
||||
}
|
||||
|
||||
.card-body {
|
||||
& + .card-footer{
|
||||
padding-top: 0rem;
|
||||
border: 0;
|
||||
border-radius: $border-radius-large;
|
||||
}
|
||||
}
|
||||
|
||||
.card-footer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
|
||||
.author,
|
||||
.stats {
|
||||
display: inline-flex;
|
||||
}
|
||||
|
||||
.stats {
|
||||
color: $gray-color;
|
||||
|
||||
.material-icons {
|
||||
position: relative;
|
||||
top: -10px;
|
||||
margin-right: 3px;
|
||||
margin-left: 3px;
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.bmd-card-raised {
|
||||
// Card raised elevation: 8dp
|
||||
@include box-shadow($bmd-shadow-8dp);
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(lg) {
|
||||
// On desktop, cards can have a resting elevation of 0dp and gain an elevation of 8dp on hover.
|
||||
&.bmd-card-flat {
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
.card-header {
|
||||
border-bottom: none;
|
||||
background: transparent;
|
||||
.title{
|
||||
color: $white-color;
|
||||
}
|
||||
|
||||
&:not([class*="card-header-"]){
|
||||
// @include shadow-big();
|
||||
}
|
||||
|
||||
.nav-tabs {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
&.card-header-image {
|
||||
position: relative;
|
||||
padding: 0;
|
||||
z-index: 1;
|
||||
margin-left: 15px;
|
||||
margin-right: 15px;
|
||||
margin-top: -30px;
|
||||
border-radius: $border-radius-large;
|
||||
|
||||
img {
|
||||
width: 100%;
|
||||
border-radius: $border-radius-large;
|
||||
pointer-events: none;
|
||||
@include shadow-big-image();
|
||||
}
|
||||
.card-title {
|
||||
position: absolute;
|
||||
bottom: 15px;
|
||||
left: 15px;
|
||||
color: $white-color;
|
||||
font-size: $font-size-h4;
|
||||
text-shadow: 0 2px 5px rgba(33, 33, 33, 0.5);
|
||||
}
|
||||
|
||||
.colored-shadow{
|
||||
transform: scale(0.94);
|
||||
top: 12px;
|
||||
filter: blur(12px);
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-size: cover;
|
||||
z-index: -1;
|
||||
transition: opacity .45s;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
&.no-shadow{
|
||||
box-shadow: none;
|
||||
|
||||
&.shadow-normal{
|
||||
@include shadow-big();
|
||||
}
|
||||
|
||||
.colored-shadow{
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.card-header-primary .card-icon,
|
||||
.card-header-primary .card-text,
|
||||
.card-header-primary:not(.card-header-icon):not(.card-header-text),
|
||||
&.bg-primary,
|
||||
&.card-rotate.bg-primary .front,
|
||||
&.card-rotate.bg-primary .back{
|
||||
background: linear-gradient(60deg, $purple-400, $purple-600);
|
||||
}
|
||||
.card-header-info .card-icon,
|
||||
.card-header-info .card-text,
|
||||
.card-header-info:not(.card-header-icon):not(.card-header-text),
|
||||
&.bg-info,
|
||||
&.card-rotate.bg-info .front,
|
||||
&.card-rotate.bg-info .back{
|
||||
background: linear-gradient(60deg, $cyan-400, $cyan-600);
|
||||
}
|
||||
.card-header-success .card-icon,
|
||||
.card-header-success .card-text,
|
||||
.card-header-success:not(.card-header-icon):not(.card-header-text),
|
||||
&.bg-success,
|
||||
&.card-rotate.bg-success .front,
|
||||
&.card-rotate.bg-success .back{
|
||||
background: linear-gradient(60deg, $green-400, $green-600);
|
||||
}
|
||||
.card-header-warning .card-icon,
|
||||
.card-header-warning .card-text,
|
||||
.card-header-warning:not(.card-header-icon):not(.card-header-text),
|
||||
&.bg-warning,
|
||||
&.card-rotate.bg-warning .front,
|
||||
&.card-rotate.bg-warning .back{
|
||||
background: linear-gradient(60deg, $orange-400, $orange-600);
|
||||
}
|
||||
.card-header-danger .card-icon,
|
||||
.card-header-danger .card-text,
|
||||
.card-header-danger:not(.card-header-icon):not(.card-header-text),
|
||||
&.bg-danger,
|
||||
&.card-rotate.bg-danger .front,
|
||||
&.card-rotate.bg-danger .back{
|
||||
background: linear-gradient(60deg, $red-400, $red-600);
|
||||
}
|
||||
|
||||
.card-header-rose .card-icon,
|
||||
.card-header-rose .card-text,
|
||||
.card-header-rose:not(.card-header-icon):not(.card-header-text),
|
||||
&.bg-rose,
|
||||
&.card-rotate.bg-rose .front,
|
||||
&.card-rotate.bg-rose .back{
|
||||
background: linear-gradient(60deg, $pink-400, $pink-600);
|
||||
}
|
||||
|
||||
.card-header-primary .card-icon,
|
||||
.card-header-primary:not(.card-header-icon):not(.card-header-text),
|
||||
.card-header-primary .card-text{
|
||||
@include shadow-big-color($brand-primary);
|
||||
|
||||
//@include shadow-8dp-color($brand-primary);
|
||||
//@include shadow-16dp-color($brand-primary);
|
||||
}
|
||||
.card-header-danger .card-icon,
|
||||
.card-header-danger:not(.card-header-icon):not(.card-header-text),
|
||||
.card-header-danger .card-text{
|
||||
@include shadow-big-color($brand-danger);
|
||||
}
|
||||
|
||||
.card-header-rose .card-icon,
|
||||
.card-header-rose:not(.card-header-icon):not(.card-header-text),
|
||||
.card-header-rose .card-text{
|
||||
@include shadow-big-color($brand-rose);
|
||||
}
|
||||
|
||||
.card-header-warning .card-icon,
|
||||
.card-header-warning:not(.card-header-icon):not(.card-header-text),
|
||||
.card-header-warning .card-text{
|
||||
@include shadow-big-color($brand-warning);
|
||||
}
|
||||
|
||||
.card-header-info .card-icon,
|
||||
.card-header-info:not(.card-header-icon):not(.card-header-text),
|
||||
.card-header-info .card-text{
|
||||
@include shadow-big-color($brand-info);
|
||||
}
|
||||
|
||||
.card-header-success .card-icon,
|
||||
.card-header-success:not(.card-header-icon):not(.card-header-text),
|
||||
.card-header-success .card-text{
|
||||
@include shadow-big-color($brand-success);
|
||||
}
|
||||
|
||||
[class*="card-header-"],
|
||||
&[class*="bg-"]{
|
||||
color: $white-color;
|
||||
|
||||
.card-title a,
|
||||
.card-title,
|
||||
.icon i{
|
||||
color: $white-color;
|
||||
}
|
||||
|
||||
.icon i{
|
||||
border-color: rgba(255, 255, 255, 0.25);
|
||||
}
|
||||
.author a,
|
||||
.stats,
|
||||
.card-category,
|
||||
.card-description{
|
||||
color: $white-transparent;
|
||||
}
|
||||
|
||||
.author a{
|
||||
&:hover,
|
||||
&:focus,
|
||||
&:active{
|
||||
color: $white-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.author{
|
||||
.avatar{
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
overflow: hidden;
|
||||
border-radius: 50%;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
a{
|
||||
color: $black-color;
|
||||
text-decoration: none;
|
||||
|
||||
.ripple-container{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.card-category-social{
|
||||
.fa{
|
||||
font-size: 24px;
|
||||
position: relative;
|
||||
margin-top: -4px;
|
||||
top: 2px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.material-icons{
|
||||
position: relative;
|
||||
top: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
&[class*="bg-"],
|
||||
&[class*="bg-"] .card-body{
|
||||
border-radius: $border-radius-large;
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3{
|
||||
small{
|
||||
color: $white-transparent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.card-stats{
|
||||
background: transparent;
|
||||
display: flex;
|
||||
|
||||
.author,
|
||||
.stats{
|
||||
display: inline-flex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.card {
|
||||
box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);
|
||||
|
||||
.table tr:first-child td{
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
.card-title{
|
||||
margin-top: 0;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.card-body{
|
||||
padding: $padding-card-body-y 20px;
|
||||
position: relative;
|
||||
|
||||
.form-group {
|
||||
margin: 8px 0 0;
|
||||
}
|
||||
}
|
||||
|
||||
.card-header {
|
||||
z-index: 3 !important;
|
||||
|
||||
.card-title{
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.card-category{
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
&.card-header-text {
|
||||
display: inline-block;
|
||||
|
||||
&:after {
|
||||
content: "";
|
||||
display: table;
|
||||
}
|
||||
}
|
||||
|
||||
&.card-header-icon,
|
||||
&.card-header-text {
|
||||
i {
|
||||
width: 33px;
|
||||
height: 33px;
|
||||
text-align: center;
|
||||
line-height: 33px;
|
||||
}
|
||||
.card-title{
|
||||
margin-top: 15px;
|
||||
color: $black-color;
|
||||
}
|
||||
h4{
|
||||
font-weight: 300;
|
||||
}
|
||||
}
|
||||
|
||||
&.card-header-tabs {
|
||||
.nav-tabs {
|
||||
background: transparent;
|
||||
padding: 0;
|
||||
}
|
||||
.nav-tabs-title {
|
||||
float: left;
|
||||
padding: 10px 10px 10px 0;
|
||||
line-height: 24px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.card-plain {
|
||||
.card-header {
|
||||
&.card-header-icon + .card-body .card-title,
|
||||
&.card-header-icon + .card-body .card-category {
|
||||
margin-top: -20px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.card-actions {
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
top: -50px;
|
||||
width: calc(100% - 30px);
|
||||
left: 17px;
|
||||
right: 17px;
|
||||
text-align: center;
|
||||
|
||||
.card-header{
|
||||
padding: 0;
|
||||
min-height: 160px;
|
||||
}
|
||||
|
||||
.btn {
|
||||
padding-left: 12px;
|
||||
padding-right: 12px;
|
||||
}
|
||||
.fix-broken-card {
|
||||
position: absolute;
|
||||
top: -65px;
|
||||
}
|
||||
}
|
||||
|
||||
&.card-chart {
|
||||
.card-footer i:nth-child(1n+2){
|
||||
width: 18px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.card-category{
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.card-body + .card-footer,
|
||||
.card-footer{
|
||||
padding: 0;
|
||||
padding-top: 10px;
|
||||
margin: 0 15px 10px;
|
||||
border-radius: 0;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
h6 {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.stats{
|
||||
color: #999999;
|
||||
font-size: 12px;
|
||||
line-height: 22px;
|
||||
|
||||
.card-category{
|
||||
padding-top: 7px;
|
||||
padding-bottom: 7px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.material-icons{
|
||||
position: relative;
|
||||
top: 4px;
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
[class*="card-header-"] {
|
||||
margin: 0px 15px 0;
|
||||
padding: 0;
|
||||
|
||||
.card-title + .card-category{
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
a {
|
||||
color: $white-color;
|
||||
}
|
||||
}
|
||||
|
||||
&:not(.card-header-icon):not(.card-header-text):not(.card-header-image){
|
||||
border-radius: $border-radius-base;
|
||||
margin-top: -20px;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.card-icon,
|
||||
.card-text{
|
||||
border-radius: $border-radius-base;
|
||||
background-color: $gray-color;
|
||||
padding: 15px;
|
||||
margin-top: -20px;
|
||||
margin-right: 15px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.card-text{
|
||||
float: none;
|
||||
display: inline-block;
|
||||
margin-right: 0;
|
||||
|
||||
.card-title{
|
||||
color: $white-color;
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
position: relative;
|
||||
|
||||
.ct-chart{
|
||||
.card-title{
|
||||
color: $white-color;
|
||||
}
|
||||
.card-category{
|
||||
margin-bottom: 0;
|
||||
color: rgba($white-color, .62);
|
||||
}
|
||||
|
||||
.ct-label{
|
||||
color: rgba($white-color, .7);
|
||||
}
|
||||
.ct-grid{
|
||||
stroke: rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
.ct-series-a .ct-point,
|
||||
.ct-series-a .ct-line,
|
||||
.ct-series-a .ct-bar,
|
||||
.ct-series-a .ct-slice-donut{
|
||||
stroke: rgba(255,255,255,.8);
|
||||
}
|
||||
.ct-series-a .ct-slice-pie,
|
||||
.ct-series-a .ct-area{
|
||||
fill: rgba(255,255,255,.4);
|
||||
}
|
||||
.ct-series-a .ct-bar{
|
||||
stroke-width: 10px;
|
||||
}
|
||||
.ct-point{
|
||||
stroke-width: 10px;
|
||||
stroke-linecap: round;
|
||||
}
|
||||
.ct-line{
|
||||
fill: none;
|
||||
stroke-width: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[data-header-animation="true"] {
|
||||
@include transform-translate-y(0);
|
||||
-webkit-transition: all 300ms cubic-bezier(0.34, 1.61, 0.7, 1);
|
||||
-moz-transition: all 300ms cubic-bezier(0.34, 1.61, 0.7, 1);
|
||||
-o-transition: all 300ms cubic-bezier(0.34, 1.61, 0.7, 1);
|
||||
-ms-transition: all 300ms cubic-bezier(0.34, 1.61, 0.7, 1);
|
||||
transition: all 300ms cubic-bezier(0.34, 1.61, 0.7, 1);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
[data-header-animation="true"]{
|
||||
@include transform-translate-y(-50px);
|
||||
}
|
||||
}
|
||||
|
||||
.map {
|
||||
height: 280px;
|
||||
border-radius: $border-radius-large;
|
||||
margin-top: 15px;
|
||||
|
||||
&.map-big{
|
||||
height: 420px;
|
||||
}
|
||||
}
|
||||
|
||||
.card-body.table-full-width{
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.card-plain .card-header-icon {
|
||||
margin-right: 15px !important;
|
||||
}
|
||||
}
|
||||
|
||||
.table-sales{
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
.iframe-container {
|
||||
width: 100%;
|
||||
|
||||
iframe {
|
||||
width: 100%;
|
||||
height: 500px;
|
||||
border: 0;
|
||||
@include shadow-big();
|
||||
}
|
||||
}
|
||||
|
||||
.card-wizard {
|
||||
.nav.nav-pills {
|
||||
.nav-item {
|
||||
margin: 0;
|
||||
|
||||
.nav-link {
|
||||
padding: 6px 15px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
.nav-pills:not(.flex-column) .nav-item + .nav-item:not(:first-child) {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.nav-item .nav-link.active,
|
||||
.nav-item .nav-link:hover,
|
||||
.nav-item .nav-link:focus {
|
||||
background-color: inherit !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
.input-group-text {
|
||||
padding: 6px 15px 0px !important;
|
||||
}
|
||||
.card-footer {
|
||||
border-top: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
.card-chart,
|
||||
.card-product {
|
||||
.card-body + .card-footer {
|
||||
border-top: 1px solid #eee;
|
||||
}
|
||||
}
|
||||
|
||||
.card-product{
|
||||
.price{
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
.card-collapse {
|
||||
margin-bottom: 15px;
|
||||
|
||||
.card .card-header a[aria-expanded="true"]{
|
||||
color: #e91e63;
|
||||
}
|
||||
}
|
||||
210
staticfiles/assets/scss/material-dashboard/_checkboxes.scss
Normal file
@@ -0,0 +1,210 @@
|
||||
.form-check {
|
||||
margin-bottom: .5rem;
|
||||
padding-left: 0;
|
||||
|
||||
.form-check-label {
|
||||
cursor: pointer;
|
||||
padding-left: 0; // Reset for Bootstrap rule
|
||||
// color: $mdb-checkbox-label-color;
|
||||
@include mdb-label-color-toggle-focus();
|
||||
}
|
||||
|
||||
// Hide native checkbox
|
||||
.form-check-input {
|
||||
opacity: 0;
|
||||
position: absolute;
|
||||
margin: 0;
|
||||
z-index: -1;
|
||||
width: 0;
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
left: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.form-check-sign {
|
||||
vertical-align: middle;
|
||||
position: relative;
|
||||
top: -2px;
|
||||
float: left;
|
||||
padding-right: 10px;
|
||||
display: inline-block;
|
||||
|
||||
&:before {
|
||||
display: block;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
content: "";
|
||||
background-color: rgba(0,0,0,.84);
|
||||
height: $mdb-checkbox-size;
|
||||
width: $mdb-checkbox-size;
|
||||
border-radius: 100%;
|
||||
z-index: 1;
|
||||
opacity: 0;
|
||||
margin: 0;
|
||||
top: 0;
|
||||
@include transform-scale3d(unquote('2.3,2.3,1'));
|
||||
}
|
||||
|
||||
.check {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: $mdb-checkbox-size;
|
||||
height: $mdb-checkbox-size;
|
||||
border: 1px solid $mdb-checkbox-border-color;
|
||||
overflow: hidden;
|
||||
z-index: 1;
|
||||
border-radius: $border-radius-base;
|
||||
|
||||
&:before {
|
||||
position: absolute;
|
||||
content: "";
|
||||
transform: rotate(45deg);
|
||||
display: block;
|
||||
margin-top: -3px;
|
||||
margin-left: 7px;
|
||||
width: 0;
|
||||
color: $white-color;
|
||||
height: 0;
|
||||
box-shadow:
|
||||
0 0 0 0,
|
||||
0 0 0 0,
|
||||
0 0 0 0,
|
||||
0 0 0 0,
|
||||
0 0 0 0,
|
||||
0 0 0 0,
|
||||
0 0 0 0 inset;
|
||||
animation: checkboxOff $mdb-checkbox-animation-check forwards;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.form-check-input{
|
||||
|
||||
&:focus + .form-check-sign .check:after {
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
&:checked {
|
||||
& ~ .form-check-sign .check {
|
||||
background: $mdb-checkbox-checked-color;
|
||||
}
|
||||
|
||||
& ~ .form-check-sign .check:before {
|
||||
color: #FFFFFF;
|
||||
box-shadow: 0 0 0 10px,
|
||||
10px -10px 0 10px,
|
||||
32px 0 0 20px,
|
||||
0px 32px 0 20px,
|
||||
-5px 5px 0 10px,
|
||||
20px -12px 0 11px;
|
||||
animation: checkboxOn $mdb-checkbox-animation-check forwards;
|
||||
}
|
||||
|
||||
& ~ .form-check-sign:before {
|
||||
animation: rippleOn $mdb-checkbox-animation-ripple;
|
||||
}
|
||||
|
||||
& ~ .form-check-sign .check:after {
|
||||
//background-color: $brand-success; // FIXME: seems like tho wrong color, test and make sure it can be removed
|
||||
animation: rippleOn $mdb-checkbox-animation-ripple forwards;
|
||||
}
|
||||
}
|
||||
|
||||
&:not(:checked) {
|
||||
& + .form-check-sign:before {
|
||||
animation: rippleOff $mdb-checkbox-animation-ripple;
|
||||
}
|
||||
|
||||
& + .form-check-sign .check:after {
|
||||
animation: rippleOff $mdb-checkbox-animation-ripple; // Ripple effect on uncheck
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
.rtl {
|
||||
.form-check {
|
||||
.form-check-sign {
|
||||
.check::before{
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Style for disabled inputs
|
||||
fieldset[disabled] &,
|
||||
fieldset[disabled] & .form-check-input,
|
||||
.form-check-input[disabled] ~ .form-check-sign .check,
|
||||
.form-check-input[disabled] + .circle {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.form-check-input[disabled] ~ .form-check-sign .check{
|
||||
border-color: #000000;
|
||||
opacity: .26;
|
||||
}
|
||||
|
||||
.form-check-input[disabled] + .form-check-sign .check:after {
|
||||
background-color: $mdb-text-color-primary;
|
||||
transform: rotate(-45deg);
|
||||
}
|
||||
|
||||
.form-check-input[disabled][checked] + .form-check-sign .check{
|
||||
background-color: $black;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes checkboxOn {
|
||||
0% {
|
||||
box-shadow:
|
||||
0 0 0 10px,
|
||||
10px -10px 0 10px,
|
||||
32px 0 0 20px,
|
||||
0px 32px 0 20px,
|
||||
-5px 5px 0 10px,
|
||||
15px 2px 0 11px;
|
||||
}
|
||||
50% {
|
||||
box-shadow:
|
||||
0 0 0 10px,
|
||||
10px -10px 0 10px,
|
||||
32px 0 0 20px,
|
||||
0px 32px 0 20px,
|
||||
-5px 5px 0 10px,
|
||||
20px 2px 0 11px;
|
||||
}
|
||||
100% {
|
||||
box-shadow:
|
||||
0 0 0 10px,
|
||||
10px -10px 0 10px,
|
||||
32px 0 0 20px,
|
||||
0px 32px 0 20px,
|
||||
-5px 5px 0 10px,
|
||||
20px -12px 0 11px;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes rippleOn {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
50% {
|
||||
opacity: 0.2;
|
||||
}
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
@keyframes rippleOff {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
50% {
|
||||
opacity: 0.2;
|
||||
}
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
// FIXME: only necessary because there isn't an underscored file - see https://github.com/twbs/bootstrap/issues/18350
|
||||
//@import "../bower_components/bootstrap/scss/
|
||||
//@import "../../bootstrap/scss/
|
||||
|
||||
// Core variables and mixins
|
||||
@import "./bootstrap/scss/functions";
|
||||
@import "./bootstrap/scss/variables";
|
||||
@import "./bootstrap/scss/mixins";
|
||||
|
||||
// #853 start - https://github.com/twbs/bootstrap/pull/18976/files
|
||||
// hack
|
||||
@mixin pull-left {
|
||||
float: left !important;
|
||||
@if $enable-flex {
|
||||
margin-right: auto;
|
||||
}
|
||||
}
|
||||
@mixin pull-right {
|
||||
float: right !important;
|
||||
@if $enable-flex {
|
||||
margin-left: auto;
|
||||
}
|
||||
}
|
||||
// #853 end - https://github.com/twbs/bootstrap/pull/18976/files
|
||||
|
||||
// Reset and dependencies
|
||||
@import "./bootstrap/scss/reboot";
|
||||
@import "./bootstrap/scss/print";
|
||||
|
||||
// Core CSS
|
||||
@import "./bootstrap/scss/reboot";
|
||||
@import "./bootstrap/scss/type";
|
||||
@import "./bootstrap/scss/images";
|
||||
@import "./bootstrap/scss/code";
|
||||
@import "./bootstrap/scss/grid";
|
||||
@import "./bootstrap/scss/tables";
|
||||
@import "./bootstrap/scss/forms";
|
||||
@import "./bootstrap/scss/buttons";
|
||||
@import "./bootstrap/scss/transitions";
|
||||
|
||||
// Components
|
||||
@import "./bootstrap/scss/dropdown";
|
||||
@import "./bootstrap/scss/button-group";
|
||||
@import "./bootstrap/scss/input-group";
|
||||
@import "./bootstrap/scss/custom-forms";
|
||||
@import "./bootstrap/scss/nav";
|
||||
@import "./bootstrap/scss/navbar";
|
||||
@import "./bootstrap/scss/card";
|
||||
@import "./bootstrap/scss/breadcrumb";
|
||||
@import "./bootstrap/scss/pagination";
|
||||
@import "./bootstrap/scss/jumbotron";
|
||||
@import "./bootstrap/scss/alert";
|
||||
@import "./bootstrap/scss/progress";
|
||||
@import "./bootstrap/scss/media";
|
||||
@import "./bootstrap/scss/list-group";
|
||||
@import "./bootstrap/scss/close";
|
||||
@import "./bootstrap/scss/badge";
|
||||
|
||||
// Components w/ JavaScript
|
||||
@import "./bootstrap/scss/modal";
|
||||
@import "./bootstrap/scss/tooltip";
|
||||
@import "./bootstrap/scss/popover";
|
||||
@import "./bootstrap/scss/carousel";
|
||||
|
||||
// Utility classes
|
||||
@import "./bootstrap/scss/utilities";
|
||||
209
staticfiles/assets/scss/material-dashboard/_dropdown.scss
Normal file
@@ -0,0 +1,209 @@
|
||||
// Menus https://www.google.com/design/spec/components/menus.html#menus-specs
|
||||
// Dropdown buttons (mobile and desktop) https://www.google.com/design/spec/components/buttons.html#buttons-dropdown-buttons
|
||||
|
||||
.dropdown-menu {
|
||||
display: none;
|
||||
padding: $bmd-dropdown-margin-y 0;
|
||||
border: 0;
|
||||
opacity: 0;
|
||||
transform: scale(0);
|
||||
transform-origin: 0 0;
|
||||
will-change: transform, opacity;
|
||||
transition: transform $bmd-menu-expand-duration $bmd-animation-curve-default,
|
||||
opacity $bmd-menu-fade-duration $bmd-animation-curve-default;
|
||||
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
|
||||
|
||||
&.showing {
|
||||
animation-name: bmd-dropdown-animation;
|
||||
animation-duration: $bmd-menu-expand-duration;
|
||||
animation-fill-mode: forwards;
|
||||
animation-timing-function: $bmd-animation-curve-default;
|
||||
}
|
||||
|
||||
.open > &,
|
||||
&.show {
|
||||
display: block;
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
&.hiding {
|
||||
display: block;
|
||||
opacity: 0;
|
||||
transform: scale(0);
|
||||
}
|
||||
|
||||
&[x-placement="bottom-start"] {
|
||||
transform-origin: 0 0;
|
||||
}
|
||||
|
||||
&[x-placement="bottom-end"] {
|
||||
transform-origin: 100% 0;
|
||||
}
|
||||
|
||||
&[x-placement="top-start"] {
|
||||
transform-origin: 0 100%;
|
||||
}
|
||||
|
||||
&[x-placement="top-end"] {
|
||||
transform-origin: 100% 100%;
|
||||
}
|
||||
|
||||
.disabled > a{
|
||||
color: $bmd-dropdown-header-color;
|
||||
|
||||
&:focus,
|
||||
&:hover{
|
||||
text-decoration: none;
|
||||
background-color: transparent;
|
||||
background-image: none;
|
||||
color: $bmd-dropdown-header-color;
|
||||
}
|
||||
}
|
||||
|
||||
&.dropdown-with-icons .dropdown-item{
|
||||
padding: $dropdown-item-padding-y + 0.125 $dropdown-item-padding-x $dropdown-item-padding-y + 0.125 $dropdown-item-padding-y + 0.125;
|
||||
|
||||
& .material-icons{
|
||||
vertical-align: middle;
|
||||
font-size: 24px;
|
||||
position: relative;
|
||||
margin-top: -4px;
|
||||
top: 1px;
|
||||
margin-right: 12px;
|
||||
opacity: .5;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// https://www.google.com/design/spec/components/menus.html#menus-specs
|
||||
.dropdown-item,
|
||||
li > a{ // used to properly size the ripple container
|
||||
position: relative;
|
||||
width: auto;
|
||||
display: flex;
|
||||
flex-flow: nowrap;
|
||||
align-items: center;
|
||||
color: $bmd-dropdown-link-color;
|
||||
font-weight: normal;
|
||||
text-decoration: none;
|
||||
font-size: .8125rem;
|
||||
border-radius: $border-radius / 2;
|
||||
margin: 0 $bmd-dropdown-margin-y;
|
||||
@include transitions($fast-transition-time, $transition-linear);
|
||||
min-width: $bmd-menu-item-min-width;
|
||||
padding: $dropdown-item-padding-y $dropdown-item-padding-x;
|
||||
overflow: hidden;
|
||||
line-height: $bmd-line-height;
|
||||
text-overflow: ellipsis;
|
||||
word-wrap: break-word;
|
||||
|
||||
@include media-breakpoint-up(md) {
|
||||
padding-right: $bmd-menu-item-padding-right-md;
|
||||
padding-left: $bmd-menu-item-padding-left-md;
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown-item:hover,
|
||||
.dropdown-item:focus,
|
||||
a:hover,
|
||||
a:focus,
|
||||
a:active {
|
||||
@include shadow-small-color($brand-primary);
|
||||
background-color: $brand-primary;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
}
|
||||
|
||||
a[data-toggle="collapse"][aria-expanded="true"] .caret,
|
||||
a[aria-expanded="true"] .caret,
|
||||
.dropdown.open .caret,
|
||||
.dropup.open .caret,
|
||||
.btn-group.bootstrap-select.open .caret {
|
||||
@include rotate-180();
|
||||
}
|
||||
|
||||
|
||||
// this could be in a .btn-group or .dropdown
|
||||
.dropdown-toggle {
|
||||
&.bmd-btn-icon,
|
||||
&.bmd-btn-fab {
|
||||
// remove the dropdown icon
|
||||
&::after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
~ .dropdown-menu {
|
||||
&.dropdown-menu-top-left,
|
||||
&.dropdown-menu-top-right {
|
||||
bottom: $bmd-btn-icon-size; // push up the bottom of the menu the height of the button
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&:after{
|
||||
will-change: transform;
|
||||
transition: transform $bmd-animation-dropdown-caret linear;
|
||||
}
|
||||
|
||||
&.bmd-btn-fab-sm {
|
||||
~ .dropdown-menu {
|
||||
&.dropdown-menu-top-left,
|
||||
&.dropdown-menu-top-right {
|
||||
bottom: $bmd-btn-fab-size-sm; // push up the bottom of the menu the height of the button
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.bmd-btn-icon {
|
||||
~ .dropdown-menu {
|
||||
// collapse some spacing
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.show > &:not(.dropdown-item):after {
|
||||
@include rotate-180();
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown-header{
|
||||
font-size: 0.75rem;
|
||||
padding-top: .625rem;
|
||||
padding-bottom: .625rem;;
|
||||
text-transform: none;
|
||||
color: $bmd-dropdown-header-color;
|
||||
line-height: $bmd-line-height;
|
||||
font-weight: inherit;
|
||||
}
|
||||
|
||||
@keyframes bmd-dropdown-animation {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: scale(0);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown-menu.bootstrap-datetimepicker-widget{
|
||||
opacity: 0;
|
||||
transform: scale(0);
|
||||
transition-duration: $bmd-menu-expand-duration;
|
||||
transition-timing-function: $bmd-animation-curve-default;
|
||||
transform-origin: 0 0;
|
||||
will-change: transform, opacity;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.dropdown-menu.bootstrap-datetimepicker-widget.top{
|
||||
transform-origin: 0 100%;
|
||||
}
|
||||
|
||||
.dropdown-menu.bootstrap-datetimepicker-widget.open{
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
top: 0;
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
.card-signup {
|
||||
.card-header {
|
||||
.social-line {
|
||||
.btn {
|
||||
color: $white-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
.text-divider {
|
||||
margin-top: 30px;
|
||||
margin-bottom: 0px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
.signup-page {
|
||||
.page-header {
|
||||
min-height: 100vh;
|
||||
height: auto;
|
||||
display: inherit;
|
||||
|
||||
.container{
|
||||
padding-top: 20vh;
|
||||
}
|
||||
}
|
||||
|
||||
.card-signup {
|
||||
border-radius: $border-radius-base * 2;
|
||||
@include shadow-16dp();
|
||||
margin-bottom: 100px;
|
||||
padding: 40px 0px;
|
||||
|
||||
}
|
||||
.info-horizontal {
|
||||
padding: 0px 0px 20px;
|
||||
}
|
||||
|
||||
.social {
|
||||
.btn {
|
||||
margin: 5px;
|
||||
}
|
||||
h4 {
|
||||
margin-top: 20px;
|
||||
}
|
||||
}
|
||||
.footer {
|
||||
.container {
|
||||
padding: 0;
|
||||
}
|
||||
.copyright,
|
||||
a{
|
||||
color: $white-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
332
staticfiles/assets/scss/material-dashboard/_fixed-plugin.scss
Normal file
@@ -0,0 +1,332 @@
|
||||
.fixed-plugin{
|
||||
.dropdown{
|
||||
.dropdown-menu{
|
||||
border-radius: 10px;
|
||||
li.adjustments-line{
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
li{
|
||||
padding: 5px 2px !important;
|
||||
}
|
||||
.adjustments-line{
|
||||
.bootstrap-switch{
|
||||
position: absolute;
|
||||
right: 10px !important;
|
||||
}
|
||||
label{
|
||||
margin-bottom: .1rem !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.fixed-plugin li > a,
|
||||
.fixed-plugin .badge{
|
||||
transition: all .34s;
|
||||
-webkit-transition: all .34s;
|
||||
-moz-transition: all .34s;
|
||||
}
|
||||
|
||||
.fixed-plugin{
|
||||
position: fixed;
|
||||
top: 115px;
|
||||
right: 0;
|
||||
width: 64px;
|
||||
background: rgba(0,0,0,.3);
|
||||
z-index: 3;
|
||||
border-radius: 8px 0 0 8px;
|
||||
text-align: center;
|
||||
}
|
||||
.fixed-plugin .fa-cog{
|
||||
color: #FFFFFF;
|
||||
padding: 10px;
|
||||
border-radius: 0 0 6px 6px;
|
||||
width: auto;
|
||||
}
|
||||
.fixed-plugin .dropdown-menu{
|
||||
right: 80px;
|
||||
left: auto;
|
||||
width: 290px;
|
||||
border-radius: 0.1875rem;
|
||||
padding: 0 10px;
|
||||
}
|
||||
.fixed-plugin .dropdown-menu:after, .fixed-plugin .dropdown-menu:before{
|
||||
right: 10px;
|
||||
margin-left: auto;
|
||||
left: auto;
|
||||
}
|
||||
.fixed-plugin .fa-circle-thin{
|
||||
color: #FFFFFF;
|
||||
}
|
||||
.fixed-plugin .active .fa-circle-thin{
|
||||
color: #00bbff;
|
||||
}
|
||||
|
||||
.fixed-plugin .dropdown-menu > .active > a,
|
||||
.fixed-plugin .dropdown-menu > .active > a:hover,
|
||||
.fixed-plugin .dropdown-menu > .active > a:focus{
|
||||
color: #777777;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.fixed-plugin img{
|
||||
border-radius: 0;
|
||||
width: 100%;
|
||||
height: 100px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.fixed-plugin .dropdown-menu li > a:hover,
|
||||
.fixed-plugin .dropdown-menu li > a:focus{
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.fixed-plugin .badge{
|
||||
border: 3px solid #FFFFFF;
|
||||
border-radius: 50%;
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
height: 23px;
|
||||
margin-right: 5px;
|
||||
position: relative;
|
||||
width: 23px;
|
||||
padding: 8px;
|
||||
}
|
||||
.fixed-plugin .badge.active,
|
||||
.fixed-plugin .badge:hover{
|
||||
border-color: #00bbff;
|
||||
}
|
||||
|
||||
.fixed-plugin .badge-black{
|
||||
background-color: #000;
|
||||
}
|
||||
.fixed-plugin .badge-azure{
|
||||
background-color: #2CA8FF;
|
||||
}
|
||||
.fixed-plugin .badge-green{
|
||||
background-color: #18ce0f;
|
||||
}
|
||||
.fixed-plugin .badge-orange{
|
||||
background-color: #f96332;
|
||||
}
|
||||
.fixed-plugin .badge-yellow{
|
||||
background-color: #FFB236;
|
||||
}
|
||||
.fixed-plugin .badge-danger{
|
||||
background-color: #f44336;
|
||||
}
|
||||
.fixed-plugin .badge-purple{
|
||||
background-color: #9368E9;
|
||||
}
|
||||
.fixed-plugin .badge-white{
|
||||
background-color: rgba(200, 200, 200, 0.2);
|
||||
}
|
||||
.fixed-plugin .badge-rose{
|
||||
background-color: #e91e63;
|
||||
}
|
||||
|
||||
.fixed-plugin h5{
|
||||
font-size: 14px;
|
||||
margin: 10px;
|
||||
}
|
||||
.fixed-plugin .dropdown-menu li{
|
||||
display: block;
|
||||
padding: 18px 2px;
|
||||
width: 25%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.fixed-plugin li.adjustments-line,
|
||||
.fixed-plugin li.header-title,
|
||||
.fixed-plugin li.button-container{
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
min-height: inherit;
|
||||
}
|
||||
|
||||
.fixed-plugin li.button-container{
|
||||
height: auto;
|
||||
}
|
||||
.fixed-plugin li.button-container div{
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.fixed-plugin {
|
||||
.btn {
|
||||
position: relative;
|
||||
padding: 12px 30px;
|
||||
margin: $bmd-btn-margin-bottom 1px;
|
||||
font-size: .75rem; // 12px
|
||||
border-radius: $border-radius-sm;
|
||||
transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
will-change: box-shadow, transform;
|
||||
|
||||
@include bmd-raised-button-color();
|
||||
@include undo-bs-tab-focus();
|
||||
|
||||
&.btn-round {
|
||||
border-radius: $border-radius-extreme;
|
||||
}
|
||||
}
|
||||
|
||||
.button-container .btn:not(.btn-facebook):not(.btn-twitter) {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.button-container.github-star{
|
||||
margin-left: 78px;
|
||||
}
|
||||
}
|
||||
|
||||
.fixed-plugin #sharrreTitle{
|
||||
text-align: center;
|
||||
padding: 10px 0;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.fixed-plugin li.header-title{
|
||||
height: 30px;
|
||||
line-height: 25px;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.fixed-plugin .adjustments-line p{
|
||||
float: left;
|
||||
display: inline-block;
|
||||
margin-bottom: 0;
|
||||
font-size: 1em;
|
||||
color: #3C4858;
|
||||
padding-top: 0px;
|
||||
}
|
||||
|
||||
.fixed-plugin .adjustments-line a .badge-colors{
|
||||
position: relative;
|
||||
top: -2px;
|
||||
}
|
||||
|
||||
.fixed-plugin .adjustments-line .togglebutton{
|
||||
padding-right: 7px;
|
||||
}
|
||||
|
||||
.fixed-plugin .adjustments-line .togglebutton .toggle{
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.fixed-plugin .dropdown-menu > li.adjustments-line > a{
|
||||
padding-right: 0;
|
||||
padding-left: 0;
|
||||
/*border-bottom: 1px solid #ddd;*/
|
||||
border-radius: 0;
|
||||
margin: 0;
|
||||
}
|
||||
.fixed-plugin .dropdown-menu > li > a.img-holder{
|
||||
font-size: 16px;
|
||||
text-align: center;
|
||||
border-radius: 10px;
|
||||
background-color: #FFF;
|
||||
border: 3px solid #FFF;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
opacity: 1;
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
max-height: 100px;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
min-width: 25%;
|
||||
}
|
||||
|
||||
.fixed-plugin .dropdown-menu > li > a.switch-trigger:hover,
|
||||
.fixed-plugin .dropdown-menu > li > a.switch-trigger:focus{
|
||||
background-color: transparent;
|
||||
}
|
||||
.fixed-plugin .dropdown-menu > li:hover > a.img-holder,
|
||||
.fixed-plugin .dropdown-menu > li:focus > a.img-holder{
|
||||
border-color: rgba(0, 187, 255, 0.53);;
|
||||
}
|
||||
.fixed-plugin .dropdown-menu > .active > a.img-holder,
|
||||
.fixed-plugin .dropdown-menu > .active > a.img-holder{
|
||||
border-color: #00bbff;
|
||||
background-color: #FFFFFF;
|
||||
}
|
||||
|
||||
.fixed-plugin .dropdown-menu > li > a img{
|
||||
margin-top: auto;
|
||||
}
|
||||
|
||||
.fixed-plugin .btn-social{
|
||||
width: 50%;
|
||||
display: block;
|
||||
width: 48%;
|
||||
float: left;
|
||||
font-weight: 600;
|
||||
}
|
||||
.fixed-plugin .btn-social i{
|
||||
margin-right: 5px;
|
||||
}
|
||||
.fixed-plugin .btn-social:first-child{
|
||||
margin-right: 2%;
|
||||
}
|
||||
|
||||
.fixed-plugin .adjustments-line a:hover,
|
||||
.fixed-plugin .adjustments-line a:focus,
|
||||
.fixed-plugin .adjustments-line a{
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
.fixed-plugin .dropdown .dropdown-menu{
|
||||
top: -40px !important;
|
||||
opacity: 0;
|
||||
left: -303px !important;
|
||||
transform-origin: 100% 0;
|
||||
}
|
||||
.fixed-plugin .dropdown.show .dropdown-menu{
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
.fixed-plugin .dropdown-menu:before,
|
||||
.fixed-plugin .dropdown-menu:after{
|
||||
content: "";
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
top: 65px;
|
||||
width: 16px;
|
||||
transform: translateY(-50%);
|
||||
-webkit-transform: translateY(-50%);
|
||||
-moz-transform: translateY(-50%);
|
||||
|
||||
}
|
||||
.fixed-plugin .dropdown-menu:before{
|
||||
border-bottom: 16px solid rgba(0, 0, 0, 0);
|
||||
border-left: 16px solid rgba(0,0,0,0.2);
|
||||
border-top: 16px solid rgba(0,0,0,0);
|
||||
right: -16px;
|
||||
}
|
||||
|
||||
.fixed-plugin .dropdown-menu:after{
|
||||
border-bottom: 16px solid rgba(0, 0, 0, 0);
|
||||
border-left: 16px solid #fff;
|
||||
border-top: 16px solid rgba(0,0,0,0);
|
||||
right: -15px;
|
||||
}
|
||||
|
||||
.wrapper-full-page ~ .fixed-plugin .dropdown.open .dropdown-menu{
|
||||
-webkit-transform: translateY(-17%);
|
||||
-moz-transform: translateY(-17%);
|
||||
-o-transform: translateY(-17%);
|
||||
-ms-transform: translateY(-17%);
|
||||
transform: translateY(-17%);
|
||||
}
|
||||
|
||||
.wrapper-full-page ~ .fixed-plugin .dropdown .dropdown-menu{
|
||||
-webkit-transform: translateY(-19%);
|
||||
-moz-transform: translateY(-19%);
|
||||
-o-transform: translateY(-19%);
|
||||
-ms-transform: translateY(-19%);
|
||||
transform: translateY(-19%);
|
||||
}
|
||||
111
staticfiles/assets/scss/material-dashboard/_footers.scss
Normal file
@@ -0,0 +1,111 @@
|
||||
.footer{
|
||||
padding: $padding-general-x 0;
|
||||
text-align: center;
|
||||
display: -webkit-flex; /* Safari */ /* Safari 6.1+ */
|
||||
display: flex;
|
||||
|
||||
ul{
|
||||
margin-bottom: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
|
||||
li{
|
||||
display: inline-block;
|
||||
|
||||
a{
|
||||
color: inherit;
|
||||
padding: $padding-general-x;
|
||||
font-weight: $font-weight-bold;
|
||||
font-size: $mdb-btn-font-size-base;
|
||||
text-transform: uppercase;
|
||||
border-radius: $border-radius-base;
|
||||
text-decoration: none;
|
||||
position: relative;
|
||||
display: block;
|
||||
|
||||
&:hover{
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
|
||||
.btn{
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&.links-horizontal{
|
||||
&:first-child a{
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
&:last-child a{
|
||||
padding-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&.links-vertical{
|
||||
li{
|
||||
display: block;
|
||||
margin-left: -5px;
|
||||
margin-right: -5px;
|
||||
|
||||
a{
|
||||
padding: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.social-buttons{
|
||||
a,
|
||||
.btn{
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.footer-brand{
|
||||
float: left;
|
||||
height: 50px;
|
||||
padding: 15px 15px;
|
||||
font-size: 18px;
|
||||
line-height: 20px;
|
||||
margin-left: -15px;
|
||||
|
||||
&:hover,
|
||||
&:focus{
|
||||
color: $black-color;
|
||||
}
|
||||
}
|
||||
.copyright{
|
||||
padding: 15px 0;
|
||||
.material-icons{
|
||||
font-size: 18px;
|
||||
position: relative;
|
||||
top: 3px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.pull-center{
|
||||
display: inline-block;
|
||||
float: none;
|
||||
}
|
||||
}
|
||||
|
||||
.off-canvas-sidebar {
|
||||
.footer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 768px){
|
||||
.footer{
|
||||
.copyright {
|
||||
padding-right: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
374
staticfiles/assets/scss/material-dashboard/_forms.scss
Normal file
@@ -0,0 +1,374 @@
|
||||
form {
|
||||
// ensure enough room at the bottom of any form to display a one-line bmd-help
|
||||
margin-bottom: ($bmd-help-size-ratio * $font-size-base) * $line-height-base;
|
||||
|
||||
.card &{
|
||||
margin: 0;
|
||||
}
|
||||
// reverse the above for navbars (no help expected in a navbar form)
|
||||
.navbar & {
|
||||
margin-bottom: 0; // only adjust bottom so that pull-xs-right flexed margin-left: auto works
|
||||
|
||||
.bmd-form-group {
|
||||
display: inline-block;
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
.btn {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -----
|
||||
// Inputs
|
||||
//
|
||||
// Reference http://www.google.com/design/spec/components/text-fields.html
|
||||
// MDL implementation: http://www.getmdl.io/components/index.html#textfields-section
|
||||
.form-control {
|
||||
background: $bmd-form-control-bg-repeat-y $bmd-form-control-bg-position;
|
||||
background-size: $bmd-form-control-bg-size;
|
||||
border: 0;
|
||||
height: 36px;
|
||||
transition: background 0s ease-out;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
border-radius: 0;
|
||||
font-size: $mdb-input-font-size-base;
|
||||
|
||||
// The border bottom should be static in all states, the decorator will be animated over this.
|
||||
&:focus,
|
||||
.bmd-form-group.is-focused & {
|
||||
background-size: $bmd-form-control-bg-size-active;
|
||||
//border-bottom: $input-btn-border-width solid $input-border-color;
|
||||
transition-duration: 0.3s;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
@include material-placeholder() {
|
||||
color: $mdb-input-placeholder-color;
|
||||
font-weight: 400;
|
||||
font-size: $mdb-input-font-size-base;
|
||||
}
|
||||
|
||||
.has-white &{
|
||||
@include material-placeholder(){
|
||||
color: $white-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Help blocks (not in v4)
|
||||
// position: absolute approach - uses no vertical space and there is no form jumping, but text wrapping - not so good.
|
||||
// FIXME: width/wrapping isn't automatic and overflows occur. What are some solutions?
|
||||
//
|
||||
.bmd-help {
|
||||
position: absolute;
|
||||
display: none;
|
||||
font-size: .8rem;
|
||||
font-weight: normal;
|
||||
@extend .text-muted;
|
||||
|
||||
.bmd-form-group.is-focused & {
|
||||
display: block;
|
||||
}
|
||||
|
||||
//--------------------------------------
|
||||
// Multiple help blocks
|
||||
// - absolute positioning is used above to prevent bouncing
|
||||
// - when there is more than one, this will bounce but will at least show
|
||||
&:nth-of-type(2) {
|
||||
padding-top: 1rem; // the first one requires top padding to push it below the first one which is absolute positioned
|
||||
}
|
||||
|
||||
+ .bmd-help {
|
||||
position: relative;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
// -----
|
||||
// State coloring: default, success, info, warning, danger
|
||||
//
|
||||
@include bmd-selection-color();
|
||||
@include bmd-form-color($bmd-label-color, $bmd-label-color-focus, $input-border-color, $input-border-color);
|
||||
|
||||
.has-success {
|
||||
@include bmd-form-color($brand-success, $brand-success, $brand-success, $input-border-color);
|
||||
}
|
||||
|
||||
.has-info {
|
||||
@include bmd-form-color($brand-info, $brand-info, $brand-info, $input-border-color);
|
||||
}
|
||||
|
||||
.has-white{
|
||||
@include bmd-form-color($white-color, $white-color, $white-color, $input-border-color-white);
|
||||
|
||||
.form-control{
|
||||
&:focus{
|
||||
color: $white-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.has-warning {
|
||||
@include bmd-form-color($brand-warning, $brand-warning, $brand-warning, $input-border-color);
|
||||
}
|
||||
|
||||
.has-danger {
|
||||
@include bmd-form-color($brand-danger, $brand-danger, $brand-danger, $input-border-color);
|
||||
}
|
||||
|
||||
.has-rose {
|
||||
@include bmd-form-color($brand-rose, $brand-rose, $brand-rose, $input-border-color);
|
||||
}
|
||||
|
||||
// Reference http://www.google.com/design/spec/components/text-fields.html
|
||||
// MDL implementation: http://www.getmdl.io/components/index.html#textfields-section
|
||||
//.variations(unquote(" label"), color, $bmd-input-placeholder-color); // default label color variations
|
||||
|
||||
// Whereas .form-group adds structure, bmd-form-group just needs to make sure we have enough padding for our labels to work. That's the only purpose.
|
||||
.bmd-form-group {
|
||||
position: relative;
|
||||
|
||||
// -----
|
||||
// Labels
|
||||
//
|
||||
// Reference http://www.google.com/design/spec/components/text-fields.html
|
||||
// MDL implementation: http://www.getmdl.io/components/index.html#textfields-section
|
||||
|
||||
&:not(.has-success):not(.has-danger){
|
||||
[class^='bmd-label'],
|
||||
[class*=' bmd-label']{
|
||||
&.bmd-label-floating{
|
||||
color: $mdb-input-placeholder-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
[class^='bmd-label'],
|
||||
[class*=' bmd-label'] {
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
transition: 0.3s ease all;
|
||||
|
||||
// hint to browser for optimization
|
||||
&.bmd-label-floating {
|
||||
will-change: left, top, contents;
|
||||
margin: 0;
|
||||
line-height: 1.4;
|
||||
font-weight: 400;
|
||||
}
|
||||
}
|
||||
|
||||
// hide label-placeholders when the field is filled
|
||||
&.is-filled .bmd-label-placeholder {
|
||||
display: none;
|
||||
}
|
||||
|
||||
// Optional class to make the text field inline collapsible/expandable (collapsed by default)
|
||||
// This uses the BS collapse js to make the width expand.
|
||||
// `width` class must also be on the element FIXME: do this with JS, it is a marker class and should be implicit because after all, we are an bmd-collapse-inline
|
||||
// FIXME: js needs to do the focus on shown.bs.collapse event http://v4-alpha.getbootstrap.com/components/collapse/#events
|
||||
&.bmd-collapse-inline {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0; // get rid of any padding as this is a width transition
|
||||
min-height: 2.1em;
|
||||
|
||||
// Expandable Holder.
|
||||
.collapse {
|
||||
flex: 1;
|
||||
display: none;
|
||||
&.show {
|
||||
// This is an unfortunate hack. Animating between widths in percent (%)
|
||||
// in many browsers (Chrome, Firefox) only animates the inner visual style
|
||||
// of the input - the outer bounding box still 'jumps'.
|
||||
// Thus assume a sensible maximum, and animate to/from that value.
|
||||
max-width: 1200px;
|
||||
}
|
||||
}
|
||||
|
||||
.collapsing,
|
||||
.width:not(.collapse),
|
||||
// collapsing is removed and momentarily only width is present
|
||||
.collapse.show {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.collapsing {
|
||||
@include material-animation-default();
|
||||
}
|
||||
}
|
||||
|
||||
// default floating size/location with an bmd-form-group
|
||||
@include bmd-form-size-variant($font-size-base, $bmd-label-top-margin-base, $input-padding-y, $bmd-form-line-height, "bmd-form-group default");
|
||||
|
||||
// sm floating size/location
|
||||
&.bmd-form-group-sm {
|
||||
@include bmd-form-size-variant($font-size-sm, $bmd-label-top-margin-sm, $input-padding-y-sm, $bmd-form-line-height-sm, "bmd-form-group sm");
|
||||
}
|
||||
|
||||
// lg floating size/location
|
||||
&.bmd-form-group-lg {
|
||||
@include bmd-form-size-variant($font-size-lg, $bmd-label-top-margin-lg, $input-padding-y-lg, $bmd-form-line-height-sm, "bmd-form-group lg");
|
||||
}
|
||||
}
|
||||
|
||||
// default floating size/location without a form-group (will skip form-group styles, and just render default sizing variation) - IMPORTANT for non-form-group spacing such as radio/checkbox/switch
|
||||
@include bmd-form-size-variant($font-size-base, $bmd-label-top-margin-base, $input-padding-y, $bmd-form-line-height);
|
||||
|
||||
select {
|
||||
&,
|
||||
&.form-control {
|
||||
// Use vendor prefixes as `appearance` isn't part of the CSS spec. OSX doesn't obey the border-radius: 0 without this.
|
||||
-moz-appearance: none;
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
}
|
||||
|
||||
// Input files - hide actual input - requires specific markup in the sample.
|
||||
//.bmd-form-group input[type=file] {
|
||||
// opacity: 0;
|
||||
// position: absolute;
|
||||
// top: 0;
|
||||
// right: 0;
|
||||
// bottom: 0;
|
||||
// left: 0;
|
||||
// width: 100%;
|
||||
// height: 100%;
|
||||
// z-index: 100;
|
||||
//}
|
||||
|
||||
//
|
||||
//
|
||||
//.form-horizontal {
|
||||
//
|
||||
// // Consistent vertical alignment of radios and checkboxes
|
||||
// .radio,
|
||||
// .checkbox,
|
||||
// .radio-inline,
|
||||
// .checkbox-inline {
|
||||
// padding-top: 0;
|
||||
// }
|
||||
//
|
||||
// .radio {
|
||||
// margin-bottom: 10px;
|
||||
// }
|
||||
//
|
||||
// label {
|
||||
// text-align: right;
|
||||
// }
|
||||
//
|
||||
// label {
|
||||
// margin: 0;
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
.form-inline {
|
||||
@include media-breakpoint-up(sm) {
|
||||
.input-group {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.form-control-feedback{
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
right: 0;
|
||||
z-index: 2;
|
||||
display: block;
|
||||
width: 34px;
|
||||
height: 34px;
|
||||
line-height: 34px;
|
||||
text-align: center;
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
|
||||
.has-success &{
|
||||
color: $green;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.has-danger &{
|
||||
color: $red;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.form-group{
|
||||
padding-bottom: 10px;
|
||||
position: relative;
|
||||
margin: 8px 0 0;
|
||||
|
||||
.bmd-label-static {
|
||||
top: -10px;
|
||||
}
|
||||
}
|
||||
|
||||
textarea{
|
||||
height: auto !important;
|
||||
resize: none;
|
||||
line-height: $bmd-line-height !important;
|
||||
}
|
||||
|
||||
.form-group input[type=file] {
|
||||
opacity: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
.form-newsletter{
|
||||
.input-group,
|
||||
.form-group{
|
||||
float: left;
|
||||
width: 78%;
|
||||
margin-right: 2%;
|
||||
margin-top: 9px;
|
||||
padding-top: 5px;
|
||||
}
|
||||
|
||||
.btn{
|
||||
float: left;
|
||||
width: 20%;
|
||||
margin: 9px 0 0;
|
||||
}
|
||||
}
|
||||
|
||||
.form-file-upload{
|
||||
.input-group-btn:last-child>.btn-round{
|
||||
border-radius: 30px;
|
||||
}
|
||||
|
||||
.input-group-btn .btn{
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.input-group{
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.input-group .input-group-btn{
|
||||
padding: 0 12px;
|
||||
}
|
||||
|
||||
.form-control[disabled],
|
||||
fieldset[disabled] .form-control,
|
||||
.form-group .form-control[disabled],
|
||||
fieldset[disabled] .form-group .form-control{
|
||||
background-color: transparent;
|
||||
cursor: not-allowed;
|
||||
border-bottom: 1px dotted $input-border-color;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
82
staticfiles/assets/scss/material-dashboard/_headers.scss
Normal file
@@ -0,0 +1,82 @@
|
||||
.page-header{
|
||||
min-height: 100vh;
|
||||
max-height: 1000px;
|
||||
display: flex !important;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
color: $white-color;
|
||||
position: relative;
|
||||
|
||||
.page-header-image{
|
||||
position: absolute;
|
||||
background-size: cover;
|
||||
background-position: center center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
.content-center{
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
z-index: 2;
|
||||
-ms-transform: translate(-50%, -50%);
|
||||
-webkit-transform: translate(-50%, -50%);
|
||||
transform: translate(-50%, -50%);
|
||||
text-align: center;
|
||||
color: #FFFFFF;
|
||||
padding: 0 15px;
|
||||
width: 100%;
|
||||
max-width: 880px;
|
||||
}
|
||||
|
||||
footer{
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.container{
|
||||
height: 100%;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.category,
|
||||
.description{
|
||||
color: $opacity-8;
|
||||
}
|
||||
|
||||
&.page-header-small{
|
||||
min-height: 60vh;
|
||||
max-height: 440px;
|
||||
}
|
||||
|
||||
&.page-header-mini{
|
||||
min-height: 40vh;
|
||||
max-height: 340px;
|
||||
}
|
||||
|
||||
.title{
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.title + h4{
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
&:after,
|
||||
&:before{
|
||||
position: absolute;
|
||||
z-index: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
left: 0;
|
||||
top: 0;
|
||||
content: "";
|
||||
}
|
||||
|
||||
&:before{
|
||||
background-color: rgba(0,0,0,.3);
|
||||
}
|
||||
}
|
||||
10
staticfiles/assets/scss/material-dashboard/_images.scss
Normal file
@@ -0,0 +1,10 @@
|
||||
.img-thumbnail{
|
||||
border-radius: 16px;
|
||||
}
|
||||
.img-raised{
|
||||
@include shadow-big-image();
|
||||
}
|
||||
|
||||
.rounded{
|
||||
border-radius: $border-radius-large !important;
|
||||
}
|
||||
57
staticfiles/assets/scss/material-dashboard/_info-areas.scss
Normal file
@@ -0,0 +1,57 @@
|
||||
.info{
|
||||
max-width: 360px;
|
||||
margin: 0 auto;
|
||||
padding: 70px 0 30px;
|
||||
|
||||
.icon{
|
||||
color: $gray-color;
|
||||
|
||||
> i{
|
||||
font-size: 3.85rem;
|
||||
}
|
||||
}
|
||||
.info-title{
|
||||
color: $black-color;
|
||||
margin: 0.875rem * 2 0 0.875rem;
|
||||
}
|
||||
p{
|
||||
color: $gray-color;
|
||||
}
|
||||
}
|
||||
|
||||
.info-horizontal{
|
||||
.icon{
|
||||
float: left;
|
||||
margin-top: 24px;
|
||||
margin-right: 10px;
|
||||
|
||||
>i{
|
||||
font-size: $font-size-h2;
|
||||
}
|
||||
}
|
||||
.description{
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.icon {
|
||||
&.icon-primary {
|
||||
color: $brand-primary;
|
||||
}
|
||||
&.icon-info {
|
||||
color: $brand-info;
|
||||
}
|
||||
&.icon-success {
|
||||
color: $brand-success;
|
||||
}
|
||||
&.icon-warning {
|
||||
color: $brand-warning;
|
||||
}
|
||||
&.icon-danger {
|
||||
color: $brand-danger;
|
||||
}
|
||||
&.icon-rose {
|
||||
color: $brand-rose;
|
||||
}
|
||||
}
|
||||
36
staticfiles/assets/scss/material-dashboard/_input-group.scss
Normal file
@@ -0,0 +1,36 @@
|
||||
// -----------------------------------------
|
||||
// input-group and input-group-addon styles
|
||||
// note: form-groups are not required
|
||||
//
|
||||
@mixin input-group-button-variation($vertical-padding) {
|
||||
.input-group-btn {
|
||||
.btn {
|
||||
//margin: 0 0 $vertical-padding 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// default margin - no form-group required
|
||||
@include input-group-button-variation(input-padding-y);
|
||||
|
||||
.bmd-form-group-sm {
|
||||
@include input-group-button-variation($input-padding-y-sm);
|
||||
}
|
||||
|
||||
.bmd-form-group-lg {
|
||||
@include input-group-button-variation($input-padding-y-lg);
|
||||
}
|
||||
|
||||
.input-group {
|
||||
// may be in or outside of form-group
|
||||
|
||||
.input-group-text {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 0 15px 0 15px;
|
||||
background-color: transparent;
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
}
|
||||
203
staticfiles/assets/scss/material-dashboard/_misc.scss
Normal file
@@ -0,0 +1,203 @@
|
||||
body{
|
||||
background-color: #eee;
|
||||
color: $black-color;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
legend {
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
.serif-font{
|
||||
font-family: $font-family-serif;
|
||||
}
|
||||
|
||||
// Prevent highlight on mobile
|
||||
* {
|
||||
-webkit-tap-highlight-color: rgba(255, 255, 255, 0);
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
&:focus {
|
||||
outline: 0;
|
||||
}
|
||||
}
|
||||
|
||||
a{
|
||||
color: $link-color;
|
||||
&:hover,
|
||||
&:focus{
|
||||
color: darken($link-color, 5%);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
&.text-info{
|
||||
&:hover, &:focus{
|
||||
color: darken($brand-info, 5%);
|
||||
}
|
||||
}
|
||||
|
||||
& .material-icons {
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
|
||||
.form-check,
|
||||
label{
|
||||
font-size: 14px;
|
||||
line-height: 1.42857;
|
||||
color: $checkboxes-text-color;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
/* Animations */
|
||||
.animation-transition-general{
|
||||
@include transition-all($general-transition-time, $transition-linear);
|
||||
}
|
||||
|
||||
.animation-transition-slow{
|
||||
@include transition-all($slow-transition-time, $transition-linear);
|
||||
}
|
||||
|
||||
.animation-transition-fast{
|
||||
@include transition-all($fast-transition-time, $transition-ease);
|
||||
}
|
||||
|
||||
.caret,
|
||||
.sidebar a{
|
||||
@include transition-all($fast-transition-time, $transition-ease-in);
|
||||
}
|
||||
|
||||
|
||||
// Offline documentation
|
||||
|
||||
.offline-doc {
|
||||
.navbar.navbar-transparent{
|
||||
padding-top: 25px;
|
||||
border-bottom: none;
|
||||
|
||||
.navbar-minimize {
|
||||
display: none;
|
||||
}
|
||||
.navbar-brand,
|
||||
.collapse .navbar-nav .nav-link {
|
||||
color: $white-color !important;
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
z-index: 3 !important;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
background: transparent;
|
||||
bottom: 0;
|
||||
color: $white-color;
|
||||
}
|
||||
.page-header{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
.content-center {
|
||||
z-index: 3;
|
||||
|
||||
.brand .title {
|
||||
color: $white-color;
|
||||
}
|
||||
}
|
||||
|
||||
&:after {
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
content: "";
|
||||
display: block;
|
||||
height: 100%;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
z-index: 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// docs
|
||||
|
||||
.bd-docs {
|
||||
.bd-toc-item {
|
||||
.bd-sidenav a span {
|
||||
float: right;
|
||||
margin-top: 5px;
|
||||
padding: 3px 7px;
|
||||
font-size: 8px;
|
||||
line-height: 9px;
|
||||
background-color: $brand-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// timepicker increase/decrease buttons
|
||||
|
||||
.bootstrap-datetimepicker-widget .timepicker {
|
||||
.table-condesed .btn{
|
||||
.ripple-container {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
margin: -11px 3px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.off-canvas-sidebar {
|
||||
.wrapper-full-page {
|
||||
.page-header {
|
||||
padding: 15vh 0 !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// RTL Page
|
||||
|
||||
html[dir="rtl"] {
|
||||
.main-panel {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.sidebar,
|
||||
.off-canvas-sidebar nav .navbar-collapse {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
left: unset;
|
||||
right: 0;
|
||||
|
||||
.nav {
|
||||
padding-right: 0;
|
||||
|
||||
i {
|
||||
float: right;
|
||||
margin-left: 15px;
|
||||
margin-right: unset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.card {
|
||||
&.card-chart {
|
||||
direction: ltr;
|
||||
|
||||
.card-title,
|
||||
.card-category {
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
|
||||
.card-body,
|
||||
.card-footer {
|
||||
direction: rtl;
|
||||
}
|
||||
}
|
||||
|
||||
.form-check .form-check-sign .check:before {
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
16
staticfiles/assets/scss/material-dashboard/_mixins.scss
Normal file
@@ -0,0 +1,16 @@
|
||||
@import "mixins/utilities";
|
||||
@import "mixins/breakpoints";
|
||||
@import "mixins/animations";
|
||||
@import "mixins/type";
|
||||
@import "mixins/layout";
|
||||
@import "mixins/drawer";
|
||||
@import "mixins/forms";
|
||||
@import "mixins/buttons";
|
||||
@import "mixins/hover";
|
||||
@import "mixins/navs";
|
||||
@import "mixins/colored-shadows";
|
||||
@import "mixins/navbar-colors";
|
||||
@import "mixins/alert";
|
||||
@import "mixins/sidebar-color";
|
||||
@import "mixins/variables";
|
||||
@import "mixins/vendor-prefixes";
|
||||
252
staticfiles/assets/scss/material-dashboard/_navbar.scss
Normal file
@@ -0,0 +1,252 @@
|
||||
.navbar {
|
||||
border: 0;
|
||||
border-radius: $border-radius-base;
|
||||
padding: 0.625rem 0;
|
||||
margin-bottom: 20px;
|
||||
height: auto !important;
|
||||
@include navbar-colors($white-color, $navbar-color);
|
||||
|
||||
&.fixed-top{
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.navbar-nav{
|
||||
.nav-item .nav-link{
|
||||
position: relative;
|
||||
color: inherit;
|
||||
padding: $padding-general-x;
|
||||
font-weight: $font-weight-default;
|
||||
font-size: $mdb-btn-font-size-base;
|
||||
text-transform: uppercase;
|
||||
border-radius: $border-radius-base;
|
||||
line-height: 20px;
|
||||
|
||||
&:not(.btn-just-icon) .fa{
|
||||
position: relative;
|
||||
top: 2px;
|
||||
margin-top: -4px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
& .material-icons,
|
||||
& .fa{
|
||||
font-size: $font-size-lg;
|
||||
max-width: 24px;
|
||||
margin-top: -1.1em;
|
||||
}
|
||||
|
||||
&:not(.btn) .material-icons{
|
||||
margin-top: -7px;
|
||||
top: 3px;
|
||||
position: relative;
|
||||
margin-right: 3px;
|
||||
}
|
||||
|
||||
&.profile-photo{
|
||||
padding: 0;
|
||||
margin: 0 3px;
|
||||
|
||||
&:after{
|
||||
display: none;
|
||||
}
|
||||
|
||||
& .profile-photo-small{
|
||||
height: 40px;
|
||||
width: 40px;
|
||||
}
|
||||
|
||||
.ripple-container{
|
||||
border-radius: 50%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown-menu-right{
|
||||
transform-origin: 100% 0;
|
||||
}
|
||||
|
||||
.nav-item.active .nav-link{
|
||||
&,
|
||||
&:hover,
|
||||
&:focus {
|
||||
color: inherit;
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.btn,
|
||||
.navbar-nav .nav-item .btn{
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.navbar-toggler{
|
||||
cursor: pointer;
|
||||
outline: 0;
|
||||
|
||||
.navbar-toggler-icon{
|
||||
width: 22px;
|
||||
height: 2px;
|
||||
vertical-align: middle;
|
||||
outline: 0;
|
||||
display: block;
|
||||
border-radius: 1px;
|
||||
|
||||
& + .navbar-toggler-icon{
|
||||
margin-top: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.navbar-absolute{
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
padding-top: 10px;
|
||||
z-index: 1029;
|
||||
}
|
||||
|
||||
.navbar-wrapper{
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
// give correct size to ripple container
|
||||
.navbar-brand {
|
||||
position: relative;
|
||||
color: inherit;
|
||||
height: 50px;
|
||||
font-size: $navbar-brand-font-size - 0.125;
|
||||
line-height: 30px;
|
||||
padding: $padding-general-y 0;
|
||||
font-weight: 300;
|
||||
margin-left: 1rem;
|
||||
}
|
||||
|
||||
> .container {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
&.bg-primary{
|
||||
@include navbar-colors($bg-primary, $white-color);
|
||||
}
|
||||
&.bg-info{
|
||||
@include navbar-colors($bg-info, $white-color);
|
||||
}
|
||||
|
||||
&.bg-warning{
|
||||
@include navbar-colors($bg-warning, $white-color);
|
||||
}
|
||||
|
||||
&.bg-rose{
|
||||
@include navbar-colors($bg-rose, $white-color);
|
||||
}
|
||||
|
||||
&.bg-danger{
|
||||
@include navbar-colors($bg-danger, $white-color);
|
||||
}
|
||||
|
||||
&.bg-success{
|
||||
@include navbar-colors($bg-success, $white-color);
|
||||
}
|
||||
&.bg-dark{
|
||||
@include navbar-colors($grey-900, $white-color);
|
||||
}
|
||||
|
||||
&.navbar-transparent{
|
||||
background-color: transparent !important;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
|
||||
.notification{
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
border: 1px solid #FFF;
|
||||
right: 10px;
|
||||
font-size: 9px;
|
||||
background: #f44336;
|
||||
color: #FFFFFF;
|
||||
min-width: 20px;
|
||||
padding: 0px 5px;
|
||||
height: 20px;
|
||||
border-radius: 10px;
|
||||
text-align: center;
|
||||
line-height: 19px;
|
||||
vertical-align: middle;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar{
|
||||
.navbar-minimize{
|
||||
padding: 3px 0 0 15px;
|
||||
}
|
||||
|
||||
.collapse{
|
||||
.navbar-nav{
|
||||
.nav-item .nav-link{
|
||||
position: relative;
|
||||
padding: 10px 15px;
|
||||
font-weight: $font-weight-default;
|
||||
font-size: $mdb-btn-font-size-base;
|
||||
text-transform: uppercase;
|
||||
border-radius: $border-radius-base;
|
||||
line-height: 20px;
|
||||
margin-left: 5px;
|
||||
color: inherit;
|
||||
|
||||
&:not(.btn-just-icon) .fa{
|
||||
position: relative;
|
||||
top: 2px;
|
||||
margin-top: -4px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
& .material-icons,
|
||||
& .fa{
|
||||
font-size: $font-size-lg;
|
||||
max-width: 24px;
|
||||
margin-top: -1.1em;
|
||||
}
|
||||
|
||||
&:not(.btn) .material-icons{
|
||||
margin-top: -3px;
|
||||
top: 0px;
|
||||
position: relative;
|
||||
margin-right: 3px;
|
||||
}
|
||||
.notification{
|
||||
top: 0px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.off-canvas-sidebar{
|
||||
.navbar{
|
||||
.navbar-collapse{
|
||||
.navbar-nav .nav-item{
|
||||
.nav-link{
|
||||
padding-top: 15px;
|
||||
padding-bottom: 15px;
|
||||
font-weight: 500;
|
||||
font-size: 12px;
|
||||
text-transform: uppercase;
|
||||
border-radius: 3px;
|
||||
color: $white-color;
|
||||
margin: 0 15px;
|
||||
|
||||
&:hover{
|
||||
background: rgba(200, 200, 200, 0.2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.navbar-transparent {
|
||||
padding-top: 25px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
53
staticfiles/assets/scss/material-dashboard/_popover.scss
Normal file
@@ -0,0 +1,53 @@
|
||||
.popover, .tooltip-inner {
|
||||
line-height: 1.5em;
|
||||
background: $white-color;
|
||||
border: none;
|
||||
border-radius: $border-radius-base;
|
||||
@include shadow-8dp();
|
||||
color: $popover-color;
|
||||
}
|
||||
|
||||
|
||||
.popover{
|
||||
padding: 0;
|
||||
@include shadow-16dp();
|
||||
|
||||
&.left,
|
||||
&.right,
|
||||
&.top,
|
||||
&.bottom{
|
||||
> .arrow{
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
&.bs-popover-top,
|
||||
&.bs-popover-auto[x-placement^="top"],
|
||||
&.bs-popover-bottom,
|
||||
&.bs-popover-auto[x-placement^="bottom"],
|
||||
&.bs-popover-right,
|
||||
&.bs-popover-auto[x-placement^="right"],
|
||||
&.bs-popover-left,
|
||||
&.bs-popover-auto[x-placement^="left"]{
|
||||
& .arrow::before{
|
||||
border: 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.popover-header{
|
||||
background-color: $white-color;
|
||||
border: none;
|
||||
padding: 15px 15px 5px;
|
||||
font-size: $font-size-h4;
|
||||
margin: 0;
|
||||
color: $popover-color;
|
||||
}
|
||||
|
||||
.popover-body{
|
||||
padding: 10px 15px 15px;
|
||||
line-height: 1.4;
|
||||
color: $popover-color;
|
||||
}
|
||||
85
staticfiles/assets/scss/material-dashboard/_popups.scss
Normal file
@@ -0,0 +1,85 @@
|
||||
.popover{
|
||||
font-size: $font-size-base;
|
||||
box-shadow: 0px 10px 50px 0px rgba(0, 0, 0, 0.2);
|
||||
border: none;
|
||||
line-height: 1.7;
|
||||
max-width: 240px;
|
||||
|
||||
&.bs-popover-top .arrow:before,
|
||||
&.bs-popover-left .arrow:before,
|
||||
&.bs-popover-right .arrow:before,
|
||||
&.bs-popover-bottom .arrow:before,{
|
||||
border-top-color: transparent;
|
||||
border-left-color: transparent;
|
||||
border-right-color: transparent;
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
|
||||
.popover-header{
|
||||
color: $default-color-opacity;
|
||||
font-size: $font-size-base;
|
||||
text-transform: capitalize;
|
||||
font-weight: $font-weight-semi;
|
||||
margin: 0;
|
||||
margin-top: 5px;
|
||||
border: none;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
&:before{
|
||||
display: none;
|
||||
}
|
||||
|
||||
&.bs-tether-element-attached-top:after{
|
||||
border-bottom-color:$white-color;
|
||||
top: -9px;
|
||||
}
|
||||
|
||||
&.popover-primary{
|
||||
@include popover-color($primary-color, $white-color);
|
||||
}
|
||||
|
||||
&.popover-info{
|
||||
@include popover-color($info-color, $white-color);
|
||||
}
|
||||
|
||||
&.popover-warning{
|
||||
@include popover-color($warning-color, $white-color);
|
||||
}
|
||||
|
||||
&.popover-danger{
|
||||
@include popover-color($danger-color, $white-color);
|
||||
}
|
||||
|
||||
&.popover-success{
|
||||
@include popover-color($success-color, $white-color);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.tooltip{
|
||||
&.bs-tooltip-right .arrow:before{
|
||||
border-right-color:$white-color;
|
||||
}
|
||||
|
||||
&.bs-tooltip-top .arrow:before{
|
||||
border-top-color:$white-color;
|
||||
}
|
||||
|
||||
&.bs-tooltip-bottom .arrow:before{
|
||||
border-bottom-color:$white-color;
|
||||
}
|
||||
|
||||
&.bs-tooltip-left .arrow:before{
|
||||
border-left-color:$white-color;
|
||||
}
|
||||
}
|
||||
|
||||
.tooltip-inner{
|
||||
padding: $padding-base-vertical $padding-base-horizontal;
|
||||
min-width: 130px;
|
||||
background-color: $white-color;
|
||||
font-size: $font-size-base;
|
||||
color: inherit;
|
||||
box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
187
staticfiles/assets/scss/material-dashboard/_radios.scss
Normal file
@@ -0,0 +1,187 @@
|
||||
|
||||
@mixin radio-color($color, $opacity){
|
||||
& ~ .check,
|
||||
& ~ .circle {
|
||||
opacity: $opacity;
|
||||
}
|
||||
|
||||
& ~ .check {
|
||||
background-color: $color;
|
||||
}
|
||||
|
||||
& ~ .circle {
|
||||
border-color: $color;
|
||||
}
|
||||
}
|
||||
|
||||
.form-check{
|
||||
.form-check-label {
|
||||
cursor: pointer;
|
||||
padding-left: 25px;
|
||||
position: relative;
|
||||
@include mdb-label-color-toggle-focus();
|
||||
|
||||
span {
|
||||
display: block;
|
||||
position: absolute;
|
||||
left: -1px;
|
||||
top: -1px;
|
||||
transition-duration: 0.2s;
|
||||
}
|
||||
.circle {
|
||||
border: 1px solid $mdb-radio-color-off;
|
||||
height: 15px;
|
||||
width: 15px;
|
||||
border-radius: 100%;
|
||||
top: 1px;
|
||||
|
||||
.check {
|
||||
height: 15px;
|
||||
width: 15px;
|
||||
border-radius: 100%;
|
||||
background-color: $mdb-radio-color-on;
|
||||
@include transform-scale3d(unquote('0,0,0'));
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.form-check-input {
|
||||
opacity: 0;
|
||||
height: 0;
|
||||
width: 0;
|
||||
overflow: hidden;
|
||||
|
||||
|
||||
&:checked {
|
||||
@include radio-color($mdb-radio-color-on, 1);
|
||||
|
||||
.check:before {
|
||||
animation: checkboxOn .5s forwards;
|
||||
}
|
||||
}
|
||||
&:checked ~ .circle .check {
|
||||
@include transform-scale3d(unquote('0.65, 0.65, 1'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.form-check-input[disabled] {
|
||||
|
||||
// light theme spec: Disabled: #000000, Opacity 26%
|
||||
@include radio-color($black, 0.26);
|
||||
|
||||
& + .circle .check{
|
||||
background-color: $black;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.form-check-sign{
|
||||
vertical-align: middle;
|
||||
position: relative;
|
||||
top: -2px;
|
||||
float: left;
|
||||
padding-right: 10px;
|
||||
display: inline-block;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.form-check {
|
||||
.form-check-label {
|
||||
.circle {
|
||||
&:before {
|
||||
display: block;
|
||||
position: absolute;
|
||||
left: -1px;
|
||||
content: "";
|
||||
background-color: rgba(0, 0, 0, 0.84);
|
||||
height: 15px;
|
||||
width: 15px;
|
||||
border-radius: 100%;
|
||||
z-index: 1;
|
||||
opacity: 0;
|
||||
margin: 0;
|
||||
top: -1px;
|
||||
-webkit-transform: scale3d(2.3,2.3,1);
|
||||
-moz-transform: scale3d(2.3,2.3,1);
|
||||
-o-transform: scale3d(2.3,2.3,1);
|
||||
-ms-transform: scale3d(2.3,2.3,1);
|
||||
transform: scale3d(2.3,2.3,1);
|
||||
}
|
||||
}
|
||||
|
||||
.form-check-input:checked + .circle:before {
|
||||
animation: rippleOn .5s;
|
||||
}
|
||||
|
||||
.form-check-input:checked + .circle .check:before {
|
||||
color: #FFFFFF;
|
||||
box-shadow: 0 0 0 10px, 10px -10px 0 10px, 32px 0 0 20px, 0px 32px 0 20px, -5px 5px 0 10px, 20px -12px 0 11px;
|
||||
animation: checkboxOn 0.3s forwards;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.form-check + .form-check {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
@keyframes checkboxOn {
|
||||
0% {
|
||||
box-shadow:
|
||||
0 0 0 10px,
|
||||
10px -10px 0 10px,
|
||||
32px 0 0 20px,
|
||||
0px 32px 0 20px,
|
||||
-5px 5px 0 10px,
|
||||
15px 2px 0 11px;
|
||||
}
|
||||
50% {
|
||||
box-shadow:
|
||||
0 0 0 10px,
|
||||
10px -10px 0 10px,
|
||||
32px 0 0 20px,
|
||||
0px 32px 0 20px,
|
||||
-5px 5px 0 10px,
|
||||
20px 2px 0 11px;
|
||||
}
|
||||
100% {
|
||||
box-shadow:
|
||||
0 0 0 10px,
|
||||
10px -10px 0 10px,
|
||||
32px 0 0 20px,
|
||||
0px 32px 0 20px,
|
||||
-5px 5px 0 10px,
|
||||
20px -12px 0 11px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@keyframes rippleOn {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
50% {
|
||||
opacity: 0.2;
|
||||
}
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes rippleOff {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
50% {
|
||||
opacity: 0.2;
|
||||
}
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
856
staticfiles/assets/scss/material-dashboard/_responsive.scss
Normal file
@@ -0,0 +1,856 @@
|
||||
@media all and (max-width: 991px) {
|
||||
[class*="navbar-expand-"] > .container,
|
||||
[class*="navbar-expand-"] > .container-fluid{
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
.navbar .navbar-collapse .navbar-nav > li.button-container{
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn) {
|
||||
width: -webkit-fill-available !important;
|
||||
|
||||
.dropdown-menu.show {
|
||||
min-width: auto;
|
||||
left: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.carousel .card .card-body{
|
||||
max-width: 340px;
|
||||
margin: 0 auto;
|
||||
min-height: 400px;
|
||||
}
|
||||
|
||||
.navbar-collapse{
|
||||
position: fixed;
|
||||
display: block;
|
||||
top: 0px;
|
||||
height: 100vh;
|
||||
width: 230px;
|
||||
right: 0;
|
||||
margin-right: 0 !important;
|
||||
z-index: 1032;
|
||||
visibility: visible;
|
||||
background-color: #999;
|
||||
overflow-y: visible;
|
||||
border-top: none;
|
||||
text-align: left;
|
||||
padding-right: 0;
|
||||
padding-left: 0;
|
||||
|
||||
max-height: none !important;
|
||||
|
||||
@include transform-translate-x(230px);
|
||||
@include transitions (0.50s, cubic-bezier(0.685, 0.0473, 0.346, 1));
|
||||
|
||||
&::after{
|
||||
top: 0;
|
||||
left: 0;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
background-color: $white-color;
|
||||
display: block;
|
||||
content: "";
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.dropdown-toggle:after{
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.navbar-nav{
|
||||
position: relative;
|
||||
z-index: 3;
|
||||
|
||||
.nav-item{
|
||||
.nav-link{
|
||||
color: $black-color;
|
||||
margin: 5px 15px;
|
||||
}
|
||||
|
||||
&.button-container .nav-link{
|
||||
margin: 15px;
|
||||
}
|
||||
|
||||
&:after{
|
||||
width: calc(100% - 30px);
|
||||
content: "";
|
||||
display: block;
|
||||
height: 1px;
|
||||
margin-left: 15px;
|
||||
// background-color: #e5e5e5;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
&:after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.nav-open &{
|
||||
@include transform-translate-x(0px);
|
||||
}
|
||||
}
|
||||
|
||||
.nav-open{
|
||||
.navbar-translate{
|
||||
@include transform-translate-x(-230px);
|
||||
}
|
||||
}
|
||||
|
||||
.navbar{
|
||||
.navbar-translate{
|
||||
width: 100%;
|
||||
position: relative;
|
||||
display: flex;
|
||||
-ms-flex-pack: justify !important;
|
||||
justify-content: space-between !important;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
@include transitions-property (transform, 0.50s, cubic-bezier(0.685, 0.0473, 0.346, 1));
|
||||
}
|
||||
|
||||
.dropdown.show .dropdown-menu{
|
||||
display: block;
|
||||
}
|
||||
|
||||
.dropdown .dropdown-menu{
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dropdown-menu{
|
||||
.dropdown-item{
|
||||
margin-left: 1.5rem;
|
||||
margin-right: 1.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown.show .dropdown-menu,
|
||||
.dropdown .dropdown-menu{
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
padding-bottom: 15px;
|
||||
transition: none;
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
transform: none !important;
|
||||
width: auto;
|
||||
margin-bottom: 15px;
|
||||
padding-top: 0;
|
||||
height: 300px;
|
||||
animation: none;
|
||||
opacity: 1;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar.navbar-transparent{
|
||||
.navbar-toggler{
|
||||
.navbar-toggler-icon{
|
||||
background-color: $white-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#bodyClick {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: fixed;
|
||||
opacity: 0;
|
||||
top: 0;
|
||||
left: auto;
|
||||
right: 230px;
|
||||
content: "";
|
||||
z-index: 1029;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
// for demo
|
||||
#navbar .navbar-collapse,
|
||||
#navigation .navbar-collapse{
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
// multilevel dropdown-menu
|
||||
|
||||
.dropdown-menu.show {
|
||||
.dropdown-item.open + .dropdown-menu.show {
|
||||
right: 101% !important;
|
||||
|
||||
.dropdown-item.open + .dropdown-menu,
|
||||
.dropdown-item.open + .dropdown-menu.show,{
|
||||
left: -165px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (min-width: 991px) {
|
||||
.navbar .navbar-nav{
|
||||
align-items: center;
|
||||
|
||||
.button-container{
|
||||
margin-left: 0.1875px;
|
||||
}
|
||||
}
|
||||
.sidebar .navbar-form {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 991px) {
|
||||
.presentation-page {
|
||||
.section-components {
|
||||
.components-macbook {
|
||||
max-width: 850px !important;
|
||||
max-height: 480px !important;
|
||||
margin-top: 12vh;
|
||||
left: -12px;
|
||||
}
|
||||
.coloured-card-img,
|
||||
.table-img {
|
||||
display: none;
|
||||
}
|
||||
.social-img {
|
||||
left: 47%;
|
||||
top: 37%;
|
||||
}
|
||||
.pin-btn-img {
|
||||
top: 54%;
|
||||
}
|
||||
.share-btn-img {
|
||||
top: 12%;
|
||||
}
|
||||
.coloured-card-btn-img {
|
||||
top: -2%;
|
||||
left: 65%;
|
||||
}
|
||||
}
|
||||
.section-content {
|
||||
.area-img {
|
||||
max-width: 130px;
|
||||
max-height: 170px;
|
||||
}
|
||||
.info-img {
|
||||
max-width: 170px;
|
||||
max-height: 120px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 767px) {
|
||||
.presentation-page {
|
||||
.section-components {
|
||||
.components-macbook {
|
||||
max-width: 350px !important;
|
||||
max-height: 250px !important;
|
||||
margin-top: 12vh;
|
||||
left: -12px;
|
||||
}
|
||||
.coloured-card-img,
|
||||
.table-img {
|
||||
display: none;
|
||||
}
|
||||
.social-img {
|
||||
left: -7%;
|
||||
top: 37%;
|
||||
}
|
||||
.pin-btn-img {
|
||||
top: 54%;
|
||||
}
|
||||
.share-btn-img {
|
||||
top: 7%;
|
||||
}
|
||||
.coloured-card-btn-img {
|
||||
top: -2%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.login-page {
|
||||
.container {
|
||||
padding-top: 100px !important;
|
||||
}
|
||||
}
|
||||
|
||||
.presentation-page,
|
||||
.index-page,
|
||||
.section-page{
|
||||
#cd-vertical-nav{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.index-page{
|
||||
.cd-section{
|
||||
.tim-typo .tim-note{
|
||||
width: 60px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 400px){
|
||||
.cd-vertical-nav{
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Changes for small display */
|
||||
|
||||
@media (max-width: 991px){
|
||||
|
||||
.form-group{
|
||||
textarea{
|
||||
padding-top: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
.nav-open .menu-on-left .main-panel{
|
||||
position: initial;
|
||||
}
|
||||
|
||||
html,
|
||||
body{
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.menu-on-left{
|
||||
.nav-open &{
|
||||
.main-panel,
|
||||
.wrapper-full-page,
|
||||
.navbar-fixed > div{
|
||||
@include transform-translate-x(260px);
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar,
|
||||
.off-canvas-sidebar{
|
||||
left: 0;
|
||||
right: auto;
|
||||
@include transform-translate-x(-260px);
|
||||
}
|
||||
|
||||
.close-layer{
|
||||
left: auto;
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.timeline{
|
||||
&:before{
|
||||
left: 5%;
|
||||
}
|
||||
|
||||
> li > .timeline-badge{
|
||||
left: 5%;
|
||||
}
|
||||
|
||||
> li > .timeline-panel{
|
||||
float: right;
|
||||
width: 86%;
|
||||
|
||||
&:before{
|
||||
border-left-width: 0;
|
||||
border-right-width: 15px;
|
||||
left: -15px;
|
||||
right: auto;
|
||||
}
|
||||
|
||||
&:after{
|
||||
border-left-width: 0;
|
||||
border-right-width: 14px;
|
||||
left: -14px;
|
||||
right: auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.nav-mobile-menu{
|
||||
.dropdown .dropdown-menu{
|
||||
display: none;
|
||||
position: static !important;
|
||||
background-color: transparent;
|
||||
width: auto;
|
||||
float: none;
|
||||
box-shadow: none;
|
||||
|
||||
&.showing{
|
||||
animation: initial;
|
||||
animation-duration: 0s;
|
||||
}
|
||||
|
||||
&.hiding{
|
||||
transform: none;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown.show .dropdown-menu{
|
||||
display: block;
|
||||
}
|
||||
|
||||
li.active > a{
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.navbar-minimize {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.card .form-horizontal {
|
||||
.label-on-left,
|
||||
.label-on-right{
|
||||
padding-left:15px;
|
||||
padding-top: 8px;
|
||||
}
|
||||
|
||||
.form-group{
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
.checkbox-radios{
|
||||
padding-bottom: 15px;
|
||||
|
||||
.checkbox:first-child,
|
||||
.radio:first-child{
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.checkbox-inline{
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
.sidebar{
|
||||
display: none;
|
||||
box-shadow: none;
|
||||
|
||||
.sidebar-wrapper{
|
||||
padding-bottom: 60px;
|
||||
}
|
||||
|
||||
.nav-mobile-menu{
|
||||
margin-top: 0;
|
||||
|
||||
.notification{
|
||||
float: left;
|
||||
line-height: 30px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.open .dropdown-menu {
|
||||
position: static;
|
||||
float: none;
|
||||
width: auto;
|
||||
margin-top: 0;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.main-panel{
|
||||
width: 100%;
|
||||
}
|
||||
.navbar-transparent{
|
||||
padding-top: 15px;
|
||||
background-color: rgba(0, 0, 0, 0.45);
|
||||
}
|
||||
body {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.nav-open{
|
||||
.main-panel,
|
||||
.wrapper-full-page,
|
||||
.navbar .container .navbar-toggler,
|
||||
.navbar .container .navbar-wrapper,
|
||||
.navbar .container{
|
||||
left: 0;
|
||||
@include transform-translate-x(-260px);
|
||||
}
|
||||
|
||||
.sidebar{
|
||||
@include shadow-big();
|
||||
}
|
||||
|
||||
.off-canvas-sidebar .navbar-collapse,
|
||||
.sidebar{
|
||||
@include transform-translate-x(0);
|
||||
}
|
||||
}
|
||||
|
||||
.wrapper-full-page,
|
||||
.navbar .container .navbar-toggler,
|
||||
.navbar .container .navbar-wrapper,
|
||||
.navbar .container{
|
||||
@include transform-translate-x(0px);
|
||||
@include transitions (0.33s, cubic-bezier(0.685, 0.0473, 0.346, 1));
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.off-canvas-sidebar .navbar .container{
|
||||
transform: none;
|
||||
}
|
||||
|
||||
|
||||
.main-panel,
|
||||
.navbar-collapse{
|
||||
@include transitions (0.33s, cubic-bezier(0.685, 0.0473, 0.346, 1));
|
||||
}
|
||||
|
||||
.navbar .navbar-collapse.collapse,
|
||||
.navbar .navbar-collapse.collapse.in,
|
||||
.navbar .navbar-collapse.collapsing{
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.off-canvas-sidebar .navbar .navbar-collapse.collapse,
|
||||
.off-canvas-sidebar .navbar .navbar-collapse.collapse.in,
|
||||
.off-canvas-sidebar .navbar .navbar-collapse.collapsing{
|
||||
display: block !important;
|
||||
}
|
||||
|
||||
.navbar-nav > li{
|
||||
float: none;
|
||||
position: relative;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.off-canvas-sidebar nav .navbar-collapse{
|
||||
margin: 0;
|
||||
|
||||
> ul {
|
||||
margin-top: 19px;
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar,
|
||||
.off-canvas-sidebar nav .navbar-collapse{
|
||||
position: fixed;
|
||||
display: block;
|
||||
top: 0;
|
||||
height: 100vh;
|
||||
width: 260px;
|
||||
right: 0;
|
||||
left: auto;
|
||||
z-index: 1032;
|
||||
visibility: visible;
|
||||
background-color: #9A9A9A;
|
||||
overflow-y: visible;
|
||||
border-top: none;
|
||||
text-align: left;
|
||||
padding-right: 0px;
|
||||
padding-left: 0;
|
||||
|
||||
@include transform-translate-x(260px);
|
||||
@include transitions (0.33s, cubic-bezier(0.685, 0.0473, 0.346, 1));
|
||||
> ul {
|
||||
position: relative;
|
||||
z-index: 4;
|
||||
width: 100%;
|
||||
}
|
||||
&::before{
|
||||
top: 0;
|
||||
left: 0;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
background-color: #282828;
|
||||
display: block;
|
||||
content: "";
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.logo{
|
||||
position: relative;
|
||||
z-index: 4;
|
||||
}
|
||||
|
||||
.navbar-form{
|
||||
margin: 10px 0px;
|
||||
float: none !important;
|
||||
padding-top: 1px;
|
||||
padding-bottom: 1px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.table-responsive {
|
||||
width: 100%;
|
||||
margin-bottom: 15px;
|
||||
overflow-x: scroll;
|
||||
overflow-y: hidden;
|
||||
-ms-overflow-style: -ms-autohiding-scrollbar;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
}
|
||||
|
||||
.form-group{
|
||||
|
||||
&.form-search{
|
||||
.form-control{
|
||||
font-size: 1.7em;
|
||||
height: 37px;
|
||||
width: 78%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-form{
|
||||
.btn{
|
||||
position: absolute;
|
||||
top: -5px;
|
||||
right: -50px;
|
||||
}
|
||||
}
|
||||
|
||||
.close-layer{
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
opacity: 0;
|
||||
top: 0;
|
||||
left: auto;
|
||||
background: rgba(0, 0, 0, 0.35);
|
||||
content: "";
|
||||
z-index: 9999;
|
||||
overflow-x: hidden;
|
||||
|
||||
@include transitions($slow-transition-time, $transition-ease-in);
|
||||
|
||||
&.visible{
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-toggler .icon-bar {
|
||||
display: block;
|
||||
position: relative;
|
||||
background: #555 !important;
|
||||
width: 24px;
|
||||
height: 2px;
|
||||
border-radius: 1px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.navbar-header .navbar-toggler {
|
||||
padding: 15px;
|
||||
margin-top: 4px;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
.bar1,
|
||||
.bar2,
|
||||
.bar3 {
|
||||
outline: 1px solid transparent;
|
||||
}
|
||||
|
||||
@include topbar-x-rotation();
|
||||
@include topbar-back-rotation();
|
||||
@include bottombar-x-rotation();
|
||||
@include bottombar-back-rotation();
|
||||
|
||||
.navbar-toggler{
|
||||
.icon-bar:nth-child(2){
|
||||
top: 0px;
|
||||
@include bar-animation($topbar-back);
|
||||
}
|
||||
.icon-bar:nth-child(3){
|
||||
opacity: 1;
|
||||
}
|
||||
.icon-bar:nth-child(4){
|
||||
bottom: 0px;
|
||||
@include bar-animation($bottombar-back);
|
||||
}
|
||||
|
||||
&.toggled{
|
||||
.icon-bar:nth-child(2){
|
||||
top: 6px;
|
||||
@include bar-animation($topbar-x);
|
||||
}
|
||||
.icon-bar:nth-child(3){
|
||||
opacity: 0;
|
||||
}
|
||||
.icon-bar:nth-child(4){
|
||||
bottom: 6px;
|
||||
@include bar-animation($bottombar-x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes fadeIn {
|
||||
0% {opacity: 0;}
|
||||
100% {opacity: 1;}
|
||||
}
|
||||
@-moz-keyframes fadeIn {
|
||||
0% {opacity: 0;}
|
||||
100% {opacity: 1;}
|
||||
}
|
||||
@keyframes fadeIn {
|
||||
0% {opacity: 0;}
|
||||
100% {opacity: 1;}
|
||||
}
|
||||
|
||||
.dropdown-menu .divider{
|
||||
background-color: rgba(229, 229, 229, 0.15);
|
||||
}
|
||||
|
||||
.navbar-nav {
|
||||
margin: 1px 0;
|
||||
|
||||
.open .dropdown-menu > li {
|
||||
& > a{
|
||||
padding: 15px 15px 5px 50px;
|
||||
}
|
||||
|
||||
&:first-child > a{
|
||||
padding: 5px 15px 5px 50px;
|
||||
}
|
||||
|
||||
&:last-child > a {
|
||||
padding: 15px 15px 25px 50px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[class*="navbar-"] .navbar-nav {
|
||||
& > li > a,
|
||||
> li > a:hover,
|
||||
> li > a:focus,
|
||||
.active > a,
|
||||
.active > a:hover,
|
||||
.active > a:focus,
|
||||
.open .dropdown-menu > li > a,
|
||||
.open .dropdown-menu > li > a:hover,
|
||||
.open .dropdown-menu > li > a:focus,
|
||||
.navbar-nav .open .dropdown-menu > li > a:active {
|
||||
color: white;
|
||||
}
|
||||
|
||||
& > li > a,
|
||||
> li > a:hover,
|
||||
> li > a:focus,
|
||||
.open .dropdown-menu > li > a,
|
||||
.open .dropdown-menu > li > a:hover,
|
||||
.open .dropdown-menu > li > a:focus{
|
||||
opacity: .7;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
&.navbar-nav .open .dropdown-menu > li > a:active {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
& .dropdown > a{
|
||||
&:hover .caret {
|
||||
border-bottom-color: #777;
|
||||
border-top-color: #777;
|
||||
}
|
||||
&:active .caret {
|
||||
border-bottom-color: white;
|
||||
border-top-color: white;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.dropdown-menu {
|
||||
display: none;
|
||||
}
|
||||
.navbar-fixed-top {
|
||||
-webkit-backface-visibility: hidden;
|
||||
}
|
||||
#bodyClick {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: fixed;
|
||||
opacity: 0;
|
||||
top: 0;
|
||||
left: auto;
|
||||
right: 260px;
|
||||
content: "";
|
||||
z-index: 9999;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.social-line .btn{
|
||||
margin: $margin-bottom;
|
||||
}
|
||||
.subscribe-line .form-control{
|
||||
margin: $margin-bottom;
|
||||
}
|
||||
.social-line.pull-right{
|
||||
float: none;
|
||||
}
|
||||
.footer:not(.footer-big) nav > ul li{
|
||||
float: none;
|
||||
}
|
||||
.social-area.pull-right{
|
||||
float: none !important;
|
||||
}
|
||||
.form-control + .form-control-feedback{
|
||||
margin-top: -8px;
|
||||
}
|
||||
.navbar-toggle:hover,.navbar-toggle:focus {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
.media-post .author{
|
||||
width: 20%;
|
||||
float: none !important;
|
||||
display: block;
|
||||
margin: 0 auto 10px;
|
||||
}
|
||||
.media-post .media-body{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.navbar-collapse.collapse{
|
||||
height: 100% !important;
|
||||
}
|
||||
.navbar-collapse.collapse.in {
|
||||
display: block;
|
||||
}
|
||||
.navbar-header .collapse, .navbar-toggle {
|
||||
display:block !important;
|
||||
}
|
||||
.navbar-header {
|
||||
float:none;
|
||||
}
|
||||
.navbar-collapse{
|
||||
.nav p{
|
||||
font-size: $font-size-base;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@media (min-width: 992px) {
|
||||
.main-panel {
|
||||
.navbar .navbar-collapse {
|
||||
.navbar-nav .nav-item .nav-link p {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.nav-mobile-menu,
|
||||
.sidebar .navbar-form{
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
41
staticfiles/assets/scss/material-dashboard/_ripples.scss
Normal file
@@ -0,0 +1,41 @@
|
||||
// marker class (used as a selector for one-off elements to decorate)
|
||||
.ripple {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.ripple-container {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 1;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
pointer-events: none;
|
||||
border-radius: inherit;
|
||||
|
||||
.ripple-decorator {
|
||||
position: absolute;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
margin-top: -10px;
|
||||
margin-left: -10px;
|
||||
pointer-events: none;
|
||||
background-color: rgba($black, 0.05);
|
||||
border-radius: 100%;
|
||||
opacity: 0;
|
||||
transform: scale(1);
|
||||
transform-origin: 50%;
|
||||
|
||||
&.ripple-on {
|
||||
opacity: 0.1;
|
||||
transition: opacity 0.15s ease-in 0s,
|
||||
transform 0.5s cubic-bezier(0.4, 0, 0.2, 1) 0.1s;
|
||||
}
|
||||
|
||||
&.ripple-out {
|
||||
opacity: 0;
|
||||
transition: opacity 0.1s linear 0s !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,493 @@
|
||||
.wrapper{
|
||||
position: relative;
|
||||
top: 0;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: 2;
|
||||
width: 260px;
|
||||
background: $white-color;
|
||||
@include shadow-big();
|
||||
|
||||
.caret{
|
||||
display: inline-block;
|
||||
width: 0;
|
||||
height: 0;
|
||||
margin-left: 2px;
|
||||
vertical-align: middle;
|
||||
border-top: 4px dashed;
|
||||
border-top: 4px solid\9;
|
||||
border-right: 4px solid transparent;
|
||||
border-left: 4px solid transparent;
|
||||
}
|
||||
|
||||
&[data-background-color="black"]{
|
||||
background-color: #191919;
|
||||
}
|
||||
|
||||
.sidebar-wrapper{
|
||||
position: relative;
|
||||
height: calc(100vh - 75px);
|
||||
overflow: auto;
|
||||
width: 260px;
|
||||
z-index: 4;
|
||||
|
||||
padding-bottom: 30px;
|
||||
|
||||
.dropdown .dropdown-backdrop{
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.navbar-form{
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
|
||||
.input-group {
|
||||
font-size: 1.7em;
|
||||
height: 36px;
|
||||
width: 78%;
|
||||
padding-left: 17px;
|
||||
}
|
||||
}
|
||||
|
||||
> .nav,
|
||||
.user .user-info{
|
||||
[data-toggle="collapse"] ~ div > ul > li > a{
|
||||
span{
|
||||
display: inline-block;
|
||||
@extend .animation-transition-general;
|
||||
}
|
||||
|
||||
.sidebar-normal{
|
||||
margin: 0;
|
||||
position: relative;
|
||||
transform: translateX(0px);
|
||||
opacity: 1;
|
||||
white-space: nowrap;
|
||||
display: block;
|
||||
|
||||
}
|
||||
|
||||
.sidebar-mini{
|
||||
text-transform: uppercase;
|
||||
width: 30px;
|
||||
margin-right: 15px;
|
||||
text-align: center;
|
||||
letter-spacing: 1px;
|
||||
position: relative;
|
||||
float: left;
|
||||
display: inherit;
|
||||
}
|
||||
|
||||
i{
|
||||
font-size: 17px;
|
||||
line-height: 20px;
|
||||
width: 26px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.logo-tim{
|
||||
border-radius: 50%;
|
||||
border: 1px solid #333;
|
||||
display: block;
|
||||
height: 61px;
|
||||
width: 61px;
|
||||
float: left;
|
||||
overflow: hidden;
|
||||
|
||||
img{
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
}
|
||||
|
||||
.nav{
|
||||
margin-top: 20px;
|
||||
display: block;
|
||||
|
||||
.caret{
|
||||
margin-top: 13px;
|
||||
position: absolute;
|
||||
right: 6px;
|
||||
}
|
||||
|
||||
li{
|
||||
> a{
|
||||
&:hover,
|
||||
&:focus{
|
||||
background-color: transparent;
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
|
||||
&:first-child > a{
|
||||
margin: 0 15px;
|
||||
}
|
||||
|
||||
&:hover > a,
|
||||
& .dropdown-menu a:hover,
|
||||
& .dropdown-menu a:focus,
|
||||
&.active > [data-toggle="collapse"]{
|
||||
background-color: rgba(200, 200, 200, 0.2);
|
||||
color: $black-color;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
&.active > [data-toggle="collapse"]{
|
||||
i{
|
||||
color: #a9afbb;
|
||||
}
|
||||
}
|
||||
|
||||
&.active > a,
|
||||
&.active > a i{
|
||||
color: $white-color;
|
||||
}
|
||||
|
||||
&.separator{
|
||||
margin: 15px 0;
|
||||
|
||||
&:after{
|
||||
width: calc(100% - 30px);
|
||||
content: "";
|
||||
position: absolute;
|
||||
height: 1px;
|
||||
left: 15px;
|
||||
background-color: rgba(180,180,180, .3);
|
||||
}
|
||||
|
||||
& + li {
|
||||
margin-top: 31px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
p{
|
||||
margin: 0;
|
||||
line-height: 30px;
|
||||
font-size: 14px;
|
||||
position: relative;
|
||||
display: block;
|
||||
height: auto;
|
||||
white-space: nowrap;
|
||||
@extend .animation-transition-general;
|
||||
}
|
||||
|
||||
i{
|
||||
font-size: 24px;
|
||||
float: left;
|
||||
margin-right: 15px;
|
||||
line-height: 30px;
|
||||
width: 30px;
|
||||
text-align: center;
|
||||
color: #a9afbb;
|
||||
}
|
||||
}
|
||||
|
||||
.nav li a,
|
||||
.nav li .dropdown-menu a{
|
||||
margin: 10px 15px 0;
|
||||
border-radius: $border-radius-base;
|
||||
color: $black-color;
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
text-transform: capitalize;
|
||||
font-size: $font-paragraph - 1;
|
||||
padding: 10px 15px;
|
||||
}
|
||||
|
||||
|
||||
.sidebar-background{
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
display: block;
|
||||
top: 0;
|
||||
left: 0;
|
||||
background-size: cover;
|
||||
background-position: center center;
|
||||
|
||||
&:after{
|
||||
position: absolute;
|
||||
z-index: 3;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
content: "";
|
||||
display: block;
|
||||
background: #FFFFFF;
|
||||
opacity: .93;
|
||||
}
|
||||
}
|
||||
|
||||
.logo{
|
||||
padding: 15px 0px;
|
||||
margin: 0;
|
||||
display: block;
|
||||
position: relative;
|
||||
z-index: 4;
|
||||
|
||||
&:after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 15px;
|
||||
height: 1px;
|
||||
width: calc(100% - 30px);
|
||||
background-color: rgba(180,180,180, .3);
|
||||
|
||||
}
|
||||
|
||||
p{
|
||||
float: left;
|
||||
font-size: 20px;
|
||||
margin: 10px 10px;
|
||||
color: $white-color;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
.simple-text{
|
||||
text-transform: uppercase;
|
||||
padding: $padding-small-vertical $padding-zero;
|
||||
display: inline-block;
|
||||
font-size: 18px;
|
||||
color: $black-color;
|
||||
white-space: nowrap;
|
||||
font-weight: $font-weight-default;
|
||||
line-height: 30px;
|
||||
overflow: hidden;
|
||||
text-align: center;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.logo-tim{
|
||||
border-radius: 50%;
|
||||
border: 1px solid #333;
|
||||
display: block;
|
||||
height: 61px;
|
||||
width: 61px;
|
||||
float: left;
|
||||
overflow: hidden;
|
||||
|
||||
img{
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
&[data-background-color="black"]{
|
||||
@include sidebar-background-color($gray-base, $white-color);
|
||||
|
||||
.nav li .dropdown-menu .dropdown-item{
|
||||
color: $white-color;
|
||||
}
|
||||
}
|
||||
|
||||
&[data-color="purple"]{
|
||||
@include set-background-color-button($brand-primary);
|
||||
}
|
||||
&[data-color="azure"]{
|
||||
@include set-background-color-button($brand-info);
|
||||
}
|
||||
&[data-color="green"]{
|
||||
@include set-background-color-button($brand-success);
|
||||
}
|
||||
&[data-color="orange"]{
|
||||
@include set-background-color-button($brand-warning);
|
||||
}
|
||||
&[data-color="danger"]{
|
||||
@include set-background-color-button($brand-danger);
|
||||
}
|
||||
&[data-color="rose"]{
|
||||
@include set-background-color-button($brand-rose);
|
||||
}
|
||||
|
||||
&[data-color="white"]{
|
||||
@include set-background-color-button($white-color);
|
||||
@include sidebar-active-color($black-color);
|
||||
}
|
||||
|
||||
&[data-background-color="red"]{
|
||||
@include sidebar-background-color($brand-danger, $white-color);
|
||||
|
||||
.user,
|
||||
.logo,
|
||||
.nav li.separator{
|
||||
&:after{
|
||||
background-color: rgba(255,255,255, .3);
|
||||
}
|
||||
}
|
||||
|
||||
.nav{
|
||||
li:hover:not(.active) > a,
|
||||
li.active > [data-toggle="collapse"]{
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&[data-image]:after,
|
||||
&.has-image:after{
|
||||
opacity: .77;
|
||||
}
|
||||
}
|
||||
|
||||
.off-canvas-sidebar .navbar-collapse{
|
||||
.nav {
|
||||
> li > a,
|
||||
> li > a:hover{
|
||||
color: $white-color;
|
||||
margin: 0 15px;
|
||||
}
|
||||
|
||||
> li > a:focus,
|
||||
> li > a:hover{
|
||||
background: rgba(200, 200, 200, 0.2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.main-panel{
|
||||
position: relative;
|
||||
float: right;
|
||||
width: $sidebar-width;
|
||||
@include transition (0.33s, cubic-bezier(0.685, 0.0473, 0.346, 1));
|
||||
|
||||
> .content{
|
||||
margin-top: 70px;
|
||||
padding: 30px 15px;
|
||||
min-height: calc(100vh - 123px);
|
||||
}
|
||||
|
||||
> .footer{
|
||||
border-top: 1px solid #e7e7e7;
|
||||
}
|
||||
|
||||
> .navbar{
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.header{
|
||||
margin-bottom: 30px;
|
||||
|
||||
.title{
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.perfect-scrollbar-on{
|
||||
.sidebar,
|
||||
.main-panel{
|
||||
height: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.sidebar,
|
||||
.main-panel,
|
||||
.sidebar-wrapper{
|
||||
-webkit-transition-property: top,bottom,width;
|
||||
transition-property: top,bottom, width;
|
||||
-webkit-transition-duration: .2s,.2s, .35s;
|
||||
transition-duration: .2s,.2s, .35s;
|
||||
-webkit-transition-timing-function: linear,linear,ease;
|
||||
transition-timing-function: linear,linear,ease;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
.visible-on-sidebar-regular{
|
||||
display: inline-block !important;
|
||||
}
|
||||
.visible-on-sidebar-mini{
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
@media (min-width: 991px) {
|
||||
.sidebar-mini{
|
||||
.visible-on-sidebar-regular{
|
||||
display: none !important;
|
||||
}
|
||||
.visible-on-sidebar-mini{
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
.sidebar,
|
||||
.sidebar .sidebar-wrapper{
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
.main-panel{
|
||||
width: $sidebar-mini-width;
|
||||
}
|
||||
|
||||
.sidebar{
|
||||
display: block;
|
||||
font-weight: 200;
|
||||
z-index: 9999;
|
||||
|
||||
.logo{
|
||||
a.logo-normal{
|
||||
opacity: 0;
|
||||
@include transform-translate-x(-25px);
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar-wrapper{
|
||||
> .nav [data-toggle="collapse"] ~ div > ul > li > a .sidebar-normal,
|
||||
.user .user-info [data-toggle="collapse"] ~ div > ul > li > a .sidebar-normal,
|
||||
.user .user-info > a > span,
|
||||
> .nav li > a p{
|
||||
@include transform-translate-x(-25px);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar:hover{
|
||||
width: 260px;
|
||||
|
||||
.logo{
|
||||
a.logo-normal{
|
||||
opacity: 1;
|
||||
@include transform-translate-x(0px);
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar-wrapper{
|
||||
width: 260px;
|
||||
|
||||
> .nav li > a p,
|
||||
> .nav [data-toggle="collapse"] ~ div > ul > li > a .sidebar-normal,
|
||||
.user .user-info [data-toggle="collapse"] ~ div > ul > li > a .sidebar-normal,
|
||||
.user .user-info > a > span{
|
||||
@include transform-translate-x(0px);
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
.nav .nav-item {
|
||||
&.active-pro {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
bottom: 13px;
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
// style for the social buttons from fixed product_plugins (Twitter and Facebook)
|
||||
|
||||
.btn{
|
||||
// Social colors
|
||||
@include bmd-social-buttons();
|
||||
}
|
||||
204
staticfiles/assets/scss/material-dashboard/_tables.scss
Normal file
@@ -0,0 +1,204 @@
|
||||
.table{
|
||||
> thead > tr > th{
|
||||
border-bottom-width: 1px;
|
||||
font-size: $font-size-h5;
|
||||
font-weight: $font-weight-light;
|
||||
}
|
||||
|
||||
.form-check{
|
||||
margin-top: 0;
|
||||
|
||||
.form-check-sign{
|
||||
top: -13px;
|
||||
left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.radio,
|
||||
.checkbox{
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
padding: 0;
|
||||
width: 15px;
|
||||
|
||||
.icons{
|
||||
position: relative;
|
||||
}
|
||||
}
|
||||
|
||||
.flag {
|
||||
img {
|
||||
max-width: 18px;
|
||||
margin-top: -2px;
|
||||
}
|
||||
}
|
||||
> thead > tr > th,
|
||||
> tbody > tr > th,
|
||||
> tfoot > tr > th,
|
||||
> thead > tr > td,
|
||||
> tbody > tr > td,
|
||||
> tfoot > tr > td{
|
||||
padding: 12px 8px;
|
||||
vertical-align: middle;
|
||||
border-color: #ddd;
|
||||
}
|
||||
|
||||
thead{
|
||||
tr{
|
||||
th{
|
||||
font-size: 1.063rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.th-description{
|
||||
max-width: 150px;
|
||||
}
|
||||
.td-price{
|
||||
font-size: 26px;
|
||||
font-weight: $font-weight-light;
|
||||
margin-top: 5px;
|
||||
text-align: right;
|
||||
}
|
||||
.td-total{
|
||||
font-weight: $font-weight-bold;
|
||||
font-size: $font-size-h5;
|
||||
padding-top: 20px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.td-actions .btn{
|
||||
margin: 0px;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
> tbody > tr{
|
||||
position: relative;
|
||||
}
|
||||
}
|
||||
|
||||
.table-shopping{
|
||||
> thead > tr > th{
|
||||
font-size: $font-size-h6;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
> tbody > tr > td{
|
||||
font-size: $font-paragraph;
|
||||
|
||||
b{
|
||||
display: block;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
}
|
||||
.td-name{
|
||||
font-weight: $font-weight-default;
|
||||
font-size: 1.5em;
|
||||
line-height: 1.42857143;
|
||||
|
||||
small{
|
||||
color: $gray-light;
|
||||
font-size: 0.75em;
|
||||
font-weight: $font-weight-light;
|
||||
}
|
||||
}
|
||||
.td-number{
|
||||
font-weight: $font-weight-light;
|
||||
font-size: $font-size-h4;
|
||||
}
|
||||
.td-name{
|
||||
min-width: 200px;
|
||||
}
|
||||
.td-number{
|
||||
text-align: right;
|
||||
min-width: 150px;
|
||||
|
||||
small{
|
||||
margin-right: 3px;
|
||||
}
|
||||
}
|
||||
|
||||
.img-container{
|
||||
width: 120px;
|
||||
max-height: 160px;
|
||||
overflow: hidden;
|
||||
display: block;
|
||||
|
||||
img{
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// BS4 has not yet converted the following to variables - keep an eye on it and move to variables when possible.
|
||||
.thead-inverse {
|
||||
th {
|
||||
//color: $bmd-inverse; // #fff;
|
||||
//background-color: $gray-dark;
|
||||
}
|
||||
}
|
||||
.thead-default {
|
||||
th {
|
||||
//color: $gray;
|
||||
//background-color: $bmd-inverse-lighter; //$gray-lighter;
|
||||
}
|
||||
}
|
||||
|
||||
.table-inverse {
|
||||
color: $bmd-inverse-light; //$gray-lighter;
|
||||
//background-color: $gray-dark;
|
||||
|
||||
//th,
|
||||
//td,
|
||||
//thead th {
|
||||
// border-color: $gray;
|
||||
//}
|
||||
}
|
||||
|
||||
.table {
|
||||
thead th {
|
||||
font-size: $bmd-table-header-font-size;
|
||||
font-weight: 500;
|
||||
|
||||
border-top-width: 0;
|
||||
border-bottom-width: $table-border-width;
|
||||
}
|
||||
}
|
||||
|
||||
thead.thead-inverse,
|
||||
// needs specificity
|
||||
.table-inverse thead {
|
||||
th {
|
||||
color: $bmd-inverse-lighter;
|
||||
}
|
||||
}
|
||||
|
||||
.table-inverse {
|
||||
th,
|
||||
td,
|
||||
thead th {
|
||||
border-color: $bmd-table-border-color-inverse;
|
||||
}
|
||||
}
|
||||
|
||||
.table-striped>tbody>tr:nth-of-type(odd){
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
|
||||
.table.table-hover tbody tr:hover{
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
.dataTable {
|
||||
> thead > tr > th,
|
||||
> tbody > tr > th,
|
||||
> tfoot > tr > th,
|
||||
> thead > tr > td,
|
||||
> tbody > tr > td,
|
||||
> tfoot > tr > td{
|
||||
padding: 5px !important;
|
||||
}
|
||||
}
|
||||
84
staticfiles/assets/scss/material-dashboard/_tabs.scss
Normal file
@@ -0,0 +1,84 @@
|
||||
|
||||
.nav-tabs {
|
||||
border: 0;
|
||||
border-radius: $border-radius-base;
|
||||
padding: 0 15px;
|
||||
|
||||
.nav-item {
|
||||
.nav-link {
|
||||
position: relative;
|
||||
color: $white-color;
|
||||
border: 0;
|
||||
margin: 0;
|
||||
border-radius: $border-radius-base;
|
||||
line-height: $mdb-btn-font-size-base * 2;
|
||||
text-transform: uppercase;
|
||||
font-size: $mdb-btn-font-size-base;
|
||||
padding: 10px 15px;
|
||||
background-color: transparent;
|
||||
transition: 0.3s background-color 0s;
|
||||
|
||||
&:hover {
|
||||
border: 0;
|
||||
}
|
||||
}
|
||||
.nav-link,
|
||||
.nav-link:hover,
|
||||
.nav-link:focus {
|
||||
border: 0 !important;
|
||||
color: $white-color !important;
|
||||
font-weight: $font-weight-bold;
|
||||
}
|
||||
&.disabled .nav-link,
|
||||
&.disabled .nav-link:hover {
|
||||
color: rgba(255,255,255,0.5);
|
||||
}
|
||||
|
||||
.material-icons{
|
||||
margin: -1px 5px 0 0;
|
||||
}
|
||||
|
||||
.nav-link.active{
|
||||
background-color: rgba(255,255,255, .2);
|
||||
transition: 0.3s background-color 0.2s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.nav-tabs {
|
||||
.nav-link {
|
||||
border-bottom: $bmd-nav-tabs-border-size solid transparent;
|
||||
}
|
||||
|
||||
// colors
|
||||
@include bmd-tabs-color($bmd-nav-tabs-color, $bmd-nav-tabs-active-color, $bmd-nav-tabs-active-border-color, $bmd-nav-tabs-disabled-link-color, $bmd-nav-tabs-disabled-link-color-hover);
|
||||
|
||||
&.header-primary {
|
||||
@include bmd-tabs-color($bmd-nav-tabs-primary-color, $bmd-nav-tabs-primary-active-color, $bmd-nav-tabs-primary-active-border-color, $bmd-nav-tabs-primary-disabled-link-color, $bmd-nav-tabs-primary-disabled-link-color-hover);
|
||||
}
|
||||
|
||||
&.bg-inverse {
|
||||
@include bmd-tabs-color($bmd-nav-tabs-inverse-color, $bmd-nav-tabs-inverse-active-color, $bmd-nav-tabs-inverse-active-border-color, $bmd-nav-tabs-inverse-disabled-link-color, $bmd-nav-tabs-inverse-disabled-link-color-hover);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
.card-nav-tabs{
|
||||
margin-top: 45px;
|
||||
|
||||
.card-header{
|
||||
margin-top: -30px !important;
|
||||
}
|
||||
}
|
||||
|
||||
.tab-content .tab-pane .td-actions{
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.card .tab-content .form-check{
|
||||
margin-top: 6px;
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
.togglebutton {
|
||||
vertical-align: middle;
|
||||
&, label, input, .toggle {
|
||||
user-select: none;
|
||||
}
|
||||
label {
|
||||
cursor: pointer;
|
||||
color: $mdb-toggle-label-color;
|
||||
@include mdb-label-color-toggle-focus();
|
||||
|
||||
// Hide original checkbox
|
||||
input[type=checkbox] {
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.toggle {
|
||||
text-align: left; // Issue #737 horizontal form
|
||||
margin-left: 5px;
|
||||
}
|
||||
// Switch bg off and disabled
|
||||
.toggle,
|
||||
input[type=checkbox][disabled] + .toggle {
|
||||
content: "";
|
||||
display: inline-block;
|
||||
width: 30px;
|
||||
height: 15px;
|
||||
background-color: rgba(80, 80, 80, 0.7);
|
||||
border-radius: 15px;
|
||||
margin-right: 15px;
|
||||
transition: background 0.3s ease;
|
||||
vertical-align: middle;
|
||||
}
|
||||
// Handle off
|
||||
.toggle:after {
|
||||
content: "";
|
||||
display: inline-block;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background-color: #FFFFFF;
|
||||
border-radius: 20px;
|
||||
position: relative;
|
||||
box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4);
|
||||
left: -5px;
|
||||
top: -2.5px;
|
||||
border: 1px solid $mdb-checkbox-border-color;
|
||||
transition: left 0.3s ease, background 0.3s ease, box-shadow 0.1s ease;
|
||||
}
|
||||
input[type=checkbox] {
|
||||
// Handle disabled
|
||||
&[disabled] {
|
||||
& + .toggle:after,
|
||||
&:checked + .toggle:after {
|
||||
background-color: #BDBDBD;
|
||||
}
|
||||
}
|
||||
|
||||
& + .toggle:active:after,
|
||||
&[disabled] + .toggle:active:after {
|
||||
box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
// Ripple off and disabled
|
||||
&:checked + .toggle:after {
|
||||
left: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
// set bg when checked
|
||||
input[type=checkbox]:checked {
|
||||
+ .toggle {
|
||||
background-color: rgba($brand-primary, (70/100)); // Switch bg on
|
||||
}
|
||||
|
||||
+ .toggle:after {
|
||||
border-color: $brand-primary; // Handle on
|
||||
}
|
||||
|
||||
+ .toggle:active:after {
|
||||
box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba($brand-primary, (10/100)); // Ripple on
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
49
staticfiles/assets/scss/material-dashboard/_tooltip.scss
Normal file
@@ -0,0 +1,49 @@
|
||||
// specs https://material.google.com/components/tooltips.html#tooltips-tooltips-desktop-
|
||||
|
||||
.tooltip-arrow {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.tooltip.show{
|
||||
opacity: 1;
|
||||
@include transform-translate-y(0px);
|
||||
|
||||
|
||||
}
|
||||
.tooltip{
|
||||
opacity: 0;
|
||||
transition: opacity, transform .2s ease;
|
||||
@include transform-translate-y(5px);
|
||||
font-size: $tooltip-font-size;
|
||||
|
||||
&.bs-tooltip-top,
|
||||
&.bs-tooltip-auto[x-placement^="top"]{
|
||||
& .arrow::before{
|
||||
border-top-color: $white-color;
|
||||
}
|
||||
}
|
||||
|
||||
&.bs-tooltip-right,
|
||||
&.bs-tooltip-auto[x-placement^="right"]{
|
||||
& .arrow::before{
|
||||
border-right-color: $white-color;
|
||||
}
|
||||
}
|
||||
&.bs-tooltip-left,
|
||||
&.bs-tooltip-auto[x-placement^="left"]{
|
||||
& .arrow::before{
|
||||
border-left-color: $white-color;
|
||||
}
|
||||
}
|
||||
&.bs-tooltip-bottom,
|
||||
&.bs-tooltip-auto[x-placement^="bottom"]{
|
||||
& .arrow::before{
|
||||
border-bottom-color: $white-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tooltip-inner{
|
||||
padding: 10px 15px;
|
||||
min-width: 130px;
|
||||
}
|
||||
92
staticfiles/assets/scss/material-dashboard/_type.scss
Normal file
@@ -0,0 +1,92 @@
|
||||
html * {
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
body, h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4 {
|
||||
font-family: $font-family-sans-serif;
|
||||
font-weight: 300;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
|
||||
h1, .h1 {
|
||||
font-size: $font-size-h1;
|
||||
line-height: 1.15em;
|
||||
}
|
||||
h2, .h2{
|
||||
font-size: $font-size-h2;
|
||||
}
|
||||
h3, .h3{
|
||||
font-size: $font-size-h3;
|
||||
line-height: 1.4em;
|
||||
margin: 20px 0 10px;
|
||||
}
|
||||
h4, .h4{
|
||||
font-size: $font-size-h4;
|
||||
line-height: 1.4em;
|
||||
font-weight: 300;
|
||||
}
|
||||
h5, .h5 {
|
||||
font-size: $font-size-h5;
|
||||
line-height: 1.4em;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
h6, .h6{
|
||||
font-size: $font-size-h6;
|
||||
text-transform: uppercase;
|
||||
font-weight: $font-weight-bold;
|
||||
}
|
||||
|
||||
.title,
|
||||
.card-title,
|
||||
.info-title,
|
||||
.footer-brand,
|
||||
.footer-big h5,
|
||||
.footer-big h4,
|
||||
.media .media-heading{
|
||||
//font-weight: $font-weight-extra-bold;
|
||||
// font-family: $font-family-serif;
|
||||
|
||||
&,
|
||||
a{
|
||||
color: $black-color;
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
|
||||
.card-blog .card-title{
|
||||
font-weight: $font-weight-extra-bold;
|
||||
}
|
||||
|
||||
h2.title{
|
||||
margin-bottom: $margin-base * 2;
|
||||
}
|
||||
|
||||
.description,
|
||||
.card-description,
|
||||
.footer-big p{
|
||||
color: $gray-light;
|
||||
}
|
||||
|
||||
.text-warning {
|
||||
color: $brand-warning !important;
|
||||
}
|
||||
.text-primary {
|
||||
color: $brand-primary !important;
|
||||
}
|
||||
.text-danger {
|
||||
color: $brand-danger !important;
|
||||
}
|
||||
.text-success {
|
||||
color: $brand-success !important;
|
||||
}
|
||||
.text-info {
|
||||
color: $brand-info !important;
|
||||
}
|
||||
.text-rose{
|
||||
color: $brand-rose !important;
|
||||
}
|
||||
.text-gray{
|
||||
color: $gray-color !important;
|
||||
}
|
||||
38
staticfiles/assets/scss/material-dashboard/_variables.scss
Normal file
@@ -0,0 +1,38 @@
|
||||
@import "variables/colors";
|
||||
@import "variables/shadow";
|
||||
|
||||
@import "variables/bootstrap-material-design-base";
|
||||
|
||||
// Customized BS variables
|
||||
@import "variables/custom-forms";
|
||||
@import "variables/spacing";
|
||||
@import "variables/body";
|
||||
@import "variables/brand";
|
||||
@import "variables/buttons";
|
||||
@import "variables/card";
|
||||
@import "variables/code";
|
||||
@import "variables/dropdown";
|
||||
@import "variables/forms";
|
||||
@import "variables/list-group";
|
||||
@import "variables/nav";
|
||||
@import "variables/pagination";
|
||||
@import "variables/state";
|
||||
@import "variables/tables";
|
||||
@import "variables/tooltip";
|
||||
@import "variables/type";
|
||||
@import "variables/modals";
|
||||
|
||||
// import their vars after customization for use below
|
||||
$enable-flex: true; // fully adopt flexbox layouts
|
||||
$enable-shadows: true; // enable shadows, set to false to turn off shadows
|
||||
|
||||
// Core Bootstrap Variables
|
||||
@import "./bootstrap/scss/functions";
|
||||
@import "./bootstrap/scss/variables";
|
||||
|
||||
@import "variables/layout";
|
||||
@import "variables/menu";
|
||||
@import "variables/drawer";
|
||||
@import "variables/snackbar";
|
||||
|
||||
@import "variables/bootstrap-material-design";
|
||||
@@ -0,0 +1,51 @@
|
||||
//
|
||||
// Base styles
|
||||
//
|
||||
|
||||
.alert {
|
||||
position: relative;
|
||||
padding: $alert-padding-y $alert-padding-x;
|
||||
margin-bottom: $alert-margin-bottom;
|
||||
border: $alert-border-width solid transparent;
|
||||
@include border-radius($alert-border-radius);
|
||||
}
|
||||
|
||||
// Headings for larger alerts
|
||||
.alert-heading {
|
||||
// Specified to prevent conflicts of changing $headings-color
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
// Provide class for links that match alerts
|
||||
.alert-link {
|
||||
font-weight: $alert-link-font-weight;
|
||||
}
|
||||
|
||||
|
||||
// Dismissible alerts
|
||||
//
|
||||
// Expand the right padding and account for the close button's positioning.
|
||||
|
||||
.alert-dismissible {
|
||||
padding-right: ($close-font-size + $alert-padding-x * 2);
|
||||
|
||||
// Adjust close link position
|
||||
.close {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
padding: $alert-padding-y $alert-padding-x;
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Alternate styles
|
||||
//
|
||||
// Generate contextual modifier classes for colorizing the alert.
|
||||
|
||||
@each $color, $value in $theme-colors {
|
||||
.alert-#{$color} {
|
||||
@include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
// Base class
|
||||
//
|
||||
// Requires one of the contextual, color modifier classes for `color` and
|
||||
// `background-color`.
|
||||
|
||||
.badge {
|
||||
display: inline-block;
|
||||
padding: $badge-padding-y $badge-padding-x;
|
||||
font-size: $badge-font-size;
|
||||
font-weight: $badge-font-weight;
|
||||
line-height: 1;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
vertical-align: baseline;
|
||||
@include border-radius($badge-border-radius);
|
||||
|
||||
// Empty badges collapse automatically
|
||||
&:empty {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
// Quick fix for badges in buttons
|
||||
.btn .badge {
|
||||
position: relative;
|
||||
top: -1px;
|
||||
}
|
||||
|
||||
// Pill badges
|
||||
//
|
||||
// Make them extra rounded with a modifier to replace v3's badges.
|
||||
|
||||
.badge-pill {
|
||||
padding-right: $badge-pill-padding-x;
|
||||
padding-left: $badge-pill-padding-x;
|
||||
@include border-radius($badge-pill-border-radius);
|
||||
}
|
||||
|
||||
// Colors
|
||||
//
|
||||
// Contextual variations (linked badges get darker on :hover).
|
||||
|
||||
@each $color, $value in $theme-colors {
|
||||
.badge-#{$color} {
|
||||
@include badge-variant($value);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
.breadcrumb {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
padding: $breadcrumb-padding-y $breadcrumb-padding-x;
|
||||
margin-bottom: $breadcrumb-margin-bottom;
|
||||
list-style: none;
|
||||
background-color: $breadcrumb-bg;
|
||||
@include border-radius($border-radius);
|
||||
}
|
||||
|
||||
.breadcrumb-item {
|
||||
// The separator between breadcrumbs (by default, a forward-slash: "/")
|
||||
+ .breadcrumb-item::before {
|
||||
display: inline-block; // Suppress underlining of the separator in modern browsers
|
||||
padding-right: $breadcrumb-item-padding;
|
||||
padding-left: $breadcrumb-item-padding;
|
||||
color: $breadcrumb-divider-color;
|
||||
content: "#{$breadcrumb-divider}";
|
||||
}
|
||||
|
||||
// IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built
|
||||
// without `<ul>`s. The `::before` pseudo-element generates an element
|
||||
// *within* the .breadcrumb-item and thereby inherits the `text-decoration`.
|
||||
//
|
||||
// To trick IE into suppressing the underline, we give the pseudo-element an
|
||||
// underline and then immediately remove it.
|
||||
+ .breadcrumb-item:hover::before {
|
||||
text-decoration: underline;
|
||||
}
|
||||
// stylelint-disable-next-line no-duplicate-selectors
|
||||
+ .breadcrumb-item:hover::before {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
&.active {
|
||||
color: $breadcrumb-active-color;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
// stylelint-disable selector-no-qualifying-type
|
||||
|
||||
// Make the div behave like a button
|
||||
.btn-group,
|
||||
.btn-group-vertical {
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
vertical-align: middle; // match .btn alignment given font-size hack above
|
||||
|
||||
> .btn {
|
||||
position: relative;
|
||||
flex: 0 1 auto;
|
||||
|
||||
// Bring the hover, focused, and "active" buttons to the front to overlay
|
||||
// the borders properly
|
||||
@include hover {
|
||||
z-index: 1;
|
||||
}
|
||||
&:focus,
|
||||
&:active,
|
||||
&.active {
|
||||
z-index: 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Prevent double borders when buttons are next to each other
|
||||
.btn + .btn,
|
||||
.btn + .btn-group,
|
||||
.btn-group + .btn,
|
||||
.btn-group + .btn-group {
|
||||
margin-left: -$btn-border-width;
|
||||
}
|
||||
}
|
||||
|
||||
// Optional: Group multiple button groups together for a toolbar
|
||||
.btn-toolbar {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: flex-start;
|
||||
|
||||
.input-group {
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-group {
|
||||
> .btn:first-child {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
// Reset rounded corners
|
||||
> .btn:not(:last-child):not(.dropdown-toggle),
|
||||
> .btn-group:not(:last-child) > .btn {
|
||||
@include border-right-radius(0);
|
||||
}
|
||||
|
||||
> .btn:not(:first-child),
|
||||
> .btn-group:not(:first-child) > .btn {
|
||||
@include border-left-radius(0);
|
||||
}
|
||||
}
|
||||
|
||||
// Sizing
|
||||
//
|
||||
// Remix the default button sizing classes into new ones for easier manipulation.
|
||||
|
||||
.btn-group-sm > .btn { @extend .btn-sm; }
|
||||
.btn-group-lg > .btn { @extend .btn-lg; }
|
||||
|
||||
|
||||
//
|
||||
// Split button dropdowns
|
||||
//
|
||||
|
||||
.dropdown-toggle-split {
|
||||
padding-right: $btn-padding-x * .75;
|
||||
padding-left: $btn-padding-x * .75;
|
||||
|
||||
&::after {
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-sm + .dropdown-toggle-split {
|
||||
padding-right: $btn-padding-x-sm * .75;
|
||||
padding-left: $btn-padding-x-sm * .75;
|
||||
}
|
||||
|
||||
.btn-lg + .dropdown-toggle-split {
|
||||
padding-right: $btn-padding-x-lg * .75;
|
||||
padding-left: $btn-padding-x-lg * .75;
|
||||
}
|
||||
|
||||
|
||||
// The clickable button for toggling the menu
|
||||
// Set the same inset shadow as the :active state
|
||||
.btn-group.show .dropdown-toggle {
|
||||
@include box-shadow($btn-active-box-shadow);
|
||||
|
||||
// Show no shadow for `.btn-link` since it has no other button styles.
|
||||
&.btn-link {
|
||||
@include box-shadow(none);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Vertical button groups
|
||||
//
|
||||
|
||||
.btn-group-vertical {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
justify-content: center;
|
||||
|
||||
.btn,
|
||||
.btn-group {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
> .btn + .btn,
|
||||
> .btn + .btn-group,
|
||||
> .btn-group + .btn,
|
||||
> .btn-group + .btn-group {
|
||||
margin-top: -$btn-border-width;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
// Reset rounded corners
|
||||
> .btn:not(:last-child):not(.dropdown-toggle),
|
||||
> .btn-group:not(:last-child) > .btn {
|
||||
@include border-bottom-radius(0);
|
||||
}
|
||||
|
||||
> .btn:not(:first-child),
|
||||
> .btn-group:not(:first-child) > .btn {
|
||||
@include border-top-radius(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Checkbox and radio options
|
||||
//
|
||||
// In order to support the browser's form validation feedback, powered by the
|
||||
// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
|
||||
// `display: none;` or `visibility: hidden;` as that also hides the popover.
|
||||
// Simply visually hiding the inputs via `opacity` would leave them clickable in
|
||||
// certain cases which is prevented by using `clip` and `pointer-events`.
|
||||
// This way, we ensure a DOM element is visible to position the popover from.
|
||||
//
|
||||
// See https://github.com/twbs/bootstrap/pull/12794 and
|
||||
// https://github.com/twbs/bootstrap/pull/14559 for more information.
|
||||
|
||||
.btn-group-toggle {
|
||||
> .btn,
|
||||
> .btn-group > .btn {
|
||||
margin-bottom: 0; // Override default `<label>` value
|
||||
|
||||
input[type="radio"],
|
||||
input[type="checkbox"] {
|
||||
position: absolute;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
// stylelint-disable selector-no-qualifying-type
|
||||
|
||||
//
|
||||
// Base styles
|
||||
//
|
||||
|
||||
.btn {
|
||||
display: inline-block;
|
||||
font-weight: $btn-font-weight;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
vertical-align: middle;
|
||||
user-select: none;
|
||||
border: $btn-border-width solid transparent;
|
||||
@include button-size($btn-padding-y, $btn-padding-x, $font-size-base, $btn-line-height, $btn-border-radius);
|
||||
@include transition($btn-transition);
|
||||
|
||||
// Share hover and focus styles
|
||||
@include hover-focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
&:focus,
|
||||
&.focus {
|
||||
outline: 0;
|
||||
box-shadow: $btn-focus-box-shadow;
|
||||
}
|
||||
|
||||
// Disabled comes first so active can properly restyle
|
||||
&.disabled,
|
||||
&:disabled {
|
||||
opacity: $btn-disabled-opacity;
|
||||
@include box-shadow(none);
|
||||
}
|
||||
|
||||
// Opinionated: add "hand" cursor to non-disabled .btn elements
|
||||
&:not(:disabled):not(.disabled) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&:not(:disabled):not(.disabled):active,
|
||||
&:not(:disabled):not(.disabled).active {
|
||||
background-image: none;
|
||||
@include box-shadow($btn-active-box-shadow);
|
||||
|
||||
&:focus {
|
||||
@include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Future-proof disabling of clicks on `<a>` elements
|
||||
a.btn.disabled,
|
||||
fieldset:disabled a.btn {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Alternate buttons
|
||||
//
|
||||
|
||||
@each $color, $value in $theme-colors {
|
||||
.btn-#{$color} {
|
||||
@include button-variant($value, $value);
|
||||
}
|
||||
}
|
||||
|
||||
@each $color, $value in $theme-colors {
|
||||
.btn-outline-#{$color} {
|
||||
@include button-outline-variant($value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Link buttons
|
||||
//
|
||||
|
||||
// Make a button look and behave like a link
|
||||
.btn-link {
|
||||
font-weight: $font-weight-normal;
|
||||
color: $link-color;
|
||||
background-color: transparent;
|
||||
|
||||
@include hover {
|
||||
color: $link-hover-color;
|
||||
text-decoration: $link-hover-decoration;
|
||||
background-color: transparent;
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
&:focus,
|
||||
&.focus {
|
||||
text-decoration: $link-hover-decoration;
|
||||
border-color: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
&:disabled,
|
||||
&.disabled {
|
||||
color: $btn-link-disabled-color;
|
||||
}
|
||||
|
||||
// No need for an active state here
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Button Sizes
|
||||
//
|
||||
|
||||
.btn-lg {
|
||||
@include button-size($btn-padding-y-lg, $btn-padding-x-lg, $font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);
|
||||
}
|
||||
|
||||
.btn-sm {
|
||||
@include button-size($btn-padding-y-sm, $btn-padding-x-sm, $font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Block button
|
||||
//
|
||||
|
||||
.btn-block {
|
||||
display: block;
|
||||
width: 100%;
|
||||
|
||||
// Vertically space out multiple block buttons
|
||||
+ .btn-block {
|
||||
margin-top: $btn-block-spacing-y;
|
||||
}
|
||||
}
|
||||
|
||||
// Specificity overrides
|
||||
input[type="submit"],
|
||||
input[type="reset"],
|
||||
input[type="button"] {
|
||||
&.btn-block {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,270 @@
|
||||
//
|
||||
// Base styles
|
||||
//
|
||||
|
||||
.card {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-width: 0;
|
||||
word-wrap: break-word;
|
||||
background-color: $card-bg;
|
||||
background-clip: border-box;
|
||||
border: $card-border-width solid $card-border-color;
|
||||
@include border-radius($card-border-radius);
|
||||
|
||||
> hr {
|
||||
margin-right: 0;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
> .list-group:first-child {
|
||||
.list-group-item:first-child {
|
||||
@include border-top-radius($card-border-radius);
|
||||
}
|
||||
}
|
||||
|
||||
> .list-group:last-child {
|
||||
.list-group-item:last-child {
|
||||
@include border-bottom-radius($card-border-radius);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.card-body {
|
||||
// Enable `flex-grow: 1` for decks and groups so that card blocks take up
|
||||
// as much space as possible, ensuring footers are aligned to the bottom.
|
||||
flex: 1 1 auto;
|
||||
padding: $card-spacer-x;
|
||||
}
|
||||
|
||||
.card-title {
|
||||
margin-bottom: $card-spacer-y;
|
||||
}
|
||||
|
||||
.card-subtitle {
|
||||
margin-top: -($card-spacer-y / 2);
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.card-text:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.card-link {
|
||||
@include hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
+ .card-link {
|
||||
margin-left: $card-spacer-x;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Optional textual caps
|
||||
//
|
||||
|
||||
.card-header {
|
||||
padding: $card-spacer-y $card-spacer-x;
|
||||
margin-bottom: 0; // Removes the default margin-bottom of <hN>
|
||||
background-color: $card-cap-bg;
|
||||
border-bottom: $card-border-width solid $card-border-color;
|
||||
|
||||
&:first-child {
|
||||
@include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);
|
||||
}
|
||||
|
||||
+ .list-group {
|
||||
.list-group-item:first-child {
|
||||
border-top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.card-footer {
|
||||
padding: $card-spacer-y $card-spacer-x;
|
||||
background-color: $card-cap-bg;
|
||||
border-top: $card-border-width solid $card-border-color;
|
||||
|
||||
&:last-child {
|
||||
@include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Header navs
|
||||
//
|
||||
|
||||
.card-header-tabs {
|
||||
margin-right: -($card-spacer-x / 2);
|
||||
margin-bottom: -$card-spacer-y;
|
||||
margin-left: -($card-spacer-x / 2);
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
.card-header-pills {
|
||||
margin-right: -($card-spacer-x / 2);
|
||||
margin-left: -($card-spacer-x / 2);
|
||||
}
|
||||
|
||||
// Card image
|
||||
.card-img-overlay {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
padding: $card-img-overlay-padding;
|
||||
}
|
||||
|
||||
.card-img {
|
||||
width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
|
||||
@include border-radius($card-inner-border-radius);
|
||||
}
|
||||
|
||||
// Card image caps
|
||||
.card-img-top {
|
||||
width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
|
||||
@include border-top-radius($card-inner-border-radius);
|
||||
}
|
||||
|
||||
.card-img-bottom {
|
||||
width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
|
||||
@include border-bottom-radius($card-inner-border-radius);
|
||||
}
|
||||
|
||||
|
||||
// Card deck
|
||||
|
||||
.card-deck {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.card {
|
||||
margin-bottom: $card-deck-margin;
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(sm) {
|
||||
flex-flow: row wrap;
|
||||
margin-right: -$card-deck-margin;
|
||||
margin-left: -$card-deck-margin;
|
||||
|
||||
.card {
|
||||
display: flex;
|
||||
// Flexbugs #4: https://github.com/philipwalton/flexbugs#4-flex-shorthand-declarations-with-unitless-flex-basis-values-are-ignored
|
||||
flex: 1 0 0%;
|
||||
flex-direction: column;
|
||||
margin-right: $card-deck-margin;
|
||||
margin-bottom: 0; // Override the default
|
||||
margin-left: $card-deck-margin;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Card groups
|
||||
//
|
||||
|
||||
.card-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
// The child selector allows nested `.card` within `.card-group`
|
||||
// to display properly.
|
||||
> .card {
|
||||
margin-bottom: $card-group-margin;
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(sm) {
|
||||
flex-flow: row wrap;
|
||||
// The child selector allows nested `.card` within `.card-group`
|
||||
// to display properly.
|
||||
> .card {
|
||||
// Flexbugs #4: https://github.com/philipwalton/flexbugs#4-flex-shorthand-declarations-with-unitless-flex-basis-values-are-ignored
|
||||
flex: 1 0 0%;
|
||||
margin-bottom: 0;
|
||||
|
||||
+ .card {
|
||||
margin-left: 0;
|
||||
border-left: 0;
|
||||
}
|
||||
|
||||
// Handle rounded corners
|
||||
@if $enable-rounded {
|
||||
&:first-child {
|
||||
@include border-right-radius(0);
|
||||
|
||||
.card-img-top,
|
||||
.card-header {
|
||||
border-top-right-radius: 0;
|
||||
}
|
||||
.card-img-bottom,
|
||||
.card-footer {
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
@include border-left-radius(0);
|
||||
|
||||
.card-img-top,
|
||||
.card-header {
|
||||
border-top-left-radius: 0;
|
||||
}
|
||||
.card-img-bottom,
|
||||
.card-footer {
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&:only-child {
|
||||
@include border-radius($card-border-radius);
|
||||
|
||||
.card-img-top,
|
||||
.card-header {
|
||||
@include border-top-radius($card-border-radius);
|
||||
}
|
||||
.card-img-bottom,
|
||||
.card-footer {
|
||||
@include border-bottom-radius($card-border-radius);
|
||||
}
|
||||
}
|
||||
|
||||
&:not(:first-child):not(:last-child):not(:only-child) {
|
||||
@include border-radius(0);
|
||||
|
||||
.card-img-top,
|
||||
.card-img-bottom,
|
||||
.card-header,
|
||||
.card-footer {
|
||||
@include border-radius(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Columns
|
||||
//
|
||||
|
||||
.card-columns {
|
||||
.card {
|
||||
margin-bottom: $card-columns-margin;
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(sm) {
|
||||
column-count: $card-columns-count;
|
||||
column-gap: $card-columns-gap;
|
||||
|
||||
.card {
|
||||
display: inline-block; // Don't let them vertically span multiple columns
|
||||
width: 100%; // Don't let their width change
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,191 @@
|
||||
// Wrapper for the slide container and indicators
|
||||
.carousel {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.carousel-inner {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.carousel-item {
|
||||
position: relative;
|
||||
display: none;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
@include transition($carousel-transition);
|
||||
backface-visibility: hidden;
|
||||
perspective: 1000px;
|
||||
}
|
||||
|
||||
.carousel-item.active,
|
||||
.carousel-item-next,
|
||||
.carousel-item-prev {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.carousel-item-next,
|
||||
.carousel-item-prev {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
// CSS3 transforms when supported by the browser
|
||||
.carousel-item-next.carousel-item-left,
|
||||
.carousel-item-prev.carousel-item-right {
|
||||
transform: translateX(0);
|
||||
|
||||
@supports (transform-style: preserve-3d) {
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
.carousel-item-next,
|
||||
.active.carousel-item-right {
|
||||
transform: translateX(100%);
|
||||
|
||||
@supports (transform-style: preserve-3d) {
|
||||
transform: translate3d(100%, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
.carousel-item-prev,
|
||||
.active.carousel-item-left {
|
||||
transform: translateX(-100%);
|
||||
|
||||
@supports (transform-style: preserve-3d) {
|
||||
transform: translate3d(-100%, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Left/right controls for nav
|
||||
//
|
||||
|
||||
.carousel-control-prev,
|
||||
.carousel-control-next {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
// Use flex for alignment (1-3)
|
||||
display: flex; // 1. allow flex styles
|
||||
align-items: center; // 2. vertically center contents
|
||||
justify-content: center; // 3. horizontally center contents
|
||||
width: $carousel-control-width;
|
||||
color: $carousel-control-color;
|
||||
text-align: center;
|
||||
opacity: $carousel-control-opacity;
|
||||
// We can't have a transition here because WebKit cancels the carousel
|
||||
// animation if you trip this while in the middle of another animation.
|
||||
|
||||
// Hover/focus state
|
||||
@include hover-focus {
|
||||
color: $carousel-control-color;
|
||||
text-decoration: none;
|
||||
outline: 0;
|
||||
opacity: .9;
|
||||
}
|
||||
}
|
||||
.carousel-control-prev {
|
||||
left: 0;
|
||||
@if $enable-gradients {
|
||||
background: linear-gradient(90deg, rgba(0, 0, 0, .25), rgba(0, 0, 0, .001));
|
||||
}
|
||||
}
|
||||
.carousel-control-next {
|
||||
right: 0;
|
||||
@if $enable-gradients {
|
||||
background: linear-gradient(270deg, rgba(0, 0, 0, .25), rgba(0, 0, 0, .001));
|
||||
}
|
||||
}
|
||||
|
||||
// Icons for within
|
||||
.carousel-control-prev-icon,
|
||||
.carousel-control-next-icon {
|
||||
display: inline-block;
|
||||
width: $carousel-control-icon-width;
|
||||
height: $carousel-control-icon-width;
|
||||
background: transparent no-repeat center center;
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
.carousel-control-prev-icon {
|
||||
background-image: $carousel-control-prev-icon-bg;
|
||||
}
|
||||
.carousel-control-next-icon {
|
||||
background-image: $carousel-control-next-icon-bg;
|
||||
}
|
||||
|
||||
|
||||
// Optional indicator pips
|
||||
//
|
||||
// Add an ordered list with the following class and add a list item for each
|
||||
// slide your carousel holds.
|
||||
|
||||
.carousel-indicators {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: 10px;
|
||||
left: 0;
|
||||
z-index: 15;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding-left: 0; // override <ol> default
|
||||
// Use the .carousel-control's width as margin so we don't overlay those
|
||||
margin-right: $carousel-control-width;
|
||||
margin-left: $carousel-control-width;
|
||||
list-style: none;
|
||||
|
||||
li {
|
||||
position: relative;
|
||||
flex: 0 1 auto;
|
||||
width: $carousel-indicator-width;
|
||||
height: $carousel-indicator-height;
|
||||
margin-right: $carousel-indicator-spacer;
|
||||
margin-left: $carousel-indicator-spacer;
|
||||
text-indent: -999px;
|
||||
background-color: rgba($carousel-indicator-active-bg, .5);
|
||||
|
||||
// Use pseudo classes to increase the hit area by 10px on top and bottom.
|
||||
&::before {
|
||||
position: absolute;
|
||||
top: -10px;
|
||||
left: 0;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
height: 10px;
|
||||
content: "";
|
||||
}
|
||||
&::after {
|
||||
position: absolute;
|
||||
bottom: -10px;
|
||||
left: 0;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
height: 10px;
|
||||
content: "";
|
||||
}
|
||||
}
|
||||
|
||||
.active {
|
||||
background-color: $carousel-indicator-active-bg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Optional captions
|
||||
//
|
||||
//
|
||||
|
||||
.carousel-caption {
|
||||
position: absolute;
|
||||
right: ((100% - $carousel-caption-width) / 2);
|
||||
bottom: 20px;
|
||||
left: ((100% - $carousel-caption-width) / 2);
|
||||
z-index: 10;
|
||||
padding-top: 20px;
|
||||
padding-bottom: 20px;
|
||||
color: $carousel-caption-color;
|
||||
text-align: center;
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
.close {
|
||||
float: right;
|
||||
font-size: $close-font-size;
|
||||
font-weight: $close-font-weight;
|
||||
line-height: 1;
|
||||
color: $close-color;
|
||||
text-shadow: $close-text-shadow;
|
||||
opacity: .5;
|
||||
|
||||
@include hover-focus {
|
||||
color: $close-color;
|
||||
text-decoration: none;
|
||||
opacity: .75;
|
||||
}
|
||||
|
||||
// Opinionated: add "hand" cursor to non-disabled .close elements
|
||||
&:not(:disabled):not(.disabled) {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
// Additional properties for button version
|
||||
// iOS requires the button element instead of an anchor tag.
|
||||
// If you want the anchor version, it requires `href="#"`.
|
||||
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
|
||||
|
||||
// stylelint-disable property-no-vendor-prefix, selector-no-qualifying-type
|
||||
button.close {
|
||||
padding: 0;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
// stylelint-enable
|
||||
@@ -0,0 +1,56 @@
|
||||
// Inline and block code styles
|
||||
code,
|
||||
kbd,
|
||||
pre,
|
||||
samp {
|
||||
font-family: $font-family-monospace;
|
||||
}
|
||||
|
||||
// Inline code
|
||||
code {
|
||||
font-size: $code-font-size;
|
||||
color: $code-color;
|
||||
word-break: break-word;
|
||||
|
||||
// Streamline the style when inside anchors to avoid broken underline and more
|
||||
a > & {
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
// User input typically entered via keyboard
|
||||
kbd {
|
||||
padding: $kbd-padding-y $kbd-padding-x;
|
||||
font-size: $kbd-font-size;
|
||||
color: $kbd-color;
|
||||
background-color: $kbd-bg;
|
||||
@include border-radius($border-radius-sm);
|
||||
@include box-shadow($kbd-box-shadow);
|
||||
|
||||
kbd {
|
||||
padding: 0;
|
||||
font-size: 100%;
|
||||
font-weight: $nested-kbd-font-weight;
|
||||
@include box-shadow(none);
|
||||
}
|
||||
}
|
||||
|
||||
// Blocks of code
|
||||
pre {
|
||||
display: block;
|
||||
font-size: $code-font-size;
|
||||
color: $pre-color;
|
||||
|
||||
// Account for some code outputs that place code tags in pre tags
|
||||
code {
|
||||
font-size: inherit;
|
||||
color: inherit;
|
||||
word-break: normal;
|
||||
}
|
||||
}
|
||||
|
||||
// Enable scrollable blocks of code
|
||||
.pre-scrollable {
|
||||
max-height: $pre-scrollable-max-height;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
@@ -0,0 +1,297 @@
|
||||
// Embedded icons from Open Iconic.
|
||||
// Released under MIT and copyright 2014 Waybury.
|
||||
// https://useiconic.com/open
|
||||
|
||||
|
||||
// Checkboxes and radios
|
||||
//
|
||||
// Base class takes care of all the key behavioral aspects.
|
||||
|
||||
.custom-control {
|
||||
position: relative;
|
||||
display: block;
|
||||
min-height: (1rem * $line-height-base);
|
||||
padding-left: $custom-control-gutter;
|
||||
}
|
||||
|
||||
.custom-control-inline {
|
||||
display: inline-flex;
|
||||
margin-right: $custom-control-spacer-x;
|
||||
}
|
||||
|
||||
.custom-control-input {
|
||||
position: absolute;
|
||||
z-index: -1; // Put the input behind the label so it doesn't overlay text
|
||||
opacity: 0;
|
||||
|
||||
&:checked ~ .custom-control-label::before {
|
||||
color: $custom-control-indicator-checked-color;
|
||||
@include gradient-bg($custom-control-indicator-checked-bg);
|
||||
@include box-shadow($custom-control-indicator-checked-box-shadow);
|
||||
}
|
||||
|
||||
&:focus ~ .custom-control-label::before {
|
||||
// the mixin is not used here to make sure there is feedback
|
||||
box-shadow: $custom-control-indicator-focus-box-shadow;
|
||||
}
|
||||
|
||||
&:active ~ .custom-control-label::before {
|
||||
color: $custom-control-indicator-active-color;
|
||||
background-color: $custom-control-indicator-active-bg;
|
||||
@include box-shadow($custom-control-indicator-active-box-shadow);
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
~ .custom-control-label {
|
||||
color: $custom-control-label-disabled-color;
|
||||
|
||||
&::before {
|
||||
background-color: $custom-control-indicator-disabled-bg;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Custom control indicators
|
||||
//
|
||||
// Build the custom controls out of psuedo-elements.
|
||||
|
||||
.custom-control-label {
|
||||
margin-bottom: 0;
|
||||
|
||||
// Background-color and (when enabled) gradient
|
||||
&::before {
|
||||
position: absolute;
|
||||
top: (($line-height-base - $custom-control-indicator-size) / 2);
|
||||
left: 0;
|
||||
display: block;
|
||||
width: $custom-control-indicator-size;
|
||||
height: $custom-control-indicator-size;
|
||||
pointer-events: none;
|
||||
content: "";
|
||||
user-select: none;
|
||||
background-color: $custom-control-indicator-bg;
|
||||
@include box-shadow($custom-control-indicator-box-shadow);
|
||||
}
|
||||
|
||||
// Foreground (icon)
|
||||
&::after {
|
||||
position: absolute;
|
||||
top: (($line-height-base - $custom-control-indicator-size) / 2);
|
||||
left: 0;
|
||||
display: block;
|
||||
width: $custom-control-indicator-size;
|
||||
height: $custom-control-indicator-size;
|
||||
content: "";
|
||||
background-repeat: no-repeat;
|
||||
background-position: center center;
|
||||
background-size: $custom-control-indicator-bg-size;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Checkboxes
|
||||
//
|
||||
// Tweak just a few things for checkboxes.
|
||||
|
||||
.custom-checkbox {
|
||||
.custom-control-label::before {
|
||||
@include border-radius($custom-checkbox-indicator-border-radius);
|
||||
}
|
||||
|
||||
.custom-control-input:checked ~ .custom-control-label {
|
||||
&::before {
|
||||
@include gradient-bg($custom-control-indicator-checked-bg);
|
||||
}
|
||||
&::after {
|
||||
background-image: $custom-checkbox-indicator-icon-checked;
|
||||
}
|
||||
}
|
||||
|
||||
.custom-control-input:indeterminate ~ .custom-control-label {
|
||||
&::before {
|
||||
@include gradient-bg($custom-checkbox-indicator-indeterminate-bg);
|
||||
@include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);
|
||||
}
|
||||
&::after {
|
||||
background-image: $custom-checkbox-indicator-icon-indeterminate;
|
||||
}
|
||||
}
|
||||
|
||||
.custom-control-input:disabled {
|
||||
&:checked ~ .custom-control-label::before {
|
||||
background-color: $custom-control-indicator-checked-disabled-bg;
|
||||
}
|
||||
&:indeterminate ~ .custom-control-label::before {
|
||||
background-color: $custom-control-indicator-checked-disabled-bg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Radios
|
||||
//
|
||||
// Tweak just a few things for radios.
|
||||
|
||||
.custom-radio {
|
||||
.custom-control-label::before {
|
||||
border-radius: $custom-radio-indicator-border-radius;
|
||||
}
|
||||
|
||||
.custom-control-input:checked ~ .custom-control-label {
|
||||
&::before {
|
||||
@include gradient-bg($custom-control-indicator-checked-bg);
|
||||
}
|
||||
&::after {
|
||||
background-image: $custom-radio-indicator-icon-checked;
|
||||
}
|
||||
}
|
||||
|
||||
.custom-control-input:disabled {
|
||||
&:checked ~ .custom-control-label::before {
|
||||
background-color: $custom-control-indicator-checked-disabled-bg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Select
|
||||
//
|
||||
// Replaces the browser default select with a custom one, mostly pulled from
|
||||
// http://primercss.io.
|
||||
//
|
||||
|
||||
.custom-select {
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
height: $custom-select-height;
|
||||
padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;
|
||||
line-height: $custom-select-line-height;
|
||||
color: $custom-select-color;
|
||||
vertical-align: middle;
|
||||
background: $custom-select-bg $custom-select-indicator no-repeat right $custom-select-padding-x center;
|
||||
background-size: $custom-select-bg-size;
|
||||
border: $custom-select-border-width solid $custom-select-border-color;
|
||||
@if $enable-rounded {
|
||||
border-radius: $custom-select-border-radius;
|
||||
} @else {
|
||||
border-radius: 0;
|
||||
}
|
||||
appearance: none;
|
||||
|
||||
&:focus {
|
||||
border-color: $custom-select-focus-border-color;
|
||||
outline: 0;
|
||||
box-shadow: $custom-select-focus-box-shadow;
|
||||
|
||||
&::-ms-value {
|
||||
// For visual consistency with other platforms/browsers,
|
||||
// suppress the default white text on blue background highlight given to
|
||||
// the selected option text when the (still closed) <select> receives focus
|
||||
// in IE and (under certain conditions) Edge.
|
||||
// See https://github.com/twbs/bootstrap/issues/19398.
|
||||
color: $input-color;
|
||||
background-color: $input-bg;
|
||||
}
|
||||
}
|
||||
|
||||
&[multiple],
|
||||
&[size]:not([size="1"]) {
|
||||
height: auto;
|
||||
padding-right: $custom-select-padding-x;
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
color: $custom-select-disabled-color;
|
||||
background-color: $custom-select-disabled-bg;
|
||||
}
|
||||
|
||||
// Hides the default caret in IE11
|
||||
&::-ms-expand {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.custom-select-sm {
|
||||
height: $custom-select-height-sm;
|
||||
padding-top: $custom-select-padding-y;
|
||||
padding-bottom: $custom-select-padding-y;
|
||||
font-size: $custom-select-font-size-sm;
|
||||
}
|
||||
|
||||
.custom-select-lg {
|
||||
height: $custom-select-height-lg;
|
||||
padding-top: $custom-select-padding-y;
|
||||
padding-bottom: $custom-select-padding-y;
|
||||
font-size: $custom-select-font-size-lg;
|
||||
}
|
||||
|
||||
|
||||
// File
|
||||
//
|
||||
// Custom file input.
|
||||
|
||||
.custom-file {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
height: $custom-file-height;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.custom-file-input {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
width: 100%;
|
||||
height: $custom-file-height;
|
||||
margin: 0;
|
||||
opacity: 0;
|
||||
|
||||
&:focus ~ .custom-file-control {
|
||||
border-color: $custom-file-focus-border-color;
|
||||
box-shadow: $custom-file-focus-box-shadow;
|
||||
|
||||
&::before {
|
||||
border-color: $custom-file-focus-border-color;
|
||||
}
|
||||
}
|
||||
|
||||
@each $lang, $value in $custom-file-text {
|
||||
&:lang(#{$lang}) ~ .custom-file-label::after {
|
||||
content: $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.custom-file-label {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
left: 0;
|
||||
z-index: 1;
|
||||
height: $custom-file-height;
|
||||
padding: $custom-file-padding-y $custom-file-padding-x;
|
||||
line-height: $custom-file-line-height;
|
||||
color: $custom-file-color;
|
||||
background-color: $custom-file-bg;
|
||||
border: $custom-file-border-width solid $custom-file-border-color;
|
||||
@include border-radius($custom-file-border-radius);
|
||||
@include box-shadow($custom-file-box-shadow);
|
||||
|
||||
&::after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 3;
|
||||
display: block;
|
||||
height: calc(#{$custom-file-height} - #{$custom-file-border-width} * 2);
|
||||
padding: $custom-file-padding-y $custom-file-padding-x;
|
||||
line-height: $custom-file-line-height;
|
||||
color: $custom-file-button-color;
|
||||
content: "Browse";
|
||||
@include gradient-bg($custom-file-button-bg);
|
||||
border-left: $custom-file-border-width solid $custom-file-border-color;
|
||||
@include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,131 @@
|
||||
// The dropdown wrapper (`<div>`)
|
||||
.dropup,
|
||||
.dropdown {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.dropdown-toggle {
|
||||
// Generate the caret automatically
|
||||
@include caret;
|
||||
}
|
||||
|
||||
// The dropdown menu
|
||||
.dropdown-menu {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
z-index: $zindex-dropdown;
|
||||
display: none; // none by default, but block on "open" of the menu
|
||||
float: left;
|
||||
min-width: $dropdown-min-width;
|
||||
padding: $dropdown-padding-y 0;
|
||||
margin: $dropdown-spacer 0 0; // override default ul
|
||||
font-size: $font-size-base; // Redeclare because nesting can cause inheritance issues
|
||||
color: $body-color;
|
||||
text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
|
||||
list-style: none;
|
||||
background-color: $dropdown-bg;
|
||||
background-clip: padding-box;
|
||||
border: $dropdown-border-width solid $dropdown-border-color;
|
||||
@include border-radius($dropdown-border-radius);
|
||||
@include box-shadow($dropdown-box-shadow);
|
||||
}
|
||||
|
||||
// Allow for dropdowns to go bottom up (aka, dropup-menu)
|
||||
// Just add .dropup after the standard .dropdown class and you're set.
|
||||
.dropup {
|
||||
.dropdown-menu {
|
||||
margin-top: 0;
|
||||
margin-bottom: $dropdown-spacer;
|
||||
}
|
||||
|
||||
.dropdown-toggle {
|
||||
@include caret(up);
|
||||
}
|
||||
}
|
||||
|
||||
.dropright {
|
||||
.dropdown-menu {
|
||||
margin-top: 0;
|
||||
margin-left: $dropdown-spacer;
|
||||
}
|
||||
|
||||
.dropdown-toggle {
|
||||
@include caret(right);
|
||||
&::after {
|
||||
vertical-align: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dropleft {
|
||||
.dropdown-menu {
|
||||
margin-top: 0;
|
||||
margin-right: $dropdown-spacer;
|
||||
}
|
||||
|
||||
.dropdown-toggle {
|
||||
@include caret(left);
|
||||
&::before {
|
||||
vertical-align: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Dividers (basically an `<hr>`) within the dropdown
|
||||
.dropdown-divider {
|
||||
@include nav-divider($dropdown-divider-bg);
|
||||
}
|
||||
|
||||
// Links, buttons, and more within the dropdown menu
|
||||
//
|
||||
// `<button>`-specific styles are denoted with `// For <button>s`
|
||||
.dropdown-item {
|
||||
display: block;
|
||||
width: 100%; // For `<button>`s
|
||||
padding: $dropdown-item-padding-y $dropdown-item-padding-x;
|
||||
clear: both;
|
||||
font-weight: $font-weight-normal;
|
||||
color: $dropdown-link-color;
|
||||
text-align: inherit; // For `<button>`s
|
||||
white-space: nowrap; // prevent links from randomly breaking onto new lines
|
||||
background-color: transparent; // For `<button>`s
|
||||
border: 0; // For `<button>`s
|
||||
|
||||
@include hover-focus {
|
||||
color: $dropdown-link-hover-color;
|
||||
text-decoration: none;
|
||||
@include gradient-bg($dropdown-link-hover-bg);
|
||||
}
|
||||
|
||||
&.active,
|
||||
&:active {
|
||||
color: $dropdown-link-active-color;
|
||||
text-decoration: none;
|
||||
@include gradient-bg($dropdown-link-active-bg);
|
||||
}
|
||||
|
||||
&.disabled,
|
||||
&:disabled {
|
||||
color: $dropdown-link-disabled-color;
|
||||
background-color: transparent;
|
||||
// Remove CSS gradients if they're enabled
|
||||
@if $enable-gradients {
|
||||
background-image: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown-menu.show {
|
||||
display: block;
|
||||
}
|
||||
|
||||
// Dropdown section headers
|
||||
.dropdown-header {
|
||||
display: block;
|
||||
padding: $dropdown-padding-y $dropdown-item-padding-x;
|
||||
margin-bottom: 0; // for use with heading elements
|
||||
font-size: $font-size-sm;
|
||||
color: $dropdown-header-color;
|
||||
white-space: nowrap; // as with > li > a
|
||||
}
|
||||
@@ -0,0 +1,333 @@
|
||||
// stylelint-disable selector-no-qualifying-type
|
||||
|
||||
//
|
||||
// Textual form controls
|
||||
//
|
||||
|
||||
.form-control {
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: $input-padding-y $input-padding-x;
|
||||
font-size: $font-size-base;
|
||||
line-height: $input-line-height;
|
||||
color: $input-color;
|
||||
background-color: $input-bg;
|
||||
background-clip: padding-box;
|
||||
border: $input-border-width solid $input-border-color;
|
||||
|
||||
// Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.
|
||||
@if $enable-rounded {
|
||||
// Manually use the if/else instead of the mixin to account for iOS override
|
||||
border-radius: $input-border-radius;
|
||||
} @else {
|
||||
// Otherwise undo the iOS default
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
@include box-shadow($input-box-shadow);
|
||||
@include transition($input-transition);
|
||||
|
||||
// Unstyle the caret on `<select>`s in IE10+.
|
||||
&::-ms-expand {
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
// Customize the `:focus` state to imitate native WebKit styles.
|
||||
@include form-control-focus();
|
||||
|
||||
// Placeholder
|
||||
&::placeholder {
|
||||
color: $input-placeholder-color;
|
||||
// Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
// Disabled and read-only inputs
|
||||
//
|
||||
// HTML5 says that controls under a fieldset > legend:first-child won't be
|
||||
// disabled if the fieldset is disabled. Due to implementation difficulty, we
|
||||
// don't honor that edge case; we style them as disabled anyway.
|
||||
&:disabled,
|
||||
&[readonly] {
|
||||
background-color: $input-disabled-bg;
|
||||
// iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
select.form-control {
|
||||
&:not([size]):not([multiple]) {
|
||||
height: $input-height;
|
||||
}
|
||||
|
||||
&:focus::-ms-value {
|
||||
// Suppress the nested default white text on blue background highlight given to
|
||||
// the selected option text when the (still closed) <select> receives focus
|
||||
// in IE and (under certain conditions) Edge, as it looks bad and cannot be made to
|
||||
// match the appearance of the native widget.
|
||||
// See https://github.com/twbs/bootstrap/issues/19398.
|
||||
color: $input-color;
|
||||
background-color: $input-bg;
|
||||
}
|
||||
}
|
||||
|
||||
// Make file inputs better match text inputs by forcing them to new lines.
|
||||
.form-control-file,
|
||||
.form-control-range {
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Labels
|
||||
//
|
||||
|
||||
// For use with horizontal and inline forms, when you need the label (or legend)
|
||||
// text to align with the form controls.
|
||||
.col-form-label {
|
||||
padding-top: calc(#{$input-padding-y} + #{$input-border-width});
|
||||
padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});
|
||||
margin-bottom: 0; // Override the `<label>/<legend>` default
|
||||
font-size: inherit; // Override the `<legend>` default
|
||||
line-height: $input-line-height;
|
||||
}
|
||||
|
||||
.col-form-label-lg {
|
||||
padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});
|
||||
padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});
|
||||
font-size: $font-size-lg;
|
||||
line-height: $input-line-height-lg;
|
||||
}
|
||||
|
||||
.col-form-label-sm {
|
||||
padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});
|
||||
padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});
|
||||
font-size: $font-size-sm;
|
||||
line-height: $input-line-height-sm;
|
||||
}
|
||||
|
||||
|
||||
// Readonly controls as plain text
|
||||
//
|
||||
// Apply class to a readonly input to make it appear like regular plain
|
||||
// text (without any border, background color, focus indicator)
|
||||
|
||||
.form-control-plaintext {
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding-top: $input-padding-y;
|
||||
padding-bottom: $input-padding-y;
|
||||
margin-bottom: 0; // match inputs if this class comes on inputs with default margins
|
||||
line-height: $input-line-height;
|
||||
background-color: transparent;
|
||||
border: solid transparent;
|
||||
border-width: $input-border-width 0;
|
||||
|
||||
&.form-control-sm,
|
||||
&.form-control-lg {
|
||||
padding-right: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Form control sizing
|
||||
//
|
||||
// Build on `.form-control` with modifier classes to decrease or increase the
|
||||
// height and font-size of form controls.
|
||||
//
|
||||
// The `.form-group-* form-control` variations are sadly duplicated to avoid the
|
||||
// issue documented in https://github.com/twbs/bootstrap/issues/15074.
|
||||
|
||||
.form-control-sm {
|
||||
padding: $input-padding-y-sm $input-padding-x-sm;
|
||||
font-size: $font-size-sm;
|
||||
line-height: $input-line-height-sm;
|
||||
@include border-radius($input-border-radius-sm);
|
||||
}
|
||||
|
||||
select.form-control-sm {
|
||||
&:not([size]):not([multiple]) {
|
||||
height: $input-height-sm;
|
||||
}
|
||||
}
|
||||
|
||||
.form-control-lg {
|
||||
padding: $input-padding-y-lg $input-padding-x-lg;
|
||||
font-size: $font-size-lg;
|
||||
line-height: $input-line-height-lg;
|
||||
@include border-radius($input-border-radius-lg);
|
||||
}
|
||||
|
||||
select.form-control-lg {
|
||||
&:not([size]):not([multiple]) {
|
||||
height: $input-height-lg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Form groups
|
||||
//
|
||||
// Designed to help with the organization and spacing of vertical forms. For
|
||||
// horizontal forms, use the predefined grid classes.
|
||||
|
||||
.form-group {
|
||||
margin-bottom: $form-group-margin-bottom;
|
||||
}
|
||||
|
||||
.form-text {
|
||||
display: block;
|
||||
margin-top: $form-text-margin-top;
|
||||
}
|
||||
|
||||
|
||||
// Form grid
|
||||
//
|
||||
// Special replacement for our grid system's `.row` for tighter form layouts.
|
||||
|
||||
.form-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin-right: -5px;
|
||||
margin-left: -5px;
|
||||
|
||||
> .col,
|
||||
> [class*="col-"] {
|
||||
padding-right: 5px;
|
||||
padding-left: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Checkboxes and radios
|
||||
//
|
||||
// Indent the labels to position radios/checkboxes as hanging controls.
|
||||
|
||||
.form-check {
|
||||
position: relative;
|
||||
display: block;
|
||||
padding-left: $form-check-input-gutter;
|
||||
}
|
||||
|
||||
.form-check-input {
|
||||
position: absolute;
|
||||
margin-top: $form-check-input-margin-y;
|
||||
margin-left: -$form-check-input-gutter;
|
||||
|
||||
&:disabled ~ .form-check-label {
|
||||
color: $text-muted;
|
||||
}
|
||||
}
|
||||
|
||||
.form-check-label {
|
||||
margin-bottom: 0; // Override default `<label>` bottom margin
|
||||
}
|
||||
|
||||
.form-check-inline {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
padding-left: 0; // Override base .form-check
|
||||
margin-right: $form-check-inline-margin-x;
|
||||
|
||||
// Undo .form-check-input defaults and add some `margin-right`.
|
||||
.form-check-input {
|
||||
position: static;
|
||||
margin-top: 0;
|
||||
margin-right: $form-check-inline-input-margin-x;
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Form validation
|
||||
//
|
||||
// Provide feedback to users when form field values are valid or invalid. Works
|
||||
// primarily for client-side validation via scoped `:invalid` and `:valid`
|
||||
// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for
|
||||
// server side validation.
|
||||
|
||||
@include form-validation-state("valid", $form-feedback-valid-color);
|
||||
@include form-validation-state("invalid", $form-feedback-invalid-color);
|
||||
|
||||
// Inline forms
|
||||
//
|
||||
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
|
||||
// forms begin stacked on extra small (mobile) devices and then go inline when
|
||||
// viewports reach <768px.
|
||||
//
|
||||
// Requires wrapping inputs and labels with `.form-group` for proper display of
|
||||
// default HTML form controls and our custom form controls (e.g., input groups).
|
||||
|
||||
.form-inline {
|
||||
display: flex;
|
||||
flex-flow: row wrap;
|
||||
align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)
|
||||
|
||||
// Because we use flex, the initial sizing of checkboxes is collapsed and
|
||||
// doesn't occupy the full-width (which is what we want for xs grid tier),
|
||||
// so we force that here.
|
||||
.form-check {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
// Kick in the inline
|
||||
@include media-breakpoint-up(sm) {
|
||||
label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
// Inline-block all the things for "inline"
|
||||
.form-group {
|
||||
display: flex;
|
||||
flex: 0 0 auto;
|
||||
flex-flow: row wrap;
|
||||
align-items: center;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
// Allow folks to *not* use `.form-group`
|
||||
.form-control {
|
||||
display: inline-block;
|
||||
width: auto; // Prevent labels from stacking above inputs in `.form-group`
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
// Make static controls behave like regular ones
|
||||
.form-control-plaintext {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.input-group {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
// Remove default margin on radios/checkboxes that were used for stacking, and
|
||||
// then undo the floating of radios and checkboxes to match.
|
||||
.form-check {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: auto;
|
||||
padding-left: 0;
|
||||
}
|
||||
.form-check-input {
|
||||
position: relative;
|
||||
margin-top: 0;
|
||||
margin-right: $form-check-input-margin-x;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.custom-control {
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.custom-control-label {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
// Bootstrap functions
|
||||
//
|
||||
// Utility mixins and functions for evalutating source code across our variables, maps, and mixins.
|
||||
|
||||
// Ascending
|
||||
// Used to evaluate Sass maps like our grid breakpoints.
|
||||
@mixin _assert-ascending($map, $map-name) {
|
||||
$prev-key: null;
|
||||
$prev-num: null;
|
||||
@each $key, $num in $map {
|
||||
@if $prev-num == null {
|
||||
// Do nothing
|
||||
} @else if not comparable($prev-num, $num) {
|
||||
@warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
|
||||
} @else if $prev-num >= $num {
|
||||
@warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !";
|
||||
}
|
||||
$prev-key: $key;
|
||||
$prev-num: $num;
|
||||
}
|
||||
}
|
||||
|
||||
// Starts at zero
|
||||
// Another grid mixin that ensures the min-width of the lowest breakpoint starts at 0.
|
||||
@mixin _assert-starts-at-zero($map) {
|
||||
$values: map-values($map);
|
||||
$first-value: nth($values, 1);
|
||||
@if $first-value != 0 {
|
||||
@warn "First breakpoint in `$grid-breakpoints` must start at 0, but starts at #{$first-value}.";
|
||||
}
|
||||
}
|
||||
|
||||
// Replace `$search` with `$replace` in `$string`
|
||||
// Used on our SVG icon backgrounds for custom forms.
|
||||
//
|
||||
// @author Hugo Giraudel
|
||||
// @param {String} $string - Initial string
|
||||
// @param {String} $search - Substring to replace
|
||||
// @param {String} $replace ('') - New value
|
||||
// @return {String} - Updated string
|
||||
@function str-replace($string, $search, $replace: "") {
|
||||
$index: str-index($string, $search);
|
||||
|
||||
@if $index {
|
||||
@return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
|
||||
}
|
||||
|
||||
@return $string;
|
||||
}
|
||||
|
||||
// Color contrast
|
||||
@function color-yiq($color) {
|
||||
$r: red($color);
|
||||
$g: green($color);
|
||||
$b: blue($color);
|
||||
|
||||
$yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
|
||||
|
||||
@if ($yiq >= $yiq-contrasted-threshold) {
|
||||
@return $yiq-text-dark;
|
||||
} @else {
|
||||
@return $yiq-text-light;
|
||||
}
|
||||
}
|
||||
|
||||
// Retrieve color Sass maps
|
||||
@function color($key: "blue") {
|
||||
@return map-get($colors, $key);
|
||||
}
|
||||
|
||||
@function theme-color($key: "primary") {
|
||||
@return map-get($theme-colors, $key);
|
||||
}
|
||||
|
||||
@function gray($key: "100") {
|
||||
@return map-get($grays, $key);
|
||||
}
|
||||
|
||||
// Request a theme color level
|
||||
@function theme-color-level($color-name: "primary", $level: 0) {
|
||||
$color: theme-color($color-name);
|
||||
$color-base: if($level > 0, #000, #fff);
|
||||
$level: abs($level);
|
||||
|
||||
@return mix($color-base, $color, $level * $theme-color-interval);
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
// Container widths
|
||||
//
|
||||
// Set the container width, and override it for fixed navbars in media queries.
|
||||
|
||||
@if $enable-grid-classes {
|
||||
.container {
|
||||
@include make-container();
|
||||
@include make-container-max-widths();
|
||||
}
|
||||
}
|
||||
|
||||
// Fluid container
|
||||
//
|
||||
// Utilizes the mixin meant for fixed width containers, but with 100% width for
|
||||
// fluid, full width layouts.
|
||||
|
||||
@if $enable-grid-classes {
|
||||
.container-fluid {
|
||||
@include make-container();
|
||||
}
|
||||
}
|
||||
|
||||
// Row
|
||||
//
|
||||
// Rows contain and clear the floats of your columns.
|
||||
|
||||
@if $enable-grid-classes {
|
||||
.row {
|
||||
@include make-row();
|
||||
}
|
||||
|
||||
// Remove the negative margin from default .row, then the horizontal padding
|
||||
// from all immediate children columns (to prevent runaway style inheritance).
|
||||
.no-gutters {
|
||||
margin-right: 0;
|
||||
margin-left: 0;
|
||||
|
||||
> .col,
|
||||
> [class*="col-"] {
|
||||
padding-right: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Columns
|
||||
//
|
||||
// Common styles for small and large grid columns
|
||||
|
||||
@if $enable-grid-classes {
|
||||
@include make-grid-columns();
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
// Responsive images (ensure images don't scale beyond their parents)
|
||||
//
|
||||
// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.
|
||||
// We previously tried the "images are responsive by default" approach in Bootstrap v2,
|
||||
// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)
|
||||
// which weren't expecting the images within themselves to be involuntarily resized.
|
||||
// See also https://github.com/twbs/bootstrap/issues/18178
|
||||
.img-fluid {
|
||||
@include img-fluid;
|
||||
}
|
||||
|
||||
|
||||
// Image thumbnails
|
||||
.img-thumbnail {
|
||||
padding: $thumbnail-padding;
|
||||
background-color: $thumbnail-bg;
|
||||
border: $thumbnail-border-width solid $thumbnail-border-color;
|
||||
@include border-radius($thumbnail-border-radius);
|
||||
@include box-shadow($thumbnail-box-shadow);
|
||||
|
||||
// Keep them at most 100% wide
|
||||
@include img-fluid;
|
||||
}
|
||||
|
||||
//
|
||||
// Figures
|
||||
//
|
||||
|
||||
.figure {
|
||||
// Ensures the caption's text aligns with the image.
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.figure-img {
|
||||
margin-bottom: ($spacer / 2);
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.figure-caption {
|
||||
font-size: $figure-caption-font-size;
|
||||
color: $figure-caption-color;
|
||||
}
|
||||
@@ -0,0 +1,159 @@
|
||||
// stylelint-disable selector-no-qualifying-type
|
||||
|
||||
//
|
||||
// Base styles
|
||||
//
|
||||
|
||||
.input-group {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-wrap: wrap; // For form validation feedback
|
||||
align-items: stretch;
|
||||
width: 100%;
|
||||
|
||||
> .form-control,
|
||||
> .custom-select,
|
||||
> .custom-file {
|
||||
position: relative; // For focus state's z-index
|
||||
flex: 1 1 auto;
|
||||
// Add width 1% and flex-basis auto to ensure that button will not wrap out
|
||||
// the column. Applies to IE Edge+ and Firefox. Chrome does not require this.
|
||||
width: 1%;
|
||||
margin-bottom: 0;
|
||||
|
||||
// Bring the "active" form control to the top of surrounding elements
|
||||
&:focus {
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
+ .form-control,
|
||||
+ .custom-select,
|
||||
+ .custom-file {
|
||||
margin-left: -$input-border-width;
|
||||
}
|
||||
}
|
||||
|
||||
> .form-control,
|
||||
> .custom-select {
|
||||
&:not(:last-child) { @include border-right-radius(0); }
|
||||
&:not(:first-child) { @include border-left-radius(0); }
|
||||
}
|
||||
|
||||
// Custom file inputs have more complex markup, thus requiring different
|
||||
// border-radius overrides.
|
||||
> .custom-file {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
&:not(:last-child) .custom-file-label,
|
||||
&:not(:last-child) .custom-file-label::before { @include border-right-radius(0); }
|
||||
&:not(:first-child) .custom-file-label,
|
||||
&:not(:first-child) .custom-file-label::before { @include border-left-radius(0); }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Prepend and append
|
||||
//
|
||||
// While it requires one extra layer of HTML for each, dedicated prepend and
|
||||
// append elements allow us to 1) be less clever, 2) simplify our selectors, and
|
||||
// 3) support HTML5 form validation.
|
||||
|
||||
.input-group-prepend,
|
||||
.input-group-append {
|
||||
display: flex;
|
||||
|
||||
// Ensure buttons are always above inputs for more visually pleasing borders.
|
||||
// This isn't needed for `.input-group-text` since it shares the same border-color
|
||||
// as our inputs.
|
||||
.btn {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.btn + .btn,
|
||||
.btn + .input-group-text,
|
||||
.input-group-text + .input-group-text,
|
||||
.input-group-text + .btn {
|
||||
margin-left: -$input-border-width;
|
||||
}
|
||||
}
|
||||
|
||||
.input-group-prepend { margin-right: -$input-border-width; }
|
||||
.input-group-append { margin-left: -$input-border-width; }
|
||||
|
||||
|
||||
// Textual addons
|
||||
//
|
||||
// Serves as a catch-all element for any text or radio/checkbox input you wish
|
||||
// to prepend or append to an input.
|
||||
|
||||
.input-group-text {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: $input-padding-y $input-padding-x;
|
||||
margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom
|
||||
font-size: $font-size-base; // Match inputs
|
||||
font-weight: $font-weight-normal;
|
||||
line-height: $input-line-height;
|
||||
color: $input-group-addon-color;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
background-color: $input-group-addon-bg;
|
||||
border: $input-border-width solid $input-group-addon-border-color;
|
||||
@include border-radius($input-border-radius);
|
||||
|
||||
// Nuke default margins from checkboxes and radios to vertically center within.
|
||||
input[type="radio"],
|
||||
input[type="checkbox"] {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Sizing
|
||||
//
|
||||
// Remix the default form control sizing classes into new ones for easier
|
||||
// manipulation.
|
||||
|
||||
.input-group-lg > .form-control,
|
||||
.input-group-lg > .input-group-prepend > .input-group-text,
|
||||
.input-group-lg > .input-group-append > .input-group-text,
|
||||
.input-group-lg > .input-group-prepend > .btn,
|
||||
.input-group-lg > .input-group-append > .btn {
|
||||
@extend .form-control-lg;
|
||||
}
|
||||
|
||||
.input-group-sm > .form-control,
|
||||
.input-group-sm > .input-group-prepend > .input-group-text,
|
||||
.input-group-sm > .input-group-append > .input-group-text,
|
||||
.input-group-sm > .input-group-prepend > .btn,
|
||||
.input-group-sm > .input-group-append > .btn {
|
||||
@extend .form-control-sm;
|
||||
}
|
||||
|
||||
|
||||
// Prepend and append rounded corners
|
||||
//
|
||||
// These rulesets must come after the sizing ones to properly override sm and lg
|
||||
// border-radius values when extending. They're more specific than we'd like
|
||||
// with the `.input-group >` part, but without it, we cannot override the sizing.
|
||||
|
||||
|
||||
.input-group > .input-group-prepend > .btn,
|
||||
.input-group > .input-group-prepend > .input-group-text,
|
||||
.input-group > .input-group-append:not(:last-child) > .btn,
|
||||
.input-group > .input-group-append:not(:last-child) > .input-group-text,
|
||||
.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
|
||||
.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
|
||||
@include border-right-radius(0);
|
||||
}
|
||||
|
||||
.input-group > .input-group-append > .btn,
|
||||
.input-group > .input-group-append > .input-group-text,
|
||||
.input-group > .input-group-prepend:not(:first-child) > .btn,
|
||||
.input-group > .input-group-prepend:not(:first-child) > .input-group-text,
|
||||
.input-group > .input-group-prepend:first-child > .btn:not(:first-child),
|
||||
.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {
|
||||
@include border-left-radius(0);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
.jumbotron {
|
||||
padding: $jumbotron-padding ($jumbotron-padding / 2);
|
||||
margin-bottom: $jumbotron-padding;
|
||||
background-color: $jumbotron-bg;
|
||||
@include border-radius($border-radius-lg);
|
||||
|
||||
@include media-breakpoint-up(sm) {
|
||||
padding: ($jumbotron-padding * 2) $jumbotron-padding;
|
||||
}
|
||||
}
|
||||
|
||||
.jumbotron-fluid {
|
||||
padding-right: 0;
|
||||
padding-left: 0;
|
||||
@include border-radius(0);
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
// Base class
|
||||
//
|
||||
// Easily usable on <ul>, <ol>, or <div>.
|
||||
|
||||
.list-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
// No need to set list-style: none; since .list-group-item is block level
|
||||
padding-left: 0; // reset padding because ul and ol
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
|
||||
// Interactive list items
|
||||
//
|
||||
// Use anchor or button elements instead of `li`s or `div`s to create interactive
|
||||
// list items. Includes an extra `.active` modifier class for selected items.
|
||||
|
||||
.list-group-item-action {
|
||||
width: 100%; // For `<button>`s (anchors become 100% by default though)
|
||||
color: $list-group-action-color;
|
||||
text-align: inherit; // For `<button>`s (anchors inherit)
|
||||
|
||||
// Hover state
|
||||
@include hover-focus {
|
||||
color: $list-group-action-hover-color;
|
||||
text-decoration: none;
|
||||
background-color: $list-group-hover-bg;
|
||||
}
|
||||
|
||||
&:active {
|
||||
color: $list-group-action-active-color;
|
||||
background-color: $list-group-action-active-bg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Individual list items
|
||||
//
|
||||
// Use on `li`s or `div`s within the `.list-group` parent.
|
||||
|
||||
.list-group-item {
|
||||
position: relative;
|
||||
display: block;
|
||||
padding: $list-group-item-padding-y $list-group-item-padding-x;
|
||||
// Place the border on the list items and negative margin up for better styling
|
||||
margin-bottom: -$list-group-border-width;
|
||||
background-color: $list-group-bg;
|
||||
border: $list-group-border-width solid $list-group-border-color;
|
||||
|
||||
&:first-child {
|
||||
@include border-top-radius($list-group-border-radius);
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
@include border-bottom-radius($list-group-border-radius);
|
||||
}
|
||||
|
||||
@include hover-focus {
|
||||
z-index: 1; // Place hover/active items above their siblings for proper border styling
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
&.disabled,
|
||||
&:disabled {
|
||||
color: $list-group-disabled-color;
|
||||
background-color: $list-group-disabled-bg;
|
||||
}
|
||||
|
||||
// Include both here for `<a>`s and `<button>`s
|
||||
&.active {
|
||||
z-index: 2; // Place active items above their siblings for proper border styling
|
||||
color: $list-group-active-color;
|
||||
background-color: $list-group-active-bg;
|
||||
border-color: $list-group-active-border-color;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Flush list items
|
||||
//
|
||||
// Remove borders and border-radius to keep list group items edge-to-edge. Most
|
||||
// useful within other components (e.g., cards).
|
||||
|
||||
.list-group-flush {
|
||||
.list-group-item {
|
||||
border-right: 0;
|
||||
border-left: 0;
|
||||
@include border-radius(0);
|
||||
}
|
||||
|
||||
&:first-child {
|
||||
.list-group-item:first-child {
|
||||
border-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
.list-group-item:last-child {
|
||||
border-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Contextual variants
|
||||
//
|
||||
// Add modifier classes to change text and background color on individual items.
|
||||
// Organizationally, this must come after the `:hover` states.
|
||||
|
||||
@each $color, $value in $theme-colors {
|
||||
@include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
.media {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.media-body {
|
||||
flex: 1;
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
// Toggles
|
||||
//
|
||||
// Used in conjunction with global variables to enable certain theme features.
|
||||
|
||||
// Utilities
|
||||
@import "mixins/breakpoints";
|
||||
@import "mixins/hover";
|
||||
@import "mixins/image";
|
||||
@import "mixins/badge";
|
||||
@import "mixins/resize";
|
||||
@import "mixins/screen-reader";
|
||||
@import "mixins/size";
|
||||
@import "mixins/reset-text";
|
||||
@import "mixins/text-emphasis";
|
||||
@import "mixins/text-hide";
|
||||
@import "mixins/text-truncate";
|
||||
@import "mixins/visibility";
|
||||
|
||||
// // Components
|
||||
@import "mixins/alert";
|
||||
@import "mixins/buttons";
|
||||
@import "mixins/caret";
|
||||
@import "mixins/pagination";
|
||||
@import "mixins/lists";
|
||||
@import "mixins/list-group";
|
||||
@import "mixins/nav-divider";
|
||||
@import "mixins/forms";
|
||||
@import "mixins/table-row";
|
||||
|
||||
// // Skins
|
||||
@import "mixins/background-variant";
|
||||
@import "mixins/border-radius";
|
||||
@import "mixins/box-shadow";
|
||||
@import "mixins/gradients";
|
||||
@import "mixins/transition";
|
||||
|
||||
// // Layout
|
||||
@import "mixins/clearfix";
|
||||
// @import "mixins/navbar-align";
|
||||
@import "mixins/grid-framework";
|
||||
@import "mixins/grid";
|
||||
@import "mixins/float";
|
||||
@@ -0,0 +1,168 @@
|
||||
// .modal-open - body class for killing the scroll
|
||||
// .modal - container to scroll within
|
||||
// .modal-dialog - positioning shell for the actual modal
|
||||
// .modal-content - actual modal w/ bg and corners and stuff
|
||||
|
||||
|
||||
// Kill the scroll on the body
|
||||
.modal-open {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
// Container that the modal scrolls within
|
||||
.modal {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: $zindex-modal;
|
||||
display: none;
|
||||
overflow: hidden;
|
||||
// Prevent Chrome on Windows from adding a focus outline. For details, see
|
||||
// https://github.com/twbs/bootstrap/pull/10951.
|
||||
outline: 0;
|
||||
// We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a
|
||||
// gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342
|
||||
// See also https://github.com/twbs/bootstrap/issues/17695
|
||||
|
||||
.modal-open & {
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
}
|
||||
}
|
||||
|
||||
// Shell div to position the modal with bottom padding
|
||||
.modal-dialog {
|
||||
position: relative;
|
||||
width: auto;
|
||||
margin: $modal-dialog-margin;
|
||||
// allow clicks to pass through for custom click handling to close modal
|
||||
pointer-events: none;
|
||||
|
||||
// When fading in the modal, animate it to slide down
|
||||
.modal.fade & {
|
||||
@include transition($modal-transition);
|
||||
transform: translate(0, -25%);
|
||||
}
|
||||
.modal.show & {
|
||||
transform: translate(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
.modal-dialog-centered {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
min-height: calc(100% - (#{$modal-dialog-margin} * 2));
|
||||
}
|
||||
|
||||
// Actual modal
|
||||
.modal-content {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`
|
||||
// counteract the pointer-events: none; in the .modal-dialog
|
||||
pointer-events: auto;
|
||||
background-color: $modal-content-bg;
|
||||
background-clip: padding-box;
|
||||
border: $modal-content-border-width solid $modal-content-border-color;
|
||||
@include border-radius($border-radius-lg);
|
||||
@include box-shadow($modal-content-box-shadow-xs);
|
||||
// Remove focus outline from opened modal
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
// Modal background
|
||||
.modal-backdrop {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: $zindex-modal-backdrop;
|
||||
background-color: $modal-backdrop-bg;
|
||||
|
||||
// Fade for backdrop
|
||||
&.fade { opacity: 0; }
|
||||
&.show { opacity: $modal-backdrop-opacity; }
|
||||
}
|
||||
|
||||
// Modal header
|
||||
// Top section of the modal w/ title and dismiss
|
||||
.modal-header {
|
||||
display: flex;
|
||||
align-items: flex-start; // so the close btn always stays on the upper right corner
|
||||
justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends
|
||||
padding: $modal-header-padding;
|
||||
border-bottom: $modal-header-border-width solid $modal-header-border-color;
|
||||
@include border-top-radius($border-radius-lg);
|
||||
|
||||
.close {
|
||||
padding: $modal-header-padding;
|
||||
// auto on the left force icon to the right even when there is no .modal-title
|
||||
margin: (-$modal-header-padding) (-$modal-header-padding) (-$modal-header-padding) auto;
|
||||
}
|
||||
}
|
||||
|
||||
// Title text within header
|
||||
.modal-title {
|
||||
margin-bottom: 0;
|
||||
line-height: $modal-title-line-height;
|
||||
}
|
||||
|
||||
// Modal body
|
||||
// Where all modal content resides (sibling of .modal-header and .modal-footer)
|
||||
.modal-body {
|
||||
position: relative;
|
||||
// Enable `flex-grow: 1` so that the body take up as much space as possible
|
||||
// when should there be a fixed height on `.modal-dialog`.
|
||||
flex: 1 1 auto;
|
||||
padding: $modal-inner-padding;
|
||||
}
|
||||
|
||||
// Footer (for actions)
|
||||
.modal-footer {
|
||||
display: flex;
|
||||
align-items: center; // vertically center
|
||||
justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items
|
||||
padding: $modal-inner-padding;
|
||||
border-top: $modal-footer-border-width solid $modal-footer-border-color;
|
||||
|
||||
// Easily place margin between footer elements
|
||||
> :not(:first-child) { margin-left: .25rem; }
|
||||
> :not(:last-child) { margin-right: .25rem; }
|
||||
}
|
||||
|
||||
// Measure scrollbar width for padding body during modal show/hide
|
||||
.modal-scrollbar-measure {
|
||||
position: absolute;
|
||||
top: -9999px;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
// Scale up the modal
|
||||
@include media-breakpoint-up(sm) {
|
||||
// Automatically set modal's width for larger viewports
|
||||
.modal-dialog {
|
||||
max-width: $modal-md;
|
||||
margin: $modal-dialog-margin-y-sm-up auto;
|
||||
}
|
||||
|
||||
.modal-dialog-centered {
|
||||
min-height: calc(100% - (#{$modal-dialog-margin-y-sm-up} * 2));
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
@include box-shadow($modal-content-box-shadow-sm-up);
|
||||
}
|
||||
|
||||
.modal-sm { max-width: $modal-sm; }
|
||||
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(lg) {
|
||||
.modal-lg { max-width: $modal-lg; }
|
||||
}
|
||||