diff --git a/.gitattributes b/.gitattributes index 9901d6d308457039f6877b7e1fc3aeebe7a5ea97..802cce871a58f754a13a64d5542d098d94ede1ae 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1836,6 +1836,7 @@ LCU/Maintenance/DBInterface/monitoringdb/admin.py -text LCU/Maintenance/DBInterface/monitoringdb/apps.py -text LCU/Maintenance/DBInterface/monitoringdb/exceptions.py -text LCU/Maintenance/DBInterface/monitoringdb/migrations/0001_initial.py -text +LCU/Maintenance/DBInterface/monitoringdb/migrations/0002_winccantennastatuses.py -text LCU/Maintenance/DBInterface/monitoringdb/migrations/__init__.py -text LCU/Maintenance/DBInterface/monitoringdb/models/__init__.py -text LCU/Maintenance/DBInterface/monitoringdb/models/component.py -text @@ -1847,6 +1848,7 @@ LCU/Maintenance/DBInterface/monitoringdb/models/log.py -text LCU/Maintenance/DBInterface/monitoringdb/models/rtsm.py -text LCU/Maintenance/DBInterface/monitoringdb/models/station.py -text LCU/Maintenance/DBInterface/monitoringdb/models/station_test.py -text +LCU/Maintenance/DBInterface/monitoringdb/models/wincc.py -text LCU/Maintenance/DBInterface/monitoringdb/pagination.py -text LCU/Maintenance/DBInterface/monitoringdb/rtsm_test_raw_parser.py -text LCU/Maintenance/DBInterface/monitoringdb/serializers/__init__.py -text @@ -1859,6 +1861,7 @@ LCU/Maintenance/DBInterface/monitoringdb/serializers/rtsm.py -text LCU/Maintenance/DBInterface/monitoringdb/serializers/station.py -text LCU/Maintenance/DBInterface/monitoringdb/serializers/station_tests.py -text LCU/Maintenance/DBInterface/monitoringdb/serializers/utils.py -text +LCU/Maintenance/DBInterface/monitoringdb/serializers/wincc.py -text LCU/Maintenance/DBInterface/monitoringdb/station_test_raw_parser.py -text LCU/Maintenance/DBInterface/monitoringdb/tasks.py -text LCU/Maintenance/DBInterface/monitoringdb/tests/__init__.py -text @@ -1876,6 +1879,7 @@ LCU/Maintenance/DBInterface/monitoringdb/views/controllers.py -text LCU/Maintenance/DBInterface/monitoringdb/views/logs_view.py -text LCU/Maintenance/DBInterface/monitoringdb/views/rtsm_views.py -text LCU/Maintenance/DBInterface/monitoringdb/views/station_test_views.py -text +LCU/Maintenance/DBInterface/monitoringdb/views/wincc_view.py -text LCU/Maintenance/DBInterface/test/CMakeLists.txt -text LCU/Maintenance/DBInterface/test/__init__.py -text LCU/Maintenance/DBInterface/test/controllers/CMakeLists.txt -text @@ -1883,10 +1887,14 @@ LCU/Maintenance/DBInterface/test/controllers/t_all_components_error_types.run -t LCU/Maintenance/DBInterface/test/controllers/t_all_components_error_types.sh -text LCU/Maintenance/DBInterface/test/controllers/test_all_components_error_types.py -text LCU/Maintenance/DBInterface/test/controllers/test_data_generators.py -text +LCU/Maintenance/DBInterface/test/models/CMakeLists.txt -text +LCU/Maintenance/DBInterface/test/models/t_rtsm_models.run -text +LCU/Maintenance/DBInterface/test/models/t_rtsm_models.sh -text +LCU/Maintenance/DBInterface/test/models/t_wincc_models.run -text +LCU/Maintenance/DBInterface/test/models/t_wincc_models.sh -text +LCU/Maintenance/DBInterface/test/models/test_rtsm_models.py -text +LCU/Maintenance/DBInterface/test/models/test_wincc_models.py -text LCU/Maintenance/DBInterface/test/postgres_testrunner.py -text -LCU/Maintenance/DBInterface/test/t_rtsm_models.run -text -LCU/Maintenance/DBInterface/test/t_rtsm_models.sh -text -LCU/Maintenance/DBInterface/test/test_rtsm_models.py -text LCU/Maintenance/MDB_WebView/CMakeLists.txt -text LCU/Maintenance/MDB_WebView/maintenancedb_view/.env -text LCU/Maintenance/MDB_WebView/maintenancedb_view/CMakeLists.txt -text diff --git a/CMake/FindPythonModule.cmake b/CMake/FindPythonModule.cmake index 190b85f210d94cdfe71a71188a13f5af5336ff0a..613350e8c797ead67d056feb7d43fc239b107227 100644 --- a/CMake/FindPythonModule.cmake +++ b/CMake/FindPythonModule.cmake @@ -61,7 +61,7 @@ macro(find_python_module _module) cmake_parse_arguments(PYTHON_${_MODULE}_FIND "REQUIRED" - "HINTS" + "HINTS;VERSION" "" ${ARGN} ) @@ -75,6 +75,7 @@ macro(find_python_module _module) # Try to import the python module we need to find, and get its file path. if(PYTHON_EXECUTABLE) set(ENV{PYTHONPATH} ${PYTHON_${_MODULE}_FIND_HINTS}:$ENV{PYTHONPATH}) + set(_cmd "from __future__ import print_function; import ${_module}; print(${_module}.__file__)") execute_process( COMMAND "${PYTHON_EXECUTABLE}" "-c" "${_cmd}" @@ -83,6 +84,19 @@ macro(find_python_module _module) ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + set(_cmd "from __future__ import print_function; import ${_module}; print(${_module}.__version__)") + if(${PYTHON_${_MODULE}_FIND_VERSION}) # Check the version of the module + execute_process( + COMMAND "${PYTHON_EXECUTABLE}" "-c" "${_cmd}" + RESULT_VARIABLE _result_version + OUTPUT_VARIABLE _output_version + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "requested version ${PYTHON_${_module}_FIND_VERSION}") + if(${_output_version} VERSION_LESS ${PYTHON_${_MODULE}_FIND_VERSION} ) + message(FATAL_ERROR "The installed version of PYTHON_${_MODULE} is <= ${PYTHON_${_MODULE}_FIND_VERSION}" ) + endif() + endif() # Set PYTHON_<MODULE> variable in the cache, if <module> was found. if(_result EQUAL 0) set(PYTHON_${_MODULE} ${_output} CACHE FILEPATH diff --git a/CMake/NPMInstall.cmake b/CMake/NPMInstall.cmake index 907321f1a17c2fbd0401aa4c280566e3109f7782..cc40135019c37b51c99c1357e946520aa055e11a 100644 --- a/CMake/NPMInstall.cmake +++ b/CMake/NPMInstall.cmake @@ -122,6 +122,11 @@ function(npm_install NPM_PACKAGE_SPECIFICATION) COMMENT "Copying file from ${WEBSITE_SOURCE_DIR}/${file} to ${NPM_BINARY_DIR}/src/${file}") endforeach(file) + add_custom_command(OUTPUT "${NPM_BINARY_DIR}/.env" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/.env" "${NPM_BINARY_DIR}/.env" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/.env" + COMMENT "Copying enviroment file") + foreach(file ${PUBLIC_FILES}) add_custom_command(OUTPUT "${NPM_BINARY_DIR}/public/${file}" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${WEBSITE_PUBLIC_DIR}/${file}" "${NPM_BINARY_DIR}/public/${file}" @@ -132,10 +137,10 @@ function(npm_install NPM_PACKAGE_SPECIFICATION) add_custom_target(copy_package_json_${PACKAGE_NAME} SOURCES "${JSON_PACKAGE_SPECIFICATION}") add_custom_target(download_npm_dependencies_${PACKAGE_NAME} SOURCES "${NPM_BINARY_DIR}/package.json") add_custom_target(packing_javascript_files_${PACKAGE_NAME} ALL - SOURCES ${INSTALLED_SOURCE_FILES} ${INSTALLED_PUBLIC_FILES} "${NPM_BINARY_DIR}/node_modules" "${NPM_BINARY_DIR}/package-lock.json") + SOURCES ${INSTALLED_SOURCE_FILES} ${INSTALLED_PUBLIC_FILES} "${NPM_BINARY_DIR}/node_modules" "${NPM_BINARY_DIR}/package-lock.json" ${NPM_BINARY_DIR}/.env) add_custom_target(start_development_server_${PACKAGE_NAME} - SOURCES "${NPM_BINARY_DIR}/node_modules" "${NPM_BINARY_DIR}/package-lock.json" "${NPM_BINARY_DIR}/package.json" + SOURCES "${NPM_BINARY_DIR}/node_modules" "${NPM_BINARY_DIR}/package-lock.json" "${NPM_BINARY_DIR}/package.json" ${NPM_BINARY_DIR}/.env COMMENT "Start start_development_server for ${PACKAGE_NAME}") @@ -149,7 +154,12 @@ function(npm_install NPM_PACKAGE_SPECIFICATION) COMMAND ${CMAKE_COMMAND} -E make_directory ${NPM_BINARY_DIR}/public COMMENT "Creating public directory ${NPM_BINARY_DIR}/public for ${PACKAGE_NAME}") - + add_custom_command( + OUTPUT "${NPM_BINARY_DIR}/.env" + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/.env ${NPM_BINARY_DIR}/.env + COMMENT "Copying enviroment file") + + add_custom_command( OUTPUT "${NPM_BINARY_DIR}/node_modules" "${NPM_BINARY_DIR}/package-lock.json" COMMAND npm install diff --git a/CMake/testscripts/test_python_with_coverage.run.in b/CMake/testscripts/test_python_with_coverage.run.in index 4a9d606c315ab59989a878cf524973cc96058c25..045d1b63beaf4e0d4f3e49b67b7aea6c39cbd8d1 100755 --- a/CMake/testscripts/test_python_with_coverage.run.in +++ b/CMake/testscripts/test_python_with_coverage.run.in @@ -7,8 +7,9 @@ COVERAGE_EXCLUDE_LINES="[report]\nexclude_lines = \n if __name__ == .__main__.\ if type "coverage@PYTHON_VERSION@" >& /dev/null; then COVERAGE=coverage@PYTHON_VERSION@ >&1 echo "Using ${COVERAGE}" -elif type "python-coverage" >& /dev/null; then - COVERAGE=python-coverage +elif type "python@PYTHON_VERSION@-coverage" >& /dev/null; then + COVERAGE=python@PYTHON_VERSION@-coverage + >&1 echo "Using ${COVERAGE}" else COVERAGE="" >&1 echo "Cannot find coverage@PYTHON_VERSION@/python-coverage... Continuing without it" diff --git a/LCU/Maintenance/DBInterface/CMakeLists.txt b/LCU/Maintenance/DBInterface/CMakeLists.txt index 22ab80dd164b01f66333280d8d4e8933d634fa49..64e35b8fb80d746185de6670eb5d9075f973e9d0 100644 --- a/LCU/Maintenance/DBInterface/CMakeLists.txt +++ b/LCU/Maintenance/DBInterface/CMakeLists.txt @@ -8,11 +8,12 @@ lofar_package(DBInterface 1.0 DEPENDS PyCommon) include(PythonInstall) include(FindPythonModule) -find_python_module(django REQUIRED) +find_python_module(django REQUIRED VERSION 2) find_python_module(psycopg2 REQUIRED) find_python_module(rest_framework REQUIRED) #sudo pip install djangorestframework find_python_module(requests REQUIRED) -find_python_module(celery REQUIRED) +find_python_module(celery REQUIRED VERSION 4) +find_python_module(coreapi) find_python_module(django_filters REQUIRED) diff --git a/LCU/Maintenance/DBInterface/monitoringdb/migrations/0002_winccantennastatuses.py b/LCU/Maintenance/DBInterface/monitoringdb/migrations/0002_winccantennastatuses.py new file mode 100644 index 0000000000000000000000000000000000000000..d75d4485685f9fa63b564a244d09b6c2d4086b35 --- /dev/null +++ b/LCU/Maintenance/DBInterface/monitoringdb/migrations/0002_winccantennastatuses.py @@ -0,0 +1,86 @@ +# Generated by Django 2.0.7 on 2019-03-07 16:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('monitoringdb', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='WinCCAntennaStatus', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ('station', models.CharField(max_length=10)), + ('antenna_type', models.CharField(max_length=4)), + ('antenna_id', models.IntegerField()), + ('status_code', models.IntegerField()), + ('status_code_reason', models.CharField(max_length=1000)), + ('status_code_modified_at', models.CharField(max_length=100)), + ('element_00', models.IntegerField(null=True)), + ('element_00_reason', models.CharField(max_length=1000, null=True)), + ('element_00_modified_at', models.CharField(max_length=100, null=True)), + ('element_01', models.IntegerField(null=True)), + ('element_01_reason', models.CharField(max_length=1000, null=True)), + ('element_01_modified_at', models.CharField(max_length=100, null=True)), + ('element_02', models.IntegerField(null=True)), + ('element_02_reason', models.CharField(max_length=1000, null=True)), + ('element_02_modified_at', models.CharField(max_length=100, null=True)), + ('element_03', models.IntegerField(null=True)), + ('element_03_reason', models.CharField(max_length=1000, null=True)), + ('element_03_modified_at', models.CharField(max_length=100, null=True)), + ('element_04', models.IntegerField(null=True)), + ('element_04_reason', models.CharField(max_length=1000, null=True)), + ('element_04_modified_at', models.CharField(max_length=100, null=True)), + ('element_05', models.IntegerField(null=True)), + ('element_05_reason', models.CharField(max_length=1000, null=True)), + ('element_05_modified_at', models.CharField(max_length=100, null=True)), + ('element_06', models.IntegerField(null=True)), + ('element_06_reason', models.CharField(max_length=1000, null=True)), + ('element_06_modified_at', models.CharField(max_length=100, null=True)), + ('element_07', models.IntegerField(null=True)), + ('element_07_reason', models.CharField(max_length=1000, null=True)), + ('element_07_modified_at', models.CharField(max_length=100, null=True)), + ('element_08', models.IntegerField(null=True)), + ('element_08_reason', models.CharField(max_length=1000, null=True)), + ('element_08_modified_at', models.CharField(max_length=100, null=True)), + ('element_09', models.IntegerField(null=True)), + ('element_09_reason', models.CharField(max_length=1000, null=True)), + ('element_09_modified_at', models.CharField(max_length=100, null=True)), + ('element_10', models.IntegerField(null=True)), + ('element_10_reason', models.CharField(max_length=1000, null=True)), + ('element_10_modified_at', models.CharField(max_length=100, null=True)), + ('element_11', models.IntegerField(null=True)), + ('element_11_reason', models.CharField(max_length=1000, null=True)), + ('element_11_modified_at', models.CharField(max_length=100, null=True)), + ('element_12', models.IntegerField(null=True)), + ('element_12_reason', models.CharField(max_length=1000, null=True)), + ('element_12_modified_at', models.CharField(max_length=100, null=True)), + ('element_13', models.IntegerField(null=True)), + ('element_13_reason', models.CharField(max_length=1000, null=True)), + ('element_13_modified_at', models.CharField(max_length=100, null=True)), + ('element_14', models.IntegerField(null=True)), + ('element_14_reason', models.CharField(max_length=1000, null=True)), + ('element_14_modified_at', models.CharField(max_length=100, null=True)), + ('element_15', models.IntegerField(null=True)), + ('element_15_reason', models.CharField(max_length=1000, null=True)), + ('element_15_modified_at', models.CharField(max_length=100, null=True)), + ], + options={ + 'db_table': 'antenna_statuses', + 'ordering': ['-timestamp', 'station', 'antenna_type', 'antenna_id'], + }, + ), + migrations.AddIndex( + model_name='winccantennastatus', + index=models.Index(fields=['station', 'antenna_type', 'antenna_id', 'timestamp'], name='antenna_sta_station_2632f8_idx'), + ), + migrations.RunSQL( + sql="ALTER TABLE antenna_statuses ALTER COLUMN timestamp SET DEFAULT now()", + reverse_sql="" + ) + ] diff --git a/LCU/Maintenance/DBInterface/monitoringdb/models/rtsm.py b/LCU/Maintenance/DBInterface/monitoringdb/models/rtsm.py index 16c28c62ad3ec6fae15d014798f80bbc696ab050..7800afb4696f3deacfffe43910701a5c2000b98d 100644 --- a/LCU/Maintenance/DBInterface/monitoringdb/models/rtsm.py +++ b/LCU/Maintenance/DBInterface/monitoringdb/models/rtsm.py @@ -5,8 +5,6 @@ from django.db import models from django.contrib.postgres.fields import ArrayField from .station import Station -from .fixed_types import STATION_TYPES - MODE_TO_COMPONENT = { 1: 'LBL', 2: 'LBL', @@ -23,6 +21,7 @@ COMPONENT_TO_MODE = { 'HBA': [5, 6, 7] } + class RTSMObservation(models.Model): observation_id = models.PositiveIntegerField(default=0) diff --git a/LCU/Maintenance/DBInterface/monitoringdb/models/wincc.py b/LCU/Maintenance/DBInterface/monitoringdb/models/wincc.py new file mode 100644 index 0000000000000000000000000000000000000000..12d5b6aee7778d321223e36b7a9ba8be8f07ade0 --- /dev/null +++ b/LCU/Maintenance/DBInterface/monitoringdb/models/wincc.py @@ -0,0 +1,232 @@ +import django.db.models as models +from collections import OrderedDict + + +COMPONENT_TYPE_TO_ANTENNA_TYPE = dict(HBA='HBA', LBH='LBA', LBL='LBA') +STATUS_CODE_TO_STATUS = {0:'OFF', + 10:'OPERATIONAL', + 20:'MAINTENANCE', + 30:'TEST', + 40:'SUSPICIOUS', + 50:'BROKEN', + 60:'BEYOND REPAIR', + 70:'MISSING DATAPOINT'} + + +def to_antenna_type(component_type): + return COMPONENT_TYPE_TO_ANTENNA_TYPE.get(component_type, None) + + +def to_status(status_code): + return STATUS_CODE_TO_STATUS.get(status_code, 'UNKNOWN') + + +def _format_result(raw_query_result, antenna_type): + results = OrderedDict() + for row in raw_query_result: + status_description = OrderedDict() + results[str(row.antenna_id)] = status_description + status_description['inserted_at'] = row.last_entry_timestamp + status_description['status'] = to_status(row.status_code) + status_description['status_code'] = row.status_code + status_description['reason'] = row.status_code_reason + status_description['last_modified'] = row.status_code_modified_at + + if antenna_type is 'HBA': + elements = OrderedDict() + status_description['elements'] = elements + + for i in range(16): + element_status = OrderedDict() + elements[str(i)] = element_status + + element_status['status_code'] = getattr(row, "element_%.02d" % i, ) + element_status['status'] = to_status(element_status['status_code']) + + element_status['reason'] = getattr(row, "element_%.02d_reason" % i, ) + element_status['last_modified'] = getattr(row, + "element_%.02d_modified_at" % i, ) + return results + + +def latest_status_per_station_and_antenna_type(queryset, station, antenna_type, to_date): + """ + Retrieve the latest antenna statuses for a given station and antenna type + :param queryset: source queryset + :param station: station name + :type station: str + :param component_type: component type name + :type component_type: str + :param to_date: select the latest test before the to date + :type to_date: datetime.datetime + :return: the status of an antenna per antenna id + """ + raw_results = queryset.raw(''' + SELECT * + FROM antenna_statuses master + INNER JOIN ( + SELECT station, antenna_type, antenna_id, MAX("timestamp") last_entry_timestamp + FROM antenna_statuses + WHERE timestamp <= %s + GROUP BY station, antenna_type, antenna_id + ) slave ON master.station=slave.station AND master.antenna_type=slave.antenna_type AND master.antenna_id = slave.antenna_id AND last_entry_timestamp=master.timestamp + WHERE master.station=%s AND master.antenna_type=%s + ''', [to_date, station.rstrip('C'), antenna_type]) + + return _format_result(raw_results, antenna_type) + + +def latest_status_per_station_and_component_type(queryset, station, component_type, to_date): + """ + Retrieve the latest antenna statuses for a given station and component type + :param queryset: source queryset + :param station: station name + :type station: str + :param component_type: component type name + :type component_type: str + :param to_date: select the latest test before the to date + :type to_date: datetime.datetime + :return: the status of an antenna per antenna id + """ + antenna_type = to_antenna_type(component_type) + if antenna_type: + return latest_status_per_station_and_antenna_type(queryset, station, antenna_type, + to_date) + else: + return OrderedDict() + + +def latest_status_per_station_and_component_type_antenna_id(queryset, station, + component_type, + component_id, + to_date): + """ + Retrieve the latest antenna statuses for a given station and component type and id + :param queryset: source queryset + :param station: station name + :type station: str + :param component_type: component type name + :type component_type: str + :param to_date: select the latest test before the to date + :type to_date: datetime.datetime + :return: the status of an antenna per antenna id + """ + antenna_type = to_antenna_type(component_type) + if antenna_type: + return latest_status_per_station_and_antenna_type_antenna_id(queryset, station, antenna_type, + component_id, + to_date) + else: + return OrderedDict() + + +def latest_status_per_station_and_antenna_type_antenna_id(queryset, station, + antenna_type, + antenna_id, + to_date): + """ + Retrieve the latest antenna statuses for a given station and antenna type and id + :param queryset: source queryset + :param station: station name + :type station: str + :param component_type: component type name + :type component_type: str + :param to_date: select the latest test before the to date + :type to_date: datetime.datetime + :return: the status of an antenna per antenna id + """ + raw_results = queryset.raw(''' + SELECT * + FROM antenna_statuses master + INNER JOIN ( + SELECT station, antenna_type, antenna_id, MAX("timestamp") last_entry_timestamp + FROM antenna_statuses + WHERE timestamp <= %s + GROUP BY station, antenna_type, antenna_id + ) slave ON master.station=slave.station AND master.antenna_type=slave.antenna_type AND master.antenna_id = slave.antenna_id AND last_entry_timestamp=master.timestamp + WHERE master.station=%s AND master.antenna_type=%s AND master.antenna_id=%s + ''', [to_date, station.rstrip('C'), antenna_type, antenna_id]) + return _format_result(raw_results, antenna_type) + + +class WinCCAntennaStatus(models.Model): + class Meta: + db_table = "antenna_statuses" + ordering = ['-timestamp', 'station', 'antenna_type', 'antenna_id'] + indexes = [ + models.Index(fields=['station', 'antenna_type', 'antenna_id', 'timestamp']) + ] + + timestamp = models.DateTimeField(auto_now_add=True) + station = models.CharField(max_length=10, default=None) + antenna_type = models.CharField(max_length=4, default=None) + antenna_id = models.IntegerField() + + status_code = models.IntegerField() + status_code_reason = models.CharField(max_length=1000) + status_code_modified_at = models.CharField(max_length=100) + + element_00 = models.IntegerField(null=True) + element_00_reason = models.CharField(max_length=1000, null=True) + element_00_modified_at = models.CharField(max_length=100, null=True) + + element_01 = models.IntegerField(null=True) + element_01_reason = models.CharField(max_length=1000, null=True) + element_01_modified_at = models.CharField(max_length=100, null=True) + + element_02 = models.IntegerField(null=True) + element_02_reason = models.CharField(max_length=1000, null=True) + element_02_modified_at = models.CharField(max_length=100, null=True) + + element_03 = models.IntegerField(null=True) + element_03_reason = models.CharField(max_length=1000, null=True) + element_03_modified_at = models.CharField(max_length=100, null=True) + + element_04 = models.IntegerField(null=True) + element_04_reason = models.CharField(max_length=1000, null=True) + element_04_modified_at = models.CharField(max_length=100, null=True) + + element_05 = models.IntegerField(null=True) + element_05_reason = models.CharField(max_length=1000, null=True) + element_05_modified_at = models.CharField(max_length=100, null=True) + + element_06 = models.IntegerField(null=True) + element_06_reason = models.CharField(max_length=1000, null=True) + element_06_modified_at = models.CharField(max_length=100, null=True) + + element_07 = models.IntegerField(null=True) + element_07_reason = models.CharField(max_length=1000, null=True) + element_07_modified_at = models.CharField(max_length=100, null=True) + + element_08 = models.IntegerField(null=True) + element_08_reason = models.CharField(max_length=1000, null=True) + element_08_modified_at = models.CharField(max_length=100, null=True) + + element_09 = models.IntegerField(null=True) + element_09_reason = models.CharField(max_length=1000, null=True) + element_09_modified_at = models.CharField(max_length=100, null=True) + + element_10 = models.IntegerField(null=True) + element_10_reason = models.CharField(max_length=1000, null=True) + element_10_modified_at = models.CharField(max_length=100, null=True) + + element_11 = models.IntegerField(null=True) + element_11_reason = models.CharField(max_length=1000, null=True) + element_11_modified_at = models.CharField(max_length=100, null=True) + + element_12 = models.IntegerField(null=True) + element_12_reason = models.CharField(max_length=1000, null=True) + element_12_modified_at = models.CharField(max_length=100, null=True) + + element_13 = models.IntegerField(null=True) + element_13_reason = models.CharField(max_length=1000, null=True) + element_13_modified_at = models.CharField(max_length=100, null=True) + + element_14 = models.IntegerField(null=True) + element_14_reason = models.CharField(max_length=1000, null=True) + element_14_modified_at = models.CharField(max_length=100, null=True) + + element_15 = models.IntegerField(null=True) + element_15_reason = models.CharField(max_length=1000, null=True) + element_15_modified_at = models.CharField(max_length=100, null=True) + diff --git a/LCU/Maintenance/DBInterface/monitoringdb/serializers/wincc.py b/LCU/Maintenance/DBInterface/monitoringdb/serializers/wincc.py new file mode 100644 index 0000000000000000000000000000000000000000..cef8b708b4b1e95830c5df82ff06f46b0801921b --- /dev/null +++ b/LCU/Maintenance/DBInterface/monitoringdb/serializers/wincc.py @@ -0,0 +1,8 @@ +from ..models.wincc import WinCCAntennaStatus +from .utils import NotNullModelSerializer + + +class WinCCAntennaStatusSerializer(NotNullModelSerializer): + class Meta: + model = WinCCAntennaStatus + fields = '__all__' diff --git a/LCU/Maintenance/DBInterface/monitoringdb/urls.py b/LCU/Maintenance/DBInterface/monitoringdb/urls.py index 3286959e501e1a4ad692dbb867a5736eb56789fa..d2a37ed245fd00ae3d96307b5a84efb0b7d3085d 100644 --- a/LCU/Maintenance/DBInterface/monitoringdb/urls.py +++ b/LCU/Maintenance/DBInterface/monitoringdb/urls.py @@ -2,6 +2,7 @@ from django.conf.urls import url, include from rest_framework import routers from rest_framework.documentation import include_docs_urls +from .views.wincc_view import * from .views.controllers import * from .views.logs_view import * from .views.rtsm_views import * @@ -10,9 +11,13 @@ from .views.station_test_views import * log_router = routers.DefaultRouter() log_router.register(r'action_log', ActionLogViewSet) -station_test_router = routers.DefaultRouter() +# WinCC +wincc_router = routers.DefaultRouter() +wincc_router.register(r'antenna_status', WinCCAntennaStatusViewSet) # Station test +station_test_router = routers.DefaultRouter() + station_test_router.register(r'element_error', ElementErrorViewSet) station_test_router.register(r'element', ElementViewSet) station_test_router.register(r'component_error', ComponentErrorViewSet) @@ -21,9 +26,10 @@ station_test_router.register(r'component', ComponentViewSet) station_test_router.register(r'station', StationViewSet) station_test_router.register(r'', StationTestViewSet) -rtsm_router = routers.DefaultRouter() # RTSM +rtsm_router = routers.DefaultRouter() + rtsm_router.register(r'errors', RTSMErrorsViewSet) rtsm_router.register(r'spectra', RTSMSpectrumViewSet) rtsm_router.register(r'error_summary_plot', RTSMSummaryPlot, base_name='rtsm-summary-plot') @@ -34,6 +40,8 @@ urlpatterns = [ url(r'^api/stationtests/', include(station_test_router.urls)), url(r'^api/rtsm/', include(rtsm_router.urls)), + url(r'^api/wincc/', include(wincc_router.urls)), + url(r'^api/log/', include(log_router.urls)), url(r'^api/api-auth', include('rest_framework.urls', namespace='rest_framework')), diff --git a/LCU/Maintenance/DBInterface/monitoringdb/views/controllers.py b/LCU/Maintenance/DBInterface/monitoringdb/views/controllers.py index e5a172285c30d2db298c51c3b80d48588a821fb3..760afd18da173e2cb77b3de4326e2a45eead571d 100644 --- a/LCU/Maintenance/DBInterface/monitoringdb/views/controllers.py +++ b/LCU/Maintenance/DBInterface/monitoringdb/views/controllers.py @@ -13,6 +13,9 @@ from lofar.maintenance.monitoringdb.models.rtsm import RTSMErrorSummary, MODE_TO from lofar.maintenance.monitoringdb.models.rtsm import RTSMObservation from lofar.maintenance.monitoringdb.models.station import Station from lofar.maintenance.monitoringdb.models.station_test import StationTest +from lofar.maintenance.monitoringdb.models.wincc import WinCCAntennaStatus,\ + latest_status_per_station_and_component_type,\ + latest_status_per_station_and_component_type_antenna_id from rest_framework import status from rest_framework.response import Response from rest_framework.reverse import reverse @@ -258,7 +261,7 @@ class ControllerStationOverview(ValidableReadOnlyView): station_test_payload = OrderedDict() component_errors = station_test.component_errors selected_component_errors = component_errors - if (self.error_types): + if self.error_types: selected_component_errors = component_errors.filter(type__in=self.error_types) station_test_payload[ 'total_component_errors'] = selected_component_errors.count() @@ -296,7 +299,7 @@ class ControllerStationOverview(ValidableReadOnlyView): rtsm_payload['mode'] = unique_modes selected_rtsm_errors = rtsm.errors_summary - if (self.error_types): + if self.error_types: selected_rtsm_errors = rtsm.errors_summary.filter( error_type__in=self.error_types) @@ -813,6 +816,13 @@ class ControllerStationComponentErrors(ValidableReadOnlyView): test_summary['start_date'] = station_test.start_datetime test_summary['end_date'] = station_test.end_datetime component_errors_dict = OrderedDict() + antenna_statuses = latest_status_per_station_and_component_type( + WinCCAntennaStatus.objects, + self.station_name, + failing_component_type, + to_date=station_test.end_datetime) + + test_summary['status'] = antenna_statuses test_summary['component_errors'] = component_errors_dict component_errors = station_test.component_errors \ .filter(component__type=failing_component_type) @@ -855,6 +865,12 @@ class ControllerStationComponentErrors(ValidableReadOnlyView): rtsm_summary['start_date'] = rtsm_observation.start_datetime rtsm_summary['end_date'] = rtsm_observation.end_datetime rtsm_summary['observation_id'] = rtsm_observation.observation_id + antenna_statuses = latest_status_per_station_and_component_type( + WinCCAntennaStatus.objects, + self.station_name, + component_name, + to_date=rtsm_observation.end_datetime) + rtsm_summary['status'] = antenna_statuses component_errors_dict = OrderedDict() rtsm_summary['component_errors'] = component_errors_dict @@ -925,10 +941,16 @@ class ControllerStationComponentErrors(ValidableReadOnlyView): for component_type in set(rtsm_errors.keys() | station_test_errors.keys()): station_test_errors_per_type = station_test_errors.get(component_type, []) rtsm_errors_per_type = rtsm_errors.get(component_type, []) + payload[component_type] = OrderedDict() - payload[component_type] = sorted(station_test_errors_per_type + rtsm_errors_per_type, + payload[component_type]['errors'] = sorted(station_test_errors_per_type + rtsm_errors_per_type, key=lambda item: item['start_date'], reverse=True) + payload[component_type]['current_status'] =\ + latest_status_per_station_and_component_type(WinCCAntennaStatus.objects, + self.station_name, + component_type, + to_date=datetime.datetime.now()) return Response(status=status.HTTP_200_OK, data=payload) @@ -1010,6 +1032,16 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView): end_date=observation['end_datetime'], test_type='R', component_errors=dict()) + antenna_statuses = latest_status_per_station_and_component_type_antenna_id( + WinCCAntennaStatus.objects, + self.station_name, + self.component_type, + self.antenna_id, + to_date=observation[ + 'end_datetime']) + + entry['status'] = antenna_statuses + result.append(entry) return result @@ -1027,6 +1059,14 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView): end_date=station_test['end_datetime'], test_type='S', component_errors=dict()) + antenna_statuses = latest_status_per_station_and_component_type_antenna_id( + WinCCAntennaStatus.objects, + self.station_name, + self.component_type, + self.antenna_id, + to_date=station_test['end_datetime']) + + entry['status'] = antenna_statuses result.append(entry) return result @@ -1052,6 +1092,7 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView): observation__station__name=self.station_name, mode__in=COMPONENT_TO_MODE[self.component_type], rcu__in=list(rcus_per_polarization.keys())).order_by('-observation__start_datetime') + for item in rtsm_errors: observation_pk = item['observation__pk'] if observation_pk not in errors.keys(): @@ -1063,6 +1104,17 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView): 'observation__end_datetime'], test_type='R', component_errors=dict()) + + antenna_statuses = latest_status_per_station_and_component_type_antenna_id( + WinCCAntennaStatus.objects, + self.station_name, + self.component_type, + self.antenna_id, + to_date=item[ + 'observation__end_datetime']) + + errors[observation_pk]['status'] = antenna_statuses + rcu = item['rcu'] polarization = rcus_per_polarization[rcu] @@ -1102,6 +1154,15 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView): end_date=component_error.station_test.end_datetime, test_type='S', component_errors=dict()) + antenna_statuses = latest_status_per_station_and_component_type_antenna_id( + WinCCAntennaStatus.objects, + self.station_name, + self.component_type, + self.antenna_id, + to_date=component_error.station_test.end_datetime) + + errors[station_test_pk]['status'] = antenna_statuses + error_type = component_error.type details = component_error.details errors[station_test_pk]['component_errors'][error_type] = dict(details=details, @@ -1130,4 +1191,14 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView): combined = rtsm_errors_list + station_test_list combined_and_sorted = sorted(combined, key=lambda test: test['start_date'], reverse=True) - return Response(status=status.HTTP_200_OK, data=dict(errors=combined_and_sorted)) + payload = OrderedDict() + payload['errors'] = combined_and_sorted + + payload['current_status'] = latest_status_per_station_and_component_type_antenna_id( + WinCCAntennaStatus.objects, + self.station_name, + self.component_type, + self.antenna_id, + to_date=datetime.datetime.now()) + return Response(status=status.HTTP_200_OK, data=payload) + diff --git a/LCU/Maintenance/DBInterface/monitoringdb/views/wincc_view.py b/LCU/Maintenance/DBInterface/monitoringdb/views/wincc_view.py new file mode 100644 index 0000000000000000000000000000000000000000..9749157bd50baaf2603ac413f3df6a972eb9547b --- /dev/null +++ b/LCU/Maintenance/DBInterface/monitoringdb/views/wincc_view.py @@ -0,0 +1,9 @@ +from rest_framework import viewsets +from lofar.maintenance.monitoringdb.models.wincc import WinCCAntennaStatus +from lofar.maintenance.monitoringdb.serializers.wincc import WinCCAntennaStatusSerializer + + +class WinCCAntennaStatusViewSet(viewsets.ReadOnlyModelViewSet): + queryset = WinCCAntennaStatus.objects.all() + serializer_class = WinCCAntennaStatusSerializer + filter_fields = '__all__' diff --git a/LCU/Maintenance/DBInterface/test/CMakeLists.txt b/LCU/Maintenance/DBInterface/test/CMakeLists.txt index 2ed24549fd27c69b52fd03df7bea0d247dd69a92..fc1612413fffa82859cd1a17b5212d068c172e49 100644 --- a/LCU/Maintenance/DBInterface/test/CMakeLists.txt +++ b/LCU/Maintenance/DBInterface/test/CMakeLists.txt @@ -1,13 +1,3 @@ -# $Id$ -include(LofarCTestPython) -enable_coverage(3) - -set(py_files postgres_testrunner.py - __init__.py - test_rtsm_models.py) -python_install(${py_files} DESTINATION lofar/maintenance/test) - -lofar_add_test(t_rtsm_models) - -add_subdirectory(controllers) \ No newline at end of file +add_subdirectory(controllers) +add_subdirectory(models) \ No newline at end of file diff --git a/LCU/Maintenance/DBInterface/test/models/CMakeLists.txt b/LCU/Maintenance/DBInterface/test/models/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..f46339586de145398d81c9d2ebfeec810ad99f9c --- /dev/null +++ b/LCU/Maintenance/DBInterface/test/models/CMakeLists.txt @@ -0,0 +1,13 @@ +# $Id$ +include(LofarCTestPython) + +enable_coverage(3) + +set(py_files postgres_testrunner.py + __init__.py + test_rtsm_models.py + test_wincc_models.py) +python_install(${py_files} DESTINATION lofar/maintenance/test) + +lofar_add_test(t_rtsm_models) +lofar_add_test(t_wincc_models) diff --git a/LCU/Maintenance/DBInterface/test/t_rtsm_models.run b/LCU/Maintenance/DBInterface/test/models/t_rtsm_models.run similarity index 100% rename from LCU/Maintenance/DBInterface/test/t_rtsm_models.run rename to LCU/Maintenance/DBInterface/test/models/t_rtsm_models.run diff --git a/LCU/Maintenance/DBInterface/test/t_rtsm_models.sh b/LCU/Maintenance/DBInterface/test/models/t_rtsm_models.sh similarity index 100% rename from LCU/Maintenance/DBInterface/test/t_rtsm_models.sh rename to LCU/Maintenance/DBInterface/test/models/t_rtsm_models.sh diff --git a/LCU/Maintenance/DBInterface/test/models/t_wincc_models.run b/LCU/Maintenance/DBInterface/test/models/t_wincc_models.run new file mode 100755 index 0000000000000000000000000000000000000000..280b0394fcc367999b1231203ed9a64f3a6fbe96 --- /dev/null +++ b/LCU/Maintenance/DBInterface/test/models/t_wincc_models.run @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +. coverage.sh + +python_coverage_test models/wincc -m lofar.maintenance.manage test lofar.maintenance.test.test_wincc_models --testrunner=lofar.maintenance.test.postgres_testrunner.PostgresqlTestRunner --settings lofar.maintenance.django_postgresql.test_settings diff --git a/LCU/Maintenance/DBInterface/test/models/t_wincc_models.sh b/LCU/Maintenance/DBInterface/test/models/t_wincc_models.sh new file mode 100755 index 0000000000000000000000000000000000000000..54249770c8353ef4e205c68777f6e7d7739853fb --- /dev/null +++ b/LCU/Maintenance/DBInterface/test/models/t_wincc_models.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +./runctest.sh t_wincc_models \ No newline at end of file diff --git a/LCU/Maintenance/DBInterface/test/test_rtsm_models.py b/LCU/Maintenance/DBInterface/test/models/test_rtsm_models.py similarity index 100% rename from LCU/Maintenance/DBInterface/test/test_rtsm_models.py rename to LCU/Maintenance/DBInterface/test/models/test_rtsm_models.py diff --git a/LCU/Maintenance/DBInterface/test/models/test_wincc_models.py b/LCU/Maintenance/DBInterface/test/models/test_wincc_models.py new file mode 100644 index 0000000000000000000000000000000000000000..3aaea635fae326a44e1e59f50d8ec8377645eb1c --- /dev/null +++ b/LCU/Maintenance/DBInterface/test/models/test_wincc_models.py @@ -0,0 +1,99 @@ +from django.test import TestCase +from lofar.maintenance.monitoringdb.models.wincc import WinCCAntennaStatus,\ + latest_status_per_station_and_component_type_antenna_id,\ + latest_status_per_station_and_component_type + +from datetime import datetime +import django.db.utils as db_utils +import pytz +import random + + +class WinCCAntennaStatusTest(TestCase): + + def test_antenna_status_insertion_auto_timestamp(self): + antenna_status = WinCCAntennaStatus() + antenna_status.station = 'CS001' + antenna_status.antenna_type = 'HBA' + antenna_status.antenna_id = 1 + antenna_status.status_code = 0 + + before_insertion_timestamp = datetime.now(pytz.UTC) + antenna_status.save() + + after_insertion_timestamp = datetime.now(pytz.UTC) + + saved_entity = WinCCAntennaStatus.objects.\ + filter(antenna_type=antenna_status.antenna_type, antenna_id=antenna_status.antenna_id).\ + order_by('-timestamp').first() + self.assertEqual(saved_entity.status_code, antenna_status.status_code) + + self.assertGreaterEqual(saved_entity.timestamp, before_insertion_timestamp) + self.assertLessEqual(saved_entity.timestamp, after_insertion_timestamp) + + def test_antenna_status_insertion_error_if_not_specified_station(self): + with self.assertRaises(db_utils.IntegrityError): + antenna_status = WinCCAntennaStatus() + antenna_status.antenna_type = 'HBA' + antenna_status.antenna_id = 1 + antenna_status.status_code = 0 + + antenna_status.save() + + def test_antenna_status_insertion_error_if_not_specified_antenna_type(self): + with self.assertRaises(db_utils.IntegrityError): + antenna_status = WinCCAntennaStatus() + antenna_status.station = 'CS001' + antenna_status.antenna_id = 1 + antenna_status.status_code = 0 + antenna_status.save() + + def test_custom_query(self): + for i in range(10): + antenna_status = WinCCAntennaStatus() + antenna_status.station = 'CS001' + antenna_status.antenna_type = 'HBA' + antenna_status.antenna_id = random.sample([1, 2], 1)[0] + antenna_status.status_code = 0 + + antenna_status.save() + + antenna_status = WinCCAntennaStatus() + antenna_status.station = 'CS001' + antenna_status.antenna_type = 'HBA' + antenna_status.antenna_id = 1 + antenna_status.status_code = 0 + + antenna_status.save() + + last_status = WinCCAntennaStatus() + last_status.station = 'CS001' + last_status.antenna_type = 'HBA' + last_status.antenna_id = 1 + last_status.status_code = 0 + + before_last_insertion_timestamp = datetime.now(pytz.UTC) + last_status.save() + + saved_entity = WinCCAntennaStatus.objects. \ + filter(antenna_type=antenna_status.antenna_type, antenna_id=antenna_status.antenna_id). \ + order_by('-timestamp').first() + self.assertGreaterEqual(saved_entity.timestamp, before_last_insertion_timestamp) + + result = latest_status_per_station_and_component_type(WinCCAntennaStatus.objects, + 'CS001', + 'HBA', + datetime.now()) + + self.assertIn('1', result) + self.assertIn('2', result) + self.assertGreaterEqual(result['1']["inserted_at"], before_last_insertion_timestamp) + + result = latest_status_per_station_and_component_type_antenna_id(WinCCAntennaStatus.objects, + 'CS001', + 'HBA', + 1, + datetime.now()) + self.assertIn('1', result) + self.assertNotIn('2', result) + self.assertGreaterEqual(result['1']["inserted_at"], before_last_insertion_timestamp) diff --git a/LCU/Maintenance/MDB_WebView/maintenancedb_view/src/App.css b/LCU/Maintenance/MDB_WebView/maintenancedb_view/src/App.css index 1a30c4ba31d0deeed2e46ca805a13da4cd9aa649..8908b55a20986b9b8e35a93be0a68210537bfaba 100644 --- a/LCU/Maintenance/MDB_WebView/maintenancedb_view/src/App.css +++ b/LCU/Maintenance/MDB_WebView/maintenancedb_view/src/App.css @@ -5,9 +5,9 @@ /* hover color, e.g. for background */ /* Data colors */ /*! - * Bootstrap v4.1.3 (https://getbootstrap.com/) - * Copyright 2011-2018 The Bootstrap Authors - * Copyright 2011-2018 Twitter, Inc. + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ :root { @@ -37,7 +37,7 @@ --breakpoint-md: 768px; --breakpoint-lg: 992px; --breakpoint-xl: 1200px; - --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } *, @@ -49,19 +49,14 @@ html { font-family: sans-serif; line-height: 1.15; -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - -ms-overflow-style: scrollbar; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } -@-ms-viewport { - width: device-width; } - article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { display: block; } body { margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 1rem; font-weight: 400; line-height: 1.5; @@ -90,7 +85,8 @@ abbr[data-original-title] { text-decoration: underline; text-decoration: underline dotted; cursor: help; - border-bottom: 0; } + border-bottom: 0; + text-decoration-skip-ink: none; } address { margin-bottom: 1rem; @@ -119,9 +115,6 @@ dd { blockquote { margin: 0 0 1rem; } -dfn { - font-style: italic; } - b, strong { font-weight: bolder; } @@ -145,8 +138,7 @@ sup { a { color: #1c3e5c; text-decoration: none; - background-color: transparent; - -webkit-text-decoration-skip: objects; } + background-color: transparent; } a:hover { color: #0a1621; text-decoration: underline; } @@ -170,8 +162,7 @@ samp { pre { margin-top: 0; margin-bottom: 1rem; - overflow: auto; - -ms-overflow-style: scrollbar; } + overflow: auto; } figure { margin: 0 0 1rem; } @@ -226,12 +217,21 @@ button, select { text-transform: none; } +select { + word-wrap: normal; } + button, -html [type="button"], +[type="button"], [type="reset"], [type="submit"] { -webkit-appearance: button; } +button:not(:disabled), +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled) { + cursor: pointer; } + button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, @@ -282,7 +282,6 @@ progress { outline-offset: -2px; -webkit-appearance: none; } -[type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration { -webkit-appearance: none; } @@ -306,10 +305,8 @@ template { h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { margin-bottom: 0.5rem; - font-family: inherit; font-weight: 500; - line-height: 1.2; - color: inherit; } + line-height: 1.2; } h1, .h1 { font-size: 2.5rem; } @@ -395,7 +392,7 @@ mark, font-size: 80%; color: #6c757d; } .blockquote-footer::before { - content: "\2014 \00A0"; } + content: "\2014\00A0"; } .img-fluid { max-width: 100%; @@ -499,7 +496,6 @@ pre { .col-xl-auto { position: relative; width: 100%; - min-height: 1px; padding-right: 15px; padding-left: 15px; } @@ -511,7 +507,7 @@ pre { .col-auto { flex: 0 0 auto; width: auto; - max-width: none; } + max-width: 100%; } .col-1 { flex: 0 0 8.33333%; @@ -647,7 +643,7 @@ pre { .col-sm-auto { flex: 0 0 auto; width: auto; - max-width: none; } + max-width: 100%; } .col-sm-1 { flex: 0 0 8.33333%; max-width: 8.33333%; } @@ -747,7 +743,7 @@ pre { .col-md-auto { flex: 0 0 auto; width: auto; - max-width: none; } + max-width: 100%; } .col-md-1 { flex: 0 0 8.33333%; max-width: 8.33333%; } @@ -847,7 +843,7 @@ pre { .col-lg-auto { flex: 0 0 auto; width: auto; - max-width: none; } + max-width: 100%; } .col-lg-1 { flex: 0 0 8.33333%; max-width: 8.33333%; } @@ -947,7 +943,7 @@ pre { .col-xl-auto { flex: 0 0 auto; width: auto; - max-width: none; } + max-width: 100%; } .col-xl-1 { flex: 0 0 8.33333%; max-width: 8.33333%; } @@ -1042,7 +1038,7 @@ pre { .table { width: 100%; margin-bottom: 1rem; - background-color: transparent; } + color: #212529; } .table th, .table td { padding: 0.75rem; @@ -1053,8 +1049,6 @@ pre { border-bottom: 2px solid #dee2e6; } .table tbody + tbody { border-top: 2px solid #dee2e6; } - .table .table { - background-color: #fff; } .table-sm th, .table-sm td { @@ -1079,6 +1073,7 @@ pre { background-color: rgba(0, 0, 0, 0.05); } .table-hover tbody tr:hover { + color: #212529; background-color: rgba(0, 0, 0, 0.075); } .table-primary, @@ -1086,6 +1081,12 @@ pre { .table-primary > td { background-color: #bfc9d1; } +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #899baa; } + .table-hover .table-primary:hover { background-color: #b0bcc6; } .table-hover .table-primary:hover > td, @@ -1097,6 +1098,12 @@ pre { .table-secondary > td { background-color: #ebebec; } +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #d9d9db; } + .table-hover .table-secondary:hover { background-color: #dedee0; } .table-hover .table-secondary:hover > td, @@ -1108,6 +1115,12 @@ pre { .table-success > td { background-color: #c3e6cb; } +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #8fd19e; } + .table-hover .table-success:hover { background-color: #b1dfbb; } .table-hover .table-success:hover > td, @@ -1119,6 +1132,12 @@ pre { .table-info > td { background-color: #bee5eb; } +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #86cfda; } + .table-hover .table-info:hover { background-color: #abdde5; } .table-hover .table-info:hover > td, @@ -1130,6 +1149,12 @@ pre { .table-warning > td { background-color: #fefedc; } +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #fdfdbf; } + .table-hover .table-warning:hover { background-color: #fdfdc3; } .table-hover .table-warning:hover > td, @@ -1141,6 +1166,12 @@ pre { .table-danger > td { background-color: #f5c6cb; } +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #ed969e; } + .table-hover .table-danger:hover { background-color: #f1b0b7; } .table-hover .table-danger:hover > td, @@ -1152,6 +1183,12 @@ pre { .table-light > td { background-color: #fdfdfe; } +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #fbfcfc; } + .table-hover .table-light:hover { background-color: #ececf6; } .table-hover .table-light:hover > td, @@ -1163,6 +1200,12 @@ pre { .table-dark > td { background-color: #c6c8ca; } +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #95999c; } + .table-hover .table-dark:hover { background-color: #b9bbbe; } .table-hover .table-dark:hover > td, @@ -1182,8 +1225,8 @@ pre { .table .thead-dark th { color: #fff; - background-color: #212529; - border-color: #32383e; } + background-color: #343a40; + border-color: #454d55; } .table .thead-light th { color: #495057; @@ -1192,16 +1235,17 @@ pre { .table-dark { color: #fff; - background-color: #212529; } + background-color: #343a40; } .table-dark th, .table-dark td, .table-dark thead th { - border-color: #32383e; } + border-color: #454d55; } .table-dark.table-bordered { border: 0; } .table-dark.table-striped tbody tr:nth-of-type(odd) { background-color: rgba(255, 255, 255, 0.05); } .table-dark.table-hover tbody tr:hover { + color: #fff; background-color: rgba(255, 255, 255, 0.075); } @media (max-width: 575.98px) { @@ -1209,8 +1253,7 @@ pre { display: block; width: 100%; overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; } + -webkit-overflow-scrolling: touch; } .table-responsive-sm > .table-bordered { border: 0; } } @@ -1219,8 +1262,7 @@ pre { display: block; width: 100%; overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; } + -webkit-overflow-scrolling: touch; } .table-responsive-md > .table-bordered { border: 0; } } @@ -1229,8 +1271,7 @@ pre { display: block; width: 100%; overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; } + -webkit-overflow-scrolling: touch; } .table-responsive-lg > .table-bordered { border: 0; } } @@ -1239,8 +1280,7 @@ pre { display: block; width: 100%; overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; } + -webkit-overflow-scrolling: touch; } .table-responsive-xl > .table-bordered { border: 0; } } @@ -1248,17 +1288,17 @@ pre { display: block; width: 100%; overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; } + -webkit-overflow-scrolling: touch; } .table-responsive > .table-bordered { border: 0; } .form-control { display: block; width: 100%; - height: calc(2.25rem + 2px); + height: calc(1.5em + 0.75rem + 2px); padding: 0.375rem 0.75rem; font-size: 1rem; + font-weight: 400; line-height: 1.5; color: #495057; background-color: #fff; @@ -1266,7 +1306,7 @@ pre { border: 1px solid #ced4da; border-radius: 0.25rem; transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .form-control { transition: none; } } .form-control::-ms-expand { @@ -1329,14 +1369,14 @@ select.form-control:focus::-ms-value { padding-left: 0; } .form-control-sm { - height: calc(1.8125rem + 2px); + height: calc(1.5em + 0.5rem + 2px); padding: 0.25rem 0.5rem; font-size: 0.875rem; line-height: 1.5; border-radius: 0.2rem; } .form-control-lg { - height: calc(2.875rem + 2px); + height: calc(1.5em + 1rem + 2px); padding: 0.5rem 1rem; font-size: 1.25rem; line-height: 1.5; @@ -1412,22 +1452,34 @@ textarea.form-control { background-color: rgba(40, 167, 69, 0.9); border-radius: 0.25rem; } -.was-validated .form-control:valid, .form-control.is-valid, .was-validated -.custom-select:valid, -.custom-select.is-valid { - border-color: #28a745; } - .was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated - .custom-select:valid:focus, - .custom-select.is-valid:focus { +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #28a745; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: center right calc(0.375em + 0.1875rem); + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .form-control:valid:focus, .form-control.is-valid:focus { border-color: #28a745; box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } .was-validated .form-control:valid ~ .valid-feedback, .was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback, - .form-control.is-valid ~ .valid-tooltip, .was-validated - .custom-select:valid ~ .valid-feedback, - .was-validated - .custom-select:valid ~ .valid-tooltip, - .custom-select.is-valid ~ .valid-feedback, + .form-control.is-valid ~ .valid-tooltip { + display: block; } + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #28a745; + padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } + .was-validated .custom-select:valid ~ .valid-feedback, + .was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback, .custom-select.is-valid ~ .valid-tooltip { display: block; } @@ -1447,7 +1499,7 @@ textarea.form-control { .was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { color: #28a745; } .was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { - background-color: #71dd8a; } + border-color: #28a745; } .was-validated .custom-control-input:valid ~ .valid-feedback, .was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback, @@ -1455,15 +1507,17 @@ textarea.form-control { display: block; } .was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #34ce57; background-color: #34ce57; } .was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } + +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #28a745; } .was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { border-color: #28a745; } - .was-validated .custom-file-input:valid ~ .custom-file-label::after, .custom-file-input.is-valid ~ .custom-file-label::after { - border-color: inherit; } .was-validated .custom-file-input:valid ~ .valid-feedback, .was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback, @@ -1471,6 +1525,7 @@ textarea.form-control { display: block; } .was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #28a745; box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } .invalid-feedback { @@ -1494,22 +1549,34 @@ textarea.form-control { background-color: rgba(220, 53, 69, 0.9); border-radius: 0.25rem; } -.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated -.custom-select:invalid, -.custom-select.is-invalid { - border-color: #dc3545; } - .was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated - .custom-select:invalid:focus, - .custom-select.is-invalid:focus { +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E"); + background-repeat: no-repeat; + background-position: center right calc(0.375em + 0.1875rem); + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { border-color: #dc3545; box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } .was-validated .form-control:invalid ~ .invalid-feedback, .was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback, - .form-control.is-invalid ~ .invalid-tooltip, .was-validated - .custom-select:invalid ~ .invalid-feedback, - .was-validated - .custom-select:invalid ~ .invalid-tooltip, - .custom-select.is-invalid ~ .invalid-feedback, + .form-control.is-invalid ~ .invalid-tooltip { + display: block; } + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #dc3545; + padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } + .was-validated .custom-select:invalid ~ .invalid-feedback, + .was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback, .custom-select.is-invalid ~ .invalid-tooltip { display: block; } @@ -1529,7 +1596,7 @@ textarea.form-control { .was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { color: #dc3545; } .was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { - background-color: #efa2a9; } + border-color: #dc3545; } .was-validated .custom-control-input:invalid ~ .invalid-feedback, .was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback, @@ -1537,15 +1604,17 @@ textarea.form-control { display: block; } .was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #e4606d; background-color: #e4606d; } .was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } + +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #dc3545; } .was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { border-color: #dc3545; } - .was-validated .custom-file-input:invalid ~ .custom-file-label::after, .custom-file-input.is-invalid ~ .custom-file-label::after { - border-color: inherit; } .was-validated .custom-file-input:invalid ~ .invalid-feedback, .was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback, @@ -1553,6 +1622,7 @@ textarea.form-control { display: block; } .was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #dc3545; box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } .form-inline { @@ -1590,6 +1660,7 @@ textarea.form-control { padding-left: 0; } .form-inline .form-check-input { position: relative; + flex-shrink: 0; margin-top: 0; margin-right: 0.25rem; margin-left: 0; } @@ -1602,28 +1673,28 @@ textarea.form-control { .btn { display: inline-block; font-weight: 400; + color: #212529; text-align: center; - white-space: nowrap; vertical-align: middle; user-select: none; + background-color: transparent; border: 1px solid transparent; padding: 0.375rem 0.75rem; font-size: 1rem; line-height: 1.5; border-radius: 0.25rem; transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .btn { transition: none; } } - .btn:hover, .btn:focus { + .btn:hover { + color: #212529; text-decoration: none; } .btn:focus, .btn.focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.25); } .btn.disabled, .btn:disabled { opacity: 0.65; } - .btn:not(:disabled):not(.disabled) { - cursor: pointer; } a.btn.disabled, fieldset:disabled a.btn { @@ -1638,7 +1709,7 @@ fieldset:disabled a.btn { background-color: #132a3f; border-color: #102435; } .btn-primary:focus, .btn-primary.focus { - box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(62, 91, 116, 0.5); } .btn-primary.disabled, .btn-primary:disabled { color: #fff; background-color: #1c3e5c; @@ -1650,7 +1721,7 @@ fieldset:disabled a.btn { border-color: #0d1d2b; } .btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(62, 91, 116, 0.5); } .btn-secondary { color: #212529; @@ -1661,7 +1732,7 @@ fieldset:disabled a.btn { background-color: #a2a2a7; border-color: #9c9ca1; } .btn-secondary:focus, .btn-secondary.focus { - box-shadow: 0 0 0 0.2rem rgba(182, 182, 186, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(160, 160, 164, 0.5); } .btn-secondary.disabled, .btn-secondary:disabled { color: #212529; background-color: #b6b6ba; @@ -1673,7 +1744,7 @@ fieldset:disabled a.btn { border-color: #95959b; } .btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(182, 182, 186, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(160, 160, 164, 0.5); } .btn-success { color: #fff; @@ -1684,7 +1755,7 @@ fieldset:disabled a.btn { background-color: #218838; border-color: #1e7e34; } .btn-success:focus, .btn-success.focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); } .btn-success.disabled, .btn-success:disabled { color: #fff; background-color: #28a745; @@ -1696,7 +1767,7 @@ fieldset:disabled a.btn { border-color: #1c7430; } .btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show > .btn-success.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); } .btn-info { color: #fff; @@ -1707,7 +1778,7 @@ fieldset:disabled a.btn { background-color: #138496; border-color: #117a8b; } .btn-info:focus, .btn-info.focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); } .btn-info.disabled, .btn-info:disabled { color: #fff; background-color: #17a2b8; @@ -1719,7 +1790,7 @@ fieldset:disabled a.btn { border-color: #10707f; } .btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, .show > .btn-info.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); } .btn-warning { color: #212529; @@ -1730,7 +1801,7 @@ fieldset:disabled a.btn { background-color: #fafa5e; border-color: #f9f952; } .btn-warning:focus, .btn-warning.focus { - box-shadow: 0 0 0 0.2rem rgba(251, 251, 131, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(218, 219, 118, 0.5); } .btn-warning.disabled, .btn-warning:disabled { color: #212529; background-color: #fbfb83; @@ -1742,7 +1813,7 @@ fieldset:disabled a.btn { border-color: #f9f945; } .btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(251, 251, 131, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(218, 219, 118, 0.5); } .btn-danger { color: #fff; @@ -1753,7 +1824,7 @@ fieldset:disabled a.btn { background-color: #c82333; border-color: #bd2130; } .btn-danger:focus, .btn-danger.focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); } .btn-danger.disabled, .btn-danger:disabled { color: #fff; background-color: #dc3545; @@ -1765,7 +1836,7 @@ fieldset:disabled a.btn { border-color: #b21f2d; } .btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); } .btn-light { color: #212529; @@ -1776,7 +1847,7 @@ fieldset:disabled a.btn { background-color: #e2e6ea; border-color: #dae0e5; } .btn-light:focus, .btn-light.focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); } .btn-light.disabled, .btn-light:disabled { color: #212529; background-color: #f8f9fa; @@ -1788,7 +1859,7 @@ fieldset:disabled a.btn { border-color: #d3d9df; } .btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, .show > .btn-light.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); } .btn-dark { color: #fff; @@ -1799,7 +1870,7 @@ fieldset:disabled a.btn { background-color: #23272b; border-color: #1d2124; } .btn-dark:focus, .btn-dark.focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); } .btn-dark.disabled, .btn-dark:disabled { color: #fff; background-color: #343a40; @@ -1811,12 +1882,10 @@ fieldset:disabled a.btn { border-color: #171a1d; } .btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); } .btn-outline-primary { color: #1c3e5c; - background-color: transparent; - background-image: none; border-color: #1c3e5c; } .btn-outline-primary:hover { color: #fff; @@ -1838,8 +1907,6 @@ fieldset:disabled a.btn { .btn-outline-secondary { color: #b6b6ba; - background-color: transparent; - background-image: none; border-color: #b6b6ba; } .btn-outline-secondary:hover { color: #212529; @@ -1861,8 +1928,6 @@ fieldset:disabled a.btn { .btn-outline-success { color: #28a745; - background-color: transparent; - background-image: none; border-color: #28a745; } .btn-outline-success:hover { color: #fff; @@ -1884,8 +1949,6 @@ fieldset:disabled a.btn { .btn-outline-info { color: #17a2b8; - background-color: transparent; - background-image: none; border-color: #17a2b8; } .btn-outline-info:hover { color: #fff; @@ -1907,8 +1970,6 @@ fieldset:disabled a.btn { .btn-outline-warning { color: #fbfb83; - background-color: transparent; - background-image: none; border-color: #fbfb83; } .btn-outline-warning:hover { color: #212529; @@ -1930,8 +1991,6 @@ fieldset:disabled a.btn { .btn-outline-danger { color: #dc3545; - background-color: transparent; - background-image: none; border-color: #dc3545; } .btn-outline-danger:hover { color: #fff; @@ -1953,8 +2012,6 @@ fieldset:disabled a.btn { .btn-outline-light { color: #f8f9fa; - background-color: transparent; - background-image: none; border-color: #f8f9fa; } .btn-outline-light:hover { color: #212529; @@ -1976,8 +2033,6 @@ fieldset:disabled a.btn { .btn-outline-dark { color: #343a40; - background-color: transparent; - background-image: none; border-color: #343a40; } .btn-outline-dark:hover { color: #fff; @@ -2000,15 +2055,12 @@ fieldset:disabled a.btn { .btn-link { font-weight: 400; color: #1c3e5c; - background-color: transparent; } + text-decoration: none; } .btn-link:hover { color: #0a1621; - text-decoration: underline; - background-color: transparent; - border-color: transparent; } + text-decoration: underline; } .btn-link:focus, .btn-link.focus { text-decoration: underline; - border-color: transparent; box-shadow: none; } .btn-link:disabled, .btn-link.disabled { color: #6c757d; @@ -2039,7 +2091,7 @@ input[type="button"].btn-block { .fade { transition: opacity 0.15s linear; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .fade { transition: none; } } .fade:not(.show) { @@ -2053,7 +2105,7 @@ input[type="button"].btn-block { height: 0; overflow: hidden; transition: height 0.35s ease; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .collapsing { transition: none; } } @@ -2063,20 +2115,19 @@ input[type="button"].btn-block { .dropleft { position: relative; } -.dropdown-toggle::after { - display: inline-block; - width: 0; - height: 0; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; } - -.dropdown-toggle:empty::after { - margin-left: 0; } +.dropdown-toggle { + white-space: nowrap; } + .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; } + .dropdown-toggle:empty::after { + margin-left: 0; } .dropdown-menu { position: absolute; @@ -2097,10 +2148,46 @@ input[type="button"].btn-block { border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 0.25rem; } +.dropdown-menu-left { + right: auto; + left: 0; } + .dropdown-menu-right { right: 0; left: auto; } +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; } + .dropdown-menu-sm-right { + right: 0; + left: auto; } } + +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; } + .dropdown-menu-md-right { + right: 0; + left: auto; } } + +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; } + .dropdown-menu-lg-right { + right: 0; + left: auto; } } + +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; } + .dropdown-menu-xl-right { + right: 0; + left: auto; } } + .dropup .dropdown-menu { top: auto; bottom: 100%; @@ -2109,8 +2196,6 @@ input[type="button"].btn-block { .dropup .dropdown-toggle::after { display: inline-block; - width: 0; - height: 0; margin-left: 0.255em; vertical-align: 0.255em; content: ""; @@ -2131,8 +2216,6 @@ input[type="button"].btn-block { .dropright .dropdown-toggle::after { display: inline-block; - width: 0; - height: 0; margin-left: 0.255em; vertical-align: 0.255em; content: ""; @@ -2156,8 +2239,6 @@ input[type="button"].btn-block { .dropleft .dropdown-toggle::after { display: inline-block; - width: 0; - height: 0; margin-left: 0.255em; vertical-align: 0.255em; content: ""; } @@ -2167,8 +2248,6 @@ input[type="button"].btn-block { .dropleft .dropdown-toggle::before { display: inline-block; - width: 0; - height: 0; margin-right: 0.255em; vertical-align: 0.255em; content: ""; @@ -2213,6 +2292,7 @@ input[type="button"].btn-block { background-color: #1c3e5c; } .dropdown-item.disabled, .dropdown-item:disabled { color: #6c757d; + pointer-events: none; background-color: transparent; } .dropdown-menu.show { @@ -2239,7 +2319,7 @@ input[type="button"].btn-block { .btn-group > .btn, .btn-group-vertical > .btn { position: relative; - flex: 0 1 auto; } + flex: 1 1 auto; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover { z-index: 1; } @@ -2248,15 +2328,6 @@ input[type="button"].btn-block { .btn-group-vertical > .btn:active, .btn-group-vertical > .btn.active { z-index: 1; } - .btn-group .btn + .btn, - .btn-group .btn + .btn-group, - .btn-group .btn-group + .btn, - .btn-group .btn-group + .btn-group, - .btn-group-vertical .btn + .btn, - .btn-group-vertical .btn + .btn-group, - .btn-group-vertical .btn-group + .btn, - .btn-group-vertical .btn-group + .btn-group { - margin-left: -1px; } .btn-toolbar { display: flex; @@ -2265,8 +2336,9 @@ input[type="button"].btn-block { .btn-toolbar .input-group { width: auto; } -.btn-group > .btn:first-child { - margin-left: 0; } +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; } .btn-group > .btn:not(:last-child):not(.dropdown-toggle), .btn-group > .btn-group:not(:last-child) > .btn { @@ -2300,15 +2372,12 @@ input[type="button"].btn-block { flex-direction: column; align-items: flex-start; justify-content: center; } - .btn-group-vertical .btn, - .btn-group-vertical .btn-group { + .btn-group-vertical > .btn, + .btn-group-vertical > .btn-group { width: 100%; } - .btn-group-vertical > .btn + .btn, - .btn-group-vertical > .btn + .btn-group, - .btn-group-vertical > .btn-group + .btn, - .btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; } + .btn-group-vertical > .btn:not(:first-child), + .btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; } .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), .btn-group-vertical > .btn-group:not(:last-child) > .btn { border-bottom-right-radius: 0; @@ -2336,6 +2405,7 @@ input[type="button"].btn-block { align-items: stretch; width: 100%; } .input-group > .form-control, + .input-group > .form-control-plaintext, .input-group > .custom-select, .input-group > .custom-file { position: relative; @@ -2345,6 +2415,9 @@ input[type="button"].btn-block { .input-group > .form-control + .form-control, .input-group > .form-control + .custom-select, .input-group > .form-control + .custom-file, + .input-group > .form-control-plaintext + .form-control, + .input-group > .form-control-plaintext + .custom-select, + .input-group > .form-control-plaintext + .custom-file, .input-group > .custom-select + .form-control, .input-group > .custom-select + .custom-select, .input-group > .custom-select + .custom-file, @@ -2384,6 +2457,9 @@ input[type="button"].btn-block { .input-group-append .btn { position: relative; z-index: 2; } + .input-group-prepend .btn:focus, + .input-group-append .btn:focus { + z-index: 3; } .input-group-prepend .btn + .btn, .input-group-prepend .btn + .input-group-text, .input-group-prepend .input-group-text + .input-group-text, @@ -2418,28 +2494,40 @@ input[type="button"].btn-block { .input-group-text input[type="checkbox"] { margin-top: 0; } +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(1.5em + 1rem + 2px); } + .input-group-lg > .form-control, +.input-group-lg > .custom-select, .input-group-lg > .input-group-prepend > .input-group-text, .input-group-lg > .input-group-append > .input-group-text, .input-group-lg > .input-group-prepend > .btn, .input-group-lg > .input-group-append > .btn { - height: calc(2.875rem + 2px); padding: 0.5rem 1rem; font-size: 1.25rem; line-height: 1.5; border-radius: 0.3rem; } +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(1.5em + 0.5rem + 2px); } + .input-group-sm > .form-control, +.input-group-sm > .custom-select, .input-group-sm > .input-group-prepend > .input-group-text, .input-group-sm > .input-group-append > .input-group-text, .input-group-sm > .input-group-prepend > .btn, .input-group-sm > .input-group-append > .btn { - height: calc(1.8125rem + 2px); padding: 0.25rem 0.5rem; font-size: 0.875rem; line-height: 1.5; border-radius: 0.2rem; } +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; } + .input-group > .input-group-prepend > .btn, .input-group > .input-group-prepend > .input-group-text, .input-group > .input-group-append:not(:last-child) > .btn, @@ -2474,12 +2562,16 @@ input[type="button"].btn-block { opacity: 0; } .custom-control-input:checked ~ .custom-control-label::before { color: #fff; + border-color: #1c3e5c; background-color: #1c3e5c; } .custom-control-input:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(28, 62, 92, 0.25); } - .custom-control-input:active ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.25); } + .custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #3a80be; } + .custom-control-input:not(:disabled):active ~ .custom-control-label::before { color: #fff; - background-color: #5d99ce; } + background-color: #5d99ce; + border-color: #5d99ce; } .custom-control-input:disabled ~ .custom-control-label { color: #6c757d; } .custom-control-input:disabled ~ .custom-control-label::before { @@ -2487,7 +2579,8 @@ input[type="button"].btn-block { .custom-control-label { position: relative; - margin-bottom: 0; } + margin-bottom: 0; + vertical-align: top; } .custom-control-label::before { position: absolute; top: 0.25rem; @@ -2497,8 +2590,8 @@ input[type="button"].btn-block { height: 1rem; pointer-events: none; content: ""; - user-select: none; - background-color: #dee2e6; } + background-color: #fff; + border: #adb5bd solid 1px; } .custom-control-label::after { position: absolute; top: 0.25rem; @@ -2507,24 +2600,20 @@ input[type="button"].btn-block { width: 1rem; height: 1rem; content: ""; - background-repeat: no-repeat; - background-position: center center; - background-size: 50% 50%; } + background: no-repeat 50% / 50% 50%; } .custom-checkbox .custom-control-label::before { border-radius: 0.25rem; } -.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before { - background-color: #1c3e5c; } - .custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' 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"); } + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' 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"); } .custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #1c3e5c; background-color: #1c3e5c; } .custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E"); } + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); } .custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { background-color: rgba(28, 62, 92, 0.5); } @@ -2535,32 +2624,55 @@ input[type="button"].btn-block { .custom-radio .custom-control-label::before { border-radius: 50%; } -.custom-radio .custom-control-input:checked ~ .custom-control-label::before { - background-color: #1c3e5c; } - .custom-radio .custom-control-input:checked ~ .custom-control-label::after { - background-image: 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='%23fff'/%3E%3C/svg%3E"); } + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); } .custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { background-color: rgba(28, 62, 92, 0.5); } +.custom-switch { + padding-left: 2.25rem; } + .custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; } + .custom-switch .custom-control-label::after { + top: calc(0.25rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #adb5bd; + border-radius: 0.5rem; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + transition: none; } } + .custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #fff; + transform: translateX(0.75rem); } + .custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(28, 62, 92, 0.5); } + .custom-select { display: inline-block; width: 100%; - height: calc(2.25rem + 2px); + height: calc(1.5em + 0.75rem + 2px); padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; line-height: 1.5; color: #495057; vertical-align: middle; - background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center; - background-size: 8px 10px; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; + background-color: #fff; border: 1px solid #ced4da; border-radius: 0.25rem; appearance: none; } .custom-select:focus { border-color: #3a80be; outline: 0; - box-shadow: 0 0 0 0.2rem rgba(58, 128, 190, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.25); } .custom-select:focus::-ms-value { color: #495057; background-color: #fff; } @@ -2572,43 +2684,45 @@ input[type="button"].btn-block { color: #6c757d; background-color: #e9ecef; } .custom-select::-ms-expand { - opacity: 0; } + display: none; } .custom-select-sm { - height: calc(1.8125rem + 2px); - padding-top: 0.375rem; - padding-bottom: 0.375rem; - font-size: 75%; } + height: calc(1.5em + 0.5rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; } .custom-select-lg { - height: calc(2.875rem + 2px); - padding-top: 0.375rem; - padding-bottom: 0.375rem; - font-size: 125%; } + height: calc(1.5em + 1rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; } .custom-file { position: relative; display: inline-block; width: 100%; - height: calc(2.25rem + 2px); + height: calc(1.5em + 0.75rem + 2px); margin-bottom: 0; } .custom-file-input { position: relative; z-index: 2; width: 100%; - height: calc(2.25rem + 2px); + height: calc(1.5em + 0.75rem + 2px); margin: 0; opacity: 0; } .custom-file-input:focus ~ .custom-file-label { border-color: #3a80be; box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.25); } - .custom-file-input:focus ~ .custom-file-label::after { - border-color: #3a80be; } .custom-file-input:disabled ~ .custom-file-label { background-color: #e9ecef; } .custom-file-input:lang(en) ~ .custom-file-label::after { content: "Browse"; } + .custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); } .custom-file-label { position: absolute; @@ -2616,8 +2730,9 @@ input[type="button"].btn-block { right: 0; left: 0; z-index: 1; - height: calc(2.25rem + 2px); + height: calc(1.5em + 0.75rem + 2px); padding: 0.375rem 0.75rem; + font-weight: 400; line-height: 1.5; color: #495057; background-color: #fff; @@ -2630,18 +2745,19 @@ input[type="button"].btn-block { bottom: 0; z-index: 3; display: block; - height: 2.25rem; + height: calc(1.5em + 0.75rem); padding: 0.375rem 0.75rem; line-height: 1.5; color: #495057; content: "Browse"; background-color: #e9ecef; - border-left: 1px solid #ced4da; + border-left: inherit; border-radius: 0 0.25rem 0.25rem 0; } .custom-range { width: 100%; - padding-left: 0; + height: calc(1rem + 0.4rem); + padding: 0; background-color: transparent; appearance: none; } .custom-range:focus { @@ -2663,7 +2779,7 @@ input[type="button"].btn-block { border-radius: 1rem; transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; appearance: none; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .custom-range::-webkit-slider-thumb { transition: none; } } .custom-range::-webkit-slider-thumb:active { @@ -2684,7 +2800,7 @@ input[type="button"].btn-block { border-radius: 1rem; transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; appearance: none; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .custom-range::-moz-range-thumb { transition: none; } } .custom-range::-moz-range-thumb:active { @@ -2708,7 +2824,7 @@ input[type="button"].btn-block { border-radius: 1rem; transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; appearance: none; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .custom-range::-ms-thumb { transition: none; } } .custom-range::-ms-thumb:active { @@ -2728,12 +2844,22 @@ input[type="button"].btn-block { margin-right: 15px; background-color: #dee2e6; border-radius: 1rem; } + .custom-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; } + .custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; } + .custom-range:disabled::-moz-range-thumb { + background-color: #adb5bd; } + .custom-range:disabled::-moz-range-track { + cursor: default; } + .custom-range:disabled::-ms-thumb { + background-color: #adb5bd; } .custom-control-label::before, .custom-file-label, .custom-select { transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .custom-control-label::before, .custom-file-label, .custom-select { @@ -2752,7 +2878,9 @@ input[type="button"].btn-block { .nav-link:hover, .nav-link:focus { text-decoration: none; } .nav-link.disabled { - color: #6c757d; } + color: #6c757d; + pointer-events: none; + cursor: default; } .nav-tabs { border-bottom: 1px solid #dee2e6; } @@ -2858,8 +2986,6 @@ input[type="button"].btn-block { border-radius: 0.25rem; } .navbar-toggler:hover, .navbar-toggler:focus { text-decoration: none; } - .navbar-toggler:not(:disabled):not(.disabled) { - cursor: pointer; } .navbar-toggler-icon { display: inline-block; @@ -3020,7 +3146,7 @@ input[type="button"].btn-block { border-color: rgba(0, 0, 0, 0.1); } .navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); } + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } .navbar-light .navbar-text { color: rgba(0, 0, 0, 0.5); } @@ -3052,7 +3178,7 @@ input[type="button"].btn-block { border-color: rgba(255, 255, 255, 0.1); } .navbar-dark .navbar-toggler-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); } + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } .navbar-dark .navbar-text { color: rgba(255, 255, 255, 0.5); } @@ -3182,41 +3308,24 @@ input[type="button"].btn-block { .card-group > .card + .card { margin-left: 0; border-left: 0; } - .card-group > .card:first-child { + .card-group > .card:not(:last-child) { border-top-right-radius: 0; border-bottom-right-radius: 0; } - .card-group > .card:first-child .card-img-top, - .card-group > .card:first-child .card-header { + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { border-top-right-radius: 0; } - .card-group > .card:first-child .card-img-bottom, - .card-group > .card:first-child .card-footer { + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { border-bottom-right-radius: 0; } - .card-group > .card:last-child { + .card-group > .card:not(:first-child) { border-top-left-radius: 0; border-bottom-left-radius: 0; } - .card-group > .card:last-child .card-img-top, - .card-group > .card:last-child .card-header { + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { border-top-left-radius: 0; } - .card-group > .card:last-child .card-img-bottom, - .card-group > .card:last-child .card-footer { - border-bottom-left-radius: 0; } - .card-group > .card:only-child { - border-radius: 0.25rem; } - .card-group > .card:only-child .card-img-top, - .card-group > .card:only-child .card-header { - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; } - .card-group > .card:only-child .card-img-bottom, - .card-group > .card:only-child .card-footer { - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; } - .card-group > .card:not(:first-child):not(:last-child):not(:only-child) { - border-radius: 0; } - .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top, - .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom, - .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header, - .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer { - border-radius: 0; } } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; } } .card-columns .card { margin-bottom: 0.75rem; } @@ -3231,21 +3340,22 @@ input[type="button"].btn-block { display: inline-block; width: 100%; } } -.accordion .card:not(:first-of-type):not(:last-of-type) { - border-bottom: 0; - border-radius: 0; } - -.accordion .card:not(:first-of-type) .card-header:first-child { - border-radius: 0; } - -.accordion .card:first-of-type { - border-bottom: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; } - -.accordion .card:last-of-type { - border-top-left-radius: 0; - border-top-right-radius: 0; } +.accordion > .card { + overflow: hidden; } + .accordion > .card:not(:first-of-type) .card-header:first-child { + border-radius: 0; } + .accordion > .card:not(:first-of-type):not(:last-of-type) { + border-bottom: 0; + border-radius: 0; } + .accordion > .card:first-of-type { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + .accordion > .card:last-of-type { + border-top-left-radius: 0; + border-top-right-radius: 0; } + .accordion > .card .card-header { + margin-bottom: -1px; } .breadcrumb { display: flex; @@ -3298,8 +3408,6 @@ input[type="button"].btn-block { z-index: 2; outline: 0; box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.25); } - .page-link:not(:disabled):not(.disabled) { - cursor: pointer; } .page-item:first-child .page-link { margin-left: 0; @@ -3358,7 +3466,13 @@ input[type="button"].btn-block { text-align: center; white-space: nowrap; vertical-align: baseline; - border-radius: 0.25rem; } + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .badge { + transition: none; } } + a.badge:hover, a.badge:focus { + text-decoration: none; } .badge:empty { display: none; } @@ -3374,66 +3488,82 @@ input[type="button"].btn-block { .badge-primary { color: #fff; background-color: #1c3e5c; } - .badge-primary[href]:hover, .badge-primary[href]:focus { + a.badge-primary:hover, a.badge-primary:focus { color: #fff; - text-decoration: none; background-color: #102435; } + a.badge-primary:focus, a.badge-primary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.5); } .badge-secondary { color: #212529; background-color: #b6b6ba; } - .badge-secondary[href]:hover, .badge-secondary[href]:focus { + a.badge-secondary:hover, a.badge-secondary:focus { color: #212529; - text-decoration: none; background-color: #9c9ca1; } + a.badge-secondary:focus, a.badge-secondary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(182, 182, 186, 0.5); } .badge-success { color: #fff; background-color: #28a745; } - .badge-success[href]:hover, .badge-success[href]:focus { + a.badge-success:hover, a.badge-success:focus { color: #fff; - text-decoration: none; background-color: #1e7e34; } + a.badge-success:focus, a.badge-success.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } .badge-info { color: #fff; background-color: #17a2b8; } - .badge-info[href]:hover, .badge-info[href]:focus { + a.badge-info:hover, a.badge-info:focus { color: #fff; - text-decoration: none; background-color: #117a8b; } + a.badge-info:focus, a.badge-info.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); } .badge-warning { color: #212529; background-color: #fbfb83; } - .badge-warning[href]:hover, .badge-warning[href]:focus { + a.badge-warning:hover, a.badge-warning:focus { color: #212529; - text-decoration: none; background-color: #f9f952; } + a.badge-warning:focus, a.badge-warning.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(251, 251, 131, 0.5); } .badge-danger { color: #fff; background-color: #dc3545; } - .badge-danger[href]:hover, .badge-danger[href]:focus { + a.badge-danger:hover, a.badge-danger:focus { color: #fff; - text-decoration: none; background-color: #bd2130; } + a.badge-danger:focus, a.badge-danger.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); } .badge-light { color: #212529; background-color: #f8f9fa; } - .badge-light[href]:hover, .badge-light[href]:focus { + a.badge-light:hover, a.badge-light:focus { color: #212529; - text-decoration: none; background-color: #dae0e5; } + a.badge-light:focus, a.badge-light.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); } .badge-dark { color: #fff; background-color: #343a40; } - .badge-dark[href]:hover, .badge-dark[href]:focus { + a.badge-dark:hover, a.badge-dark:focus { color: #fff; - text-decoration: none; background-color: #1d2124; } + a.badge-dark:focus, a.badge-dark.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); } .jumbotron { padding: 2rem 1rem; @@ -3566,7 +3696,7 @@ input[type="button"].btn-block { white-space: nowrap; background-color: #1c3e5c; transition: width 0.6s ease; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .progress-bar { transition: none; } } @@ -3576,6 +3706,9 @@ input[type="button"].btn-block { .progress-bar-animated { animation: progress-bar-stripes 1s linear infinite; } + @media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none; } } .media { display: flex; @@ -3595,6 +3728,7 @@ input[type="button"].btn-block { color: #495057; text-align: inherit; } .list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; color: #495057; text-decoration: none; background-color: #f8f9fa; } @@ -3616,11 +3750,9 @@ input[type="button"].btn-block { margin-bottom: 0; border-bottom-right-radius: 0.25rem; border-bottom-left-radius: 0.25rem; } - .list-group-item:hover, .list-group-item:focus { - z-index: 1; - text-decoration: none; } .list-group-item.disabled, .list-group-item:disabled { color: #6c757d; + pointer-events: none; background-color: #fff; } .list-group-item.active { z-index: 2; @@ -3628,15 +3760,97 @@ input[type="button"].btn-block { background-color: #1c3e5c; border-color: #1c3e5c; } +.list-group-horizontal { + flex-direction: row; } + .list-group-horizontal .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; } + .list-group-horizontal-sm .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal-sm .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-sm .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } } + +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; } + .list-group-horizontal-md .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal-md .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-md .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } } + +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; } + .list-group-horizontal-lg .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal-lg .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-lg .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } } + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; } + .list-group-horizontal-xl .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal-xl .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-xl .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } } + .list-group-flush .list-group-item { border-right: 0; border-left: 0; border-radius: 0; } + .list-group-flush .list-group-item:last-child { + margin-bottom: -1px; } .list-group-flush:first-child .list-group-item:first-child { border-top: 0; } .list-group-flush:last-child .list-group-item:last-child { + margin-bottom: 0; border-bottom: 0; } .list-group-item-primary { @@ -3735,18 +3949,53 @@ input[type="button"].btn-block { color: #000; text-shadow: 0 1px 0 #fff; opacity: .5; } - .close:not(:disabled):not(.disabled) { - cursor: pointer; } - .close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { - color: #000; - text-decoration: none; - opacity: .75; } + .close:hover { + color: #000; + text-decoration: none; } + .close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: .75; } button.close { padding: 0; background-color: transparent; border: 0; - -webkit-appearance: none; } + appearance: none; } + +a.close.disabled { + pointer-events: none; } + +.toast { + max-width: 350px; + overflow: hidden; + font-size: 0.875rem; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); + opacity: 0; + border-radius: 0.25rem; } + .toast:not(:last-child) { + margin-bottom: 0.75rem; } + .toast.showing { + opacity: 1; } + .toast.show { + display: block; + opacity: 1; } + .toast.hide { + display: none; } + +.toast-header { + display: flex; + align-items: center; + padding: 0.25rem 0.75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); } + +.toast-body { + padding: 0.75rem; } .modal-open { overflow: hidden; } @@ -3757,11 +4006,11 @@ button.close { .modal { position: fixed; top: 0; - right: 0; - bottom: 0; left: 0; z-index: 1050; display: none; + width: 100%; + height: 100%; overflow: hidden; outline: 0; } @@ -3772,21 +4021,41 @@ button.close { pointer-events: none; } .modal.fade .modal-dialog { transition: transform 0.3s ease-out; - transform: translate(0, -25%); } - @media screen and (prefers-reduced-motion: reduce) { + transform: translate(0, -50px); } + @media (prefers-reduced-motion: reduce) { .modal.fade .modal-dialog { transition: none; } } .modal.show .modal-dialog { - transform: translate(0, 0); } + transform: none; } + +.modal-dialog-scrollable { + display: flex; + max-height: calc(100% - 1rem); } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 1rem); + overflow: hidden; } + .modal-dialog-scrollable .modal-header, + .modal-dialog-scrollable .modal-footer { + flex-shrink: 0; } + .modal-dialog-scrollable .modal-body { + overflow-y: auto; } .modal-dialog-centered { display: flex; align-items: center; - min-height: calc(100% - (0.5rem * 2)); } + min-height: calc(100% - 1rem); } .modal-dialog-centered::before { display: block; - height: calc(100vh - (0.5rem * 2)); + height: calc(100vh - 1rem); content: ""; } + .modal-dialog-centered.modal-dialog-scrollable { + flex-direction: column; + justify-content: center; + height: 100%; } + .modal-dialog-centered.modal-dialog-scrollable .modal-content { + max-height: none; } + .modal-dialog-centered.modal-dialog-scrollable::before { + content: none; } .modal-content { position: relative; @@ -3803,10 +4072,10 @@ button.close { .modal-backdrop { position: fixed; top: 0; - right: 0; - bottom: 0; left: 0; z-index: 1040; + width: 100vw; + height: 100vh; background-color: #000; } .modal-backdrop.fade { opacity: 0; } @@ -3817,12 +4086,12 @@ button.close { display: flex; align-items: flex-start; justify-content: space-between; - padding: 1rem; - border-bottom: 1px solid #e9ecef; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; border-top-left-radius: 0.3rem; border-top-right-radius: 0.3rem; } .modal-header .close { - padding: 1rem; + padding: 1rem 1rem; margin: -1rem -1rem -1rem auto; } .modal-title { @@ -3839,7 +4108,9 @@ button.close { align-items: center; justify-content: flex-end; padding: 1rem; - border-top: 1px solid #e9ecef; } + border-top: 1px solid #dee2e6; + border-bottom-right-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; } .modal-footer > :not(:first-child) { margin-left: .25rem; } .modal-footer > :not(:last-child) { @@ -3856,23 +4127,32 @@ button.close { .modal-dialog { max-width: 500px; margin: 1.75rem auto; } + .modal-dialog-scrollable { + max-height: calc(100% - 3.5rem); } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 3.5rem); } .modal-dialog-centered { - min-height: calc(100% - (1.75rem * 2)); } + min-height: calc(100% - 3.5rem); } .modal-dialog-centered::before { - height: calc(100vh - (1.75rem * 2)); } + height: calc(100vh - 3.5rem); } .modal-sm { max-width: 300px; } } @media (min-width: 992px) { - .modal-lg { + .modal-lg, + .modal-xl { max-width: 800px; } } +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; } } + .tooltip { position: absolute; z-index: 1070; display: block; margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-style: normal; font-weight: 400; line-height: 1.5; @@ -3957,7 +4237,7 @@ button.close { z-index: 1060; display: block; max-width: 276px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-style: normal; font-weight: 400; line-height: 1.5; @@ -3992,57 +4272,45 @@ button.close { .bs-popover-top, .bs-popover-auto[x-placement^="top"] { margin-bottom: 0.5rem; } - .bs-popover-top .arrow, .bs-popover-auto[x-placement^="top"] .arrow { + .bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow { bottom: calc((0.5rem + 1px) * -1); } - .bs-popover-top .arrow::before, .bs-popover-auto[x-placement^="top"] .arrow::before, - .bs-popover-top .arrow::after, - .bs-popover-auto[x-placement^="top"] .arrow::after { - border-width: 0.5rem 0.5rem 0; } - .bs-popover-top .arrow::before, .bs-popover-auto[x-placement^="top"] .arrow::before { - bottom: 0; - border-top-color: rgba(0, 0, 0, 0.25); } - - .bs-popover-top .arrow::after, - .bs-popover-auto[x-placement^="top"] .arrow::after { - bottom: 1px; - border-top-color: #fff; } + .bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); } + .bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; } .bs-popover-right, .bs-popover-auto[x-placement^="right"] { margin-left: 0.5rem; } - .bs-popover-right .arrow, .bs-popover-auto[x-placement^="right"] .arrow { + .bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow { left: calc((0.5rem + 1px) * -1); width: 0.5rem; height: 1rem; margin: 0.3rem 0; } - .bs-popover-right .arrow::before, .bs-popover-auto[x-placement^="right"] .arrow::before, - .bs-popover-right .arrow::after, - .bs-popover-auto[x-placement^="right"] .arrow::after { - border-width: 0.5rem 0.5rem 0.5rem 0; } - .bs-popover-right .arrow::before, .bs-popover-auto[x-placement^="right"] .arrow::before { - left: 0; - border-right-color: rgba(0, 0, 0, 0.25); } - - .bs-popover-right .arrow::after, - .bs-popover-auto[x-placement^="right"] .arrow::after { - left: 1px; - border-right-color: #fff; } + .bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); } + .bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; } .bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] { margin-top: 0.5rem; } - .bs-popover-bottom .arrow, .bs-popover-auto[x-placement^="bottom"] .arrow { + .bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow { top: calc((0.5rem + 1px) * -1); } - .bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^="bottom"] .arrow::before, - .bs-popover-bottom .arrow::after, - .bs-popover-auto[x-placement^="bottom"] .arrow::after { - border-width: 0 0.5rem 0.5rem 0.5rem; } - .bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^="bottom"] .arrow::before { - top: 0; - border-bottom-color: rgba(0, 0, 0, 0.25); } - - .bs-popover-bottom .arrow::after, - .bs-popover-auto[x-placement^="bottom"] .arrow::after { - top: 1px; - border-bottom-color: #fff; } + .bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); } + .bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; } .bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { position: absolute; top: 0; @@ -4055,29 +4323,24 @@ button.close { .bs-popover-left, .bs-popover-auto[x-placement^="left"] { margin-right: 0.5rem; } - .bs-popover-left .arrow, .bs-popover-auto[x-placement^="left"] .arrow { + .bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow { right: calc((0.5rem + 1px) * -1); width: 0.5rem; height: 1rem; margin: 0.3rem 0; } - .bs-popover-left .arrow::before, .bs-popover-auto[x-placement^="left"] .arrow::before, - .bs-popover-left .arrow::after, - .bs-popover-auto[x-placement^="left"] .arrow::after { - border-width: 0.5rem 0 0.5rem 0.5rem; } - .bs-popover-left .arrow::before, .bs-popover-auto[x-placement^="left"] .arrow::before { - right: 0; - border-left-color: rgba(0, 0, 0, 0.25); } - - .bs-popover-left .arrow::after, - .bs-popover-auto[x-placement^="left"] .arrow::after { - right: 1px; - border-left-color: #fff; } + .bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); } + .bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; } .popover-header { padding: 0.5rem 0.75rem; margin-bottom: 0; font-size: 1rem; - color: inherit; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-top-left-radius: calc(0.3rem - 1px); @@ -4092,106 +4355,89 @@ button.close { .carousel { position: relative; } +.carousel.pointer-event { + touch-action: pan-y; } + .carousel-inner { position: relative; width: 100%; overflow: hidden; } + .carousel-inner::after { + display: block; + clear: both; + content: ""; } .carousel-item { position: relative; display: none; - align-items: center; + float: left; width: 100%; + margin-right: -100%; backface-visibility: hidden; - perspective: 1000px; } - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; - transition: transform 0.6s ease; } - @media screen and (prefers-reduced-motion: reduce) { - .carousel-item.active, - .carousel-item-next, - .carousel-item-prev { + transition: transform 0.6s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .carousel-item { transition: none; } } +.carousel-item.active, .carousel-item-next, .carousel-item-prev { - position: absolute; - top: 0; } - -.carousel-item-next.carousel-item-left, -.carousel-item-prev.carousel-item-right { - transform: translateX(0); } - @supports (transform-style: preserve-3d) { - .carousel-item-next.carousel-item-left, - .carousel-item-prev.carousel-item-right { - transform: translate3d(0, 0, 0); } } + display: block; } -.carousel-item-next, +.carousel-item-next:not(.carousel-item-left), .active.carousel-item-right { transform: translateX(100%); } - @supports (transform-style: preserve-3d) { - .carousel-item-next, - .active.carousel-item-right { - transform: translate3d(100%, 0, 0); } } -.carousel-item-prev, +.carousel-item-prev:not(.carousel-item-right), .active.carousel-item-left { transform: translateX(-100%); } - @supports (transform-style: preserve-3d) { - .carousel-item-prev, - .active.carousel-item-left { - transform: translate3d(-100%, 0, 0); } } .carousel-fade .carousel-item { opacity: 0; - transition-duration: .6s; - transition-property: opacity; } + transition-property: opacity; + transform: none; } .carousel-fade .carousel-item.active, .carousel-fade .carousel-item-next.carousel-item-left, .carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; opacity: 1; } .carousel-fade .active.carousel-item-left, .carousel-fade .active.carousel-item-right { - opacity: 0; } - -.carousel-fade .carousel-item-next, -.carousel-fade .carousel-item-prev, -.carousel-fade .carousel-item.active, -.carousel-fade .active.carousel-item-left, -.carousel-fade .active.carousel-item-prev { - transform: translateX(0); } - @supports (transform-style: preserve-3d) { - .carousel-fade .carousel-item-next, - .carousel-fade .carousel-item-prev, - .carousel-fade .carousel-item.active, + z-index: 0; + opacity: 0; + transition: 0s 0.6s opacity; } + @media (prefers-reduced-motion: reduce) { .carousel-fade .active.carousel-item-left, - .carousel-fade .active.carousel-item-prev { - transform: translate3d(0, 0, 0); } } + .carousel-fade .active.carousel-item-right { + transition: none; } } .carousel-control-prev, .carousel-control-next { position: absolute; top: 0; bottom: 0; + z-index: 1; display: flex; align-items: center; justify-content: center; width: 15%; color: #fff; text-align: center; - opacity: 0.5; } + opacity: 0.5; + transition: opacity 0.15s ease; } + @media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; } } .carousel-control-prev:hover, .carousel-control-prev:focus, .carousel-control-next:hover, .carousel-control-next:focus { color: #fff; text-decoration: none; outline: 0; - opacity: .9; } + opacity: 0.9; } .carousel-control-prev { left: 0; } @@ -4204,19 +4450,18 @@ button.close { display: inline-block; width: 20px; height: 20px; - background: transparent no-repeat center center; - background-size: 100% 100%; } + background: no-repeat 50% / 100% 100%; } .carousel-control-prev-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' 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"); } + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' 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"); } .carousel-control-next-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' 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"); } + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' 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"); } .carousel-indicators { position: absolute; right: 0; - bottom: 10px; + bottom: 0; left: 0; z-index: 15; display: flex; @@ -4226,7 +4471,7 @@ button.close { margin-left: 15%; list-style: none; } .carousel-indicators li { - position: relative; + box-sizing: content-box; flex: 0 1 auto; width: 30px; height: 3px; @@ -4234,25 +4479,17 @@ button.close { margin-left: 3px; text-indent: -999px; cursor: pointer; - background-color: rgba(255, 255, 255, 0.5); } - .carousel-indicators li::before { - position: absolute; - top: -10px; - left: 0; - display: inline-block; - width: 100%; - height: 10px; - content: ""; } - .carousel-indicators li::after { - position: absolute; - bottom: -10px; - left: 0; - display: inline-block; - width: 100%; - height: 10px; - content: ""; } + background-color: #fff; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + transition: opacity 0.6s ease; } + @media (prefers-reduced-motion: reduce) { + .carousel-indicators li { + transition: none; } } .carousel-indicators .active { - background-color: #fff; } + opacity: 1; } .carousel-caption { position: absolute; @@ -4265,6 +4502,45 @@ button.close { color: #fff; text-align: center; } +@keyframes spinner-border { + to { + transform: rotate(360deg); } } + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + animation: spinner-border .75s linear infinite; } + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; } + +@keyframes spinner-grow { + 0% { + transform: scale(0); } + 50% { + opacity: 1; } } + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + animation: spinner-grow .75s linear infinite; } + +.spinner-grow-sm { + width: 1rem; + height: 1rem; } + .align-baseline { vertical-align: baseline !important; } @@ -4410,6 +4686,9 @@ button.bg-dark:focus { .border-white { border-color: #fff !important; } +.rounded-sm { + border-radius: 0.2rem !important; } + .rounded { border-radius: 0.25rem !important; } @@ -4429,9 +4708,15 @@ button.bg-dark:focus { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } +.rounded-lg { + border-radius: 0.3rem !important; } + .rounded-circle { border-radius: 50% !important; } +.rounded-pill { + border-radius: 50rem !important; } + .rounded-0 { border-radius: 0 !important; } @@ -5024,6 +5309,12 @@ button.bg-dark:focus { .float-xl-none { float: none !important; } } +.overflow-auto { + overflow: auto !important; } + +.overflow-hidden { + overflow: hidden !important; } + .position-static { position: static !important; } @@ -5125,6 +5416,29 @@ button.bg-dark:focus { .mh-100 { max-height: 100% !important; } +.min-vw-100 { + min-width: 100vw !important; } + +.min-vh-100 { + min-height: 100vh !important; } + +.vw-100 { + width: 100vw !important; } + +.vh-100 { + height: 100vh !important; } + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + pointer-events: auto; + content: ""; + background-color: rgba(0, 0, 0, 0); } + .m-0 { margin: 0 !important; } @@ -5353,6 +5667,101 @@ button.bg-dark:focus { .px-5 { padding-left: 3rem !important; } +.m-n1 { + margin: -0.25rem !important; } + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; } + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; } + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; } + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; } + +.m-n2 { + margin: -0.5rem !important; } + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; } + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; } + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; } + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; } + +.m-n3 { + margin: -1rem !important; } + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; } + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; } + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; } + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; } + +.m-n4 { + margin: -1.5rem !important; } + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; } + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; } + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; } + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; } + +.m-n5 { + margin: -3rem !important; } + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; } + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; } + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; } + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; } + .m-auto { margin: auto !important; } @@ -5541,6 +5950,76 @@ button.bg-dark:focus { .pl-sm-5, .px-sm-5 { padding-left: 3rem !important; } + .m-sm-n1 { + margin: -0.25rem !important; } + .mt-sm-n1, + .my-sm-n1 { + margin-top: -0.25rem !important; } + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -0.25rem !important; } + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -0.25rem !important; } + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -0.25rem !important; } + .m-sm-n2 { + margin: -0.5rem !important; } + .mt-sm-n2, + .my-sm-n2 { + margin-top: -0.5rem !important; } + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -0.5rem !important; } + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -0.5rem !important; } + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -0.5rem !important; } + .m-sm-n3 { + margin: -1rem !important; } + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important; } + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important; } + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important; } + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important; } + .m-sm-n4 { + margin: -1.5rem !important; } + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important; } + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important; } + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important; } + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important; } + .m-sm-n5 { + margin: -3rem !important; } + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important; } + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important; } + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important; } + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important; } .m-sm-auto { margin: auto !important; } .mt-sm-auto, @@ -5725,6 +6204,76 @@ button.bg-dark:focus { .pl-md-5, .px-md-5 { padding-left: 3rem !important; } + .m-md-n1 { + margin: -0.25rem !important; } + .mt-md-n1, + .my-md-n1 { + margin-top: -0.25rem !important; } + .mr-md-n1, + .mx-md-n1 { + margin-right: -0.25rem !important; } + .mb-md-n1, + .my-md-n1 { + margin-bottom: -0.25rem !important; } + .ml-md-n1, + .mx-md-n1 { + margin-left: -0.25rem !important; } + .m-md-n2 { + margin: -0.5rem !important; } + .mt-md-n2, + .my-md-n2 { + margin-top: -0.5rem !important; } + .mr-md-n2, + .mx-md-n2 { + margin-right: -0.5rem !important; } + .mb-md-n2, + .my-md-n2 { + margin-bottom: -0.5rem !important; } + .ml-md-n2, + .mx-md-n2 { + margin-left: -0.5rem !important; } + .m-md-n3 { + margin: -1rem !important; } + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important; } + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important; } + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important; } + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important; } + .m-md-n4 { + margin: -1.5rem !important; } + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important; } + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important; } + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important; } + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important; } + .m-md-n5 { + margin: -3rem !important; } + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important; } + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important; } + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important; } + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important; } .m-md-auto { margin: auto !important; } .mt-md-auto, @@ -5909,6 +6458,76 @@ button.bg-dark:focus { .pl-lg-5, .px-lg-5 { padding-left: 3rem !important; } + .m-lg-n1 { + margin: -0.25rem !important; } + .mt-lg-n1, + .my-lg-n1 { + margin-top: -0.25rem !important; } + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -0.25rem !important; } + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -0.25rem !important; } + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -0.25rem !important; } + .m-lg-n2 { + margin: -0.5rem !important; } + .mt-lg-n2, + .my-lg-n2 { + margin-top: -0.5rem !important; } + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -0.5rem !important; } + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -0.5rem !important; } + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -0.5rem !important; } + .m-lg-n3 { + margin: -1rem !important; } + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important; } + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important; } + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important; } + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important; } + .m-lg-n4 { + margin: -1.5rem !important; } + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important; } + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important; } + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important; } + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important; } + .m-lg-n5 { + margin: -3rem !important; } + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important; } + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important; } + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important; } + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important; } .m-lg-auto { margin: auto !important; } .mt-lg-auto, @@ -6093,6 +6712,76 @@ button.bg-dark:focus { .pl-xl-5, .px-xl-5 { padding-left: 3rem !important; } + .m-xl-n1 { + margin: -0.25rem !important; } + .mt-xl-n1, + .my-xl-n1 { + margin-top: -0.25rem !important; } + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -0.25rem !important; } + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -0.25rem !important; } + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -0.25rem !important; } + .m-xl-n2 { + margin: -0.5rem !important; } + .mt-xl-n2, + .my-xl-n2 { + margin-top: -0.5rem !important; } + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -0.5rem !important; } + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -0.5rem !important; } + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -0.5rem !important; } + .m-xl-n3 { + margin: -1rem !important; } + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important; } + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important; } + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important; } + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important; } + .m-xl-n4 { + margin: -1.5rem !important; } + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important; } + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important; } + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important; } + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important; } + .m-xl-n5 { + margin: -3rem !important; } + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important; } + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important; } + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important; } + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important; } .m-xl-auto { margin: auto !important; } .mt-xl-auto, @@ -6109,11 +6798,14 @@ button.bg-dark:focus { margin-left: auto !important; } } .text-monospace { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; } .text-justify { text-align: justify !important; } +.text-wrap { + white-space: normal !important; } + .text-nowrap { white-space: nowrap !important; } @@ -6175,12 +6867,18 @@ button.bg-dark:focus { .font-weight-light { font-weight: 300 !important; } +.font-weight-lighter { + font-weight: lighter !important; } + .font-weight-normal { font-weight: 400 !important; } .font-weight-bold { font-weight: 700 !important; } +.font-weight-bolder { + font-weight: bolder !important; } + .font-italic { font-style: italic !important; } @@ -6191,49 +6889,49 @@ button.bg-dark:focus { color: #1c3e5c !important; } a.text-primary:hover, a.text-primary:focus { - color: #102435 !important; } + color: #0a1621 !important; } .text-secondary { color: #b6b6ba !important; } a.text-secondary:hover, a.text-secondary:focus { - color: #9c9ca1 !important; } + color: #8f8f95 !important; } .text-success { color: #28a745 !important; } a.text-success:hover, a.text-success:focus { - color: #1e7e34 !important; } + color: #19692c !important; } .text-info { color: #17a2b8 !important; } a.text-info:hover, a.text-info:focus { - color: #117a8b !important; } + color: #0f6674 !important; } .text-warning { color: #fbfb83 !important; } a.text-warning:hover, a.text-warning:focus { - color: #f9f952 !important; } + color: #f9f939 !important; } .text-danger { color: #dc3545 !important; } a.text-danger:hover, a.text-danger:focus { - color: #bd2130 !important; } + color: #a71d2a !important; } .text-light { color: #f8f9fa !important; } a.text-light:hover, a.text-light:focus { - color: #dae0e5 !important; } + color: #cbd3da !important; } .text-dark { color: #343a40 !important; } a.text-dark:hover, a.text-dark:focus { - color: #1d2124 !important; } + color: #121416 !important; } .text-body { color: #212529 !important; } @@ -6254,6 +6952,16 @@ a.text-dark:hover, a.text-dark:focus { background-color: transparent; border: 0; } +.text-decoration-none { + text-decoration: none !important; } + +.text-break { + word-break: break-word !important; + overflow-wrap: break-word !important; } + +.text-reset { + color: inherit !important; } + .visible { visibility: visible !important; } diff --git a/LCU/Maintenance/MDB_WebView/maintenancedb_view/src/pages/StationOverviewPage/components/StationTestView/index.js b/LCU/Maintenance/MDB_WebView/maintenancedb_view/src/pages/StationOverviewPage/components/StationTestView/index.js index b9b2272f037b300a06a0af042537a1926a728c37..49ed7ba8007db30d49031488fff844ad6a12f240 100644 --- a/LCU/Maintenance/MDB_WebView/maintenancedb_view/src/pages/StationOverviewPage/components/StationTestView/index.js +++ b/LCU/Maintenance/MDB_WebView/maintenancedb_view/src/pages/StationOverviewPage/components/StationTestView/index.js @@ -101,7 +101,7 @@ class StationTestViewC extends Component { station_type={stationType} type={componentType} station_name={this.props.selectedStation} - data={this.props.data[componentType]} + data={this.props.data[componentType].errors} height={height} /> </TabPane> )} diff --git a/LCU/Maintenance/MDB_WebView/maintenancedb_view/src/themes/lofar.css b/LCU/Maintenance/MDB_WebView/maintenancedb_view/src/themes/lofar.css index 363a0162a66c27bc64b7ef832b9fdfc3647dec72..e71edbbb266b2eeb08ff1f43fcd1ad3959701ab2 100644 --- a/LCU/Maintenance/MDB_WebView/maintenancedb_view/src/themes/lofar.css +++ b/LCU/Maintenance/MDB_WebView/maintenancedb_view/src/themes/lofar.css @@ -5,9 +5,9 @@ /* hover color, e.g. for background */ /* Data colors */ /*! - * Bootstrap v4.1.3 (https://getbootstrap.com/) - * Copyright 2011-2018 The Bootstrap Authors - * Copyright 2011-2018 Twitter, Inc. + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ :root { @@ -37,7 +37,7 @@ --breakpoint-md: 768px; --breakpoint-lg: 992px; --breakpoint-xl: 1200px; - --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } *, @@ -49,19 +49,14 @@ html { font-family: sans-serif; line-height: 1.15; -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - -ms-overflow-style: scrollbar; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } -@-ms-viewport { - width: device-width; } - article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { display: block; } body { margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 1rem; font-weight: 400; line-height: 1.5; @@ -90,7 +85,8 @@ abbr[data-original-title] { text-decoration: underline; text-decoration: underline dotted; cursor: help; - border-bottom: 0; } + border-bottom: 0; + text-decoration-skip-ink: none; } address { margin-bottom: 1rem; @@ -119,9 +115,6 @@ dd { blockquote { margin: 0 0 1rem; } -dfn { - font-style: italic; } - b, strong { font-weight: bolder; } @@ -145,8 +138,7 @@ sup { a { color: #1c3e5c; text-decoration: none; - background-color: transparent; - -webkit-text-decoration-skip: objects; } + background-color: transparent; } a:hover { color: #0a1621; text-decoration: underline; } @@ -170,8 +162,7 @@ samp { pre { margin-top: 0; margin-bottom: 1rem; - overflow: auto; - -ms-overflow-style: scrollbar; } + overflow: auto; } figure { margin: 0 0 1rem; } @@ -226,12 +217,21 @@ button, select { text-transform: none; } +select { + word-wrap: normal; } + button, -html [type="button"], +[type="button"], [type="reset"], [type="submit"] { -webkit-appearance: button; } +button:not(:disabled), +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled) { + cursor: pointer; } + button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, @@ -282,7 +282,6 @@ progress { outline-offset: -2px; -webkit-appearance: none; } -[type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration { -webkit-appearance: none; } @@ -306,10 +305,8 @@ template { h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { margin-bottom: 0.5rem; - font-family: inherit; font-weight: 500; - line-height: 1.2; - color: inherit; } + line-height: 1.2; } h1, .h1 { font-size: 2.5rem; } @@ -395,7 +392,7 @@ mark, font-size: 80%; color: #6c757d; } .blockquote-footer::before { - content: "\2014 \00A0"; } + content: "\2014\00A0"; } .img-fluid { max-width: 100%; @@ -499,7 +496,6 @@ pre { .col-xl-auto { position: relative; width: 100%; - min-height: 1px; padding-right: 15px; padding-left: 15px; } @@ -511,7 +507,7 @@ pre { .col-auto { flex: 0 0 auto; width: auto; - max-width: none; } + max-width: 100%; } .col-1 { flex: 0 0 8.33333%; @@ -647,7 +643,7 @@ pre { .col-sm-auto { flex: 0 0 auto; width: auto; - max-width: none; } + max-width: 100%; } .col-sm-1 { flex: 0 0 8.33333%; max-width: 8.33333%; } @@ -747,7 +743,7 @@ pre { .col-md-auto { flex: 0 0 auto; width: auto; - max-width: none; } + max-width: 100%; } .col-md-1 { flex: 0 0 8.33333%; max-width: 8.33333%; } @@ -847,7 +843,7 @@ pre { .col-lg-auto { flex: 0 0 auto; width: auto; - max-width: none; } + max-width: 100%; } .col-lg-1 { flex: 0 0 8.33333%; max-width: 8.33333%; } @@ -947,7 +943,7 @@ pre { .col-xl-auto { flex: 0 0 auto; width: auto; - max-width: none; } + max-width: 100%; } .col-xl-1 { flex: 0 0 8.33333%; max-width: 8.33333%; } @@ -1042,7 +1038,7 @@ pre { .table { width: 100%; margin-bottom: 1rem; - background-color: transparent; } + color: #212529; } .table th, .table td { padding: 0.75rem; @@ -1053,8 +1049,6 @@ pre { border-bottom: 2px solid #dee2e6; } .table tbody + tbody { border-top: 2px solid #dee2e6; } - .table .table { - background-color: #fff; } .table-sm th, .table-sm td { @@ -1079,6 +1073,7 @@ pre { background-color: rgba(0, 0, 0, 0.05); } .table-hover tbody tr:hover { + color: #212529; background-color: rgba(0, 0, 0, 0.075); } .table-primary, @@ -1086,6 +1081,12 @@ pre { .table-primary > td { background-color: #bfc9d1; } +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #899baa; } + .table-hover .table-primary:hover { background-color: #b0bcc6; } .table-hover .table-primary:hover > td, @@ -1097,6 +1098,12 @@ pre { .table-secondary > td { background-color: #ebebec; } +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #d9d9db; } + .table-hover .table-secondary:hover { background-color: #dedee0; } .table-hover .table-secondary:hover > td, @@ -1108,6 +1115,12 @@ pre { .table-success > td { background-color: #c3e6cb; } +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #8fd19e; } + .table-hover .table-success:hover { background-color: #b1dfbb; } .table-hover .table-success:hover > td, @@ -1119,6 +1132,12 @@ pre { .table-info > td { background-color: #bee5eb; } +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #86cfda; } + .table-hover .table-info:hover { background-color: #abdde5; } .table-hover .table-info:hover > td, @@ -1130,6 +1149,12 @@ pre { .table-warning > td { background-color: #fefedc; } +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #fdfdbf; } + .table-hover .table-warning:hover { background-color: #fdfdc3; } .table-hover .table-warning:hover > td, @@ -1141,6 +1166,12 @@ pre { .table-danger > td { background-color: #f5c6cb; } +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #ed969e; } + .table-hover .table-danger:hover { background-color: #f1b0b7; } .table-hover .table-danger:hover > td, @@ -1152,6 +1183,12 @@ pre { .table-light > td { background-color: #fdfdfe; } +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #fbfcfc; } + .table-hover .table-light:hover { background-color: #ececf6; } .table-hover .table-light:hover > td, @@ -1163,6 +1200,12 @@ pre { .table-dark > td { background-color: #c6c8ca; } +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #95999c; } + .table-hover .table-dark:hover { background-color: #b9bbbe; } .table-hover .table-dark:hover > td, @@ -1182,8 +1225,8 @@ pre { .table .thead-dark th { color: #fff; - background-color: #212529; - border-color: #32383e; } + background-color: #343a40; + border-color: #454d55; } .table .thead-light th { color: #495057; @@ -1192,16 +1235,17 @@ pre { .table-dark { color: #fff; - background-color: #212529; } + background-color: #343a40; } .table-dark th, .table-dark td, .table-dark thead th { - border-color: #32383e; } + border-color: #454d55; } .table-dark.table-bordered { border: 0; } .table-dark.table-striped tbody tr:nth-of-type(odd) { background-color: rgba(255, 255, 255, 0.05); } .table-dark.table-hover tbody tr:hover { + color: #fff; background-color: rgba(255, 255, 255, 0.075); } @media (max-width: 575.98px) { @@ -1209,8 +1253,7 @@ pre { display: block; width: 100%; overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; } + -webkit-overflow-scrolling: touch; } .table-responsive-sm > .table-bordered { border: 0; } } @@ -1219,8 +1262,7 @@ pre { display: block; width: 100%; overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; } + -webkit-overflow-scrolling: touch; } .table-responsive-md > .table-bordered { border: 0; } } @@ -1229,8 +1271,7 @@ pre { display: block; width: 100%; overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; } + -webkit-overflow-scrolling: touch; } .table-responsive-lg > .table-bordered { border: 0; } } @@ -1239,8 +1280,7 @@ pre { display: block; width: 100%; overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; } + -webkit-overflow-scrolling: touch; } .table-responsive-xl > .table-bordered { border: 0; } } @@ -1248,17 +1288,17 @@ pre { display: block; width: 100%; overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; } + -webkit-overflow-scrolling: touch; } .table-responsive > .table-bordered { border: 0; } .form-control { display: block; width: 100%; - height: calc(2.25rem + 2px); + height: calc(1.5em + 0.75rem + 2px); padding: 0.375rem 0.75rem; font-size: 1rem; + font-weight: 400; line-height: 1.5; color: #495057; background-color: #fff; @@ -1266,7 +1306,7 @@ pre { border: 1px solid #ced4da; border-radius: 0.25rem; transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .form-control { transition: none; } } .form-control::-ms-expand { @@ -1329,14 +1369,14 @@ select.form-control:focus::-ms-value { padding-left: 0; } .form-control-sm { - height: calc(1.8125rem + 2px); + height: calc(1.5em + 0.5rem + 2px); padding: 0.25rem 0.5rem; font-size: 0.875rem; line-height: 1.5; border-radius: 0.2rem; } .form-control-lg { - height: calc(2.875rem + 2px); + height: calc(1.5em + 1rem + 2px); padding: 0.5rem 1rem; font-size: 1.25rem; line-height: 1.5; @@ -1412,22 +1452,34 @@ textarea.form-control { background-color: rgba(40, 167, 69, 0.9); border-radius: 0.25rem; } -.was-validated .form-control:valid, .form-control.is-valid, .was-validated -.custom-select:valid, -.custom-select.is-valid { - border-color: #28a745; } - .was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated - .custom-select:valid:focus, - .custom-select.is-valid:focus { +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #28a745; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: center right calc(0.375em + 0.1875rem); + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .form-control:valid:focus, .form-control.is-valid:focus { border-color: #28a745; box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } .was-validated .form-control:valid ~ .valid-feedback, .was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback, - .form-control.is-valid ~ .valid-tooltip, .was-validated - .custom-select:valid ~ .valid-feedback, - .was-validated - .custom-select:valid ~ .valid-tooltip, - .custom-select.is-valid ~ .valid-feedback, + .form-control.is-valid ~ .valid-tooltip { + display: block; } + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #28a745; + padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } + .was-validated .custom-select:valid ~ .valid-feedback, + .was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback, .custom-select.is-valid ~ .valid-tooltip { display: block; } @@ -1447,7 +1499,7 @@ textarea.form-control { .was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { color: #28a745; } .was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { - background-color: #71dd8a; } + border-color: #28a745; } .was-validated .custom-control-input:valid ~ .valid-feedback, .was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback, @@ -1455,15 +1507,17 @@ textarea.form-control { display: block; } .was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #34ce57; background-color: #34ce57; } .was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } + +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #28a745; } .was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { border-color: #28a745; } - .was-validated .custom-file-input:valid ~ .custom-file-label::after, .custom-file-input.is-valid ~ .custom-file-label::after { - border-color: inherit; } .was-validated .custom-file-input:valid ~ .valid-feedback, .was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback, @@ -1471,6 +1525,7 @@ textarea.form-control { display: block; } .was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #28a745; box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } .invalid-feedback { @@ -1494,22 +1549,34 @@ textarea.form-control { background-color: rgba(220, 53, 69, 0.9); border-radius: 0.25rem; } -.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated -.custom-select:invalid, -.custom-select.is-invalid { - border-color: #dc3545; } - .was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated - .custom-select:invalid:focus, - .custom-select.is-invalid:focus { +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E"); + background-repeat: no-repeat; + background-position: center right calc(0.375em + 0.1875rem); + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { border-color: #dc3545; box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } .was-validated .form-control:invalid ~ .invalid-feedback, .was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback, - .form-control.is-invalid ~ .invalid-tooltip, .was-validated - .custom-select:invalid ~ .invalid-feedback, - .was-validated - .custom-select:invalid ~ .invalid-tooltip, - .custom-select.is-invalid ~ .invalid-feedback, + .form-control.is-invalid ~ .invalid-tooltip { + display: block; } + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #dc3545; + padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } + .was-validated .custom-select:invalid ~ .invalid-feedback, + .was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback, .custom-select.is-invalid ~ .invalid-tooltip { display: block; } @@ -1529,7 +1596,7 @@ textarea.form-control { .was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { color: #dc3545; } .was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { - background-color: #efa2a9; } + border-color: #dc3545; } .was-validated .custom-control-input:invalid ~ .invalid-feedback, .was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback, @@ -1537,15 +1604,17 @@ textarea.form-control { display: block; } .was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #e4606d; background-color: #e4606d; } .was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } + +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #dc3545; } .was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { border-color: #dc3545; } - .was-validated .custom-file-input:invalid ~ .custom-file-label::after, .custom-file-input.is-invalid ~ .custom-file-label::after { - border-color: inherit; } .was-validated .custom-file-input:invalid ~ .invalid-feedback, .was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback, @@ -1553,6 +1622,7 @@ textarea.form-control { display: block; } .was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #dc3545; box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } .form-inline { @@ -1590,6 +1660,7 @@ textarea.form-control { padding-left: 0; } .form-inline .form-check-input { position: relative; + flex-shrink: 0; margin-top: 0; margin-right: 0.25rem; margin-left: 0; } @@ -1602,28 +1673,28 @@ textarea.form-control { .btn { display: inline-block; font-weight: 400; + color: #212529; text-align: center; - white-space: nowrap; vertical-align: middle; user-select: none; + background-color: transparent; border: 1px solid transparent; padding: 0.375rem 0.75rem; font-size: 1rem; line-height: 1.5; border-radius: 0.25rem; transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .btn { transition: none; } } - .btn:hover, .btn:focus { + .btn:hover { + color: #212529; text-decoration: none; } .btn:focus, .btn.focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.25); } .btn.disabled, .btn:disabled { opacity: 0.65; } - .btn:not(:disabled):not(.disabled) { - cursor: pointer; } a.btn.disabled, fieldset:disabled a.btn { @@ -1638,7 +1709,7 @@ fieldset:disabled a.btn { background-color: #132a3f; border-color: #102435; } .btn-primary:focus, .btn-primary.focus { - box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(62, 91, 116, 0.5); } .btn-primary.disabled, .btn-primary:disabled { color: #fff; background-color: #1c3e5c; @@ -1650,7 +1721,7 @@ fieldset:disabled a.btn { border-color: #0d1d2b; } .btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(62, 91, 116, 0.5); } .btn-secondary { color: #212529; @@ -1661,7 +1732,7 @@ fieldset:disabled a.btn { background-color: #a2a2a7; border-color: #9c9ca1; } .btn-secondary:focus, .btn-secondary.focus { - box-shadow: 0 0 0 0.2rem rgba(182, 182, 186, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(160, 160, 164, 0.5); } .btn-secondary.disabled, .btn-secondary:disabled { color: #212529; background-color: #b6b6ba; @@ -1673,7 +1744,7 @@ fieldset:disabled a.btn { border-color: #95959b; } .btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(182, 182, 186, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(160, 160, 164, 0.5); } .btn-success { color: #fff; @@ -1684,7 +1755,7 @@ fieldset:disabled a.btn { background-color: #218838; border-color: #1e7e34; } .btn-success:focus, .btn-success.focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); } .btn-success.disabled, .btn-success:disabled { color: #fff; background-color: #28a745; @@ -1696,7 +1767,7 @@ fieldset:disabled a.btn { border-color: #1c7430; } .btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show > .btn-success.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); } .btn-info { color: #fff; @@ -1707,7 +1778,7 @@ fieldset:disabled a.btn { background-color: #138496; border-color: #117a8b; } .btn-info:focus, .btn-info.focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); } .btn-info.disabled, .btn-info:disabled { color: #fff; background-color: #17a2b8; @@ -1719,7 +1790,7 @@ fieldset:disabled a.btn { border-color: #10707f; } .btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, .show > .btn-info.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); } .btn-warning { color: #212529; @@ -1730,7 +1801,7 @@ fieldset:disabled a.btn { background-color: #fafa5e; border-color: #f9f952; } .btn-warning:focus, .btn-warning.focus { - box-shadow: 0 0 0 0.2rem rgba(251, 251, 131, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(218, 219, 118, 0.5); } .btn-warning.disabled, .btn-warning:disabled { color: #212529; background-color: #fbfb83; @@ -1742,7 +1813,7 @@ fieldset:disabled a.btn { border-color: #f9f945; } .btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(251, 251, 131, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(218, 219, 118, 0.5); } .btn-danger { color: #fff; @@ -1753,7 +1824,7 @@ fieldset:disabled a.btn { background-color: #c82333; border-color: #bd2130; } .btn-danger:focus, .btn-danger.focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); } .btn-danger.disabled, .btn-danger:disabled { color: #fff; background-color: #dc3545; @@ -1765,7 +1836,7 @@ fieldset:disabled a.btn { border-color: #b21f2d; } .btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); } .btn-light { color: #212529; @@ -1776,7 +1847,7 @@ fieldset:disabled a.btn { background-color: #e2e6ea; border-color: #dae0e5; } .btn-light:focus, .btn-light.focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); } .btn-light.disabled, .btn-light:disabled { color: #212529; background-color: #f8f9fa; @@ -1788,7 +1859,7 @@ fieldset:disabled a.btn { border-color: #d3d9df; } .btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, .show > .btn-light.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); } .btn-dark { color: #fff; @@ -1799,7 +1870,7 @@ fieldset:disabled a.btn { background-color: #23272b; border-color: #1d2124; } .btn-dark:focus, .btn-dark.focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); } .btn-dark.disabled, .btn-dark:disabled { color: #fff; background-color: #343a40; @@ -1811,12 +1882,10 @@ fieldset:disabled a.btn { border-color: #171a1d; } .btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); } .btn-outline-primary { color: #1c3e5c; - background-color: transparent; - background-image: none; border-color: #1c3e5c; } .btn-outline-primary:hover { color: #fff; @@ -1838,8 +1907,6 @@ fieldset:disabled a.btn { .btn-outline-secondary { color: #b6b6ba; - background-color: transparent; - background-image: none; border-color: #b6b6ba; } .btn-outline-secondary:hover { color: #212529; @@ -1861,8 +1928,6 @@ fieldset:disabled a.btn { .btn-outline-success { color: #28a745; - background-color: transparent; - background-image: none; border-color: #28a745; } .btn-outline-success:hover { color: #fff; @@ -1884,8 +1949,6 @@ fieldset:disabled a.btn { .btn-outline-info { color: #17a2b8; - background-color: transparent; - background-image: none; border-color: #17a2b8; } .btn-outline-info:hover { color: #fff; @@ -1907,8 +1970,6 @@ fieldset:disabled a.btn { .btn-outline-warning { color: #fbfb83; - background-color: transparent; - background-image: none; border-color: #fbfb83; } .btn-outline-warning:hover { color: #212529; @@ -1930,8 +1991,6 @@ fieldset:disabled a.btn { .btn-outline-danger { color: #dc3545; - background-color: transparent; - background-image: none; border-color: #dc3545; } .btn-outline-danger:hover { color: #fff; @@ -1953,8 +2012,6 @@ fieldset:disabled a.btn { .btn-outline-light { color: #f8f9fa; - background-color: transparent; - background-image: none; border-color: #f8f9fa; } .btn-outline-light:hover { color: #212529; @@ -1976,8 +2033,6 @@ fieldset:disabled a.btn { .btn-outline-dark { color: #343a40; - background-color: transparent; - background-image: none; border-color: #343a40; } .btn-outline-dark:hover { color: #fff; @@ -2000,15 +2055,12 @@ fieldset:disabled a.btn { .btn-link { font-weight: 400; color: #1c3e5c; - background-color: transparent; } + text-decoration: none; } .btn-link:hover { color: #0a1621; - text-decoration: underline; - background-color: transparent; - border-color: transparent; } + text-decoration: underline; } .btn-link:focus, .btn-link.focus { text-decoration: underline; - border-color: transparent; box-shadow: none; } .btn-link:disabled, .btn-link.disabled { color: #6c757d; @@ -2039,7 +2091,7 @@ input[type="button"].btn-block { .fade { transition: opacity 0.15s linear; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .fade { transition: none; } } .fade:not(.show) { @@ -2053,7 +2105,7 @@ input[type="button"].btn-block { height: 0; overflow: hidden; transition: height 0.35s ease; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .collapsing { transition: none; } } @@ -2063,20 +2115,19 @@ input[type="button"].btn-block { .dropleft { position: relative; } -.dropdown-toggle::after { - display: inline-block; - width: 0; - height: 0; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; } - -.dropdown-toggle:empty::after { - margin-left: 0; } +.dropdown-toggle { + white-space: nowrap; } + .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; } + .dropdown-toggle:empty::after { + margin-left: 0; } .dropdown-menu { position: absolute; @@ -2097,10 +2148,46 @@ input[type="button"].btn-block { border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 0.25rem; } +.dropdown-menu-left { + right: auto; + left: 0; } + .dropdown-menu-right { right: 0; left: auto; } +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; } + .dropdown-menu-sm-right { + right: 0; + left: auto; } } + +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; } + .dropdown-menu-md-right { + right: 0; + left: auto; } } + +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; } + .dropdown-menu-lg-right { + right: 0; + left: auto; } } + +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; } + .dropdown-menu-xl-right { + right: 0; + left: auto; } } + .dropup .dropdown-menu { top: auto; bottom: 100%; @@ -2109,8 +2196,6 @@ input[type="button"].btn-block { .dropup .dropdown-toggle::after { display: inline-block; - width: 0; - height: 0; margin-left: 0.255em; vertical-align: 0.255em; content: ""; @@ -2131,8 +2216,6 @@ input[type="button"].btn-block { .dropright .dropdown-toggle::after { display: inline-block; - width: 0; - height: 0; margin-left: 0.255em; vertical-align: 0.255em; content: ""; @@ -2156,8 +2239,6 @@ input[type="button"].btn-block { .dropleft .dropdown-toggle::after { display: inline-block; - width: 0; - height: 0; margin-left: 0.255em; vertical-align: 0.255em; content: ""; } @@ -2167,8 +2248,6 @@ input[type="button"].btn-block { .dropleft .dropdown-toggle::before { display: inline-block; - width: 0; - height: 0; margin-right: 0.255em; vertical-align: 0.255em; content: ""; @@ -2213,6 +2292,7 @@ input[type="button"].btn-block { background-color: #1c3e5c; } .dropdown-item.disabled, .dropdown-item:disabled { color: #6c757d; + pointer-events: none; background-color: transparent; } .dropdown-menu.show { @@ -2239,7 +2319,7 @@ input[type="button"].btn-block { .btn-group > .btn, .btn-group-vertical > .btn { position: relative; - flex: 0 1 auto; } + flex: 1 1 auto; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover { z-index: 1; } @@ -2248,15 +2328,6 @@ input[type="button"].btn-block { .btn-group-vertical > .btn:active, .btn-group-vertical > .btn.active { z-index: 1; } - .btn-group .btn + .btn, - .btn-group .btn + .btn-group, - .btn-group .btn-group + .btn, - .btn-group .btn-group + .btn-group, - .btn-group-vertical .btn + .btn, - .btn-group-vertical .btn + .btn-group, - .btn-group-vertical .btn-group + .btn, - .btn-group-vertical .btn-group + .btn-group { - margin-left: -1px; } .btn-toolbar { display: flex; @@ -2265,8 +2336,9 @@ input[type="button"].btn-block { .btn-toolbar .input-group { width: auto; } -.btn-group > .btn:first-child { - margin-left: 0; } +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; } .btn-group > .btn:not(:last-child):not(.dropdown-toggle), .btn-group > .btn-group:not(:last-child) > .btn { @@ -2300,15 +2372,12 @@ input[type="button"].btn-block { flex-direction: column; align-items: flex-start; justify-content: center; } - .btn-group-vertical .btn, - .btn-group-vertical .btn-group { + .btn-group-vertical > .btn, + .btn-group-vertical > .btn-group { width: 100%; } - .btn-group-vertical > .btn + .btn, - .btn-group-vertical > .btn + .btn-group, - .btn-group-vertical > .btn-group + .btn, - .btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; } + .btn-group-vertical > .btn:not(:first-child), + .btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; } .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), .btn-group-vertical > .btn-group:not(:last-child) > .btn { border-bottom-right-radius: 0; @@ -2336,6 +2405,7 @@ input[type="button"].btn-block { align-items: stretch; width: 100%; } .input-group > .form-control, + .input-group > .form-control-plaintext, .input-group > .custom-select, .input-group > .custom-file { position: relative; @@ -2345,6 +2415,9 @@ input[type="button"].btn-block { .input-group > .form-control + .form-control, .input-group > .form-control + .custom-select, .input-group > .form-control + .custom-file, + .input-group > .form-control-plaintext + .form-control, + .input-group > .form-control-plaintext + .custom-select, + .input-group > .form-control-plaintext + .custom-file, .input-group > .custom-select + .form-control, .input-group > .custom-select + .custom-select, .input-group > .custom-select + .custom-file, @@ -2384,6 +2457,9 @@ input[type="button"].btn-block { .input-group-append .btn { position: relative; z-index: 2; } + .input-group-prepend .btn:focus, + .input-group-append .btn:focus { + z-index: 3; } .input-group-prepend .btn + .btn, .input-group-prepend .btn + .input-group-text, .input-group-prepend .input-group-text + .input-group-text, @@ -2418,28 +2494,40 @@ input[type="button"].btn-block { .input-group-text input[type="checkbox"] { margin-top: 0; } +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(1.5em + 1rem + 2px); } + .input-group-lg > .form-control, +.input-group-lg > .custom-select, .input-group-lg > .input-group-prepend > .input-group-text, .input-group-lg > .input-group-append > .input-group-text, .input-group-lg > .input-group-prepend > .btn, .input-group-lg > .input-group-append > .btn { - height: calc(2.875rem + 2px); padding: 0.5rem 1rem; font-size: 1.25rem; line-height: 1.5; border-radius: 0.3rem; } +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(1.5em + 0.5rem + 2px); } + .input-group-sm > .form-control, +.input-group-sm > .custom-select, .input-group-sm > .input-group-prepend > .input-group-text, .input-group-sm > .input-group-append > .input-group-text, .input-group-sm > .input-group-prepend > .btn, .input-group-sm > .input-group-append > .btn { - height: calc(1.8125rem + 2px); padding: 0.25rem 0.5rem; font-size: 0.875rem; line-height: 1.5; border-radius: 0.2rem; } +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; } + .input-group > .input-group-prepend > .btn, .input-group > .input-group-prepend > .input-group-text, .input-group > .input-group-append:not(:last-child) > .btn, @@ -2474,12 +2562,16 @@ input[type="button"].btn-block { opacity: 0; } .custom-control-input:checked ~ .custom-control-label::before { color: #fff; + border-color: #1c3e5c; background-color: #1c3e5c; } .custom-control-input:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(28, 62, 92, 0.25); } - .custom-control-input:active ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.25); } + .custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #3a80be; } + .custom-control-input:not(:disabled):active ~ .custom-control-label::before { color: #fff; - background-color: #5d99ce; } + background-color: #5d99ce; + border-color: #5d99ce; } .custom-control-input:disabled ~ .custom-control-label { color: #6c757d; } .custom-control-input:disabled ~ .custom-control-label::before { @@ -2487,7 +2579,8 @@ input[type="button"].btn-block { .custom-control-label { position: relative; - margin-bottom: 0; } + margin-bottom: 0; + vertical-align: top; } .custom-control-label::before { position: absolute; top: 0.25rem; @@ -2497,8 +2590,8 @@ input[type="button"].btn-block { height: 1rem; pointer-events: none; content: ""; - user-select: none; - background-color: #dee2e6; } + background-color: #fff; + border: #adb5bd solid 1px; } .custom-control-label::after { position: absolute; top: 0.25rem; @@ -2507,24 +2600,20 @@ input[type="button"].btn-block { width: 1rem; height: 1rem; content: ""; - background-repeat: no-repeat; - background-position: center center; - background-size: 50% 50%; } + background: no-repeat 50% / 50% 50%; } .custom-checkbox .custom-control-label::before { border-radius: 0.25rem; } -.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before { - background-color: #1c3e5c; } - .custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' 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"); } + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' 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"); } .custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #1c3e5c; background-color: #1c3e5c; } .custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E"); } + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); } .custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { background-color: rgba(28, 62, 92, 0.5); } @@ -2535,32 +2624,55 @@ input[type="button"].btn-block { .custom-radio .custom-control-label::before { border-radius: 50%; } -.custom-radio .custom-control-input:checked ~ .custom-control-label::before { - background-color: #1c3e5c; } - .custom-radio .custom-control-input:checked ~ .custom-control-label::after { - background-image: 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='%23fff'/%3E%3C/svg%3E"); } + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); } .custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { background-color: rgba(28, 62, 92, 0.5); } +.custom-switch { + padding-left: 2.25rem; } + .custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; } + .custom-switch .custom-control-label::after { + top: calc(0.25rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #adb5bd; + border-radius: 0.5rem; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + transition: none; } } + .custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #fff; + transform: translateX(0.75rem); } + .custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(28, 62, 92, 0.5); } + .custom-select { display: inline-block; width: 100%; - height: calc(2.25rem + 2px); + height: calc(1.5em + 0.75rem + 2px); padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; line-height: 1.5; color: #495057; vertical-align: middle; - background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center; - background-size: 8px 10px; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; + background-color: #fff; border: 1px solid #ced4da; border-radius: 0.25rem; appearance: none; } .custom-select:focus { border-color: #3a80be; outline: 0; - box-shadow: 0 0 0 0.2rem rgba(58, 128, 190, 0.5); } + box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.25); } .custom-select:focus::-ms-value { color: #495057; background-color: #fff; } @@ -2572,43 +2684,45 @@ input[type="button"].btn-block { color: #6c757d; background-color: #e9ecef; } .custom-select::-ms-expand { - opacity: 0; } + display: none; } .custom-select-sm { - height: calc(1.8125rem + 2px); - padding-top: 0.375rem; - padding-bottom: 0.375rem; - font-size: 75%; } + height: calc(1.5em + 0.5rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; } .custom-select-lg { - height: calc(2.875rem + 2px); - padding-top: 0.375rem; - padding-bottom: 0.375rem; - font-size: 125%; } + height: calc(1.5em + 1rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; } .custom-file { position: relative; display: inline-block; width: 100%; - height: calc(2.25rem + 2px); + height: calc(1.5em + 0.75rem + 2px); margin-bottom: 0; } .custom-file-input { position: relative; z-index: 2; width: 100%; - height: calc(2.25rem + 2px); + height: calc(1.5em + 0.75rem + 2px); margin: 0; opacity: 0; } .custom-file-input:focus ~ .custom-file-label { border-color: #3a80be; box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.25); } - .custom-file-input:focus ~ .custom-file-label::after { - border-color: #3a80be; } .custom-file-input:disabled ~ .custom-file-label { background-color: #e9ecef; } .custom-file-input:lang(en) ~ .custom-file-label::after { content: "Browse"; } + .custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); } .custom-file-label { position: absolute; @@ -2616,8 +2730,9 @@ input[type="button"].btn-block { right: 0; left: 0; z-index: 1; - height: calc(2.25rem + 2px); + height: calc(1.5em + 0.75rem + 2px); padding: 0.375rem 0.75rem; + font-weight: 400; line-height: 1.5; color: #495057; background-color: #fff; @@ -2630,18 +2745,19 @@ input[type="button"].btn-block { bottom: 0; z-index: 3; display: block; - height: 2.25rem; + height: calc(1.5em + 0.75rem); padding: 0.375rem 0.75rem; line-height: 1.5; color: #495057; content: "Browse"; background-color: #e9ecef; - border-left: 1px solid #ced4da; + border-left: inherit; border-radius: 0 0.25rem 0.25rem 0; } .custom-range { width: 100%; - padding-left: 0; + height: calc(1rem + 0.4rem); + padding: 0; background-color: transparent; appearance: none; } .custom-range:focus { @@ -2663,7 +2779,7 @@ input[type="button"].btn-block { border-radius: 1rem; transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; appearance: none; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .custom-range::-webkit-slider-thumb { transition: none; } } .custom-range::-webkit-slider-thumb:active { @@ -2684,7 +2800,7 @@ input[type="button"].btn-block { border-radius: 1rem; transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; appearance: none; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .custom-range::-moz-range-thumb { transition: none; } } .custom-range::-moz-range-thumb:active { @@ -2708,7 +2824,7 @@ input[type="button"].btn-block { border-radius: 1rem; transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; appearance: none; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .custom-range::-ms-thumb { transition: none; } } .custom-range::-ms-thumb:active { @@ -2728,12 +2844,22 @@ input[type="button"].btn-block { margin-right: 15px; background-color: #dee2e6; border-radius: 1rem; } + .custom-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; } + .custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; } + .custom-range:disabled::-moz-range-thumb { + background-color: #adb5bd; } + .custom-range:disabled::-moz-range-track { + cursor: default; } + .custom-range:disabled::-ms-thumb { + background-color: #adb5bd; } .custom-control-label::before, .custom-file-label, .custom-select { transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .custom-control-label::before, .custom-file-label, .custom-select { @@ -2752,7 +2878,9 @@ input[type="button"].btn-block { .nav-link:hover, .nav-link:focus { text-decoration: none; } .nav-link.disabled { - color: #6c757d; } + color: #6c757d; + pointer-events: none; + cursor: default; } .nav-tabs { border-bottom: 1px solid #dee2e6; } @@ -2858,8 +2986,6 @@ input[type="button"].btn-block { border-radius: 0.25rem; } .navbar-toggler:hover, .navbar-toggler:focus { text-decoration: none; } - .navbar-toggler:not(:disabled):not(.disabled) { - cursor: pointer; } .navbar-toggler-icon { display: inline-block; @@ -3020,7 +3146,7 @@ input[type="button"].btn-block { border-color: rgba(0, 0, 0, 0.1); } .navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); } + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } .navbar-light .navbar-text { color: rgba(0, 0, 0, 0.5); } @@ -3052,7 +3178,7 @@ input[type="button"].btn-block { border-color: rgba(255, 255, 255, 0.1); } .navbar-dark .navbar-toggler-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); } + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } .navbar-dark .navbar-text { color: rgba(255, 255, 255, 0.5); } @@ -3182,41 +3308,24 @@ input[type="button"].btn-block { .card-group > .card + .card { margin-left: 0; border-left: 0; } - .card-group > .card:first-child { + .card-group > .card:not(:last-child) { border-top-right-radius: 0; border-bottom-right-radius: 0; } - .card-group > .card:first-child .card-img-top, - .card-group > .card:first-child .card-header { + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { border-top-right-radius: 0; } - .card-group > .card:first-child .card-img-bottom, - .card-group > .card:first-child .card-footer { + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { border-bottom-right-radius: 0; } - .card-group > .card:last-child { + .card-group > .card:not(:first-child) { border-top-left-radius: 0; border-bottom-left-radius: 0; } - .card-group > .card:last-child .card-img-top, - .card-group > .card:last-child .card-header { + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { border-top-left-radius: 0; } - .card-group > .card:last-child .card-img-bottom, - .card-group > .card:last-child .card-footer { - border-bottom-left-radius: 0; } - .card-group > .card:only-child { - border-radius: 0.25rem; } - .card-group > .card:only-child .card-img-top, - .card-group > .card:only-child .card-header { - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; } - .card-group > .card:only-child .card-img-bottom, - .card-group > .card:only-child .card-footer { - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; } - .card-group > .card:not(:first-child):not(:last-child):not(:only-child) { - border-radius: 0; } - .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top, - .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom, - .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header, - .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer { - border-radius: 0; } } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; } } .card-columns .card { margin-bottom: 0.75rem; } @@ -3231,21 +3340,22 @@ input[type="button"].btn-block { display: inline-block; width: 100%; } } -.accordion .card:not(:first-of-type):not(:last-of-type) { - border-bottom: 0; - border-radius: 0; } - -.accordion .card:not(:first-of-type) .card-header:first-child { - border-radius: 0; } - -.accordion .card:first-of-type { - border-bottom: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; } - -.accordion .card:last-of-type { - border-top-left-radius: 0; - border-top-right-radius: 0; } +.accordion > .card { + overflow: hidden; } + .accordion > .card:not(:first-of-type) .card-header:first-child { + border-radius: 0; } + .accordion > .card:not(:first-of-type):not(:last-of-type) { + border-bottom: 0; + border-radius: 0; } + .accordion > .card:first-of-type { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + .accordion > .card:last-of-type { + border-top-left-radius: 0; + border-top-right-radius: 0; } + .accordion > .card .card-header { + margin-bottom: -1px; } .breadcrumb { display: flex; @@ -3298,8 +3408,6 @@ input[type="button"].btn-block { z-index: 2; outline: 0; box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.25); } - .page-link:not(:disabled):not(.disabled) { - cursor: pointer; } .page-item:first-child .page-link { margin-left: 0; @@ -3358,7 +3466,13 @@ input[type="button"].btn-block { text-align: center; white-space: nowrap; vertical-align: baseline; - border-radius: 0.25rem; } + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .badge { + transition: none; } } + a.badge:hover, a.badge:focus { + text-decoration: none; } .badge:empty { display: none; } @@ -3374,66 +3488,82 @@ input[type="button"].btn-block { .badge-primary { color: #fff; background-color: #1c3e5c; } - .badge-primary[href]:hover, .badge-primary[href]:focus { + a.badge-primary:hover, a.badge-primary:focus { color: #fff; - text-decoration: none; background-color: #102435; } + a.badge-primary:focus, a.badge-primary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(28, 62, 92, 0.5); } .badge-secondary { color: #212529; background-color: #b6b6ba; } - .badge-secondary[href]:hover, .badge-secondary[href]:focus { + a.badge-secondary:hover, a.badge-secondary:focus { color: #212529; - text-decoration: none; background-color: #9c9ca1; } + a.badge-secondary:focus, a.badge-secondary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(182, 182, 186, 0.5); } .badge-success { color: #fff; background-color: #28a745; } - .badge-success[href]:hover, .badge-success[href]:focus { + a.badge-success:hover, a.badge-success:focus { color: #fff; - text-decoration: none; background-color: #1e7e34; } + a.badge-success:focus, a.badge-success.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } .badge-info { color: #fff; background-color: #17a2b8; } - .badge-info[href]:hover, .badge-info[href]:focus { + a.badge-info:hover, a.badge-info:focus { color: #fff; - text-decoration: none; background-color: #117a8b; } + a.badge-info:focus, a.badge-info.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); } .badge-warning { color: #212529; background-color: #fbfb83; } - .badge-warning[href]:hover, .badge-warning[href]:focus { + a.badge-warning:hover, a.badge-warning:focus { color: #212529; - text-decoration: none; background-color: #f9f952; } + a.badge-warning:focus, a.badge-warning.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(251, 251, 131, 0.5); } .badge-danger { color: #fff; background-color: #dc3545; } - .badge-danger[href]:hover, .badge-danger[href]:focus { + a.badge-danger:hover, a.badge-danger:focus { color: #fff; - text-decoration: none; background-color: #bd2130; } + a.badge-danger:focus, a.badge-danger.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); } .badge-light { color: #212529; background-color: #f8f9fa; } - .badge-light[href]:hover, .badge-light[href]:focus { + a.badge-light:hover, a.badge-light:focus { color: #212529; - text-decoration: none; background-color: #dae0e5; } + a.badge-light:focus, a.badge-light.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); } .badge-dark { color: #fff; background-color: #343a40; } - .badge-dark[href]:hover, .badge-dark[href]:focus { + a.badge-dark:hover, a.badge-dark:focus { color: #fff; - text-decoration: none; background-color: #1d2124; } + a.badge-dark:focus, a.badge-dark.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); } .jumbotron { padding: 2rem 1rem; @@ -3566,7 +3696,7 @@ input[type="button"].btn-block { white-space: nowrap; background-color: #1c3e5c; transition: width 0.6s ease; } - @media screen and (prefers-reduced-motion: reduce) { + @media (prefers-reduced-motion: reduce) { .progress-bar { transition: none; } } @@ -3576,6 +3706,9 @@ input[type="button"].btn-block { .progress-bar-animated { animation: progress-bar-stripes 1s linear infinite; } + @media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none; } } .media { display: flex; @@ -3595,6 +3728,7 @@ input[type="button"].btn-block { color: #495057; text-align: inherit; } .list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; color: #495057; text-decoration: none; background-color: #f8f9fa; } @@ -3616,11 +3750,9 @@ input[type="button"].btn-block { margin-bottom: 0; border-bottom-right-radius: 0.25rem; border-bottom-left-radius: 0.25rem; } - .list-group-item:hover, .list-group-item:focus { - z-index: 1; - text-decoration: none; } .list-group-item.disabled, .list-group-item:disabled { color: #6c757d; + pointer-events: none; background-color: #fff; } .list-group-item.active { z-index: 2; @@ -3628,15 +3760,97 @@ input[type="button"].btn-block { background-color: #1c3e5c; border-color: #1c3e5c; } +.list-group-horizontal { + flex-direction: row; } + .list-group-horizontal .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; } + .list-group-horizontal-sm .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal-sm .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-sm .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } } + +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; } + .list-group-horizontal-md .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal-md .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-md .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } } + +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; } + .list-group-horizontal-lg .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal-lg .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-lg .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } } + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; } + .list-group-horizontal-xl .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal-xl .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-xl .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } } + .list-group-flush .list-group-item { border-right: 0; border-left: 0; border-radius: 0; } + .list-group-flush .list-group-item:last-child { + margin-bottom: -1px; } .list-group-flush:first-child .list-group-item:first-child { border-top: 0; } .list-group-flush:last-child .list-group-item:last-child { + margin-bottom: 0; border-bottom: 0; } .list-group-item-primary { @@ -3735,18 +3949,53 @@ input[type="button"].btn-block { color: #000; text-shadow: 0 1px 0 #fff; opacity: .5; } - .close:not(:disabled):not(.disabled) { - cursor: pointer; } - .close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { - color: #000; - text-decoration: none; - opacity: .75; } + .close:hover { + color: #000; + text-decoration: none; } + .close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: .75; } button.close { padding: 0; background-color: transparent; border: 0; - -webkit-appearance: none; } + appearance: none; } + +a.close.disabled { + pointer-events: none; } + +.toast { + max-width: 350px; + overflow: hidden; + font-size: 0.875rem; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); + opacity: 0; + border-radius: 0.25rem; } + .toast:not(:last-child) { + margin-bottom: 0.75rem; } + .toast.showing { + opacity: 1; } + .toast.show { + display: block; + opacity: 1; } + .toast.hide { + display: none; } + +.toast-header { + display: flex; + align-items: center; + padding: 0.25rem 0.75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); } + +.toast-body { + padding: 0.75rem; } .modal-open { overflow: hidden; } @@ -3757,11 +4006,11 @@ button.close { .modal { position: fixed; top: 0; - right: 0; - bottom: 0; left: 0; z-index: 1050; display: none; + width: 100%; + height: 100%; overflow: hidden; outline: 0; } @@ -3772,21 +4021,41 @@ button.close { pointer-events: none; } .modal.fade .modal-dialog { transition: transform 0.3s ease-out; - transform: translate(0, -25%); } - @media screen and (prefers-reduced-motion: reduce) { + transform: translate(0, -50px); } + @media (prefers-reduced-motion: reduce) { .modal.fade .modal-dialog { transition: none; } } .modal.show .modal-dialog { - transform: translate(0, 0); } + transform: none; } + +.modal-dialog-scrollable { + display: flex; + max-height: calc(100% - 1rem); } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 1rem); + overflow: hidden; } + .modal-dialog-scrollable .modal-header, + .modal-dialog-scrollable .modal-footer { + flex-shrink: 0; } + .modal-dialog-scrollable .modal-body { + overflow-y: auto; } .modal-dialog-centered { display: flex; align-items: center; - min-height: calc(100% - (0.5rem * 2)); } + min-height: calc(100% - 1rem); } .modal-dialog-centered::before { display: block; - height: calc(100vh - (0.5rem * 2)); + height: calc(100vh - 1rem); content: ""; } + .modal-dialog-centered.modal-dialog-scrollable { + flex-direction: column; + justify-content: center; + height: 100%; } + .modal-dialog-centered.modal-dialog-scrollable .modal-content { + max-height: none; } + .modal-dialog-centered.modal-dialog-scrollable::before { + content: none; } .modal-content { position: relative; @@ -3803,10 +4072,10 @@ button.close { .modal-backdrop { position: fixed; top: 0; - right: 0; - bottom: 0; left: 0; z-index: 1040; + width: 100vw; + height: 100vh; background-color: #000; } .modal-backdrop.fade { opacity: 0; } @@ -3817,12 +4086,12 @@ button.close { display: flex; align-items: flex-start; justify-content: space-between; - padding: 1rem; - border-bottom: 1px solid #e9ecef; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; border-top-left-radius: 0.3rem; border-top-right-radius: 0.3rem; } .modal-header .close { - padding: 1rem; + padding: 1rem 1rem; margin: -1rem -1rem -1rem auto; } .modal-title { @@ -3839,7 +4108,9 @@ button.close { align-items: center; justify-content: flex-end; padding: 1rem; - border-top: 1px solid #e9ecef; } + border-top: 1px solid #dee2e6; + border-bottom-right-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; } .modal-footer > :not(:first-child) { margin-left: .25rem; } .modal-footer > :not(:last-child) { @@ -3856,23 +4127,32 @@ button.close { .modal-dialog { max-width: 500px; margin: 1.75rem auto; } + .modal-dialog-scrollable { + max-height: calc(100% - 3.5rem); } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 3.5rem); } .modal-dialog-centered { - min-height: calc(100% - (1.75rem * 2)); } + min-height: calc(100% - 3.5rem); } .modal-dialog-centered::before { - height: calc(100vh - (1.75rem * 2)); } + height: calc(100vh - 3.5rem); } .modal-sm { max-width: 300px; } } @media (min-width: 992px) { - .modal-lg { + .modal-lg, + .modal-xl { max-width: 800px; } } +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; } } + .tooltip { position: absolute; z-index: 1070; display: block; margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-style: normal; font-weight: 400; line-height: 1.5; @@ -3957,7 +4237,7 @@ button.close { z-index: 1060; display: block; max-width: 276px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-style: normal; font-weight: 400; line-height: 1.5; @@ -3992,57 +4272,45 @@ button.close { .bs-popover-top, .bs-popover-auto[x-placement^="top"] { margin-bottom: 0.5rem; } - .bs-popover-top .arrow, .bs-popover-auto[x-placement^="top"] .arrow { + .bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow { bottom: calc((0.5rem + 1px) * -1); } - .bs-popover-top .arrow::before, .bs-popover-auto[x-placement^="top"] .arrow::before, - .bs-popover-top .arrow::after, - .bs-popover-auto[x-placement^="top"] .arrow::after { - border-width: 0.5rem 0.5rem 0; } - .bs-popover-top .arrow::before, .bs-popover-auto[x-placement^="top"] .arrow::before { - bottom: 0; - border-top-color: rgba(0, 0, 0, 0.25); } - - .bs-popover-top .arrow::after, - .bs-popover-auto[x-placement^="top"] .arrow::after { - bottom: 1px; - border-top-color: #fff; } + .bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); } + .bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; } .bs-popover-right, .bs-popover-auto[x-placement^="right"] { margin-left: 0.5rem; } - .bs-popover-right .arrow, .bs-popover-auto[x-placement^="right"] .arrow { + .bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow { left: calc((0.5rem + 1px) * -1); width: 0.5rem; height: 1rem; margin: 0.3rem 0; } - .bs-popover-right .arrow::before, .bs-popover-auto[x-placement^="right"] .arrow::before, - .bs-popover-right .arrow::after, - .bs-popover-auto[x-placement^="right"] .arrow::after { - border-width: 0.5rem 0.5rem 0.5rem 0; } - .bs-popover-right .arrow::before, .bs-popover-auto[x-placement^="right"] .arrow::before { - left: 0; - border-right-color: rgba(0, 0, 0, 0.25); } - - .bs-popover-right .arrow::after, - .bs-popover-auto[x-placement^="right"] .arrow::after { - left: 1px; - border-right-color: #fff; } + .bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); } + .bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; } .bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] { margin-top: 0.5rem; } - .bs-popover-bottom .arrow, .bs-popover-auto[x-placement^="bottom"] .arrow { + .bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow { top: calc((0.5rem + 1px) * -1); } - .bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^="bottom"] .arrow::before, - .bs-popover-bottom .arrow::after, - .bs-popover-auto[x-placement^="bottom"] .arrow::after { - border-width: 0 0.5rem 0.5rem 0.5rem; } - .bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^="bottom"] .arrow::before { - top: 0; - border-bottom-color: rgba(0, 0, 0, 0.25); } - - .bs-popover-bottom .arrow::after, - .bs-popover-auto[x-placement^="bottom"] .arrow::after { - top: 1px; - border-bottom-color: #fff; } + .bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); } + .bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; } .bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { position: absolute; top: 0; @@ -4055,29 +4323,24 @@ button.close { .bs-popover-left, .bs-popover-auto[x-placement^="left"] { margin-right: 0.5rem; } - .bs-popover-left .arrow, .bs-popover-auto[x-placement^="left"] .arrow { + .bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow { right: calc((0.5rem + 1px) * -1); width: 0.5rem; height: 1rem; margin: 0.3rem 0; } - .bs-popover-left .arrow::before, .bs-popover-auto[x-placement^="left"] .arrow::before, - .bs-popover-left .arrow::after, - .bs-popover-auto[x-placement^="left"] .arrow::after { - border-width: 0.5rem 0 0.5rem 0.5rem; } - .bs-popover-left .arrow::before, .bs-popover-auto[x-placement^="left"] .arrow::before { - right: 0; - border-left-color: rgba(0, 0, 0, 0.25); } - - .bs-popover-left .arrow::after, - .bs-popover-auto[x-placement^="left"] .arrow::after { - right: 1px; - border-left-color: #fff; } + .bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); } + .bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; } .popover-header { padding: 0.5rem 0.75rem; margin-bottom: 0; font-size: 1rem; - color: inherit; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-top-left-radius: calc(0.3rem - 1px); @@ -4092,106 +4355,89 @@ button.close { .carousel { position: relative; } +.carousel.pointer-event { + touch-action: pan-y; } + .carousel-inner { position: relative; width: 100%; overflow: hidden; } + .carousel-inner::after { + display: block; + clear: both; + content: ""; } .carousel-item { position: relative; display: none; - align-items: center; + float: left; width: 100%; + margin-right: -100%; backface-visibility: hidden; - perspective: 1000px; } - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; - transition: transform 0.6s ease; } - @media screen and (prefers-reduced-motion: reduce) { - .carousel-item.active, - .carousel-item-next, - .carousel-item-prev { + transition: transform 0.6s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .carousel-item { transition: none; } } +.carousel-item.active, .carousel-item-next, .carousel-item-prev { - position: absolute; - top: 0; } - -.carousel-item-next.carousel-item-left, -.carousel-item-prev.carousel-item-right { - transform: translateX(0); } - @supports (transform-style: preserve-3d) { - .carousel-item-next.carousel-item-left, - .carousel-item-prev.carousel-item-right { - transform: translate3d(0, 0, 0); } } + display: block; } -.carousel-item-next, +.carousel-item-next:not(.carousel-item-left), .active.carousel-item-right { transform: translateX(100%); } - @supports (transform-style: preserve-3d) { - .carousel-item-next, - .active.carousel-item-right { - transform: translate3d(100%, 0, 0); } } -.carousel-item-prev, +.carousel-item-prev:not(.carousel-item-right), .active.carousel-item-left { transform: translateX(-100%); } - @supports (transform-style: preserve-3d) { - .carousel-item-prev, - .active.carousel-item-left { - transform: translate3d(-100%, 0, 0); } } .carousel-fade .carousel-item { opacity: 0; - transition-duration: .6s; - transition-property: opacity; } + transition-property: opacity; + transform: none; } .carousel-fade .carousel-item.active, .carousel-fade .carousel-item-next.carousel-item-left, .carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; opacity: 1; } .carousel-fade .active.carousel-item-left, .carousel-fade .active.carousel-item-right { - opacity: 0; } - -.carousel-fade .carousel-item-next, -.carousel-fade .carousel-item-prev, -.carousel-fade .carousel-item.active, -.carousel-fade .active.carousel-item-left, -.carousel-fade .active.carousel-item-prev { - transform: translateX(0); } - @supports (transform-style: preserve-3d) { - .carousel-fade .carousel-item-next, - .carousel-fade .carousel-item-prev, - .carousel-fade .carousel-item.active, + z-index: 0; + opacity: 0; + transition: 0s 0.6s opacity; } + @media (prefers-reduced-motion: reduce) { .carousel-fade .active.carousel-item-left, - .carousel-fade .active.carousel-item-prev { - transform: translate3d(0, 0, 0); } } + .carousel-fade .active.carousel-item-right { + transition: none; } } .carousel-control-prev, .carousel-control-next { position: absolute; top: 0; bottom: 0; + z-index: 1; display: flex; align-items: center; justify-content: center; width: 15%; color: #fff; text-align: center; - opacity: 0.5; } + opacity: 0.5; + transition: opacity 0.15s ease; } + @media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; } } .carousel-control-prev:hover, .carousel-control-prev:focus, .carousel-control-next:hover, .carousel-control-next:focus { color: #fff; text-decoration: none; outline: 0; - opacity: .9; } + opacity: 0.9; } .carousel-control-prev { left: 0; } @@ -4204,19 +4450,18 @@ button.close { display: inline-block; width: 20px; height: 20px; - background: transparent no-repeat center center; - background-size: 100% 100%; } + background: no-repeat 50% / 100% 100%; } .carousel-control-prev-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' 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"); } + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' 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"); } .carousel-control-next-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' 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"); } + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' 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"); } .carousel-indicators { position: absolute; right: 0; - bottom: 10px; + bottom: 0; left: 0; z-index: 15; display: flex; @@ -4226,7 +4471,7 @@ button.close { margin-left: 15%; list-style: none; } .carousel-indicators li { - position: relative; + box-sizing: content-box; flex: 0 1 auto; width: 30px; height: 3px; @@ -4234,25 +4479,17 @@ button.close { margin-left: 3px; text-indent: -999px; cursor: pointer; - background-color: rgba(255, 255, 255, 0.5); } - .carousel-indicators li::before { - position: absolute; - top: -10px; - left: 0; - display: inline-block; - width: 100%; - height: 10px; - content: ""; } - .carousel-indicators li::after { - position: absolute; - bottom: -10px; - left: 0; - display: inline-block; - width: 100%; - height: 10px; - content: ""; } + background-color: #fff; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + transition: opacity 0.6s ease; } + @media (prefers-reduced-motion: reduce) { + .carousel-indicators li { + transition: none; } } .carousel-indicators .active { - background-color: #fff; } + opacity: 1; } .carousel-caption { position: absolute; @@ -4265,6 +4502,45 @@ button.close { color: #fff; text-align: center; } +@keyframes spinner-border { + to { + transform: rotate(360deg); } } + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + animation: spinner-border .75s linear infinite; } + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; } + +@keyframes spinner-grow { + 0% { + transform: scale(0); } + 50% { + opacity: 1; } } + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + animation: spinner-grow .75s linear infinite; } + +.spinner-grow-sm { + width: 1rem; + height: 1rem; } + .align-baseline { vertical-align: baseline !important; } @@ -4410,6 +4686,9 @@ button.bg-dark:focus { .border-white { border-color: #fff !important; } +.rounded-sm { + border-radius: 0.2rem !important; } + .rounded { border-radius: 0.25rem !important; } @@ -4429,9 +4708,15 @@ button.bg-dark:focus { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } +.rounded-lg { + border-radius: 0.3rem !important; } + .rounded-circle { border-radius: 50% !important; } +.rounded-pill { + border-radius: 50rem !important; } + .rounded-0 { border-radius: 0 !important; } @@ -5024,6 +5309,12 @@ button.bg-dark:focus { .float-xl-none { float: none !important; } } +.overflow-auto { + overflow: auto !important; } + +.overflow-hidden { + overflow: hidden !important; } + .position-static { position: static !important; } @@ -5125,6 +5416,29 @@ button.bg-dark:focus { .mh-100 { max-height: 100% !important; } +.min-vw-100 { + min-width: 100vw !important; } + +.min-vh-100 { + min-height: 100vh !important; } + +.vw-100 { + width: 100vw !important; } + +.vh-100 { + height: 100vh !important; } + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + pointer-events: auto; + content: ""; + background-color: rgba(0, 0, 0, 0); } + .m-0 { margin: 0 !important; } @@ -5353,6 +5667,101 @@ button.bg-dark:focus { .px-5 { padding-left: 3rem !important; } +.m-n1 { + margin: -0.25rem !important; } + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; } + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; } + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; } + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; } + +.m-n2 { + margin: -0.5rem !important; } + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; } + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; } + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; } + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; } + +.m-n3 { + margin: -1rem !important; } + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; } + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; } + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; } + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; } + +.m-n4 { + margin: -1.5rem !important; } + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; } + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; } + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; } + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; } + +.m-n5 { + margin: -3rem !important; } + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; } + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; } + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; } + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; } + .m-auto { margin: auto !important; } @@ -5541,6 +5950,76 @@ button.bg-dark:focus { .pl-sm-5, .px-sm-5 { padding-left: 3rem !important; } + .m-sm-n1 { + margin: -0.25rem !important; } + .mt-sm-n1, + .my-sm-n1 { + margin-top: -0.25rem !important; } + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -0.25rem !important; } + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -0.25rem !important; } + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -0.25rem !important; } + .m-sm-n2 { + margin: -0.5rem !important; } + .mt-sm-n2, + .my-sm-n2 { + margin-top: -0.5rem !important; } + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -0.5rem !important; } + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -0.5rem !important; } + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -0.5rem !important; } + .m-sm-n3 { + margin: -1rem !important; } + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important; } + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important; } + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important; } + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important; } + .m-sm-n4 { + margin: -1.5rem !important; } + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important; } + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important; } + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important; } + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important; } + .m-sm-n5 { + margin: -3rem !important; } + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important; } + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important; } + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important; } + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important; } .m-sm-auto { margin: auto !important; } .mt-sm-auto, @@ -5725,6 +6204,76 @@ button.bg-dark:focus { .pl-md-5, .px-md-5 { padding-left: 3rem !important; } + .m-md-n1 { + margin: -0.25rem !important; } + .mt-md-n1, + .my-md-n1 { + margin-top: -0.25rem !important; } + .mr-md-n1, + .mx-md-n1 { + margin-right: -0.25rem !important; } + .mb-md-n1, + .my-md-n1 { + margin-bottom: -0.25rem !important; } + .ml-md-n1, + .mx-md-n1 { + margin-left: -0.25rem !important; } + .m-md-n2 { + margin: -0.5rem !important; } + .mt-md-n2, + .my-md-n2 { + margin-top: -0.5rem !important; } + .mr-md-n2, + .mx-md-n2 { + margin-right: -0.5rem !important; } + .mb-md-n2, + .my-md-n2 { + margin-bottom: -0.5rem !important; } + .ml-md-n2, + .mx-md-n2 { + margin-left: -0.5rem !important; } + .m-md-n3 { + margin: -1rem !important; } + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important; } + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important; } + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important; } + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important; } + .m-md-n4 { + margin: -1.5rem !important; } + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important; } + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important; } + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important; } + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important; } + .m-md-n5 { + margin: -3rem !important; } + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important; } + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important; } + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important; } + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important; } .m-md-auto { margin: auto !important; } .mt-md-auto, @@ -5909,6 +6458,76 @@ button.bg-dark:focus { .pl-lg-5, .px-lg-5 { padding-left: 3rem !important; } + .m-lg-n1 { + margin: -0.25rem !important; } + .mt-lg-n1, + .my-lg-n1 { + margin-top: -0.25rem !important; } + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -0.25rem !important; } + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -0.25rem !important; } + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -0.25rem !important; } + .m-lg-n2 { + margin: -0.5rem !important; } + .mt-lg-n2, + .my-lg-n2 { + margin-top: -0.5rem !important; } + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -0.5rem !important; } + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -0.5rem !important; } + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -0.5rem !important; } + .m-lg-n3 { + margin: -1rem !important; } + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important; } + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important; } + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important; } + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important; } + .m-lg-n4 { + margin: -1.5rem !important; } + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important; } + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important; } + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important; } + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important; } + .m-lg-n5 { + margin: -3rem !important; } + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important; } + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important; } + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important; } + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important; } .m-lg-auto { margin: auto !important; } .mt-lg-auto, @@ -6093,6 +6712,76 @@ button.bg-dark:focus { .pl-xl-5, .px-xl-5 { padding-left: 3rem !important; } + .m-xl-n1 { + margin: -0.25rem !important; } + .mt-xl-n1, + .my-xl-n1 { + margin-top: -0.25rem !important; } + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -0.25rem !important; } + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -0.25rem !important; } + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -0.25rem !important; } + .m-xl-n2 { + margin: -0.5rem !important; } + .mt-xl-n2, + .my-xl-n2 { + margin-top: -0.5rem !important; } + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -0.5rem !important; } + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -0.5rem !important; } + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -0.5rem !important; } + .m-xl-n3 { + margin: -1rem !important; } + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important; } + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important; } + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important; } + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important; } + .m-xl-n4 { + margin: -1.5rem !important; } + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important; } + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important; } + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important; } + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important; } + .m-xl-n5 { + margin: -3rem !important; } + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important; } + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important; } + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important; } + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important; } .m-xl-auto { margin: auto !important; } .mt-xl-auto, @@ -6109,11 +6798,14 @@ button.bg-dark:focus { margin-left: auto !important; } } .text-monospace { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; } .text-justify { text-align: justify !important; } +.text-wrap { + white-space: normal !important; } + .text-nowrap { white-space: nowrap !important; } @@ -6175,12 +6867,18 @@ button.bg-dark:focus { .font-weight-light { font-weight: 300 !important; } +.font-weight-lighter { + font-weight: lighter !important; } + .font-weight-normal { font-weight: 400 !important; } .font-weight-bold { font-weight: 700 !important; } +.font-weight-bolder { + font-weight: bolder !important; } + .font-italic { font-style: italic !important; } @@ -6191,49 +6889,49 @@ button.bg-dark:focus { color: #1c3e5c !important; } a.text-primary:hover, a.text-primary:focus { - color: #102435 !important; } + color: #0a1621 !important; } .text-secondary { color: #b6b6ba !important; } a.text-secondary:hover, a.text-secondary:focus { - color: #9c9ca1 !important; } + color: #8f8f95 !important; } .text-success { color: #28a745 !important; } a.text-success:hover, a.text-success:focus { - color: #1e7e34 !important; } + color: #19692c !important; } .text-info { color: #17a2b8 !important; } a.text-info:hover, a.text-info:focus { - color: #117a8b !important; } + color: #0f6674 !important; } .text-warning { color: #fbfb83 !important; } a.text-warning:hover, a.text-warning:focus { - color: #f9f952 !important; } + color: #f9f939 !important; } .text-danger { color: #dc3545 !important; } a.text-danger:hover, a.text-danger:focus { - color: #bd2130 !important; } + color: #a71d2a !important; } .text-light { color: #f8f9fa !important; } a.text-light:hover, a.text-light:focus { - color: #dae0e5 !important; } + color: #cbd3da !important; } .text-dark { color: #343a40 !important; } a.text-dark:hover, a.text-dark:focus { - color: #1d2124 !important; } + color: #121416 !important; } .text-body { color: #212529 !important; } @@ -6254,6 +6952,16 @@ a.text-dark:hover, a.text-dark:focus { background-color: transparent; border: 0; } +.text-decoration-none { + text-decoration: none !important; } + +.text-break { + word-break: break-word !important; + overflow-wrap: break-word !important; } + +.text-reset { + color: inherit !important; } + .visible { visibility: visible !important; } diff --git a/LCU/Maintenance/MDB_tools/fabfile.py b/LCU/Maintenance/MDB_tools/fabfile.py index a772ee3b0b6c1b02e8ec31681fb4e268014c9ab0..509ea040065ef0602b8dd984218fec5bfe9a3b50 100644 --- a/LCU/Maintenance/MDB_tools/fabfile.py +++ b/LCU/Maintenance/MDB_tools/fabfile.py @@ -6,8 +6,8 @@ import time import os -BUILD_DIR = '/home/mmancini/svn-tree/MonitoringMaintenance-SW300/build/gnu_debug/' -LOCAL_DIR = '/home/mmancini/svn-tree/MonitoringMaintenance-SW300/build/gnu_debug/installed' +BUILD_DIR = os.getcwd() +LOCAL_DIR = os.path.join(BUILD_DIR, 'installed') REMOTE_DIR = '/data/mancini/deploy/' REMOTE_INSTALL_DIR = 'installed' PATH_SETTINGS_FILE = 'lib64/python3.6/site-packages/lofar/maintenance/django_postgresql/settings.py'