commit
6347f1c9f0
2233 changed files with 859749 additions and 0 deletions
-
10.gitignore
-
0controle/__init__.py
-
3controle/admin.py
-
6controle/apps.py
-
2controle/crons/cron.py
-
101controle/filters.py
-
50348controle/fixtures/cidades.json
-
218controle/fixtures/estados.json
-
0controle/forms/__init__.py
-
30controle/forms/clientesForm.py
-
11controle/forms/pessoasForm.py
-
0controle/migrations/__init__.py
-
301controle/models.py
-
73controle/serializers.py
-
15controle/static/build/config/.eslintrc.json
-
14controle/static/build/config/postcss.config.js
-
32controle/static/build/config/rollup.config.js
-
33controle/static/build/js/AdminLTE.js
-
166controle/static/build/js/CardRefresh.js
-
238controle/static/build/js/CardWidget.js
-
336controle/static/build/js/ControlSidebar.js
-
84controle/static/build/js/DirectChat.js
-
146controle/static/build/js/Dropdown.js
-
124controle/static/build/js/ExpandableTable.js
-
130controle/static/build/js/Fullscreen.js
-
460controle/static/build/js/IFrame.js
-
262controle/static/build/js/Layout.js
-
113controle/static/build/js/NavbarSearch.js
-
229controle/static/build/js/PushMenu.js
-
299controle/static/build/js/SidebarSearch.js
-
209controle/static/build/js/Toasts.js
-
118controle/static/build/js/TodoList.js
-
175controle/static/build/js/Treeview.js
-
15controle/static/build/npm/.eslintrc.json
-
48controle/static/build/npm/DocsPlugins.js
-
58controle/static/build/npm/DocsPublish.js
-
449controle/static/build/npm/Plugins.js
-
59controle/static/build/npm/Publish.js
-
55controle/static/build/npm/vnu-jar.js
-
30controle/static/build/scss/_adminlte.raw.scss
-
52controle/static/build/scss/_alerts.scss
-
14controle/static/build/scss/_animation-effects.scss
-
922controle/static/build/scss/_bootstrap-variables.scss
-
106controle/static/build/scss/_brand.scss
-
179controle/static/build/scss/_buttons.scss
-
73controle/static/build/scss/_callout.scss
-
548controle/static/build/scss/_cards.scss
-
28controle/static/build/scss/_carousel.scss
-
44controle/static/build/scss/_close.scss
-
163controle/static/build/scss/_colors.scss
-
179controle/static/build/scss/_control-sidebar.scss
-
259controle/static/build/scss/_direct-chat.scss
-
295controle/static/build/scss/_dropdown.scss
-
14controle/static/build/scss/_elevation.scss
-
451controle/static/build/scss/_forms.scss
-
166controle/static/build/scss/_info-box.scss
-
708controle/static/build/scss/_layout.scss
-
179controle/static/build/scss/_main-header.scss
-
1209controle/static/build/scss/_main-sidebar.scss
-
541controle/static/build/scss/_miscellaneous.scss
-
17controle/static/build/scss/_mixins.scss
-
76controle/static/build/scss/_modals.scss
-
182controle/static/build/scss/_navs.scss
-
83controle/static/build/scss/_pagination.scss
-
24controle/static/build/scss/_preloader.scss
-
52controle/static/build/scss/_print.scss
-
68controle/static/build/scss/_products.scss
-
72controle/static/build/scss/_progress-bars.scss
-
14controle/static/build/scss/_root.scss
-
508controle/static/build/scss/_sidebar-mini.scss
-
165controle/static/build/scss/_small-box.scss
-
93controle/static/build/scss/_social-widgets.scss
-
175controle/static/build/scss/_table.scss
-
51controle/static/build/scss/_text.scss
-
155controle/static/build/scss/_timeline.scss
-
77controle/static/build/scss/_toasts.scss
-
54controle/static/build/scss/_users-list.scss
-
107controle/static/build/scss/_variables-alt.scss
-
248controle/static/build/scss/_variables.scss
-
25controle/static/build/scss/adminlte.scss
-
106controle/static/build/scss/mixins/_accent.scss
-
119controle/static/build/scss/mixins/_animations.scss
-
69controle/static/build/scss/mixins/_backgrounds.scss
-
82controle/static/build/scss/mixins/_cards.scss
-
123controle/static/build/scss/mixins/_custom-forms.scss
-
11controle/static/build/scss/mixins/_dark-mode.scss
-
17controle/static/build/scss/mixins/_direct-chat.scss
-
33controle/static/build/scss/mixins/_miscellaneous.scss
-
62controle/static/build/scss/mixins/_navbar.scss
-
38controle/static/build/scss/mixins/_scrollbar.scss
-
167controle/static/build/scss/mixins/_sidebar.scss
-
23controle/static/build/scss/mixins/_toasts.scss
-
11controle/static/build/scss/mixins/_touch-support.scss
-
43controle/static/build/scss/pages/_404_500_errors.scss
-
45controle/static/build/scss/pages/_e-commerce.scss
-
142controle/static/build/scss/pages/_iframe.scss
-
19controle/static/build/scss/pages/_invoice.scss
-
60controle/static/build/scss/pages/_kanban.scss
-
93controle/static/build/scss/pages/_lockscreen.scss
-
118controle/static/build/scss/pages/_login_and_register.scss
@ -0,0 +1,10 @@ |
|||
db.sqlite3 |
|||
venv/ |
|||
pip* |
|||
*.ini |
|||
*.pyc |
|||
*.sqlite3 |
|||
/static |
|||
media/ |
|||
**/migrations/*[0-9]*.py |
|||
.idea |
|||
@ -0,0 +1,3 @@ |
|||
from django.contrib import admin |
|||
|
|||
# Register your models here. |
|||
@ -0,0 +1,6 @@ |
|||
from django.apps import AppConfig |
|||
|
|||
|
|||
class ControleConfig(AppConfig): |
|||
default_auto_field = 'django.db.models.BigAutoField' |
|||
name = 'controle' |
|||
@ -0,0 +1,2 @@ |
|||
def my_cron_job(): |
|||
print('my cron job is working!') |
|||
@ -0,0 +1,101 @@ |
|||
from django_filters import FilterSet, CharFilter, NumberFilter, OrderingFilter, ModelChoiceFilter, ModelMultipleChoiceFilter |
|||
from django.utils.translation import ugettext_lazy as _ |
|||
from .models import Cidade, Cliente, Pessoa, Endereco, Telefone, TelefoneCliente |
|||
|
|||
|
|||
class PessoaFiltro(FilterSet): |
|||
nome = CharFilter( |
|||
label=_('Nome'), lookup_expr='icontains', field_name='nome') |
|||
cpf = CharFilter(label=_('CPF'), lookup_expr='icontains', field_name='cpf') |
|||
endereco = CharFilter(label=_('Endereco'), method='filter_endereco') |
|||
cidade = NumberFilter(label=_('Cidade'), method='filter_cidade') |
|||
telefone = CharFilter(label=_('Telefone'), method='filter_telefone') |
|||
ordering = OrderingFilter( |
|||
label=_('Ordem'), |
|||
fields=( |
|||
('nome', 'nome'), |
|||
('cidade', 'cidade'), |
|||
), |
|||
field_labels={ |
|||
'nome': _('Nome'), |
|||
'-nome': _('Nome (Decrescente)'), |
|||
# 'cidade': _('Cidade'), |
|||
# '-cidade': _('Cidade (Decrescente)'), |
|||
} |
|||
) |
|||
|
|||
class Meta: |
|||
model = Pessoa |
|||
fields = { |
|||
'data_nascimento': ['lte', 'gte'], |
|||
'criado': ['lte', 'gte'], |
|||
'modificado': ['lte', 'gte'], |
|||
'situacao': ['exact'], |
|||
} |
|||
|
|||
def filter_endereco(self, queryset, field, value): |
|||
if value: |
|||
queryset = queryset.filter(enderecos__endereco__icontains=value) |
|||
return queryset |
|||
|
|||
def filter_cidade(self, queryset, field, value): |
|||
if value: |
|||
queryset = queryset.filter(pk__in=Endereco.objects.filter( |
|||
cidade=value).values_list('pessoa_id', flat=True)) |
|||
|
|||
return queryset |
|||
|
|||
def filter_telefone(self, queryset, field, value): |
|||
if value: |
|||
queryset = queryset.filter(pk__in=Telefone.objects.filter( |
|||
numero__icontains=value).values_list('pessoa_id', flat=True)) |
|||
|
|||
return queryset |
|||
|
|||
|
|||
class ClienteFiltro(FilterSet): |
|||
razao_social = CharFilter( |
|||
label=_('Razão Social'), lookup_expr='icontains', field_name='razao_social') |
|||
cnpj = CharFilter( |
|||
label=_('CNPJ'), lookup_expr='icontains', field_name='cnpj') |
|||
ie = CharFilter( |
|||
label=_('IE'), lookup_expr='icontains', field_name='ie') |
|||
im = CharFilter( |
|||
label=_('IM'), lookup_expr='icontains', field_name='im') |
|||
endereco = CharFilter( |
|||
label=_('Endereço'), lookup_expr='icontains', field_name='endereco') |
|||
cidade = ModelMultipleChoiceFilter( |
|||
label=_('Cidade'), queryset=Cidade.objects.all()) |
|||
responsaveis = ModelMultipleChoiceFilter( |
|||
label=_('Responsáveis'), queryset=Pessoa.objects.all()) |
|||
socios = ModelMultipleChoiceFilter( |
|||
label=_('Sócios'), queryset=Pessoa.objects.all()) |
|||
telefone = CharFilter(label=_('Telefone'), method='filter_telefone') |
|||
|
|||
ordering = OrderingFilter( |
|||
label=_('Ordem'), |
|||
fields=( |
|||
('razao_social', 'razao_social'), |
|||
), |
|||
field_labels={ |
|||
'razao_social': _(u'Razão Social'), |
|||
'-razao_social': _(u'Razão Social (Decrescente)'), |
|||
} |
|||
) |
|||
|
|||
class Meta: |
|||
model = Cliente |
|||
fields = { |
|||
'data_adesao': ['lte', 'gte'], |
|||
'criado': ['lte', 'gte'], |
|||
'modificado': ['lte', 'gte'], |
|||
'situacao': ['exact'], |
|||
'ativo': ['exact'], |
|||
} |
|||
|
|||
def filter_telefone(self, queryset, field, value): |
|||
if value: |
|||
queryset = queryset.filter(pk__in=TelefoneCliente.objects.filter( |
|||
numero__icontains=value).values_list('cliente_id', flat=True)) |
|||
|
|||
return queryset |
|||
50348
controle/fixtures/cidades.json
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,218 @@ |
|||
[ |
|||
{ |
|||
"fields": { |
|||
"sigla": "AC", |
|||
"nome": "Acre" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 1 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "AL", |
|||
"nome": "Alagoas" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 2 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "AM", |
|||
"nome": "Amazonas" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 3 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "AP", |
|||
"nome": "Amapá" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 4 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "BA", |
|||
"nome": "Bahia" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 5 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "CE", |
|||
"nome": "Ceará" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 6 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "DF", |
|||
"nome": "Distrito Federal" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 7 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "ES", |
|||
"nome": "Espírito Santo" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 8 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "GO", |
|||
"nome": "Goiás" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 9 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "MA", |
|||
"nome": "Maranhão" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 10 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "MG", |
|||
"nome": "Minas Gerais" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 11 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "MS", |
|||
"nome": "Mato Grosso do Sul" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 12 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "MT", |
|||
"nome": "Mato Grosso" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 13 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "PA", |
|||
"nome": "Pará" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 14 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "PB", |
|||
"nome": "Paraíba" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 15 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "PE", |
|||
"nome": "Pernambuco" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 16 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "PI", |
|||
"nome": "Piauí" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 17 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "PR", |
|||
"nome": "Paraná" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 18 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "RJ", |
|||
"nome": "Rio de Janeiro" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 19 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "RN", |
|||
"nome": "Rio Grande do Norte" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 20 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "RO", |
|||
"nome": "Rondônia" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 21 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "RR", |
|||
"nome": "Roraima" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 22 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "RS", |
|||
"nome": "Rio Grande do Sul" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 23 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "SC", |
|||
"nome": "Santa Catarina" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 24 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "SE", |
|||
"nome": "Sergipe" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 25 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "SP", |
|||
"nome": "São Paulo" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 26 |
|||
}, |
|||
{ |
|||
"fields": { |
|||
"sigla": "TO", |
|||
"nome": "Tocantis" |
|||
}, |
|||
"model": "controle.estado", |
|||
"pk": 27 |
|||
} |
|||
] |
|||
@ -0,0 +1,30 @@ |
|||
from django.forms import ChoiceField, DecimalField, FileField, IntegerField, ModelForm, ModelMultipleChoiceField |
|||
from controle.models import Boleto, Cliente, Pessoa, TelefoneCliente |
|||
from django.forms import inlineformset_factory |
|||
|
|||
|
|||
class ClienteForm(ModelForm): |
|||
responsaveis = ModelMultipleChoiceField( |
|||
queryset=Pessoa.objects.all(), label='Responsáveis') |
|||
socios = ModelMultipleChoiceField(required=False, |
|||
queryset=Pessoa.objects.all(), label='Sócios') |
|||
|
|||
periodo_carencia = IntegerField(required=False) |
|||
valor_carencia = DecimalField(required=False) |
|||
porcentagem_carencia = DecimalField(required=False) |
|||
# periodicidade_boletos = ChoiceField(required=False) |
|||
contrato = FileField( |
|||
label='Escolha Arquivo:', |
|||
help_text='max. 42 megabytes' |
|||
) |
|||
|
|||
class Meta: |
|||
model = Cliente |
|||
fields = '__all__' |
|||
|
|||
|
|||
TelefoneFormSet = inlineformset_factory( |
|||
Cliente, TelefoneCliente, exclude=[], extra=1) |
|||
|
|||
BoletoFormSet = inlineformset_factory( |
|||
Cliente, Boleto, exclude=[], extra=0) |
|||
@ -0,0 +1,11 @@ |
|||
from django.forms import inlineformset_factory |
|||
from controle.models import Pessoa, Notas, Email, Telefone, Endereco |
|||
|
|||
|
|||
EnderecoFormSet = inlineformset_factory(Pessoa, Endereco, exclude=[], extra=1) |
|||
|
|||
TelefoneFormSet = inlineformset_factory(Pessoa, Telefone, exclude=[], extra=1) |
|||
|
|||
NotasFormSet = inlineformset_factory(Pessoa, Notas, exclude=[], extra=1) |
|||
|
|||
EmailsFormSet = inlineformset_factory(Pessoa, Email, exclude=[], extra=1) |
|||
@ -0,0 +1,301 @@ |
|||
from datetime import datetime |
|||
from django.core.validators import MinValueValidator |
|||
from django.db.models import CASCADE, PROTECT, Q, BooleanField, CharField, DateField, DateTimeField, DecimalField, FileField, ForeignKey, IntegerField, ManyToManyField, Model, PositiveIntegerField, TextField |
|||
from django.utils.translation import ugettext_lazy as _ |
|||
import os |
|||
|
|||
|
|||
def get_upload_path(instance, filename): |
|||
return os.path.join(str(type(instance).__name__), filename) |
|||
|
|||
|
|||
class Estado(Model): |
|||
nome = CharField(_('nome'), max_length=60) |
|||
sigla = CharField(_('sigla'), max_length=2) |
|||
|
|||
class Meta: |
|||
verbose_name = _('Estado') |
|||
verbose_name_plural = _('Estados') |
|||
ordering = ['nome'] |
|||
|
|||
def __str__(self): |
|||
return self.nome |
|||
|
|||
|
|||
class Cidade(Model): |
|||
nome = CharField(_('nome'), max_length=60) |
|||
estado = ForeignKey(Estado, verbose_name=_('estado'), |
|||
related_name='cidades', on_delete=PROTECT) |
|||
ibge = CharField(_(u'código IBGE'), max_length=7) |
|||
|
|||
class Meta: |
|||
verbose_name = _('Cidade') |
|||
verbose_name_plural = _('Cidades') |
|||
ordering = ['nome'] |
|||
|
|||
@property |
|||
def label(self): |
|||
return u'{city}-{state}'.format( |
|||
city=self.nome, |
|||
state=self.estado.sigla |
|||
) |
|||
|
|||
def __str__(self): |
|||
return self.label |
|||
|
|||
|
|||
class Pessoa(Model): |
|||
SITUACAO = ( |
|||
("A", "Ativo"), |
|||
("I", "Inativo"), |
|||
) |
|||
|
|||
nome = CharField(_(u'nome'), max_length=255) |
|||
cpf = CharField('CPF', max_length=14, unique=True, blank=True, null=True) |
|||
data_nascimento = DateField(_('data de nascimento'), blank=True, null=True) |
|||
ativo = BooleanField(_("ativo"), default=True) |
|||
situacao = CharField(_(u'situação'), max_length=1, |
|||
choices=SITUACAO, default='A') |
|||
criado = DateTimeField(auto_now_add=True, editable=False, |
|||
verbose_name=_('cadastrado em'), null=True) |
|||
modificado = DateTimeField( |
|||
auto_now=True, editable=False, verbose_name=_('alterado em'), null=True) |
|||
|
|||
class Meta: |
|||
verbose_name = _('Pessoa') |
|||
verbose_name_plural = _('Pessoas') |
|||
ordering = ['nome'] |
|||
|
|||
def __str__(self): |
|||
return self.nome |
|||
|
|||
@property |
|||
def label(self): |
|||
return u'{nome} - {cpf}'.format( |
|||
nome=self.nome, |
|||
cpf=self.cpf |
|||
) |
|||
|
|||
|
|||
class Endereco(Model): |
|||
pessoa = ForeignKey(Pessoa, related_name='enderecos', on_delete=CASCADE) |
|||
endereco = CharField(_(u'endereço'), max_length=60, blank=True, null=True) |
|||
numero = IntegerField(_(u'número'), blank=True, null=True) |
|||
complemento = CharField( |
|||
_('complemento'), max_length=20, blank=True, null=True) |
|||
bairro = CharField(_('bairro'), max_length=60, blank=True, null=True) |
|||
cep = CharField(_('CEP'), max_length=9, blank=True, null=True) |
|||
cidade = ForeignKey(Cidade, verbose_name=_('cidade'), on_delete=PROTECT, |
|||
related_name='pessoa_%(class)ss', blank=True, null=True) |
|||
criado = DateTimeField(auto_now_add=True, editable=False, |
|||
verbose_name=_('cadastrado em'), null=True) |
|||
modificado = DateTimeField( |
|||
auto_now=True, editable=False, verbose_name=_('alterado em'), null=True) |
|||
|
|||
class Meta: |
|||
verbose_name = _('Endereço') |
|||
verbose_name_plural = _('Endereços') |
|||
ordering = ['endereco'] |
|||
|
|||
|
|||
class Telefone(Model): |
|||
TYPES = ( |
|||
('F', _('Fixo')), |
|||
('M', _('Celular')), |
|||
('C', _('Comercial')), |
|||
) |
|||
ddd = CharField(_('DDD'), max_length=2) |
|||
numero = CharField(_('número'), max_length=10) |
|||
tipo = CharField(_('tipo'), max_length=1, choices=TYPES, blank=True) |
|||
principal = BooleanField(_('principal'), default=False) |
|||
pessoa = ForeignKey(Pessoa, related_name='telefones', on_delete=CASCADE) |
|||
telegram = BooleanField(default=False) |
|||
whatsapp = BooleanField(default=False) |
|||
criado = DateTimeField(auto_now_add=True, editable=False, |
|||
verbose_name=_('cadastrado em'), null=True) |
|||
modificado = DateTimeField( |
|||
auto_now=True, editable=False, verbose_name=_('alterado em'), null=True) |
|||
|
|||
class Meta: |
|||
verbose_name = _('Telefone') |
|||
verbose_name_plural = _('Telefones') |
|||
ordering = ['tipo'] |
|||
|
|||
def __str__(self): |
|||
return f'({self.ddd}) {self.numero}' |
|||
|
|||
|
|||
class Email(Model): |
|||
email = CharField(_('email'), max_length=255) |
|||
pessoa = ForeignKey(Pessoa, related_name='emails', on_delete=CASCADE) |
|||
criado = DateTimeField(auto_now_add=True, editable=False, |
|||
verbose_name=_('cadastrado em'), null=True) |
|||
modificado = DateTimeField( |
|||
auto_now=True, editable=False, verbose_name=_('alterado em'), null=True) |
|||
|
|||
class Meta: |
|||
verbose_name = _('Email') |
|||
verbose_name_plural = _('Emails') |
|||
ordering = ['email'] |
|||
|
|||
|
|||
class Notas(Model): |
|||
nota = TextField(_('nota')) |
|||
pessoa = ForeignKey(Pessoa, related_name='notas', on_delete=CASCADE) |
|||
criado = DateTimeField(auto_now_add=True, editable=False, |
|||
verbose_name=_('cadastrado em'), null=True) |
|||
modificado = DateTimeField( |
|||
auto_now=True, editable=False, verbose_name=_('alterado em'), null=True) |
|||
|
|||
class Meta: |
|||
verbose_name = _('Nota') |
|||
verbose_name_plural = _('Notas') |
|||
ordering = ['modificado'] |
|||
|
|||
|
|||
class Cliente(Model): |
|||
SITUACAO = ( |
|||
('E', 'Em dia'), |
|||
('A', 'Atrasado'), |
|||
('I', 'Inadimplente'), |
|||
) |
|||
DESCONTOS = ( |
|||
('P', 'Porcentagem'), |
|||
('V', 'Valor Fixo'), |
|||
) |
|||
PERIODICIDADE = ( |
|||
("1", u'Diário'), |
|||
("7", 'Semanal'), |
|||
("30", 'Mensal'), |
|||
("60", 'Bimestral'), |
|||
("90", 'Trimestral'), |
|||
("120", 'Semestral'), |
|||
("360", 'Anual'), |
|||
) |
|||
razao_social = CharField(_(u'razão social'), max_length=255) |
|||
nome_fantasia = CharField(_(u'nome fantasia'), max_length=255) |
|||
cnpj = CharField('CNPJ', max_length=18, unique=True, blank=True, null=True) |
|||
ie = CharField('inscrição estadual', max_length=20, |
|||
unique=True, blank=True, null=True) |
|||
im = CharField('inscrição municipal', max_length=20, |
|||
unique=True, blank=True, null=True) |
|||
ativo = BooleanField(_("ativo"), default=True) |
|||
situacao = CharField(_(u'situação'), max_length=1, |
|||
choices=SITUACAO, default='E') |
|||
endereco = CharField(_(u'endereço matriz'), |
|||
max_length=60, blank=True, null=True) |
|||
numero = IntegerField(_(u'nº matriz'), blank=True, null=True) |
|||
complemento = CharField( |
|||
_('complemento matriz'), max_length=20, blank=True, null=True) |
|||
bairro = CharField(_('bairro matriz'), max_length=60, |
|||
blank=True, null=True) |
|||
cep = CharField(_('CEP matriz'), max_length=9, blank=True, null=True) |
|||
cidade = ForeignKey(Cidade, verbose_name=_('cidade matriz'), on_delete=PROTECT, |
|||
related_name='cliente_%(class)ss', blank=True, null=True) |
|||
responsaveis = ManyToManyField(Pessoa, verbose_name=_( |
|||
'responsaveis'), related_name='eh_responsavel') |
|||
socios = ManyToManyField(Pessoa, verbose_name=_( |
|||
'socios'), related_name='eh_socio') |
|||
retaguarda = CharField(_(u'endereço da retaguarda'), max_length=255) |
|||
nome_banco_dados = CharField(_(u'nome do banco de dados'), max_length=255) |
|||
contrato = FileField(_('contrato'), upload_to=get_upload_path) |
|||
data_adesao = DateField(verbose_name=_('data de adesão')) |
|||
data_de_vencimento = DateField(verbose_name=_('data do vencimento')) |
|||
valor_base_contrato = DecimalField( |
|||
_('valor base do contrato'), max_digits=25, decimal_places=2) |
|||
indice_reajuste = DecimalField( |
|||
_(u'índice de reajuste'), max_digits=8, decimal_places=4) |
|||
qtd_pdvs = IntegerField(_(u'nº de pdvs'), |
|||
validators=[MinValueValidator(1)]) |
|||
tipo_desconto = CharField(_(u'tipo de desconto'), max_length=1, |
|||
choices=DESCONTOS, default='P') |
|||
carencia = BooleanField(_(u'carência'), default=False) |
|||
periodo_carencia = PositiveIntegerField( |
|||
_(u'período de carência (em meses)'), default=0, |
|||
validators=[MinValueValidator(0)]) |
|||
valor_carencia = DecimalField( |
|||
_('valor da carência'), default=0, |
|||
max_digits=25, decimal_places=2) |
|||
porcentagem_carencia = DecimalField( |
|||
_('porcentagem da carência'), default=0, |
|||
max_digits=8, decimal_places=4) |
|||
periodicidade_boletos = CharField( |
|||
_(u'periodicidade dos boletos'), default="30", |
|||
choices=PERIODICIDADE, max_length=3) |
|||
usuarios_bloqueados = BooleanField( |
|||
_(u"usuários bloqueados?"), default=True) |
|||
|
|||
criado = DateTimeField(auto_now_add=True, editable=False, |
|||
verbose_name=_('cadastrado em'), null=True) |
|||
modificado = DateTimeField( |
|||
auto_now=True, editable=False, verbose_name=_('alterado em'), null=True) |
|||
|
|||
class Meta: |
|||
verbose_name = _('Cliente') |
|||
verbose_name_plural = _('Cliente') |
|||
ordering = ['razao_social'] |
|||
|
|||
def __str__(self): |
|||
return f'{self.razao_social[0:20]} - {self.cnpj}' |
|||
|
|||
@property |
|||
def atrasado(self): |
|||
return self.boletos.filter(Q(situacao='A'), Q(data_vencimento__lt=datetime.today().date())).count() > 0 |
|||
|
|||
|
|||
class TelefoneCliente(Model): |
|||
TYPES = ( |
|||
('F', _('Fixo')), |
|||
('M', _('Celular')), |
|||
('C', _('Comercial')), |
|||
) |
|||
ddd = CharField(_('DDD'), max_length=2) |
|||
numero = CharField(_('número'), max_length=10) |
|||
tipo = CharField(_('tipo'), max_length=1, choices=TYPES, blank=True) |
|||
principal = BooleanField(_('principal'), default=False) |
|||
cliente = ForeignKey(Cliente, related_name='telefones', on_delete=CASCADE) |
|||
telegram = BooleanField(default=False) |
|||
whatsapp = BooleanField(default=False) |
|||
criado = DateTimeField(auto_now_add=True, editable=False, |
|||
verbose_name=_('cadastrado em'), null=True) |
|||
modificado = DateTimeField( |
|||
auto_now=True, editable=False, verbose_name=_('alterado em'), null=True) |
|||
|
|||
class Meta: |
|||
verbose_name = _('Telefone') |
|||
verbose_name_plural = _('Telefones') |
|||
ordering = ['tipo'] |
|||
|
|||
def __str__(self): |
|||
return f'({self.ddd}) {self.numero}' |
|||
|
|||
|
|||
class Boleto(Model): |
|||
SITUACAO = ( |
|||
('A', 'Aberto'), |
|||
('B', 'Baixado'), |
|||
) |
|||
cliente = ForeignKey(Cliente, related_name='boletos', on_delete=CASCADE) |
|||
nosso_numero = CharField( |
|||
_(u'nosso número'), max_length=255, blank=True, null=True) |
|||
numero_boleto = CharField(_(u'número do boleto'), max_length=255) |
|||
data_vencimento = DateField(_('data de vencimento')) |
|||
data_geracao = DateField(_(u'data de geração')) |
|||
situacao = CharField(_(u'situação'), max_length=1, |
|||
choices=SITUACAO, default='A', blank=True) |
|||
valor = DecimalField( |
|||
_('valor do boleto'), max_digits=25, decimal_places=2) |
|||
|
|||
criado = DateTimeField(auto_now_add=True, editable=False, |
|||
verbose_name=_('cadastrado em'), null=True) |
|||
modificado = DateTimeField( |
|||
auto_now=True, editable=False, verbose_name=_('alterado em'), null=True) |
|||
|
|||
class Meta: |
|||
verbose_name = _('Boleto') |
|||
verbose_name_plural = _('Boletos') |
|||
ordering = ['numero_boleto'] |
|||
|
|||
@property |
|||
def atrasado(self): |
|||
return self.data_vencimento < datetime.today().date() |
|||
@ -0,0 +1,73 @@ |
|||
from controle.models import Cidade, Email, Endereco, Estado, Notas, Pessoa, Telefone |
|||
from rest_framework import serializers |
|||
|
|||
# Serializers define the API representation. |
|||
|
|||
|
|||
class EstadoSerializer(serializers.ModelSerializer): |
|||
class Meta: |
|||
model = Estado |
|||
fields = '__all__' |
|||
|
|||
|
|||
class CidadeSerializer(serializers.HyperlinkedModelSerializer): |
|||
id = serializers.IntegerField() |
|||
url = serializers.HyperlinkedIdentityField( |
|||
view_name="controle:cidade-detail") |
|||
estado = serializers.HyperlinkedRelatedField( |
|||
read_only=True, |
|||
view_name="controle:estado-detail") |
|||
label = serializers.ReadOnlyField() |
|||
|
|||
class Meta: |
|||
model = Cidade |
|||
fields = '__all__' |
|||
|
|||
|
|||
class NestedEnderecosSerializer(serializers.ModelSerializer): |
|||
id = serializers.IntegerField(required=False) |
|||
|
|||
class Meta: |
|||
model = Endereco |
|||
fields = '__all__' |
|||
read_only_fields = ['pessoa'] |
|||
|
|||
|
|||
class NestedTelefonesSerializer(serializers.ModelSerializer): |
|||
id = serializers.IntegerField(required=False) |
|||
|
|||
class Meta: |
|||
model = Telefone |
|||
fields = '__all__' |
|||
read_only_fields = ['pessoa'] |
|||
|
|||
|
|||
class NestedEmailsSerializer(serializers.ModelSerializer): |
|||
id = serializers.IntegerField(required=False) |
|||
|
|||
class Meta: |
|||
model = Email |
|||
fields = '__all__' |
|||
read_only_fields = ['pessoa'] |
|||
|
|||
|
|||
class NestedNotasSerializer(serializers.ModelSerializer): |
|||
id = serializers.IntegerField(required=False) |
|||
|
|||
class Meta: |
|||
model = Notas |
|||
fields = '__all__' |
|||
read_only_fields = ['pessoa'] |
|||
|
|||
|
|||
class PessoaSerializer(serializers.ModelSerializer): |
|||
enderecos = NestedEnderecosSerializer(many=True, required=False) |
|||
telefones = NestedTelefonesSerializer(many=True, required=False) |
|||
emails = NestedEmailsSerializer(many=True, required=False) |
|||
notas = NestedNotasSerializer(many=True, required=False) |
|||
|
|||
label = serializers.ReadOnlyField() |
|||
|
|||
class Meta: |
|||
model = Pessoa |
|||
fields = '__all__' |
|||
@ -0,0 +1,15 @@ |
|||
{ |
|||
"env": { |
|||
"browser": false, |
|||
"node": true |
|||
}, |
|||
"parserOptions": { |
|||
"sourceType": "script" |
|||
}, |
|||
"extends": "../../.eslintrc.json", |
|||
"rules": { |
|||
"no-console": "off", |
|||
"strict": "error", |
|||
"unicorn/prefer-module": "off" |
|||
} |
|||
} |
|||
@ -0,0 +1,14 @@ |
|||
'use strict' |
|||
|
|||
module.exports = { |
|||
map: { |
|||
inline: false, |
|||
annotation: true, |
|||
sourcesContent: true |
|||
}, |
|||
plugins: [ |
|||
require('autoprefixer')({ |
|||
cascade: false |
|||
}) |
|||
] |
|||
} |
|||
@ -0,0 +1,32 @@ |
|||
'use strict' |
|||
|
|||
const { babel } = require('@rollup/plugin-babel') |
|||
|
|||
const pkg = require('../../package') |
|||
const year = new Date().getFullYear() |
|||
const banner = `/*!
|
|||
* AdminLTE v${pkg.version} (${pkg.homepage}) |
|||
* Copyright 2014-${year} ${pkg.author} |
|||
* Licensed under MIT (https://github.com/ColorlibHQ/AdminLTE/blob/master/LICENSE)
|
|||
*/` |
|||
|
|||
module.exports = { |
|||
input: 'build/js/AdminLTE.js', |
|||
output: { |
|||
banner, |
|||
file: 'dist/js/adminlte.js', |
|||
format: 'umd', |
|||
globals: { |
|||
jquery: 'jQuery' |
|||
}, |
|||
name: 'adminlte' |
|||
}, |
|||
external: ['jquery'], |
|||
plugins: [ |
|||
babel({ |
|||
exclude: 'node_modules/**', |
|||
// Include the helpers in the bundle, at most one copy of each
|
|||
babelHelpers: 'bundled' |
|||
}) |
|||
] |
|||
} |
|||
@ -0,0 +1,33 @@ |
|||
import CardRefresh from './CardRefresh' |
|||
import CardWidget from './CardWidget' |
|||
import ControlSidebar from './ControlSidebar' |
|||
import DirectChat from './DirectChat' |
|||
import Dropdown from './Dropdown' |
|||
import ExpandableTable from './ExpandableTable' |
|||
import Fullscreen from './Fullscreen' |
|||
import IFrame from './IFrame' |
|||
import Layout from './Layout' |
|||
import PushMenu from './PushMenu' |
|||
import SidebarSearch from './SidebarSearch' |
|||
import NavbarSearch from './NavbarSearch' |
|||
import Toasts from './Toasts' |
|||
import TodoList from './TodoList' |
|||
import Treeview from './Treeview' |
|||
|
|||
export { |
|||
CardRefresh, |
|||
CardWidget, |
|||
ControlSidebar, |
|||
DirectChat, |
|||
Dropdown, |
|||
ExpandableTable, |
|||
Fullscreen, |
|||
IFrame, |
|||
Layout, |
|||
PushMenu, |
|||
SidebarSearch, |
|||
NavbarSearch, |
|||
Toasts, |
|||
TodoList, |
|||
Treeview |
|||
} |
|||
@ -0,0 +1,166 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE CardRefresh.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $ from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'CardRefresh' |
|||
const DATA_KEY = 'lte.cardrefresh' |
|||
const EVENT_KEY = `.${DATA_KEY}` |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const EVENT_LOADED = `loaded${EVENT_KEY}` |
|||
const EVENT_OVERLAY_ADDED = `overlay.added${EVENT_KEY}` |
|||
const EVENT_OVERLAY_REMOVED = `overlay.removed${EVENT_KEY}` |
|||
|
|||
const CLASS_NAME_CARD = 'card' |
|||
|
|||
const SELECTOR_CARD = `.${CLASS_NAME_CARD}` |
|||
const SELECTOR_DATA_REFRESH = '[data-card-widget="card-refresh"]' |
|||
|
|||
const Default = { |
|||
source: '', |
|||
sourceSelector: '', |
|||
params: {}, |
|||
trigger: SELECTOR_DATA_REFRESH, |
|||
content: '.card-body', |
|||
loadInContent: true, |
|||
loadOnInit: true, |
|||
loadErrorTemplate: true, |
|||
responseType: '', |
|||
overlayTemplate: '<div class="overlay"><i class="fas fa-2x fa-sync-alt fa-spin"></i></div>', |
|||
errorTemplate: '<span class="text-danger"></span>', |
|||
onLoadStart() {}, |
|||
onLoadDone(response) { |
|||
return response |
|||
}, |
|||
onLoadFail(_jqXHR, _textStatus, _errorThrown) {} |
|||
} |
|||
|
|||
class CardRefresh { |
|||
constructor(element, settings) { |
|||
this._element = element |
|||
this._parent = element.parents(SELECTOR_CARD).first() |
|||
this._settings = $.extend({}, Default, settings) |
|||
this._overlay = $(this._settings.overlayTemplate) |
|||
|
|||
if (element.hasClass(CLASS_NAME_CARD)) { |
|||
this._parent = element |
|||
} |
|||
|
|||
if (this._settings.source === '') { |
|||
throw new Error('Source url was not defined. Please specify a url in your CardRefresh source option.') |
|||
} |
|||
} |
|||
|
|||
load() { |
|||
this._addOverlay() |
|||
this._settings.onLoadStart.call($(this)) |
|||
|
|||
$.get(this._settings.source, this._settings.params, response => { |
|||
if (this._settings.loadInContent) { |
|||
if (this._settings.sourceSelector !== '') { |
|||
response = $(response).find(this._settings.sourceSelector).html() |
|||
} |
|||
|
|||
this._parent.find(this._settings.content).html(response) |
|||
} |
|||
|
|||
this._settings.onLoadDone.call($(this), response) |
|||
this._removeOverlay() |
|||
}, this._settings.responseType !== '' && this._settings.responseType) |
|||
.fail((jqXHR, textStatus, errorThrown) => { |
|||
this._removeOverlay() |
|||
|
|||
if (this._settings.loadErrorTemplate) { |
|||
const msg = $(this._settings.errorTemplate).text(errorThrown) |
|||
this._parent.find(this._settings.content).empty().append(msg) |
|||
} |
|||
|
|||
this._settings.onLoadFail.call($(this), jqXHR, textStatus, errorThrown) |
|||
}) |
|||
|
|||
$(this._element).trigger($.Event(EVENT_LOADED)) |
|||
} |
|||
|
|||
_addOverlay() { |
|||
this._parent.append(this._overlay) |
|||
$(this._element).trigger($.Event(EVENT_OVERLAY_ADDED)) |
|||
} |
|||
|
|||
_removeOverlay() { |
|||
this._parent.find(this._overlay).remove() |
|||
$(this._element).trigger($.Event(EVENT_OVERLAY_REMOVED)) |
|||
} |
|||
|
|||
// Private
|
|||
|
|||
_init() { |
|||
$(this).find(this._settings.trigger).on('click', () => { |
|||
this.load() |
|||
}) |
|||
|
|||
if (this._settings.loadOnInit) { |
|||
this.load() |
|||
} |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(config) { |
|||
let data = $(this).data(DATA_KEY) |
|||
const _options = $.extend({}, Default, $(this).data()) |
|||
|
|||
if (!data) { |
|||
data = new CardRefresh($(this), _options) |
|||
$(this).data(DATA_KEY, typeof config === 'string' ? data : config) |
|||
} |
|||
|
|||
if (typeof config === 'string' && /load/.test(config)) { |
|||
data[config]() |
|||
} else { |
|||
data._init($(this)) |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Data API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$(document).on('click', SELECTOR_DATA_REFRESH, function (event) { |
|||
if (event) { |
|||
event.preventDefault() |
|||
} |
|||
|
|||
CardRefresh._jQueryInterface.call($(this), 'load') |
|||
}) |
|||
|
|||
$(() => { |
|||
$(SELECTOR_DATA_REFRESH).each(function () { |
|||
CardRefresh._jQueryInterface.call($(this)) |
|||
}) |
|||
}) |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = CardRefresh._jQueryInterface |
|||
$.fn[NAME].Constructor = CardRefresh |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return CardRefresh._jQueryInterface |
|||
} |
|||
|
|||
export default CardRefresh |
|||
@ -0,0 +1,238 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE CardWidget.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $ from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'CardWidget' |
|||
const DATA_KEY = 'lte.cardwidget' |
|||
const EVENT_KEY = `.${DATA_KEY}` |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const EVENT_EXPANDED = `expanded${EVENT_KEY}` |
|||
const EVENT_COLLAPSED = `collapsed${EVENT_KEY}` |
|||
const EVENT_MAXIMIZED = `maximized${EVENT_KEY}` |
|||
const EVENT_MINIMIZED = `minimized${EVENT_KEY}` |
|||
const EVENT_REMOVED = `removed${EVENT_KEY}` |
|||
|
|||
const CLASS_NAME_CARD = 'card' |
|||
const CLASS_NAME_COLLAPSED = 'collapsed-card' |
|||
const CLASS_NAME_COLLAPSING = 'collapsing-card' |
|||
const CLASS_NAME_EXPANDING = 'expanding-card' |
|||
const CLASS_NAME_WAS_COLLAPSED = 'was-collapsed' |
|||
const CLASS_NAME_MAXIMIZED = 'maximized-card' |
|||
|
|||
const SELECTOR_DATA_REMOVE = '[data-card-widget="remove"]' |
|||
const SELECTOR_DATA_COLLAPSE = '[data-card-widget="collapse"]' |
|||
const SELECTOR_DATA_MAXIMIZE = '[data-card-widget="maximize"]' |
|||
const SELECTOR_CARD = `.${CLASS_NAME_CARD}` |
|||
const SELECTOR_CARD_HEADER = '.card-header' |
|||
const SELECTOR_CARD_BODY = '.card-body' |
|||
const SELECTOR_CARD_FOOTER = '.card-footer' |
|||
|
|||
const Default = { |
|||
animationSpeed: 'normal', |
|||
collapseTrigger: SELECTOR_DATA_COLLAPSE, |
|||
removeTrigger: SELECTOR_DATA_REMOVE, |
|||
maximizeTrigger: SELECTOR_DATA_MAXIMIZE, |
|||
collapseIcon: 'fa-minus', |
|||
expandIcon: 'fa-plus', |
|||
maximizeIcon: 'fa-expand', |
|||
minimizeIcon: 'fa-compress' |
|||
} |
|||
|
|||
class CardWidget { |
|||
constructor(element, settings) { |
|||
this._element = element |
|||
this._parent = element.parents(SELECTOR_CARD).first() |
|||
|
|||
if (element.hasClass(CLASS_NAME_CARD)) { |
|||
this._parent = element |
|||
} |
|||
|
|||
this._settings = $.extend({}, Default, settings) |
|||
} |
|||
|
|||
collapse() { |
|||
this._parent.addClass(CLASS_NAME_COLLAPSING).children(`${SELECTOR_CARD_BODY}, ${SELECTOR_CARD_FOOTER}`) |
|||
.slideUp(this._settings.animationSpeed, () => { |
|||
this._parent.addClass(CLASS_NAME_COLLAPSED).removeClass(CLASS_NAME_COLLAPSING) |
|||
}) |
|||
|
|||
this._parent.find(`> ${SELECTOR_CARD_HEADER} ${this._settings.collapseTrigger} .${this._settings.collapseIcon}`) |
|||
.addClass(this._settings.expandIcon) |
|||
.removeClass(this._settings.collapseIcon) |
|||
|
|||
this._element.trigger($.Event(EVENT_COLLAPSED), this._parent) |
|||
} |
|||
|
|||
expand() { |
|||
this._parent.addClass(CLASS_NAME_EXPANDING).children(`${SELECTOR_CARD_BODY}, ${SELECTOR_CARD_FOOTER}`) |
|||
.slideDown(this._settings.animationSpeed, () => { |
|||
this._parent.removeClass(CLASS_NAME_COLLAPSED).removeClass(CLASS_NAME_EXPANDING) |
|||
}) |
|||
|
|||
this._parent.find(`> ${SELECTOR_CARD_HEADER} ${this._settings.collapseTrigger} .${this._settings.expandIcon}`) |
|||
.addClass(this._settings.collapseIcon) |
|||
.removeClass(this._settings.expandIcon) |
|||
|
|||
this._element.trigger($.Event(EVENT_EXPANDED), this._parent) |
|||
} |
|||
|
|||
remove() { |
|||
this._parent.slideUp() |
|||
this._element.trigger($.Event(EVENT_REMOVED), this._parent) |
|||
} |
|||
|
|||
toggle() { |
|||
if (this._parent.hasClass(CLASS_NAME_COLLAPSED)) { |
|||
this.expand() |
|||
return |
|||
} |
|||
|
|||
this.collapse() |
|||
} |
|||
|
|||
maximize() { |
|||
this._parent.find(`${this._settings.maximizeTrigger} .${this._settings.maximizeIcon}`) |
|||
.addClass(this._settings.minimizeIcon) |
|||
.removeClass(this._settings.maximizeIcon) |
|||
this._parent.css({ |
|||
height: this._parent.height(), |
|||
width: this._parent.width(), |
|||
transition: 'all .15s' |
|||
}).delay(150).queue(function () { |
|||
const $element = $(this) |
|||
|
|||
$element.addClass(CLASS_NAME_MAXIMIZED) |
|||
$('html').addClass(CLASS_NAME_MAXIMIZED) |
|||
if ($element.hasClass(CLASS_NAME_COLLAPSED)) { |
|||
$element.addClass(CLASS_NAME_WAS_COLLAPSED) |
|||
} |
|||
|
|||
$element.dequeue() |
|||
}) |
|||
|
|||
this._element.trigger($.Event(EVENT_MAXIMIZED), this._parent) |
|||
} |
|||
|
|||
minimize() { |
|||
this._parent.find(`${this._settings.maximizeTrigger} .${this._settings.minimizeIcon}`) |
|||
.addClass(this._settings.maximizeIcon) |
|||
.removeClass(this._settings.minimizeIcon) |
|||
this._parent.css('cssText', `height: ${this._parent[0].style.height} !important; width: ${this._parent[0].style.width} !important; transition: all .15s;` |
|||
).delay(10).queue(function () { |
|||
const $element = $(this) |
|||
|
|||
$element.removeClass(CLASS_NAME_MAXIMIZED) |
|||
$('html').removeClass(CLASS_NAME_MAXIMIZED) |
|||
$element.css({ |
|||
height: 'inherit', |
|||
width: 'inherit' |
|||
}) |
|||
if ($element.hasClass(CLASS_NAME_WAS_COLLAPSED)) { |
|||
$element.removeClass(CLASS_NAME_WAS_COLLAPSED) |
|||
} |
|||
|
|||
$element.dequeue() |
|||
}) |
|||
|
|||
this._element.trigger($.Event(EVENT_MINIMIZED), this._parent) |
|||
} |
|||
|
|||
toggleMaximize() { |
|||
if (this._parent.hasClass(CLASS_NAME_MAXIMIZED)) { |
|||
this.minimize() |
|||
return |
|||
} |
|||
|
|||
this.maximize() |
|||
} |
|||
|
|||
// Private
|
|||
|
|||
_init(card) { |
|||
this._parent = card |
|||
|
|||
$(this).find(this._settings.collapseTrigger).click(() => { |
|||
this.toggle() |
|||
}) |
|||
|
|||
$(this).find(this._settings.maximizeTrigger).click(() => { |
|||
this.toggleMaximize() |
|||
}) |
|||
|
|||
$(this).find(this._settings.removeTrigger).click(() => { |
|||
this.remove() |
|||
}) |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(config) { |
|||
let data = $(this).data(DATA_KEY) |
|||
const _options = $.extend({}, Default, $(this).data()) |
|||
|
|||
if (!data) { |
|||
data = new CardWidget($(this), _options) |
|||
$(this).data(DATA_KEY, typeof config === 'string' ? data : config) |
|||
} |
|||
|
|||
if (typeof config === 'string' && /collapse|expand|remove|toggle|maximize|minimize|toggleMaximize/.test(config)) { |
|||
data[config]() |
|||
} else if (typeof config === 'object') { |
|||
data._init($(this)) |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Data API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$(document).on('click', SELECTOR_DATA_COLLAPSE, function (event) { |
|||
if (event) { |
|||
event.preventDefault() |
|||
} |
|||
|
|||
CardWidget._jQueryInterface.call($(this), 'toggle') |
|||
}) |
|||
|
|||
$(document).on('click', SELECTOR_DATA_REMOVE, function (event) { |
|||
if (event) { |
|||
event.preventDefault() |
|||
} |
|||
|
|||
CardWidget._jQueryInterface.call($(this), 'remove') |
|||
}) |
|||
|
|||
$(document).on('click', SELECTOR_DATA_MAXIMIZE, function (event) { |
|||
if (event) { |
|||
event.preventDefault() |
|||
} |
|||
|
|||
CardWidget._jQueryInterface.call($(this), 'toggleMaximize') |
|||
}) |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = CardWidget._jQueryInterface |
|||
$.fn[NAME].Constructor = CardWidget |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return CardWidget._jQueryInterface |
|||
} |
|||
|
|||
export default CardWidget |
|||
@ -0,0 +1,336 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE ControlSidebar.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $ from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'ControlSidebar' |
|||
const DATA_KEY = 'lte.controlsidebar' |
|||
const EVENT_KEY = `.${DATA_KEY}` |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const EVENT_COLLAPSED = `collapsed${EVENT_KEY}` |
|||
const EVENT_COLLAPSED_DONE = `collapsed-done${EVENT_KEY}` |
|||
const EVENT_EXPANDED = `expanded${EVENT_KEY}` |
|||
|
|||
const SELECTOR_CONTROL_SIDEBAR = '.control-sidebar' |
|||
const SELECTOR_CONTROL_SIDEBAR_CONTENT = '.control-sidebar-content' |
|||
const SELECTOR_DATA_TOGGLE = '[data-widget="control-sidebar"]' |
|||
const SELECTOR_HEADER = '.main-header' |
|||
const SELECTOR_FOOTER = '.main-footer' |
|||
|
|||
const CLASS_NAME_CONTROL_SIDEBAR_ANIMATE = 'control-sidebar-animate' |
|||
const CLASS_NAME_CONTROL_SIDEBAR_OPEN = 'control-sidebar-open' |
|||
const CLASS_NAME_CONTROL_SIDEBAR_SLIDE = 'control-sidebar-slide-open' |
|||
const CLASS_NAME_LAYOUT_FIXED = 'layout-fixed' |
|||
const CLASS_NAME_NAVBAR_FIXED = 'layout-navbar-fixed' |
|||
const CLASS_NAME_NAVBAR_SM_FIXED = 'layout-sm-navbar-fixed' |
|||
const CLASS_NAME_NAVBAR_MD_FIXED = 'layout-md-navbar-fixed' |
|||
const CLASS_NAME_NAVBAR_LG_FIXED = 'layout-lg-navbar-fixed' |
|||
const CLASS_NAME_NAVBAR_XL_FIXED = 'layout-xl-navbar-fixed' |
|||
const CLASS_NAME_FOOTER_FIXED = 'layout-footer-fixed' |
|||
const CLASS_NAME_FOOTER_SM_FIXED = 'layout-sm-footer-fixed' |
|||
const CLASS_NAME_FOOTER_MD_FIXED = 'layout-md-footer-fixed' |
|||
const CLASS_NAME_FOOTER_LG_FIXED = 'layout-lg-footer-fixed' |
|||
const CLASS_NAME_FOOTER_XL_FIXED = 'layout-xl-footer-fixed' |
|||
|
|||
const Default = { |
|||
controlsidebarSlide: true, |
|||
scrollbarTheme: 'os-theme-light', |
|||
scrollbarAutoHide: 'l', |
|||
target: SELECTOR_CONTROL_SIDEBAR, |
|||
animationSpeed: 300 |
|||
} |
|||
|
|||
/** |
|||
* Class Definition |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
class ControlSidebar { |
|||
constructor(element, config) { |
|||
this._element = element |
|||
this._config = config |
|||
} |
|||
|
|||
// Public
|
|||
|
|||
collapse() { |
|||
const $body = $('body') |
|||
const $html = $('html') |
|||
|
|||
// Show the control sidebar
|
|||
if (this._config.controlsidebarSlide) { |
|||
$html.addClass(CLASS_NAME_CONTROL_SIDEBAR_ANIMATE) |
|||
$body.removeClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE).delay(300).queue(function () { |
|||
$(SELECTOR_CONTROL_SIDEBAR).hide() |
|||
$html.removeClass(CLASS_NAME_CONTROL_SIDEBAR_ANIMATE) |
|||
$(this).dequeue() |
|||
}) |
|||
} else { |
|||
$body.removeClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN) |
|||
} |
|||
|
|||
$(this._element).trigger($.Event(EVENT_COLLAPSED)) |
|||
|
|||
setTimeout(() => { |
|||
$(this._element).trigger($.Event(EVENT_COLLAPSED_DONE)) |
|||
}, this._config.animationSpeed) |
|||
} |
|||
|
|||
show(toggle = false) { |
|||
const $body = $('body') |
|||
const $html = $('html') |
|||
|
|||
if (toggle) { |
|||
$(SELECTOR_CONTROL_SIDEBAR).hide() |
|||
} |
|||
|
|||
// Collapse the control sidebar
|
|||
if (this._config.controlsidebarSlide) { |
|||
$html.addClass(CLASS_NAME_CONTROL_SIDEBAR_ANIMATE) |
|||
$(this._config.target).show().delay(10).queue(function () { |
|||
$body.addClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE).delay(300).queue(function () { |
|||
$html.removeClass(CLASS_NAME_CONTROL_SIDEBAR_ANIMATE) |
|||
$(this).dequeue() |
|||
}) |
|||
$(this).dequeue() |
|||
}) |
|||
} else { |
|||
$body.addClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN) |
|||
} |
|||
|
|||
this._fixHeight() |
|||
this._fixScrollHeight() |
|||
|
|||
$(this._element).trigger($.Event(EVENT_EXPANDED)) |
|||
} |
|||
|
|||
toggle() { |
|||
const $body = $('body') |
|||
const { target } = this._config |
|||
|
|||
const notVisible = !$(target).is(':visible') |
|||
const shouldClose = ($body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN) || |
|||
$body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE)) |
|||
const shouldToggle = notVisible && ($body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN) || |
|||
$body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE)) |
|||
|
|||
if (notVisible || shouldToggle) { |
|||
// Open the control sidebar
|
|||
this.show(notVisible) |
|||
} else if (shouldClose) { |
|||
// Close the control sidebar
|
|||
this.collapse() |
|||
} |
|||
} |
|||
|
|||
// Private
|
|||
|
|||
_init() { |
|||
const $body = $('body') |
|||
const shouldNotHideAll = $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN) || |
|||
$body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE) |
|||
|
|||
if (shouldNotHideAll) { |
|||
$(SELECTOR_CONTROL_SIDEBAR).not(this._config.target).hide() |
|||
$(this._config.target).css('display', 'block') |
|||
} else { |
|||
$(SELECTOR_CONTROL_SIDEBAR).hide() |
|||
} |
|||
|
|||
this._fixHeight() |
|||
this._fixScrollHeight() |
|||
|
|||
$(window).resize(() => { |
|||
this._fixHeight() |
|||
this._fixScrollHeight() |
|||
}) |
|||
|
|||
$(window).scroll(() => { |
|||
const $body = $('body') |
|||
const shouldFixHeight = $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN) || |
|||
$body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE) |
|||
|
|||
if (shouldFixHeight) { |
|||
this._fixScrollHeight() |
|||
} |
|||
}) |
|||
} |
|||
|
|||
_isNavbarFixed() { |
|||
const $body = $('body') |
|||
return ( |
|||
$body.hasClass(CLASS_NAME_NAVBAR_FIXED) || |
|||
$body.hasClass(CLASS_NAME_NAVBAR_SM_FIXED) || |
|||
$body.hasClass(CLASS_NAME_NAVBAR_MD_FIXED) || |
|||
$body.hasClass(CLASS_NAME_NAVBAR_LG_FIXED) || |
|||
$body.hasClass(CLASS_NAME_NAVBAR_XL_FIXED) |
|||
) |
|||
} |
|||
|
|||
_isFooterFixed() { |
|||
const $body = $('body') |
|||
return ( |
|||
$body.hasClass(CLASS_NAME_FOOTER_FIXED) || |
|||
$body.hasClass(CLASS_NAME_FOOTER_SM_FIXED) || |
|||
$body.hasClass(CLASS_NAME_FOOTER_MD_FIXED) || |
|||
$body.hasClass(CLASS_NAME_FOOTER_LG_FIXED) || |
|||
$body.hasClass(CLASS_NAME_FOOTER_XL_FIXED) |
|||
) |
|||
} |
|||
|
|||
_fixScrollHeight() { |
|||
const $body = $('body') |
|||
const $controlSidebar = $(this._config.target) |
|||
|
|||
if (!$body.hasClass(CLASS_NAME_LAYOUT_FIXED)) { |
|||
return |
|||
} |
|||
|
|||
const heights = { |
|||
scroll: $(document).height(), |
|||
window: $(window).height(), |
|||
header: $(SELECTOR_HEADER).outerHeight(), |
|||
footer: $(SELECTOR_FOOTER).outerHeight() |
|||
} |
|||
const positions = { |
|||
bottom: Math.abs((heights.window + $(window).scrollTop()) - heights.scroll), |
|||
top: $(window).scrollTop() |
|||
} |
|||
|
|||
const navbarFixed = this._isNavbarFixed() && $(SELECTOR_HEADER).css('position') === 'fixed' |
|||
|
|||
const footerFixed = this._isFooterFixed() && $(SELECTOR_FOOTER).css('position') === 'fixed' |
|||
|
|||
const $controlsidebarContent = $(`${this._config.target}, ${this._config.target} ${SELECTOR_CONTROL_SIDEBAR_CONTENT}`) |
|||
|
|||
if (positions.top === 0 && positions.bottom === 0) { |
|||
$controlSidebar.css({ |
|||
bottom: heights.footer, |
|||
top: heights.header |
|||
}) |
|||
$controlsidebarContent.css('height', heights.window - (heights.header + heights.footer)) |
|||
} else if (positions.bottom <= heights.footer) { |
|||
if (footerFixed === false) { |
|||
const top = heights.header - positions.top |
|||
$controlSidebar.css('bottom', heights.footer - positions.bottom).css('top', top >= 0 ? top : 0) |
|||
$controlsidebarContent.css('height', heights.window - (heights.footer - positions.bottom)) |
|||
} else { |
|||
$controlSidebar.css('bottom', heights.footer) |
|||
} |
|||
} else if (positions.top <= heights.header) { |
|||
if (navbarFixed === false) { |
|||
$controlSidebar.css('top', heights.header - positions.top) |
|||
$controlsidebarContent.css('height', heights.window - (heights.header - positions.top)) |
|||
} else { |
|||
$controlSidebar.css('top', heights.header) |
|||
} |
|||
} else if (navbarFixed === false) { |
|||
$controlSidebar.css('top', 0) |
|||
$controlsidebarContent.css('height', heights.window) |
|||
} else { |
|||
$controlSidebar.css('top', heights.header) |
|||
} |
|||
|
|||
if (footerFixed && navbarFixed) { |
|||
$controlsidebarContent.css('height', '100%') |
|||
$controlSidebar.css('height', '') |
|||
} else if (footerFixed || navbarFixed) { |
|||
$controlsidebarContent.css('height', '100%') |
|||
$controlsidebarContent.css('height', '') |
|||
} |
|||
} |
|||
|
|||
_fixHeight() { |
|||
const $body = $('body') |
|||
const $controlSidebar = $(`${this._config.target} ${SELECTOR_CONTROL_SIDEBAR_CONTENT}`) |
|||
|
|||
if (!$body.hasClass(CLASS_NAME_LAYOUT_FIXED)) { |
|||
$controlSidebar.attr('style', '') |
|||
return |
|||
} |
|||
|
|||
const heights = { |
|||
window: $(window).height(), |
|||
header: $(SELECTOR_HEADER).outerHeight(), |
|||
footer: $(SELECTOR_FOOTER).outerHeight() |
|||
} |
|||
|
|||
let sidebarHeight = heights.window - heights.header |
|||
|
|||
if (this._isFooterFixed() && $(SELECTOR_FOOTER).css('position') === 'fixed') { |
|||
sidebarHeight = heights.window - heights.header - heights.footer |
|||
} |
|||
|
|||
$controlSidebar.css('height', sidebarHeight) |
|||
|
|||
if (typeof $.fn.overlayScrollbars !== 'undefined') { |
|||
$controlSidebar.overlayScrollbars({ |
|||
className: this._config.scrollbarTheme, |
|||
sizeAutoCapable: true, |
|||
scrollbars: { |
|||
autoHide: this._config.scrollbarAutoHide, |
|||
clickScrolling: true |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(operation) { |
|||
return this.each(function () { |
|||
let data = $(this).data(DATA_KEY) |
|||
const _options = $.extend({}, Default, $(this).data()) |
|||
|
|||
if (!data) { |
|||
data = new ControlSidebar(this, _options) |
|||
$(this).data(DATA_KEY, data) |
|||
} |
|||
|
|||
if (data[operation] === 'undefined') { |
|||
throw new Error(`${operation} is not a function`) |
|||
} |
|||
|
|||
data[operation]() |
|||
}) |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* |
|||
* Data Api implementation |
|||
* ==================================================== |
|||
*/ |
|||
$(document).on('click', SELECTOR_DATA_TOGGLE, function (event) { |
|||
event.preventDefault() |
|||
|
|||
ControlSidebar._jQueryInterface.call($(this), 'toggle') |
|||
}) |
|||
|
|||
$(document).ready(() => { |
|||
ControlSidebar._jQueryInterface.call($(SELECTOR_DATA_TOGGLE), '_init') |
|||
}) |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = ControlSidebar._jQueryInterface |
|||
$.fn[NAME].Constructor = ControlSidebar |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return ControlSidebar._jQueryInterface |
|||
} |
|||
|
|||
export default ControlSidebar |
|||
@ -0,0 +1,84 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE DirectChat.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $ from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'DirectChat' |
|||
const DATA_KEY = 'lte.directchat' |
|||
const EVENT_KEY = `.${DATA_KEY}` |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const EVENT_TOGGLED = `toggled${EVENT_KEY}` |
|||
|
|||
const SELECTOR_DATA_TOGGLE = '[data-widget="chat-pane-toggle"]' |
|||
const SELECTOR_DIRECT_CHAT = '.direct-chat' |
|||
|
|||
const CLASS_NAME_DIRECT_CHAT_OPEN = 'direct-chat-contacts-open' |
|||
|
|||
/** |
|||
* Class Definition |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
class DirectChat { |
|||
constructor(element) { |
|||
this._element = element |
|||
} |
|||
|
|||
toggle() { |
|||
$(this._element).parents(SELECTOR_DIRECT_CHAT).first().toggleClass(CLASS_NAME_DIRECT_CHAT_OPEN) |
|||
$(this._element).trigger($.Event(EVENT_TOGGLED)) |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(config) { |
|||
return this.each(function () { |
|||
let data = $(this).data(DATA_KEY) |
|||
|
|||
if (!data) { |
|||
data = new DirectChat($(this)) |
|||
$(this).data(DATA_KEY, data) |
|||
} |
|||
|
|||
data[config]() |
|||
}) |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* |
|||
* Data Api implementation |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$(document).on('click', SELECTOR_DATA_TOGGLE, function (event) { |
|||
if (event) { |
|||
event.preventDefault() |
|||
} |
|||
|
|||
DirectChat._jQueryInterface.call($(this), 'toggle') |
|||
}) |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = DirectChat._jQueryInterface |
|||
$.fn[NAME].Constructor = DirectChat |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return DirectChat._jQueryInterface |
|||
} |
|||
|
|||
export default DirectChat |
|||
@ -0,0 +1,146 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE Dropdown.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $ from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'Dropdown' |
|||
const DATA_KEY = 'lte.dropdown' |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const SELECTOR_NAVBAR = '.navbar' |
|||
const SELECTOR_DROPDOWN_MENU = '.dropdown-menu' |
|||
const SELECTOR_DROPDOWN_MENU_ACTIVE = '.dropdown-menu.show' |
|||
const SELECTOR_DROPDOWN_TOGGLE = '[data-toggle="dropdown"]' |
|||
|
|||
const CLASS_NAME_DROPDOWN_RIGHT = 'dropdown-menu-right' |
|||
const CLASS_NAME_DROPDOWN_SUBMENU = 'dropdown-submenu' |
|||
|
|||
// TODO: this is unused; should be removed along with the extend?
|
|||
const Default = {} |
|||
|
|||
/** |
|||
* Class Definition |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
class Dropdown { |
|||
constructor(element, config) { |
|||
this._config = config |
|||
this._element = element |
|||
} |
|||
|
|||
// Public
|
|||
|
|||
toggleSubmenu() { |
|||
this._element.siblings().show().toggleClass('show') |
|||
|
|||
if (!this._element.next().hasClass('show')) { |
|||
this._element.parents(SELECTOR_DROPDOWN_MENU).first().find('.show').removeClass('show').hide() |
|||
} |
|||
|
|||
this._element.parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', () => { |
|||
$('.dropdown-submenu .show').removeClass('show').hide() |
|||
}) |
|||
} |
|||
|
|||
fixPosition() { |
|||
const $element = $(SELECTOR_DROPDOWN_MENU_ACTIVE) |
|||
|
|||
if ($element.length === 0) { |
|||
return |
|||
} |
|||
|
|||
if ($element.hasClass(CLASS_NAME_DROPDOWN_RIGHT)) { |
|||
$element.css({ |
|||
left: 'inherit', |
|||
right: 0 |
|||
}) |
|||
} else { |
|||
$element.css({ |
|||
left: 0, |
|||
right: 'inherit' |
|||
}) |
|||
} |
|||
|
|||
const offset = $element.offset() |
|||
const width = $element.width() |
|||
const visiblePart = $(window).width() - offset.left |
|||
|
|||
if (offset.left < 0) { |
|||
$element.css({ |
|||
left: 'inherit', |
|||
right: offset.left - 5 |
|||
}) |
|||
} else if (visiblePart < width) { |
|||
$element.css({ |
|||
left: 'inherit', |
|||
right: 0 |
|||
}) |
|||
} |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(config) { |
|||
return this.each(function () { |
|||
let data = $(this).data(DATA_KEY) |
|||
const _config = $.extend({}, Default, $(this).data()) |
|||
|
|||
if (!data) { |
|||
data = new Dropdown($(this), _config) |
|||
$(this).data(DATA_KEY, data) |
|||
} |
|||
|
|||
if (config === 'toggleSubmenu' || config === 'fixPosition') { |
|||
data[config]() |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Data API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$(`${SELECTOR_DROPDOWN_MENU} ${SELECTOR_DROPDOWN_TOGGLE}`).on('click', function (event) { |
|||
event.preventDefault() |
|||
event.stopPropagation() |
|||
|
|||
Dropdown._jQueryInterface.call($(this), 'toggleSubmenu') |
|||
}) |
|||
|
|||
$(`${SELECTOR_NAVBAR} ${SELECTOR_DROPDOWN_TOGGLE}`).on('click', event => { |
|||
event.preventDefault() |
|||
|
|||
if ($(event.target).parent().hasClass(CLASS_NAME_DROPDOWN_SUBMENU)) { |
|||
return |
|||
} |
|||
|
|||
setTimeout(function () { |
|||
Dropdown._jQueryInterface.call($(this), 'fixPosition') |
|||
}, 1) |
|||
}) |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = Dropdown._jQueryInterface |
|||
$.fn[NAME].Constructor = Dropdown |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return Dropdown._jQueryInterface |
|||
} |
|||
|
|||
export default Dropdown |
|||
@ -0,0 +1,124 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE ExpandableTable.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $ from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'ExpandableTable' |
|||
const DATA_KEY = 'lte.expandableTable' |
|||
const EVENT_KEY = `.${DATA_KEY}` |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const EVENT_EXPANDED = `expanded${EVENT_KEY}` |
|||
const EVENT_COLLAPSED = `collapsed${EVENT_KEY}` |
|||
|
|||
const SELECTOR_TABLE = '.expandable-table' |
|||
const SELECTOR_EXPANDABLE_BODY = '.expandable-body' |
|||
const SELECTOR_DATA_TOGGLE = '[data-widget="expandable-table"]' |
|||
const SELECTOR_ARIA_ATTR = 'aria-expanded' |
|||
|
|||
/** |
|||
* Class Definition |
|||
* ==================================================== |
|||
*/ |
|||
class ExpandableTable { |
|||
constructor(element, options) { |
|||
this._options = options |
|||
this._element = element |
|||
} |
|||
|
|||
// Public
|
|||
|
|||
init() { |
|||
$(SELECTOR_DATA_TOGGLE).each((_, $header) => { |
|||
const $type = $($header).attr(SELECTOR_ARIA_ATTR) |
|||
const $body = $($header).next(SELECTOR_EXPANDABLE_BODY).children().first().children() |
|||
if ($type === 'true') { |
|||
$body.show() |
|||
} else if ($type === 'false') { |
|||
$body.hide() |
|||
$body.parent().parent().addClass('d-none') |
|||
} |
|||
}) |
|||
} |
|||
|
|||
toggleRow() { |
|||
let $element = this._element |
|||
|
|||
if ($element[0].nodeName !== 'TR') { |
|||
$element = $element.parent() |
|||
if ($element[0].nodeName !== 'TR') { |
|||
$element = $element.parent() |
|||
} |
|||
} |
|||
|
|||
const time = 500 |
|||
const $type = $element.attr(SELECTOR_ARIA_ATTR) |
|||
const $body = $element.next(SELECTOR_EXPANDABLE_BODY).children().first().children() |
|||
|
|||
$body.stop() |
|||
if ($type === 'true') { |
|||
$body.slideUp(time, () => { |
|||
$element.next(SELECTOR_EXPANDABLE_BODY).addClass('d-none') |
|||
}) |
|||
$element.attr(SELECTOR_ARIA_ATTR, 'false') |
|||
$element.trigger($.Event(EVENT_COLLAPSED)) |
|||
} else if ($type === 'false') { |
|||
$element.next(SELECTOR_EXPANDABLE_BODY).removeClass('d-none') |
|||
$body.slideDown(time) |
|||
$element.attr(SELECTOR_ARIA_ATTR, 'true') |
|||
$element.trigger($.Event(EVENT_EXPANDED)) |
|||
} |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(operation) { |
|||
return this.each(function () { |
|||
let data = $(this).data(DATA_KEY) |
|||
|
|||
if (!data) { |
|||
data = new ExpandableTable($(this)) |
|||
$(this).data(DATA_KEY, data) |
|||
} |
|||
|
|||
if (typeof operation === 'string' && /init|toggleRow/.test(operation)) { |
|||
data[operation]() |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Data API |
|||
* ==================================================== |
|||
*/ |
|||
$(SELECTOR_TABLE).ready(function () { |
|||
ExpandableTable._jQueryInterface.call($(this), 'init') |
|||
}) |
|||
|
|||
$(document).on('click', SELECTOR_DATA_TOGGLE, function () { |
|||
ExpandableTable._jQueryInterface.call($(this), 'toggleRow') |
|||
}) |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = ExpandableTable._jQueryInterface |
|||
$.fn[NAME].Constructor = ExpandableTable |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return ExpandableTable._jQueryInterface |
|||
} |
|||
|
|||
export default ExpandableTable |
|||
@ -0,0 +1,130 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE Fullscreen.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $ from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'Fullscreen' |
|||
const DATA_KEY = 'lte.fullscreen' |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const SELECTOR_DATA_WIDGET = '[data-widget="fullscreen"]' |
|||
const SELECTOR_ICON = `${SELECTOR_DATA_WIDGET} i` |
|||
|
|||
const EVENT_FULLSCREEN_CHANGE = 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange' |
|||
|
|||
const Default = { |
|||
minimizeIcon: 'fa-compress-arrows-alt', |
|||
maximizeIcon: 'fa-expand-arrows-alt' |
|||
} |
|||
|
|||
/** |
|||
* Class Definition |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
class Fullscreen { |
|||
constructor(_element, _options) { |
|||
this.element = _element |
|||
this.options = $.extend({}, Default, _options) |
|||
} |
|||
|
|||
// Public
|
|||
|
|||
toggle() { |
|||
if (document.fullscreenElement || |
|||
document.mozFullScreenElement || |
|||
document.webkitFullscreenElement || |
|||
document.msFullscreenElement) { |
|||
this.windowed() |
|||
} else { |
|||
this.fullscreen() |
|||
} |
|||
} |
|||
|
|||
toggleIcon() { |
|||
if (document.fullscreenElement || |
|||
document.mozFullScreenElement || |
|||
document.webkitFullscreenElement || |
|||
document.msFullscreenElement) { |
|||
$(SELECTOR_ICON).removeClass(this.options.maximizeIcon).addClass(this.options.minimizeIcon) |
|||
} else { |
|||
$(SELECTOR_ICON).removeClass(this.options.minimizeIcon).addClass(this.options.maximizeIcon) |
|||
} |
|||
} |
|||
|
|||
fullscreen() { |
|||
if (document.documentElement.requestFullscreen) { |
|||
document.documentElement.requestFullscreen() |
|||
} else if (document.documentElement.webkitRequestFullscreen) { |
|||
document.documentElement.webkitRequestFullscreen() |
|||
} else if (document.documentElement.msRequestFullscreen) { |
|||
document.documentElement.msRequestFullscreen() |
|||
} |
|||
} |
|||
|
|||
windowed() { |
|||
if (document.exitFullscreen) { |
|||
document.exitFullscreen() |
|||
} else if (document.webkitExitFullscreen) { |
|||
document.webkitExitFullscreen() |
|||
} else if (document.msExitFullscreen) { |
|||
document.msExitFullscreen() |
|||
} |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(config) { |
|||
let data = $(this).data(DATA_KEY) |
|||
|
|||
if (!data) { |
|||
data = $(this).data() |
|||
} |
|||
|
|||
const _options = $.extend({}, Default, typeof config === 'object' ? config : data) |
|||
const plugin = new Fullscreen($(this), _options) |
|||
|
|||
$(this).data(DATA_KEY, typeof config === 'object' ? config : data) |
|||
|
|||
if (typeof config === 'string' && /toggle|toggleIcon|fullscreen|windowed/.test(config)) { |
|||
plugin[config]() |
|||
} else { |
|||
plugin.init() |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Data API |
|||
* ==================================================== |
|||
*/ |
|||
$(document).on('click', SELECTOR_DATA_WIDGET, function () { |
|||
Fullscreen._jQueryInterface.call($(this), 'toggle') |
|||
}) |
|||
|
|||
$(document).on(EVENT_FULLSCREEN_CHANGE, () => { |
|||
Fullscreen._jQueryInterface.call($(SELECTOR_DATA_WIDGET), 'toggleIcon') |
|||
}) |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = Fullscreen._jQueryInterface |
|||
$.fn[NAME].Constructor = Fullscreen |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return Fullscreen._jQueryInterface |
|||
} |
|||
|
|||
export default Fullscreen |
|||
@ -0,0 +1,460 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE IFrame.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $ from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'IFrame' |
|||
const DATA_KEY = 'lte.iframe' |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const SELECTOR_DATA_TOGGLE = '[data-widget="iframe"]' |
|||
const SELECTOR_DATA_TOGGLE_CLOSE = '[data-widget="iframe-close"]' |
|||
const SELECTOR_DATA_TOGGLE_SCROLL_LEFT = '[data-widget="iframe-scrollleft"]' |
|||
const SELECTOR_DATA_TOGGLE_SCROLL_RIGHT = '[data-widget="iframe-scrollright"]' |
|||
const SELECTOR_DATA_TOGGLE_FULLSCREEN = '[data-widget="iframe-fullscreen"]' |
|||
const SELECTOR_CONTENT_WRAPPER = '.content-wrapper' |
|||
const SELECTOR_CONTENT_IFRAME = `${SELECTOR_CONTENT_WRAPPER} iframe` |
|||
const SELECTOR_TAB_NAV = `${SELECTOR_CONTENT_WRAPPER}.iframe-mode .nav` |
|||
const SELECTOR_TAB_NAVBAR_NAV = `${SELECTOR_CONTENT_WRAPPER}.iframe-mode .navbar-nav` |
|||
const SELECTOR_TAB_NAVBAR_NAV_ITEM = `${SELECTOR_TAB_NAVBAR_NAV} .nav-item` |
|||
const SELECTOR_TAB_NAVBAR_NAV_LINK = `${SELECTOR_TAB_NAVBAR_NAV} .nav-link` |
|||
const SELECTOR_TAB_CONTENT = `${SELECTOR_CONTENT_WRAPPER}.iframe-mode .tab-content` |
|||
const SELECTOR_TAB_EMPTY = `${SELECTOR_TAB_CONTENT} .tab-empty` |
|||
const SELECTOR_TAB_LOADING = `${SELECTOR_TAB_CONTENT} .tab-loading` |
|||
const SELECTOR_TAB_PANE = `${SELECTOR_TAB_CONTENT} .tab-pane` |
|||
const SELECTOR_SIDEBAR_MENU_ITEM = '.main-sidebar .nav-item > a.nav-link' |
|||
const SELECTOR_SIDEBAR_SEARCH_ITEM = '.sidebar-search-results .list-group-item' |
|||
const SELECTOR_HEADER_MENU_ITEM = '.main-header .nav-item a.nav-link' |
|||
const SELECTOR_HEADER_DROPDOWN_ITEM = '.main-header a.dropdown-item' |
|||
const CLASS_NAME_IFRAME_MODE = 'iframe-mode' |
|||
const CLASS_NAME_FULLSCREEN_MODE = 'iframe-mode-fullscreen' |
|||
|
|||
const Default = { |
|||
onTabClick(item) { |
|||
return item |
|||
}, |
|||
onTabChanged(item) { |
|||
return item |
|||
}, |
|||
onTabCreated(item) { |
|||
return item |
|||
}, |
|||
autoIframeMode: true, |
|||
autoItemActive: true, |
|||
autoShowNewTab: true, |
|||
autoDarkMode: false, |
|||
allowDuplicates: false, |
|||
allowReload: true, |
|||
loadingScreen: true, |
|||
useNavbarItems: true, |
|||
scrollOffset: 40, |
|||
scrollBehaviorSwap: false, |
|||
iconMaximize: 'fa-expand', |
|||
iconMinimize: 'fa-compress' |
|||
} |
|||
|
|||
/** |
|||
* Class Definition |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
class IFrame { |
|||
constructor(element, config) { |
|||
this._config = config |
|||
this._element = element |
|||
this._init() |
|||
} |
|||
|
|||
// Public
|
|||
|
|||
onTabClick(item) { |
|||
this._config.onTabClick(item) |
|||
} |
|||
|
|||
onTabChanged(item) { |
|||
this._config.onTabChanged(item) |
|||
} |
|||
|
|||
onTabCreated(item) { |
|||
this._config.onTabCreated(item) |
|||
} |
|||
|
|||
createTab(title, link, uniqueName, autoOpen) { |
|||
let tabId = `panel-${uniqueName}` |
|||
let navId = `tab-${uniqueName}` |
|||
|
|||
if (this._config.allowDuplicates) { |
|||
tabId += `-${Math.floor(Math.random() * 1000)}` |
|||
navId += `-${Math.floor(Math.random() * 1000)}` |
|||
} |
|||
|
|||
const newNavItem = `<li class="nav-item" role="presentation"><a href="#" class="btn-iframe-close" data-widget="iframe-close" data-type="only-this"><i class="fas fa-times"></i></a><a class="nav-link" data-toggle="row" id="${navId}" href="#${tabId}" role="tab" aria-controls="${tabId}" aria-selected="false">${title}</a></li>` |
|||
$(SELECTOR_TAB_NAVBAR_NAV).append(unescape(escape(newNavItem))) |
|||
|
|||
const newTabItem = `<div class="tab-pane fade" id="${tabId}" role="tabpanel" aria-labelledby="${navId}"><iframe src="${link}"></iframe></div>` |
|||
$(SELECTOR_TAB_CONTENT).append(unescape(escape(newTabItem))) |
|||
|
|||
if (autoOpen) { |
|||
if (this._config.loadingScreen) { |
|||
const $loadingScreen = $(SELECTOR_TAB_LOADING) |
|||
$loadingScreen.fadeIn() |
|||
$(`${tabId} iframe`).ready(() => { |
|||
if (typeof this._config.loadingScreen === 'number') { |
|||
this.switchTab(`#${navId}`) |
|||
setTimeout(() => { |
|||
$loadingScreen.fadeOut() |
|||
}, this._config.loadingScreen) |
|||
} else { |
|||
this.switchTab(`#${navId}`) |
|||
$loadingScreen.fadeOut() |
|||
} |
|||
}) |
|||
} else { |
|||
this.switchTab(`#${navId}`) |
|||
} |
|||
} |
|||
|
|||
this.onTabCreated($(`#${navId}`)) |
|||
} |
|||
|
|||
openTabSidebar(item, autoOpen = this._config.autoShowNewTab) { |
|||
let $item = $(item).clone() |
|||
if ($item.attr('href') === undefined) { |
|||
$item = $(item).parent('a').clone() |
|||
} |
|||
|
|||
$item.find('.right, .search-path').remove() |
|||
let title = $item.find('p').text() |
|||
if (title === '') { |
|||
title = $item.text() |
|||
} |
|||
|
|||
const link = $item.attr('href') |
|||
if (link === '#' || link === '' || link === undefined) { |
|||
return |
|||
} |
|||
|
|||
const uniqueName = unescape(link).replace('./', '').replace(/["#&'./:=?[\]]/gi, '-').replace(/(--)/gi, '') |
|||
const navId = `tab-${uniqueName}` |
|||
|
|||
if (!this._config.allowDuplicates && $(`#${navId}`).length > 0) { |
|||
return this.switchTab(`#${navId}`, this._config.allowReload) |
|||
} |
|||
|
|||
if ((!this._config.allowDuplicates && $(`#${navId}`).length === 0) || this._config.allowDuplicates) { |
|||
this.createTab(title, link, uniqueName, autoOpen) |
|||
} |
|||
} |
|||
|
|||
switchTab(item, reload = false) { |
|||
const $item = $(item) |
|||
const tabId = $item.attr('href') |
|||
|
|||
$(SELECTOR_TAB_EMPTY).hide() |
|||
|
|||
if (reload) { |
|||
const $loadingScreen = $(SELECTOR_TAB_LOADING) |
|||
if (this._config.loadingScreen) { |
|||
$loadingScreen.show(0, () => { |
|||
$(`${tabId} iframe`).attr('src', $(`${tabId} iframe`).attr('src')).ready(() => { |
|||
if (this._config.loadingScreen) { |
|||
if (typeof this._config.loadingScreen === 'number') { |
|||
setTimeout(() => { |
|||
$loadingScreen.fadeOut() |
|||
}, this._config.loadingScreen) |
|||
} else { |
|||
$loadingScreen.fadeOut() |
|||
} |
|||
} |
|||
}) |
|||
}) |
|||
} else { |
|||
$(`${tabId} iframe`).attr('src', $(`${tabId} iframe`).attr('src')) |
|||
} |
|||
} |
|||
|
|||
$(`${SELECTOR_TAB_NAVBAR_NAV} .active`).tab('dispose').removeClass('active') |
|||
|
|||
this._fixHeight() |
|||
|
|||
$item.tab('show') |
|||
$item.parents('li').addClass('active') |
|||
this.onTabChanged($item) |
|||
|
|||
if (this._config.autoItemActive) { |
|||
this._setItemActive($(`${tabId} iframe`).attr('src')) |
|||
} |
|||
} |
|||
|
|||
removeActiveTab(type, element) { |
|||
if (type == 'all') { |
|||
$(SELECTOR_TAB_NAVBAR_NAV_ITEM).remove() |
|||
$(SELECTOR_TAB_PANE).remove() |
|||
$(SELECTOR_TAB_EMPTY).show() |
|||
} else if (type == 'all-other') { |
|||
$(`${SELECTOR_TAB_NAVBAR_NAV_ITEM}:not(.active)`).remove() |
|||
$(`${SELECTOR_TAB_PANE}:not(.active)`).remove() |
|||
} else if (type == 'only-this') { |
|||
const $navClose = $(element) |
|||
const $navItem = $navClose.parent('.nav-item') |
|||
const $navItemParent = $navItem.parent() |
|||
const navItemIndex = $navItem.index() |
|||
const tabId = $navClose.siblings('.nav-link').attr('aria-controls') |
|||
$navItem.remove() |
|||
$(`#${tabId}`).remove() |
|||
if ($(SELECTOR_TAB_CONTENT).children().length == $(`${SELECTOR_TAB_EMPTY}, ${SELECTOR_TAB_LOADING}`).length) { |
|||
$(SELECTOR_TAB_EMPTY).show() |
|||
} else { |
|||
const prevNavItemIndex = navItemIndex - 1 |
|||
this.switchTab($navItemParent.children().eq(prevNavItemIndex).find('a.nav-link')) |
|||
} |
|||
} else { |
|||
const $navItem = $(`${SELECTOR_TAB_NAVBAR_NAV_ITEM}.active`) |
|||
const $navItemParent = $navItem.parent() |
|||
const navItemIndex = $navItem.index() |
|||
$navItem.remove() |
|||
$(`${SELECTOR_TAB_PANE}.active`).remove() |
|||
if ($(SELECTOR_TAB_CONTENT).children().length == $(`${SELECTOR_TAB_EMPTY}, ${SELECTOR_TAB_LOADING}`).length) { |
|||
$(SELECTOR_TAB_EMPTY).show() |
|||
} else { |
|||
const prevNavItemIndex = navItemIndex - 1 |
|||
this.switchTab($navItemParent.children().eq(prevNavItemIndex).find('a.nav-link')) |
|||
} |
|||
} |
|||
} |
|||
|
|||
toggleFullscreen() { |
|||
if ($('body').hasClass(CLASS_NAME_FULLSCREEN_MODE)) { |
|||
$(`${SELECTOR_DATA_TOGGLE_FULLSCREEN} i`).removeClass(this._config.iconMinimize).addClass(this._config.iconMaximize) |
|||
$('body').removeClass(CLASS_NAME_FULLSCREEN_MODE) |
|||
$(`${SELECTOR_TAB_EMPTY}, ${SELECTOR_TAB_LOADING}`).height('100%') |
|||
$(SELECTOR_CONTENT_WRAPPER).height('100%') |
|||
$(SELECTOR_CONTENT_IFRAME).height('100%') |
|||
} else { |
|||
$(`${SELECTOR_DATA_TOGGLE_FULLSCREEN} i`).removeClass(this._config.iconMaximize).addClass(this._config.iconMinimize) |
|||
$('body').addClass(CLASS_NAME_FULLSCREEN_MODE) |
|||
} |
|||
|
|||
$(window).trigger('resize') |
|||
this._fixHeight(true) |
|||
} |
|||
|
|||
// Private
|
|||
|
|||
_init() { |
|||
const usingDefTab = ($(SELECTOR_TAB_CONTENT).children().length > 2) |
|||
|
|||
this._setupListeners() |
|||
this._fixHeight(true) |
|||
|
|||
if (usingDefTab) { |
|||
const $el = $(`${SELECTOR_TAB_PANE}`).first() |
|||
// eslint-disable-next-line no-console
|
|||
console.log($el) |
|||
const uniqueName = $el.attr('id').replace('panel-', '') |
|||
const navId = `#tab-${uniqueName}` |
|||
|
|||
this.switchTab(navId, true) |
|||
} |
|||
} |
|||
|
|||
_initFrameElement() { |
|||
if (window.frameElement && this._config.autoIframeMode) { |
|||
const $body = $('body') |
|||
$body.addClass(CLASS_NAME_IFRAME_MODE) |
|||
|
|||
if (this._config.autoDarkMode) { |
|||
$body.addClass('dark-mode') |
|||
} |
|||
} |
|||
} |
|||
|
|||
_navScroll(offset) { |
|||
const leftPos = $(SELECTOR_TAB_NAVBAR_NAV).scrollLeft() |
|||
$(SELECTOR_TAB_NAVBAR_NAV).animate({ scrollLeft: (leftPos + offset) }, 250, 'linear') |
|||
} |
|||
|
|||
_setupListeners() { |
|||
$(window).on('resize', () => { |
|||
setTimeout(() => { |
|||
this._fixHeight() |
|||
}, 1) |
|||
}) |
|||
if ($(SELECTOR_CONTENT_WRAPPER).hasClass(CLASS_NAME_IFRAME_MODE)) { |
|||
$(document).on('click', `${SELECTOR_SIDEBAR_MENU_ITEM}, ${SELECTOR_SIDEBAR_SEARCH_ITEM}`, e => { |
|||
e.preventDefault() |
|||
this.openTabSidebar(e.target) |
|||
}) |
|||
if (this._config.useNavbarItems) { |
|||
$(document).on('click', `${SELECTOR_HEADER_MENU_ITEM}, ${SELECTOR_HEADER_DROPDOWN_ITEM}`, e => { |
|||
e.preventDefault() |
|||
this.openTabSidebar(e.target) |
|||
}) |
|||
} |
|||
} |
|||
|
|||
$(document).on('click', SELECTOR_TAB_NAVBAR_NAV_LINK, e => { |
|||
e.preventDefault() |
|||
this.onTabClick(e.target) |
|||
this.switchTab(e.target) |
|||
}) |
|||
$(document).on('click', SELECTOR_TAB_NAVBAR_NAV_LINK, e => { |
|||
e.preventDefault() |
|||
this.onTabClick(e.target) |
|||
this.switchTab(e.target) |
|||
}) |
|||
$(document).on('click', SELECTOR_DATA_TOGGLE_CLOSE, e => { |
|||
e.preventDefault() |
|||
let { target } = e |
|||
|
|||
if (target.nodeName == 'I') { |
|||
target = e.target.offsetParent |
|||
} |
|||
|
|||
this.removeActiveTab(target.attributes['data-type'] ? target.attributes['data-type'].nodeValue : null, target) |
|||
}) |
|||
$(document).on('click', SELECTOR_DATA_TOGGLE_FULLSCREEN, e => { |
|||
e.preventDefault() |
|||
this.toggleFullscreen() |
|||
}) |
|||
let mousedown = false |
|||
let mousedownInterval = null |
|||
$(document).on('mousedown', SELECTOR_DATA_TOGGLE_SCROLL_LEFT, e => { |
|||
e.preventDefault() |
|||
clearInterval(mousedownInterval) |
|||
|
|||
let { scrollOffset } = this._config |
|||
|
|||
if (!this._config.scrollBehaviorSwap) { |
|||
scrollOffset = -scrollOffset |
|||
} |
|||
|
|||
mousedown = true |
|||
this._navScroll(scrollOffset) |
|||
|
|||
mousedownInterval = setInterval(() => { |
|||
this._navScroll(scrollOffset) |
|||
}, 250) |
|||
}) |
|||
$(document).on('mousedown', SELECTOR_DATA_TOGGLE_SCROLL_RIGHT, e => { |
|||
e.preventDefault() |
|||
clearInterval(mousedownInterval) |
|||
|
|||
let { scrollOffset } = this._config |
|||
|
|||
if (this._config.scrollBehaviorSwap) { |
|||
scrollOffset = -scrollOffset |
|||
} |
|||
|
|||
mousedown = true |
|||
this._navScroll(scrollOffset) |
|||
|
|||
mousedownInterval = setInterval(() => { |
|||
this._navScroll(scrollOffset) |
|||
}, 250) |
|||
}) |
|||
$(document).on('mouseup', () => { |
|||
if (mousedown) { |
|||
mousedown = false |
|||
clearInterval(mousedownInterval) |
|||
mousedownInterval = null |
|||
} |
|||
}) |
|||
} |
|||
|
|||
_setItemActive(href) { |
|||
$(`${SELECTOR_SIDEBAR_MENU_ITEM}, ${SELECTOR_HEADER_DROPDOWN_ITEM}`).removeClass('active') |
|||
$(SELECTOR_HEADER_MENU_ITEM).parent().removeClass('active') |
|||
|
|||
const $headerMenuItem = $(`${SELECTOR_HEADER_MENU_ITEM}[href$="${href}"]`) |
|||
const $headerDropdownItem = $(`${SELECTOR_HEADER_DROPDOWN_ITEM}[href$="${href}"]`) |
|||
const $sidebarMenuItem = $(`${SELECTOR_SIDEBAR_MENU_ITEM}[href$="${href}"]`) |
|||
|
|||
$headerMenuItem.each((i, e) => { |
|||
$(e).parent().addClass('active') |
|||
}) |
|||
$headerDropdownItem.each((i, e) => { |
|||
$(e).addClass('active') |
|||
}) |
|||
$sidebarMenuItem.each((i, e) => { |
|||
$(e).addClass('active') |
|||
$(e).parents('.nav-treeview').prevAll('.nav-link').addClass('active') |
|||
}) |
|||
} |
|||
|
|||
_fixHeight(tabEmpty = false) { |
|||
if ($('body').hasClass(CLASS_NAME_FULLSCREEN_MODE)) { |
|||
const windowHeight = $(window).height() |
|||
const navbarHeight = $(SELECTOR_TAB_NAV).outerHeight() |
|||
$(`${SELECTOR_TAB_EMPTY}, ${SELECTOR_TAB_LOADING}, ${SELECTOR_CONTENT_IFRAME}`).height(windowHeight - navbarHeight) |
|||
$(SELECTOR_CONTENT_WRAPPER).height(windowHeight) |
|||
} else { |
|||
const contentWrapperHeight = parseFloat($(SELECTOR_CONTENT_WRAPPER).css('height')) |
|||
const navbarHeight = $(SELECTOR_TAB_NAV).outerHeight() |
|||
if (tabEmpty == true) { |
|||
setTimeout(() => { |
|||
$(`${SELECTOR_TAB_EMPTY}, ${SELECTOR_TAB_LOADING}`).height(contentWrapperHeight - navbarHeight) |
|||
}, 50) |
|||
} else { |
|||
$(SELECTOR_CONTENT_IFRAME).height(contentWrapperHeight - navbarHeight) |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(config) { |
|||
if ($(SELECTOR_DATA_TOGGLE).length > 0) { |
|||
let data = $(this).data(DATA_KEY) |
|||
|
|||
if (!data) { |
|||
data = $(this).data() |
|||
} |
|||
|
|||
const _options = $.extend({}, Default, typeof config === 'object' ? config : data) |
|||
localStorage.setItem('AdminLTE:IFrame:Options', JSON.stringify(_options)) |
|||
|
|||
const plugin = new IFrame($(this), _options) |
|||
|
|||
$(this).data(DATA_KEY, typeof config === 'object' ? config : data) |
|||
|
|||
if (typeof config === 'string' && /createTab|openTabSidebar|switchTab|removeActiveTab/.test(config)) { |
|||
plugin[config]() |
|||
} |
|||
} else { |
|||
new IFrame($(this), JSON.parse(localStorage.getItem('AdminLTE:IFrame:Options')))._initFrameElement() |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Data API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$(window).on('load', () => { |
|||
IFrame._jQueryInterface.call($(SELECTOR_DATA_TOGGLE)) |
|||
}) |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = IFrame._jQueryInterface |
|||
$.fn[NAME].Constructor = IFrame |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return IFrame._jQueryInterface |
|||
} |
|||
|
|||
export default IFrame |
|||
@ -0,0 +1,262 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE Layout.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $ from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'Layout' |
|||
const DATA_KEY = 'lte.layout' |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const SELECTOR_HEADER = '.main-header' |
|||
const SELECTOR_MAIN_SIDEBAR = '.main-sidebar' |
|||
const SELECTOR_SIDEBAR = '.main-sidebar .sidebar' |
|||
const SELECTOR_CONTENT = '.content-wrapper' |
|||
const SELECTOR_CONTROL_SIDEBAR_CONTENT = '.control-sidebar-content' |
|||
const SELECTOR_CONTROL_SIDEBAR_BTN = '[data-widget="control-sidebar"]' |
|||
const SELECTOR_FOOTER = '.main-footer' |
|||
const SELECTOR_PUSHMENU_BTN = '[data-widget="pushmenu"]' |
|||
const SELECTOR_LOGIN_BOX = '.login-box' |
|||
const SELECTOR_REGISTER_BOX = '.register-box' |
|||
const SELECTOR_PRELOADER = '.preloader' |
|||
|
|||
const CLASS_NAME_SIDEBAR_COLLAPSED = 'sidebar-collapse' |
|||
const CLASS_NAME_SIDEBAR_FOCUSED = 'sidebar-focused' |
|||
const CLASS_NAME_LAYOUT_FIXED = 'layout-fixed' |
|||
const CLASS_NAME_CONTROL_SIDEBAR_SLIDE_OPEN = 'control-sidebar-slide-open' |
|||
const CLASS_NAME_CONTROL_SIDEBAR_OPEN = 'control-sidebar-open' |
|||
const CLASS_NAME_IFRAME_MODE = 'iframe-mode' |
|||
|
|||
const Default = { |
|||
scrollbarTheme: 'os-theme-light', |
|||
scrollbarAutoHide: 'l', |
|||
panelAutoHeight: true, |
|||
panelAutoHeightMode: 'min-height', |
|||
preloadDuration: 200, |
|||
loginRegisterAutoHeight: true |
|||
} |
|||
|
|||
/** |
|||
* Class Definition |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
class Layout { |
|||
constructor(element, config) { |
|||
this._config = config |
|||
this._element = element |
|||
} |
|||
|
|||
// Public
|
|||
|
|||
fixLayoutHeight(extra = null) { |
|||
const $body = $('body') |
|||
let controlSidebar = 0 |
|||
|
|||
if ($body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE_OPEN) || $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN) || extra === 'control_sidebar') { |
|||
controlSidebar = $(SELECTOR_CONTROL_SIDEBAR_CONTENT).outerHeight() |
|||
} |
|||
|
|||
const heights = { |
|||
window: $(window).height(), |
|||
header: $(SELECTOR_HEADER).length > 0 ? $(SELECTOR_HEADER).outerHeight() : 0, |
|||
footer: $(SELECTOR_FOOTER).length > 0 ? $(SELECTOR_FOOTER).outerHeight() : 0, |
|||
sidebar: $(SELECTOR_SIDEBAR).length > 0 ? $(SELECTOR_SIDEBAR).height() : 0, |
|||
controlSidebar |
|||
} |
|||
|
|||
const max = this._max(heights) |
|||
let offset = this._config.panelAutoHeight |
|||
|
|||
if (offset === true) { |
|||
offset = 0 |
|||
} |
|||
|
|||
const $contentSelector = $(SELECTOR_CONTENT) |
|||
|
|||
if (offset !== false) { |
|||
if (max === heights.controlSidebar) { |
|||
$contentSelector.css(this._config.panelAutoHeightMode, (max + offset)) |
|||
} else if (max === heights.window) { |
|||
$contentSelector.css(this._config.panelAutoHeightMode, (max + offset) - heights.header - heights.footer) |
|||
} else { |
|||
$contentSelector.css(this._config.panelAutoHeightMode, (max + offset) - heights.header) |
|||
} |
|||
|
|||
if (this._isFooterFixed()) { |
|||
$contentSelector.css(this._config.panelAutoHeightMode, parseFloat($contentSelector.css(this._config.panelAutoHeightMode)) + heights.footer) |
|||
} |
|||
} |
|||
|
|||
if (!$body.hasClass(CLASS_NAME_LAYOUT_FIXED)) { |
|||
return |
|||
} |
|||
|
|||
if (typeof $.fn.overlayScrollbars !== 'undefined') { |
|||
$(SELECTOR_SIDEBAR).overlayScrollbars({ |
|||
className: this._config.scrollbarTheme, |
|||
sizeAutoCapable: true, |
|||
scrollbars: { |
|||
autoHide: this._config.scrollbarAutoHide, |
|||
clickScrolling: true |
|||
} |
|||
}) |
|||
} else { |
|||
$(SELECTOR_SIDEBAR).css('overflow-y', 'auto') |
|||
} |
|||
} |
|||
|
|||
fixLoginRegisterHeight() { |
|||
const $body = $('body') |
|||
const $selector = $(`${SELECTOR_LOGIN_BOX}, ${SELECTOR_REGISTER_BOX}`) |
|||
|
|||
if ($body.hasClass(CLASS_NAME_IFRAME_MODE)) { |
|||
$body.css('height', '100%') |
|||
$('.wrapper').css('height', '100%') |
|||
$('html').css('height', '100%') |
|||
} else if ($selector.length === 0) { |
|||
$body.css('height', 'auto') |
|||
$('html').css('height', 'auto') |
|||
} else { |
|||
const boxHeight = $selector.height() |
|||
|
|||
if ($body.css(this._config.panelAutoHeightMode) !== boxHeight) { |
|||
$body.css(this._config.panelAutoHeightMode, boxHeight) |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Private
|
|||
|
|||
_init() { |
|||
// Activate layout height watcher
|
|||
this.fixLayoutHeight() |
|||
|
|||
if (this._config.loginRegisterAutoHeight === true) { |
|||
this.fixLoginRegisterHeight() |
|||
} else if (this._config.loginRegisterAutoHeight === parseInt(this._config.loginRegisterAutoHeight, 10)) { |
|||
setInterval(this.fixLoginRegisterHeight, this._config.loginRegisterAutoHeight) |
|||
} |
|||
|
|||
$(SELECTOR_SIDEBAR) |
|||
.on('collapsed.lte.treeview expanded.lte.treeview', () => { |
|||
this.fixLayoutHeight() |
|||
}) |
|||
|
|||
$(SELECTOR_MAIN_SIDEBAR) |
|||
.on('mouseenter mouseleave', () => { |
|||
if ($('body').hasClass(CLASS_NAME_SIDEBAR_COLLAPSED)) { |
|||
this.fixLayoutHeight() |
|||
} |
|||
}) |
|||
|
|||
$(SELECTOR_PUSHMENU_BTN) |
|||
.on('collapsed.lte.pushmenu shown.lte.pushmenu', () => { |
|||
setTimeout(() => { |
|||
this.fixLayoutHeight() |
|||
}, 300) |
|||
}) |
|||
|
|||
$(SELECTOR_CONTROL_SIDEBAR_BTN) |
|||
.on('collapsed.lte.controlsidebar', () => { |
|||
this.fixLayoutHeight() |
|||
}) |
|||
.on('expanded.lte.controlsidebar', () => { |
|||
this.fixLayoutHeight('control_sidebar') |
|||
}) |
|||
|
|||
$(window).resize(() => { |
|||
this.fixLayoutHeight() |
|||
}) |
|||
|
|||
setTimeout(() => { |
|||
$('body.hold-transition').removeClass('hold-transition') |
|||
}, 50) |
|||
|
|||
setTimeout(() => { |
|||
const $preloader = $(SELECTOR_PRELOADER) |
|||
if ($preloader) { |
|||
$preloader.css('height', 0) |
|||
setTimeout(() => { |
|||
$preloader.children().hide() |
|||
}, 200) |
|||
} |
|||
}, this._config.preloadDuration) |
|||
} |
|||
|
|||
_max(numbers) { |
|||
// Calculate the maximum number in a list
|
|||
let max = 0 |
|||
|
|||
Object.keys(numbers).forEach(key => { |
|||
if (numbers[key] > max) { |
|||
max = numbers[key] |
|||
} |
|||
}) |
|||
|
|||
return max |
|||
} |
|||
|
|||
_isFooterFixed() { |
|||
return $(SELECTOR_FOOTER).css('position') === 'fixed' |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(config = '') { |
|||
return this.each(function () { |
|||
let data = $(this).data(DATA_KEY) |
|||
const _options = $.extend({}, Default, $(this).data()) |
|||
|
|||
if (!data) { |
|||
data = new Layout($(this), _options) |
|||
$(this).data(DATA_KEY, data) |
|||
} |
|||
|
|||
if (config === 'init' || config === '') { |
|||
data._init() |
|||
} else if (config === 'fixLayoutHeight' || config === 'fixLoginRegisterHeight') { |
|||
data[config]() |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Data API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$(window).on('load', () => { |
|||
Layout._jQueryInterface.call($('body')) |
|||
}) |
|||
|
|||
$(`${SELECTOR_SIDEBAR} a`) |
|||
.on('focusin', () => { |
|||
$(SELECTOR_MAIN_SIDEBAR).addClass(CLASS_NAME_SIDEBAR_FOCUSED) |
|||
}) |
|||
.on('focusout', () => { |
|||
$(SELECTOR_MAIN_SIDEBAR).removeClass(CLASS_NAME_SIDEBAR_FOCUSED) |
|||
}) |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = Layout._jQueryInterface |
|||
$.fn[NAME].Constructor = Layout |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return Layout._jQueryInterface |
|||
} |
|||
|
|||
export default Layout |
|||
@ -0,0 +1,113 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE NavbarSearch.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $ from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'NavbarSearch' |
|||
const DATA_KEY = 'lte.navbar-search' |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const SELECTOR_TOGGLE_BUTTON = '[data-widget="navbar-search"]' |
|||
const SELECTOR_SEARCH_BLOCK = '.navbar-search-block' |
|||
const SELECTOR_SEARCH_INPUT = '.form-control' |
|||
|
|||
const CLASS_NAME_OPEN = 'navbar-search-open' |
|||
|
|||
const Default = { |
|||
resetOnClose: true, |
|||
target: SELECTOR_SEARCH_BLOCK |
|||
} |
|||
|
|||
/** |
|||
* Class Definition |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
class NavbarSearch { |
|||
constructor(_element, _options) { |
|||
this._element = _element |
|||
this._config = $.extend({}, Default, _options) |
|||
} |
|||
|
|||
// Public
|
|||
|
|||
open() { |
|||
$(this._config.target).css('display', 'flex').hide().fadeIn().addClass(CLASS_NAME_OPEN) |
|||
$(`${this._config.target} ${SELECTOR_SEARCH_INPUT}`).focus() |
|||
} |
|||
|
|||
close() { |
|||
$(this._config.target).fadeOut().removeClass(CLASS_NAME_OPEN) |
|||
|
|||
if (this._config.resetOnClose) { |
|||
$(`${this._config.target} ${SELECTOR_SEARCH_INPUT}`).val('') |
|||
} |
|||
} |
|||
|
|||
toggle() { |
|||
if ($(this._config.target).hasClass(CLASS_NAME_OPEN)) { |
|||
this.close() |
|||
} else { |
|||
this.open() |
|||
} |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(options) { |
|||
return this.each(function () { |
|||
let data = $(this).data(DATA_KEY) |
|||
const _options = $.extend({}, Default, $(this).data()) |
|||
|
|||
if (!data) { |
|||
data = new NavbarSearch(this, _options) |
|||
$(this).data(DATA_KEY, data) |
|||
} |
|||
|
|||
if (!/toggle|close|open/.test(options)) { |
|||
throw new Error(`Undefined method ${options}`) |
|||
} |
|||
|
|||
data[options]() |
|||
}) |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Data API |
|||
* ==================================================== |
|||
*/ |
|||
$(document).on('click', SELECTOR_TOGGLE_BUTTON, event => { |
|||
event.preventDefault() |
|||
|
|||
let button = $(event.currentTarget) |
|||
|
|||
if (button.data('widget') !== 'navbar-search') { |
|||
button = button.closest(SELECTOR_TOGGLE_BUTTON) |
|||
} |
|||
|
|||
NavbarSearch._jQueryInterface.call(button, 'toggle') |
|||
}) |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = NavbarSearch._jQueryInterface |
|||
$.fn[NAME].Constructor = NavbarSearch |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return NavbarSearch._jQueryInterface |
|||
} |
|||
|
|||
export default NavbarSearch |
|||
@ -0,0 +1,229 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE PushMenu.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $ from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'PushMenu' |
|||
const DATA_KEY = 'lte.pushmenu' |
|||
const EVENT_KEY = `.${DATA_KEY}` |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const EVENT_COLLAPSED = `collapsed${EVENT_KEY}` |
|||
const EVENT_COLLAPSED_DONE = `collapsed-done${EVENT_KEY}` |
|||
const EVENT_SHOWN = `shown${EVENT_KEY}` |
|||
|
|||
const SELECTOR_TOGGLE_BUTTON = '[data-widget="pushmenu"]' |
|||
const SELECTOR_BODY = 'body' |
|||
const SELECTOR_OVERLAY = '#sidebar-overlay' |
|||
const SELECTOR_WRAPPER = '.wrapper' |
|||
|
|||
const CLASS_NAME_COLLAPSED = 'sidebar-collapse' |
|||
const CLASS_NAME_OPEN = 'sidebar-open' |
|||
const CLASS_NAME_IS_OPENING = 'sidebar-is-opening' |
|||
const CLASS_NAME_CLOSED = 'sidebar-closed' |
|||
|
|||
const Default = { |
|||
autoCollapseSize: 992, |
|||
enableRemember: false, |
|||
noTransitionAfterReload: true, |
|||
animationSpeed: 300 |
|||
} |
|||
|
|||
/** |
|||
* Class Definition |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
class PushMenu { |
|||
constructor(element, options) { |
|||
this._element = element |
|||
this._options = $.extend({}, Default, options) |
|||
|
|||
if ($(SELECTOR_OVERLAY).length === 0) { |
|||
this._addOverlay() |
|||
} |
|||
|
|||
this._init() |
|||
} |
|||
|
|||
// Public
|
|||
|
|||
expand() { |
|||
const $bodySelector = $(SELECTOR_BODY) |
|||
|
|||
if (this._options.autoCollapseSize && $(window).width() <= this._options.autoCollapseSize) { |
|||
$bodySelector.addClass(CLASS_NAME_OPEN) |
|||
} |
|||
|
|||
$bodySelector.addClass(CLASS_NAME_IS_OPENING).removeClass(`${CLASS_NAME_COLLAPSED} ${CLASS_NAME_CLOSED}`).delay(50).queue(function () { |
|||
$bodySelector.removeClass(CLASS_NAME_IS_OPENING) |
|||
$(this).dequeue() |
|||
}) |
|||
|
|||
if (this._options.enableRemember) { |
|||
localStorage.setItem(`remember${EVENT_KEY}`, CLASS_NAME_OPEN) |
|||
} |
|||
|
|||
$(this._element).trigger($.Event(EVENT_SHOWN)) |
|||
} |
|||
|
|||
collapse() { |
|||
const $bodySelector = $(SELECTOR_BODY) |
|||
|
|||
if (this._options.autoCollapseSize && $(window).width() <= this._options.autoCollapseSize) { |
|||
$bodySelector.removeClass(CLASS_NAME_OPEN).addClass(CLASS_NAME_CLOSED) |
|||
} |
|||
|
|||
$bodySelector.addClass(CLASS_NAME_COLLAPSED) |
|||
|
|||
if (this._options.enableRemember) { |
|||
localStorage.setItem(`remember${EVENT_KEY}`, CLASS_NAME_COLLAPSED) |
|||
} |
|||
|
|||
$(this._element).trigger($.Event(EVENT_COLLAPSED)) |
|||
|
|||
setTimeout(() => { |
|||
$(this._element).trigger($.Event(EVENT_COLLAPSED_DONE)) |
|||
}, this._options.animationSpeed) |
|||
} |
|||
|
|||
toggle() { |
|||
if ($(SELECTOR_BODY).hasClass(CLASS_NAME_COLLAPSED)) { |
|||
this.expand() |
|||
} else { |
|||
this.collapse() |
|||
} |
|||
} |
|||
|
|||
autoCollapse(resize = false) { |
|||
if (!this._options.autoCollapseSize) { |
|||
return |
|||
} |
|||
|
|||
const $bodySelector = $(SELECTOR_BODY) |
|||
|
|||
if ($(window).width() <= this._options.autoCollapseSize) { |
|||
if (!$bodySelector.hasClass(CLASS_NAME_OPEN)) { |
|||
this.collapse() |
|||
} |
|||
} else if (resize === true) { |
|||
if ($bodySelector.hasClass(CLASS_NAME_OPEN)) { |
|||
$bodySelector.removeClass(CLASS_NAME_OPEN) |
|||
} else if ($bodySelector.hasClass(CLASS_NAME_CLOSED)) { |
|||
this.expand() |
|||
} |
|||
} |
|||
} |
|||
|
|||
remember() { |
|||
if (!this._options.enableRemember) { |
|||
return |
|||
} |
|||
|
|||
const $body = $('body') |
|||
const toggleState = localStorage.getItem(`remember${EVENT_KEY}`) |
|||
|
|||
if (toggleState === CLASS_NAME_COLLAPSED) { |
|||
if (this._options.noTransitionAfterReload) { |
|||
$body.addClass('hold-transition').addClass(CLASS_NAME_COLLAPSED).delay(50).queue(function () { |
|||
$(this).removeClass('hold-transition') |
|||
$(this).dequeue() |
|||
}) |
|||
} else { |
|||
$body.addClass(CLASS_NAME_COLLAPSED) |
|||
} |
|||
} else if (this._options.noTransitionAfterReload) { |
|||
$body.addClass('hold-transition').removeClass(CLASS_NAME_COLLAPSED).delay(50).queue(function () { |
|||
$(this).removeClass('hold-transition') |
|||
$(this).dequeue() |
|||
}) |
|||
} else { |
|||
$body.removeClass(CLASS_NAME_COLLAPSED) |
|||
} |
|||
} |
|||
|
|||
// Private
|
|||
|
|||
_init() { |
|||
this.remember() |
|||
this.autoCollapse() |
|||
|
|||
$(window).resize(() => { |
|||
this.autoCollapse(true) |
|||
}) |
|||
} |
|||
|
|||
_addOverlay() { |
|||
const overlay = $('<div />', { |
|||
id: 'sidebar-overlay' |
|||
}) |
|||
|
|||
overlay.on('click', () => { |
|||
this.collapse() |
|||
}) |
|||
|
|||
$(SELECTOR_WRAPPER).append(overlay) |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(operation) { |
|||
return this.each(function () { |
|||
let data = $(this).data(DATA_KEY) |
|||
const _options = $.extend({}, Default, $(this).data()) |
|||
|
|||
if (!data) { |
|||
data = new PushMenu(this, _options) |
|||
$(this).data(DATA_KEY, data) |
|||
} |
|||
|
|||
if (typeof operation === 'string' && /collapse|expand|toggle/.test(operation)) { |
|||
data[operation]() |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Data API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$(document).on('click', SELECTOR_TOGGLE_BUTTON, event => { |
|||
event.preventDefault() |
|||
|
|||
let button = event.currentTarget |
|||
|
|||
if ($(button).data('widget') !== 'pushmenu') { |
|||
button = $(button).closest(SELECTOR_TOGGLE_BUTTON) |
|||
} |
|||
|
|||
PushMenu._jQueryInterface.call($(button), 'toggle') |
|||
}) |
|||
|
|||
$(window).on('load', () => { |
|||
PushMenu._jQueryInterface.call($(SELECTOR_TOGGLE_BUTTON)) |
|||
}) |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = PushMenu._jQueryInterface |
|||
$.fn[NAME].Constructor = PushMenu |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return PushMenu._jQueryInterface |
|||
} |
|||
|
|||
export default PushMenu |
|||
@ -0,0 +1,299 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE SidebarSearch.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $, { trim } from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'SidebarSearch' |
|||
const DATA_KEY = 'lte.sidebar-search' |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const CLASS_NAME_OPEN = 'sidebar-search-open' |
|||
const CLASS_NAME_ICON_SEARCH = 'fa-search' |
|||
const CLASS_NAME_ICON_CLOSE = 'fa-times' |
|||
const CLASS_NAME_HEADER = 'nav-header' |
|||
const CLASS_NAME_SEARCH_RESULTS = 'sidebar-search-results' |
|||
const CLASS_NAME_LIST_GROUP = 'list-group' |
|||
|
|||
const SELECTOR_DATA_WIDGET = '[data-widget="sidebar-search"]' |
|||
const SELECTOR_SIDEBAR = '.main-sidebar .nav-sidebar' |
|||
const SELECTOR_NAV_LINK = '.nav-link' |
|||
const SELECTOR_NAV_TREEVIEW = '.nav-treeview' |
|||
const SELECTOR_SEARCH_INPUT = `${SELECTOR_DATA_WIDGET} .form-control` |
|||
const SELECTOR_SEARCH_BUTTON = `${SELECTOR_DATA_WIDGET} .btn` |
|||
const SELECTOR_SEARCH_ICON = `${SELECTOR_SEARCH_BUTTON} i` |
|||
const SELECTOR_SEARCH_LIST_GROUP = `.${CLASS_NAME_LIST_GROUP}` |
|||
const SELECTOR_SEARCH_RESULTS = `.${CLASS_NAME_SEARCH_RESULTS}` |
|||
const SELECTOR_SEARCH_RESULTS_GROUP = `${SELECTOR_SEARCH_RESULTS} .${CLASS_NAME_LIST_GROUP}` |
|||
|
|||
const Default = { |
|||
arrowSign: '->', |
|||
minLength: 3, |
|||
maxResults: 7, |
|||
highlightName: true, |
|||
highlightPath: false, |
|||
highlightClass: 'text-light', |
|||
notFoundText: 'No element found!' |
|||
} |
|||
|
|||
const SearchItems = [] |
|||
|
|||
/** |
|||
* Class Definition |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
class SidebarSearch { |
|||
constructor(_element, _options) { |
|||
this.element = _element |
|||
this.options = $.extend({}, Default, _options) |
|||
this.items = [] |
|||
} |
|||
|
|||
// Public
|
|||
|
|||
init() { |
|||
if ($(SELECTOR_DATA_WIDGET).length === 0) { |
|||
return |
|||
} |
|||
|
|||
if ($(SELECTOR_DATA_WIDGET).next(SELECTOR_SEARCH_RESULTS).length === 0) { |
|||
$(SELECTOR_DATA_WIDGET).after( |
|||
$('<div />', { class: CLASS_NAME_SEARCH_RESULTS }) |
|||
) |
|||
} |
|||
|
|||
if ($(SELECTOR_SEARCH_RESULTS).children(SELECTOR_SEARCH_LIST_GROUP).length === 0) { |
|||
$(SELECTOR_SEARCH_RESULTS).append( |
|||
$('<div />', { class: CLASS_NAME_LIST_GROUP }) |
|||
) |
|||
} |
|||
|
|||
this._addNotFound() |
|||
|
|||
$(SELECTOR_SIDEBAR).children().each((i, child) => { |
|||
this._parseItem(child) |
|||
}) |
|||
} |
|||
|
|||
search() { |
|||
const searchValue = $(SELECTOR_SEARCH_INPUT).val().toLowerCase() |
|||
if (searchValue.length < this.options.minLength) { |
|||
$(SELECTOR_SEARCH_RESULTS_GROUP).empty() |
|||
this._addNotFound() |
|||
this.close() |
|||
return |
|||
} |
|||
|
|||
const searchResults = SearchItems.filter(item => (item.name).toLowerCase().includes(searchValue)) |
|||
const endResults = $(searchResults.slice(0, this.options.maxResults)) |
|||
$(SELECTOR_SEARCH_RESULTS_GROUP).empty() |
|||
|
|||
if (endResults.length === 0) { |
|||
this._addNotFound() |
|||
} else { |
|||
endResults.each((i, result) => { |
|||
$(SELECTOR_SEARCH_RESULTS_GROUP).append(this._renderItem(escape(result.name), encodeURI(result.link), result.path)) |
|||
}) |
|||
} |
|||
|
|||
this.open() |
|||
} |
|||
|
|||
open() { |
|||
$(SELECTOR_DATA_WIDGET).parent().addClass(CLASS_NAME_OPEN) |
|||
$(SELECTOR_SEARCH_ICON).removeClass(CLASS_NAME_ICON_SEARCH).addClass(CLASS_NAME_ICON_CLOSE) |
|||
} |
|||
|
|||
close() { |
|||
$(SELECTOR_DATA_WIDGET).parent().removeClass(CLASS_NAME_OPEN) |
|||
$(SELECTOR_SEARCH_ICON).removeClass(CLASS_NAME_ICON_CLOSE).addClass(CLASS_NAME_ICON_SEARCH) |
|||
} |
|||
|
|||
toggle() { |
|||
if ($(SELECTOR_DATA_WIDGET).parent().hasClass(CLASS_NAME_OPEN)) { |
|||
this.close() |
|||
} else { |
|||
this.open() |
|||
} |
|||
} |
|||
|
|||
// Private
|
|||
|
|||
_parseItem(item, path = []) { |
|||
if ($(item).hasClass(CLASS_NAME_HEADER)) { |
|||
return |
|||
} |
|||
|
|||
const itemObject = {} |
|||
const navLink = $(item).clone().find(`> ${SELECTOR_NAV_LINK}`) |
|||
const navTreeview = $(item).clone().find(`> ${SELECTOR_NAV_TREEVIEW}`) |
|||
|
|||
const link = navLink.attr('href') |
|||
const name = navLink.find('p').children().remove().end().text() |
|||
|
|||
itemObject.name = this._trimText(name) |
|||
itemObject.link = link |
|||
itemObject.path = path |
|||
|
|||
if (navTreeview.length === 0) { |
|||
SearchItems.push(itemObject) |
|||
} else { |
|||
const newPath = itemObject.path.concat([itemObject.name]) |
|||
navTreeview.children().each((i, child) => { |
|||
this._parseItem(child, newPath) |
|||
}) |
|||
} |
|||
} |
|||
|
|||
_trimText(text) { |
|||
return trim(text.replace(/(\r\n|\n|\r)/gm, ' ')) |
|||
} |
|||
|
|||
_renderItem(name, link, path) { |
|||
path = path.join(` ${this.options.arrowSign} `) |
|||
name = unescape(name) |
|||
link = decodeURI(link) |
|||
|
|||
if (this.options.highlightName || this.options.highlightPath) { |
|||
const searchValue = $(SELECTOR_SEARCH_INPUT).val().toLowerCase() |
|||
const regExp = new RegExp(searchValue, 'gi') |
|||
|
|||
if (this.options.highlightName) { |
|||
name = name.replace( |
|||
regExp, |
|||
str => { |
|||
return `<strong class="${this.options.highlightClass}">${str}</strong>` |
|||
} |
|||
) |
|||
} |
|||
|
|||
if (this.options.highlightPath) { |
|||
path = path.replace( |
|||
regExp, |
|||
str => { |
|||
return `<strong class="${this.options.highlightClass}">${str}</strong>` |
|||
} |
|||
) |
|||
} |
|||
} |
|||
|
|||
const groupItemElement = $('<a/>', { |
|||
href: decodeURIComponent(link), |
|||
class: 'list-group-item' |
|||
}) |
|||
const searchTitleElement = $('<div/>', { |
|||
class: 'search-title' |
|||
}).html(name) |
|||
const searchPathElement = $('<div/>', { |
|||
class: 'search-path' |
|||
}).html(path) |
|||
|
|||
groupItemElement.append(searchTitleElement).append(searchPathElement) |
|||
|
|||
return groupItemElement |
|||
} |
|||
|
|||
_addNotFound() { |
|||
$(SELECTOR_SEARCH_RESULTS_GROUP).append(this._renderItem(this.options.notFoundText, '#', [])) |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(config) { |
|||
let data = $(this).data(DATA_KEY) |
|||
|
|||
if (!data) { |
|||
data = $(this).data() |
|||
} |
|||
|
|||
const _options = $.extend({}, Default, typeof config === 'object' ? config : data) |
|||
const plugin = new SidebarSearch($(this), _options) |
|||
|
|||
$(this).data(DATA_KEY, typeof config === 'object' ? config : data) |
|||
|
|||
if (typeof config === 'string' && /init|toggle|close|open|search/.test(config)) { |
|||
plugin[config]() |
|||
} else { |
|||
plugin.init() |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Data API |
|||
* ==================================================== |
|||
*/ |
|||
$(document).on('click', SELECTOR_SEARCH_BUTTON, event => { |
|||
event.preventDefault() |
|||
|
|||
SidebarSearch._jQueryInterface.call($(SELECTOR_DATA_WIDGET), 'toggle') |
|||
}) |
|||
|
|||
$(document).on('keyup', SELECTOR_SEARCH_INPUT, event => { |
|||
if (event.keyCode == 38) { |
|||
event.preventDefault() |
|||
$(SELECTOR_SEARCH_RESULTS_GROUP).children().last().focus() |
|||
return |
|||
} |
|||
|
|||
if (event.keyCode == 40) { |
|||
event.preventDefault() |
|||
$(SELECTOR_SEARCH_RESULTS_GROUP).children().first().focus() |
|||
return |
|||
} |
|||
|
|||
setTimeout(() => { |
|||
SidebarSearch._jQueryInterface.call($(SELECTOR_DATA_WIDGET), 'search') |
|||
}, 100) |
|||
}) |
|||
|
|||
$(document).on('keydown', SELECTOR_SEARCH_RESULTS_GROUP, event => { |
|||
const $focused = $(':focus') |
|||
|
|||
if (event.keyCode == 38) { |
|||
event.preventDefault() |
|||
|
|||
if ($focused.is(':first-child')) { |
|||
$focused.siblings().last().focus() |
|||
} else { |
|||
$focused.prev().focus() |
|||
} |
|||
} |
|||
|
|||
if (event.keyCode == 40) { |
|||
event.preventDefault() |
|||
|
|||
if ($focused.is(':last-child')) { |
|||
$focused.siblings().first().focus() |
|||
} else { |
|||
$focused.next().focus() |
|||
} |
|||
} |
|||
}) |
|||
|
|||
$(window).on('load', () => { |
|||
SidebarSearch._jQueryInterface.call($(SELECTOR_DATA_WIDGET), 'init') |
|||
}) |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = SidebarSearch._jQueryInterface |
|||
$.fn[NAME].Constructor = SidebarSearch |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return SidebarSearch._jQueryInterface |
|||
} |
|||
|
|||
export default SidebarSearch |
|||
@ -0,0 +1,209 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE Toasts.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $ from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'Toasts' |
|||
const DATA_KEY = 'lte.toasts' |
|||
const EVENT_KEY = `.${DATA_KEY}` |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const EVENT_INIT = `init${EVENT_KEY}` |
|||
const EVENT_CREATED = `created${EVENT_KEY}` |
|||
const EVENT_REMOVED = `removed${EVENT_KEY}` |
|||
|
|||
const SELECTOR_CONTAINER_TOP_RIGHT = '#toastsContainerTopRight' |
|||
const SELECTOR_CONTAINER_TOP_LEFT = '#toastsContainerTopLeft' |
|||
const SELECTOR_CONTAINER_BOTTOM_RIGHT = '#toastsContainerBottomRight' |
|||
const SELECTOR_CONTAINER_BOTTOM_LEFT = '#toastsContainerBottomLeft' |
|||
|
|||
const CLASS_NAME_TOP_RIGHT = 'toasts-top-right' |
|||
const CLASS_NAME_TOP_LEFT = 'toasts-top-left' |
|||
const CLASS_NAME_BOTTOM_RIGHT = 'toasts-bottom-right' |
|||
const CLASS_NAME_BOTTOM_LEFT = 'toasts-bottom-left' |
|||
|
|||
const POSITION_TOP_RIGHT = 'topRight' |
|||
const POSITION_TOP_LEFT = 'topLeft' |
|||
const POSITION_BOTTOM_RIGHT = 'bottomRight' |
|||
const POSITION_BOTTOM_LEFT = 'bottomLeft' |
|||
|
|||
const Default = { |
|||
position: POSITION_TOP_RIGHT, |
|||
fixed: true, |
|||
autohide: false, |
|||
autoremove: true, |
|||
delay: 1000, |
|||
fade: true, |
|||
icon: null, |
|||
image: null, |
|||
imageAlt: null, |
|||
imageHeight: '25px', |
|||
title: null, |
|||
subtitle: null, |
|||
close: true, |
|||
body: null, |
|||
class: null |
|||
} |
|||
|
|||
/** |
|||
* Class Definition |
|||
* ==================================================== |
|||
*/ |
|||
class Toasts { |
|||
constructor(element, config) { |
|||
this._config = config |
|||
this._prepareContainer() |
|||
|
|||
$('body').trigger($.Event(EVENT_INIT)) |
|||
} |
|||
|
|||
// Public
|
|||
|
|||
create() { |
|||
const toast = $('<div class="toast" role="alert" aria-live="assertive" aria-atomic="true"/>') |
|||
|
|||
toast.data('autohide', this._config.autohide) |
|||
toast.data('animation', this._config.fade) |
|||
|
|||
if (this._config.class) { |
|||
toast.addClass(this._config.class) |
|||
} |
|||
|
|||
if (this._config.delay && this._config.delay != 500) { |
|||
toast.data('delay', this._config.delay) |
|||
} |
|||
|
|||
const toastHeader = $('<div class="toast-header">') |
|||
|
|||
if (this._config.image != null) { |
|||
const toastImage = $('<img />').addClass('rounded mr-2').attr('src', this._config.image).attr('alt', this._config.imageAlt) |
|||
|
|||
if (this._config.imageHeight != null) { |
|||
toastImage.height(this._config.imageHeight).width('auto') |
|||
} |
|||
|
|||
toastHeader.append(toastImage) |
|||
} |
|||
|
|||
if (this._config.icon != null) { |
|||
toastHeader.append($('<i />').addClass('mr-2').addClass(this._config.icon)) |
|||
} |
|||
|
|||
if (this._config.title != null) { |
|||
toastHeader.append($('<strong />').addClass('mr-auto').html(this._config.title)) |
|||
} |
|||
|
|||
if (this._config.subtitle != null) { |
|||
toastHeader.append($('<small />').html(this._config.subtitle)) |
|||
} |
|||
|
|||
if (this._config.close == true) { |
|||
const toastClose = $('<button data-dismiss="toast" />').attr('type', 'button').addClass('ml-2 mb-1 close').attr('aria-label', 'Close').append('<span aria-hidden="true">×</span>') |
|||
|
|||
if (this._config.title == null) { |
|||
toastClose.toggleClass('ml-2 ml-auto') |
|||
} |
|||
|
|||
toastHeader.append(toastClose) |
|||
} |
|||
|
|||
toast.append(toastHeader) |
|||
|
|||
if (this._config.body != null) { |
|||
toast.append($('<div class="toast-body" />').html(this._config.body)) |
|||
} |
|||
|
|||
$(this._getContainerId()).prepend(toast) |
|||
|
|||
const $body = $('body') |
|||
|
|||
$body.trigger($.Event(EVENT_CREATED)) |
|||
toast.toast('show') |
|||
|
|||
if (this._config.autoremove) { |
|||
toast.on('hidden.bs.toast', function () { |
|||
$(this).delay(200).remove() |
|||
$body.trigger($.Event(EVENT_REMOVED)) |
|||
}) |
|||
} |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
_getContainerId() { |
|||
if (this._config.position == POSITION_TOP_RIGHT) { |
|||
return SELECTOR_CONTAINER_TOP_RIGHT |
|||
} |
|||
|
|||
if (this._config.position == POSITION_TOP_LEFT) { |
|||
return SELECTOR_CONTAINER_TOP_LEFT |
|||
} |
|||
|
|||
if (this._config.position == POSITION_BOTTOM_RIGHT) { |
|||
return SELECTOR_CONTAINER_BOTTOM_RIGHT |
|||
} |
|||
|
|||
if (this._config.position == POSITION_BOTTOM_LEFT) { |
|||
return SELECTOR_CONTAINER_BOTTOM_LEFT |
|||
} |
|||
} |
|||
|
|||
_prepareContainer() { |
|||
if ($(this._getContainerId()).length === 0) { |
|||
const container = $('<div />').attr('id', this._getContainerId().replace('#', '')) |
|||
if (this._config.position == POSITION_TOP_RIGHT) { |
|||
container.addClass(CLASS_NAME_TOP_RIGHT) |
|||
} else if (this._config.position == POSITION_TOP_LEFT) { |
|||
container.addClass(CLASS_NAME_TOP_LEFT) |
|||
} else if (this._config.position == POSITION_BOTTOM_RIGHT) { |
|||
container.addClass(CLASS_NAME_BOTTOM_RIGHT) |
|||
} else if (this._config.position == POSITION_BOTTOM_LEFT) { |
|||
container.addClass(CLASS_NAME_BOTTOM_LEFT) |
|||
} |
|||
|
|||
$('body').append(container) |
|||
} |
|||
|
|||
if (this._config.fixed) { |
|||
$(this._getContainerId()).addClass('fixed') |
|||
} else { |
|||
$(this._getContainerId()).removeClass('fixed') |
|||
} |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(option, config) { |
|||
return this.each(function () { |
|||
const _options = $.extend({}, Default, config) |
|||
const toast = new Toasts($(this), _options) |
|||
|
|||
if (option === 'create') { |
|||
toast[option]() |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = Toasts._jQueryInterface |
|||
$.fn[NAME].Constructor = Toasts |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return Toasts._jQueryInterface |
|||
} |
|||
|
|||
export default Toasts |
|||
@ -0,0 +1,118 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE TodoList.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $ from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'TodoList' |
|||
const DATA_KEY = 'lte.todolist' |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const SELECTOR_DATA_TOGGLE = '[data-widget="todo-list"]' |
|||
const CLASS_NAME_TODO_LIST_DONE = 'done' |
|||
|
|||
const Default = { |
|||
onCheck(item) { |
|||
return item |
|||
}, |
|||
onUnCheck(item) { |
|||
return item |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Class Definition |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
class TodoList { |
|||
constructor(element, config) { |
|||
this._config = config |
|||
this._element = element |
|||
|
|||
this._init() |
|||
} |
|||
|
|||
// Public
|
|||
|
|||
toggle(item) { |
|||
item.parents('li').toggleClass(CLASS_NAME_TODO_LIST_DONE) |
|||
if (!$(item).prop('checked')) { |
|||
this.unCheck($(item)) |
|||
return |
|||
} |
|||
|
|||
this.check(item) |
|||
} |
|||
|
|||
check(item) { |
|||
this._config.onCheck.call(item) |
|||
} |
|||
|
|||
unCheck(item) { |
|||
this._config.onUnCheck.call(item) |
|||
} |
|||
|
|||
// Private
|
|||
|
|||
_init() { |
|||
const $toggleSelector = this._element |
|||
|
|||
$toggleSelector.find('input:checkbox:checked').parents('li').toggleClass(CLASS_NAME_TODO_LIST_DONE) |
|||
$toggleSelector.on('change', 'input:checkbox', event => { |
|||
this.toggle($(event.target)) |
|||
}) |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(config) { |
|||
return this.each(function () { |
|||
let data = $(this).data(DATA_KEY) |
|||
|
|||
if (!data) { |
|||
data = $(this).data() |
|||
} |
|||
|
|||
const _options = $.extend({}, Default, typeof config === 'object' ? config : data) |
|||
const plugin = new TodoList($(this), _options) |
|||
|
|||
$(this).data(DATA_KEY, typeof config === 'object' ? config : data) |
|||
|
|||
if (config === 'init') { |
|||
plugin[config]() |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Data API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$(window).on('load', () => { |
|||
TodoList._jQueryInterface.call($(SELECTOR_DATA_TOGGLE)) |
|||
}) |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = TodoList._jQueryInterface |
|||
$.fn[NAME].Constructor = TodoList |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return TodoList._jQueryInterface |
|||
} |
|||
|
|||
export default TodoList |
|||
@ -0,0 +1,175 @@ |
|||
/** |
|||
* -------------------------------------------- |
|||
* AdminLTE Treeview.js |
|||
* License MIT |
|||
* -------------------------------------------- |
|||
*/ |
|||
|
|||
import $ from 'jquery' |
|||
|
|||
/** |
|||
* Constants |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
const NAME = 'Treeview' |
|||
const DATA_KEY = 'lte.treeview' |
|||
const EVENT_KEY = `.${DATA_KEY}` |
|||
const JQUERY_NO_CONFLICT = $.fn[NAME] |
|||
|
|||
const EVENT_EXPANDED = `expanded${EVENT_KEY}` |
|||
const EVENT_COLLAPSED = `collapsed${EVENT_KEY}` |
|||
const EVENT_LOAD_DATA_API = `load${EVENT_KEY}` |
|||
|
|||
const SELECTOR_LI = '.nav-item' |
|||
const SELECTOR_LINK = '.nav-link' |
|||
const SELECTOR_TREEVIEW_MENU = '.nav-treeview' |
|||
const SELECTOR_OPEN = '.menu-open' |
|||
const SELECTOR_DATA_WIDGET = '[data-widget="treeview"]' |
|||
|
|||
const CLASS_NAME_OPEN = 'menu-open' |
|||
const CLASS_NAME_IS_OPENING = 'menu-is-opening' |
|||
const CLASS_NAME_SIDEBAR_COLLAPSED = 'sidebar-collapse' |
|||
|
|||
const Default = { |
|||
trigger: `${SELECTOR_DATA_WIDGET} ${SELECTOR_LINK}`, |
|||
animationSpeed: 300, |
|||
accordion: true, |
|||
expandSidebar: false, |
|||
sidebarButtonSelector: '[data-widget="pushmenu"]' |
|||
} |
|||
|
|||
/** |
|||
* Class Definition |
|||
* ==================================================== |
|||
*/ |
|||
class Treeview { |
|||
constructor(element, config) { |
|||
this._config = config |
|||
this._element = element |
|||
} |
|||
|
|||
// Public
|
|||
|
|||
init() { |
|||
$(`${SELECTOR_LI}${SELECTOR_OPEN} ${SELECTOR_TREEVIEW_MENU}${SELECTOR_OPEN}`).css('display', 'block') |
|||
this._setupListeners() |
|||
} |
|||
|
|||
expand(treeviewMenu, parentLi) { |
|||
const expandedEvent = $.Event(EVENT_EXPANDED) |
|||
|
|||
if (this._config.accordion) { |
|||
const openMenuLi = parentLi.siblings(SELECTOR_OPEN).first() |
|||
const openTreeview = openMenuLi.find(SELECTOR_TREEVIEW_MENU).first() |
|||
this.collapse(openTreeview, openMenuLi) |
|||
} |
|||
|
|||
parentLi.addClass(CLASS_NAME_IS_OPENING) |
|||
treeviewMenu.stop().slideDown(this._config.animationSpeed, () => { |
|||
parentLi.addClass(CLASS_NAME_OPEN) |
|||
$(this._element).trigger(expandedEvent) |
|||
}) |
|||
|
|||
if (this._config.expandSidebar) { |
|||
this._expandSidebar() |
|||
} |
|||
} |
|||
|
|||
collapse(treeviewMenu, parentLi) { |
|||
const collapsedEvent = $.Event(EVENT_COLLAPSED) |
|||
|
|||
parentLi.removeClass(`${CLASS_NAME_IS_OPENING} ${CLASS_NAME_OPEN}`) |
|||
treeviewMenu.stop().slideUp(this._config.animationSpeed, () => { |
|||
$(this._element).trigger(collapsedEvent) |
|||
treeviewMenu.find(`${SELECTOR_OPEN} > ${SELECTOR_TREEVIEW_MENU}`).slideUp() |
|||
treeviewMenu.find(SELECTOR_OPEN).removeClass(`${CLASS_NAME_IS_OPENING} ${CLASS_NAME_OPEN}`) |
|||
}) |
|||
} |
|||
|
|||
toggle(event) { |
|||
const $relativeTarget = $(event.currentTarget) |
|||
const $parent = $relativeTarget.parent() |
|||
|
|||
let treeviewMenu = $parent.find(`> ${SELECTOR_TREEVIEW_MENU}`) |
|||
|
|||
if (!treeviewMenu.is(SELECTOR_TREEVIEW_MENU)) { |
|||
if (!$parent.is(SELECTOR_LI)) { |
|||
treeviewMenu = $parent.parent().find(`> ${SELECTOR_TREEVIEW_MENU}`) |
|||
} |
|||
|
|||
if (!treeviewMenu.is(SELECTOR_TREEVIEW_MENU)) { |
|||
return |
|||
} |
|||
} |
|||
|
|||
event.preventDefault() |
|||
|
|||
const parentLi = $relativeTarget.parents(SELECTOR_LI).first() |
|||
const isOpen = parentLi.hasClass(CLASS_NAME_OPEN) |
|||
|
|||
if (isOpen) { |
|||
this.collapse($(treeviewMenu), parentLi) |
|||
} else { |
|||
this.expand($(treeviewMenu), parentLi) |
|||
} |
|||
} |
|||
|
|||
// Private
|
|||
|
|||
_setupListeners() { |
|||
const elementId = this._element.attr('id') !== undefined ? `#${this._element.attr('id')}` : '' |
|||
$(document).on('click', `${elementId}${this._config.trigger}`, event => { |
|||
this.toggle(event) |
|||
}) |
|||
} |
|||
|
|||
_expandSidebar() { |
|||
if ($('body').hasClass(CLASS_NAME_SIDEBAR_COLLAPSED)) { |
|||
$(this._config.sidebarButtonSelector).PushMenu('expand') |
|||
} |
|||
} |
|||
|
|||
// Static
|
|||
|
|||
static _jQueryInterface(config) { |
|||
return this.each(function () { |
|||
let data = $(this).data(DATA_KEY) |
|||
const _options = $.extend({}, Default, $(this).data()) |
|||
|
|||
if (!data) { |
|||
data = new Treeview($(this), _options) |
|||
$(this).data(DATA_KEY, data) |
|||
} |
|||
|
|||
if (config === 'init') { |
|||
data[config]() |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Data API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$(window).on(EVENT_LOAD_DATA_API, () => { |
|||
$(SELECTOR_DATA_WIDGET).each(function () { |
|||
Treeview._jQueryInterface.call($(this), 'init') |
|||
}) |
|||
}) |
|||
|
|||
/** |
|||
* jQuery API |
|||
* ==================================================== |
|||
*/ |
|||
|
|||
$.fn[NAME] = Treeview._jQueryInterface |
|||
$.fn[NAME].Constructor = Treeview |
|||
$.fn[NAME].noConflict = function () { |
|||
$.fn[NAME] = JQUERY_NO_CONFLICT |
|||
return Treeview._jQueryInterface |
|||
} |
|||
|
|||
export default Treeview |
|||
@ -0,0 +1,15 @@ |
|||
{ |
|||
"env": { |
|||
"browser": false, |
|||
"node": true |
|||
}, |
|||
"parserOptions": { |
|||
"sourceType": "script" |
|||
}, |
|||
"extends": "../../.eslintrc.json", |
|||
"rules": { |
|||
"no-console": "off", |
|||
"strict": "error", |
|||
"unicorn/prefer-module": "off" |
|||
} |
|||
} |
|||
@ -0,0 +1,48 @@ |
|||
'use strict' |
|||
|
|||
const Plugins = [ |
|||
// AdminLTE Dist
|
|||
{ |
|||
from: 'dist/css/', |
|||
to: 'docs/assets/css/' |
|||
}, |
|||
{ |
|||
from: 'dist/js/', |
|||
to: 'docs/assets/js/' |
|||
}, |
|||
// jQuery
|
|||
{ |
|||
from: 'node_modules/jquery/dist/', |
|||
to: 'docs/assets/plugins/jquery/' |
|||
}, |
|||
// Popper
|
|||
{ |
|||
from: 'node_modules/popper.js/dist/', |
|||
to: 'docs/assets/plugins/popper/' |
|||
}, |
|||
// Bootstrap
|
|||
{ |
|||
from: 'node_modules/bootstrap/dist/js/', |
|||
to: 'docs/assets/plugins/bootstrap/js/' |
|||
}, |
|||
// Font Awesome
|
|||
{ |
|||
from: 'node_modules/@fortawesome/fontawesome-free/css/', |
|||
to: 'docs/assets/plugins/fontawesome-free/css/' |
|||
}, |
|||
{ |
|||
from: 'node_modules/@fortawesome/fontawesome-free/webfonts/', |
|||
to: 'docs/assets/plugins/fontawesome-free/webfonts/' |
|||
}, |
|||
// overlayScrollbars
|
|||
{ |
|||
from: 'node_modules/overlayscrollbars/js/', |
|||
to: 'docs/assets/plugins/overlayScrollbars/js/' |
|||
}, |
|||
{ |
|||
from: 'node_modules/overlayscrollbars/css/', |
|||
to: 'docs/assets/plugins/overlayScrollbars/css/' |
|||
} |
|||
] |
|||
|
|||
module.exports = Plugins |
|||
@ -0,0 +1,58 @@ |
|||
#!/usr/bin/env node
|
|||
|
|||
'use strict' |
|||
|
|||
const path = require('path') |
|||
const fse = require('fs-extra') |
|||
const fs = require('fs') |
|||
const Plugins = require('./DocsPlugins') |
|||
|
|||
class Publish { |
|||
constructor() { |
|||
this.options = { |
|||
verbose: false |
|||
} |
|||
|
|||
this.getArguments() |
|||
} |
|||
|
|||
getArguments() { |
|||
if (process.argv.length > 2) { |
|||
const arg = process.argv[2] |
|||
switch (arg) { |
|||
case '-v': |
|||
case '--verbose': |
|||
this.options.verbose = true |
|||
break |
|||
default: |
|||
throw new Error(`Unknown option ${arg}`) |
|||
} |
|||
} |
|||
} |
|||
|
|||
run() { |
|||
// Publish files
|
|||
Plugins.forEach(module => { |
|||
try { |
|||
fse.copySync(module.from, module.to, { |
|||
// Skip copying dot files
|
|||
filter(src) { |
|||
return !path.basename(src).startsWith('.') |
|||
} |
|||
}) |
|||
|
|||
if (this.options.verbose) { |
|||
console.log(`Copied ${module.from} to ${module.to}`) |
|||
} |
|||
} catch (error) { |
|||
console.error(`Error: ${error}`) |
|||
} |
|||
}) |
|||
|
|||
const insertText = '---\r\nlayout: page\r\ntitle: \r\n---\r\n' |
|||
|
|||
fs.writeFileSync('docs/how-to-contribute.md', insertText + fs.readFileSync('.github/CONTRIBUTING.md', 'utf8')) |
|||
} |
|||
} |
|||
|
|||
(new Publish()).run() |
|||
@ -0,0 +1,449 @@ |
|||
'use strict' |
|||
|
|||
const Plugins = [ |
|||
// jQuery
|
|||
{ |
|||
from: 'node_modules/jquery/dist', |
|||
to: 'plugins/jquery' |
|||
}, |
|||
// Popper
|
|||
{ |
|||
from: 'node_modules/popper.js/dist', |
|||
to: 'plugins/popper' |
|||
}, |
|||
// Bootstrap
|
|||
{ |
|||
from: 'node_modules/bootstrap/dist/js', |
|||
to: 'plugins/bootstrap/js' |
|||
}, |
|||
// Font Awesome
|
|||
{ |
|||
from: 'node_modules/@fortawesome/fontawesome-free/css', |
|||
to: 'plugins/fontawesome-free/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/@fortawesome/fontawesome-free/webfonts', |
|||
to: 'plugins/fontawesome-free/webfonts' |
|||
}, |
|||
// overlayScrollbars
|
|||
{ |
|||
from: 'node_modules/overlayscrollbars/js', |
|||
to: 'plugins/overlayScrollbars/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/overlayscrollbars/css', |
|||
to: 'plugins/overlayScrollbars/css' |
|||
}, |
|||
// Chart.js
|
|||
{ |
|||
from: 'node_modules/chart.js/dist/', |
|||
to: 'plugins/chart.js' |
|||
}, |
|||
// jQuery UI
|
|||
{ |
|||
from: 'node_modules/jquery-ui-dist/', |
|||
to: 'plugins/jquery-ui' |
|||
}, |
|||
// Flot
|
|||
{ |
|||
from: 'node_modules/flot/dist/es5/', |
|||
to: 'plugins/flot' |
|||
}, |
|||
{ |
|||
from: 'node_modules/flot/source/', |
|||
to: 'plugins/flot/plugins' |
|||
}, |
|||
// Summernote
|
|||
{ |
|||
from: 'node_modules/summernote/dist/', |
|||
to: 'plugins/summernote' |
|||
}, |
|||
// Bootstrap Slider
|
|||
{ |
|||
from: 'node_modules/bootstrap-slider/dist/', |
|||
to: 'plugins/bootstrap-slider' |
|||
}, |
|||
{ |
|||
from: 'node_modules/bootstrap-slider/dist/css', |
|||
to: 'plugins/bootstrap-slider/css' |
|||
}, |
|||
// Bootstrap Colorpicker
|
|||
{ |
|||
from: 'node_modules/bootstrap-colorpicker/dist/js', |
|||
to: 'plugins/bootstrap-colorpicker/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/bootstrap-colorpicker/dist/css', |
|||
to: 'plugins/bootstrap-colorpicker/css' |
|||
}, |
|||
// Tempusdominus Bootstrap 4
|
|||
{ |
|||
from: 'node_modules/tempusdominus-bootstrap-4/build/js', |
|||
to: 'plugins/tempusdominus-bootstrap-4/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/tempusdominus-bootstrap-4/build/css', |
|||
to: 'plugins/tempusdominus-bootstrap-4/css' |
|||
}, |
|||
// Moment
|
|||
{ |
|||
from: 'node_modules/moment/min', |
|||
to: 'plugins/moment' |
|||
}, |
|||
{ |
|||
from: 'node_modules/moment/locale', |
|||
to: 'plugins/moment/locale' |
|||
}, |
|||
// FastClick
|
|||
{ |
|||
from: 'node_modules/fastclick/lib', |
|||
to: 'plugins/fastclick' |
|||
}, |
|||
// Date Range Picker
|
|||
{ |
|||
from: 'node_modules/daterangepicker/', |
|||
to: 'plugins/daterangepicker' |
|||
}, |
|||
// DataTables
|
|||
{ |
|||
from: 'node_modules/pdfmake/build', |
|||
to: 'plugins/pdfmake' |
|||
}, |
|||
{ |
|||
from: 'node_modules/jszip/dist', |
|||
to: 'plugins/jszip' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net/js', |
|||
to: 'plugins/datatables' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-bs4/js', |
|||
to: 'plugins/datatables-bs4/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-bs4/css', |
|||
to: 'plugins/datatables-bs4/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-autofill/js', |
|||
to: 'plugins/datatables-autofill/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-autofill-bs4/js', |
|||
to: 'plugins/datatables-autofill/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-autofill-bs4/css', |
|||
to: 'plugins/datatables-autofill/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-buttons/js', |
|||
to: 'plugins/datatables-buttons/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-buttons-bs4/js', |
|||
to: 'plugins/datatables-buttons/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-buttons-bs4/css', |
|||
to: 'plugins/datatables-buttons/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-colreorder/js', |
|||
to: 'plugins/datatables-colreorder/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-colreorder-bs4/js', |
|||
to: 'plugins/datatables-colreorder/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-colreorder-bs4/css', |
|||
to: 'plugins/datatables-colreorder/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-fixedcolumns/js', |
|||
to: 'plugins/datatables-fixedcolumns/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-fixedcolumns-bs4/js', |
|||
to: 'plugins/datatables-fixedcolumns/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-fixedcolumns-bs4/css', |
|||
to: 'plugins/datatables-fixedcolumns/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-fixedheader/js', |
|||
to: 'plugins/datatables-fixedheader/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-fixedheader-bs4/js', |
|||
to: 'plugins/datatables-fixedheader/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-fixedheader-bs4/css', |
|||
to: 'plugins/datatables-fixedheader/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-keytable/js', |
|||
to: 'plugins/datatables-keytable/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-keytable-bs4/js', |
|||
to: 'plugins/datatables-keytable/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-keytable-bs4/css', |
|||
to: 'plugins/datatables-keytable/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-responsive/js', |
|||
to: 'plugins/datatables-responsive/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-responsive-bs4/js', |
|||
to: 'plugins/datatables-responsive/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-responsive-bs4/css', |
|||
to: 'plugins/datatables-responsive/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-rowgroup/js', |
|||
to: 'plugins/datatables-rowgroup/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-rowgroup-bs4/js', |
|||
to: 'plugins/datatables-rowgroup/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-rowgroup-bs4/css', |
|||
to: 'plugins/datatables-rowgroup/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-rowreorder/js', |
|||
to: 'plugins/datatables-rowreorder/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-rowreorder-bs4/js', |
|||
to: 'plugins/datatables-rowreorder/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-rowreorder-bs4/css', |
|||
to: 'plugins/datatables-rowreorder/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-scroller/js', |
|||
to: 'plugins/datatables-scroller/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-scroller-bs4/js', |
|||
to: 'plugins/datatables-scroller/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-scroller-bs4/css', |
|||
to: 'plugins/datatables-scroller/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-searchbuilder/js', |
|||
to: 'plugins/datatables-searchbuilder/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-searchbuilder-bs4/js', |
|||
to: 'plugins/datatables-searchbuilder/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-searchbuilder-bs4/css', |
|||
to: 'plugins/datatables-searchbuilder/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-searchpanes/js', |
|||
to: 'plugins/datatables-searchpanes/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-searchpanes-bs4/js', |
|||
to: 'plugins/datatables-searchpanes/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-searchpanes-bs4/css', |
|||
to: 'plugins/datatables-searchpanes/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-select/js', |
|||
to: 'plugins/datatables-select/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-select-bs4/js', |
|||
to: 'plugins/datatables-select/js' |
|||
}, |
|||
{ |
|||
from: 'node_modules/datatables.net-select-bs4/css', |
|||
to: 'plugins/datatables-select/css' |
|||
}, |
|||
|
|||
// Fullcalendar
|
|||
{ |
|||
from: 'node_modules/fullcalendar/', |
|||
to: 'plugins/fullcalendar' |
|||
}, |
|||
// icheck bootstrap
|
|||
{ |
|||
from: 'node_modules/icheck-bootstrap/', |
|||
to: 'plugins/icheck-bootstrap' |
|||
}, |
|||
// inputmask
|
|||
{ |
|||
from: 'node_modules/inputmask/dist/', |
|||
to: 'plugins/inputmask' |
|||
}, |
|||
// ion-rangeslider
|
|||
{ |
|||
from: 'node_modules/ion-rangeslider/', |
|||
to: 'plugins/ion-rangeslider' |
|||
}, |
|||
// JQVMap (jqvmap-novulnerability)
|
|||
{ |
|||
from: 'node_modules/jqvmap-novulnerability/dist/', |
|||
to: 'plugins/jqvmap' |
|||
}, |
|||
// jQuery Mapael
|
|||
{ |
|||
from: 'node_modules/jquery-mapael/js/', |
|||
to: 'plugins/jquery-mapael' |
|||
}, |
|||
// Raphael
|
|||
{ |
|||
from: 'node_modules/raphael/', |
|||
to: 'plugins/raphael' |
|||
}, |
|||
// jQuery Mousewheel
|
|||
{ |
|||
from: 'node_modules/jquery-mousewheel/', |
|||
to: 'plugins/jquery-mousewheel' |
|||
}, |
|||
// jQuery Knob
|
|||
{ |
|||
from: 'node_modules/jquery-knob-chif/dist/', |
|||
to: 'plugins/jquery-knob' |
|||
}, |
|||
// pace-progress
|
|||
{ |
|||
from: 'node_modules/@lgaitan/pace-progress/dist/', |
|||
to: 'plugins/pace-progress' |
|||
}, |
|||
// Select2
|
|||
{ |
|||
from: 'node_modules/select2/dist/', |
|||
to: 'plugins/select2' |
|||
}, |
|||
{ |
|||
from: 'node_modules/@ttskch/select2-bootstrap4-theme/dist/', |
|||
to: 'plugins/select2-bootstrap4-theme' |
|||
}, |
|||
// Sparklines
|
|||
{ |
|||
from: 'node_modules/sparklines/source/', |
|||
to: 'plugins/sparklines' |
|||
}, |
|||
// SweetAlert2
|
|||
{ |
|||
from: 'node_modules/sweetalert2/dist/', |
|||
to: 'plugins/sweetalert2' |
|||
}, |
|||
{ |
|||
from: 'node_modules/@sweetalert2/theme-bootstrap-4/', |
|||
to: 'plugins/sweetalert2-theme-bootstrap-4' |
|||
}, |
|||
// Toastr
|
|||
{ |
|||
from: 'node_modules/toastr/build/', |
|||
to: 'plugins/toastr' |
|||
}, |
|||
// jsGrid
|
|||
{ |
|||
from: 'node_modules/jsgrid/dist', |
|||
to: 'plugins/jsgrid' |
|||
}, |
|||
{ |
|||
from: 'node_modules/jsgrid/demos/db.js', |
|||
to: 'plugins/jsgrid/demos/db.js' |
|||
}, |
|||
// flag-icon-css
|
|||
{ |
|||
from: 'node_modules/flag-icon-css/css', |
|||
to: 'plugins/flag-icon-css/css' |
|||
}, |
|||
{ |
|||
from: 'node_modules/flag-icon-css/flags', |
|||
to: 'plugins/flag-icon-css/flags' |
|||
}, |
|||
// bootstrap4-duallistbox
|
|||
{ |
|||
from: 'node_modules/bootstrap4-duallistbox/dist', |
|||
to: 'plugins/bootstrap4-duallistbox/' |
|||
}, |
|||
// filterizr
|
|||
{ |
|||
from: 'node_modules/filterizr/dist', |
|||
to: 'plugins/filterizr/' |
|||
}, |
|||
// ekko-lightbox
|
|||
{ |
|||
from: 'node_modules/ekko-lightbox/dist', |
|||
to: 'plugins/ekko-lightbox/' |
|||
}, |
|||
// bootstrap-switch
|
|||
{ |
|||
from: 'node_modules/bootstrap-switch/dist', |
|||
to: 'plugins/bootstrap-switch/' |
|||
}, |
|||
// jQuery Validate
|
|||
{ |
|||
from: 'node_modules/jquery-validation/dist/', |
|||
to: 'plugins/jquery-validation' |
|||
}, |
|||
// bs-custom-file-input
|
|||
{ |
|||
from: 'node_modules/bs-custom-file-input/dist/', |
|||
to: 'plugins/bs-custom-file-input' |
|||
}, |
|||
// bs-stepper
|
|||
{ |
|||
from: 'node_modules/bs-stepper/dist/', |
|||
to: 'plugins/bs-stepper' |
|||
}, |
|||
// CodeMirror
|
|||
{ |
|||
from: 'node_modules/codemirror/lib/', |
|||
to: 'plugins/codemirror' |
|||
}, |
|||
{ |
|||
from: 'node_modules/codemirror/addon/', |
|||
to: 'plugins/codemirror/addon' |
|||
}, |
|||
{ |
|||
from: 'node_modules/codemirror/keymap/', |
|||
to: 'plugins/codemirror/keymap' |
|||
}, |
|||
{ |
|||
from: 'node_modules/codemirror/mode/', |
|||
to: 'plugins/codemirror/mode' |
|||
}, |
|||
{ |
|||
from: 'node_modules/codemirror/theme/', |
|||
to: 'plugins/codemirror/theme' |
|||
}, |
|||
// dropzonejs
|
|||
{ |
|||
from: 'node_modules/dropzone/dist/', |
|||
to: 'plugins/dropzone' |
|||
}, |
|||
// uPlot
|
|||
{ |
|||
from: 'node_modules/uplot/dist/', |
|||
to: 'plugins/uplot' |
|||
} |
|||
] |
|||
|
|||
module.exports = Plugins |
|||
@ -0,0 +1,59 @@ |
|||
#!/usr/bin/env node
|
|||
|
|||
'use strict' |
|||
|
|||
const path = require('path') |
|||
const fse = require('fs-extra') |
|||
const Plugins = require('./Plugins') |
|||
|
|||
class Publish { |
|||
constructor() { |
|||
this.options = { |
|||
verbose: false |
|||
} |
|||
|
|||
this.getArguments() |
|||
} |
|||
|
|||
getArguments() { |
|||
if (process.argv.length > 2) { |
|||
const arg = process.argv[2] |
|||
switch (arg) { |
|||
case '-v': |
|||
case '--verbose': |
|||
this.options.verbose = true |
|||
break |
|||
default: |
|||
throw new Error(`Unknown option ${arg}`) |
|||
} |
|||
} |
|||
} |
|||
|
|||
run() { |
|||
// Publish files
|
|||
Plugins.forEach(module => { |
|||
const fseOptions = { |
|||
// Skip copying dot files
|
|||
filter(src) { |
|||
return !path.basename(src).startsWith('.') |
|||
} |
|||
} |
|||
|
|||
try { |
|||
if (fse.existsSync(module.from)) { |
|||
fse.copySync(module.from, module.to, fseOptions) |
|||
} else { |
|||
fse.copySync(module.from.replace('node_modules/', '../'), module.to, fseOptions) |
|||
} |
|||
|
|||
if (this.options.verbose) { |
|||
console.log(`Copied ${module.from} to ${module.to}`) |
|||
} |
|||
} catch (error) { |
|||
console.error(`Error: ${error}`) |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
|
|||
(new Publish()).run() |
|||
@ -0,0 +1,55 @@ |
|||
#!/usr/bin/env node
|
|||
|
|||
/*! |
|||
* Script to run vnu-jar if Java is available. |
|||
* Copyright 2017-2021 The Bootstrap Authors |
|||
* Copyright 2017-2021 Twitter, Inc. |
|||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|||
*/ |
|||
|
|||
'use strict' |
|||
|
|||
const childProcess = require('child_process') |
|||
const vnu = require('vnu-jar') |
|||
|
|||
childProcess.exec('java -version', (error, stdout, stderr) => { |
|||
if (error) { |
|||
console.error('Skipping vnu-jar test; Java is missing.') |
|||
return |
|||
} |
|||
|
|||
const is32bitJava = !/64-Bit/.test(stderr) |
|||
|
|||
// vnu-jar accepts multiple ignores joined with a `|`.
|
|||
// Also note that the ignores are regular expressions.
|
|||
const ignores = [ |
|||
// "autocomplete" is included in <button> and checkboxes and radio <input>s due to
|
|||
// Firefox's non-standard autocomplete behavior - see https://bugzilla.mozilla.org/show_bug.cgi?id=654072
|
|||
'Attribute “autocomplete” is only allowed when the input type is.*' |
|||
].join('|') |
|||
|
|||
const args = [ |
|||
'-jar', |
|||
vnu, |
|||
'--asciiquotes', |
|||
'--skip-non-html', |
|||
// Ignore the language code warnings
|
|||
'--no-langdetect', |
|||
'--Werror', |
|||
`--filterpattern "${ignores}"`, |
|||
'./*.html', |
|||
'docs_html/', |
|||
'pages/' |
|||
] |
|||
|
|||
// For the 32-bit Java we need to pass `-Xss512k`
|
|||
if (is32bitJava) { |
|||
args.splice(0, 0, '-Xss512k') |
|||
} |
|||
|
|||
return childProcess.spawn('java', args, { |
|||
shell: true, |
|||
stdio: 'inherit' |
|||
}) |
|||
.on('exit', process.exit) |
|||
}) |
|||
@ -0,0 +1,30 @@ |
|||
/*! |
|||
* AdminLTE v3.2.0 |
|||
* Author: Colorlib |
|||
* Website: AdminLTE.io <https://adminlte.io> |
|||
* License: Open source - MIT <https://opensource.org/licenses/MIT> |
|||
*/ |
|||
|
|||
// |
|||
// ------------------------------------------------------------------ |
|||
// This file is to be included in your custom SCSS. Before importing |
|||
// this file, you should include your custom AdminLTE and Bootstrap |
|||
// variables followed by bootstrap.scss and then this file. It's |
|||
// ok to import this file without custom variables too! |
|||
// NOTE: be sure to keep the license notice in the generated css. |
|||
// ------------------------------------------------------------------ |
|||
|
|||
// |
|||
// Variables and Mixins |
|||
// --------------------------------------------------- |
|||
@import "bootstrap-variables"; |
|||
@import "variables"; |
|||
@import "variables-alt"; |
|||
@import "mixins"; |
|||
|
|||
@import "parts/core"; |
|||
@import "parts/components"; |
|||
@import "parts/extra-components"; |
|||
@import "parts/pages"; |
|||
@import "parts/plugins"; |
|||
@import "parts/miscellaneous"; |
|||
@ -0,0 +1,52 @@ |
|||
// |
|||
// Component: Alert |
|||
// |
|||
|
|||
.alert { |
|||
.icon { |
|||
margin-right: 10px; |
|||
} |
|||
|
|||
.close { |
|||
color: $black; |
|||
opacity: .2; |
|||
|
|||
&:hover { |
|||
opacity: .5; |
|||
} |
|||
} |
|||
|
|||
a { |
|||
color: $white; |
|||
text-decoration: underline; |
|||
} |
|||
} |
|||
|
|||
//Alert Variants |
|||
@each $color, $value in $theme-colors { |
|||
.alert-#{$color} { |
|||
color: color-yiq($value); |
|||
background-color: $value; |
|||
border-color: darken($value, 5%); |
|||
} |
|||
|
|||
.alert-default-#{$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)); |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
@each $color, $value in $theme-colors-alt { |
|||
.alert-#{$color} { |
|||
color: color-yiq($value); |
|||
background-color: $value; |
|||
border-color: darken($value, 5%); |
|||
} |
|||
|
|||
.alert-default-#{$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,14 @@ |
|||
// |
|||
// Component: Animation |
|||
// |
|||
|
|||
.animation { |
|||
&__shake { |
|||
animation: shake 1500ms; |
|||
} |
|||
&__wobble { |
|||
animation: wobble 1500ms; |
|||
} |
|||
} |
|||
|
|||
// |
|||
@ -0,0 +1,922 @@ |
|||
// Variables |
|||
// |
|||
// Variables should follow the `$component-state-property-size` formula for |
|||
// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs. |
|||
|
|||
|
|||
// |
|||
// Color system |
|||
// |
|||
|
|||
// stylelint-disable |
|||
$white: #fff !default; |
|||
$gray-100: #f8f9fa !default; |
|||
$gray-200: #e9ecef !default; |
|||
$gray-300: #dee2e6 !default; |
|||
$gray-400: #ced4da !default; |
|||
$gray-500: #adb5bd !default; |
|||
$gray-600: #6c757d !default; |
|||
$gray-700: #495057 !default; |
|||
$gray-800: #343a40 !default; |
|||
$gray-900: #212529 !default; |
|||
$black: #000 !default; |
|||
|
|||
$grays: () !default; |
|||
$grays: map-merge(( |
|||
"100": $gray-100, |
|||
"200": $gray-200, |
|||
"300": $gray-300, |
|||
"400": $gray-400, |
|||
"500": $gray-500, |
|||
"600": $gray-600, |
|||
"700": $gray-700, |
|||
"800": $gray-800, |
|||
"900": $gray-900 |
|||
), $grays); |
|||
|
|||
$blue: #007bff !default; |
|||
$indigo: #6610f2 !default; |
|||
$purple: #6f42c1 !default; |
|||
$pink: #e83e8c !default; |
|||
$red: #dc3545 !default; |
|||
$orange: #fd7e14 !default; |
|||
$yellow: #ffc107 !default; |
|||
$green: #28a745 !default; |
|||
$teal: #20c997 !default; |
|||
$cyan: #17a2b8 !default; |
|||
|
|||
$colors: () !default; |
|||
$colors: map-merge(( |
|||
"blue": $blue, |
|||
"indigo": $indigo, |
|||
"purple": $purple, |
|||
"pink": $pink, |
|||
"red": $red, |
|||
"orange": $orange, |
|||
"yellow": $yellow, |
|||
"green": $green, |
|||
"teal": $teal, |
|||
"cyan": $cyan, |
|||
"white": $white, |
|||
"gray": $gray-600, |
|||
"gray-dark": $gray-800 |
|||
), $colors); |
|||
|
|||
$primary: $blue !default; |
|||
$secondary: $gray-600 !default; |
|||
$success: $green !default; |
|||
$info: $cyan !default; |
|||
$warning: $yellow !default; |
|||
$danger: $red !default; |
|||
$light: $gray-100 !default; |
|||
$dark: $gray-800 !default; |
|||
|
|||
$theme-colors: () !default; |
|||
$theme-colors: map-merge(( |
|||
"primary": $primary, |
|||
"secondary": $secondary, |
|||
"success": $success, |
|||
"info": $info, |
|||
"warning": $warning, |
|||
"danger": $danger, |
|||
"light": $light, |
|||
"dark": $dark |
|||
), $theme-colors); |
|||
// stylelint-enable |
|||
|
|||
// Set a specific jump point for requesting color jumps |
|||
$theme-color-interval: 8% !default; |
|||
|
|||
// The yiq lightness value that determines when the lightness of color changes from "dark" to "light". Acceptable values are between 0 and 255. |
|||
$yiq-contrasted-threshold: 150 !default; |
|||
|
|||
// Customize the light and dark text colors for use in our YIQ color contrast function. |
|||
$yiq-text-dark: #1f2d3d !default; |
|||
$yiq-text-light: $white !default; |
|||
|
|||
// Options |
|||
// |
|||
// Quickly modify global styling by enabling or disabling optional features. |
|||
|
|||
$enable-caret: true !default; |
|||
$enable-rounded: true !default; |
|||
$enable-shadows: true !default; |
|||
$enable-gradients: false !default; |
|||
$enable-transitions: true !default; |
|||
$enable-prefers-reduced-motion-media-query: true !default; |
|||
$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS |
|||
$enable-grid-classes: true !default; |
|||
$enable-pointer-cursor-for-buttons: true !default; |
|||
$enable-print-styles: true !default; |
|||
$enable-responsive-font-sizes: false !default; |
|||
$enable-validation-icons: true !default; |
|||
$enable-deprecation-messages: true !default; |
|||
|
|||
// Characters which are escaped by the escape-svg function |
|||
$escaped-characters: ( |
|||
("<", "%3c"), |
|||
(">", "%3e"), |
|||
("#", "%23"), |
|||
("(", "%28"), |
|||
(")", "%29"), |
|||
) !default; |
|||
|
|||
|
|||
// Spacing |
|||
// |
|||
// Control the default styling of most Bootstrap elements by modifying these |
|||
// variables. Mostly focused on spacing. |
|||
// You can add more entries to the $spacers map, should you need more variation. |
|||
|
|||
// stylelint-disable |
|||
$spacer: 1rem !default; |
|||
$spacers: () !default; |
|||
$spacers: map-merge(( |
|||
0: 0, |
|||
1: ($spacer * .25), |
|||
2: ($spacer * .5), |
|||
3: $spacer, |
|||
4: ($spacer * 1.5), |
|||
5: ($spacer * 3) |
|||
), $spacers); |
|||
|
|||
// This variable affects the `.h-*` and `.w-*` classes. |
|||
$sizes: () !default; |
|||
$sizes: map-merge(( |
|||
25: 25%, |
|||
50: 50%, |
|||
75: 75%, |
|||
100: 100% |
|||
), $sizes); |
|||
// stylelint-enable |
|||
|
|||
// Body |
|||
// |
|||
// Settings for the `<body>` element. |
|||
|
|||
$body-bg: $white !default; |
|||
$body-color: $gray-900 !default; |
|||
|
|||
// Links |
|||
// |
|||
// Style anchor elements. |
|||
|
|||
$link-color: theme-color("primary") !default; |
|||
$link-decoration: none !default; |
|||
$link-hover-color: darken($link-color, 15%) !default; |
|||
$link-hover-decoration: none !default; |
|||
|
|||
// Paragraphs |
|||
// |
|||
// Style p element. |
|||
|
|||
$paragraph-margin-bottom: 1rem !default; |
|||
|
|||
|
|||
// Grid breakpoints |
|||
// |
|||
// Define the minimum dimensions at which your layout will change, |
|||
// adapting to different screen sizes, for use in media queries. |
|||
|
|||
$grid-breakpoints: ( |
|||
xs: 0, |
|||
sm: 576px, |
|||
md: 768px, |
|||
lg: 992px, |
|||
xl: 1200px |
|||
) !default; |
|||
|
|||
@include _assert-ascending($grid-breakpoints, "$grid-breakpoints"); |
|||
@include _assert-starts-at-zero($grid-breakpoints); |
|||
|
|||
|
|||
// Grid containers |
|||
// |
|||
// Define the maximum width of `.container` for different screen sizes. |
|||
|
|||
$container-max-widths: ( |
|||
sm: 540px, |
|||
md: 720px, |
|||
lg: 960px, |
|||
xl: 1140px |
|||
) !default; |
|||
|
|||
@include _assert-ascending($container-max-widths, "$container-max-widths"); |
|||
|
|||
|
|||
// Grid columns |
|||
// |
|||
// Set the number of columns and specify the width of the gutters. |
|||
|
|||
$grid-columns: 12 !default; |
|||
$grid-gutter-width: 15px !default; |
|||
|
|||
// Components |
|||
// |
|||
// Define common padding and border radius sizes and more. |
|||
|
|||
$line-height-lg: 1.5 !default; |
|||
$line-height-sm: 1.5 !default; |
|||
|
|||
$border-width: 1px !default; |
|||
$border-color: $gray-300 !default; |
|||
|
|||
$border-radius: .25rem !default; |
|||
$border-radius-lg: .3rem !default; |
|||
$border-radius-sm: .2rem !default; |
|||
|
|||
$component-active-color: $white !default; |
|||
$component-active-bg: theme-color("primary") !default; |
|||
|
|||
$caret-width: .3em !default; |
|||
|
|||
$transition-base: all .2s ease-in-out !default; |
|||
$transition-fade: opacity .15s linear !default; |
|||
$transition-collapse: height .35s ease !default; |
|||
|
|||
|
|||
// Fonts |
|||
// |
|||
// Font, line-height, and color for body text, headings, and more. |
|||
|
|||
// stylelint-disable value-keyword-case |
|||
$font-family-sans-serif: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default; |
|||
$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default; |
|||
$font-family-base: $font-family-sans-serif !default; |
|||
// stylelint-enable value-keyword-case |
|||
|
|||
$font-size-base: 1rem !default; // Assumes the browser default, typically `16px` |
|||
$font-size-lg: ($font-size-base * 1.25) !default; |
|||
$font-size-sm: ($font-size-base * .875) !default; |
|||
|
|||
$font-weight-light: 300 !default; |
|||
$font-weight-normal: 400 !default; |
|||
$font-weight-bold: 700 !default; |
|||
|
|||
$font-weight-base: $font-weight-normal !default; |
|||
$line-height-base: 1.5 !default; |
|||
|
|||
$h1-font-size: $font-size-base * 2.5 !default; |
|||
$h2-font-size: $font-size-base * 2 !default; |
|||
$h3-font-size: $font-size-base * 1.75 !default; |
|||
$h4-font-size: $font-size-base * 1.5 !default; |
|||
$h5-font-size: $font-size-base * 1.25 !default; |
|||
$h6-font-size: $font-size-base !default; |
|||
|
|||
$headings-margin-bottom: ($spacer * .5) !default; |
|||
$headings-font-family: inherit !default; |
|||
$headings-font-weight: 500 !default; |
|||
$headings-line-height: 1.2 !default; |
|||
$headings-color: inherit !default; |
|||
|
|||
$display1-size: 6rem !default; |
|||
$display2-size: 5.5rem !default; |
|||
$display3-size: 4.5rem !default; |
|||
$display4-size: 3.5rem !default; |
|||
|
|||
$display1-weight: 300 !default; |
|||
$display2-weight: 300 !default; |
|||
$display3-weight: 300 !default; |
|||
$display4-weight: 300 !default; |
|||
$display-line-height: $headings-line-height !default; |
|||
|
|||
$lead-font-size: ($font-size-base * 1.25) !default; |
|||
$lead-font-weight: 300 !default; |
|||
|
|||
$small-font-size: 80% !default; |
|||
|
|||
$text-muted: $gray-600 !default; |
|||
|
|||
$blockquote-small-color: $gray-600 !default; |
|||
$blockquote-font-size: ($font-size-base * 1.25) !default; |
|||
|
|||
$hr-border-color: rgba($black, .1) !default; |
|||
$hr-border-width: $border-width !default; |
|||
|
|||
$mark-padding: .2em !default; |
|||
|
|||
$dt-font-weight: $font-weight-bold !default; |
|||
|
|||
$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default; |
|||
$nested-kbd-font-weight: $font-weight-bold !default; |
|||
|
|||
$list-inline-padding: .5rem !default; |
|||
|
|||
$mark-bg: #fcf8e3 !default; |
|||
|
|||
$hr-margin-y: $spacer !default; |
|||
|
|||
|
|||
// Tables |
|||
// |
|||
// Customizes the `.table` component with basic values, each used across all table variations. |
|||
|
|||
$table-cell-padding: .75rem !default; |
|||
$table-cell-padding-sm: .3rem !default; |
|||
|
|||
$table-bg: transparent !default; |
|||
$table-accent-bg: rgba($black, .05) !default; |
|||
$table-hover-bg: rgba($black, .075) !default; |
|||
$table-active-bg: $table-hover-bg !default; |
|||
|
|||
$table-border-width: $border-width !default; |
|||
$table-border-color: $gray-300 !default; |
|||
|
|||
$table-head-bg: $gray-200 !default; |
|||
$table-head-color: $gray-700 !default; |
|||
|
|||
$table-dark-bg: $gray-900 !default; |
|||
$table-dark-accent-bg: rgba($white, .05) !default; |
|||
$table-dark-hover-bg: rgba($white, .075) !default; |
|||
$table-dark-border-color: lighten($gray-900, 10%) !default; |
|||
$table-dark-color: $body-bg !default; |
|||
|
|||
|
|||
// Buttons + Forms |
|||
// |
|||
// Shared variables that are reassigned to `$input-` and `$btn-` specific variables. |
|||
|
|||
$input-btn-padding-y: .375rem !default; |
|||
$input-btn-padding-x: .75rem !default; |
|||
$input-btn-line-height: $line-height-base !default; |
|||
|
|||
$input-btn-focus-width: .2rem !default; |
|||
$input-btn-focus-color: rgba($component-active-bg, .25) !default; |
|||
$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default; |
|||
|
|||
$input-btn-padding-y-sm: .25rem !default; |
|||
$input-btn-padding-x-sm: .5rem !default; |
|||
$input-btn-line-height-sm: $line-height-sm !default; |
|||
|
|||
$input-btn-padding-y-lg: .5rem !default; |
|||
$input-btn-padding-x-lg: 1rem !default; |
|||
$input-btn-line-height-lg: $line-height-lg !default; |
|||
|
|||
$input-btn-border-width: $border-width !default; |
|||
|
|||
|
|||
// Buttons |
|||
// |
|||
// For each of Bootstrap's buttons, define text, background, and border color. |
|||
|
|||
$btn-padding-y: $input-btn-padding-y !default; |
|||
$btn-padding-x: $input-btn-padding-x !default; |
|||
$btn-line-height: $input-btn-line-height !default; |
|||
|
|||
$btn-padding-y-sm: $input-btn-padding-y-sm !default; |
|||
$btn-padding-x-sm: $input-btn-padding-x-sm !default; |
|||
$btn-line-height-sm: $input-btn-line-height-sm !default; |
|||
|
|||
$btn-padding-y-lg: $input-btn-padding-y-lg !default; |
|||
$btn-padding-x-lg: $input-btn-padding-x-lg !default; |
|||
$btn-line-height-lg: $input-btn-line-height-lg !default; |
|||
|
|||
$btn-border-width: $input-btn-border-width !default; |
|||
|
|||
$btn-font-weight: $font-weight-normal !default; |
|||
$btn-box-shadow: none !default; |
|||
$btn-focus-width: 0 !default; |
|||
$btn-focus-box-shadow: none !default; |
|||
$btn-disabled-opacity: .65 !default; |
|||
$btn-active-box-shadow: none !default; |
|||
|
|||
$btn-link-disabled-color: $gray-600 !default; |
|||
|
|||
$btn-block-spacing-y: .5rem !default; |
|||
|
|||
// Allows for customizing button radius independently from global border radius |
|||
$btn-border-radius: $border-radius !default; |
|||
$btn-border-radius-lg: $border-radius-lg !default; |
|||
$btn-border-radius-sm: $border-radius-sm !default; |
|||
|
|||
$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; |
|||
|
|||
|
|||
// Forms |
|||
|
|||
$input-padding-y: $input-btn-padding-y !default; |
|||
$input-padding-x: $input-btn-padding-x !default; |
|||
$input-line-height: $input-btn-line-height !default; |
|||
|
|||
$input-padding-y-sm: $input-btn-padding-y-sm !default; |
|||
$input-padding-x-sm: $input-btn-padding-x-sm !default; |
|||
$input-line-height-sm: $input-btn-line-height-sm !default; |
|||
|
|||
$input-padding-y-lg: $input-btn-padding-y-lg !default; |
|||
$input-padding-x-lg: $input-btn-padding-x-lg !default; |
|||
$input-line-height-lg: $input-btn-line-height-lg !default; |
|||
|
|||
$input-bg: $white !default; |
|||
$input-disabled-bg: $gray-200 !default; |
|||
|
|||
$input-color: $gray-700 !default; |
|||
$input-border-color: $gray-400 !default; |
|||
$input-border-width: $input-btn-border-width !default; |
|||
$input-box-shadow: inset 0 0 0 rgba($black, 0) !default; |
|||
|
|||
$input-border-radius: $border-radius !default; |
|||
$input-border-radius-lg: $border-radius-lg !default; |
|||
$input-border-radius-sm: $border-radius-sm !default; |
|||
|
|||
$input-focus-bg: $input-bg !default; |
|||
$input-focus-border-color: lighten($component-active-bg, 25%) !default; |
|||
$input-focus-color: $input-color !default; |
|||
$input-focus-width: 0 !default; |
|||
$input-focus-box-shadow: none !default; |
|||
|
|||
$input-placeholder-color: lighten($gray-600, 15%) !default; |
|||
|
|||
$input-height-border: $input-border-width * 2 !default; |
|||
|
|||
$input-height-inner: ($font-size-base * $input-btn-line-height) + ($input-btn-padding-y * 2) !default; |
|||
$input-height-inner-half: calc(#{$input-line-height * .5em} + #{$input-padding-y}) !default; |
|||
$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y * .5}) !default; |
|||
|
|||
$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default; |
|||
|
|||
$input-height-inner-sm: ($font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default; |
|||
$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default; |
|||
|
|||
$input-height-inner-lg: ($font-size-lg * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default; |
|||
$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default; |
|||
|
|||
$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; |
|||
|
|||
$form-text-margin-top: .25rem !default; |
|||
|
|||
$form-check-input-gutter: 1.25rem !default; |
|||
$form-check-input-margin-y: .3rem !default; |
|||
$form-check-input-margin-x: .25rem !default; |
|||
|
|||
$form-check-inline-margin-x: .75rem !default; |
|||
$form-check-inline-input-margin-x: .3125rem !default; |
|||
|
|||
$form-group-margin-bottom: 1rem !default; |
|||
|
|||
$input-group-addon-color: $input-color !default; |
|||
$input-group-addon-bg: $gray-200 !default; |
|||
$input-group-addon-border-color: $input-border-color !default; |
|||
|
|||
$custom-control-gutter: .5rem !default; |
|||
$custom-control-spacer-x: 1rem !default; |
|||
|
|||
$custom-control-indicator-size: 1rem !default; |
|||
$custom-control-indicator-bg: $gray-300 !default; |
|||
$custom-control-indicator-bg-size: 50% 50% !default; |
|||
$custom-control-indicator-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default; |
|||
|
|||
$custom-control-indicator-disabled-bg: $gray-200 !default; |
|||
$custom-control-label-disabled-color: $gray-600 !default; |
|||
|
|||
$custom-control-indicator-checked-color: $component-active-color !default; |
|||
$custom-control-indicator-checked-bg: $component-active-bg !default; |
|||
$custom-control-indicator-checked-disabled-bg: rgba(theme-color("primary"), .5) !default; |
|||
$custom-control-indicator-checked-box-shadow: none !default; |
|||
|
|||
$custom-control-indicator-focus-box-shadow: 0 0 0 1px $body-bg, $input-btn-focus-box-shadow !default; |
|||
|
|||
$custom-control-indicator-active-color: $component-active-color !default; |
|||
$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default; |
|||
$custom-control-indicator-active-box-shadow: none !default; |
|||
|
|||
$custom-checkbox-indicator-border-radius: $border-radius !default; |
|||
$custom-checkbox-indicator-icon-checked: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"), "#", "%23") !default; |
|||
|
|||
$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default; |
|||
$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default; |
|||
$custom-checkbox-indicator-icon-indeterminate: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3E%3C/svg%3E"), "#", "%23") !default; |
|||
$custom-checkbox-indicator-indeterminate-box-shadow: none !default; |
|||
|
|||
$custom-radio-indicator-border-radius: 50% !default; |
|||
$custom-radio-indicator-icon-checked: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3E%3C/svg%3E"), "#", "%23") !default; |
|||
|
|||
$custom-select-padding-y: .375rem !default; |
|||
$custom-select-padding-x: .75rem !default; |
|||
$custom-select-height: $input-height !default; |
|||
$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator |
|||
$custom-select-line-height: $input-btn-line-height !default; |
|||
$custom-select-color: $input-color !default; |
|||
$custom-select-disabled-color: $gray-600 !default; |
|||
$custom-select-bg: $white !default; |
|||
$custom-select-disabled-bg: $gray-200 !default; |
|||
$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions |
|||
$custom-select-indicator-color: $gray-800 !default; |
|||
$custom-select-indicator: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'><path fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/></svg>") !default; |
|||
$custom-select-background: escape-svg($custom-select-indicator) right $custom-select-padding-x center / $custom-select-bg-size no-repeat !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon) |
|||
$custom-select-border-width: $input-btn-border-width !default; |
|||
$custom-select-border-color: $input-border-color !default; |
|||
$custom-select-border-radius: $border-radius !default; |
|||
|
|||
$custom-select-focus-border-color: $input-focus-border-color !default; |
|||
$custom-select-focus-box-shadow: none !default; |
|||
|
|||
$custom-select-font-size-sm: 75% !default; |
|||
$custom-select-height-sm: $input-height-sm !default; |
|||
|
|||
$custom-select-font-size-lg: 125% !default; |
|||
$custom-select-height-lg: $input-height-lg !default; |
|||
|
|||
$custom-file-height: $input-height !default; |
|||
$custom-file-focus-border-color: $input-focus-border-color !default; |
|||
$custom-file-focus-box-shadow: $custom-select-focus-box-shadow !default; |
|||
|
|||
$custom-file-padding-y: $input-btn-padding-y !default; |
|||
$custom-file-padding-x: $input-btn-padding-x !default; |
|||
$custom-file-line-height: $input-btn-line-height !default; |
|||
$custom-file-color: $input-color !default; |
|||
$custom-file-bg: $input-bg !default; |
|||
$custom-file-border-width: $input-btn-border-width !default; |
|||
$custom-file-border-color: $input-border-color !default; |
|||
$custom-file-border-radius: $input-border-radius !default; |
|||
$custom-file-box-shadow: $custom-select-focus-box-shadow !default; |
|||
$custom-file-button-color: $custom-file-color !default; |
|||
$custom-file-button-bg: $input-group-addon-bg !default; |
|||
$custom-file-text: ( |
|||
en: "Browse" |
|||
) !default; |
|||
|
|||
$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-btn-focus-box-shadow !default; |
|||
|
|||
|
|||
// Form validation |
|||
$form-feedback-margin-top: $form-text-margin-top !default; |
|||
$form-feedback-font-size: $small-font-size !default; |
|||
$form-feedback-valid-color: theme-color("success") !default; |
|||
$form-feedback-invalid-color: theme-color("danger") !default; |
|||
|
|||
|
|||
// Dropdowns |
|||
// |
|||
// Dropdown menu container and contents. |
|||
|
|||
$dropdown-min-width: 10rem !default; |
|||
$dropdown-padding-y: .5rem !default; |
|||
$dropdown-spacer: .125rem !default; |
|||
$dropdown-bg: $white !default; |
|||
$dropdown-border-color: rgba($black, .15) !default; |
|||
$dropdown-border-radius: $border-radius !default; |
|||
$dropdown-border-width: $border-width !default; |
|||
$dropdown-divider-bg: $gray-200 !default; |
|||
$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default; |
|||
|
|||
$dropdown-link-color: $gray-900 !default; |
|||
$dropdown-link-hover-color: darken($gray-900, 5%) !default; |
|||
$dropdown-link-hover-bg: $gray-100 !default; |
|||
|
|||
$dropdown-link-active-color: $component-active-color !default; |
|||
$dropdown-link-active-bg: $component-active-bg !default; |
|||
|
|||
$dropdown-link-disabled-color: $gray-600 !default; |
|||
|
|||
$dropdown-item-padding-y: .25rem !default; |
|||
$dropdown-item-padding-x: 1rem !default; |
|||
|
|||
$dropdown-header-color: $gray-600 !default; |
|||
|
|||
|
|||
// Z-index master list |
|||
// |
|||
// Warning: Avoid customizing these values. They're used for a bird's eye view |
|||
// of components dependent on the z-axis and are designed to all work together. |
|||
|
|||
$zindex-dropdown: 1000 !default; |
|||
$zindex-sticky: 1020 !default; |
|||
$zindex-fixed: 1030 !default; |
|||
$zindex-modal-backdrop: 1040 !default; |
|||
$zindex-modal: 1050 !default; |
|||
$zindex-popover: 1060 !default; |
|||
$zindex-tooltip: 1070 !default; |
|||
|
|||
// Navs |
|||
|
|||
$nav-link-padding-y: .5rem !default; |
|||
$nav-link-padding-x: 1rem !default; |
|||
$nav-link-disabled-color: $gray-600 !default; |
|||
|
|||
$nav-tabs-border-color: $gray-300 !default; |
|||
$nav-tabs-border-width: $border-width !default; |
|||
$nav-tabs-border-radius: $border-radius !default; |
|||
$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default; |
|||
$nav-tabs-link-active-color: $gray-700 !default; |
|||
$nav-tabs-link-active-bg: $body-bg !default; |
|||
$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default; |
|||
|
|||
$nav-pills-border-radius: $border-radius !default; |
|||
$nav-pills-link-active-color: $component-active-color !default; |
|||
$nav-pills-link-active-bg: $component-active-bg !default; |
|||
|
|||
// Navbar |
|||
|
|||
$navbar-padding-y: ($spacer * .5) !default; |
|||
$navbar-padding-x: ($spacer * .5) !default; |
|||
|
|||
$navbar-nav-link-padding-x: 1rem !default; |
|||
|
|||
$navbar-brand-font-size: $font-size-lg !default; |
|||
// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link |
|||
$nav-link-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default; |
|||
$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default; |
|||
$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default; |
|||
|
|||
$navbar-toggler-padding-y: .25rem !default; |
|||
$navbar-toggler-padding-x: .75rem !default; |
|||
$navbar-toggler-font-size: $font-size-lg !default; |
|||
$navbar-toggler-border-radius: $btn-border-radius !default; |
|||
|
|||
$navbar-dark-color: rgba($white, .75) !default; |
|||
$navbar-dark-hover-color: rgba($white, 1) !default; |
|||
$navbar-dark-active-color: $white !default; |
|||
$navbar-dark-disabled-color: rgba($white, .25) !default; |
|||
$navbar-dark-toggler-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default; |
|||
$navbar-dark-toggler-border-color: rgba($white, .1) !default; |
|||
|
|||
$navbar-light-color: rgba($black, .5) !default; |
|||
$navbar-light-hover-color: rgba($black, .7) !default; |
|||
$navbar-light-active-color: rgba($black, .9) !default; |
|||
$navbar-light-disabled-color: rgba($black, .3) !default; |
|||
$navbar-light-toggler-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default; |
|||
$navbar-light-toggler-border-color: rgba($black, .1) !default; |
|||
|
|||
// Pagination |
|||
|
|||
$pagination-padding-y: .5rem !default; |
|||
$pagination-padding-x: .75rem !default; |
|||
$pagination-padding-y-sm: .25rem !default; |
|||
$pagination-padding-x-sm: .5rem !default; |
|||
$pagination-padding-y-lg: .75rem !default; |
|||
$pagination-padding-x-lg: 1.5rem !default; |
|||
$pagination-line-height: 1.25 !default; |
|||
|
|||
$pagination-color: $link-color !default; |
|||
$pagination-bg: $white !default; |
|||
$pagination-border-width: $border-width !default; |
|||
$pagination-border-color: $gray-300 !default; |
|||
|
|||
$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default; |
|||
|
|||
$pagination-hover-color: $link-hover-color !default; |
|||
$pagination-hover-bg: $gray-200 !default; |
|||
$pagination-hover-border-color: $gray-300 !default; |
|||
|
|||
$pagination-active-color: $component-active-color !default; |
|||
$pagination-active-bg: $component-active-bg !default; |
|||
$pagination-active-border-color: $pagination-active-bg !default; |
|||
|
|||
$pagination-disabled-color: $gray-600 !default; |
|||
$pagination-disabled-bg: $white !default; |
|||
$pagination-disabled-border-color: $gray-300 !default; |
|||
|
|||
|
|||
// Jumbotron |
|||
|
|||
$jumbotron-padding: 2rem !default; |
|||
$jumbotron-bg: $gray-200 !default; |
|||
|
|||
|
|||
// Cards |
|||
|
|||
$card-spacer-y: .75rem !default; |
|||
$card-spacer-x: 1.25rem !default; |
|||
$card-border-width: 0 !default; //$border-width !default; |
|||
$card-border-radius: $border-radius !default; |
|||
$card-border-color: rgba($black, .125) !default; |
|||
$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default; |
|||
$card-cap-bg: rgba($black, .03) !default; |
|||
$card-bg: $white !default; |
|||
|
|||
$card-img-overlay-padding: 1.25rem !default; |
|||
|
|||
$card-group-margin: ($grid-gutter-width * .5) !default; |
|||
$card-deck-margin: $card-group-margin !default; |
|||
|
|||
$card-columns-count: 3 !default; |
|||
$card-columns-gap: 1.25rem !default; |
|||
$card-columns-margin: $card-spacer-y !default; |
|||
|
|||
|
|||
// Tooltips |
|||
|
|||
$tooltip-font-size: $font-size-sm !default; |
|||
$tooltip-max-width: 200px !default; |
|||
$tooltip-color: $white !default; |
|||
$tooltip-bg: $black !default; |
|||
$tooltip-border-radius: $border-radius !default; |
|||
$tooltip-opacity: .9 !default; |
|||
$tooltip-padding-y: .25rem !default; |
|||
$tooltip-padding-x: .5rem !default; |
|||
$tooltip-margin: 0 !default; |
|||
|
|||
$tooltip-arrow-width: .8rem !default; |
|||
$tooltip-arrow-height: .4rem !default; |
|||
$tooltip-arrow-color: $tooltip-bg !default; |
|||
|
|||
// Form tooltips must come after regular tooltips |
|||
$form-feedback-tooltip-padding-y: $tooltip-padding-y !default; |
|||
$form-feedback-tooltip-padding-x: $tooltip-padding-x !default; |
|||
$form-feedback-tooltip-font-size: $tooltip-font-size !default; |
|||
$form-feedback-tooltip-line-height: $line-height-base !default; |
|||
$form-feedback-tooltip-opacity: $tooltip-opacity !default; |
|||
$form-feedback-tooltip-border-radius: $tooltip-border-radius !default; |
|||
|
|||
// Popovers |
|||
|
|||
$popover-font-size: $font-size-sm !default; |
|||
$popover-bg: $white !default; |
|||
$popover-max-width: 276px !default; |
|||
$popover-border-width: $border-width !default; |
|||
$popover-border-color: rgba($black, .2) !default; |
|||
$popover-border-radius: $border-radius-lg !default; |
|||
$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default; |
|||
|
|||
$popover-header-bg: darken($popover-bg, 3%) !default; |
|||
$popover-header-color: $headings-color !default; |
|||
$popover-header-padding-y: .5rem !default; |
|||
$popover-header-padding-x: .75rem !default; |
|||
|
|||
$popover-body-color: $body-color !default; |
|||
$popover-body-padding-y: $popover-header-padding-y !default; |
|||
$popover-body-padding-x: $popover-header-padding-x !default; |
|||
|
|||
$popover-arrow-width: 1rem !default; |
|||
$popover-arrow-height: .5rem !default; |
|||
$popover-arrow-color: $popover-bg !default; |
|||
|
|||
$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default; |
|||
|
|||
|
|||
// Badges |
|||
|
|||
$badge-font-size: 75% !default; |
|||
$badge-font-weight: $font-weight-bold !default; |
|||
$badge-padding-y: .25em !default; |
|||
$badge-padding-x: .4em !default; |
|||
$badge-border-radius: $border-radius !default; |
|||
|
|||
$badge-pill-padding-x: .6em !default; |
|||
// Use a higher than normal value to ensure completely rounded edges when |
|||
// customizing padding or font-size on labels. |
|||
$badge-pill-border-radius: 10rem !default; |
|||
|
|||
|
|||
// Modals |
|||
|
|||
// Padding applied to the modal body |
|||
$modal-inner-padding: 1rem !default; |
|||
|
|||
$modal-dialog-margin: .5rem !default; |
|||
$modal-dialog-margin-y-sm-up: 1.75rem !default; |
|||
|
|||
$modal-title-line-height: $line-height-base !default; |
|||
|
|||
$modal-content-bg: $white !default; |
|||
$modal-content-border-color: rgba($black, .2) !default; |
|||
$modal-content-border-width: $border-width !default; |
|||
$modal-content-border-radius: $border-radius-lg !default; |
|||
$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default; |
|||
$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default; |
|||
|
|||
$modal-backdrop-bg: $black !default; |
|||
$modal-backdrop-opacity: .5 !default; |
|||
$modal-header-border-color: $gray-200 !default; |
|||
$modal-footer-border-color: $modal-header-border-color !default; |
|||
$modal-header-border-width: $modal-content-border-width !default; |
|||
$modal-footer-border-width: $modal-header-border-width !default; |
|||
$modal-header-padding: 1rem !default; |
|||
|
|||
$modal-lg: 800px !default; |
|||
$modal-md: 500px !default; |
|||
$modal-sm: 300px !default; |
|||
|
|||
$modal-transition: transform .3s ease-out !default; |
|||
|
|||
|
|||
// Alerts |
|||
// |
|||
// Define alert colors, border radius, and padding. |
|||
|
|||
$alert-padding-y: .75rem !default; |
|||
$alert-padding-x: 1.25rem !default; |
|||
$alert-margin-bottom: 1rem !default; |
|||
$alert-border-radius: $border-radius !default; |
|||
$alert-link-font-weight: $font-weight-bold !default; |
|||
$alert-border-width: $border-width !default; |
|||
|
|||
$alert-bg-level: -10 !default; |
|||
$alert-border-level: -9 !default; |
|||
$alert-color-level: 6 !default; |
|||
|
|||
|
|||
// Progress bars |
|||
|
|||
$progress-height: 1rem !default; |
|||
$progress-font-size: ($font-size-base * .75) !default; |
|||
$progress-bg: $gray-200 !default; |
|||
$progress-border-radius: $border-radius !default; |
|||
$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default; |
|||
$progress-bar-color: $white !default; |
|||
$progress-bar-bg: theme-color("primary") !default; |
|||
$progress-bar-animation-timing: 1s linear infinite !default; |
|||
$progress-bar-transition: width .6s ease !default; |
|||
|
|||
// List group |
|||
|
|||
$list-group-bg: $white !default; |
|||
$list-group-border-color: rgba($black, .125) !default; |
|||
$list-group-border-width: $border-width !default; |
|||
$list-group-border-radius: $border-radius !default; |
|||
|
|||
$list-group-item-padding-y: .75rem !default; |
|||
$list-group-item-padding-x: 1.25rem !default; |
|||
|
|||
$list-group-hover-bg: $gray-100 !default; |
|||
$list-group-active-color: $component-active-color !default; |
|||
$list-group-active-bg: $component-active-bg !default; |
|||
$list-group-active-border-color: $list-group-active-bg !default; |
|||
|
|||
$list-group-disabled-color: $gray-600 !default; |
|||
$list-group-disabled-bg: $list-group-bg !default; |
|||
|
|||
$list-group-action-color: $gray-700 !default; |
|||
$list-group-action-hover-color: $list-group-action-color !default; |
|||
|
|||
$list-group-action-active-color: $body-color !default; |
|||
$list-group-action-active-bg: $gray-200 !default; |
|||
|
|||
|
|||
// Image thumbnails |
|||
|
|||
$thumbnail-padding: .25rem !default; |
|||
$thumbnail-bg: $body-bg !default; |
|||
$thumbnail-border-width: $border-width !default; |
|||
$thumbnail-border-color: $gray-300 !default; |
|||
$thumbnail-border-radius: $border-radius !default; |
|||
$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default; |
|||
|
|||
|
|||
// Figures |
|||
|
|||
$figure-caption-font-size: 90% !default; |
|||
$figure-caption-color: $gray-600 !default; |
|||
|
|||
|
|||
// Breadcrumbs |
|||
|
|||
$breadcrumb-padding-y: .75rem !default; |
|||
$breadcrumb-padding-x: 1rem !default; |
|||
$breadcrumb-item-padding: .5rem !default; |
|||
|
|||
$breadcrumb-margin-bottom: 1rem !default; |
|||
|
|||
$breadcrumb-bg: $gray-200 !default; |
|||
$breadcrumb-divider-color: $gray-600 !default; |
|||
$breadcrumb-active-color: $gray-600 !default; |
|||
$breadcrumb-divider: "/" !default; |
|||
|
|||
|
|||
// Carousel |
|||
|
|||
$carousel-control-color: $white !default; |
|||
$carousel-control-width: 15% !default; |
|||
$carousel-control-opacity: .5 !default; |
|||
|
|||
$carousel-indicator-width: 30px !default; |
|||
$carousel-indicator-height: 3px !default; |
|||
$carousel-indicator-spacer: 3px !default; |
|||
$carousel-indicator-active-bg: $white !default; |
|||
|
|||
$carousel-caption-width: 70% !default; |
|||
$carousel-caption-color: $white !default; |
|||
|
|||
$carousel-control-icon-width: 20px !default; |
|||
|
|||
$carousel-control-prev-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"), "#", "%23") !default; |
|||
$carousel-control-next-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"), "#", "%23") !default; |
|||
|
|||
$carousel-transition: transform .6s ease !default; |
|||
|
|||
|
|||
// Close |
|||
|
|||
$close-font-size: $font-size-base * 1.5 !default; |
|||
$close-font-weight: $font-weight-bold !default; |
|||
$close-color: $black !default; |
|||
$close-text-shadow: 0 1px 0 $white !default; |
|||
|
|||
// Code |
|||
|
|||
$code-font-size: 87.5% !default; |
|||
$code-color: $pink !default; |
|||
|
|||
$kbd-padding-y: .2rem !default; |
|||
$kbd-padding-x: .4rem !default; |
|||
$kbd-font-size: $code-font-size !default; |
|||
$kbd-color: $white !default; |
|||
$kbd-bg: $gray-900 !default; |
|||
|
|||
$pre-color: $gray-900 !default; |
|||
$pre-scrollable-max-height: 340px !default; |
|||
|
|||
|
|||
// Printing |
|||
$print-page-size: a3 !default; |
|||
$print-body-min-width: map-get($grid-breakpoints, "lg") !default; |
|||
@ -0,0 +1,106 @@ |
|||
// |
|||
// Component: Brand |
|||
// |
|||
|
|||
.brand-link { |
|||
$brand-link-padding-y: $navbar-brand-padding-y + $navbar-padding-y; |
|||
display: block; |
|||
font-size: $navbar-brand-font-size; |
|||
line-height: $line-height-lg; |
|||
padding: $brand-link-padding-y $sidebar-padding-x; |
|||
transition: width $transition-speed $transition-fn; |
|||
white-space: nowrap; |
|||
|
|||
&:hover { |
|||
color: $white; |
|||
text-decoration: none; |
|||
} |
|||
|
|||
.text-sm & { |
|||
font-size: inherit; |
|||
} |
|||
|
|||
[class*="sidebar-dark"] & { |
|||
border-bottom: 1px solid lighten($dark, 10%); |
|||
|
|||
&, |
|||
.pushmenu { |
|||
color: rgba($white, .8); |
|||
|
|||
&:hover { |
|||
color: $white; |
|||
} |
|||
} |
|||
} |
|||
|
|||
[class*="sidebar-light"] & { |
|||
border-bottom: 1px solid $gray-300; |
|||
|
|||
&, |
|||
.pushmenu { |
|||
color: rgba($black, .8); |
|||
|
|||
&:hover { |
|||
color: $black; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.pushmenu { |
|||
margin-right: $sidebar-padding-x; |
|||
font-size: $font-size-base; |
|||
} |
|||
|
|||
.brand-link { |
|||
padding: 0; |
|||
border-bottom: none; |
|||
} |
|||
|
|||
.brand-image { |
|||
float: left; |
|||
line-height: .8; |
|||
margin-left: .8rem; |
|||
margin-right: .5rem; |
|||
margin-top: -3px; |
|||
max-height: 33px; |
|||
width: auto; |
|||
} |
|||
|
|||
.brand-image-xs { |
|||
float: left; |
|||
line-height: .8; |
|||
margin-top: -.1rem; |
|||
max-height: 33px; |
|||
width: auto; |
|||
} |
|||
|
|||
.brand-image-xl { |
|||
line-height: .8; |
|||
max-height: 40px; |
|||
width: auto; |
|||
|
|||
&.single { |
|||
margin-top: -.3rem; |
|||
} |
|||
} |
|||
|
|||
&.text-sm, |
|||
.text-sm & { |
|||
.brand-image { |
|||
height: 29px; |
|||
margin-bottom: -.25rem; |
|||
margin-left: .95rem; |
|||
margin-top: -.25rem; |
|||
} |
|||
|
|||
.brand-image-xs { |
|||
margin-top: -.2rem; |
|||
max-height: 29px; |
|||
} |
|||
|
|||
.brand-image-xl { |
|||
margin-top: -.225rem; |
|||
max-height: 38px; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,179 @@ |
|||
// |
|||
// Component: Button |
|||
// |
|||
|
|||
.btn { |
|||
&.disabled, |
|||
&:disabled { |
|||
cursor: not-allowed; |
|||
} |
|||
|
|||
// Flat buttons |
|||
&.btn-flat { |
|||
@include border-radius(0); |
|||
border-width: 1px; |
|||
box-shadow: none; |
|||
} |
|||
|
|||
// input file btn |
|||
&.btn-file { |
|||
overflow: hidden; |
|||
position: relative; |
|||
|
|||
> input[type="file"] { |
|||
background-color: $white; |
|||
cursor: inherit; |
|||
display: block; |
|||
font-size: 100px; |
|||
min-height: 100%; |
|||
min-width: 100%; |
|||
opacity: 0; |
|||
outline: none; |
|||
position: absolute; |
|||
right: 0; |
|||
text-align: right; |
|||
top: 0; |
|||
} |
|||
} |
|||
|
|||
.text-sm & { |
|||
font-size: $font-size-sm !important; |
|||
} |
|||
} |
|||
|
|||
// Button color variations |
|||
.btn-default { |
|||
background-color: $button-default-background-color; |
|||
border-color: $button-default-border-color; |
|||
color: $button-default-color; |
|||
|
|||
&:hover, |
|||
&:active, |
|||
&.hover { |
|||
background-color: darken($button-default-background-color, 5%); |
|||
color: darken($button-default-color, 10%); |
|||
} |
|||
|
|||
&.disabled, |
|||
&:disabled { |
|||
color: $button-default-color; |
|||
background-color: $button-default-background-color; |
|||
} |
|||
} |
|||
|
|||
.btn-outline-light { |
|||
color: darken($light, 20%); |
|||
border-color: darken($light, 20%); |
|||
|
|||
&.disabled, |
|||
&:disabled { |
|||
color: darken($light, 20%); |
|||
border-color: darken($light, 20%); |
|||
} |
|||
} |
|||
|
|||
// Application buttons |
|||
.btn-app { |
|||
@include border-radius(3px); |
|||
background-color: $button-default-background-color; |
|||
border: 1px solid $button-default-border-color; |
|||
color: $gray-600; |
|||
font-size: 12px; |
|||
height: 60px; |
|||
margin: 0 0 10px 10px; |
|||
min-width: 80px; |
|||
padding: 15px 5px; |
|||
position: relative; |
|||
text-align: center; |
|||
|
|||
// Icons within the btn |
|||
> .fa, |
|||
> .fas, |
|||
> .far, |
|||
> .fab, |
|||
> .fal, |
|||
> .fad, |
|||
> .svg-inline--fa, |
|||
> .ion { |
|||
display: block; |
|||
font-size: 20px; |
|||
} |
|||
|
|||
> .svg-inline--fa { |
|||
margin: 0 auto; |
|||
} |
|||
|
|||
&:hover { |
|||
background-color: $button-default-background-color; |
|||
border-color: darken($button-default-border-color, 20%); |
|||
color: $button-default-color; |
|||
} |
|||
|
|||
&:active, |
|||
&:focus { |
|||
@include box-shadow(inset 0 3px 5px rgba($black, .125)); |
|||
} |
|||
|
|||
// The badge |
|||
> .badge { |
|||
font-size: 10px; |
|||
font-weight: 400; |
|||
position: absolute; |
|||
right: -10px; |
|||
top: -3px; |
|||
} |
|||
} |
|||
|
|||
// Extra Button Size |
|||
|
|||
.btn-xs { |
|||
@include button-size($button-padding-y-xs, $button-padding-x-xs, $button-font-size-xs, $button-line-height-xs, $button-border-radius-xs); |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.btn-default, |
|||
.btn-app { |
|||
background-color: lighten($dark, 2.5%); |
|||
color: $white; |
|||
border-color: $gray-600; |
|||
|
|||
&:hover, |
|||
&:focus { |
|||
background-color: lighten($dark, 5%); |
|||
color: $gray-300; |
|||
border-color: lighten($gray-600, 2.5%); |
|||
} |
|||
} |
|||
.btn-light { |
|||
background-color: lighten($dark, 7.5%); |
|||
color: $white; |
|||
border-color: $gray-600; |
|||
|
|||
&:hover, |
|||
&:focus { |
|||
background-color: lighten($dark, 10%); |
|||
color: $gray-300; |
|||
border-color: lighten($gray-600, 5%); |
|||
} |
|||
} |
|||
|
|||
@each $color, $value in $theme-colors-alt { |
|||
.btn-#{$color} { |
|||
@if $color == dark { |
|||
@include button-variant(darken($value, 5%), lighten($value, 10%)); |
|||
} @else { |
|||
@include button-variant($value, $value); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@each $color, $value in $theme-colors-alt { |
|||
.btn-outline-#{$color} { |
|||
@if $color == dark { |
|||
@include button-outline-variant(darken($value, 20%)); |
|||
} @else { |
|||
@include button-outline-variant($value); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,73 @@ |
|||
// |
|||
// Component: Callout |
|||
// |
|||
|
|||
// Base styles (regardless of theme) |
|||
.callout { |
|||
@if $enable-rounded { |
|||
@include border-radius($border-radius); |
|||
} |
|||
|
|||
@if $enable-shadows { |
|||
box-shadow: map-get($elevations, 1); |
|||
} @else { |
|||
border: 1px solid $gray-300; |
|||
} |
|||
|
|||
background-color: $white; |
|||
border-left: 5px solid $gray-200; |
|||
margin-bottom: map-get($spacers, 3); |
|||
padding: 1rem; |
|||
|
|||
a { |
|||
color: $gray-700; |
|||
text-decoration: underline; |
|||
|
|||
&:hover { |
|||
color: $gray-200; |
|||
} |
|||
} |
|||
|
|||
p:last-child { |
|||
margin-bottom: 0; |
|||
} |
|||
|
|||
// Themes for different contexts |
|||
&.callout-danger { |
|||
border-left-color: darken(theme-color("danger"), 10%); |
|||
} |
|||
|
|||
&.callout-warning { |
|||
border-left-color: darken(theme-color("warning"), 10%); |
|||
} |
|||
|
|||
&.callout-info { |
|||
border-left-color: darken(theme-color("info"), 10%); |
|||
} |
|||
|
|||
&.callout-success { |
|||
border-left-color: darken(theme-color("success"), 10%); |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.callout { |
|||
background-color: lighten($dark, 5%); |
|||
|
|||
&.callout-danger { |
|||
border-left-color: lighten($danger-alt, 10%); |
|||
} |
|||
|
|||
&.callout-warning { |
|||
border-left-color: lighten($warning-alt, 10%); |
|||
} |
|||
|
|||
&.callout-info { |
|||
border-left-color: lighten($info-alt, 10%); |
|||
} |
|||
|
|||
&.callout-success { |
|||
border-left-color: lighten($success-alt, 10%); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,548 @@ |
|||
// |
|||
// Component: Cards |
|||
// |
|||
|
|||
// Color variants |
|||
@each $name, $color in $theme-colors { |
|||
@include cards-variant($name, $color); |
|||
} |
|||
|
|||
@each $name, $color in $colors { |
|||
@include cards-variant($name, $color); |
|||
} |
|||
|
|||
.card { |
|||
@include box-shadow($card-shadow); |
|||
margin-bottom: map-get($spacers, 3); |
|||
|
|||
&.bg-dark { |
|||
.card-header { |
|||
border-color: $card-dark-border-color; |
|||
} |
|||
|
|||
&, |
|||
.card-body { |
|||
color: $white; |
|||
} |
|||
} |
|||
|
|||
&.maximized-card { |
|||
height: 100% !important; |
|||
left: 0; |
|||
max-height: 100% !important; |
|||
max-width: 100% !important; |
|||
position: fixed; |
|||
top: 0; |
|||
width: 100% !important; |
|||
z-index: $zindex-modal-backdrop; |
|||
|
|||
&.was-collapsed .card-body { |
|||
display: block !important; |
|||
} |
|||
|
|||
.card-body { |
|||
overflow: auto; |
|||
} |
|||
|
|||
[data-card-widgett="collapse"] { |
|||
display: none; |
|||
} |
|||
|
|||
.card-header, |
|||
.card-footer { |
|||
@include border-radius(0 !important); |
|||
} |
|||
} |
|||
|
|||
// collapsed mode |
|||
&.collapsed-card { |
|||
.card-body, |
|||
.card-footer { |
|||
display: none; |
|||
} |
|||
} |
|||
|
|||
.nav.flex-column:not(.nav-sidebar) { |
|||
> li { |
|||
border-bottom: 1px solid $card-border-color; |
|||
margin: 0; |
|||
|
|||
&:last-of-type { |
|||
border-bottom: 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// fixed height to 300px |
|||
&.height-control { |
|||
.card-body { |
|||
max-height: 300px; |
|||
overflow: auto; |
|||
} |
|||
} |
|||
|
|||
.border-right { |
|||
border-right: 1px solid $card-border-color; |
|||
} |
|||
|
|||
.border-left { |
|||
border-left: 1px solid $card-border-color; |
|||
} |
|||
|
|||
&.card-tabs { |
|||
&:not(.card-outline) { |
|||
> .card-header { |
|||
border-bottom: 0; |
|||
|
|||
.nav-item { |
|||
&:first-child .nav-link { |
|||
border-left-color: transparent; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
&.card-outline { |
|||
.nav-item { |
|||
border-bottom: 0; |
|||
|
|||
&:first-child .nav-link { |
|||
border-left: 0; |
|||
margin-left: 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.card-tools { |
|||
margin: .3rem .5rem; |
|||
} |
|||
|
|||
&:not(.expanding-card).collapsed-card { |
|||
.card-header { |
|||
border-bottom: 0; |
|||
|
|||
.nav-tabs { |
|||
border-bottom: 0; |
|||
|
|||
.nav-item { |
|||
margin-bottom: 0; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
&.expanding-card { |
|||
.card-header { |
|||
.nav-tabs { |
|||
.nav-item { |
|||
margin-bottom: -1px; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
&.card-outline-tabs { |
|||
border-top: 0; |
|||
|
|||
.card-header { |
|||
.nav-item { |
|||
&:first-child .nav-link { |
|||
border-left: 0; |
|||
margin-left: 0; |
|||
} |
|||
} |
|||
|
|||
a { |
|||
border-top: 3px solid transparent; |
|||
|
|||
&:hover { |
|||
border-top: 3px solid $nav-tabs-border-color; |
|||
} |
|||
|
|||
&.active { |
|||
&:hover { |
|||
margin-top: 0; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.card-tools { |
|||
margin: .5rem .5rem .3rem; |
|||
} |
|||
|
|||
&:not(.expanding-card).collapsed-card .card-header { |
|||
border-bottom: 0; |
|||
|
|||
.nav-tabs { |
|||
border-bottom: 0; |
|||
|
|||
.nav-item { |
|||
margin-bottom: 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
&.expanding-card { |
|||
.card-header { |
|||
.nav-tabs { |
|||
.nav-item { |
|||
margin-bottom: -1px; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
// Maximized Card Body Scroll fix |
|||
html.maximized-card { |
|||
overflow: hidden; |
|||
} |
|||
|
|||
// Add clearfix to header, body and footer |
|||
.card-header, |
|||
.card-body, |
|||
.card-footer { |
|||
@include clearfix (); |
|||
} |
|||
|
|||
// Box header |
|||
.card-header { |
|||
background-color: transparent; |
|||
border-bottom: 1px solid $card-border-color; |
|||
padding: (($card-spacer-y * .5) * 2) $card-spacer-x; |
|||
position: relative; |
|||
|
|||
@if $enable-rounded { |
|||
@include border-top-radius($border-radius); |
|||
} |
|||
|
|||
.collapsed-card & { |
|||
border-bottom: 0; |
|||
} |
|||
|
|||
> .card-tools { |
|||
float: right; |
|||
margin-right: -$card-spacer-x * .5; |
|||
|
|||
.input-group, |
|||
.nav, |
|||
.pagination { |
|||
margin-bottom: -$card-spacer-y * .4; |
|||
margin-top: -$card-spacer-y * .4; |
|||
} |
|||
|
|||
[data-toggle="tooltip"] { |
|||
position: relative; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.card-title { |
|||
float: left; |
|||
font-size: $card-title-font-size; |
|||
font-weight: $card-title-font-weight; |
|||
margin: 0; |
|||
} |
|||
|
|||
.card-text { |
|||
clear: both; |
|||
} |
|||
|
|||
|
|||
// Box Tools Buttons |
|||
.btn-tool { |
|||
background-color: transparent; |
|||
color: $gray-500; |
|||
font-size: $font-size-sm; |
|||
margin: -(($card-spacer-y * .5) * 2) 0; |
|||
padding: .25rem .5rem; |
|||
|
|||
.btn-group.show &, |
|||
&:hover { |
|||
color: $gray-700; |
|||
} |
|||
|
|||
.show &, |
|||
&:focus { |
|||
box-shadow: none !important; |
|||
} |
|||
} |
|||
|
|||
.text-sm { |
|||
.card-title { |
|||
font-size: $card-title-font-size-sm; |
|||
} |
|||
|
|||
.nav-link { |
|||
padding: $card-nav-link-padding-sm-y $card-nav-link-padding-sm-x; |
|||
} |
|||
} |
|||
|
|||
// Box Body |
|||
.card-body { |
|||
// @include border-radius-sides(0, 0, $border-radius, $border-radius); |
|||
// .no-header & { |
|||
// @include border-top-radius($border-radius); |
|||
// } |
|||
|
|||
// Tables within the box body |
|||
> .table { |
|||
margin-bottom: 0; |
|||
|
|||
> thead > tr > th, |
|||
> thead > tr > td { |
|||
border-top-width: 0; |
|||
} |
|||
} |
|||
|
|||
// Calendar within the box body |
|||
.fc { |
|||
margin-top: 5px; |
|||
} |
|||
|
|||
.full-width-chart { |
|||
margin: -19px; |
|||
} |
|||
|
|||
&.p-0 .full-width-chart { |
|||
margin: -9px; |
|||
} |
|||
} |
|||
|
|||
.chart-legend { |
|||
@include list-unstyled (); |
|||
margin: 10px 0; |
|||
|
|||
> li { |
|||
@media (max-width: map-get($grid-breakpoints, sm)) { |
|||
float: left; |
|||
margin-right: 10px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Comment Box |
|||
.card-comments { |
|||
background-color: $gray-100; |
|||
|
|||
.card-comment { |
|||
@include clearfix (); |
|||
border-bottom: 1px solid $gray-200; |
|||
padding: 8px 0; |
|||
|
|||
&:last-of-type { |
|||
border-bottom: 0; |
|||
} |
|||
|
|||
&:first-of-type { |
|||
padding-top: 0; |
|||
} |
|||
|
|||
img { |
|||
height: $card-img-size; |
|||
width: $card-img-size; |
|||
float: left; |
|||
} |
|||
} |
|||
|
|||
.comment-text { |
|||
color: lighten($gray-700, 20%); |
|||
margin-left: 40px; |
|||
} |
|||
|
|||
.username { |
|||
color: $gray-700; |
|||
display: block; |
|||
font-weight: 600; |
|||
} |
|||
|
|||
.text-muted { |
|||
font-size: 12px; |
|||
font-weight: 400; |
|||
} |
|||
} |
|||
|
|||
// Widgets |
|||
//----------- |
|||
|
|||
// Widget: TODO LIST |
|||
.todo-list { |
|||
list-style: none; |
|||
margin: 0; |
|||
overflow: auto; |
|||
padding: 0; |
|||
|
|||
// Todo list element |
|||
> li { |
|||
@include border-radius(2px); |
|||
background-color: $gray-100; |
|||
border-left: 2px solid $gray-200; |
|||
color: $gray-700; |
|||
margin-bottom: 2px; |
|||
padding: 10px; |
|||
|
|||
&:last-of-type { |
|||
margin-bottom: 0; |
|||
} |
|||
|
|||
> input[type="checkbox"] { |
|||
margin: 0 10px 0 5px; |
|||
} |
|||
|
|||
.text { |
|||
display: inline-block; |
|||
font-weight: 600; |
|||
margin-left: 5px; |
|||
} |
|||
|
|||
// Time labels |
|||
.badge { |
|||
font-size: .7rem; |
|||
margin-left: 10px; |
|||
} |
|||
|
|||
// Tools and options box |
|||
.tools { |
|||
color: theme-color("danger"); |
|||
display: none; |
|||
float: right; |
|||
|
|||
// icons |
|||
> .fa, |
|||
> .fas, |
|||
> .far, |
|||
> .fab, |
|||
> .fal, |
|||
> .fad, |
|||
> .svg-inline--fa, |
|||
> .ion { |
|||
cursor: pointer; |
|||
margin-right: 5px; |
|||
} |
|||
} |
|||
|
|||
&:hover .tools { |
|||
display: inline-block; |
|||
} |
|||
|
|||
&.done { |
|||
color: darken($gray-500, 25%); |
|||
|
|||
.text { |
|||
font-weight: 500; |
|||
text-decoration: line-through; |
|||
} |
|||
|
|||
.badge { |
|||
background-color: $gray-500 !important; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Color variants |
|||
@each $name, $color in $theme-colors { |
|||
.#{$name} { |
|||
border-left-color: $color; |
|||
} |
|||
} |
|||
|
|||
@each $name, $color in $colors { |
|||
.#{$name} { |
|||
border-left-color: $color; |
|||
} |
|||
} |
|||
|
|||
.handle { |
|||
cursor: move; |
|||
display: inline-block; |
|||
margin: 0 5px; |
|||
} |
|||
} |
|||
|
|||
// END TODO WIDGET |
|||
|
|||
// Input in box |
|||
.card-input { |
|||
max-width: 200px; |
|||
} |
|||
|
|||
// Nav Tabs override |
|||
.card-default { |
|||
.nav-item { |
|||
&:first-child .nav-link { |
|||
border-left: 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
|
|||
// Color variants |
|||
@each $name, $color in $theme-colors-alt { |
|||
@include cards-variant($name, $color); |
|||
} |
|||
|
|||
@each $name, $color in $colors-alt { |
|||
@include cards-variant($name, $color); |
|||
} |
|||
|
|||
.card { |
|||
background-color: $dark; |
|||
color: $white; |
|||
|
|||
.card { |
|||
background-color: lighten($dark, 5%); |
|||
color: $white; |
|||
} |
|||
.nav.flex-column > li { |
|||
border-bottom-color: $gray-600; |
|||
} |
|||
.card-footer { |
|||
background-color: rgba($black, .1); |
|||
} |
|||
&.card-outline-tabs { |
|||
border-top: 0; |
|||
} |
|||
&.card-outline-tabs .card-header a:hover { |
|||
border-top-color: $gray-600; |
|||
border-bottom-color: transparent; |
|||
} |
|||
&:not(.card-outline) > .card-header a.active { |
|||
color: $white; |
|||
} |
|||
} |
|||
|
|||
.card-comments { |
|||
background-color: lighten($dark, 1.25%); |
|||
.username { |
|||
color: $gray-400; |
|||
} |
|||
.card-comment { |
|||
border-bottom-color: lighten($dark, 7.5%); |
|||
} |
|||
} |
|||
|
|||
.todo-list > li { |
|||
background-color: lighten($dark, 5%); |
|||
border-color: lighten($dark, 7.5%); |
|||
color: $white; |
|||
} |
|||
|
|||
.todo-list { |
|||
@each $name, $color in $theme-colors-alt { |
|||
.#{$name} { |
|||
border-left-color: $color; |
|||
} |
|||
} |
|||
|
|||
@each $name, $color in $colors-alt { |
|||
.#{$name} { |
|||
border-left-color: $color; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,28 @@ |
|||
// |
|||
// Component: Carousel |
|||
// |
|||
|
|||
.carousel-control-custom-icon { |
|||
.carousel-control-prev & { |
|||
margin-left: -20px; |
|||
} |
|||
.carousel-control-next & { |
|||
margin-right: 20px; |
|||
} |
|||
|
|||
> .fa, |
|||
> .fas, |
|||
> .far, |
|||
> .fab, |
|||
> .fal, |
|||
> .fad, |
|||
> .svg-inline--fa, |
|||
> .ion { |
|||
display: inline-block; |
|||
font-size: 40px; |
|||
margin-top: -20px; |
|||
position: absolute; |
|||
top: 50%; |
|||
z-index: 5; |
|||
} |
|||
} |
|||
@ -0,0 +1,44 @@ |
|||
.close { |
|||
float: right; |
|||
@include font-size($close-font-size); |
|||
font-weight: $close-font-weight; |
|||
line-height: 1; |
|||
color: $close-color; |
|||
text-shadow: $close-text-shadow; |
|||
opacity: .5; |
|||
|
|||
// Override <a>'s hover style |
|||
@include hover() { |
|||
color: $close-color; |
|||
text-decoration: none; |
|||
} |
|||
|
|||
&:not(:disabled):not(.disabled) { |
|||
@include hover-focus() { |
|||
opacity: .75; |
|||
} |
|||
} |
|||
|
|||
&:focus { |
|||
outline: none; |
|||
} |
|||
} |
|||
|
|||
// 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-next-line selector-no-qualifying-type |
|||
button.close { |
|||
padding: 0; |
|||
background-color: transparent; |
|||
border: 0; |
|||
} |
|||
|
|||
// Future-proof disabling of clicks on `<a>` elements |
|||
|
|||
// stylelint-disable-next-line selector-no-qualifying-type |
|||
a.close.disabled { |
|||
pointer-events: none; |
|||
} |
|||
@ -0,0 +1,163 @@ |
|||
// |
|||
// Misc: Colors |
|||
// |
|||
|
|||
// Background colors (theme colors) |
|||
@each $name, $color in $theme-colors { |
|||
@include background-variant($name, $color); |
|||
} |
|||
|
|||
// Background colors (colors) |
|||
@each $name, $color in $colors { |
|||
@include background-variant($name, $color); |
|||
} |
|||
|
|||
@media print { |
|||
.table td, |
|||
.table th { |
|||
// Background colors (theme colors) |
|||
@each $name, $color in $theme-colors { |
|||
@include background-variant($name, $color); |
|||
} |
|||
|
|||
// Background colors (colors) |
|||
@each $name, $color in $colors { |
|||
@include background-variant($name, $color); |
|||
} |
|||
} |
|||
} |
|||
|
|||
.bg-gray { |
|||
background-color: $gray-500; |
|||
color: color-yiq($gray-500); |
|||
} |
|||
|
|||
.bg-gray-light { |
|||
background-color: lighten($gray-200, 3%); |
|||
color: color-yiq(lighten($gray-200, 3%)) !important; |
|||
} |
|||
|
|||
.bg-black { |
|||
background-color: $black; |
|||
color: color-yiq($black) !important; |
|||
} |
|||
|
|||
.bg-white { |
|||
background-color: $white; |
|||
color: color-yiq($white) !important; |
|||
} |
|||
|
|||
// Gradient Background colors (theme colors) |
|||
@each $name, $color in $theme-colors { |
|||
@include background-gradient-variant($name, $color); |
|||
} |
|||
|
|||
// Gradient Background colors (colors) |
|||
@each $name, $color in $colors { |
|||
@include background-gradient-variant($name, $color); |
|||
} |
|||
|
|||
// Backgrund Color Disabled |
|||
[class^="bg-"].disabled { |
|||
opacity: .65; |
|||
} |
|||
|
|||
// Text muted hover |
|||
a.text-muted:hover { |
|||
color: theme-color(primary) !important; |
|||
} |
|||
|
|||
// Link Styles |
|||
.link-muted { |
|||
color: darken($gray-500, 30%); |
|||
|
|||
&:hover, |
|||
&:focus { |
|||
color: darken($gray-500, 40%); |
|||
} |
|||
} |
|||
|
|||
.link-black { |
|||
color: $gray-600; |
|||
|
|||
&:hover, |
|||
&:focus { |
|||
color: lighten($gray-500, 20%); |
|||
} |
|||
} |
|||
|
|||
// Accent colors (theme colors) |
|||
@each $name, $color in $theme-colors { |
|||
@include accent-variant($name, $color); |
|||
} |
|||
|
|||
// Accent colors (colors) |
|||
@each $name, $color in $colors { |
|||
@include accent-variant($name, $color); |
|||
} |
|||
|
|||
// Accent button override fix |
|||
[class*="accent-"] { |
|||
@each $name, $color in $theme-colors { |
|||
a.btn-#{$name} { |
|||
color: color-yiq($color); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.bg-light { |
|||
background-color: lighten($dark, 7.5%) !important; |
|||
color: $white !important; |
|||
} |
|||
.text-black, |
|||
.text-dark, |
|||
.link-black, |
|||
.link-dark { |
|||
color: $gray-400 !important; |
|||
} |
|||
|
|||
// Background colors (theme colors) |
|||
@each $name, $color in $theme-colors-alt { |
|||
@include background-variant($name, $color); |
|||
} |
|||
|
|||
// Background colors (colors) |
|||
@each $name, $color in $colors-alt { |
|||
@include background-variant($name, $color); |
|||
} |
|||
|
|||
// Gradient Background colors (theme colors) |
|||
@each $name, $color in $theme-colors-alt { |
|||
@include background-gradient-variant($name, $color); |
|||
} |
|||
|
|||
// Gradient Background colors (colors) |
|||
@each $name, $color in $colors-alt { |
|||
@include background-gradient-variant($name, $color); |
|||
} |
|||
|
|||
// Accent colors (theme colors) |
|||
@each $name, $color in $theme-colors-alt { |
|||
@include accent-variant($name, $color); |
|||
} |
|||
|
|||
[class*="accent-"] { |
|||
@each $name, $color in $theme-colors-alt { |
|||
a.btn-#{$name} { |
|||
color: color-yiq($color); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Accent colors (colors) |
|||
@each $name, $color in $colors-alt { |
|||
@include accent-variant($name, $color); |
|||
} |
|||
|
|||
.border-dark { |
|||
border-color: lighten($dark, 10%) !important; |
|||
} |
|||
} |
|||
|
|||
// |
|||
@ -0,0 +1,179 @@ |
|||
// |
|||
// Component: Control Sidebar |
|||
// |
|||
|
|||
html.control-sidebar-animate { |
|||
overflow-x: hidden; |
|||
} |
|||
|
|||
.control-sidebar { |
|||
bottom: $main-footer-height; |
|||
position: absolute; |
|||
top: $main-header-height; |
|||
z-index: $zindex-control-sidebar; |
|||
|
|||
&, |
|||
&::before { |
|||
bottom: $main-footer-height; |
|||
display: none; |
|||
right: -$control-sidebar-width; |
|||
width: $control-sidebar-width; |
|||
@include transition( |
|||
right $transition-speed $transition-fn, |
|||
display $transition-speed $transition-fn |
|||
); |
|||
} |
|||
|
|||
&::before { |
|||
content: ""; |
|||
display: block; |
|||
position: fixed; |
|||
top: 0; |
|||
z-index: -1; |
|||
} |
|||
} |
|||
|
|||
body.text-sm { |
|||
.control-sidebar { |
|||
bottom: $main-footer-height-sm; |
|||
top: $main-header-height-sm; |
|||
} |
|||
} |
|||
|
|||
.main-header.text-sm ~ .control-sidebar { |
|||
top: $main-header-height-sm; |
|||
} |
|||
|
|||
.main-footer.text-sm ~ .control-sidebar { |
|||
bottom: $main-footer-height-sm; |
|||
} |
|||
|
|||
.control-sidebar-push-slide { |
|||
.content-wrapper, |
|||
.main-footer { |
|||
@include transition(margin-right $transition-speed $transition-fn); |
|||
} |
|||
} |
|||
|
|||
// Control sidebar open state |
|||
.control-sidebar-open { |
|||
.control-sidebar { |
|||
display: block !important; |
|||
|
|||
&, |
|||
&::before { |
|||
right: 0; |
|||
} |
|||
} |
|||
|
|||
&.control-sidebar-push, |
|||
&.control-sidebar-push-slide { |
|||
.content-wrapper, |
|||
.main-footer { |
|||
margin-right: $control-sidebar-width; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Control sidebar slide over content state |
|||
.control-sidebar-slide-open { |
|||
.control-sidebar { |
|||
display: block; |
|||
|
|||
&, |
|||
&::before { |
|||
right: 0; |
|||
@include transition( |
|||
right $transition-speed $transition-fn, |
|||
display $transition-speed $transition-fn |
|||
); |
|||
} |
|||
} |
|||
|
|||
&.control-sidebar-push, |
|||
&.control-sidebar-push-slide { |
|||
.content-wrapper, |
|||
.main-footer { |
|||
margin-right: $control-sidebar-width; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Dark skin |
|||
.control-sidebar-dark { |
|||
background-color: $sidebar-dark-bg; |
|||
|
|||
&, |
|||
a, |
|||
.nav-link { |
|||
color: $sidebar-dark-color; |
|||
} |
|||
|
|||
a:hover { |
|||
color: $sidebar-dark-hover-color; |
|||
} |
|||
|
|||
// Headers and labels |
|||
h1, |
|||
h2, |
|||
h3, |
|||
h4, |
|||
h5, |
|||
h6, |
|||
label { |
|||
color: $sidebar-dark-hover-color; |
|||
} |
|||
|
|||
// Tabs |
|||
.nav-tabs { |
|||
background-color: $sidebar-dark-hover-bg; |
|||
border-bottom: 0; |
|||
margin-bottom: 5px; |
|||
|
|||
.nav-item { |
|||
margin: 0; |
|||
} |
|||
|
|||
.nav-link { |
|||
border-radius: 0; |
|||
padding: 10px 20px; |
|||
position: relative; |
|||
text-align: center; |
|||
|
|||
&, |
|||
&:hover, |
|||
&:active, |
|||
&:focus, |
|||
&.active { |
|||
border: 0; |
|||
} |
|||
|
|||
&:hover, |
|||
&:active, |
|||
&:focus, |
|||
&.active { |
|||
border-bottom-color: transparent; |
|||
border-left-color: transparent; |
|||
border-top-color: transparent; |
|||
color: $sidebar-dark-hover-color; |
|||
} |
|||
|
|||
&.active { |
|||
background-color: $sidebar-dark-bg; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.tab-pane { |
|||
padding: 10px 15px; |
|||
} |
|||
} |
|||
|
|||
// Light skin |
|||
.control-sidebar-light { |
|||
color: lighten($sidebar-light-color, 10%); |
|||
|
|||
// Background |
|||
background-color: $sidebar-light-bg; |
|||
border-left: $main-header-bottom-border; |
|||
} |
|||
@ -0,0 +1,259 @@ |
|||
// |
|||
// Component: Direct Chat |
|||
// |
|||
|
|||
.direct-chat { |
|||
.card-body { |
|||
overflow-x: hidden; |
|||
padding: 0; |
|||
position: relative; |
|||
} |
|||
|
|||
&.chat-pane-open { |
|||
.direct-chat-contacts { |
|||
@include translate(0, 0); |
|||
} |
|||
} |
|||
|
|||
|
|||
&.timestamp-light { |
|||
.direct-chat-timestamp { |
|||
color: lighten(color-yiq($yiq-text-light), 10%); |
|||
} |
|||
} |
|||
|
|||
&.timestamp-dark { |
|||
.direct-chat-timestamp { |
|||
color: darken(color-yiq($yiq-text-dark), 20%); |
|||
} |
|||
} |
|||
} |
|||
|
|||
.direct-chat-messages { |
|||
@include translate(0, 0); |
|||
height: 250px; |
|||
overflow: auto; |
|||
padding: 10px; |
|||
} |
|||
|
|||
.direct-chat-msg, |
|||
.direct-chat-text { |
|||
display: block; |
|||
} |
|||
|
|||
.direct-chat-msg { |
|||
@include clearfix (); |
|||
margin-bottom: 10px; |
|||
} |
|||
|
|||
.direct-chat-messages, |
|||
.direct-chat-contacts { |
|||
transition: transform .5s ease-in-out; |
|||
} |
|||
|
|||
.direct-chat-text { |
|||
@if $enable-rounded { |
|||
@include border-radius($border-radius-lg); |
|||
} |
|||
|
|||
background-color: $direct-chat-default-msg-bg; |
|||
border: 1px solid $direct-chat-default-msg-border-color; |
|||
color: $direct-chat-default-font-color; |
|||
margin: 5px 0 0 50px; |
|||
padding: 5px 10px; |
|||
position: relative; |
|||
|
|||
//Create the arrow |
|||
&::after, |
|||
&::before { |
|||
border: solid transparent; |
|||
border-right-color: $direct-chat-default-msg-border-color; |
|||
content: " "; |
|||
height: 0; |
|||
pointer-events: none; |
|||
position: absolute; |
|||
right: 100%; |
|||
top: 15px; |
|||
width: 0; |
|||
} |
|||
|
|||
&::after { |
|||
border-width: 5px; |
|||
margin-top: -5px; |
|||
} |
|||
|
|||
&::before { |
|||
border-width: 6px; |
|||
margin-top: -6px; |
|||
} |
|||
|
|||
.right & { |
|||
margin-left: 0; |
|||
margin-right: 50px; |
|||
|
|||
&::after, |
|||
&::before { |
|||
border-left-color: $direct-chat-default-msg-border-color; |
|||
border-right-color: transparent; |
|||
left: 100%; |
|||
right: auto; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.direct-chat-img { |
|||
@include border-radius(50%); |
|||
float: left; |
|||
height: 40px; |
|||
width: 40px; |
|||
|
|||
.right & { |
|||
float: right; |
|||
} |
|||
} |
|||
|
|||
.direct-chat-infos { |
|||
display: block; |
|||
font-size: $font-size-sm; |
|||
margin-bottom: 2px; |
|||
} |
|||
|
|||
.direct-chat-name { |
|||
font-weight: 600; |
|||
} |
|||
|
|||
.direct-chat-timestamp { |
|||
color: darken($gray-500, 25%); |
|||
} |
|||
|
|||
//Direct chat contacts pane |
|||
.direct-chat-contacts-open { |
|||
.direct-chat-contacts { |
|||
@include translate(0, 0); |
|||
} |
|||
} |
|||
|
|||
.direct-chat-contacts { |
|||
@include translate(101%, 0); |
|||
background-color: $dark; |
|||
bottom: 0; |
|||
color: $white; |
|||
height: 250px; |
|||
overflow: auto; |
|||
position: absolute; |
|||
top: 0; |
|||
width: 100%; |
|||
} |
|||
|
|||
.direct-chat-contacts-light { |
|||
background-color: $light; |
|||
|
|||
.contacts-list-name { |
|||
color: $gray-700; |
|||
} |
|||
|
|||
.contacts-list-date { |
|||
color: $gray-600; |
|||
} |
|||
|
|||
.contacts-list-msg { |
|||
color: darken($gray-600, 10%); |
|||
} |
|||
} |
|||
|
|||
//Contacts list -- for displaying contacts in direct chat contacts pane |
|||
.contacts-list { |
|||
@include list-unstyled (); |
|||
|
|||
> li { |
|||
@include clearfix (); |
|||
border-bottom: 1px solid rgba($black, .2); |
|||
margin: 0; |
|||
padding: 10px; |
|||
|
|||
&:last-of-type { |
|||
border-bottom: 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.contacts-list-img { |
|||
@include border-radius(50%); |
|||
float: left; |
|||
width: 40px; |
|||
} |
|||
|
|||
.contacts-list-info { |
|||
color: $white; |
|||
margin-left: 45px; |
|||
} |
|||
|
|||
.contacts-list-name, |
|||
.contacts-list-status { |
|||
display: block; |
|||
} |
|||
|
|||
.contacts-list-name { |
|||
font-weight: 600; |
|||
} |
|||
|
|||
.contacts-list-status { |
|||
font-size: $font-size-sm; |
|||
} |
|||
|
|||
.contacts-list-date { |
|||
color: $gray-400; |
|||
font-weight: 400; |
|||
} |
|||
|
|||
.contacts-list-msg { |
|||
color: darken($gray-400, 10%); |
|||
} |
|||
|
|||
// Color variants |
|||
@each $name, $color in $theme-colors { |
|||
.direct-chat-#{$name} { |
|||
@include direct-chat-variant($color); |
|||
} |
|||
} |
|||
|
|||
@each $name, $color in $colors { |
|||
.direct-chat-#{$name} { |
|||
@include direct-chat-variant($color); |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.direct-chat-text { |
|||
background-color: lighten($dark, 7.5%); |
|||
border-color: lighten($dark, 10%); |
|||
color: $white; |
|||
|
|||
&::after, |
|||
&::before { |
|||
border-right-color: lighten($dark, 10%); |
|||
} |
|||
} |
|||
.direct-chat-timestamp { |
|||
color: $gray-500; |
|||
} |
|||
.right > .direct-chat-text { |
|||
&::after, |
|||
&::before { |
|||
border-right-color: transparent; |
|||
} |
|||
} |
|||
|
|||
// Color variants |
|||
@each $name, $color in $theme-colors-alt { |
|||
.direct-chat-#{$name} { |
|||
@include direct-chat-variant($color); |
|||
} |
|||
} |
|||
|
|||
@each $name, $color in $colors-alt { |
|||
.direct-chat-#{$name} { |
|||
@include direct-chat-variant($color); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,295 @@ |
|||
// |
|||
// Component: Dropdown |
|||
// |
|||
|
|||
// General Dropdown Rules |
|||
//.dropdown-item { |
|||
// &:first-of-type { |
|||
// @include border-top-radius($border-radius); |
|||
// } |
|||
// &:last-of-type { |
|||
// @include border-bottom-radius($border-radius); |
|||
// } |
|||
//} |
|||
|
|||
.text-sm { |
|||
.dropdown-menu { |
|||
font-size: $font-size-sm !important; |
|||
} |
|||
|
|||
.dropdown-toggle::after { |
|||
vertical-align: .2rem; |
|||
} |
|||
} |
|||
|
|||
.dropdown-item-title { |
|||
font-size: $font-size-base; |
|||
margin: 0; |
|||
} |
|||
|
|||
.dropdown-icon { |
|||
&::after { |
|||
margin-left: 0; |
|||
} |
|||
} |
|||
|
|||
// Dropdown Sizes |
|||
.dropdown-menu-lg { |
|||
max-width: 300px; |
|||
min-width: 280px; |
|||
padding: 0; |
|||
|
|||
.dropdown-divider { |
|||
margin: 0; |
|||
} |
|||
|
|||
.dropdown-item { |
|||
padding: $dropdown-padding-y $dropdown-item-padding-x; |
|||
} |
|||
|
|||
p { |
|||
margin: 0; |
|||
white-space: normal; |
|||
} |
|||
} |
|||
|
|||
// Dropdown Submenu |
|||
.dropdown-submenu { |
|||
position: relative; |
|||
|
|||
> a::after { |
|||
@include caret-right (); |
|||
float: right; |
|||
margin-left: .5rem; |
|||
margin-top: .5rem; |
|||
} |
|||
|
|||
> .dropdown-menu { |
|||
left: 100%; |
|||
margin-left: 0; |
|||
margin-top: 0; |
|||
top: 0; |
|||
} |
|||
} |
|||
|
|||
// Dropdown Hover |
|||
.dropdown-hover { |
|||
&:hover, |
|||
&.nav-item.dropdown:hover, |
|||
.dropdown-submenu:hover, |
|||
&.dropdown-submenu:hover { |
|||
> .dropdown-menu { |
|||
display: block; |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
// Dropdown Sizes |
|||
.dropdown-menu-xl { |
|||
max-width: 420px; |
|||
min-width: 360px; |
|||
padding: 0; |
|||
|
|||
.dropdown-divider { |
|||
margin: 0; |
|||
} |
|||
|
|||
.dropdown-item { |
|||
padding: $dropdown-padding-y $dropdown-item-padding-x; |
|||
} |
|||
|
|||
p { |
|||
margin: 0; |
|||
white-space: normal; |
|||
} |
|||
} |
|||
|
|||
// Dropdown header and footer |
|||
.dropdown-footer, |
|||
.dropdown-header { |
|||
display: block; |
|||
font-size: $font-size-sm; |
|||
padding: .5rem $dropdown-item-padding-x; |
|||
text-align: center; |
|||
} |
|||
|
|||
// Add fade animation to dropdown menus by appending |
|||
// the class .animated-dropdown-menu to the .dropdown-menu ul (or ol) |
|||
.open:not(.dropup) > .animated-dropdown-menu { |
|||
@include animation(flipInX .7s both); |
|||
backface-visibility: visible !important; |
|||
} |
|||
|
|||
// Fix dropdown menu in navbars |
|||
.navbar-custom-menu > .navbar-nav { |
|||
> li { |
|||
position: relative; |
|||
> .dropdown-menu { |
|||
position: absolute; |
|||
right: 0; |
|||
left: auto; |
|||
} |
|||
} |
|||
} |
|||
|
|||
@include media-breakpoint-down(sm) { |
|||
.navbar-custom-menu > .navbar-nav { |
|||
float: right; |
|||
> li { |
|||
position: static; |
|||
> .dropdown-menu { |
|||
position: absolute; |
|||
right: 5%; |
|||
left: auto; |
|||
border: 1px solid #ddd; |
|||
background-color: $white; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// User Menu |
|||
.navbar-nav > .user-menu { |
|||
> .nav-link::after { |
|||
content: none; |
|||
} |
|||
|
|||
> .dropdown-menu { |
|||
@include border-top-radius(0); |
|||
padding: 0; |
|||
width: 280px; |
|||
|
|||
&, |
|||
> .user-body { |
|||
@include border-bottom-radius(4px); |
|||
} |
|||
|
|||
// Header menu |
|||
> li.user-header { |
|||
height: 175px; |
|||
padding: 10px; |
|||
text-align: center; |
|||
|
|||
// User image |
|||
> img { |
|||
z-index: 5; |
|||
height: 90px; |
|||
width: 90px; |
|||
border: 3px solid; |
|||
border-color: transparent; |
|||
border-color: rgba(255, 255, 255, .2); |
|||
} |
|||
|
|||
> p { |
|||
z-index: 5; |
|||
font-size: 17px; |
|||
//text-shadow: 2px 2px 3px #333333; |
|||
margin-top: 10px; |
|||
|
|||
> small { |
|||
display: block; |
|||
font-size: 12px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Menu Body |
|||
> .user-body { |
|||
@include clearfix (); |
|||
border-bottom: 1px solid $gray-700; |
|||
border-top: 1px solid $gray-300; |
|||
padding: 15px; |
|||
|
|||
a { |
|||
@include media-breakpoint-up(sm) { |
|||
background-color: $white !important; |
|||
color: $gray-700 !important; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Menu Footer |
|||
> .user-footer { |
|||
@include clearfix (); |
|||
background-color: $gray-100; |
|||
padding: 10px; |
|||
|
|||
.btn-default { |
|||
color: $gray-600; |
|||
|
|||
&:hover { |
|||
@include media-breakpoint-up(sm) { |
|||
background-color: $gray-100; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.user-image { |
|||
@include media-breakpoint-up(sm) { |
|||
float: none; |
|||
line-height: 10px; |
|||
margin-right: .4rem; |
|||
margin-top: -8px; |
|||
} |
|||
|
|||
border-radius: 50%; |
|||
float: left; |
|||
height: $sidebar-user-image-width; |
|||
margin-right: 10px; |
|||
margin-top: -2px; |
|||
width: $sidebar-user-image-width; |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.dropdown-menu { |
|||
background-color: $dark; |
|||
color: $white; |
|||
} |
|||
.dropdown-item { |
|||
color: $white; |
|||
|
|||
&:focus, |
|||
&:hover { |
|||
background-color: lighten($dark, 5%); |
|||
} |
|||
} |
|||
.dropdown-divider { |
|||
border-color: $gray-600; |
|||
} |
|||
|
|||
.navbar-nav > .user-menu > .dropdown-menu { |
|||
> .user-footer { |
|||
background-color: lighten($dark, 2.5%); |
|||
color: $white; |
|||
|
|||
.btn-default { |
|||
color: $white; |
|||
|
|||
&:hover, |
|||
&:focus { |
|||
background-color: lighten($dark, 5%); |
|||
color: $gray-300; |
|||
} |
|||
&:focus { |
|||
background-color: lighten($dark, 7.5%); |
|||
} |
|||
} |
|||
} |
|||
> .user-body { |
|||
border-color: $gray-600; |
|||
} |
|||
> .user-body a { |
|||
background-color: transparent !important; |
|||
color: $white !important; |
|||
|
|||
&:hover, |
|||
&:focus { |
|||
color: $gray-400 !important; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,14 @@ |
|||
// |
|||
// Component: Elevation |
|||
// |
|||
|
|||
.elevation-0 { |
|||
box-shadow: none !important; |
|||
} |
|||
|
|||
// Background colors (colors) |
|||
@each $name, $value in $elevations { |
|||
.elevation-#{$name} { |
|||
box-shadow: $value !important; |
|||
} |
|||
} |
|||
@ -0,0 +1,451 @@ |
|||
// |
|||
// Component: Forms |
|||
// |
|||
|
|||
.form-group { |
|||
&.has-icon { |
|||
position: relative; |
|||
|
|||
.form-control { |
|||
padding-right: 35px; |
|||
} |
|||
|
|||
.form-icon { |
|||
background-color: transparent; |
|||
border: 0; |
|||
cursor: pointer; |
|||
font-size: 1rem; |
|||
// margin-top: -3px; |
|||
padding: $input-btn-padding-y $input-btn-padding-x; |
|||
position: absolute; |
|||
right: 3px; |
|||
top: 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Button groups |
|||
.btn-group-vertical { |
|||
.btn { |
|||
&.btn-flat:first-of-type, |
|||
&.btn-flat:last-of-type { |
|||
@include border-radius(0); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Support icons in form-control |
|||
.form-control-feedback { |
|||
&.fa, |
|||
&.fas, |
|||
&.far, |
|||
&.fab, |
|||
&.fal, |
|||
&.fad, |
|||
&.svg-inline--fa, |
|||
&.ion { |
|||
line-height: $input-height; |
|||
} |
|||
} |
|||
|
|||
.input-lg + .form-control-feedback, |
|||
.input-group-lg + .form-control-feedback { |
|||
&.fa, |
|||
&.fas, |
|||
&.far, |
|||
&.fab, |
|||
&.fal, |
|||
&.fad, |
|||
&.svg-inline--fa, |
|||
&.ion { |
|||
line-height: $input-height-lg; |
|||
} |
|||
} |
|||
|
|||
.form-group-lg { |
|||
.form-control + .form-control-feedback { |
|||
&.fa, |
|||
&.fas, |
|||
&.far, |
|||
&.fab, |
|||
&.fal, |
|||
&.fad, |
|||
&.svg-inline--fa, |
|||
&.ion { |
|||
line-height: $input-height-lg; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.input-sm + .form-control-feedback, |
|||
.input-group-sm + .form-control-feedback { |
|||
&.fa, |
|||
&.fas, |
|||
&.far, |
|||
&.fab, |
|||
&.fal, |
|||
&.fad, |
|||
&.svg-inline--fa, |
|||
&.ion { |
|||
line-height: $input-height-sm; |
|||
} |
|||
} |
|||
|
|||
.form-group-sm { |
|||
.form-control + .form-control-feedback { |
|||
&.fa, |
|||
&.fas, |
|||
&.far, |
|||
&.fab, |
|||
&.fal, |
|||
&.fad, |
|||
&.svg-inline--fa, |
|||
&.ion { |
|||
line-height: $input-height-sm; |
|||
} |
|||
} |
|||
} |
|||
|
|||
label:not(.form-check-label):not(.custom-file-label) { |
|||
font-weight: $font-weight-bold; |
|||
} |
|||
|
|||
.warning-feedback { |
|||
@include font-size($form-feedback-font-size); |
|||
color: theme-color("warning"); |
|||
display: none; |
|||
margin-top: $form-feedback-margin-top; |
|||
width: 100%; |
|||
} |
|||
|
|||
.warning-tooltip { |
|||
@include border-radius($form-feedback-tooltip-border-radius); |
|||
@include font-size($form-feedback-tooltip-font-size); |
|||
background-color: rgba(theme-color("warning"), $form-feedback-tooltip-opacity); |
|||
color: color-yiq(theme-color("warning")); |
|||
display: none; |
|||
line-height: $form-feedback-tooltip-line-height; |
|||
margin-top: .1rem; |
|||
max-width: 100%; // Contain to parent when possible |
|||
padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x; |
|||
position: absolute; |
|||
top: 100%; |
|||
z-index: 5; |
|||
} |
|||
|
|||
.form-control { |
|||
&.is-warning { |
|||
border-color: theme-color("warning"); |
|||
|
|||
@if $enable-validation-icons { |
|||
// padding-right: $input-height-inner; |
|||
// background-image: none; |
|||
// background-repeat: no-repeat; |
|||
// background-position: center right $input-height-inner-quarter; |
|||
// background-size: $input-height-inner-half $input-height-inner-half; |
|||
} |
|||
|
|||
&:focus { |
|||
border-color: theme-color("warning"); |
|||
box-shadow: 0 0 0 $input-focus-width rgba(theme-color("warning"), .25); |
|||
} |
|||
|
|||
~ .warning-feedback, |
|||
~ .warning-tooltip { |
|||
display: block; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// stylelint-disable-next-line selector-no-qualifying-type |
|||
textarea.form-control { |
|||
&.is-warning { |
|||
@if $enable-validation-icons { |
|||
padding-right: $input-height-inner; |
|||
background-position: top $input-height-inner-quarter right $input-height-inner-quarter; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.custom-select { |
|||
&.is-warning { |
|||
border-color: theme-color("warning"); |
|||
|
|||
@if $enable-validation-icons { |
|||
// padding-right: $custom-select-feedback-icon-padding-right; |
|||
// background: $custom-select-background, none $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size; |
|||
} |
|||
|
|||
&:focus { |
|||
border-color: theme-color("warning"); |
|||
box-shadow: 0 0 0 $input-focus-width rgba(theme-color("warning"), .25); |
|||
} |
|||
|
|||
~ .warning-feedback, |
|||
~ .warning-tooltip { |
|||
display: block; |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
.form-control-file { |
|||
&.is-warning { |
|||
~ .warning-feedback, |
|||
~ .warning-tooltip { |
|||
display: block; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.form-check-input { |
|||
&.is-warning { |
|||
~ .form-check-label { |
|||
color: theme-color("warning"); |
|||
} |
|||
|
|||
~ .warning-feedback, |
|||
~ .warning-tooltip { |
|||
display: block; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.custom-control-input.is-warning { |
|||
~ .custom-control-label { |
|||
color: theme-color("warning"); |
|||
|
|||
&::before { |
|||
border-color: theme-color("warning"); |
|||
} |
|||
} |
|||
|
|||
~ .warning-feedback, |
|||
~ .warning-tooltip { |
|||
display: block; |
|||
} |
|||
|
|||
&:checked { |
|||
~ .custom-control-label::before { |
|||
@include gradient-bg(lighten(theme-color("warning"), 10%)); |
|||
border-color: lighten(theme-color("warning"), 10%); |
|||
} |
|||
} |
|||
|
|||
&:focus { |
|||
~ .custom-control-label::before { |
|||
box-shadow: 0 0 0 $input-focus-width rgba(theme-color("warning"), .25); |
|||
} |
|||
|
|||
&:not(:checked) ~ .custom-control-label::before { |
|||
border-color: theme-color("warning"); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// custom file |
|||
.custom-file-input { |
|||
&.is-warning { |
|||
~ .custom-file-label { |
|||
border-color: theme-color("warning"); |
|||
} |
|||
|
|||
~ .warning-feedback, |
|||
~ .warning-tooltip { |
|||
display: block; |
|||
} |
|||
|
|||
&:focus { |
|||
~ .custom-file-label { |
|||
border-color: theme-color("warning"); |
|||
box-shadow: 0 0 0 $input-focus-width rgba(theme-color("warning"), .25); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// body.text-sm support |
|||
body.text-sm { |
|||
.input-group-text { |
|||
font-size: $font-size-sm; |
|||
} |
|||
} |
|||
|
|||
// custom .form-control styles |
|||
.form-control, |
|||
.custom-select { |
|||
&.form-control-border { |
|||
border-top: 0; |
|||
border-left: 0; |
|||
border-right: 0; |
|||
border-radius: 0; |
|||
box-shadow: inherit; |
|||
|
|||
&.border-width-2 { |
|||
border-bottom-width: 2px; |
|||
} |
|||
&.border-width-3 { |
|||
border-bottom-width: 3px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// custom switch color variations |
|||
.custom-switch { |
|||
@each $name, $color in $theme-colors { |
|||
@include custom-switch-variant($name, $color); |
|||
} |
|||
|
|||
@each $name, $color in $colors { |
|||
@include custom-switch-variant($name, $color); |
|||
} |
|||
} |
|||
|
|||
// custom range color variations |
|||
.custom-range { |
|||
@each $name, $color in $theme-colors { |
|||
@include custom-range-variant($name, $color); |
|||
} |
|||
|
|||
@each $name, $color in $colors { |
|||
@include custom-range-variant($name, $color); |
|||
} |
|||
} |
|||
|
|||
// custom control input variations |
|||
@each $name, $color in $theme-colors { |
|||
@include custom-control-input-variant($name, $color); |
|||
} |
|||
|
|||
@each $name, $color in $colors { |
|||
@include custom-control-input-variant($name, $color); |
|||
} |
|||
|
|||
.custom-control-input-outline { |
|||
~ .custom-control-label::before { |
|||
background-color: transparent !important; |
|||
box-shadow: none; |
|||
} |
|||
&:checked ~ .custom-control-label::before { |
|||
@include gradient-bg(transparent); |
|||
} |
|||
} |
|||
|
|||
.navbar-dark { |
|||
.btn-navbar, |
|||
.form-control-navbar { |
|||
background-color: lighten($sidebar-dark-bg, 5%); |
|||
border: 1px solid lighten($sidebar-dark-bg, 15%); |
|||
color: lighten(color-yiq(lighten($sidebar-dark-bg, 5%)), 15%); |
|||
} |
|||
.btn-navbar { |
|||
&:hover { |
|||
background-color: lighten($sidebar-dark-bg, 7.5%); |
|||
} |
|||
&:focus { |
|||
background-color: lighten($sidebar-dark-bg, 10%); |
|||
} |
|||
} |
|||
|
|||
.form-control-navbar + .input-group-prepend, |
|||
.form-control-navbar + .input-group-append { |
|||
> .btn-navbar { |
|||
background-color: lighten($sidebar-dark-bg, 5%); |
|||
color: $white; |
|||
border: 1px solid lighten($sidebar-dark-bg, 15%); |
|||
border-left: none; |
|||
} |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.form-control:not(.form-control-navbar):not(.form-control-sidebar), |
|||
.custom-select, |
|||
.custom-file-label, |
|||
.custom-file-label::after, |
|||
.custom-control-label::before, |
|||
.input-group-text { |
|||
background-color: $dark; |
|||
color: $white; |
|||
} |
|||
.form-control:not(.form-control-navbar):not(.form-control-sidebar):not(.is-invalid):not(:focus), |
|||
.custom-file-label, |
|||
.custom-file-label::after { |
|||
border-color: $gray-600; |
|||
} |
|||
select { |
|||
background-color: $dark; |
|||
color: $white; |
|||
border-color: $gray-600; |
|||
} |
|||
|
|||
.custom-select { |
|||
background: $dark $custom-select-dark-background; |
|||
|
|||
&[multiple]{ |
|||
background: $dark; |
|||
} |
|||
} |
|||
|
|||
.input-group-text { |
|||
border-color: $gray-600; |
|||
} |
|||
|
|||
.custom-control-input:disabled ~ .custom-control-label::before, |
|||
.custom-control-input[disabled] ~ .custom-control-label::before { |
|||
background-color: lighten($dark, 5%); |
|||
border-color: $gray-600; |
|||
color: $white; |
|||
} |
|||
|
|||
input:-webkit-autofill, |
|||
input:-webkit-autofill:hover, |
|||
input:-webkit-autofill:focus, |
|||
textarea:-webkit-autofill, |
|||
textarea:-webkit-autofill:hover, |
|||
textarea:-webkit-autofill:focus, |
|||
select:-webkit-autofill, |
|||
select:-webkit-autofill:hover, |
|||
select:-webkit-autofill:focus { |
|||
-webkit-text-fill-color: $white; |
|||
} |
|||
|
|||
.custom-range { |
|||
&::-webkit-slider-runnable-track { |
|||
background-color: lighten($dark, 7.5%); |
|||
} |
|||
&::-moz-range-track { |
|||
background-color: lighten($dark, 7.5%); |
|||
} |
|||
&::-ms-track { |
|||
background-color: lighten($dark, 7.5%); |
|||
} |
|||
|
|||
@each $name, $color in $theme-colors-alt { |
|||
@include custom-range-variant($name, $color); |
|||
} |
|||
|
|||
@each $name, $color in $colors-alt { |
|||
@include custom-range-variant($name, $color); |
|||
} |
|||
} |
|||
|
|||
// custom switch color variations |
|||
.custom-switch { |
|||
@each $name, $color in $theme-colors-alt { |
|||
@include custom-switch-variant($name, $color); |
|||
} |
|||
|
|||
@each $name, $color in $colors-alt { |
|||
@include custom-switch-variant($name, $color); |
|||
} |
|||
} |
|||
|
|||
@each $name, $color in $theme-colors-alt { |
|||
@include custom-control-input-variant($name, $color); |
|||
} |
|||
|
|||
@each $name, $color in $colors-alt { |
|||
@include custom-control-input-variant($name, $color); |
|||
} |
|||
} |
|||
@ -0,0 +1,166 @@ |
|||
// |
|||
// Component: Info Box |
|||
// |
|||
|
|||
.info-box { |
|||
@include box-shadow($card-shadow); |
|||
@include border-radius($border-radius); |
|||
|
|||
background-color: $white; |
|||
display: flex; |
|||
margin-bottom: map-get($spacers, 3); |
|||
min-height: 80px; |
|||
padding: .5rem; |
|||
position: relative; |
|||
width: 100%; |
|||
|
|||
.progress { |
|||
background-color: rgba($black, .125); |
|||
height: 2px; |
|||
margin: 5px 0; |
|||
|
|||
.progress-bar { |
|||
background-color: $white; |
|||
} |
|||
} |
|||
|
|||
.info-box-icon { |
|||
@if $enable-rounded { |
|||
border-radius: $border-radius; |
|||
} |
|||
|
|||
align-items: center; |
|||
display: flex; |
|||
font-size: 1.875rem; |
|||
justify-content: center; |
|||
text-align: center; |
|||
width: 70px; |
|||
|
|||
> img { |
|||
max-width: 100%; |
|||
} |
|||
} |
|||
|
|||
.info-box-content { |
|||
display: flex; |
|||
flex-direction: column; |
|||
justify-content: center; |
|||
line-height: 1.8; |
|||
flex: 1; |
|||
padding: 0 10px; |
|||
overflow: hidden; |
|||
} |
|||
|
|||
.info-box-number { |
|||
display: block; |
|||
margin-top: .25rem; |
|||
font-weight: $font-weight-bold; |
|||
} |
|||
|
|||
.progress-description, |
|||
.info-box-text { |
|||
display: block; |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
white-space: nowrap; |
|||
} |
|||
|
|||
@each $name, $color in $theme-colors { |
|||
.info-box { |
|||
.bg-#{$name}, |
|||
.bg-gradient-#{$name} { |
|||
color: color-yiq($color); |
|||
|
|||
.progress-bar { |
|||
background-color: color-yiq($color); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.info-box-more { |
|||
display: block; |
|||
} |
|||
|
|||
.progress-description { |
|||
margin: 0; |
|||
|
|||
} |
|||
|
|||
@include media-breakpoint-up(md) { |
|||
.col-xl-2 &, |
|||
.col-lg-2 &, |
|||
.col-md-2 & { |
|||
.progress-description { |
|||
display: none; |
|||
} |
|||
} |
|||
|
|||
.col-xl-3 &, |
|||
.col-lg-3 &, |
|||
.col-md-3 & { |
|||
.progress-description { |
|||
display: none; |
|||
} |
|||
} |
|||
} |
|||
|
|||
@include media-breakpoint-up(lg) { |
|||
.col-xl-2 &, |
|||
.col-lg-2 &, |
|||
.col-md-2 & { |
|||
.progress-description { |
|||
@include font-size(.75rem); |
|||
display: block; |
|||
} |
|||
} |
|||
|
|||
.col-xl-3 &, |
|||
.col-lg-3 &, |
|||
.col-md-3 & { |
|||
.progress-description { |
|||
@include font-size(.75rem); |
|||
display: block; |
|||
} |
|||
} |
|||
} |
|||
|
|||
@include media-breakpoint-up(xl) { |
|||
.col-xl-2 &, |
|||
.col-lg-2 &, |
|||
.col-md-2 & { |
|||
.progress-description { |
|||
@include font-size(1rem); |
|||
display: block; |
|||
} |
|||
} |
|||
|
|||
.col-xl-3 &, |
|||
.col-lg-3 &, |
|||
.col-md-3 & { |
|||
.progress-description { |
|||
@include font-size(1rem); |
|||
display: block; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.info-box { |
|||
background-color: $dark; |
|||
color: $white; |
|||
@each $name, $color in $theme-colors-alt { |
|||
.info-box { |
|||
.bg-#{$name}, |
|||
.bg-gradient-#{$name} { |
|||
color: color-yiq($color); |
|||
|
|||
.progress-bar { |
|||
background-color: color-yiq($color); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,708 @@ |
|||
// |
|||
// Core: Layout |
|||
// |
|||
|
|||
html.scroll-smooth { |
|||
scroll-behavior: smooth; |
|||
} |
|||
|
|||
html, |
|||
body, |
|||
.wrapper { |
|||
min-height: 100%; |
|||
} |
|||
|
|||
.wrapper { |
|||
position: relative; |
|||
|
|||
.content-wrapper { |
|||
min-height: calc(100vh - #{$main-header-height} - #{$main-footer-height}); |
|||
} |
|||
|
|||
.layout-boxed & { |
|||
@include box-shadow(0 0 10 rgba($black, .3)); |
|||
|
|||
&, |
|||
&::before { |
|||
margin: 0 auto; |
|||
max-width: $boxed-layout-max-width; |
|||
overflow: hidden; |
|||
} |
|||
|
|||
.main-sidebar { |
|||
left: inherit; |
|||
} |
|||
} |
|||
|
|||
@supports not (-webkit-touch-callout: none) { |
|||
.layout-fixed & .sidebar { |
|||
height: calc(100vh - (#{$main-header-height-inner} + #{$main-header-bottom-border-width})); |
|||
} |
|||
.layout-fixed.text-sm & .sidebar { |
|||
height: calc(100vh - (#{$main-header-height-sm-inner} + #{$main-header-bottom-border-width})); |
|||
} |
|||
} |
|||
|
|||
.layout-navbar-fixed.layout-fixed & { |
|||
.control-sidebar { |
|||
top: $main-header-height; |
|||
} |
|||
|
|||
.main-header.text-sm ~ .control-sidebar { |
|||
top: $main-header-height-sm; |
|||
} |
|||
|
|||
.sidebar { |
|||
margin-top: $main-header-height; |
|||
} |
|||
|
|||
.brand-link.text-sm ~ .sidebar { |
|||
margin-top: $main-header-height-sm; |
|||
} |
|||
} |
|||
|
|||
.layout-navbar-fixed.layout-fixed.text-sm & { |
|||
.control-sidebar { |
|||
top: $main-header-height-sm; |
|||
} |
|||
|
|||
.sidebar { |
|||
margin-top: $main-header-height-sm; |
|||
} |
|||
} |
|||
|
|||
.layout-navbar-fixed.sidebar-mini.sidebar-collapse &, |
|||
.layout-navbar-fixed.sidebar-mini-md.sidebar-collapse &, |
|||
.layout-navbar-fixed.sidebar-mini-xs.sidebar-collapse & { |
|||
.brand-link { |
|||
height: $main-header-height; |
|||
width: $sidebar-mini-width; |
|||
|
|||
&.text-sm { |
|||
height: $main-header-height-sm; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.layout-navbar-fixed.sidebar-mini.sidebar-collapse.text-sm &, |
|||
.layout-navbar-fixed.sidebar-mini-md.sidebar-collapse.text-sm &, |
|||
.layout-navbar-fixed.sidebar-mini-xs.sidebar-collapse.text-sm & { |
|||
.brand-link { |
|||
height: $main-header-height-sm; |
|||
} |
|||
} |
|||
|
|||
body:not(.layout-fixed).layout-navbar-fixed & { |
|||
.main-sidebar { |
|||
// margin-top: calc(#{$main-header-height} / -1); |
|||
|
|||
// .sidebar { |
|||
// margin-top: $main-header-height; |
|||
// } |
|||
} |
|||
} |
|||
|
|||
body:not(.layout-fixed).layout-navbar-fixed.text-sm & { |
|||
.main-sidebar { |
|||
margin-top: calc(#{$main-header-height-sm} / -1); |
|||
|
|||
.sidebar { |
|||
margin-top: $main-header-height-sm; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.layout-navbar-fixed & { |
|||
.control-sidebar { |
|||
top: 0; |
|||
} |
|||
|
|||
a.anchor { |
|||
display: block; |
|||
position: relative; |
|||
top: calc((#{$main-header-height-inner} + #{$main-header-bottom-border-width} + (#{$main-header-link-padding-y} * 2)) / -1); |
|||
} |
|||
|
|||
.main-sidebar:hover { |
|||
.brand-link { |
|||
transition: width $transition-speed $transition-fn; |
|||
width: $sidebar-width; |
|||
} |
|||
} |
|||
|
|||
.brand-link { |
|||
overflow: hidden; |
|||
position: fixed; |
|||
top: 0; |
|||
transition: width $transition-speed $transition-fn; |
|||
width: $sidebar-width; |
|||
z-index: $zindex-main-header + 1; |
|||
} |
|||
|
|||
// Sidebar variants brand-link fix |
|||
@each $name, $color in $theme-colors { |
|||
.sidebar-dark-#{$name} .brand-link:not([class*="navbar"]) { |
|||
background-color: $sidebar-dark-bg; |
|||
} |
|||
|
|||
.sidebar-light-#{$name} .brand-link:not([class*="navbar"]) { |
|||
background-color: $sidebar-light-bg; |
|||
} |
|||
} |
|||
|
|||
@each $name, $color in $colors { |
|||
.sidebar-dark-#{$name} .brand-link:not([class*="navbar"]) { |
|||
background-color: $sidebar-dark-bg; |
|||
} |
|||
|
|||
.sidebar-light-#{$name} .brand-link:not([class*="navbar"]) { |
|||
background-color: $sidebar-light-bg; |
|||
} |
|||
} |
|||
|
|||
.main-header.border-bottom-0 ~ .content-wrapper { |
|||
margin-top: $main-header-height-inner; |
|||
} |
|||
.content-wrapper { |
|||
margin-top: $main-header-height; |
|||
} |
|||
|
|||
.main-header.text-sm ~ .content-wrapper { |
|||
margin-top: $main-header-height-sm; |
|||
} |
|||
|
|||
.main-header { |
|||
left: 0; |
|||
position: fixed; |
|||
right: 0; |
|||
top: 0; |
|||
z-index: $zindex-main-header - 1; |
|||
} |
|||
} |
|||
|
|||
.layout-navbar-fixed.text-sm & { |
|||
.content-wrapper { |
|||
margin-top: $main-header-height-sm; |
|||
} |
|||
} |
|||
|
|||
.layout-navbar-not-fixed & { |
|||
.brand-link { |
|||
position: static; |
|||
} |
|||
|
|||
.sidebar, |
|||
.content-wrapper { |
|||
margin-top: 0; |
|||
} |
|||
|
|||
.main-header { |
|||
position: static; |
|||
} |
|||
} |
|||
|
|||
.layout-navbar-not-fixed.layout-fixed & { |
|||
.sidebar { |
|||
margin-top: 0; |
|||
} |
|||
} |
|||
|
|||
@each $breakpoint in map-keys($grid-breakpoints) { |
|||
@include media-breakpoint-up($breakpoint) { |
|||
$infix: breakpoint-infix($breakpoint, $grid-breakpoints); |
|||
|
|||
.layout#{$infix}-navbar-fixed.layout-fixed & { |
|||
.control-sidebar { |
|||
top: $main-header-height; |
|||
} |
|||
|
|||
.text-sm & .main-header ~ .control-sidebar, |
|||
.main-header.text-sm ~ .control-sidebar { |
|||
top: $main-header-height-sm; |
|||
} |
|||
|
|||
.sidebar { |
|||
margin-top: $main-header-height; |
|||
} |
|||
|
|||
.text-sm & .brand-link ~ .sidebar, |
|||
.brand-link.text-sm ~ .sidebar { |
|||
margin-top: $main-header-height-sm; |
|||
} |
|||
} |
|||
|
|||
.layout#{$infix}-navbar-fixed.layout-fixed.text-sm & { |
|||
.control-sidebar { |
|||
top: $main-header-height-sm; |
|||
} |
|||
|
|||
.sidebar { |
|||
margin-top: $main-header-height-sm; |
|||
} |
|||
} |
|||
|
|||
.layout#{$infix}-navbar-fixed & { |
|||
.control-sidebar { |
|||
top: 0; |
|||
} |
|||
|
|||
a.anchor { |
|||
display: block; |
|||
position: relative; |
|||
top: calc((#{$main-header-height-inner} + #{$main-header-bottom-border-width} + (#{$main-header-link-padding-y} * 2)) / -1); |
|||
} |
|||
|
|||
&.sidebar-collapse { |
|||
.brand-link { |
|||
height: $main-header-height; |
|||
transition: width $transition-speed $transition-fn; |
|||
width: $sidebar-mini-width; |
|||
|
|||
.text-sm &, |
|||
&.text-sm { |
|||
height: $main-header-height-sm; |
|||
} |
|||
} |
|||
|
|||
.main-sidebar:hover { |
|||
.brand-link { |
|||
transition: width $transition-speed $transition-fn; |
|||
width: $sidebar-width; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.brand-link { |
|||
overflow: hidden; |
|||
position: fixed; |
|||
top: 0; |
|||
transition: width $transition-speed $transition-fn; |
|||
width: $sidebar-width; |
|||
z-index: $zindex-main-header + 1; |
|||
} |
|||
|
|||
.content-wrapper { |
|||
margin-top: $main-header-height; |
|||
} |
|||
|
|||
.text-sm & .main-header ~ .content-wrapper, |
|||
.main-header.text-sm ~ .content-wrapper { |
|||
margin-top: $main-header-height-sm; |
|||
} |
|||
|
|||
.main-header { |
|||
left: 0; |
|||
position: fixed; |
|||
right: 0; |
|||
top: 0; |
|||
z-index: $zindex-main-sidebar - 1; |
|||
} |
|||
} |
|||
|
|||
.layout#{$infix}-navbar-fixed.text-sm & { |
|||
.content-wrapper { |
|||
margin-top: $main-header-height-sm; |
|||
} |
|||
} |
|||
|
|||
body:not(.layout-fixed).layout#{$infix}-navbar-fixed & { |
|||
// .main-sidebar { |
|||
// margin-top: calc(#{$main-header-height} / -1); |
|||
|
|||
// .sidebar { |
|||
// margin-top: $main-header-height; |
|||
// } |
|||
// } |
|||
} |
|||
|
|||
body:not(.layout-fixed).layout#{$infix}-navbar-fixed.text-sm & { |
|||
.main-sidebar { |
|||
margin-top: calc(#{$main-header-height-sm} / -1); |
|||
|
|||
.sidebar { |
|||
margin-top: $main-header-height-sm; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.layout#{$infix}-navbar-not-fixed & { |
|||
.brand-link { |
|||
position: static; |
|||
} |
|||
|
|||
.sidebar, |
|||
.content-wrapper { |
|||
margin-top: 0; |
|||
} |
|||
|
|||
.main-header { |
|||
position: static; |
|||
} |
|||
} |
|||
|
|||
.layout#{$infix}-navbar-not-fixed.layout-fixed & { |
|||
.sidebar { |
|||
margin-top: 0; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.layout-footer-fixed & { |
|||
.control-sidebar { |
|||
bottom: 0; |
|||
} |
|||
|
|||
.main-footer { |
|||
bottom: 0; |
|||
left: 0; |
|||
position: fixed; |
|||
right: 0; |
|||
z-index: $zindex-main-footer; |
|||
} |
|||
} |
|||
|
|||
.layout-footer-not-fixed & { |
|||
.main-footer { |
|||
position: static; |
|||
} |
|||
|
|||
.content-wrapper { |
|||
margin-bottom: 0; |
|||
} |
|||
} |
|||
|
|||
@each $breakpoint in map-keys($grid-breakpoints) { |
|||
@include media-breakpoint-up($breakpoint) { |
|||
$infix: breakpoint-infix($breakpoint, $grid-breakpoints); |
|||
.layout#{$infix}-footer-fixed & { |
|||
.control-sidebar { |
|||
bottom: 0; |
|||
} |
|||
|
|||
.main-footer { |
|||
bottom: 0; |
|||
left: 0; |
|||
position: fixed; |
|||
right: 0; |
|||
z-index: $zindex-main-footer; |
|||
} |
|||
|
|||
.content-wrapper { |
|||
padding-bottom: $main-footer-height; |
|||
} |
|||
} |
|||
|
|||
.layout#{$infix}-footer-not-fixed & { |
|||
.main-footer { |
|||
position: static; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.layout-top-nav & { |
|||
margin-left: 0; |
|||
|
|||
.main-header { |
|||
.brand-image { |
|||
margin-top: -.5rem; |
|||
margin-right: .2rem; |
|||
height: 33px; |
|||
} |
|||
} |
|||
|
|||
.main-sidebar { |
|||
bottom: inherit; |
|||
height: inherit; |
|||
} |
|||
|
|||
.content-wrapper, |
|||
.main-header, |
|||
.main-footer { |
|||
margin-left: 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
body.sidebar-collapse:not(.sidebar-mini-xs):not(.sidebar-mini-md):not(.sidebar-mini) { |
|||
.content-wrapper, |
|||
.main-footer, |
|||
.main-header { |
|||
&, |
|||
&::before { |
|||
margin-left: 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
body:not(.sidebar-mini-md):not(.sidebar-mini-xs):not(.layout-top-nav) { |
|||
.content-wrapper, |
|||
.main-footer, |
|||
.main-header { |
|||
@include media-breakpoint-up(md) { |
|||
@include transition(margin-left $transition-speed $transition-fn); |
|||
|
|||
margin-left: $sidebar-width; |
|||
|
|||
.sidebar-collapse & { |
|||
margin-left: 0; |
|||
} |
|||
} |
|||
|
|||
@include media-breakpoint-down(md) { |
|||
margin-left: 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.sidebar-mini-md { |
|||
.content-wrapper, |
|||
.main-footer, |
|||
.main-header { |
|||
@include media-breakpoint-up(md) { |
|||
@include transition(margin-left $transition-speed $transition-fn); |
|||
|
|||
margin-left: $sidebar-width; |
|||
|
|||
.sidebar-collapse & { |
|||
margin-left: $sidebar-mini-width; |
|||
} |
|||
} |
|||
@include media-breakpoint-down(md) { |
|||
margin-left: $sidebar-mini-width; |
|||
} |
|||
@include media-breakpoint-down(sm) { |
|||
margin-left: 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.sidebar-mini-xs { |
|||
.content-wrapper, |
|||
.main-footer, |
|||
.main-header { |
|||
@include media-breakpoint-up(md) { |
|||
@include transition(margin-left $transition-speed $transition-fn); |
|||
|
|||
margin-left: $sidebar-width; |
|||
|
|||
.sidebar-collapse & { |
|||
margin-left: $sidebar-mini-width; |
|||
} |
|||
} |
|||
@include media-breakpoint-down(md) { |
|||
margin-left: $sidebar-mini-width; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.content-wrapper { |
|||
background-color: $main-bg; |
|||
|
|||
> .content { |
|||
padding: $content-padding-y $content-padding-x; |
|||
} |
|||
} |
|||
|
|||
.main-sidebar { |
|||
&, |
|||
&::before { |
|||
$local-sidebar-transition: margin-left $transition-speed $transition-fn, width $transition-speed $transition-fn; |
|||
@include transition($local-sidebar-transition); |
|||
width: $sidebar-width; |
|||
} |
|||
|
|||
.sidebar-collapse:not(.sidebar-mini):not(.sidebar-mini-md):not(.sidebar-mini-xs) & { |
|||
&, |
|||
&::before { |
|||
box-shadow: none !important; |
|||
} |
|||
} |
|||
|
|||
.sidebar-collapse & { |
|||
&, |
|||
&::before { |
|||
margin-left: -$sidebar-width; |
|||
} |
|||
|
|||
.nav-sidebar.nav-child-indent .nav-treeview { |
|||
padding: 0; |
|||
} |
|||
} |
|||
|
|||
@include media-breakpoint-down(sm) { |
|||
&, |
|||
&::before { |
|||
box-shadow: none !important; |
|||
margin-left: -$sidebar-width; |
|||
} |
|||
|
|||
.sidebar-open & { |
|||
&, |
|||
&::before { |
|||
margin-left: 0; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
body:not(.layout-fixed) { |
|||
.main-sidebar { |
|||
height: inherit; |
|||
min-height: 100%; |
|||
position: absolute; |
|||
top: 0; |
|||
|
|||
.sidebar { |
|||
overflow-y: auto; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.layout-fixed { |
|||
.brand-link { |
|||
width: $sidebar-width; |
|||
} |
|||
|
|||
.main-sidebar { |
|||
bottom: 0; |
|||
float: none; |
|||
left: 0; |
|||
position: fixed; |
|||
top: 0; |
|||
} |
|||
|
|||
.control-sidebar { |
|||
bottom: 0; |
|||
float: none; |
|||
position: fixed; |
|||
top: 0; |
|||
|
|||
.control-sidebar-content { |
|||
height: calc(100vh - #{$main-header-height}); |
|||
overflow-y: auto; |
|||
@include scrollbar-width-thin(); |
|||
@include scrollbar-color-gray(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@supports (-webkit-touch-callout: none) { |
|||
.layout-fixed { |
|||
.main-sidebar { |
|||
height: inherit; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.main-footer { |
|||
background-color: $main-footer-bg; |
|||
border-top: $main-footer-border-top; |
|||
color: lighten($gray-700, 25%); |
|||
padding: $main-footer-padding; |
|||
|
|||
.text-sm &, |
|||
&.text-sm { |
|||
padding: $main-footer-padding-sm; |
|||
} |
|||
} |
|||
|
|||
.content-header { |
|||
padding: 15px $content-padding-x; |
|||
|
|||
.text-sm & { |
|||
padding: 10px $content-padding-x; |
|||
} |
|||
|
|||
h1 { |
|||
font-size: 1.8rem; |
|||
margin: 0; |
|||
|
|||
.text-sm & { |
|||
font-size: 1.5rem; |
|||
} |
|||
} |
|||
|
|||
.breadcrumb { |
|||
background-color: transparent; |
|||
line-height: 1.8rem; |
|||
margin-bottom: 0; |
|||
padding: 0; |
|||
|
|||
.text-sm & { |
|||
line-height: 1.5rem; |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
.hold-transition { |
|||
.content-wrapper, |
|||
.main-header, |
|||
.main-sidebar, |
|||
.main-sidebar *, |
|||
.control-sidebar, |
|||
.control-sidebar *, |
|||
.main-footer { |
|||
transition: none !important; |
|||
animation-duration: 0s !important; |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
background-color: $dark-main-bg; |
|||
color: $white; |
|||
|
|||
.wrapper { |
|||
.layout-navbar-fixed & { |
|||
@each $name, $color in $theme-colors-alt { |
|||
.sidebar-dark-#{$name} .brand-link:not([class*="navbar"]) { |
|||
background-color: $sidebar-dark-bg; |
|||
} |
|||
|
|||
.sidebar-light-#{$name} .brand-link:not([class*="navbar"]) { |
|||
background-color: $sidebar-light-bg; |
|||
} |
|||
} |
|||
} |
|||
|
|||
@each $breakpoint in map-keys($grid-breakpoints) { |
|||
@include media-breakpoint-up($breakpoint) { |
|||
$infix: breakpoint-infix($breakpoint, $grid-breakpoints); |
|||
|
|||
.layout#{$infix}-navbar-fixed & { |
|||
@each $name, $color in $theme-colors-alt { |
|||
.sidebar-dark-#{$name} .brand-link:not([class*="navbar"]) { |
|||
background-color: $sidebar-dark-bg; |
|||
} |
|||
|
|||
.sidebar-light-#{$name} .brand-link:not([class*="navbar"]) { |
|||
background-color: $sidebar-light-bg; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.breadcrumb-item { |
|||
&.active, |
|||
+ .breadcrumb-item::before { |
|||
color: $gray-500; |
|||
} |
|||
} |
|||
.main-footer { |
|||
background-color: $dark; |
|||
border-color: lighten($dark, 10%); |
|||
} |
|||
.content-wrapper { |
|||
background-color: lighten($dark, 7.5%); |
|||
color: $white; |
|||
|
|||
.content-header { |
|||
color: $white; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,179 @@ |
|||
// |
|||
// Component: Main Header |
|||
// |
|||
|
|||
.main-header { |
|||
border-bottom: $main-header-bottom-border; |
|||
z-index: $zindex-main-header; |
|||
|
|||
.nav-link { |
|||
height: $nav-link-height; |
|||
position: relative; |
|||
} |
|||
|
|||
.text-sm &, |
|||
&.text-sm { |
|||
.nav-link { |
|||
height: $nav-link-sm-height; |
|||
padding: $nav-link-sm-padding-y $nav-link-padding-x; |
|||
|
|||
> .fa, |
|||
> .fas, |
|||
> .far, |
|||
> .fab, |
|||
> .fal, |
|||
> .fad, |
|||
> .svg-inline--fa, |
|||
> .ion { |
|||
font-size: $font-size-sm; |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
.navbar-nav { |
|||
.nav-item { |
|||
margin: 0; |
|||
} |
|||
|
|||
&[class*="-right"] { |
|||
.dropdown-menu { |
|||
left: auto; |
|||
margin-top: -3px; |
|||
right: 0; |
|||
|
|||
@media (max-width: breakpoint-max(xs)) { |
|||
left: 0; |
|||
right: auto; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
&.dropdown-legacy .dropdown-menu { |
|||
top: $nav-link-height + $navbar-padding-y; |
|||
margin-top: 0; |
|||
} |
|||
} |
|||
|
|||
// Add this class to images within a nav-link |
|||
.navbar-img { |
|||
height: calc(#{$main-header-height} * .5); |
|||
width: auto; |
|||
} |
|||
|
|||
// Navbar badge |
|||
.navbar-badge { |
|||
font-size: .6rem; |
|||
font-weight: 300; |
|||
padding: 2px 4px; |
|||
position: absolute; |
|||
right: 5px; |
|||
top: 9px; |
|||
} |
|||
|
|||
.btn-navbar { |
|||
background-color: transparent; |
|||
border-left-width: 0; |
|||
} |
|||
|
|||
.form-control-navbar { |
|||
border-right-width: 0; |
|||
|
|||
+ .input-group-append { |
|||
margin-left: 0; |
|||
} |
|||
} |
|||
|
|||
.form-control-navbar, |
|||
.btn-navbar { |
|||
transition: none; |
|||
} |
|||
|
|||
.navbar-dark { |
|||
.form-control-navbar, |
|||
.btn-navbar { |
|||
background-color: $main-header-dark-form-control-bg; |
|||
border-color: $main-header-dark-form-control-border-color; |
|||
} |
|||
|
|||
.form-control-navbar { |
|||
&::placeholder { |
|||
color: $main-header-dark-placeholder-color; |
|||
} |
|||
|
|||
+ .input-group-append > .btn-navbar { |
|||
color: $main-header-dark-placeholder-color; |
|||
} |
|||
|
|||
&:focus { |
|||
&, |
|||
+ .input-group-append .btn-navbar { |
|||
background-color: $main-header-dark-form-control-focused-bg; |
|||
border-color: $main-header-dark-form-control-focused-border-color !important; |
|||
color: $main-header-dark-form-control-focused-color; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.navbar-light { |
|||
.form-control-navbar, |
|||
.btn-navbar { |
|||
background-color: $main-header-light-form-control-bg; |
|||
border-color: $main-header-light-form-control-border-color; |
|||
} |
|||
|
|||
.form-control-navbar { |
|||
&::placeholder { |
|||
color: $main-header-light-placeholder-color; |
|||
} |
|||
|
|||
+ .input-group-append > .btn-navbar { |
|||
color: $main-header-light-placeholder-color; |
|||
} |
|||
|
|||
&:focus { |
|||
&, |
|||
+ .input-group-append .btn-navbar { |
|||
background-color: $main-header-light-form-control-focused-bg; |
|||
border-color: $main-header-light-form-control-focused-border-color !important; |
|||
color: $main-header-light-form-control-focused-color; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.navbar-search-block { |
|||
.form-control-navbar { |
|||
&:focus { |
|||
&, |
|||
+ .input-group-append .btn-navbar { |
|||
color: $main-header-light-placeholder-color; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Navbar Search |
|||
.navbar-search-block { |
|||
position: absolute; |
|||
padding: 0 $nav-link-padding-x; |
|||
left: 0; |
|||
top: 0; |
|||
right: 0; |
|||
bottom: 0; |
|||
z-index: 10; |
|||
display: none; |
|||
justify-content: center; |
|||
flex-direction: column; |
|||
background-color: initial; |
|||
|
|||
&.navbar-search-open { |
|||
display: flex; |
|||
} |
|||
|
|||
.input-group { |
|||
width: 100%; |
|||
} |
|||
} |
|||
1209
controle/static/build/scss/_main-sidebar.scss
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,541 @@ |
|||
// |
|||
// Misc: Miscellaneous |
|||
// |
|||
|
|||
.border-transparent { |
|||
border-color: transparent !important; |
|||
} |
|||
|
|||
// Description Blocks |
|||
.description-block { |
|||
display: block; |
|||
margin: 10px 0; |
|||
text-align: center; |
|||
|
|||
&.margin-bottom { |
|||
margin-bottom: 25px; |
|||
} |
|||
|
|||
> .description-header { |
|||
font-size: 16px; |
|||
font-weight: 600; |
|||
margin: 0; |
|||
padding: 0; |
|||
} |
|||
|
|||
> .description-text { |
|||
text-transform: uppercase; |
|||
} |
|||
|
|||
// Description Block Extension |
|||
.description-icon { |
|||
font-size: 16px; |
|||
} |
|||
} |
|||
|
|||
// List utility classes |
|||
.list-group-unbordered { |
|||
> .list-group-item { |
|||
border-left: 0; |
|||
border-radius: 0; |
|||
border-right: 0; |
|||
padding-left: 0; |
|||
padding-right: 0; |
|||
} |
|||
} |
|||
|
|||
.list-header { |
|||
color: $gray-600; |
|||
font-size: 15px; |
|||
font-weight: 700; |
|||
padding: 10px 4px; |
|||
} |
|||
|
|||
.list-seperator { |
|||
background-color: $card-border-color; |
|||
height: 1px; |
|||
margin: 15px 0 9px; |
|||
} |
|||
|
|||
.list-link { |
|||
> a { |
|||
color: $gray-600; |
|||
padding: 4px; |
|||
|
|||
&:hover { |
|||
color: $gray-900; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// User block |
|||
.user-block { |
|||
float: left; |
|||
|
|||
img { |
|||
float: left; |
|||
height: 40px; |
|||
width: 40px; |
|||
} |
|||
|
|||
.username, |
|||
.description, |
|||
.comment { |
|||
display: block; |
|||
margin-left: 50px; |
|||
} |
|||
|
|||
.username { |
|||
font-size: 16px; |
|||
font-weight: 600; |
|||
margin-top: -1px; |
|||
} |
|||
|
|||
.description { |
|||
color: $gray-600; |
|||
font-size: 13px; |
|||
margin-top: -3px; |
|||
} |
|||
|
|||
&.user-block-sm { |
|||
img { |
|||
width: $img-size-sm; |
|||
height: $img-size-sm; |
|||
} |
|||
|
|||
.username, |
|||
.description, |
|||
.comment { |
|||
margin-left: 40px; |
|||
} |
|||
|
|||
.username { |
|||
font-size: 14px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Image sizes |
|||
.img-sm, |
|||
.img-md, |
|||
.img-lg { |
|||
float: left; |
|||
} |
|||
|
|||
.img-sm { |
|||
height: $img-size-sm; |
|||
width: $img-size-sm; |
|||
|
|||
+ .img-push { |
|||
margin-left: $img-size-sm + $img-size-push; |
|||
} |
|||
} |
|||
|
|||
.img-md { |
|||
width: $img-size-md; |
|||
height: $img-size-md; |
|||
|
|||
+ .img-push { |
|||
margin-left: $img-size-md + $img-size-push; |
|||
} |
|||
} |
|||
|
|||
.img-lg { |
|||
width: $img-size-lg; |
|||
height: $img-size-lg; |
|||
|
|||
+ .img-push { |
|||
margin-left: $img-size-lg + $img-size-push; |
|||
} |
|||
} |
|||
|
|||
// Image bordered |
|||
.img-bordered { |
|||
border: 3px solid $gray-500; |
|||
padding: 3px; |
|||
} |
|||
|
|||
.img-bordered-sm { |
|||
border: 2px solid $gray-500; |
|||
padding: 2px; |
|||
} |
|||
|
|||
// Rounded and Circle Images |
|||
.img-rounded { |
|||
@include border-radius($border-radius); |
|||
} |
|||
|
|||
.img-circle { |
|||
@include border-radius(50%); |
|||
} |
|||
|
|||
// Image sizes |
|||
.img-size-64, |
|||
.img-size-50, |
|||
.img-size-32 { |
|||
height: auto; |
|||
} |
|||
|
|||
.img-size-64 { |
|||
width: 64px; |
|||
} |
|||
|
|||
.img-size-50 { |
|||
width: 50px; |
|||
} |
|||
|
|||
.img-size-32 { |
|||
width: 32px; |
|||
} |
|||
|
|||
// Block sizes |
|||
.size-32, |
|||
.size-40, |
|||
.size-50 { |
|||
display: block; |
|||
text-align: center; |
|||
} |
|||
|
|||
.size-32 { |
|||
height: 32px; |
|||
line-height: 32px; |
|||
width: 32px; |
|||
} |
|||
|
|||
.size-40 { |
|||
height: 40px; |
|||
line-height: 40px; |
|||
width: 40px; |
|||
} |
|||
|
|||
.size-50 { |
|||
height: 50px; |
|||
line-height: 50px; |
|||
width: 50px; |
|||
} |
|||
|
|||
// General attachemnt block |
|||
.attachment-block { |
|||
background-color: $gray-100; |
|||
border: 1px solid $card-border-color; |
|||
margin-bottom: 10px; |
|||
padding: 5px; |
|||
|
|||
.attachment-img { |
|||
float: left; |
|||
height: auto; |
|||
max-height: 100px; |
|||
max-width: 100px; |
|||
} |
|||
|
|||
.attachment-pushed { |
|||
margin-left: 110px; |
|||
} |
|||
|
|||
.attachment-heading { |
|||
margin: 0; |
|||
} |
|||
|
|||
.attachment-text { |
|||
color: $gray-700; |
|||
} |
|||
} |
|||
|
|||
// Overlays for Card, InfoBox & SmallBox |
|||
.card, |
|||
.overlay-wrapper, |
|||
.info-box, |
|||
.small-box { |
|||
// Box overlay for LOADING STATE effect |
|||
> .overlay, |
|||
> .loading-img { |
|||
height: 100%; |
|||
left: 0; |
|||
position: absolute; |
|||
top: 0; |
|||
width: 100%; |
|||
} |
|||
|
|||
.overlay { |
|||
@include border-radius($border-radius); |
|||
align-items: center; |
|||
background-color: rgba($white, .7); |
|||
display: flex; |
|||
justify-content: center; |
|||
z-index: 50; |
|||
|
|||
> .fa, |
|||
> .fas, |
|||
> .far, |
|||
> .fab, |
|||
> .fal, |
|||
> .fad, |
|||
> .svg-inline--fa, |
|||
> .ion { |
|||
color: $gray-800; |
|||
} |
|||
|
|||
&.dark { |
|||
background-color: rgba($black, .5); |
|||
|
|||
> .fa, |
|||
> .fas, |
|||
> .far, |
|||
> .fab, |
|||
> .fal, |
|||
> .fad, |
|||
> .svg-inline--fa, |
|||
> .ion { |
|||
color: $gray-400; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.tab-pane { |
|||
// Box overlay for LOADING STATE effect on Tab Panels |
|||
> .overlay-wrapper { |
|||
position: relative; |
|||
> .overlay { |
|||
border-top-left-radius: 0; |
|||
border-top-right-radius: 0; |
|||
flex-direction: column; |
|||
margin-top: -$card-spacer-x; |
|||
margin-left: -$card-spacer-x; |
|||
height: calc(100% + 2 * #{$card-spacer-x}); |
|||
width: calc(100% + 2 * #{$card-spacer-x}); |
|||
|
|||
&.dark { |
|||
color: $white; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Ribbon |
|||
.ribbon-wrapper { |
|||
height: $ribbon-wrapper-size; |
|||
overflow: hidden; |
|||
position: absolute; |
|||
right: -2px; |
|||
top: -2px; |
|||
width: $ribbon-wrapper-size; |
|||
z-index: 10; |
|||
|
|||
&.ribbon-lg { |
|||
height: $ribbon-lg-wrapper-size; |
|||
width: $ribbon-lg-wrapper-size; |
|||
|
|||
.ribbon { |
|||
right: $ribbon-lg-right; |
|||
top: $ribbon-lg-top; |
|||
width: $ribbon-lg-width; |
|||
} |
|||
} |
|||
|
|||
&.ribbon-xl { |
|||
height: $ribbon-xl-wrapper-size; |
|||
width: $ribbon-xl-wrapper-size; |
|||
|
|||
.ribbon { |
|||
right: $ribbon-xl-right; |
|||
top: $ribbon-xl-top; |
|||
width: $ribbon-xl-width; |
|||
} |
|||
} |
|||
|
|||
.ribbon { |
|||
box-shadow: 0 0 $ribbon-border-size rgba($black, .3); |
|||
font-size: $ribbon-font-size; |
|||
line-height: $ribbon-line-height; |
|||
padding: $ribbon-padding; |
|||
position: relative; |
|||
right: $ribbon-right; |
|||
text-align: center; |
|||
text-shadow: 0 -1px 0 rgba($black, .4); |
|||
text-transform: uppercase; |
|||
top: $ribbon-top; |
|||
transform: rotate(45deg); |
|||
width: $ribbon-width; |
|||
|
|||
&::before, |
|||
&::after { |
|||
border-left: $ribbon-border-size solid transparent; |
|||
border-right: $ribbon-border-size solid transparent; |
|||
border-top: $ribbon-border-size solid #9e9e9e; |
|||
bottom: -$ribbon-border-size; |
|||
content: ""; |
|||
position: absolute; |
|||
} |
|||
|
|||
&::before { |
|||
left: 0; |
|||
} |
|||
|
|||
&::after { |
|||
right: 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Scroll To Top |
|||
.back-to-top { |
|||
bottom: 1.25rem; |
|||
position: fixed; |
|||
right: 1.25rem; |
|||
z-index: $zindex-control-sidebar + 1; |
|||
|
|||
&:focus { |
|||
box-shadow: none; |
|||
} |
|||
} |
|||
|
|||
// Pre |
|||
pre { |
|||
padding: .75rem; |
|||
} |
|||
|
|||
// Blockquotes styles |
|||
blockquote { |
|||
background-color: $white; |
|||
border-left: .7rem solid $primary; |
|||
margin: 1.5em .7rem; |
|||
padding: .5em .7rem; |
|||
|
|||
.box & { |
|||
background-color: $gray-200; |
|||
} |
|||
|
|||
p:last-child { |
|||
margin-bottom: 0; |
|||
} |
|||
|
|||
h1, |
|||
h2, |
|||
h3, |
|||
h4, |
|||
h5, |
|||
h6 { |
|||
color: $primary; |
|||
font-size: 1.25rem; |
|||
font-weight: 600; |
|||
} |
|||
|
|||
@each $color, $value in $theme-colors { |
|||
&.quote-#{$color} { |
|||
border-color: $value; |
|||
|
|||
h1, |
|||
h2, |
|||
h3, |
|||
h4, |
|||
h5, |
|||
h6 { |
|||
color: $value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
@each $color, $value in $colors { |
|||
&.quote-#{$color} { |
|||
border-color: $value; |
|||
|
|||
h1, |
|||
h2, |
|||
h3, |
|||
h4, |
|||
h5, |
|||
h6 { |
|||
color: $value; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
// Tab Custom Content |
|||
|
|||
.tab-custom-content { |
|||
border-top: $nav-tabs-border-width solid $nav-tabs-border-color; |
|||
margin-top: .5rem; |
|||
padding-top: .5rem; |
|||
} |
|||
|
|||
.nav + .tab-custom-content { |
|||
border-top: none; |
|||
border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color; |
|||
margin-top: 0; |
|||
margin-bottom: .5rem; |
|||
padding-bottom: .5rem; |
|||
} |
|||
|
|||
|
|||
// Badge BTN Style |
|||
.badge-btn { |
|||
border-radius: $button-border-radius-xs; |
|||
font-size: $button-font-size-xs; |
|||
font-weight: 400; |
|||
padding: $button-padding-y-xs * 2 $button-padding-x-xs * 2; |
|||
} |
|||
|
|||
.badge-btn.badge-pill { |
|||
padding: .375rem .6rem; |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
a:not(.btn):hover { |
|||
color: lighten($link-color, 10%); |
|||
} |
|||
.attachment-block { |
|||
background-color: lighten($dark, 3.75%); |
|||
|
|||
.attachment-text { |
|||
color: $gray-400; |
|||
} |
|||
} |
|||
blockquote { |
|||
background-color: lighten($dark, 5%); |
|||
|
|||
@each $color, $value in $theme-colors { |
|||
&.quote-#{$color} { |
|||
border-color: $value; |
|||
|
|||
h1, |
|||
h2, |
|||
h3, |
|||
h4, |
|||
h5, |
|||
h6 { |
|||
color: $value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
@each $color, $value in $colors { |
|||
&.quote-#{$color} { |
|||
border-color: $value; |
|||
|
|||
h1, |
|||
h2, |
|||
h3, |
|||
h4, |
|||
h5, |
|||
h6 { |
|||
color: $value; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.close, |
|||
.mailbox-attachment-close { |
|||
color: $gray-500; |
|||
text-shadow: 0 1px 0 $gray-700; |
|||
} |
|||
.tab-custom-content { |
|||
border-color: $gray-600; |
|||
} |
|||
.list-group-item { |
|||
background-color: $dark; |
|||
border-color: $gray-600; |
|||
} |
|||
} |
|||
@ -0,0 +1,17 @@ |
|||
// |
|||
// General: Mixins |
|||
// |
|||
|
|||
@import "mixins/animations"; |
|||
@import "mixins/scrollbar"; |
|||
@import "mixins/cards"; |
|||
@import "mixins/sidebar"; |
|||
@import "mixins/navbar"; |
|||
@import "mixins/accent"; |
|||
@import "mixins/custom-forms"; |
|||
@import "mixins/backgrounds"; |
|||
@import "mixins/dark-mode"; |
|||
@import "mixins/direct-chat"; |
|||
@import "mixins/toasts"; |
|||
@import "mixins/touch-support"; |
|||
@import "mixins/miscellaneous"; |
|||
@ -0,0 +1,76 @@ |
|||
// |
|||
// Component: Modals |
|||
// |
|||
|
|||
// Overlay |
|||
.modal-dialog { |
|||
.overlay { |
|||
display: flex; |
|||
position: absolute; |
|||
left: 0; |
|||
top: 0; |
|||
bottom: 0; |
|||
right: 0; |
|||
margin: -$modal-content-border-width; |
|||
z-index: ($zindex-modal + 2); |
|||
justify-content: center; |
|||
align-items: center; |
|||
background-color: rgba($black, .7); |
|||
color: darken($gray-600, 2.5%); |
|||
@include border-radius($modal-content-border-radius); |
|||
} |
|||
} |
|||
|
|||
|
|||
// BG Color Variations Fixes |
|||
.modal-content { |
|||
&.bg-warning { |
|||
.modal-header, |
|||
.modal-footer { |
|||
border-color: $gray-800; |
|||
} |
|||
} |
|||
|
|||
&.bg-primary, |
|||
&.bg-secondary, |
|||
&.bg-info, |
|||
&.bg-danger, |
|||
&.bg-success, { |
|||
.close { |
|||
color: $white; |
|||
text-shadow: 0 1px 0 $black; |
|||
} |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.modal-header, |
|||
.modal-footer { |
|||
border-color: $gray-600; |
|||
} |
|||
.modal-content { |
|||
background-color: $dark; |
|||
|
|||
&.bg-warning { |
|||
.modal-header, |
|||
.modal-footer { |
|||
border-color: $gray-600; |
|||
} |
|||
.close { |
|||
color: $dark !important; |
|||
text-shadow: 0 1px 0 $gray-700 !important; |
|||
} |
|||
} |
|||
|
|||
&.bg-primary, |
|||
&.bg-secondary, |
|||
&.bg-info, |
|||
&.bg-danger, |
|||
&.bg-success { |
|||
.modal-header, |
|||
.modal-footer { |
|||
border-color: $white; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,182 @@ |
|||
// |
|||
// Component: Nav |
|||
// |
|||
|
|||
.nav-pills { |
|||
.nav-link { |
|||
color: $gray-600; |
|||
|
|||
&:not(.active):hover { |
|||
color: theme-color("primary"); |
|||
} |
|||
} |
|||
|
|||
.nav-item { |
|||
&.dropdown.show { |
|||
.nav-link:hover { |
|||
color: $dropdown-link-active-color; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Vertical Tabs |
|||
.nav-tabs.flex-column { |
|||
border-bottom: 0; |
|||
border-right: $nav-tabs-border-width solid $nav-tabs-border-color; |
|||
|
|||
.nav-link { |
|||
border-bottom-left-radius: $nav-tabs-border-radius; |
|||
border-top-right-radius: 0; |
|||
margin-right: -$nav-tabs-border-width; |
|||
|
|||
@include hover-focus () { |
|||
border-color: $gray-200 transparent $gray-200 $gray-200; |
|||
} |
|||
} |
|||
|
|||
.nav-link.active, |
|||
.nav-item.show .nav-link { |
|||
border-color: $gray-300 transparent $gray-300 $gray-300; |
|||
} |
|||
|
|||
&.nav-tabs-right { |
|||
border-left: $nav-tabs-border-width solid $nav-tabs-border-color; |
|||
border-right: 0; |
|||
|
|||
.nav-link { |
|||
border-bottom-left-radius: 0; |
|||
border-bottom-right-radius: $nav-tabs-border-radius; |
|||
border-top-left-radius: 0; |
|||
border-top-right-radius: $nav-tabs-border-radius; |
|||
margin-left: -$nav-tabs-border-width; |
|||
|
|||
@include hover-focus () { |
|||
border-color: $gray-200 $gray-200 $gray-200 transparent; |
|||
} |
|||
} |
|||
|
|||
.nav-link.active, |
|||
.nav-item.show .nav-link { |
|||
border-color: $gray-300 $gray-300 $gray-300 transparent; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.navbar-no-expand { |
|||
flex-direction: row; |
|||
|
|||
.nav-link { |
|||
padding-left: $navbar-nav-link-padding-x; |
|||
padding-right: $navbar-nav-link-padding-x; |
|||
} |
|||
|
|||
.dropdown-menu { |
|||
position: absolute; |
|||
} |
|||
} |
|||
|
|||
// Color variants |
|||
@each $color, $value in $theme-colors { |
|||
@if $color == dark or $color == light { |
|||
.navbar-#{$color} { |
|||
background-color: $value; |
|||
@if $color == dark { |
|||
border-color: lighten($dark, 10%); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
@each $color, $value in $theme-colors { |
|||
@if $color != dark and $color != light { |
|||
@include navbar-variant($color, $value); |
|||
} |
|||
} |
|||
|
|||
@each $color, $value in $colors { |
|||
@include navbar-variant($color, $value); |
|||
} |
|||
|
|||
.navbar-nav-not-expanded { |
|||
flex-direction: row; |
|||
|
|||
.dropdown-menu { |
|||
position: absolute; |
|||
} |
|||
|
|||
.nav-link { |
|||
padding-right: $navbar-nav-link-padding-x; |
|||
padding-left: $navbar-nav-link-padding-x; |
|||
} |
|||
} |
|||
|
|||
|
|||
@include dark-mode () { |
|||
.nav-pills .nav-link { |
|||
color: $gray-400; |
|||
} |
|||
|
|||
.nav-tabs { |
|||
border-color: lighten($dark, 15%); |
|||
|
|||
.nav-link:focus, |
|||
.nav-link:hover { |
|||
border-color: lighten($dark, 15%); |
|||
} |
|||
|
|||
.nav-item.show .nav-link, |
|||
.nav-link.active { |
|||
background-color: $dark; |
|||
border-color: lighten($dark, 15%) lighten($dark, 15%) transparent lighten($dark, 15%); |
|||
color: $white; |
|||
} |
|||
|
|||
&.flex-column { |
|||
.nav-item.show .nav-link, |
|||
.nav-link { |
|||
&.active, |
|||
&:focus, |
|||
&:hover { |
|||
border-color: lighten($dark, 15%) transparent lighten($dark, 15%) lighten($dark, 15%); |
|||
} |
|||
&:focus, |
|||
&:hover { |
|||
background-color: lighten($dark, 5%); |
|||
} |
|||
} |
|||
&.nav-tabs-right { |
|||
border-color: lighten($dark, 15%); |
|||
.nav-link { |
|||
&.active, |
|||
&:focus, |
|||
&:hover { |
|||
border-color: lighten($dark, 15%) lighten($dark, 15%) lighten($dark, 15%) transparent; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Color variants |
|||
@each $color, $value in $theme-colors-alt { |
|||
@if $color == dark or $color == light { |
|||
.navbar-#{$color} { |
|||
background-color: $value; |
|||
@if $color == dark { |
|||
border-color: lighten($dark, 10%); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
@each $color, $value in $theme-colors-alt { |
|||
@if $color != dark and $color != light { |
|||
@include navbar-variant($color, $value); |
|||
} |
|||
} |
|||
|
|||
@each $color, $value in $colors-alt { |
|||
@include navbar-variant($color, $value); |
|||
} |
|||
} |
|||
@ -0,0 +1,83 @@ |
|||
// |
|||
// Component: Pagination |
|||
// |
|||
|
|||
.pagination-month { |
|||
.page-item { |
|||
justify-self: stretch; |
|||
|
|||
.page-link { |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
flex-direction: column; |
|||
box-shadow: none; |
|||
} |
|||
&:first-child, |
|||
&:last-child { |
|||
.page-link { |
|||
height: 100%; |
|||
font-size: $font-size-lg; |
|||
} |
|||
} |
|||
.page-month { |
|||
margin-bottom: 0; |
|||
font-size: $font-size-lg; |
|||
font-weight: $font-weight-bold; |
|||
} |
|||
.page-year { |
|||
margin-bottom: 0; |
|||
} |
|||
} |
|||
|
|||
&.pagination-lg { |
|||
.page-month { |
|||
font-size: ($font-size-lg * 1.25); |
|||
} |
|||
} |
|||
&.pagination-sm { |
|||
.page-month { |
|||
font-size: ($font-size-base); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.page-item { |
|||
&.disabled a, |
|||
&.disabled .page-link { |
|||
background-color: lighten($dark, 2.5%) !important; |
|||
border-color: $gray-600 !important; |
|||
color: $gray-600; |
|||
} |
|||
|
|||
.page-link { |
|||
color: $primary-alt; |
|||
} |
|||
|
|||
&.active { |
|||
.page-link { |
|||
background-color: $primary-alt; |
|||
border-color: $primary-alt; |
|||
color: $white; |
|||
|
|||
&:hover, |
|||
&:focus { |
|||
color: $gray-400 !important; |
|||
} |
|||
} |
|||
} |
|||
&:not(.active) { |
|||
.page-link { |
|||
background-color: $dark; |
|||
border-color: $gray-600; |
|||
|
|||
&:hover, |
|||
&:focus { |
|||
color: lighten($primary-alt, 5%); |
|||
background-color: lighten($dark, 5%); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,24 @@ |
|||
// |
|||
// Core: Preloader |
|||
// |
|||
|
|||
.preloader { |
|||
display: flex; |
|||
background-color: $main-bg; |
|||
height: 100vh; |
|||
width: 100%; |
|||
transition: height 200ms linear; |
|||
position: fixed; |
|||
left: 0; |
|||
top: 0; |
|||
z-index: $zindex-preloader; |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.preloader { |
|||
background-color: $dark-main-bg; |
|||
color: $white; |
|||
} |
|||
} |
|||
|
|||
// |
|||
@ -0,0 +1,52 @@ |
|||
// |
|||
// Misc: Print |
|||
// |
|||
|
|||
@media print { |
|||
//Add to elements that you do not want to show when printing |
|||
.no-print { |
|||
display: none !important; |
|||
} |
|||
|
|||
//Elements that we want to hide when printing |
|||
.main-sidebar, |
|||
.main-header, |
|||
.content-header { |
|||
@extend .no-print; |
|||
} |
|||
|
|||
//This is the only element that should appear, so let's remove the margins |
|||
.content-wrapper, |
|||
.main-footer { |
|||
@include translate(0, 0); |
|||
margin-left: 0 !important; |
|||
min-height: 0 !important; |
|||
} |
|||
|
|||
.layout-fixed .content-wrapper { |
|||
padding-top: 0 !important; |
|||
} |
|||
|
|||
//Invoice printing |
|||
.invoice { |
|||
border: 0; |
|||
margin: 0; |
|||
padding: 0; |
|||
width: 100%; |
|||
} |
|||
|
|||
.invoice-col { |
|||
float: left; |
|||
width: 33.3333333%; |
|||
} |
|||
|
|||
//Make sure table content displays properly |
|||
.table-responsive { |
|||
overflow: auto; |
|||
|
|||
> .table tr th, |
|||
> .table tr td { |
|||
white-space: normal !important; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,68 @@ |
|||
// |
|||
// Component: Products |
|||
// |
|||
|
|||
.products-list { |
|||
list-style: none; |
|||
margin: 0; |
|||
padding: 0; |
|||
|
|||
> .item { |
|||
@include clearfix (); |
|||
|
|||
@if $enable-rounded { |
|||
@include border-radius($border-radius); |
|||
} |
|||
|
|||
background-color: $white; |
|||
padding: 10px 0; |
|||
|
|||
} |
|||
|
|||
.product-img { |
|||
float: left; |
|||
|
|||
img { |
|||
height: 50px; |
|||
width: 50px; |
|||
} |
|||
} |
|||
|
|||
.product-info { |
|||
margin-left: 60px; |
|||
} |
|||
|
|||
.product-title { |
|||
font-weight: 600; |
|||
} |
|||
|
|||
.product-description { |
|||
color: $gray-600; |
|||
display: block; |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
white-space: nowrap; |
|||
} |
|||
} |
|||
|
|||
.product-list-in-card > .item { |
|||
@include border-radius(0); |
|||
border-bottom: 1px solid $card-border-color; |
|||
|
|||
&:last-of-type { |
|||
border-bottom-width: 0; |
|||
} |
|||
} |
|||
|
|||
|
|||
@include dark-mode () { |
|||
.products-list > .item { |
|||
background-color: $dark; |
|||
color: $white; |
|||
border-bottom-color: $gray-600; |
|||
} |
|||
|
|||
.product-description { |
|||
color: $gray-400; |
|||
} |
|||
} |
|||
@ -0,0 +1,72 @@ |
|||
// |
|||
// Component: Progress Bar |
|||
// |
|||
|
|||
//General CSS |
|||
.progress { |
|||
@include box-shadow(none); |
|||
@include border-radius($progress-bar-border-radius); |
|||
|
|||
// Vertical bars |
|||
&.vertical { |
|||
display: inline-block; |
|||
height: 200px; |
|||
margin-right: 10px; |
|||
position: relative; |
|||
width: 30px; |
|||
|
|||
> .progress-bar { |
|||
bottom: 0; |
|||
position: absolute; |
|||
width: 100%; |
|||
} |
|||
|
|||
//Sizes |
|||
&.sm, |
|||
&.progress-sm { |
|||
width: 20px; |
|||
} |
|||
|
|||
&.xs, |
|||
&.progress-xs { |
|||
width: 10px; |
|||
} |
|||
|
|||
&.xxs, |
|||
&.progress-xxs { |
|||
width: 3px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.progress-group { |
|||
margin-bottom: map-get($spacers, 2); |
|||
} |
|||
|
|||
// size variation |
|||
.progress-sm { |
|||
height: 10px; |
|||
} |
|||
|
|||
.progress-xs { |
|||
height: 7px; |
|||
} |
|||
|
|||
.progress-xxs { |
|||
height: 3px; |
|||
} |
|||
|
|||
// Remove margins from progress bars when put in a table |
|||
.table { |
|||
tr > td { |
|||
.progress { |
|||
margin: 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.progress { |
|||
background: lighten($dark, 7.5%); |
|||
} |
|||
} |
|||
@ -0,0 +1,14 @@ |
|||
@include dark-mode () { |
|||
:root { |
|||
// Custom variable values only support SassScript inside `#{}`. |
|||
@each $color, $value in $colors-alt { |
|||
--#{$color}: #{$value}; |
|||
} |
|||
|
|||
@each $color, $value in $theme-colors-alt { |
|||
--#{$color}: #{$value}; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// |
|||
@ -0,0 +1,508 @@ |
|||
// |
|||
// Component: Sidebar Mini |
|||
// |
|||
|
|||
// Logo style |
|||
.logo-xs, |
|||
.logo-xl { |
|||
opacity: 1; |
|||
position: absolute; |
|||
visibility: visible; |
|||
|
|||
&.brand-image-xs { |
|||
left: 18px; |
|||
top: 12px; |
|||
} |
|||
|
|||
&.brand-image-xl { |
|||
left: 12px; |
|||
top: 6px; |
|||
} |
|||
} |
|||
|
|||
.logo-xs { |
|||
opacity: 0; |
|||
visibility: hidden; |
|||
|
|||
&.brand-image-xl { |
|||
left: 16px; |
|||
top: 8px; |
|||
} |
|||
} |
|||
|
|||
.brand-link { |
|||
&.logo-switch { |
|||
&::before { |
|||
content: "\00a0"; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Add sidebar-mini class to the body tag to activate this feature |
|||
.sidebar-mini { |
|||
@include media-breakpoint-up(lg) { |
|||
@include sidebar-mini-breakpoint (); |
|||
} |
|||
} |
|||
@include media-breakpoint-down(md) { |
|||
.sidebar-mini.sidebar-collapse .main-sidebar { |
|||
box-shadow: none !important; |
|||
} |
|||
} |
|||
|
|||
.sidebar-mini-md { |
|||
@include media-breakpoint-up(md) { |
|||
@include sidebar-mini-breakpoint (); |
|||
} |
|||
} |
|||
@include media-breakpoint-down(sm) { |
|||
.sidebar-mini-md.sidebar-collapse .main-sidebar { |
|||
box-shadow: none !important; |
|||
} |
|||
} |
|||
|
|||
.sidebar-mini-xs { |
|||
@include media-breakpoint-up(xs) { |
|||
@include sidebar-mini-breakpoint (); |
|||
} |
|||
} |
|||
|
|||
.sidebar-mini, |
|||
.sidebar-mini-md, |
|||
.sidebar-mini-xs { |
|||
.main-sidebar { |
|||
.nav-child-indent .nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - #{$sidebar-padding-x} * 2 - 1rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - #{$sidebar-padding-x} * 2 - 2rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - #{$sidebar-padding-x} * 2 - 3rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - #{$sidebar-padding-x} * 2 - 4rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - #{$sidebar-padding-x} * 2 - 5rem); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.nav-legacy { |
|||
.nav-link { |
|||
width: $sidebar-width; |
|||
} |
|||
&.nav-child-indent { |
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - 1rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - 1rem - 1rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - 1rem - 2rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - 1rem - 3rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - 1rem - 4rem); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.nav-flat { |
|||
.nav-link { |
|||
width: $sidebar-width; |
|||
} |
|||
&.nav-child-indent { |
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width}); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .2rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .2rem * 2); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .2rem * 3); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .2rem * 4); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.nav-child-indent.nav-compact .nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - #{$sidebar-padding-x} * 2 - .5rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - #{$sidebar-padding-x} * 2 - 1rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - #{$sidebar-padding-x} * 2 - 1.5rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - #{$sidebar-padding-x} * 2 - 2rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - #{$sidebar-padding-x} * 2 - 2.5rem); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.nav-child-indent.nav-legacy.nav-compact { |
|||
.nav-link { |
|||
width: $sidebar-width; |
|||
} |
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .5rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .5rem * 2); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .5rem * 3); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .5rem * 4); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .5rem * 5); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - #{$sidebar-padding-x} * 2); |
|||
@include transition(width $transition-fn $transition-speed); |
|||
} |
|||
} |
|||
} |
|||
|
|||
.sidebar-collapse { |
|||
&.sidebar-mini, |
|||
&.sidebar-mini-md, |
|||
&.sidebar-mini-xs { |
|||
.main-sidebar { |
|||
|
|||
// Hide the sidebar search results when mini mode is active. |
|||
.sidebar-search-results { |
|||
display: none; |
|||
} |
|||
|
|||
.nav-sidebar { |
|||
.nav-link { |
|||
width: $sidebar-mini-width - $sidebar-padding-x * 2; |
|||
} |
|||
|
|||
&.nav-flat, |
|||
&.nav-legacy { |
|||
.nav-link { |
|||
width: $sidebar-mini-width; |
|||
} |
|||
} |
|||
&.nav-child-indent.nav-compact { |
|||
.nav-treeview { |
|||
padding-left: 0 !important; |
|||
margin-left: 0 !important; |
|||
} |
|||
|
|||
.nav-link { |
|||
width: calc(#{$sidebar-mini-width} - #{$sidebar-padding-x} * 2); |
|||
} |
|||
} |
|||
} |
|||
|
|||
&.sidebar-focused, |
|||
&:hover { |
|||
&:not(.hide-nav-header-on-hover) { |
|||
.nav-header { |
|||
display: inline-block; |
|||
} |
|||
} |
|||
|
|||
// Show sidebar search when hover/focus on the sidebar mini mode. |
|||
&:not(.sidebar-no-expand) { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - #{$sidebar-padding-x} * 2); |
|||
} |
|||
.form-control-sidebar { |
|||
display: inline-block; |
|||
} |
|||
.form-control-sidebar ~ .input-group-append { |
|||
display: flex; |
|||
} |
|||
.sidebar-search-open .sidebar-search-results { |
|||
display: inline-block; |
|||
} |
|||
} |
|||
|
|||
.nav-child-indent { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - #{$sidebar-padding-x} * 2); |
|||
} |
|||
} |
|||
.nav-legacy { |
|||
.nav-link { |
|||
width: $sidebar-width; |
|||
} |
|||
&.nav-child-indent { |
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - 1rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - 1rem - 1rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - 1rem - 2rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - 1rem - 3rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - 1rem - 4rem); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.nav-flat { |
|||
.nav-link { |
|||
width: $sidebar-width; |
|||
} |
|||
&.nav-child-indent { |
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width}); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .2rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .2rem * 2); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .2rem * 3); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .2rem * 4); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.nav-child-indent.nav-compact { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - #{$sidebar-padding-x} * 2); |
|||
} |
|||
} |
|||
.nav-child-indent.nav-legacy.nav-compact { |
|||
.nav-link { |
|||
width: $sidebar-width; |
|||
} |
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .5rem); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .5rem * 2); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .5rem * 3); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .5rem * 4); |
|||
} |
|||
|
|||
.nav-treeview { |
|||
.nav-link { |
|||
width: calc(#{$sidebar-width} - .5rem * 5); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.sidebar-no-expand.main-sidebar.sidebar-focused, |
|||
.sidebar-no-expand.main-sidebar:hover { |
|||
width: $sidebar-mini-width; |
|||
|
|||
.nav-header { |
|||
display: none; |
|||
} |
|||
|
|||
.brand-link { |
|||
width: $sidebar-mini-width !important; |
|||
} |
|||
|
|||
.user-panel .image { |
|||
float: none !important; |
|||
} |
|||
|
|||
.logo-xs { |
|||
animation-name: fadeIn; |
|||
animation-duration: $transition-speed; |
|||
animation-fill-mode: both; |
|||
visibility: visible; |
|||
} |
|||
|
|||
.logo-xl { |
|||
animation-name: fadeOut; |
|||
animation-duration: $transition-speed; |
|||
animation-fill-mode: both; |
|||
visibility: hidden; |
|||
} |
|||
|
|||
.nav-sidebar.nav-child-indent .nav-treeview { |
|||
padding-left: 0; |
|||
} |
|||
|
|||
.sidebar { |
|||
.brand-text, |
|||
.user-panel > .info, |
|||
.nav-sidebar .nav-link p { |
|||
margin-left: -10px; |
|||
animation-name: fadeOut; |
|||
animation-duration: $transition-speed; |
|||
animation-fill-mode: both; |
|||
visibility: hidden; |
|||
display: inline-block; |
|||
width: 0; |
|||
} |
|||
|
|||
.nav-sidebar > .nav-item .nav-icon { |
|||
margin-right: 0; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.nav-sidebar { |
|||
position: relative; |
|||
|
|||
&:hover { |
|||
overflow: visible; |
|||
} |
|||
} |
|||
|
|||
.sidebar-form, |
|||
.nav-sidebar > .nav-header { |
|||
overflow: hidden; |
|||
text-overflow: clip; |
|||
} |
|||
|
|||
.nav-sidebar .nav-item > .nav-link { |
|||
position: relative; |
|||
|
|||
> .float-right { |
|||
margin-top: -7px; |
|||
position: absolute; |
|||
right: 10px; |
|||
top: 50%; |
|||
} |
|||
} |
|||
|
|||
.sidebar .nav-link p, |
|||
.main-sidebar .brand-text, |
|||
.main-sidebar .logo-xs, |
|||
.main-sidebar .logo-xl, |
|||
.sidebar .user-panel .info { |
|||
@include transition(margin-left $transition-speed linear, opacity $transition-speed ease, visibility $transition-speed ease); |
|||
} |
|||
@ -0,0 +1,165 @@ |
|||
// |
|||
// Component: Small Box |
|||
// |
|||
|
|||
.small-box { |
|||
@include border-radius($border-radius); |
|||
@include box-shadow($card-shadow); |
|||
|
|||
display: block; |
|||
margin-bottom: 20px; |
|||
position: relative; |
|||
|
|||
// content wrapper |
|||
> .inner { |
|||
padding: 10px; |
|||
} |
|||
|
|||
> .small-box-footer { |
|||
background-color: rgba($black, .1); |
|||
color: rgba($white, .8); |
|||
display: block; |
|||
padding: 3px 0; |
|||
position: relative; |
|||
text-align: center; |
|||
text-decoration: none; |
|||
z-index: 10; |
|||
|
|||
&:hover { |
|||
background-color: rgba($black, .15); |
|||
color: $white; |
|||
} |
|||
} |
|||
|
|||
h3 { |
|||
@include font-size(2.2rem); |
|||
font-weight: 700; |
|||
margin: 0 0 10px; |
|||
padding: 0; |
|||
white-space: nowrap; |
|||
} |
|||
|
|||
@include media-breakpoint-up(lg) { |
|||
.col-xl-2 &, |
|||
.col-lg-2 &, |
|||
.col-md-2 & { |
|||
h3 { |
|||
@include font-size(1.6rem); |
|||
} |
|||
} |
|||
|
|||
.col-xl-3 &, |
|||
.col-lg-3 &, |
|||
.col-md-3 & { |
|||
h3 { |
|||
@include font-size(1.6rem); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@include media-breakpoint-up(xl) { |
|||
.col-xl-2 &, |
|||
.col-lg-2 &, |
|||
.col-md-2 & { |
|||
h3 { |
|||
@include font-size(2.2rem); |
|||
} |
|||
} |
|||
|
|||
.col-xl-3 &, |
|||
.col-lg-3 &, |
|||
.col-md-3 & { |
|||
h3 { |
|||
@include font-size(2.2rem); |
|||
} |
|||
} |
|||
} |
|||
|
|||
p { |
|||
font-size: 1rem; |
|||
|
|||
> small { |
|||
color: $gray-100; |
|||
display: block; |
|||
font-size: .9rem; |
|||
margin-top: 5px; |
|||
} |
|||
} |
|||
|
|||
h3, |
|||
p { |
|||
z-index: 5; |
|||
} |
|||
|
|||
// the icon |
|||
.icon { |
|||
color: rgba($black, .15); |
|||
z-index: 0; |
|||
|
|||
> i { |
|||
font-size: 90px; |
|||
position: absolute; |
|||
right: 15px; |
|||
top: 15px; |
|||
transition: transform $transition-speed linear; |
|||
|
|||
&.fa, |
|||
&.fas, |
|||
&.far, |
|||
&.fab, |
|||
&.fal, |
|||
&.fad, |
|||
&.ion { |
|||
font-size: 70px; |
|||
top: 20px; |
|||
} |
|||
} |
|||
|
|||
svg { |
|||
font-size: 70px; |
|||
position: absolute; |
|||
right: 15px; |
|||
top: 15px; |
|||
transition: transform $transition-speed linear; |
|||
} |
|||
} |
|||
|
|||
// Small box hover state |
|||
&:hover { |
|||
text-decoration: none; |
|||
|
|||
// Animate icons on small box hover |
|||
.icon { |
|||
> i { |
|||
&, |
|||
&.fa, |
|||
&.fas, |
|||
&.far, |
|||
&.fab, |
|||
&.fal, |
|||
&.fad, |
|||
&.ion { |
|||
transform: scale(1.1); |
|||
} |
|||
} |
|||
> svg { |
|||
transform: scale(1.1); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
@include media-breakpoint-down(sm) { |
|||
// No need for icons on very small devices |
|||
.small-box { |
|||
text-align: center; |
|||
|
|||
.icon { |
|||
display: none; |
|||
} |
|||
|
|||
p { |
|||
font-size: 12px; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,93 @@ |
|||
// |
|||
// Component: Social Widgets |
|||
// |
|||
|
|||
//General widget style |
|||
.card-widget { |
|||
border: 0; |
|||
position: relative; |
|||
} |
|||
|
|||
//User Widget Style 1 |
|||
.widget-user { |
|||
|
|||
//User name container |
|||
.widget-user-header { |
|||
@if $enable-rounded { |
|||
@include border-top-radius($border-radius); |
|||
} |
|||
|
|||
height: 135px; |
|||
padding: 1rem; |
|||
text-align: center; |
|||
} |
|||
|
|||
//User name |
|||
.widget-user-username { |
|||
font-size: 25px; |
|||
font-weight: 300; |
|||
margin-bottom: 0; |
|||
margin-top: 0; |
|||
text-shadow: 0 1px 1px rgba($black, .2); |
|||
} |
|||
|
|||
//User single line description |
|||
.widget-user-desc { |
|||
margin-top: 0; |
|||
} |
|||
|
|||
//User image container |
|||
.widget-user-image { |
|||
left: 50%; |
|||
margin-left: -45px; |
|||
position: absolute; |
|||
top: 80px; |
|||
|
|||
> img { |
|||
border: 3px solid $white; |
|||
height: auto; |
|||
width: 90px; |
|||
} |
|||
} |
|||
|
|||
.card-footer { |
|||
padding-top: 50px; |
|||
} |
|||
} |
|||
|
|||
//User Widget Style 2 |
|||
.widget-user-2 { |
|||
|
|||
//User name container |
|||
.widget-user-header { |
|||
@include border-top-radius($border-radius); |
|||
padding: 1rem; |
|||
} |
|||
|
|||
//User name |
|||
.widget-user-username { |
|||
font-size: 25px; |
|||
font-weight: 300; |
|||
margin-bottom: 5px; |
|||
margin-top: 5px; |
|||
} |
|||
|
|||
//User single line description |
|||
.widget-user-desc { |
|||
margin-top: 0; |
|||
} |
|||
|
|||
.widget-user-username, |
|||
.widget-user-desc { |
|||
margin-left: 75px; |
|||
} |
|||
|
|||
//User image container |
|||
.widget-user-image { |
|||
> img { |
|||
float: left; |
|||
height: auto; |
|||
width: 65px; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,175 @@ |
|||
// |
|||
// Component: Table |
|||
// |
|||
|
|||
.table { |
|||
&:not(.table-dark) { |
|||
color: inherit; |
|||
} |
|||
|
|||
// fixed table head |
|||
&.table-head-fixed { |
|||
thead tr:nth-child(1) th { |
|||
background-color: $white; |
|||
border-bottom: 0; |
|||
box-shadow: inset 0 1px 0 $table-border-color, inset 0 -1px 0 $table-border-color; |
|||
position: sticky; |
|||
top: 0; |
|||
z-index: 10; |
|||
} |
|||
|
|||
&.table-dark { |
|||
thead tr { |
|||
&:nth-child(1) th { |
|||
background-color: $table-dark-bg; |
|||
box-shadow: inset 0 1px 0 $table-dark-border-color, inset 0 -1px 0 $table-dark-border-color; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// no border |
|||
&.no-border { |
|||
&, |
|||
td, |
|||
th { |
|||
border: 0; |
|||
} |
|||
} |
|||
|
|||
// .text-center in tables |
|||
&.text-center { |
|||
&, |
|||
td, |
|||
th { |
|||
text-align: center; |
|||
} |
|||
} |
|||
|
|||
&.table-valign-middle { |
|||
thead > tr > th, |
|||
thead > tr > td, |
|||
tbody > tr > th, |
|||
tbody > tr > td { |
|||
vertical-align: middle; |
|||
} |
|||
} |
|||
|
|||
.card-body.p-0 & { |
|||
thead > tr > th, |
|||
thead > tr > td, |
|||
tfoot > tr > th, |
|||
tfoot > tr > td, |
|||
tbody > tr > th, |
|||
tbody > tr > td { |
|||
&:first-of-type { |
|||
padding-left: map-get($spacers, 4); |
|||
} |
|||
|
|||
&:last-of-type { |
|||
padding-right: map-get($spacers, 4); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Expandable Table |
|||
|
|||
.table-hover tbody tr.expandable-body:hover { |
|||
background-color: inherit !important; |
|||
} |
|||
|
|||
[data-widget="expandable-table"] { |
|||
cursor: pointer; |
|||
|
|||
i.expandable-table-caret { |
|||
transition: transform $transition-speed linear; |
|||
} |
|||
&[aria-expanded="true"] { |
|||
i.expandable-table-caret { |
|||
// stylelint-disable selector-max-attribute |
|||
&[class*="right"] { |
|||
transform: rotate(90deg); |
|||
} |
|||
&[class*="left"] { |
|||
transform: rotate(-90deg); |
|||
} |
|||
// stylelint-enable selector-max-attribute |
|||
} |
|||
} |
|||
} |
|||
|
|||
[aria-expanded="true"] { |
|||
cursor: pointer; |
|||
|
|||
i.expandable-table-caret { |
|||
transition: transform $transition-speed linear; |
|||
} |
|||
[data-widget="expandable-table"] { |
|||
i.expandable-table-caret { |
|||
// stylelint-disable selector-max-attribute |
|||
&[class*="right"] { |
|||
transform: rotate(90deg); |
|||
} |
|||
&[class*="left"] { |
|||
transform: rotate(-90deg); |
|||
} |
|||
// stylelint-enable selector-max-attribute |
|||
} |
|||
} |
|||
} |
|||
|
|||
.expandable-body { |
|||
> td { |
|||
padding: 0 !important; |
|||
width: 100%; |
|||
|
|||
> div, |
|||
> p { |
|||
padding: $table-cell-padding; |
|||
} |
|||
} |
|||
|
|||
.table { |
|||
width: calc(100% - #{$table-cell-padding}); |
|||
margin: 0 0 0 $table-cell-padding; |
|||
|
|||
tr:first-child { |
|||
td, |
|||
th { |
|||
border-top: none; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.table-bordered { |
|||
&, |
|||
td, |
|||
th { |
|||
border-color: $gray-600; |
|||
} |
|||
} |
|||
.table-hover { |
|||
tbody tr:hover { |
|||
color: $gray-300; |
|||
background-color: lighten($dark, 2.5%); |
|||
border-color: $gray-600; |
|||
} |
|||
} |
|||
.table { |
|||
thead th { |
|||
border-bottom-color: $gray-600; |
|||
} |
|||
th, |
|||
td { |
|||
border-top-color: $gray-600; |
|||
} |
|||
&.table-head-fixed { |
|||
thead tr:nth-child(1) th { |
|||
background-color: lighten($dark, 5%); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,51 @@ |
|||
// |
|||
// Component: Text |
|||
// |
|||
|
|||
// text modification |
|||
.text-bold { |
|||
&, |
|||
&.table td, |
|||
&.table th { |
|||
font-weight: 700; |
|||
} |
|||
} |
|||
|
|||
.text-xs { |
|||
font-size: $font-size-xs !important; |
|||
} |
|||
|
|||
.text-sm { |
|||
font-size: $font-size-sm !important; |
|||
} |
|||
|
|||
.text-md { |
|||
font-size: $font-size-base !important; |
|||
} |
|||
|
|||
.text-lg { |
|||
font-size: $font-size-lg !important; |
|||
} |
|||
|
|||
.text-xl { |
|||
font-size: $font-size-xl !important; |
|||
} |
|||
|
|||
// text color variations |
|||
@each $name, $color in $colors { |
|||
.text-#{$name} { |
|||
color: #{$color} !important; |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.text-muted { |
|||
color: $gray-500 !important; |
|||
} |
|||
|
|||
@each $name, $color in $colors-alt { |
|||
.text-#{$name} { |
|||
color: #{$color} !important; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,155 @@ |
|||
// |
|||
// Component: Timeline |
|||
// |
|||
|
|||
.timeline { |
|||
margin: 0 0 45px; |
|||
padding: 0; |
|||
position: relative; |
|||
// The line |
|||
&::before { |
|||
@include border-radius($border-radius); |
|||
background-color: $gray-300; |
|||
bottom: 0; |
|||
content: ""; |
|||
left: 31px; |
|||
margin: 0; |
|||
position: absolute; |
|||
top: 0; |
|||
width: 4px; |
|||
} |
|||
// Element |
|||
> div { |
|||
&::before, |
|||
&::after { |
|||
content: ""; |
|||
display: table; |
|||
} |
|||
|
|||
margin-bottom: 15px; |
|||
margin-right: 10px; |
|||
position: relative; |
|||
// The content |
|||
> .timeline-item { |
|||
@include box-shadow($card-shadow); |
|||
@include border-radius($border-radius); |
|||
background-color: $white; |
|||
color: $gray-700; |
|||
margin-left: 60px; |
|||
margin-right: 15px; |
|||
margin-top: 0; |
|||
padding: 0; |
|||
position: relative; |
|||
// The time and header |
|||
> .time { |
|||
color: #999; |
|||
float: right; |
|||
font-size: 12px; |
|||
padding: 10px; |
|||
} |
|||
// Header |
|||
> .timeline-header { |
|||
border-bottom: 1px solid $card-border-color; |
|||
color: $gray-700; |
|||
font-size: 16px; |
|||
line-height: 1.1; |
|||
margin: 0; |
|||
padding: 10px; |
|||
// Link in header |
|||
> a { |
|||
font-weight: 600; |
|||
} |
|||
} |
|||
// Item body and footer |
|||
> .timeline-body, |
|||
> .timeline-footer { |
|||
padding: 10px; |
|||
} |
|||
|
|||
> .timeline-body { |
|||
> img { |
|||
margin: 10px; |
|||
} |
|||
> dl, |
|||
ol, |
|||
ul { |
|||
margin: 0; |
|||
} |
|||
} |
|||
|
|||
> .timeline-footer { |
|||
> a { |
|||
color: $white; |
|||
} |
|||
} |
|||
} |
|||
// The icons at line |
|||
> .fa, |
|||
> .fas, |
|||
> .far, |
|||
> .fab, |
|||
> .fal, |
|||
> .fad, |
|||
> .svg-inline--fa, |
|||
> .ion { |
|||
background-color: $gray-500; |
|||
border-radius: 50%; |
|||
font-size: 16px; |
|||
height: 30px; |
|||
left: 18px; |
|||
line-height: 30px; |
|||
position: absolute; |
|||
text-align: center; |
|||
top: 0; |
|||
width: 30px; |
|||
} |
|||
> .svg-inline--fa { |
|||
padding: 7px; |
|||
} |
|||
} |
|||
// Time label |
|||
> .time-label { |
|||
> span { |
|||
@include border-radius(4px); |
|||
background-color: $white; |
|||
display: inline-block; |
|||
font-weight: 600; |
|||
padding: 5px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.timeline-inverse { |
|||
> div { |
|||
> .timeline-item { |
|||
@include box-shadow(none); |
|||
background-color: $gray-100; |
|||
border: 1px solid $gray-300; |
|||
|
|||
> .timeline-header { |
|||
border-bottom-color: $gray-300; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.timeline { |
|||
&::before { |
|||
background-color: $gray-600; |
|||
} |
|||
> div > .timeline-item { |
|||
background-color: $dark; |
|||
color: $white; |
|||
border-color: $gray-600; |
|||
|
|||
> .timeline-header { |
|||
color: $gray-400; |
|||
border-color: $gray-600; |
|||
} |
|||
> .time { |
|||
color: $gray-400; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,77 @@ |
|||
// |
|||
// Component: Toasts |
|||
// |
|||
|
|||
.toasts-top-right { |
|||
position: absolute; |
|||
right: 0; |
|||
top: 0; |
|||
z-index: $zindex-toasts; |
|||
|
|||
&.fixed { |
|||
position: fixed; |
|||
} |
|||
} |
|||
|
|||
.toasts-top-left { |
|||
left: 0; |
|||
position: absolute; |
|||
top: 0; |
|||
z-index: $zindex-toasts; |
|||
|
|||
&.fixed { |
|||
position: fixed; |
|||
} |
|||
} |
|||
|
|||
.toasts-bottom-right { |
|||
bottom: 0; |
|||
position: absolute; |
|||
right: 0; |
|||
z-index: $zindex-toasts; |
|||
|
|||
&.fixed { |
|||
position: fixed; |
|||
} |
|||
} |
|||
|
|||
.toasts-bottom-left { |
|||
bottom: 0; |
|||
left: 0; |
|||
position: absolute; |
|||
z-index: $zindex-toasts; |
|||
|
|||
&.fixed { |
|||
position: fixed; |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.toast { |
|||
background-color: rgba($dark, .85); |
|||
color: $white; |
|||
|
|||
.toast-header { |
|||
background-color: rgba($dark, .7); |
|||
color: $gray-100; |
|||
} |
|||
|
|||
@each $name, $color in $theme-colors-alt { |
|||
@include toast-variant($name, $color); |
|||
} |
|||
|
|||
@each $name, $color in $colors-alt { |
|||
@include toast-variant($name, $color); |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
.toast { |
|||
@each $name, $color in $theme-colors { |
|||
@include toast-variant($name, $color); |
|||
} |
|||
@each $name, $color in $colors { |
|||
@include toast-variant($name, $color); |
|||
} |
|||
} |
|||
@ -0,0 +1,54 @@ |
|||
// |
|||
// Component: Users List |
|||
// |
|||
|
|||
.users-list { |
|||
@include list-unstyled (); |
|||
|
|||
> li { |
|||
float: left; |
|||
padding: 10px; |
|||
text-align: center; |
|||
width: 25%; |
|||
|
|||
img { |
|||
@include border-radius(50%); |
|||
height: auto; |
|||
max-width: 100%; |
|||
} |
|||
|
|||
> a:hover { |
|||
&, |
|||
.users-list-name { |
|||
color: #999; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.users-list-name, |
|||
.users-list-date { |
|||
display: block; |
|||
} |
|||
|
|||
.users-list-name { |
|||
color: $gray-700; |
|||
font-size: $font-size-sm; |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
white-space: nowrap; |
|||
} |
|||
|
|||
.users-list-date { |
|||
color: darken($gray-500, 20%); |
|||
font-size: 12px; |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.users-list-name { |
|||
color: $gray-400; |
|||
} |
|||
.users-list-date { |
|||
color: $gray-500; |
|||
} |
|||
} |
|||
@ -0,0 +1,107 @@ |
|||
// |
|||
// Core: Variables for Dark Mode |
|||
// |
|||
|
|||
// COLORS |
|||
// -------------------------------------------------------- |
|||
|
|||
// stylelint-disable |
|||
// Gray color will be default in dark mode |
|||
$white-alt: $white !default; |
|||
$gray-100-alt: $gray-100 !default; |
|||
$gray-200-alt: $gray-200 !default; |
|||
$gray-300-alt: $gray-300 !default; |
|||
$gray-400-alt: $gray-400 !default; |
|||
$gray-500-alt: $gray-500 !default; |
|||
$gray-600-alt: $gray-600 !default; |
|||
$gray-700-alt: $gray-700 !default; |
|||
$gray-800-alt: $gray-800 !default; |
|||
$gray-900-alt: $gray-900 !default; |
|||
$black-alt: $black !default; |
|||
|
|||
$grays-alt: () !default; |
|||
$grays-alt: map-merge(( |
|||
"100": $gray-100-alt, |
|||
"200": $gray-200-alt, |
|||
"300": $gray-300-alt, |
|||
"400": $gray-400-alt, |
|||
"500": $gray-500-alt, |
|||
"600": $gray-600-alt, |
|||
"700": $gray-700-alt, |
|||
"800": $gray-800-alt, |
|||
"900": $gray-900-alt |
|||
), $grays-alt); |
|||
|
|||
// Below colors from bootwatch darkly |
|||
$blue-alt: #3f6791 !default; |
|||
$indigo-alt: #6610f2 !default; |
|||
$purple-alt: #6f42c1 !default; |
|||
$pink-alt: #e83e8c !default; |
|||
$red-alt: #e74c3c !default; |
|||
$orange-alt: #fd7e14 !default; |
|||
$yellow-alt: #f39c12 !default; |
|||
$green-alt: #00bc8c !default; |
|||
$teal-alt: #20c997 !default; |
|||
$cyan-alt: #3498db !default; |
|||
|
|||
// by darken function |
|||
$lightblue-alt: lighten(#3c8dbc, 20%) !default; |
|||
$navy-alt: lighten(#001f3f, 5%) !default; |
|||
$olive-alt: lighten(#3d9970, 20%) !default; |
|||
$lime-alt: lighten(#01ff70, 20%) !default; |
|||
$fuchsia-alt: lighten(#f012be, 20%) !default; |
|||
$maroon-alt: lighten(#d81b60, 20%) !default; |
|||
$gray-x-light-alt: lighten(#d2d6de, 20%) !default; |
|||
|
|||
$colors-alt: () !default; |
|||
$colors-alt: map-merge(( |
|||
"blue": $blue-alt, |
|||
"indigo": $indigo-alt, |
|||
"purple": $purple-alt, |
|||
"pink": $pink-alt, |
|||
"red": $red-alt, |
|||
"orange": $orange-alt, |
|||
"yellow": $yellow-alt, |
|||
"green": $green-alt, |
|||
"teal": $teal-alt, |
|||
"cyan": $cyan-alt, |
|||
"white": $white-alt, |
|||
"gray": $gray-600-alt, |
|||
"gray-dark": $gray-800-alt |
|||
), $colors-alt); |
|||
|
|||
$primary-alt: $blue-alt !default; |
|||
$secondary-alt: $gray-600-alt !default; |
|||
$success-alt: $green-alt !default; |
|||
$info-alt: $cyan-alt !default; |
|||
$warning-alt: $yellow-alt !default; |
|||
$danger-alt: $red-alt !default; |
|||
$light-alt: $gray-100-alt !default; |
|||
$dark-alt: $gray-800-alt !default; |
|||
|
|||
$theme-colors-alt: () !default; |
|||
$theme-colors-alt: map-merge(( |
|||
"primary": $primary-alt, |
|||
"secondary": $secondary-alt, |
|||
"success": $success-alt, |
|||
"info": $info-alt, |
|||
"warning": $warning-alt, |
|||
"danger": $danger-alt, |
|||
"light": $light-alt, |
|||
"dark": $dark-alt |
|||
), $theme-colors-alt); |
|||
|
|||
$colors-alt: map-merge( |
|||
( |
|||
"lightblue": $lightblue-alt, |
|||
"navy": $navy-alt, |
|||
"olive": $olive-alt, |
|||
"lime": $lime-alt, |
|||
"fuchsia": $fuchsia-alt, |
|||
"maroon": $maroon-alt, |
|||
), |
|||
$colors-alt |
|||
); |
|||
// stylelint-enable |
|||
|
|||
// |
|||
@ -0,0 +1,248 @@ |
|||
// |
|||
// Core: Variables |
|||
// |
|||
|
|||
// COLORS |
|||
// -------------------------------------------------------- |
|||
$blue: #0073b7 !default; |
|||
$lightblue: #3c8dbc !default; |
|||
$navy: #001f3f !default; |
|||
$teal: #39cccc !default; |
|||
$olive: #3d9970 !default; |
|||
$lime: #01ff70 !default; |
|||
$orange: #ff851b !default; |
|||
$fuchsia: #f012be !default; |
|||
$purple: #605ca8 !default; |
|||
$maroon: #d81b60 !default; |
|||
$black: #111 !default; |
|||
$gray-x-light: #d2d6de !default; |
|||
|
|||
$colors: map-merge( |
|||
( |
|||
"lightblue": $lightblue, |
|||
"navy": $navy, |
|||
"olive": $olive, |
|||
"lime": $lime, |
|||
"fuchsia": $fuchsia, |
|||
"maroon": $maroon, |
|||
), |
|||
$colors |
|||
); |
|||
|
|||
// LAYOUT |
|||
// -------------------------------------------------------- |
|||
|
|||
$font-size-root: 1rem !default; |
|||
|
|||
// Sidebar |
|||
$sidebar-width: 250px !default; |
|||
$sidebar-padding-x: .5rem !default; |
|||
$sidebar-padding-y: 0 !default; |
|||
$sidebar-custom-height: 4rem !default; |
|||
$sidebar-custom-height-lg: 6rem !default; |
|||
$sidebar-custom-height-xl: 8rem !default; |
|||
$sidebar-custom-padding-x: .85rem !default; |
|||
$sidebar-custom-padding-y: .5rem !default; |
|||
|
|||
// Boxed layout maximum width |
|||
$boxed-layout-max-width: 1250px !default; |
|||
|
|||
// Body background (Affects main content background only) |
|||
$main-bg: #f4f6f9 !default; |
|||
|
|||
$dark-main-bg: lighten($dark, 7.5%) !important; |
|||
|
|||
// Content padding |
|||
$content-padding-y: 0 !default; |
|||
$content-padding-x: $navbar-padding-x !default; |
|||
|
|||
// IMAGE SIZES |
|||
// -------------------------------------------------------- |
|||
$img-size-sm: 1.875rem !default; |
|||
$img-size-md: 3.75rem !default; |
|||
$img-size-lg: 6.25rem !default; |
|||
$img-size-push: .625rem !default; |
|||
|
|||
// MAIN HEADER |
|||
// -------------------------------------------------------- |
|||
$main-header-bottom-border-width: $border-width !default; |
|||
$main-header-bottom-border-color: $gray-300 !default; |
|||
$main-header-bottom-border: $main-header-bottom-border-width solid $main-header-bottom-border-color !default; |
|||
$main-header-link-padding-y: $navbar-padding-y !default; |
|||
$main-header-height-inner: ($nav-link-height + ($main-header-link-padding-y * 2)) !default; |
|||
$main-header-height: calc(#{$main-header-height-inner} + #{$main-header-bottom-border-width}) !default; |
|||
$nav-link-sm-padding-y: .35rem !default; |
|||
$nav-link-sm-height: ($font-size-sm * $line-height-sm + $nav-link-sm-padding-y * 1.785) !default; |
|||
$main-header-height-sm-inner: ($nav-link-sm-height + ($main-header-link-padding-y * 2)) !default; |
|||
$main-header-height-sm: calc(#{$main-header-height-sm-inner} + #{$main-header-bottom-border-width}) !default; |
|||
|
|||
|
|||
// Main header skins |
|||
$main-header-dark-form-control-bg: $gray-800 !default; |
|||
$main-header-dark-form-control-focused-bg: $gray-700 !default; |
|||
$main-header-dark-form-control-focused-color: $gray-400 !default; |
|||
$main-header-dark-form-control-border-color: $gray-600 !default; |
|||
$main-header-dark-form-control-focused-border-color: $gray-600 !default; |
|||
$main-header-dark-placeholder-color: rgba($white, .6) !default; |
|||
|
|||
$main-header-light-form-control-bg: darken($gray-200, 5%) !default; |
|||
$main-header-light-form-control-focused-bg: darken($gray-200, 7.5%) !default; |
|||
$main-header-light-form-control-focused-color: $gray-400 !default; |
|||
$main-header-light-form-control-border-color: $gray-400 !default; |
|||
$main-header-light-form-control-focused-border-color: darken($gray-400, 2.5%) !default; |
|||
$main-header-light-placeholder-color: rgba(0, 0, 0, .6) !default; |
|||
|
|||
// MAIN FOOTER |
|||
// -------------------------------------------------------- |
|||
$main-footer-padding: 1rem !default; |
|||
$main-footer-padding-sm: $main-footer-padding * .812 !default; |
|||
$main-footer-border-top-width: 1px !default; |
|||
$main-footer-border-top-color: $gray-300 !default; |
|||
$main-footer-border-top: $main-footer-border-top-width solid $main-footer-border-top-color !default; |
|||
$main-footer-height-inner: (($font-size-root * $line-height-base) + ($main-footer-padding * 2)) !default; |
|||
$main-footer-height: calc(#{$main-footer-height-inner} + #{$main-footer-border-top-width}) !default; |
|||
$main-footer-height-sm-inner: (($font-size-sm * $line-height-base) + ($main-footer-padding-sm * 2)) !default; |
|||
$main-footer-height-sm: calc(#{$main-footer-height-sm-inner} + #{$main-footer-border-top-width}) !default; |
|||
$main-footer-bg: $white !default; |
|||
|
|||
// SIDEBAR SKINS |
|||
// -------------------------------------------------------- |
|||
|
|||
// Dark sidebar |
|||
$sidebar-dark-bg: $dark !default; |
|||
$sidebar-dark-hover-bg: rgba(255, 255, 255, .1) !default; |
|||
$sidebar-dark-color: #c2c7d0 !default; |
|||
$sidebar-dark-hover-color: $white !default; |
|||
$sidebar-dark-active-color: $white !default; |
|||
$sidebar-dark-submenu-bg: transparent !default; |
|||
$sidebar-dark-submenu-color: #c2c7d0 !default; |
|||
$sidebar-dark-submenu-hover-color: $white !default; |
|||
$sidebar-dark-submenu-hover-bg: $sidebar-dark-hover-bg !default; |
|||
$sidebar-dark-submenu-active-color: $sidebar-dark-bg !default; |
|||
$sidebar-dark-submenu-active-bg: rgba(255, 255, 255, .9) !default; |
|||
|
|||
// Light sidebar |
|||
$sidebar-light-bg: $white !default; |
|||
$sidebar-light-hover-bg: rgba($black, .1) !default; |
|||
$sidebar-light-color: $gray-800 !default; |
|||
$sidebar-light-hover-color: $gray-900 !default; |
|||
$sidebar-light-active-color: $black !default; |
|||
$sidebar-light-submenu-bg: transparent !default; |
|||
$sidebar-light-submenu-color: #777 !default; |
|||
$sidebar-light-submenu-hover-color: $black !default; |
|||
$sidebar-light-submenu-hover-bg: $sidebar-light-hover-bg !default; |
|||
$sidebar-light-submenu-active-color: $sidebar-light-hover-color !default; |
|||
$sidebar-light-submenu-active-bg: $sidebar-light-submenu-hover-bg !default; |
|||
|
|||
// SIDEBAR MINI |
|||
// -------------------------------------------------------- |
|||
$sidebar-mini-width: ($nav-link-padding-x + $sidebar-padding-x + .8rem) * 2 !default; |
|||
$sidebar-nav-icon-width: $sidebar-mini-width - (($sidebar-padding-x + $nav-link-padding-x) * 2) !default; |
|||
$sidebar-user-image-width: $sidebar-nav-icon-width + ($nav-link-padding-x * .5) !default; |
|||
|
|||
// CONTROL SIDEBAR |
|||
// -------------------------------------------------------- |
|||
$control-sidebar-width: $sidebar-width !default; |
|||
|
|||
// Cards |
|||
// -------------------------------------------------------- |
|||
$card-border-color: $gray-100 !default; |
|||
$card-dark-border-color: lighten($gray-900, 10%) !default; |
|||
$card-shadow: 0 0 1px rgba(0, 0, 0, .125), 0 1px 3px rgba(0, 0, 0, .2) !default; |
|||
$card-title-font-size: 1.1rem !default; |
|||
$card-title-font-size-sm: 1rem !default; |
|||
$card-title-font-weight: $font-weight-normal !default; |
|||
$card-nav-link-padding-sm-y: .4rem !default; |
|||
$card-nav-link-padding-sm-x: .8rem !default; |
|||
$card-img-size: $img-size-sm !default; |
|||
|
|||
// PROGRESS BARS |
|||
// -------------------------------------------------------- |
|||
$progress-bar-border-radius: 1px !default; |
|||
|
|||
// DIRECT CHAT |
|||
// -------------------------------------------------------- |
|||
$direct-chat-default-msg-bg: $gray-x-light !default; |
|||
$direct-chat-default-font-color: #444 !default; |
|||
$direct-chat-default-msg-border-color: $gray-x-light !default; |
|||
|
|||
// Z-INDEX |
|||
// -------------------------------------------------------- |
|||
$zindex-main-header: $zindex-fixed + 4 !default; |
|||
$zindex-main-sidebar: $zindex-fixed + 8 !default; |
|||
$zindex-main-footer: $zindex-fixed + 2 !default; |
|||
$zindex-control-sidebar: $zindex-fixed + 1 !default; |
|||
$zindex-toasts: $zindex-main-sidebar + 2 !default; |
|||
$zindex-preloader: 9999 !default; |
|||
|
|||
// TRANSITIONS SETTINGS |
|||
// -------------------------------------------------------- |
|||
|
|||
// Transition global options |
|||
$transition-speed: .3s !default; |
|||
$transition-fn: ease-in-out !default; |
|||
|
|||
// TEXT |
|||
// -------------------------------------------------------- |
|||
$font-size-xs: ($font-size-base * .75) !default; |
|||
$font-size-xl: ($font-size-base * 2) !default; |
|||
|
|||
|
|||
// BUTTON |
|||
// -------------------------------------------------------- |
|||
$button-default-background-color: $gray-100 !default; |
|||
$button-default-color: #444 !default; |
|||
$button-default-border-color: #ddd !default; |
|||
|
|||
$button-padding-y-xs: .125rem !default; |
|||
$button-padding-x-xs: .25rem !default; |
|||
$button-line-height-xs: $line-height-sm !default; |
|||
$button-font-size-xs: ($font-size-base * .75) !default; |
|||
$button-border-radius-xs: .15rem !default; |
|||
|
|||
|
|||
// ELEVATION |
|||
// -------------------------------------------------------- |
|||
$elevations: (); |
|||
$elevations: map-merge( |
|||
( |
|||
1: unquote("0 1px 3px " + rgba($black, .12) + ", 0 1px 2px " + rgba($black, .24)), |
|||
2: unquote("0 3px 6px " + rgba($black, .16) + ", 0 3px 6px " + rgba($black, .23)), |
|||
3: unquote("0 10px 20px " + rgba($black, .19) + ", 0 6px 6px " + rgba($black, .23)), |
|||
4: unquote("0 14px 28px " + rgba($black, .25) + ", 0 10px 10px " + rgba($black, .22)), |
|||
5: unquote("0 19px 38px " + rgba($black, .3) + ", 0 15px 12px " + rgba($black, .22)), |
|||
), |
|||
$elevations |
|||
); |
|||
|
|||
// RIBBON |
|||
// -------------------------------------------------------- |
|||
$ribbon-border-size: 3px !default; |
|||
$ribbon-line-height: 100% !default; |
|||
$ribbon-padding: .375rem 0 !default; |
|||
$ribbon-font-size: .8rem !default; |
|||
$ribbon-width: 90px !default; |
|||
$ribbon-wrapper-size: 70px !default; |
|||
$ribbon-top: 10px !default; |
|||
$ribbon-right: -2px !default; |
|||
$ribbon-lg-wrapper-size: 120px !default; |
|||
$ribbon-lg-width: 160px !default; |
|||
$ribbon-lg-top: 26px !default; |
|||
$ribbon-lg-right: 0 !default; |
|||
$ribbon-xl-wrapper-size: 180px !default; |
|||
$ribbon-xl-width: 240px !default; |
|||
$ribbon-xl-top: 47px !default; |
|||
$ribbon-xl-right: 4px !default; |
|||
|
|||
// CUSTOM FORM SELECT |
|||
// -------------------------------------------------------- |
|||
|
|||
$custom-select-dark-indicator-color: $white !default; |
|||
$custom-select-dark-indicator: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'><path fill='#{$custom-select-dark-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/></svg>") !default; |
|||
$custom-select-dark-background: escape-svg($custom-select-dark-indicator) right $custom-select-padding-x center / $custom-select-bg-size no-repeat !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon) |
|||
|
|||
// ENABLE DARK MODE |
|||
// -------------------------------------------------------- |
|||
$enable-dark-mode: true !default; // requires `@import "variables-alt";` |
|||
|
|||
// |
|||
@ -0,0 +1,25 @@ |
|||
/*! |
|||
* AdminLTE v3.2.0 |
|||
* Author: Colorlib |
|||
* Website: AdminLTE.io <https://adminlte.io> |
|||
* License: Open source - MIT <https://opensource.org/licenses/MIT> |
|||
*/ |
|||
|
|||
// Bootstrap |
|||
// --------------------------------------------------- |
|||
@import "~bootstrap/scss/functions"; |
|||
@import "bootstrap-variables"; |
|||
@import "~bootstrap/scss/bootstrap"; |
|||
|
|||
// Variables and Mixins |
|||
// --------------------------------------------------- |
|||
@import "variables"; |
|||
@import "variables-alt"; |
|||
@import "mixins"; |
|||
|
|||
@import "parts/core"; |
|||
@import "parts/components"; |
|||
@import "parts/extra-components"; |
|||
@import "parts/pages"; |
|||
@import "parts/plugins"; |
|||
@import "parts/miscellaneous"; |
|||
@ -0,0 +1,106 @@ |
|||
// |
|||
// Mixins: Accent |
|||
// |
|||
|
|||
// Accent Variant |
|||
@mixin accent-variant($name, $color) { |
|||
$link-color: $color; |
|||
.accent-#{$name} { |
|||
$link-hover-color: darken($color, 15%); |
|||
$pagination-active-bg: $color; |
|||
$pagination-active-border-color: $color; |
|||
|
|||
.btn-link, |
|||
a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.badge):not(.btn), |
|||
.nav-tabs .nav-link { |
|||
color: $link-color; |
|||
|
|||
@include hover () { |
|||
color: $link-hover-color; |
|||
} |
|||
} |
|||
|
|||
.dropdown-item { |
|||
&:active, |
|||
&.active { |
|||
background-color: $color; |
|||
color: color-yiq($color); |
|||
} |
|||
} |
|||
|
|||
.custom-control-input:checked ~ .custom-control-label { |
|||
&::before { |
|||
background-color: $color; |
|||
border-color: darken($color, 20%); |
|||
} |
|||
|
|||
&::after { |
|||
$new-color: color-yiq($color); |
|||
background-image: str-replace($custom-checkbox-indicator-icon-checked, str-replace(#{$custom-control-indicator-checked-color}, "#", "%23"), str-replace(#{$new-color}, "#", "%23")); |
|||
} |
|||
} |
|||
|
|||
.form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid), |
|||
.custom-select:focus, |
|||
.custom-control-input:focus:not(:checked) ~ .custom-control-label::before, |
|||
.custom-file-input:focus ~ .custom-file-label { |
|||
border-color: lighten($color, 25%); |
|||
} |
|||
|
|||
.page-item { |
|||
.page-link { |
|||
color: $link-color; |
|||
} |
|||
|
|||
&.active a, |
|||
&.active .page-link { |
|||
background-color: $pagination-active-bg; |
|||
border-color: $pagination-active-border-color; |
|||
color: $pagination-active-color; |
|||
} |
|||
|
|||
&.disabled a, |
|||
&.disabled .page-link { |
|||
background-color: $pagination-disabled-bg; |
|||
border-color: $pagination-disabled-border-color; |
|||
color: $pagination-disabled-color; |
|||
} |
|||
} |
|||
|
|||
[class*="sidebar-dark-"] { |
|||
.sidebar { |
|||
a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link) { |
|||
color: $sidebar-dark-color; |
|||
|
|||
@include hover () { |
|||
color: $sidebar-dark-hover-color; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
[class*="sidebar-light-"] { |
|||
.sidebar { |
|||
a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link) { |
|||
color: $sidebar-light-color; |
|||
|
|||
@include hover () { |
|||
color: $sidebar-light-hover-color; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@include dark-mode () { |
|||
&.accent-#{$name} { |
|||
.page-item { |
|||
.page-link { |
|||
&:hover, |
|||
&:focus { |
|||
color: lighten($link-color, 5%); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,119 @@ |
|||
// |
|||
// Mixins: Animation |
|||
// |
|||
|
|||
|
|||
@keyframes flipInX { |
|||
0% { |
|||
transform: perspective(400px) rotate3d(1, 0, 0, 90deg); |
|||
transition-timing-function: ease-in; |
|||
opacity: 0; |
|||
} |
|||
|
|||
40% { |
|||
transform: perspective(400px) rotate3d(1, 0, 0, -20deg); |
|||
transition-timing-function: ease-in; |
|||
} |
|||
|
|||
60% { |
|||
transform: perspective(400px) rotate3d(1, 0, 0, 10deg); |
|||
opacity: 1; |
|||
} |
|||
|
|||
80% { |
|||
transform: perspective(400px) rotate3d(1, 0, 0, -5deg); |
|||
} |
|||
|
|||
100% { |
|||
transform: perspective(400px); |
|||
} |
|||
} |
|||
|
|||
|
|||
@keyframes fadeIn { |
|||
from { |
|||
opacity: 0; |
|||
} |
|||
|
|||
to { |
|||
opacity: 1; |
|||
} |
|||
} |
|||
|
|||
@keyframes fadeOut { |
|||
from { |
|||
opacity: 1; |
|||
} |
|||
|
|||
to { |
|||
opacity: 0; |
|||
} |
|||
} |
|||
|
|||
@keyframes shake { |
|||
0% { |
|||
transform: translate(2px, 1px) rotate(0deg); |
|||
} |
|||
10% { |
|||
transform: translate(-1px, -2px) rotate(-2deg); |
|||
} |
|||
20% { |
|||
transform: translate(-3px, 0) rotate(3deg); |
|||
} |
|||
30% { |
|||
transform: translate(0, 2px) rotate(0deg); |
|||
} |
|||
40% { |
|||
transform: translate(1px, -1px) rotate(1deg); |
|||
} |
|||
50% { |
|||
transform: translate(-1px, 2px) rotate(-1deg); |
|||
} |
|||
60% { |
|||
transform: translate(-3px, 1px) rotate(0deg); |
|||
} |
|||
70% { |
|||
transform: translate(2px, 1px) rotate(-2deg); |
|||
} |
|||
80% { |
|||
transform: translate(-1px, -1px) rotate(4deg); |
|||
} |
|||
90% { |
|||
transform: translate(2px, 2px) rotate(0deg); |
|||
} |
|||
100% { |
|||
transform: translate(1px, -2px) rotate(-1deg); |
|||
} |
|||
} |
|||
|
|||
@keyframes wobble { |
|||
0% { |
|||
transform: none; |
|||
} |
|||
|
|||
15% { |
|||
transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); |
|||
} |
|||
|
|||
30% { |
|||
transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); |
|||
} |
|||
|
|||
45% { |
|||
transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); |
|||
} |
|||
|
|||
60% { |
|||
transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); |
|||
} |
|||
|
|||
75% { |
|||
transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); |
|||
} |
|||
|
|||
100% { |
|||
transform: none; |
|||
} |
|||
} |
|||
|
|||
// |
|||
@ -0,0 +1,69 @@ |
|||
// |
|||
// Mixins: Backgrounds |
|||
// |
|||
|
|||
// Background Variant |
|||
@mixin background-variant($name, $color) { |
|||
&.bg-#{$name} { |
|||
background-color: #{$color} !important; |
|||
|
|||
&, |
|||
> a { |
|||
color: color-yiq($color) !important; |
|||
} |
|||
|
|||
&.btn { |
|||
&:hover { |
|||
border-color: darken($color, 10%); |
|||
color: darken(color-yiq($color), 7.5%); |
|||
} |
|||
|
|||
&:not(:disabled):not(.disabled):active, |
|||
&:not(:disabled):not(.disabled).active, |
|||
&:active, |
|||
&.active { |
|||
background-color: darken($color, 10%) !important; |
|||
border-color: darken($color, 12.5%); |
|||
color: color-yiq(darken($color, 10%)); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Background Gradient Variant |
|||
@mixin background-gradient-variant($name, $color) { |
|||
.bg-gradient-#{$name} { |
|||
background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important; |
|||
color: color-yiq($color); |
|||
|
|||
&.btn { |
|||
&:not(:disabled):not(.disabled):active, |
|||
&:not(:disabled):not(.disabled).active, |
|||
.show > &.dropdown-toggle { |
|||
background-image: none !important; |
|||
} |
|||
|
|||
&:hover { |
|||
background: $color linear-gradient(180deg, mix($body-bg, darken($color, 7.5%), 15%), darken($color, 7.5%)) repeat-x !important; |
|||
border-color: darken($color, 10%); |
|||
color: darken(color-yiq($color), 7.5%); |
|||
} |
|||
|
|||
&:not(:disabled):not(.disabled):active, |
|||
&:not(:disabled):not(.disabled).active, |
|||
&:active, |
|||
&.active { |
|||
background: $color linear-gradient(180deg, mix($body-bg, darken($color, 10%), 15%), darken($color, 10%)) repeat-x !important; |
|||
border-color: darken($color, 12.5%); |
|||
color: color-yiq(darken($color, 10%)); |
|||
} |
|||
|
|||
&:disabled, |
|||
&.disabled { |
|||
background-image: none !important; |
|||
border-color: $color; |
|||
color: color-yiq($color); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,82 @@ |
|||
// |
|||
// Mixins: Cards Variant |
|||
// |
|||
|
|||
@mixin cards-variant($name, $color) { |
|||
.card-#{$name} { |
|||
&:not(.card-outline) { |
|||
> .card-header { |
|||
background-color: $color; |
|||
|
|||
&, |
|||
a { |
|||
color: color-yiq($color); |
|||
} |
|||
|
|||
a.active { |
|||
color: color-yiq($white); |
|||
} |
|||
} |
|||
} |
|||
|
|||
&.card-outline { |
|||
border-top: 3px solid $color; |
|||
} |
|||
|
|||
&.card-outline-tabs { |
|||
> .card-header { |
|||
a:hover{ |
|||
border-top: 3px solid $nav-tabs-border-color; |
|||
} |
|||
a.active, |
|||
a.active:hover{ |
|||
border-top: 3px solid $color; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.bg-#{$name}, |
|||
.bg-gradient-#{$name}, |
|||
.card-#{$name}:not(.card-outline) { |
|||
> .card-header { |
|||
.btn-tool { |
|||
color: rgba(color-yiq($color), .8); |
|||
|
|||
&:hover { |
|||
color: color-yiq($color); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.card.bg-#{$name}, |
|||
.card.bg-gradient-#{$name} { |
|||
.bootstrap-datetimepicker-widget { |
|||
.table td, |
|||
.table th { |
|||
border: none; |
|||
} |
|||
|
|||
table thead tr:first-child th:hover, |
|||
table td.day:hover, |
|||
table td.hour:hover, |
|||
table td.minute:hover, |
|||
table td.second:hover { |
|||
background-color: darken($color, 8%); |
|||
color: color-yiq($color); |
|||
} |
|||
|
|||
table td.today::before { |
|||
border-bottom-color: color-yiq($color); |
|||
} |
|||
|
|||
table td.active, |
|||
table td.active:hover { |
|||
background-color: lighten($color, 10%); |
|||
color: color-yiq($color); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,123 @@ |
|||
// |
|||
// Mixins: Custom Forms |
|||
// |
|||
|
|||
// Custom Switch Variant |
|||
@mixin custom-switch-variant($name, $color) { |
|||
&.custom-switch-off-#{$name} { |
|||
.custom-control-input ~ .custom-control-label::before { |
|||
background-color: #{$color}; |
|||
border-color: darken($color, 20%); |
|||
} |
|||
|
|||
.custom-control-input:focus ~ .custom-control-label::before { |
|||
box-shadow: 0 0 0 1px $body-bg, 0 0 0 2px rgba($color, .25); |
|||
} |
|||
|
|||
.custom-control-input ~ .custom-control-label::after { |
|||
background-color: darken($color, 25%); |
|||
} |
|||
} |
|||
|
|||
&.custom-switch-on-#{$name} { |
|||
.custom-control-input:checked ~ .custom-control-label::before { |
|||
background-color: #{$color}; |
|||
border-color: darken($color, 20%); |
|||
} |
|||
|
|||
.custom-control-input:checked:focus ~ .custom-control-label::before { |
|||
box-shadow: 0 0 0 1px $body-bg, 0 0 0 2px rgba($color, .25); |
|||
} |
|||
|
|||
.custom-control-input:checked ~ .custom-control-label::after { |
|||
background-color: lighten($color, 30%); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Custom Range Variant |
|||
@mixin custom-range-variant($name, $color) { |
|||
&.custom-range-#{$name} { |
|||
&:focus { |
|||
outline: none; |
|||
|
|||
&::-webkit-slider-thumb { |
|||
box-shadow: 0 0 0 1px $body-bg, 0 0 0 2px rgba($color, .25); |
|||
} |
|||
|
|||
&::-moz-range-thumb { |
|||
box-shadow: 0 0 0 1px $body-bg, 0 0 0 2px rgba($color, .25); |
|||
} |
|||
|
|||
&::-ms-thumb { |
|||
box-shadow: 0 0 0 1px $body-bg, 0 0 0 2px rgba($color, .25); |
|||
} |
|||
} |
|||
|
|||
&::-webkit-slider-thumb { |
|||
background-color: $color; |
|||
|
|||
&:active { |
|||
background-color: lighten($color, 35%); |
|||
} |
|||
} |
|||
|
|||
&::-moz-range-thumb { |
|||
background-color: $color; |
|||
|
|||
&:active { |
|||
background-color: lighten($color, 35%); |
|||
} |
|||
} |
|||
|
|||
&::-ms-thumb { |
|||
background-color: $color; |
|||
|
|||
&:active { |
|||
background-color: lighten($color, 35%); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
// Custom Control Input Variant |
|||
@mixin custom-control-input-variant($name, $color) { |
|||
$custom-control-indicator-checked-color: $color; |
|||
$custom-checkbox-indicator-icon-checked: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"), "#", "%23"); |
|||
$custom-radio-indicator-icon-checked: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3E%3C/svg%3E"), "#", "%23"); |
|||
|
|||
.custom-control-input-#{$name} { |
|||
&:checked ~ .custom-control-label::before { |
|||
border-color: $color; |
|||
@include gradient-bg($color); |
|||
} |
|||
|
|||
&.custom-control-input-outline:checked { |
|||
&[type="checkbox"] ~ .custom-control-label::after { |
|||
background-image: $custom-checkbox-indicator-icon-checked !important; |
|||
} |
|||
&[type="radio"] ~ .custom-control-label::after { |
|||
background-image: $custom-radio-indicator-icon-checked !important; |
|||
} |
|||
} |
|||
|
|||
&:focus ~ .custom-control-label::before { |
|||
// the mixin is not used here to make sure there is feedback |
|||
@if $enable-shadows { |
|||
box-shadow: $input-box-shadow, 0 0 0 $input-btn-focus-width rgba($color, .25); |
|||
} @else { |
|||
box-shadow: 0 0 0 $input-btn-focus-width rgba($color, .25); |
|||
} |
|||
} |
|||
|
|||
&:focus:not(:checked) ~ .custom-control-label::before { |
|||
border-color: lighten($color, 25%); |
|||
} |
|||
|
|||
&:not(:disabled):active ~ .custom-control-label::before { |
|||
background-color: lighten($color, 35%); |
|||
border-color: lighten($color, 35%); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
// |
|||
// Mixins: Dark Mode Controll |
|||
// |
|||
|
|||
@mixin dark-mode { |
|||
@if $enable-dark-mode { |
|||
.dark-mode { |
|||
@content; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,17 @@ |
|||
// |
|||
// Mixins: Direct Chat |
|||
// |
|||
|
|||
// Direct Chat Variant |
|||
@mixin direct-chat-variant($bg-color, $color: $white) { |
|||
.right > .direct-chat-text { |
|||
background-color: $bg-color; |
|||
border-color: $bg-color; |
|||
color: color-yiq($bg-color); |
|||
|
|||
&::after, |
|||
&::before { |
|||
border-left-color: $bg-color; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,33 @@ |
|||
// |
|||
// Mixins: Miscellaneous |
|||
// |
|||
|
|||
// ETC |
|||
@mixin translate($x, $y) { |
|||
transform: translate($x, $y); |
|||
} |
|||
|
|||
// Different radius each side |
|||
@mixin border-radius-sides($top-left, $top-right, $bottom-left, $bottom-right) { |
|||
border-radius: $top-left $top-right $bottom-left $bottom-right; |
|||
} |
|||
|
|||
@mixin calc($property, $expression) { |
|||
#{$property}: calc(#{$expression}); |
|||
} |
|||
|
|||
@mixin rotate($value) { |
|||
transform: rotate($value); |
|||
} |
|||
|
|||
@mixin animation($animation) { |
|||
animation: $animation; |
|||
} |
|||
|
|||
// Gradient background |
|||
@mixin gradient($color: #f5f5f5, $start: #eee, $stop: $white) { |
|||
background-color: $color; |
|||
background-image: gradient(linear, left bottom, left top, color-stop(0, $start), color-stop(1, $stop)); |
|||
} |
|||
|
|||
// |
|||
@ -0,0 +1,62 @@ |
|||
// |
|||
// Mixins: Navbar |
|||
// |
|||
|
|||
// Navbar Variant |
|||
@mixin navbar-variant($name, $color) { |
|||
.navbar-#{$name} { |
|||
background-color: $color; |
|||
color: color-yiq($color); |
|||
|
|||
&.navbar-light { |
|||
.form-control-navbar { |
|||
&::placeholder { |
|||
color: rgba($gray-800, .8); |
|||
} |
|||
&, |
|||
+ .input-group-append > .btn-navbar { |
|||
background-color: darken($color, 4%); |
|||
border-color: darken($color, 9%); |
|||
color: rgba($gray-800, .8); |
|||
} |
|||
|
|||
&:focus { |
|||
&::placeholder { |
|||
color: $gray-800; |
|||
} |
|||
&, |
|||
+ .input-group-append .btn-navbar { |
|||
background-color: darken($color, 5%); |
|||
border-color: darken($color, 9%) !important; |
|||
color: $gray-800; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
&.navbar-dark { |
|||
.form-control-navbar { |
|||
&::placeholder { |
|||
color: rgba($white, .8); |
|||
} |
|||
&, |
|||
+ .input-group-append > .btn-navbar { |
|||
background-color: lighten($color, 4%); |
|||
border-color: lighten($color, 9%); |
|||
color: rgba($white, .8); |
|||
} |
|||
|
|||
&:focus { |
|||
&::placeholder { |
|||
color: $white; |
|||
} |
|||
&, |
|||
+ .input-group-append .btn-navbar { |
|||
background-color: lighten($color, 5%); |
|||
border-color: lighten($color, 9%) !important; |
|||
color: $white; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,38 @@ |
|||
// |
|||
// Mixins: Scrollbar |
|||
// |
|||
|
|||
@mixin scrollbar-color-gray() { |
|||
scrollbar-color: #a9a9a9 transparent; |
|||
|
|||
&::-webkit-scrollbar-thumb { |
|||
background-color: #a9a9a9; |
|||
} |
|||
|
|||
&::-webkit-scrollbar-track { |
|||
background-color: transparent; |
|||
} |
|||
|
|||
&::-webkit-scrollbar-corner { |
|||
background-color: transparent; |
|||
} |
|||
} |
|||
|
|||
@mixin scrollbar-width-thin() { |
|||
scrollbar-width: thin; |
|||
|
|||
&::-webkit-scrollbar { |
|||
width: .5rem; |
|||
height: .5rem; |
|||
} |
|||
} |
|||
|
|||
@mixin scrollbar-width-none() { |
|||
scrollbar-width: none; |
|||
|
|||
&::-webkit-scrollbar { |
|||
width: 0; |
|||
} |
|||
} |
|||
|
|||
// |
|||
@ -0,0 +1,167 @@ |
|||
// |
|||
// Mixins: Sidebar |
|||
// |
|||
|
|||
// Sidebar Color |
|||
@mixin sidebar-color($color) { |
|||
.nav-sidebar > .nav-item { |
|||
> .nav-link.active { |
|||
background-color: $color; |
|||
color: color-yiq($color); |
|||
} |
|||
} |
|||
|
|||
.nav-sidebar.nav-legacy > .nav-item { |
|||
> .nav-link.active { |
|||
border-color: $color; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Sidebar Mini Breakpoints |
|||
@mixin sidebar-mini-breakpoint() { |
|||
// A fix for text overflow while transitioning from sidebar mini to full sidebar |
|||
.nav-sidebar, |
|||
.nav-sidebar > .nav-header, |
|||
.nav-sidebar .nav-link { |
|||
white-space: nowrap; |
|||
} |
|||
|
|||
// When the sidebar is collapsed... |
|||
&.sidebar-collapse { |
|||
.d-hidden-mini { |
|||
display: none; |
|||
} |
|||
|
|||
// Apply the new margins to the main content and footer |
|||
.content-wrapper, |
|||
.main-footer, |
|||
.main-header { |
|||
margin-left: $sidebar-mini-width !important; |
|||
} |
|||
|
|||
// Make the sidebar headers |
|||
.nav-sidebar .nav-header { |
|||
display: none; |
|||
} |
|||
|
|||
.sidebar .nav-sidebar .nav-link p { |
|||
width: 0; |
|||
white-space: nowrap; |
|||
} |
|||
|
|||
.sidebar .user-panel > .info, |
|||
.sidebar .nav-sidebar .nav-link p, |
|||
.brand-text { |
|||
margin-left: -10px; |
|||
animation-name: fadeOut; |
|||
animation-duration: $transition-speed; |
|||
animation-fill-mode: both; |
|||
visibility: hidden; |
|||
} |
|||
|
|||
.logo-xl { |
|||
animation-name: fadeOut; |
|||
animation-duration: $transition-speed; |
|||
animation-fill-mode: both; |
|||
visibility: hidden; |
|||
} |
|||
|
|||
.logo-xs { |
|||
display: inline-block; |
|||
animation-name: fadeIn; |
|||
animation-duration: $transition-speed; |
|||
animation-fill-mode: both; |
|||
visibility: visible; |
|||
} |
|||
|
|||
// Modify the sidebar to shrink instead of disappearing |
|||
.main-sidebar { |
|||
overflow-x: hidden; |
|||
|
|||
&, |
|||
&::before { |
|||
// Don't go away! Just shrink |
|||
margin-left: 0; |
|||
width: $sidebar-mini-width; |
|||
} |
|||
|
|||
.user-panel { |
|||
.image { |
|||
float: none; |
|||
} |
|||
} |
|||
|
|||
&:not(.sidebar-no-expand) { |
|||
&:hover, |
|||
&.sidebar-focused { |
|||
width: $sidebar-width; |
|||
|
|||
.brand-link { |
|||
width: $sidebar-width; |
|||
} |
|||
|
|||
.user-panel { |
|||
text-align: left; |
|||
|
|||
.image { |
|||
float: left; |
|||
} |
|||
} |
|||
|
|||
.user-panel > .info, |
|||
.sidebar .nav-sidebar .nav-link p, |
|||
.brand-text, |
|||
.logo-xl { |
|||
display: inline-block; |
|||
margin-left: 0; |
|||
animation-name: fadeIn; |
|||
animation-duration: $transition-speed; |
|||
animation-fill-mode: both; |
|||
visibility: visible; |
|||
} |
|||
|
|||
.logo-xs { |
|||
animation-name: fadeOut; |
|||
animation-duration: $transition-speed; |
|||
animation-fill-mode: both; |
|||
visibility: hidden; |
|||
} |
|||
|
|||
.brand-image { |
|||
margin-right: .5rem; |
|||
} |
|||
|
|||
// Make the sidebar links, menus, labels, badges |
|||
// and angle icons disappear |
|||
.sidebar-form, |
|||
.user-panel > .info { |
|||
display: block !important; |
|||
transform: translateZ(0); |
|||
} |
|||
|
|||
.nav-sidebar > .nav-item > .nav-link > span { |
|||
display: inline-block !important; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Make an element visible only when sidebar mini is active |
|||
.visible-sidebar-mini { |
|||
display: block !important; |
|||
} |
|||
|
|||
&.layout-fixed { |
|||
.main-sidebar:hover { |
|||
.brand-link { |
|||
width: $sidebar-width; |
|||
} |
|||
} |
|||
|
|||
.brand-link { |
|||
width: $sidebar-mini-width; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
// |
|||
// Mixins: Toasts |
|||
// |
|||
|
|||
// Toast Variant |
|||
@mixin toast-variant($name, $color) { |
|||
&.bg-#{$name} { |
|||
background-color: rgba($color, .9) !important; |
|||
@if (color-yiq($color) == $yiq-text-light) { |
|||
|
|||
.close { |
|||
color: color-yiq($color); |
|||
text-shadow: 0 1px 0 $black; |
|||
} |
|||
} |
|||
|
|||
.toast-header { |
|||
background-color: rgba($color, .85); |
|||
color: color-yiq($color); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,11 @@ |
|||
// |
|||
// Mixins: Touch Support |
|||
// |
|||
|
|||
@mixin on-touch-device { |
|||
@media (hover: none) and (pointer: coarse) { |
|||
@content; |
|||
} |
|||
} |
|||
|
|||
// |
|||
@ -0,0 +1,43 @@ |
|||
// |
|||
// Pages: 400 and 500 error pages |
|||
// |
|||
|
|||
.error-page { |
|||
margin: 20px auto 0; |
|||
width: 600px; |
|||
|
|||
@include media-breakpoint-down(sm) { |
|||
width: 100%; |
|||
} |
|||
|
|||
//For the error number e.g: 404 |
|||
> .headline { |
|||
float: left; |
|||
font-size: 100px; |
|||
font-weight: 300; |
|||
|
|||
@include media-breakpoint-down(sm) { |
|||
float: none; |
|||
text-align: center; |
|||
} |
|||
} |
|||
|
|||
//For the message |
|||
> .error-content { |
|||
display: block; |
|||
margin-left: 190px; |
|||
|
|||
@include media-breakpoint-down(sm) { |
|||
margin-left: 0; |
|||
} |
|||
|
|||
> h3 { |
|||
font-size: 25px; |
|||
font-weight: 300; |
|||
|
|||
@include media-breakpoint-down(sm) { |
|||
text-align: center; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,45 @@ |
|||
// |
|||
// Pages: E-commerce |
|||
// |
|||
|
|||
// product image |
|||
.product-image { |
|||
@include img-fluid (); |
|||
width: 100%; |
|||
} |
|||
|
|||
// product image thumbnails list |
|||
.product-image-thumbs { |
|||
align-items: stretch; |
|||
display: flex; |
|||
margin-top: 2rem; |
|||
} |
|||
|
|||
// product image thumbnail |
|||
.product-image-thumb { |
|||
@include box-shadow($thumbnail-box-shadow); |
|||
@include border-radius($thumbnail-border-radius); |
|||
|
|||
background-color: $thumbnail-bg; |
|||
border: $thumbnail-border-width solid $thumbnail-border-color; |
|||
display: flex; |
|||
margin-right: 1rem; |
|||
max-width: 6.5rem + ($thumbnail-padding * 2); |
|||
padding: $thumbnail-padding * 2; |
|||
|
|||
img { |
|||
@include img-fluid (); |
|||
align-self: center; |
|||
} |
|||
|
|||
&:hover { |
|||
opacity: .5; |
|||
} |
|||
} |
|||
|
|||
// product share |
|||
.product-share { |
|||
a { |
|||
margin-right: .5rem; |
|||
} |
|||
} |
|||
@ -0,0 +1,142 @@ |
|||
body.iframe-mode { |
|||
.main-sidebar { |
|||
display: none; |
|||
} |
|||
.content-wrapper { |
|||
margin-left: 0 !important; |
|||
margin-top: 0 !important; |
|||
padding-bottom: 0 !important; |
|||
} |
|||
.main-header, |
|||
.main-footer { |
|||
display: none; |
|||
} |
|||
} |
|||
|
|||
body.iframe-mode-fullscreen { |
|||
overflow: hidden; |
|||
|
|||
&.layout-navbar-fixed .wrapper .content-wrapper { |
|||
margin-top: 0 !important; |
|||
} |
|||
} |
|||
|
|||
.content-wrapper { |
|||
height: 100%; |
|||
|
|||
&.iframe-mode { |
|||
.btn-iframe-close { |
|||
color: $danger; |
|||
position: absolute; |
|||
line-height: 1; |
|||
right: .125rem; |
|||
top: .125rem; |
|||
z-index: 10; |
|||
visibility: hidden; |
|||
|
|||
&:hover, |
|||
&:focus { |
|||
animation-name: fadeIn; |
|||
animation-duration: $transition-speed; |
|||
animation-fill-mode: both; |
|||
visibility: visible; |
|||
} |
|||
|
|||
@include on-touch-device() { |
|||
visibility: visible; |
|||
} |
|||
} |
|||
.navbar-nav { |
|||
overflow-y: auto; |
|||
width: 100%; |
|||
|
|||
.nav-link { |
|||
white-space: nowrap; |
|||
} |
|||
.nav-item { |
|||
position: relative; |
|||
|
|||
&:hover, |
|||
&:focus { |
|||
.btn-iframe-close { |
|||
animation-name: fadeIn; |
|||
animation-duration: $transition-speed; |
|||
animation-fill-mode: both; |
|||
visibility: visible; |
|||
|
|||
@include on-touch-device() { |
|||
visibility: visible; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.tab-content { |
|||
position: relative; |
|||
} |
|||
.tab-pane + .tab-empty { |
|||
display: none; |
|||
} |
|||
.tab-empty { |
|||
width: 100%; |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
} |
|||
.tab-loading { |
|||
position: absolute; |
|||
top: 0; |
|||
left: 0; |
|||
width: 100%; |
|||
display: none; |
|||
background-color: $main-bg; |
|||
|
|||
> div { |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
width: 100%; |
|||
height: 100%; |
|||
} |
|||
} |
|||
|
|||
iframe { |
|||
border: 0; |
|||
width: 100%; |
|||
height: 100%; |
|||
margin-bottom: -8px; |
|||
|
|||
.content-wrapper { |
|||
padding-bottom: 0 !important; |
|||
} |
|||
} |
|||
|
|||
body.iframe-mode-fullscreen & { |
|||
position: absolute; |
|||
left: 0; |
|||
top: 0; |
|||
right: 0; |
|||
bottom: 0; |
|||
margin-left: 0 !important; |
|||
height: 100%; |
|||
min-height: 100%; |
|||
z-index: $zindex-main-sidebar + 10; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.permanent-btn-iframe-close { |
|||
.btn-iframe-close { |
|||
animation: none !important; |
|||
visibility: visible !important; |
|||
opacity: 1; |
|||
} |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.content-wrapper.iframe-mode { |
|||
.tab-loading { |
|||
background-color: $dark; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
// |
|||
// Pages: Invoice |
|||
// |
|||
|
|||
.invoice { |
|||
background-color: $white; |
|||
border: 1px solid $card-border-color; |
|||
position: relative; |
|||
} |
|||
|
|||
.invoice-title { |
|||
margin-top: 0; |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.invoice { |
|||
background-color: $dark; |
|||
} |
|||
} |
|||
@ -0,0 +1,60 @@ |
|||
.content-wrapper.kanban { |
|||
height: 1px; |
|||
|
|||
.content { |
|||
height: 100%; |
|||
overflow-x: auto; |
|||
overflow-y: hidden; |
|||
|
|||
.container, |
|||
.container-fluid { |
|||
width: max-content; |
|||
display: flex; |
|||
align-items: stretch; |
|||
} |
|||
} |
|||
.content-header + .content { |
|||
height: calc(100% - ((2 * 15px) + (1.8rem * #{$headings-line-height}))); |
|||
} |
|||
|
|||
.card { |
|||
.card-body { |
|||
padding: .5rem; |
|||
} |
|||
|
|||
&.card-row { |
|||
width: 340px; |
|||
display: inline-block; |
|||
margin: 0 .5rem; |
|||
|
|||
&:first-child { |
|||
margin-left: 0; |
|||
} |
|||
|
|||
.card-body { |
|||
height: calc(100% - (12px + (1.8rem * #{$headings-line-height}) + .5rem)); |
|||
overflow-y: auto; |
|||
} |
|||
|
|||
.card { |
|||
&:last-child { |
|||
margin-bottom: 0; |
|||
border-bottom-width: 1px; |
|||
} |
|||
.card-header { |
|||
padding: .5rem .75rem; |
|||
} |
|||
.card-body { |
|||
padding: .75rem; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.btn-tool { |
|||
&.btn-link { |
|||
text-decoration: underline; |
|||
padding-left: 0; |
|||
padding-right: 0; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,93 @@ |
|||
// |
|||
// Pages: Lock Screen |
|||
// |
|||
|
|||
// ADD THIS CLASS TO THE <BODY> TAG |
|||
.lockscreen { |
|||
background-color: $gray-200; |
|||
|
|||
// User name [optional] |
|||
.lockscreen-name { |
|||
font-weight: 600; |
|||
text-align: center; |
|||
} |
|||
} |
|||
|
|||
.lockscreen-logo { |
|||
font-size: 35px; |
|||
font-weight: 300; |
|||
margin-bottom: 25px; |
|||
text-align: center; |
|||
|
|||
a { |
|||
color: $gray-700; |
|||
} |
|||
} |
|||
|
|||
.lockscreen-wrapper { |
|||
margin: 0 auto; |
|||
margin-top: 10%; |
|||
max-width: 400px; |
|||
} |
|||
|
|||
|
|||
// Will contain the image and the sign in form |
|||
.lockscreen-item { |
|||
@include border-radius(4px); |
|||
background-color: $white; |
|||
margin: 10px auto 30px; |
|||
padding: 0; |
|||
position: relative; |
|||
width: 290px; |
|||
} |
|||
|
|||
// User image |
|||
.lockscreen-image { |
|||
@include border-radius(50%); |
|||
background-color: $white; |
|||
left: -10px; |
|||
padding: 5px; |
|||
position: absolute; |
|||
top: -25px; |
|||
z-index: 10; |
|||
|
|||
> img { |
|||
@include border-radius(50%); |
|||
height: 70px; |
|||
width: 70px; |
|||
} |
|||
} |
|||
|
|||
// Contains the password input and the login button |
|||
.lockscreen-credentials { |
|||
margin-left: 70px; |
|||
|
|||
.form-control { |
|||
border: 0; |
|||
} |
|||
|
|||
.btn { |
|||
background-color: $white; |
|||
border: 0; |
|||
padding: 0 10px; |
|||
} |
|||
} |
|||
|
|||
.lockscreen-footer { |
|||
margin-top: 10px; |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.lockscreen-item { |
|||
background-color: $dark; |
|||
} |
|||
.lockscreen-logo a { |
|||
color: $white; |
|||
} |
|||
.lockscreen-credentials .btn { |
|||
background-color: $dark; |
|||
} |
|||
.lockscreen-image { |
|||
background-color: $gray-600; |
|||
} |
|||
} |
|||
@ -0,0 +1,118 @@ |
|||
// |
|||
// Pages: Login & Register |
|||
// |
|||
|
|||
.login-logo, |
|||
.register-logo { |
|||
font-size: 2.1rem; |
|||
font-weight: 300; |
|||
margin-bottom: .9rem; |
|||
text-align: center; |
|||
|
|||
a { |
|||
color: $gray-700; |
|||
} |
|||
} |
|||
|
|||
.login-page, |
|||
.register-page { |
|||
align-items: center; |
|||
background-color: $gray-200; |
|||
display: flex; |
|||
flex-direction: column; |
|||
height: 100vh; |
|||
justify-content: center; |
|||
} |
|||
|
|||
.login-box, |
|||
.register-box { |
|||
width: 360px; |
|||
|
|||
@media (max-width: map-get($grid-breakpoints, sm)) { |
|||
margin-top: .5rem; |
|||
width: 90%; |
|||
} |
|||
|
|||
.card { |
|||
margin-bottom: 0; |
|||
} |
|||
} |
|||
|
|||
.login-card-body, |
|||
.register-card-body { |
|||
background-color: $white; |
|||
border-top: 0; |
|||
color: #666; |
|||
padding: 20px; |
|||
|
|||
.input-group { |
|||
.form-control { |
|||
border-right: 0; |
|||
|
|||
&:focus { |
|||
box-shadow: none; |
|||
|
|||
~ .input-group-prepend .input-group-text, |
|||
~ .input-group-append .input-group-text { |
|||
border-color: $input-focus-border-color; |
|||
} |
|||
} |
|||
|
|||
&.is-valid { |
|||
&:focus { |
|||
box-shadow: none; |
|||
} |
|||
|
|||
~ .input-group-prepend .input-group-text, |
|||
~ .input-group-append .input-group-text { |
|||
border-color: $success; |
|||
} |
|||
} |
|||
|
|||
&.is-invalid { |
|||
&:focus { |
|||
box-shadow: none; |
|||
} |
|||
|
|||
~ .input-group-append .input-group-text { |
|||
border-color: $danger; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.input-group-text { |
|||
background-color: transparent; |
|||
border-bottom-right-radius: $border-radius; |
|||
border-left: 0; |
|||
border-top-right-radius: $border-radius; |
|||
color: #777; |
|||
transition: $input-transition; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.login-box-msg, |
|||
.register-box-msg { |
|||
margin: 0; |
|||
padding: 0 20px 20px; |
|||
text-align: center; |
|||
} |
|||
|
|||
.social-auth-links { |
|||
margin: 10px 0; |
|||
} |
|||
|
|||
@include dark-mode () { |
|||
.login-card-body, |
|||
.register-card-body { |
|||
background-color: $dark; |
|||
border-color: $gray-600; |
|||
color: $white; |
|||
} |
|||
.login-logo, |
|||
.register-logo { |
|||
a { |
|||
color: $white; |
|||
} |
|||
} |
|||
} |
|||
Some files were not shown because too many files changed in this diff
Write
Preview
Loading…
Cancel
Save
Reference in new issue