diff --git a/.github/workflows/close_old_issues_and_prs.yml b/.github/workflows/close_old_issues_and_prs.yml index e55b2706..13dbac27 100644 --- a/.github/workflows/close_old_issues_and_prs.yml +++ b/.github/workflows/close_old_issues_and_prs.yml @@ -14,7 +14,7 @@ jobs: pull-requests: write steps: - name: Mark/Close Stale Issues and Pull Requests 🗑️ - uses: actions/stale@v10.2.0 + uses: actions/stale@v11.0.0 with: repo-token: ${{ secrets.STALE_ACTION_PAT }} days-before-stale: 60 diff --git a/.github/workflows/image_builds.yml b/.github/workflows/image_builds.yml index c8ec7cca..aa56b038 100644 --- a/.github/workflows/image_builds.yml +++ b/.github/workflows/image_builds.yml @@ -27,7 +27,7 @@ jobs: - "watchdog-mailcow" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Setup Docker run: | curl -sSL https://get.docker.com/ | CHANNEL=stable sudo sh diff --git a/.github/workflows/pr_to_nightly.yml b/.github/workflows/pr_to_nightly.yml index 548fabde..8d6b2524 100644 --- a/.github/workflows/pr_to_nightly.yml +++ b/.github/workflows/pr_to_nightly.yml @@ -8,11 +8,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: fetch-depth: 0 - name: Run the Action - uses: devops-infra/action-pull-request@v1.0.2 + uses: devops-infra/action-pull-request@v1.4.0 with: github_token: ${{ secrets.PRTONIGHTLY_ACTION_PAT }} title: Automatic PR to nightly from ${{ github.event.repository.updated_at}} diff --git a/.github/workflows/rebuild_backup_image.yml b/.github/workflows/rebuild_backup_image.yml index b18d339b..4490afee 100644 --- a/.github/workflows/rebuild_backup_image.yml +++ b/.github/workflows/rebuild_backup_image.yml @@ -13,7 +13,7 @@ jobs: packages: write steps: - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Set up QEMU uses: docker/setup-qemu-action@v4 diff --git a/.github/workflows/update_postscreen_access_list.yml b/.github/workflows/update_postscreen_access_list.yml index 066616ae..ed63281c 100644 --- a/.github/workflows/update_postscreen_access_list.yml +++ b/.github/workflows/update_postscreen_access_list.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Generate postscreen_access.cidr run: | diff --git a/.gitignore b/.gitignore index 05878300..c8e8ffb5 100644 --- a/.gitignore +++ b/.gitignore @@ -64,6 +64,8 @@ data/web/templates/cache/* !data/web/templates/cache/.gitkeep data/web/.well-known/acme-challenge data/web/css/build/0081-custom-mailcow.css +data/web/css/themes/*/ +!data/web/css/themes/servercow/ data/web/inc/vars.local.inc.php data/web/inc/app_info.inc.php data/web/nextcloud*/ diff --git a/README.md b/README.md index 40288f10..63d0b648 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,15 @@ A big thank you to everyone supporting us on GitHub Sponsors—your contribution + ### 50$/Month Sponsors ## Info, documentation and support diff --git a/data/Dockerfiles/acme/acme.sh b/data/Dockerfiles/acme/acme.sh index 271de4fc..6b7b7430 100755 --- a/data/Dockerfiles/acme/acme.sh +++ b/data/Dockerfiles/acme/acme.sh @@ -249,12 +249,33 @@ while true; do done <<< "${SQL_DOMAINS}" if [[ ${ONLY_MAILCOW_HOSTNAME} != "y" ]]; then + # Fetch all domains with an active MTA-STS policy once. + unset MTA_STS_ACTIVE_DOMAINS + declare -A MTA_STS_ACTIVE_DOMAINS + if [[ ${AUTODISCOVER_SAN} == "y" ]]; then + SQL_MTA_STS_DOMAINS=$(mariadb --skip-ssl --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT domain FROM mta_sts WHERE active = 1" -Bs) + if [[ $? -eq 0 ]]; then + while read mta_sts_domain; do + if [[ -z "${mta_sts_domain}" ]]; then + # ignore empty lines + continue + fi + MTA_STS_ACTIVE_DOMAINS["${mta_sts_domain}"]=1 + done <<< "${SQL_MTA_STS_DOMAINS}" + fi + fi for SQL_DOMAIN in "${SQL_DOMAIN_ARR[@]}"; do unset VALIDATED_CONFIG_DOMAINS_SUBDOMAINS declare -a VALIDATED_CONFIG_DOMAINS_SUBDOMAINS for SUBDOMAIN in "${ADDITIONAL_WC_ARR[@]}"; do FULL_SUBDOMAIN="${SUBDOMAIN}.${SQL_DOMAIN}" + # Skip mta-sts subdomain unless MTA-STS is enabled (active) for this domain + if [[ "${SUBDOMAIN}" == "mta-sts" && -z "${MTA_STS_ACTIVE_DOMAINS[${SQL_DOMAIN}]}" ]]; then + log_f "MTA-STS is not enabled for ${SQL_DOMAIN} - skipping mta-sts subdomain certificate" + continue + fi + # Skip if subdomain matches MAILCOW_HOSTNAME if [[ "${FULL_SUBDOMAIN}" == "${MAILCOW_HOSTNAME}" ]]; then continue diff --git a/data/Dockerfiles/clamd/Dockerfile b/data/Dockerfiles/clamd/Dockerfile index e60e7eef..5f444a8f 100644 --- a/data/Dockerfiles/clamd/Dockerfile +++ b/data/Dockerfiles/clamd/Dockerfile @@ -1,7 +1,7 @@ -FROM alpine:3.21 AS builder +FROM alpine:3.24 AS builder WORKDIR /src -ENV CLAMD_VERSION=1.4.2 +ENV CLAMD_VERSION=1.4.6 RUN apk upgrade --no-cache \ && apk add --update --no-cache \ @@ -68,7 +68,7 @@ RUN wget -P /src https://www.clamav.net/downloads/production/clamav-${CLAMD_VERS "/clamav/etc/clamav/clamav-milter.conf.sample" > "/clamav/etc/clamav/clamav-milter.conf" || exit 1 -FROM alpine:3.21 +FROM alpine:3.24 LABEL maintainer = "The Infrastructure Company GmbH " diff --git a/data/Dockerfiles/dovecot/quarantine_notify.py b/data/Dockerfiles/dovecot/quarantine_notify.py index a681c1fd..5757cdf5 100755 --- a/data/Dockerfiles/dovecot/quarantine_notify.py +++ b/data/Dockerfiles/dovecot/quarantine_notify.py @@ -47,7 +47,7 @@ try: if max_score == "": max_score = 9999.0 - def query_mysql(query, headers = True, update = False): + def query_mysql(query, params = None, headers = True, update = False): while True: try: cnx = MySQLdb.connect(user=os.environ.get('DBUSER'), password=os.environ.get('DBPASS'), database=os.environ.get('DBNAME'), charset="utf8mb4", collation="utf8mb4_general_ci") @@ -57,7 +57,10 @@ try: else: break cur = cnx.cursor() - cur.execute(query) + if params: + cur.execute(query, params) + else: + cur.execute(query) if not update: result = [] columns = tuple( [d[0] for d in cur.description] ) @@ -76,7 +79,7 @@ try: def notify_rcpt(rcpt, msg_count, quarantine_acl, category): if category == "add_header": category = "add header" - meta_query = query_mysql('SELECT `qhash`, id, subject, score, sender, created, action FROM quarantine WHERE notified = 0 AND rcpt = "%s" AND score < %f AND (action = "%s" OR "all" = "%s")' % (rcpt, max_score, category, category)) + meta_query = query_mysql('SELECT `qhash`, id, subject, score, sender, created, action FROM quarantine WHERE notified = 0 AND rcpt = %s AND score < %s AND (action = %s OR "all" = %s)', (rcpt, max_score, category, category)) print("%s: %d of %d messages qualify for notification" % (rcpt, len(meta_query), msg_count)) if len(meta_query) == 0: return @@ -130,7 +133,7 @@ try: server.sendmail(msg['From'], [str(redirect)] + [str(bcc)], text) server.quit() for res in meta_query: - query_mysql('UPDATE quarantine SET notified = 1 WHERE id = "%d"' % (res['id']), update = True) + query_mysql('UPDATE quarantine SET notified = 1 WHERE id = %s', (res['id'],), update = True) r.hset('Q_LAST_NOTIFIED', record['rcpt'], time_now) break except Exception as ex: @@ -138,7 +141,7 @@ try: print('%s' % (ex)) time.sleep(3) - records = query_mysql('SELECT IFNULL(user_acl.quarantine, 0) AS quarantine_acl, count(id) AS counter, rcpt FROM quarantine LEFT OUTER JOIN user_acl ON user_acl.username = rcpt WHERE notified = 0 AND score < %f AND rcpt in (SELECT username FROM mailbox) GROUP BY rcpt' % (max_score)) + records = query_mysql('SELECT IFNULL(user_acl.quarantine, 0) AS quarantine_acl, count(id) AS counter, rcpt FROM quarantine LEFT OUTER JOIN user_acl ON user_acl.username = rcpt WHERE notified = 0 AND score < %s AND rcpt in (SELECT username FROM mailbox) GROUP BY rcpt', (max_score,)) for record in records: attrs = '' @@ -156,7 +159,7 @@ try: except Exception as ex: print('Could not determine last notification for %s, assuming never' % (record['rcpt'])) last_notification = 0 - attrs_json = query_mysql('SELECT attributes FROM mailbox WHERE username = "%s"' % (record['rcpt'])) + attrs_json = query_mysql('SELECT attributes FROM mailbox WHERE username = %s', (record['rcpt'],)) attrs = attrs_json[0]['attributes'] if isinstance(attrs, str): # if attr is str then just load it diff --git a/data/Dockerfiles/nginx/Dockerfile b/data/Dockerfiles/nginx/Dockerfile index 7d2ce34f..c4230482 100644 --- a/data/Dockerfiles/nginx/Dockerfile +++ b/data/Dockerfiles/nginx/Dockerfile @@ -1,4 +1,4 @@ -FROM nginx:alpine +FROM nginx:1.30.6-alpine LABEL maintainer "The Infrastructure Company GmbH " ENV PIP_BREAK_SYSTEM_PACKAGES=1 diff --git a/data/Dockerfiles/phpfpm/Dockerfile b/data/Dockerfiles/phpfpm/Dockerfile index 7917d7f7..af23bc2e 100644 --- a/data/Dockerfiles/phpfpm/Dockerfile +++ b/data/Dockerfiles/phpfpm/Dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2-fpm-alpine3.21 +FROM php:8.2-fpm-alpine3.24 LABEL maintainer = "The Infrastructure Company GmbH " @@ -7,13 +7,13 @@ ARG APCU_PECL_VERSION=5.1.28 # renovate: datasource=github-tags depName=Imagick/imagick versioning=semver-coerced extractVersion=(?.*)$ ARG IMAGICK_PECL_VERSION=3.8.1 # renovate: datasource=github-tags depName=php/pecl-mail-mailparse versioning=semver-coerced extractVersion=^v(?.*)$ -ARG MAILPARSE_PECL_VERSION=3.1.9 +ARG MAILPARSE_PECL_VERSION=3.2.0 # renovate: datasource=github-tags depName=php-memcached-dev/php-memcached versioning=semver-coerced extractVersion=^v(?.*)$ ARG MEMCACHED_PECL_VERSION=3.4.0 # renovate: datasource=github-tags depName=phpredis/phpredis versioning=semver-coerced extractVersion=(?.*)$ ARG REDIS_PECL_VERSION=6.3.0 # renovate: datasource=github-tags depName=composer/composer versioning=semver-coerced extractVersion=(?.*)$ -ARG COMPOSER_VERSION=2.9.5 +ARG COMPOSER_VERSION=2.10.2 RUN apk add -U --no-cache autoconf \ aspell-dev \ @@ -47,6 +47,7 @@ RUN apk add -U --no-cache autoconf \ libressl-dev \ librsvg \ libtool \ + libwebp \ libwebp-dev \ libxml2-dev \ libxpm \ @@ -63,13 +64,16 @@ RUN apk add -U --no-cache autoconf \ samba-client \ zlib-dev \ tzdata \ - && pecl install APCu-${APCU_PECL_VERSION} \ - && pecl install imagick-${IMAGICK_PECL_VERSION} \ - && pecl install mailparse-${MAILPARSE_PECL_VERSION} \ - && pecl install memcached-${MEMCACHED_PECL_VERSION} \ - && pecl install redis-${REDIS_PECL_VERSION} \ - && docker-php-ext-enable apcu imagick memcached mailparse redis \ - && pecl clear-cache \ + && docker-php-source extract \ + # PECL extensions from their GitHub tags (pecl.php.net is not reliable enough for builds) + && mkdir -p /usr/src/php/ext/apcu /usr/src/php/ext/imagick /usr/src/php/ext/mailparse /usr/src/php/ext/memcached /usr/src/php/ext/redis \ + && curl -fsSL https://github.com/krakjoe/apcu/archive/refs/tags/v${APCU_PECL_VERSION}.tar.gz | tar -xz --strip-components=1 -C /usr/src/php/ext/apcu \ + && curl -fsSL https://github.com/Imagick/imagick/archive/refs/tags/${IMAGICK_PECL_VERSION}.tar.gz | tar -xz --strip-components=1 -C /usr/src/php/ext/imagick \ + && sed -i "s/@PACKAGE_VERSION@/${IMAGICK_PECL_VERSION}/" /usr/src/php/ext/imagick/php_imagick.h \ + && curl -fsSL https://github.com/php/pecl-mail-mailparse/archive/refs/tags/v${MAILPARSE_PECL_VERSION}.tar.gz | tar -xz --strip-components=1 -C /usr/src/php/ext/mailparse \ + && curl -fsSL https://github.com/php-memcached-dev/php-memcached/archive/refs/tags/v${MEMCACHED_PECL_VERSION}.tar.gz | tar -xz --strip-components=1 -C /usr/src/php/ext/memcached \ + && curl -fsSL https://github.com/phpredis/phpredis/archive/refs/tags/${REDIS_PECL_VERSION}.tar.gz | tar -xz --strip-components=1 -C /usr/src/php/ext/redis \ + && docker-php-ext-install -j 4 apcu imagick mailparse memcached redis \ && docker-php-ext-configure intl \ && docker-php-ext-configure exif \ && docker-php-ext-configure gd --with-freetype=/usr/include/ \ @@ -83,6 +87,7 @@ RUN apk add -U --no-cache autoconf \ && curl --silent --show-error https://getcomposer.org/installer | php -- --version=${COMPOSER_VERSION} \ && mv composer.phar /usr/local/bin/composer \ && chmod +x /usr/local/bin/composer \ + && docker-php-source delete \ && apk del --purge autoconf \ aspell-dev \ cyrus-sasl-dev \ diff --git a/data/Dockerfiles/postfix-tlspol/Dockerfile b/data/Dockerfiles/postfix-tlspol/Dockerfile index 68f6ecce..51e8f775 100644 --- a/data/Dockerfiles/postfix-tlspol/Dockerfile +++ b/data/Dockerfiles/postfix-tlspol/Dockerfile @@ -1,17 +1,17 @@ -FROM golang:1.25-bookworm AS builder +FROM golang:1.26-trixie AS builder WORKDIR /src ENV CGO_ENABLED=0 \ GO111MODULE=on \ NOOPT=1 \ - VERSION=1.8.22 + VERSION=1.14.0 RUN git clone --branch v${VERSION} https://github.com/Zuplu/postfix-tlspol && \ cd /src/postfix-tlspol && \ scripts/build.sh build-only -FROM debian:bookworm-slim +FROM debian:trixie-slim LABEL maintainer="The Infrastructure Company GmbH " ARG DEBIAN_FRONTEND=noninteractive diff --git a/data/Dockerfiles/postfix-tlspol/syslog-ng-redis_slave.conf b/data/Dockerfiles/postfix-tlspol/syslog-ng-redis_slave.conf index 3862a354..022dfc3d 100644 --- a/data/Dockerfiles/postfix-tlspol/syslog-ng-redis_slave.conf +++ b/data/Dockerfiles/postfix-tlspol/syslog-ng-redis_slave.conf @@ -1,4 +1,4 @@ -@version: 3.38 +@version: 4.8 @include "scl.conf" options { chain_hostnames(off); @@ -7,7 +7,7 @@ options { dns_cache(no); use_fqdn(no); owner("root"); group("adm"); perm(0640); - stats_freq(0); + stats(freq(0)); bad_hostname("^gconfd$"); }; source s_src { diff --git a/data/Dockerfiles/postfix-tlspol/syslog-ng.conf b/data/Dockerfiles/postfix-tlspol/syslog-ng.conf index 7126c125..70c92b5c 100644 --- a/data/Dockerfiles/postfix-tlspol/syslog-ng.conf +++ b/data/Dockerfiles/postfix-tlspol/syslog-ng.conf @@ -1,4 +1,4 @@ -@version: 3.38 +@version: 4.8 @include "scl.conf" options { chain_hostnames(off); @@ -7,7 +7,7 @@ options { dns_cache(no); use_fqdn(no); owner("root"); group("adm"); perm(0640); - stats_freq(0); + stats(freq(0)); bad_hostname("^gconfd$"); }; source s_src { diff --git a/data/Dockerfiles/postfix/Dockerfile b/data/Dockerfiles/postfix/Dockerfile index 994612ec..cf064769 100644 --- a/data/Dockerfiles/postfix/Dockerfile +++ b/data/Dockerfiles/postfix/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:bookworm-slim +FROM debian:trixie-slim LABEL maintainer="The Infrastructure Company GmbH " diff --git a/data/Dockerfiles/postfix/syslog-ng-redis_slave.conf b/data/Dockerfiles/postfix/syslog-ng-redis_slave.conf index 8e15932a..bbc9420f 100644 --- a/data/Dockerfiles/postfix/syslog-ng-redis_slave.conf +++ b/data/Dockerfiles/postfix/syslog-ng-redis_slave.conf @@ -1,4 +1,4 @@ -@version: 3.38 +@version: 4.8 @include "scl.conf" options { chain_hostnames(off); @@ -7,7 +7,7 @@ options { dns_cache(no); use_fqdn(no); owner("root"); group("adm"); perm(0640); - stats_freq(0); + stats(freq(0)); bad_hostname("^gconfd$"); }; source s_src { diff --git a/data/Dockerfiles/postfix/syslog-ng.conf b/data/Dockerfiles/postfix/syslog-ng.conf index fc7d1aa0..8f09d04a 100644 --- a/data/Dockerfiles/postfix/syslog-ng.conf +++ b/data/Dockerfiles/postfix/syslog-ng.conf @@ -1,4 +1,4 @@ -@version: 3.38 +@version: 4.8 @include "scl.conf" options { chain_hostnames(off); @@ -7,7 +7,7 @@ options { dns_cache(no); use_fqdn(no); owner("root"); group("adm"); perm(0640); - stats_freq(0); + stats(freq(0)); bad_hostname("^gconfd$"); }; source s_src { diff --git a/data/Dockerfiles/rspamd/Dockerfile b/data/Dockerfiles/rspamd/Dockerfile index d0c71042..534ed943 100644 --- a/data/Dockerfiles/rspamd/Dockerfile +++ b/data/Dockerfiles/rspamd/Dockerfile @@ -2,7 +2,7 @@ FROM debian:trixie-slim LABEL maintainer="The Infrastructure Company GmbH " ARG DEBIAN_FRONTEND=noninteractive -ARG RSPAMD_VER=rspamd_3.14.3-1~236eb65 +ARG RSPAMD_VER=rspamd_4.2.1-1~b7a16ae ARG CODENAME=trixie ENV LC_ALL=C diff --git a/data/Dockerfiles/sogo/Dockerfile b/data/Dockerfiles/sogo/Dockerfile index 96d2e0a4..99783130 100644 --- a/data/Dockerfiles/sogo/Dockerfile +++ b/data/Dockerfiles/sogo/Dockerfile @@ -1,6 +1,6 @@ # SOGo built from source to enable security patch application # Repository: https://github.com/Alinto/sogo -# Version: SOGo-5.12.4 +# Version: SOGo-5.12.12 # # Applied security patches: # - @@ -12,8 +12,8 @@ FROM debian:bookworm LABEL maintainer="The Infrastructure Company GmbH " ARG DEBIAN_FRONTEND=noninteractive -ARG SOGO_VERSION=SOGo-5.12.5 -ARG SOPE_VERSION=SOPE-5.12.5 +ARG SOGO_VERSION=SOGo-5.12.12 +ARG SOPE_VERSION=SOPE-5.12.12 # Security patches to apply (space-separated commit hashes) ARG SOGO_SECURITY_PATCHES="" # renovate: datasource=github-releases depName=tianon/gosu versioning=semver-coerced extractVersion=^(?.*)$ diff --git a/data/Dockerfiles/unbound/Dockerfile b/data/Dockerfiles/unbound/Dockerfile index 7c492138..321158e0 100644 --- a/data/Dockerfiles/unbound/Dockerfile +++ b/data/Dockerfiles/unbound/Dockerfile @@ -2,11 +2,15 @@ FROM alpine:3.23 LABEL maintainer = "The Infrastructure Company GmbH " +# install unbound from alpine:edge to get security patches +# minimum version is pinned +RUN apk add --no-cache --repository=https://dl-cdn.alpinelinux.org/alpine/edge/main "unbound>=1.26.1-r0" + +# install other packages from regular alpine stable repo RUN apk add --update --no-cache \ curl \ bind-tools \ coreutils \ - unbound \ bash \ openssl \ drill \ diff --git a/data/conf/dovecot/auth/passwd-verify.lua b/data/conf/dovecot/auth/passwd-verify.lua index ea847932..a22488ea 100644 --- a/data/conf/dovecot/auth/passwd-verify.lua +++ b/data/conf/dovecot/auth/passwd-verify.lua @@ -32,8 +32,17 @@ function auth_password_verify(request, password) -- Returning PASSDB_RESULT_PASSWORD_MISMATCH will reset the user's auth cache entry. -- Returning PASSDB_RESULT_INTERNAL_FAILURE keeps the existing cache entry, -- even if the TTL has expired. Useful to avoid cache eviction during backend issues. + + -- On a network-level failure (nginx unreachable, DNS failure, timeout) https.request + -- returns nil plus an error string, so c is not a numeric HTTP status code. Treat this + -- as a backend outage and keep the cache entry, rather than wiping it as a mismatch. + if type(c) ~= "number" then + dovecot.i_info("HTTP request to auth backend failed with " .. tostring(c) .. " for user " .. request.user) + return dovecot.auth.PASSDB_RESULT_INTERNAL_FAILURE, "Upstream unreachable" + end + if c ~= 200 and c ~= 401 then - dovecot.i_info("HTTP request failed with " .. c .. " for user " .. request.user) + dovecot.i_info("HTTP request failed with " .. tostring(c) .. " for user " .. request.user) return dovecot.auth.PASSDB_RESULT_PASSWORD_MISMATCH, "Upstream error" end diff --git a/data/conf/dovecot/global_sieve_before b/data/conf/dovecot/global_sieve_before index 3e79ca1d..e71be510 100644 --- a/data/conf/dovecot/global_sieve_before +++ b/data/conf/dovecot/global_sieve_before @@ -1,13 +1,3 @@ # global_sieve_before script # global_sieve_before -> user sieve_before (mailcow UI) -> user sieve_after (mailcow UI) -> global_sieve_after -require ["mailbox", "fileinto"]; - -if header :contains ["Chat-Version"] [""] { - if mailboxexists "DeltaChat" { - fileinto "DeltaChat"; - } else { - fileinto :create "DeltaChat"; - } - stop; -} diff --git a/data/conf/nginx/templates/nginx.conf.j2 b/data/conf/nginx/templates/nginx.conf.j2 index 08a85a14..861c7e56 100644 --- a/data/conf/nginx/templates/nginx.conf.j2 +++ b/data/conf/nginx/templates/nginx.conf.j2 @@ -42,12 +42,19 @@ http { https https; } + map $server_port $sogo_auth_internal { + 65510 "1"; + default ""; + } + {% if HTTP_REDIRECT %} # HTTP to HTTPS redirect server { root /web; listen {{ HTTP_PORT }} default_server; + {% if ENABLE_IPV6 %} listen [::]:{{ HTTP_PORT }} default_server; + {%endif%} server_name {{ MAILCOW_HOSTNAME }} autodiscover.* autoconfig.* mta-sts.* {{ ADDITIONAL_SERVER_NAMES | join(' ') }}; diff --git a/data/conf/nginx/templates/sites-default.conf.j2 b/data/conf/nginx/templates/sites-default.conf.j2 index 84bd8eae..842c50a5 100644 --- a/data/conf/nginx/templates/sites-default.conf.j2 +++ b/data/conf/nginx/templates/sites-default.conf.j2 @@ -116,6 +116,9 @@ location ~ \.php$ { include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param HTTP_X_REAL_IP $remote_addr; + # trusted internal-auth marker; empty for external clients (see nginx.conf map) + fastcgi_param SOGO_AUTH_INTERNAL $sogo_auth_internal; fastcgi_read_timeout 3600; fastcgi_send_timeout 3600; } diff --git a/data/conf/phpfpm/php-conf.d/other.ini b/data/conf/phpfpm/php-conf.d/other.ini index 02f59a9c..e60e9f81 100644 --- a/data/conf/phpfpm/php-conf.d/other.ini +++ b/data/conf/phpfpm/php-conf.d/other.ini @@ -1,3 +1,5 @@ max_execution_time = 3600 max_input_time = 3600 memory_limit = 512M +; not used by mailcow, disabled as hardening (PHP security release 2026-10-21) +session.upload_progress.enabled = Off diff --git a/data/conf/postfix/main.cf b/data/conf/postfix/main.cf index f091cb3f..4329f548 100644 --- a/data/conf/postfix/main.cf +++ b/data/conf/postfix/main.cf @@ -37,7 +37,7 @@ postscreen_access_list = permit_mynetworks, cidr:/opt/postfix/conf/postscreen_access.cidr, tcp:127.0.0.1:10027 postscreen_bare_newline_enable = no -postscreen_blacklist_action = drop +postscreen_denylist_action = drop postscreen_cache_cleanup_interval = 24h postscreen_cache_map = proxy:btree:$data_directory/postscreen_cache postscreen_dnsbl_action = enforce @@ -107,8 +107,6 @@ smtpd_sender_restrictions = reject_authenticated_sender_login_mismatch, reject_unknown_sender_domain smtpd_soft_error_limit = 3 smtpd_tls_auth_only = yes -smtpd_tls_dh1024_param_file = /etc/ssl/mail/dhparams.pem -smtpd_tls_eecdh_grade = auto smtpd_tls_exclude_ciphers = ECDHE-RSA-RC4-SHA, RC4, aNULL, DES-CBC3-SHA, ECDHE-RSA-DES-CBC3-SHA, EDH-RSA-DES-CBC3-SHA smtpd_tls_loglevel = 1 @@ -152,7 +150,7 @@ smtp_sasl_auth_enable = yes smtp_sasl_password_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_sasl_passwd_maps_sender_dependent.cf smtp_sasl_security_options = smtp_sasl_mechanism_filter = plain, login -smtp_tls_policy_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_tls_policy_override_maps.cf socketmap:inet:postfix-tlspol:8642:QUERY +smtp_tls_policy_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_tls_policy_override_maps.cf socketmap:inet:postfix-tlspol:8642:QUERYwithTLSRPT smtp_header_checks = pcre:/opt/postfix/conf/anonymize_headers.pcre mail_name = Postcow # local_transport map catches local destinations and prevents routing local dests when the next map would route "*" diff --git a/data/conf/postfix/master.cf b/data/conf/postfix/master.cf index d5114df2..fb49f2df 100644 --- a/data/conf/postfix/master.cf +++ b/data/conf/postfix/master.cf @@ -29,7 +29,6 @@ smtps inet n - n - - smtpd # TLS protocol can be modified by setting submission_smtpd_tls_mandatory_protocols in extra.cf submission inet n - n - - smtpd -o smtpd_client_restrictions=permit_mynetworks,permit_sasl_authenticated,reject - -o smtpd_enforce_tls=yes -o smtpd_tls_security_level=encrypt -o smtpd_tls_mandatory_protocols=$submission_smtpd_tls_mandatory_protocols -o tls_preempt_cipherlist=yes @@ -38,7 +37,6 @@ submission inet n - n - - smtpd 10587 inet n - n - - smtpd -o smtpd_upstream_proxy_protocol=haproxy -o smtpd_client_restrictions=permit_mynetworks,permit_sasl_authenticated,reject - -o smtpd_enforce_tls=yes -o smtpd_tls_security_level=encrypt -o smtpd_tls_mandatory_protocols=$submission_smtpd_tls_mandatory_protocols -o tls_preempt_cipherlist=yes diff --git a/data/conf/postfix/postscreen_access.cidr b/data/conf/postfix/postscreen_access.cidr index de38fe39..b479644d 100644 --- a/data/conf/postfix/postscreen_access.cidr +++ b/data/conf/postfix/postscreen_access.cidr @@ -1,7 +1,8 @@ -# Whitelist generated by Postwhite v3.4 on Sun Mar 1 00:29:01 UTC 2026 +# Whitelist generated by Postwhite v3.4 on Thu Oct 1 00:35:20 UTC 2026 # https://github.com/stevejenkins/postwhite/ -# 2174 total rules +# 2246 total rules 2a00:1450:4000::/36 permit +2a00:1450:4864::/56 permit 2a01:111:f400::/48 permit 2a01:111:f403:2800::/53 permit 2a01:111:f403:8000::/51 permit @@ -28,11 +29,15 @@ 2a01:b747:3004:200::/56 permit 2a01:b747:3005:200::/56 permit 2a01:b747:3006:200::/56 permit +2a01:b747:3007::/56 permit 2a02:a60:0:5::/64 permit 2a0f:f640::/56 permit 2c0f:fb50:4000::/36 permit +2c0f:fb50:4864::/56 permit +2.207.151.32/27 permit 2.207.151.53 permit 2.207.217.30 permit +2.207.223.160/27 permit 3.64.237.68 permit 3.65.3.180 permit 3.70.123.177 permit @@ -53,13 +58,14 @@ 8.25.196.0/23 permit 8.36.116.0/24 permit 8.39.54.0/23 permit +8.39.54.240/29 permit 8.39.54.250/31 permit 8.39.144.0/24 permit 8.40.222.0/23 permit +8.40.222.240/29 permit 8.40.222.250/31 permit +8.47.10.9 permit 12.130.86.238 permit -13.107.213.51 permit -13.107.246.51 permit 13.108.16.0/20 permit 13.110.208.0/21 permit 13.110.209.0/24 permit @@ -119,7 +125,6 @@ 23.249.208.0/20 permit 23.251.224.0/19 permit 23.253.141.0/24 permit -23.253.182.0/23 permit 23.253.182.103 permit 23.253.183.145 permit 23.253.183.146 permit @@ -141,24 +146,7 @@ 27.123.206.80/28 permit 31.47.251.17 permit 31.186.239.0/24 permit -34.2.64.0/22 permit -34.2.68.0/23 permit -34.2.70.0/23 permit -34.2.71.64/26 permit -34.2.72.0/22 permit -34.2.75.0/26 permit -34.2.78.0/23 permit -34.2.80.0/23 permit -34.2.82.0/23 permit -34.2.84.0/24 permit -34.2.84.64/26 permit -34.2.85.0/24 permit -34.2.85.64/26 permit -34.2.86.0/23 permit -34.2.88.0/23 permit -34.2.90.0/23 permit -34.2.92.0/23 permit -34.2.94.0/23 permit +34.2.64.0/19 permit 34.70.158.162 permit 34.74.74.140 permit 34.83.159.189 permit @@ -185,6 +173,7 @@ 35.205.92.9 permit 35.228.216.85 permit 35.242.169.159 permit +37.187.220.204 permit 37.188.97.188 permit 37.218.248.47 permit 37.218.249.47 permit @@ -258,8 +247,8 @@ 46.228.39.112/31 permit 46.243.88.174 permit 46.243.88.175 permit -46.243.88.176 permit -46.243.88.177 permit +46.243.88.176/30 permit +46.243.95.96/27 permit 46.243.95.179 permit 46.243.95.180 permit 50.16.246.183 permit @@ -277,6 +266,8 @@ 50.56.130.221 permit 50.56.130.222 permit 50.112.246.219 permit +50.152.146.25 permit +51.83.17.38 permit 52.1.14.157 permit 52.5.230.59 permit 52.6.74.205 permit @@ -367,7 +358,9 @@ 64.127.115.252 permit 64.132.88.0/23 permit 64.132.92.0/24 permit +64.181.136.241 permit 64.181.194.190 permit +64.181.213.254 permit 64.207.219.7 permit 64.207.219.8 permit 64.207.219.9 permit @@ -453,7 +446,11 @@ 66.218.75.252/31 permit 66.218.75.254 permit 66.220.144.128/25 permit +66.220.144.178 permit +66.220.144.179 permit 66.220.155.0/24 permit +66.220.155.178 permit +66.220.155.179 permit 66.220.157.0/25 permit 66.231.80.0/20 permit 66.240.227.0/24 permit @@ -518,6 +515,8 @@ 69.162.98.0/24 permit 69.169.224.0/20 permit 69.171.232.0/24 permit +69.171.232.180 permit +69.171.232.181 permit 69.171.244.0/23 permit 70.42.149.35 permit 72.3.185.0/24 permit @@ -639,6 +638,8 @@ 77.238.189.148/30 permit 79.135.106.0/24 permit 79.135.107.0/24 permit +80.225.160.128/25 permit +81.88.38.0/23 permit 81.169.146.243 permit 81.169.146.245 permit 81.169.146.246 permit @@ -657,6 +658,9 @@ 82.165.159.45 permit 82.165.159.130 permit 82.165.159.131 permit +84.8.68.0/25 permit +84.8.192.128/25 permit +84.8.224.128/25 permit 85.9.206.169 permit 85.9.210.45 permit 85.158.136.0/21 permit @@ -720,6 +724,7 @@ 96.43.148.64/28 permit 96.43.148.64/31 permit 96.43.151.64/28 permit +98.77.0.0/16 permit 98.97.248.0/21 permit 98.136.44.181 permit 98.136.44.182/31 permit @@ -1215,8 +1220,6 @@ 104.43.243.237 permit 104.44.112.128/25 permit 104.47.0.0/17 permit -104.130.96.0/28 permit -104.130.122.0/23 permit 106.10.144.64/27 permit 106.10.144.100/31 permit 106.10.144.103 permit @@ -1369,6 +1372,7 @@ 117.120.16.0/21 permit 119.42.242.52/31 permit 119.42.242.156 permit +121.244.91.31 permit 121.244.91.48 permit 121.244.91.52 permit 122.15.156.182 permit @@ -1408,6 +1412,20 @@ 129.146.88.28 permit 129.146.147.105 permit 129.146.236.58 permit +129.148.135.0/25 permit +129.148.148.0/25 permit +129.148.164.0/25 permit +129.148.180.0/25 permit +129.148.215.0/25 permit +129.149.6.0/25 permit +129.149.22.0/25 permit +129.149.38.0/25 permit +129.149.52.0/25 permit +129.149.68.0/25 permit +129.149.84.0/25 permit +129.149.100.0/25 permit +129.149.118.0/25 permit +129.149.126.0/25 permit 129.151.67.221 permit 129.153.62.216 permit 129.153.104.71 permit @@ -1420,18 +1438,21 @@ 129.159.22.159 permit 129.159.87.137 permit 129.213.195.191 permit +130.35.116.0/25 permit 130.61.9.72 permit 130.162.39.83 permit +130.162.194.23 permit 130.248.172.0/24 permit 130.248.173.0/24 permit +131.186.12.0/25 permit 131.253.30.0/24 permit 131.253.121.0/26 permit 132.145.13.209 permit 132.226.26.225 permit 132.226.49.32 permit 132.226.56.24 permit -134.128.64.0/19 permit -134.128.96.0/19 permit +134.98.248.128/25 permit +134.128.64.0/18 permit 134.170.27.8 permit 134.170.113.0/26 permit 134.170.141.64/26 permit @@ -1460,6 +1481,10 @@ 136.147.182.0/24 permit 136.147.224.0/20 permit 136.179.50.206 permit +136.248.224.128/25 permit +136.248.232.128/25 permit +138.1.108.0/25 permit +138.1.170.0/24 permit 139.60.152.0/22 permit 139.138.35.44 permit 139.138.46.121 permit @@ -1468,6 +1493,7 @@ 139.138.57.55 permit 139.138.58.119 permit 139.167.79.86 permit +139.177.108.0/25 permit 139.180.17.0/24 permit 140.238.148.191 permit 141.148.55.217 permit @@ -1498,14 +1524,14 @@ 146.20.14.105 permit 146.20.14.106 permit 146.20.14.107 permit -146.20.112.0/26 permit -146.20.113.0/24 permit -146.20.191.0/24 permit 146.20.215.0/24 permit 146.20.215.182 permit 146.88.28.0/24 permit 146.148.116.76 permit 147.154.32.0/25 permit +147.154.63.0/24 permit +147.154.126.0/24 permit +147.154.191.0/24 permit 147.243.1.47 permit 147.243.1.48 permit 147.243.1.153 permit @@ -1513,16 +1539,23 @@ 147.243.128.26 permit 148.105.0.0/16 permit 148.105.8.0/21 permit +148.116.32.128/25 permit 149.72.0.0/16 permit 149.72.234.184 permit 149.72.248.236 permit 149.97.173.180 permit +149.118.160.128/25 permit 150.136.21.199 permit +150.171.109.178 permit 150.230.98.160 permit 151.145.38.14 permit 152.67.105.195 permit +152.69.165.251 permit 152.69.200.236 permit 152.70.155.126 permit +155.248.135.128/25 permit +155.248.140.0/25 permit +155.248.148.0/25 permit 155.248.208.51 permit 155.248.220.138 permit 155.248.234.149 permit @@ -1531,10 +1564,16 @@ 157.58.30.128/25 permit 157.58.196.96/29 permit 157.58.249.3 permit +157.137.32.128/25 permit +157.137.96.128/25 permit 157.151.208.65 permit 157.255.1.64/29 permit 158.101.211.207 permit 158.247.16.0/20 permit +158.247.100.0/25 permit +159.13.4.0/25 permit +159.13.33.181 permit +159.26.176.0/20 permit 159.92.154.0/24 permit 159.92.155.0/24 permit 159.92.157.0/24 permit @@ -1562,12 +1601,15 @@ 159.183.121.182 permit 159.183.129.172 permit 160.1.62.192 permit +161.33.94.110 permit +161.33.228.244 permit 161.38.192.0/20 permit 161.38.204.0/22 permit 161.71.32.0/19 permit 161.71.64.0/20 permit 162.88.4.0/23 permit 162.88.8.0/24 permit +162.88.24.0/23 permit 162.88.24.0/24 permit 162.88.25.0/24 permit 162.88.36.0/24 permit @@ -1585,11 +1627,13 @@ 164.152.23.32 permit 164.152.25.241 permit 164.177.132.168/30 permit +165.1.100.0/25 permit 165.173.128.0/24 permit -165.173.180.1 permit +165.173.180.0/24 permit 165.173.180.250/31 permit +165.173.182.0/24 permit 165.173.182.250/31 permit -166.78.68.0/22 permit +165.173.189.205 permit 166.78.68.221 permit 166.78.69.169 permit 166.78.69.170 permit @@ -1607,9 +1651,12 @@ 167.89.75.126 permit 167.89.75.136 permit 167.89.75.164 permit -167.89.101.2 permit -167.89.101.192/28 permit 167.220.67.232/29 permit +168.107.248.128/25 permit +168.110.160.128/25 permit +168.110.248.128/25 permit +168.129.184.128/25 permit +168.129.248.128/25 permit 168.138.5.36 permit 168.138.73.51 permit 168.138.77.31 permit @@ -1626,6 +1673,7 @@ 169.148.144.0/25 permit 169.148.144.10 permit 169.148.146.0/23 permit +169.148.174.10 permit 169.148.175.3 permit 169.148.179.3 permit 169.148.188.0/24 permit @@ -1644,6 +1692,7 @@ 173.203.81.39 permit 173.224.161.128/25 permit 173.224.165.0/26 permit +173.224.166.48/28 permit 174.36.84.8/29 permit 174.36.84.16/29 permit 174.36.84.32/29 permit @@ -1658,6 +1707,8 @@ 175.41.215.51 permit 176.32.105.0/24 permit 176.32.127.0/24 permit +176.94.34.32/27 permit +176.94.34.64/27 permit 178.236.10.128/26 permit 182.50.76.0/22 permit 182.50.78.64/28 permit @@ -1739,26 +1790,36 @@ 188.125.85.234/31 permit 188.125.85.236/31 permit 188.125.85.238 permit -188.165.51.139 permit 188.172.128.0/20 permit 192.0.64.0/18 permit +192.9.166.184 permit 192.18.139.154 permit 192.18.145.36 permit 192.18.152.58 permit +192.22.32.128/25 permit +192.22.96.128/25 permit +192.22.160.128/25 permit +192.22.224.128/25 permit 192.28.128.0/18 permit +192.29.24.0/25 permit +192.29.44.0/25 permit +192.29.72.0/25 permit +192.29.88.0/25 permit 192.29.103.128/25 permit +192.29.134.0/25 permit +192.29.151.128/25 permit +192.29.172.0/25 permit +192.29.178.0/25 permit +192.29.200.0/25 permit +192.29.216.0/25 permit +192.29.232.0/25 permit +192.29.248.0/25 permit 192.30.252.0/22 permit 192.161.144.0/20 permit 192.162.87.0/24 permit -192.237.158.0/23 permit 192.237.159.42 permit 192.237.159.43 permit 192.254.112.0/20 permit -192.254.112.60 permit -192.254.112.98/31 permit -192.254.113.10 permit -192.254.113.101 permit -192.254.114.176 permit 193.109.254.0/23 permit 193.122.128.100 permit 193.123.56.63 permit @@ -1798,7 +1859,6 @@ 198.21.0.0/21 permit 198.37.144.0/20 permit 198.37.152.186 permit -198.61.254.0/23 permit 198.61.254.21 permit 198.61.254.231 permit 198.178.234.57 permit @@ -1885,6 +1945,7 @@ 204.14.232.0/21 permit 204.14.232.64/28 permit 204.14.234.64/28 permit +204.75.18.128/27 permit 204.75.142.0/24 permit 204.92.114.187 permit 204.92.114.203 permit @@ -1892,7 +1953,9 @@ 204.141.32.0/23 permit 204.141.42.0/23 permit 204.216.164.202 permit -204.220.160.0/21 permit +204.220.90.0/23 permit +204.220.92.0/22 permit +204.220.160.0/20 permit 204.220.168.0/21 permit 204.220.176.0/20 permit 204.220.181.105 permit @@ -1927,6 +1990,9 @@ 207.211.30.128/25 permit 207.211.31.0/25 permit 207.211.41.113 permit +207.211.132.0/25 permit +207.211.147.87 permit +207.211.159.110 permit 207.218.90.0/24 permit 207.218.90.122 permit 207.250.68.0/24 permit @@ -1934,6 +2000,8 @@ 208.43.21.28/30 permit 208.43.21.64/29 permit 208.43.21.72/30 permit +208.56.9.224 permit +208.56.13.196 permit 208.64.132.0/22 permit 208.71.40.63 permit 208.71.40.64/31 permit @@ -1960,6 +2028,7 @@ 208.71.42.214 permit 208.72.249.240/29 permit 208.75.120.0/22 permit +208.76.62.0/23 permit 208.76.62.0/24 permit 208.76.63.0/24 permit 208.82.237.96/29 permit @@ -1973,7 +2042,6 @@ 209.43.22.0/28 permit 209.46.117.168 permit 209.46.117.179 permit -209.61.151.0/24 permit 209.61.151.236 permit 209.61.151.249 permit 209.61.151.251 permit @@ -2120,6 +2188,7 @@ 216.136.168.80/28 permit 216.139.64.0/19 permit 216.145.221.0/24 permit +216.146.32.0/23 permit 216.146.32.0/24 permit 216.146.33.0/24 permit 216.198.0.0/18 permit @@ -2140,6 +2209,7 @@ 223.165.120.0/23 permit 2001:0868:0100:0600::/64 permit 2001:4860:4000::/36 permit +2001:4860:4864::/56 permit 2001:748:100:40::2:0/112 permit 2001:748:400:1300::3 permit 2001:748:400:1300::4 permit @@ -2157,10 +2227,13 @@ 2001:748:400:3301::3 permit 2001:748:400:3301::4 permit 2404:6800:4000::/36 permit +2404:6800:4864::/56 permit +2603:1061:14:1d0::1 permit 2607:13c0:0001:0000:0000:0000:0000:7000/116 permit 2607:13c0:0002:0000:0000:0000:0000:1000/116 permit 2607:13c0:0004:0000:0000:0000:0000:0000/116 permit 2607:f8b0:4000::/36 permit +2607:f8b0:4864::/56 permit 2620:109:c003:104::/64 permit 2620:109:c003:104::215 permit 2620:109:c006:104::/64 permit @@ -2172,8 +2245,7 @@ 2620:10d:c09c:400::8:1 permit 2620:119:50c0:207::/64 permit 2620:119:50c0:207::215 permit -2620:1ec:46::51 permit -2620:1ec:bdf::51 permit 2800:3f0:4000::/36 permit +2800:3f0:4864::/56 permit 49.12.4.251 permit # checks.mailcow.email 2a01:4f8:c17:7906::10 permit # checks.mailcow.email diff --git a/data/conf/rspamd/local.d/metadata_exporter.conf b/data/conf/rspamd/local.d/metadata_exporter.conf index daaa79b4..cc85faac 100644 --- a/data/conf/rspamd/local.d/metadata_exporter.conf +++ b/data/conf/rspamd/local.d/metadata_exporter.conf @@ -3,8 +3,7 @@ rules { backend = "http"; url = "http://nginx:9081/pipe.php"; selector = "reject_no_global_bl"; - formatter = "default"; - meta_headers = true; + formatter = "multipart"; } RLINFO { backend = "http"; @@ -16,8 +15,7 @@ rules { backend = "http"; url = "http://nginx:9081/pushover.php"; selector = "mailcow_rcpt"; - formatter = "json"; - meta_headers = true; + formatter = "multipart"; } } diff --git a/data/conf/rspamd/lua/rspamd.local.lua b/data/conf/rspamd/lua/rspamd.local.lua index 313ba7e9..5d7bcaaf 100644 --- a/data/conf/rspamd/lua/rspamd.local.lua +++ b/data/conf/rspamd/lua/rspamd.local.lua @@ -856,6 +856,8 @@ rspamd_config:register_symbol({ local seen_cte local newline_s = newline(task) + -- use the CTE add_text_footer actually applied + local new_cte = rewrite.new_cte or 'quoted-printable' local function rewrite_ct_cb(name, hdr) if rewrite.need_rewrite_ct then @@ -877,13 +879,13 @@ rspamd_config:register_symbol({ return elseif name:lower() == 'content-transfer-encoding' then out[#out + 1] = string.format('%s: %s', - 'Content-Transfer-Encoding', 'quoted-printable') + 'Content-Transfer-Encoding', new_cte) -- update Content-Transfer-Encoding header task:set_milter_reply({ remove_headers = {['Content-Transfer-Encoding'] = 0}, }) task:set_milter_reply({ - add_headers = {['Content-Transfer-Encoding'] = 'quoted-printable'} + add_headers = {['Content-Transfer-Encoding'] = new_cte} }) seen_cte = true return @@ -895,7 +897,7 @@ rspamd_config:register_symbol({ task:headers_foreach(rewrite_ct_cb, {full = true}) if not seen_cte and rewrite.need_rewrite_ct then - out[#out + 1] = string.format('%s: %s', 'Content-Transfer-Encoding', 'quoted-printable') + out[#out + 1] = string.format('%s: %s', 'Content-Transfer-Encoding', new_cte) end -- End of headers @@ -914,7 +916,7 @@ rspamd_config:register_symbol({ out_parts[#out_parts + 1] = o out_parts[#out_parts + 1] = newline_s else - local removePrefix = "--\x0D\x0AContent-Type" + local removePrefix = "--\x0D\x0AContent-" if string.lower(string.sub(tostring(o[1]), 1, string.len(removePrefix))) == string.lower(removePrefix) then o[1] = string.sub(tostring(o[1]), string.len("--\x0D\x0A") + 1) end diff --git a/data/conf/rspamd/meta_exporter/pipe.php b/data/conf/rspamd/meta_exporter/pipe.php index 003639b0..ab0d1faa 100644 --- a/data/conf/rspamd/meta_exporter/pipe.php +++ b/data/conf/rspamd/meta_exporter/pipe.php @@ -32,47 +32,42 @@ function parse_email($email) { $a = strrpos($email, '@'); return array('local' => substr($email, 0, $a), 'domain' => substr(substr($email, $a), 1)); } -if (!function_exists('getallheaders')) { - function getallheaders() { - if (!is_array($_SERVER)) { - return array(); - } - $headers = array(); - foreach ($_SERVER as $name => $value) { - if (substr($name, 0, 5) == 'HTTP_') { - $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; - } - } - return $headers; - } +// rspamd metadata_exporter (multipart formatter): +// - $_POST['metadata'] JSON with the rspamd metadata +// - $_FILES['message'] raw RFC822 message +if (empty($_POST['metadata']) || !isset($_FILES['message']) || $_FILES['message']['error'] !== UPLOAD_ERR_OK) { + error_log("QUARANTINE: missing multipart parts from rspamd" . PHP_EOL); + http_response_code(400); + exit; } -$raw_data_content = file_get_contents('php://input'); +$meta = json_decode($_POST['metadata'], true); +if (!is_array($meta)) { + error_log("QUARANTINE: cannot decode metadata JSON" . PHP_EOL); + http_response_code(400); + exit; +} + +$raw_data_content = file_get_contents($_FILES['message']['tmp_name']); $raw_data = mb_convert_encoding($raw_data_content, 'HTML-ENTITIES', "UTF-8"); -$headers = getallheaders(); +$raw_size = (int)$_FILES['message']['size']; -$qid = $headers['X-Rspamd-Qid']; -$fuzzy = $headers['X-Rspamd-Fuzzy']; -$subject = iconv_mime_decode($headers['X-Rspamd-Subject']); -$score = $headers['X-Rspamd-Score']; -$rcpts = $headers['X-Rspamd-Rcpt']; -$user = $headers['X-Rspamd-User']; -$ip = $headers['X-Rspamd-Ip']; -$action = $headers['X-Rspamd-Action']; -$sender = $headers['X-Rspamd-From']; -$symbols = $headers['X-Rspamd-Symbols']; - -$raw_size = (int)$_SERVER['CONTENT_LENGTH']; +$qid = $meta['qid'] ?? 'unknown'; +$subject = $meta['subject'] ?? ''; +$score = $meta['score'] ?? 0; +$rcpts = $meta['rcpt'] ?? array(); +$user = $meta['user'] ?? 'unknown'; +$ip = $meta['ip'] ?? 'unknown'; +$action = $meta['action'] ?? 'no action'; +$sender = $meta['from'] ?? ''; +$symbols = json_encode($meta['symbols'] ?? array()); +$fuzzy = json_encode(is_array($meta['fuzzy'] ?? null) ? $meta['fuzzy'] : array()); if (empty($sender)) { error_log("QUARANTINE: Unknown sender, assuming empty-env-from@localhost" . PHP_EOL); $sender = 'empty-env-from@localhost'; } -if ($fuzzy == 'unknown') { - $fuzzy = '[]'; -} - try { $max_size = (int)$redis->Get('Q_MAX_SIZE'); if (($max_size * 1048576) < $raw_size) { @@ -94,7 +89,7 @@ catch (RedisException $e) { $rcpt_final_mailboxes = array(); // Loop through all rcpts -foreach (json_decode($rcpts, true) as $rcpt) { +foreach ($rcpts as $rcpt) { // Remove tag $rcpt = preg_replace('/^(.*?)\+.*(@.*)$/', '$1$2', $rcpt); @@ -158,12 +153,12 @@ foreach (json_decode($rcpts, true) as $rcpt) { // Loop through all found gotos foreach ($gotos_array as $index => &$goto) { - error_log("RCPT RESOVLER: http pipe: query " . $goto . " as username from mailbox" . PHP_EOL); + error_log("RCPT RESOLVER: http pipe: query " . $goto . " as username from mailbox" . PHP_EOL); $stmt = $pdo->prepare("SELECT `username` FROM `mailbox` WHERE `username` = :goto AND (`active`= '1' OR `active`= '2');"); $stmt->execute(array(':goto' => $goto)); $username = $stmt->fetch(PDO::FETCH_ASSOC)['username']; if (!empty($username)) { - error_log("RCPT RESOVLER: http pipe: mailbox found: " . $username . PHP_EOL); + error_log("RCPT RESOLVER: http pipe: mailbox found: " . $username . PHP_EOL); // Current goto is a mailbox, save to rcpt_final_mailboxes if not a duplicate if (!in_array($username, $rcpt_final_mailboxes)) { $rcpt_final_mailboxes[] = $username; @@ -172,21 +167,21 @@ foreach (json_decode($rcpts, true) as $rcpt) { else { $parsed_goto = parse_email($goto); if (!$redis->hGet('DOMAIN_MAP', $parsed_goto['domain'])) { - error_log("RCPT RESOVLER:" . $goto . " is not a mailcow handled mailbox or alias address" . PHP_EOL); + error_log("RCPT RESOLVER:" . $goto . " is not a mailcow handled mailbox or alias address" . PHP_EOL); } else { $stmt = $pdo->prepare("SELECT `goto` FROM `alias` WHERE `address` = :goto AND `active` = '1'"); $stmt->execute(array(':goto' => $goto)); $goto_branch = $stmt->fetch(PDO::FETCH_ASSOC)['goto']; if ($goto_branch) { - error_log("RCPT RESOVLER: http pipe: goto address " . $goto . " is an alias branch for " . $goto_branch . PHP_EOL); + error_log("RCPT RESOLVER: http pipe: goto address " . $goto . " is an alias branch for " . $goto_branch . PHP_EOL); $goto_branch_array = explode(',', $goto_branch); } else { $stmt = $pdo->prepare("SELECT `target_domain` FROM `alias_domain` WHERE `alias_domain` = :domain AND `active` = '1'"); $stmt->execute(array(':domain' => $parsed_goto['domain'])); $goto_branch = $stmt->fetch(PDO::FETCH_ASSOC)['target_domain']; if ($goto_branch) { - error_log("RCPT RESOVLER: http pipe: goto domain " . $parsed_goto['domain'] . " is a domain alias branch for " . $goto_branch . PHP_EOL); + error_log("RCPT RESOLVER: http pipe: goto domain " . $parsed_goto['domain'] . " is a domain alias branch for " . $goto_branch . PHP_EOL); $goto_branch_array = array($parsed_goto['local'] . '@' . $goto_branch); } } @@ -208,11 +203,11 @@ foreach (json_decode($rcpts, true) as $rcpt) { // Force exit if loop cannot be solved // Postfix does not allow for alias loops, so this should never happen. $loop_c++; - error_log("RCPT RESOVLER: http pipe: goto array count on loop #". $loop_c . " is " . count($gotos_array) . PHP_EOL); + error_log("RCPT RESOLVER: http pipe: goto array count on loop #". $loop_c . " is " . count($gotos_array) . PHP_EOL); } } catch (PDOException $e) { - error_log("RCPT RESOVLER: " . $e->getMessage() . PHP_EOL); + error_log("RCPT RESOLVER: " . $e->getMessage() . PHP_EOL); http_response_code(502); exit; } diff --git a/data/conf/rspamd/meta_exporter/pushover.php b/data/conf/rspamd/meta_exporter/pushover.php index efe5fdd5..e937c695 100644 --- a/data/conf/rspamd/meta_exporter/pushover.php +++ b/data/conf/rspamd/meta_exporter/pushover.php @@ -32,50 +32,46 @@ function parse_email($email) { $a = strrpos($email, '@'); return array('local' => substr($email, 0, $a), 'domain' => substr(substr($email, $a), 1)); } -if (!function_exists('getallheaders')) { - function getallheaders() { - if (!is_array($_SERVER)) { - return array(); - } - $headers = array(); - foreach ($_SERVER as $name => $value) { - if (substr($name, 0, 5) == 'HTTP_') { - $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; - } - } - return $headers; - } +// rspamd metadata_exporter (multipart formatter): metadata JSON arrives as $_POST['metadata']. +if (empty($_POST['metadata'])) { + error_log("NOTIFY: missing metadata part from rspamd" . PHP_EOL); + http_response_code(400); + exit; } -$headers = getallheaders(); -$json_body = json_decode(file_get_contents('php://input')); +$meta = json_decode($_POST['metadata'], true); +if (!is_array($meta)) { + error_log("NOTIFY: cannot decode metadata JSON" . PHP_EOL); + http_response_code(400); + exit; +} -$qid = $headers['X-Rspamd-Qid']; -$rcpts = $headers['X-Rspamd-Rcpt']; -$sender = $headers['X-Rspamd-From']; -$ip = $headers['X-Rspamd-Ip']; -$subject = iconv_mime_decode($headers['X-Rspamd-Subject']); -$messageid= $json_body->message_id; +$qid = $meta['qid'] ?? 'unknown'; +$rcpts = $meta['rcpt'] ?? array(); +$sender = $meta['from'] ?? ''; +$ip = $meta['ip'] ?? 'unknown'; +$subject = $meta['subject'] ?? ''; +$messageid= $meta['message_id'] ?? ''; $priority = 0; -$symbols_array = json_decode($headers['X-Rspamd-Symbols'], true); +$symbols_array = $meta['symbols'] ?? array(); if (is_array($symbols_array)) { foreach ($symbols_array as $symbol) { - if ($symbol['name'] == 'HAS_X_PRIO_ONE') { + if (($symbol['name'] ?? null) == 'HAS_X_PRIO_ONE') { $priority = 1; break; } } } -$sender_address = $json_body->header_from[0]; +$sender_address = $meta['header_from'][0] ?? ''; $sender_name = '-'; if (preg_match('/(?.*?)<(?
.*?)>/i', $sender_address, $matches)) { $sender_address = $matches['address']; $sender_name = trim($matches['name'], '"\' '); } -$to_address = $json_body->header_to[0]; +$to_address = $meta['header_to'][0] ?? ''; $to_name = '-'; if (preg_match('/(?.*?)<(?
.*?)>/i', $to_address, $matches)) { $to_address = $matches['address']; @@ -85,7 +81,7 @@ if (preg_match('/(?.*?)<(?
.*?)>/i', $to_address, $matches)) { $rcpt_final_mailboxes = array(); // Loop through all rcpts -foreach (json_decode($rcpts, true) as $rcpt) { +foreach ($rcpts as $rcpt) { // Remove tag $rcpt = preg_replace('/^(.*?)\+.*(@.*)$/', '$1$2', $rcpt); @@ -143,12 +139,12 @@ foreach (json_decode($rcpts, true) as $rcpt) { // Loop through all found gotos foreach ($gotos_array as $index => &$goto) { - error_log("RCPT RESOVLER: http pipe: query " . $goto . " as username from mailbox" . PHP_EOL); + error_log("RCPT RESOLVER: http pipe: query " . $goto . " as username from mailbox" . PHP_EOL); $stmt = $pdo->prepare("SELECT `username` FROM `mailbox` WHERE `username` = :goto AND (`active`= '1' OR `active`= '2');"); $stmt->execute(array(':goto' => $goto)); $username = $stmt->fetch(PDO::FETCH_ASSOC)['username']; if (!empty($username)) { - error_log("RCPT RESOVLER: http pipe: mailbox found: " . $username . PHP_EOL); + error_log("RCPT RESOLVER: http pipe: mailbox found: " . $username . PHP_EOL); // Current goto is a mailbox, save to rcpt_final_mailboxes if not a duplicate if (!in_array($username, $rcpt_final_mailboxes)) { $rcpt_final_mailboxes[] = $username; @@ -157,21 +153,21 @@ foreach (json_decode($rcpts, true) as $rcpt) { else { $parsed_goto = parse_email($goto); if (!$redis->hGet('DOMAIN_MAP', $parsed_goto['domain'])) { - error_log("RCPT RESOVLER:" . $goto . " is not a mailcow handled mailbox or alias address" . PHP_EOL); + error_log("RCPT RESOLVER:" . $goto . " is not a mailcow handled mailbox or alias address" . PHP_EOL); } else { $stmt = $pdo->prepare("SELECT `goto` FROM `alias` WHERE `address` = :goto AND `active` = '1'"); $stmt->execute(array(':goto' => $goto)); $goto_branch = $stmt->fetch(PDO::FETCH_ASSOC)['goto']; if ($goto_branch) { - error_log("RCPT RESOVLER: http pipe: goto address " . $goto . " is an alias branch for " . $goto_branch . PHP_EOL); + error_log("RCPT RESOLVER: http pipe: goto address " . $goto . " is an alias branch for " . $goto_branch . PHP_EOL); $goto_branch_array = explode(',', $goto_branch); } else { $stmt = $pdo->prepare("SELECT `target_domain` FROM `alias_domain` WHERE `alias_domain` = :domain AND `active` = '1'"); $stmt->execute(array(':domain' => $parsed_goto['domain'])); $goto_branch = $stmt->fetch(PDO::FETCH_ASSOC)['target_domain']; if ($goto_branch) { - error_log("RCPT RESOVLER: http pipe: goto domain " . $parsed_goto['domain'] . " is a domain alias branch for " . $goto_branch . PHP_EOL); + error_log("RCPT RESOLVER: http pipe: goto domain " . $parsed_goto['domain'] . " is a domain alias branch for " . $goto_branch . PHP_EOL); $goto_branch_array = array($parsed_goto['local'] . '@' . $goto_branch); } } @@ -193,11 +189,11 @@ foreach (json_decode($rcpts, true) as $rcpt) { // Force exit if loop cannot be solved // Postfix does not allow for alias loops, so this should never happen. $loop_c++; - error_log("RCPT RESOVLER: http pipe: goto array count on loop #". $loop_c . " is " . count($gotos_array) . PHP_EOL); + error_log("RCPT RESOLVER: http pipe: goto array count on loop #". $loop_c . " is " . count($gotos_array) . PHP_EOL); } } catch (PDOException $e) { - error_log("RCPT RESOVLER: " . $e->getMessage() . PHP_EOL); + error_log("RCPT RESOLVER: " . $e->getMessage() . PHP_EOL); http_response_code(502); exit; } diff --git a/data/web/admin/system.php b/data/web/admin/system.php index 4db40c75..b5e00808 100644 --- a/data/web/admin/system.php +++ b/data/web/admin/system.php @@ -115,6 +115,8 @@ $template_data = [ 'logo_dark_specs' => customize('get', 'main_logo_dark_specs'), 'ip_check' => customize('get', 'ip_check'), 'custom_login' => customize('get', 'custom_login'), + 'ui_themes' => customize('get', 'ui_themes'), + 'ui_theme' => customize('get', 'ui_theme'), 'password_complexity' => password_complexity('get'), 'show_rspamd_global_filters' => @$_SESSION['show_rspamd_global_filters'], 'cors_settings' => $cors_settings, diff --git a/data/web/api/openapi.yaml b/data/web/api/openapi.yaml index cf54f6ad..c8656190 100644 --- a/data/web/api/openapi.yaml +++ b/data/web/api/openapi.yaml @@ -185,6 +185,9 @@ paths: example: username: info@domain.tld domain: domain.tld + description: my time limited alias + validity: 8760 + permanent: false properties: username: description: 'the mailbox an alias should be created for' @@ -192,6 +195,15 @@ paths: domain: description: "the domain" type: string + description: + description: "a description for the alias, defaults to an empty string" + type: string + validity: + description: "how many hours the alias stays valid, 1 to 87600, defaults to 8760 (one year)" + type: integer + permanent: + description: "keep the alias after it expired, defaults to false" + type: boolean type: object summary: Create time limited alias /api/v1/add/app-passwd: @@ -1072,6 +1084,7 @@ paths: password2: "*" quota: "3072" force_pw_update: "1" + force_tfa: "1" tls_enforce_in: "1" tls_enforce_out: "1" tags: ["tag1", "tag2"] @@ -1118,6 +1131,7 @@ paths: password2: atedismonsin quota: "3072" force_pw_update: "1" + force_tfa: "1" tls_enforce_in: "1" tls_enforce_out: "1" tags: ["tag1", "tag2"] @@ -1151,6 +1165,9 @@ paths: force_pw_update: description: forces the user to update its password on first login type: boolean + force_tfa: + description: force 2FA enrollment at login + type: boolean tls_enforce_in: description: force inbound email tls encryption type: boolean @@ -2510,7 +2527,7 @@ paths: description: >- Using this endpoint you can perform actions on quarantine items. It is possible to release emails from quarantine into to the inbox, or learn them as ham to improve Rspamd filtering. - You must provide the quarantine item IDs. You can get the IDs using the GET method. + You must provide the quarantine item IDs. You can get the IDs using the GET method. operationId: Edit mails in Quarantine requestBody: content: @@ -3414,6 +3431,7 @@ paths: - mailbox - active: "1" force_pw_update: "0" + force_tfa: "0" name: Full name password: "*" password2: "*" @@ -3464,6 +3482,7 @@ paths: attr: active: "1" force_pw_update: "0" + force_tfa: "0" name: Full name authsource: mailcow password: "" @@ -3487,6 +3506,9 @@ paths: force_pw_update: description: force user to change password on next login type: boolean + force_tfa: + description: force 2FA enrollment at login + type: boolean name: description: Full name of the mailbox user type: string @@ -4881,6 +4903,7 @@ paths: - active: "1" attributes: force_pw_update: "0" + force_tfa: "0" mailbox_format: "maildir:" quarantine_notification: never sogo_access: "1" @@ -4897,6 +4920,7 @@ paths: quota: 3221225472 quota_used: 0 rl: false + sender_acl: ["otherbox@doman3.tld", "@aliasdomain.tld"] spam_aliases: 0 username: info@doman3.tld tags: ["tag1", "tag2"] @@ -5805,6 +5829,7 @@ paths: - active: "1" attributes: force_pw_update: "0" + force_tfa: "0" mailbox_format: "maildir:" quarantine_notification: never sogo_access: "1" @@ -5822,6 +5847,7 @@ paths: quota: 3221225472 quota_used: 0 rl: false + sender_acl: ["otherbox@domain3.tld", "@aliasdomain.tld"] spam_aliases: 0 username: info@domain3.tld tags: ["tag1", "tag2"] @@ -5844,7 +5870,7 @@ paths: response: value: - type: "success" - log: ["cors", "edit", {"allowed_origins": ["*", "mail.mailcow.tld"], "allowed_methods": ["POST", "GET", "DELETE", "PUT"]}] + log: ["cors", "edit", {"allowed_origins": ["*", "https://mail.mailcow.tld"], "allowed_methods": ["POST", "GET", "DELETE", "PUT"]}] msg: "cors_headers_edited" description: OK headers: { } @@ -5861,7 +5887,7 @@ paths: schema: example: attr: - allowed_origins: ["*", "mail.mailcow.tld"] + allowed_origins: ["*", "https://mail.mailcow.tld"] allowed_methods: ["POST", "GET", "DELETE", "PUT"] properties: attr: diff --git a/data/web/css/build/003-bootstrap-select.css b/data/web/css/build/003-bootstrap-select.css index e248901c..f9ce6d90 100644 --- a/data/web/css/build/003-bootstrap-select.css +++ b/data/web/css/build/003-bootstrap-select.css @@ -1,10 +1,10 @@ -/*! - * Bootstrap-select v1.14.0-beta2 (https://developer.snapappointments.com/bootstrap-select) - * - * Copyright 2012-2021 SnapAppointments, LLC - * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE) - */ - +/*! + * Bootstrap-select v1.14.0-beta3 (https://developer.snapappointments.com/bootstrap-select) + * + * Copyright 2012-2022 SnapAppointments, LLC + * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE) + */ + @-webkit-keyframes bs-notify-fadeOut { 0% { opacity: 0.9; @@ -35,8 +35,7 @@ select.selectpicker { display: none !important; } .bootstrap-select { - width: 220px \0; - /*IE9 and below*/ + width: 220px; vertical-align: middle; } .bootstrap-select > .dropdown-toggle { diff --git a/data/web/css/build/013-datatables.css b/data/web/css/build/013-datatables.css index 2b19ba24..1bc18119 100644 --- a/data/web/css/build/013-datatables.css +++ b/data/web/css/build/013-datatables.css @@ -17,15 +17,15 @@ table.dataTable>tbody>tr.child ul.dtr-details>li { } table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control:before:hover, table.dataTable.dtr-inline.collapsed>tbody>tr>th.dtr-control:before:hover { - background-color: #5e5e5e; + background-color: var(--mc-dtr-hover-bg); } table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control:before, table.dataTable.dtr-inline.collapsed>tbody>tr>th.dtr-control:before, table.dataTable td.dt-control:before { - background-color: #979797 !important; - border: 1.5px solid #616161 !important; + background-color: var(--mc-dtr-bg) !important; + border: 1.5px solid var(--mc-dtr-border) !important; border-radius: 2px !important; - color: #fff; + color: var(--mc-dtr-color); height: 1em; width: 1em; line-height: 1.25em; @@ -37,7 +37,7 @@ table.dataTable td.dt-control:before { table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td.dtr-control:before, table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th.dtr-control:before, table.dataTable td.dt-control:before { - background-color: #979797 !important; + background-color: var(--mc-dtr-active-bg) !important; } table.dataTable.table-striped>tbody>tr>td { vertical-align: middle; diff --git a/data/web/css/build/014-mailcow.css b/data/web/css/build/014-mailcow.css index 3e1ace79..52a34f8b 100644 --- a/data/web/css/build/014-mailcow.css +++ b/data/web/css/build/014-mailcow.css @@ -34,11 +34,44 @@ url('/fonts/noto-sans-v12-latin_greek_cyrillic-700italic.woff') format('woff'); } +/* theme tokens, override in css/themes//theme.css */ +:root { + --mc-font-family: "Noto Sans","Helvetica Neue",Helvetica,Arial,sans-serif; + --mc-font-size: 10.5pt; + --mc-body-bg: #fbfbfb; + --mc-primary: #0F688D; + --mc-primary-border: #0d526d; + --mc-info: #148DBC; + --mc-info-border: #127ea8; + --mc-border: #dfdfdf; + --mc-surface: #fff; + --mc-surface-alt: #f7f7f7; + --mc-muted: #959595; + --mc-hr: #ccc; + --mc-progress-bg: #d5d5d5; + --mc-placeholder: rgb(137 137 137); + --mc-btn-outline-color: #000000; + --mc-btn-outline-border: #cfcfcf; + --mc-btn-outline-hover-bg: #f0f0f0; + --mc-btn-outline-active-bg: #f0f0f0; + --mc-btn-light-active-color: #fff; + --mc-btn-light-active-bg: #555; + --mc-btn-light-active-border: #4d4d4d; + --mc-dtr-bg: #979797; + --mc-dtr-border: #616161; + --mc-dtr-color: #fff; + --mc-dtr-hover-bg: #5e5e5e; + --mc-dtr-active-bg: #979797; + --mc-login-user: #28b62c; + --mc-login-domainadmin: #ffc107; + --mc-login-admin: #ff4136; +} + body { min-height: 100vh; display: flex; flex-direction: column; - background-color: #fbfbfb; + background-color: var(--mc-body-bg); } #maxmsgsize { min-width: 80px; } #slider1 .slider-selection { @@ -86,17 +119,17 @@ body { max-height: 1000px } .nav-tabs .nav-link, .nav-tabs .nav-link.disabled, .nav-tabs .nav-link.disabled:hover, .nav-tabs .nav-link.disabled:focus { - border-color: #dfdfdf; + border-color: var(--mc-border); } .nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link { - border-color: #dfdfdf; - border-bottom: 1px solid #ffffff; + border-color: var(--mc-border); + border-bottom: 1px solid var(--mc-surface); } .nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { - border-color: #dfdfdf; + border-color: var(--mc-border); } .nav-tabs { - border-bottom: 1px solid #dfdfdf; + border-bottom: 1px solid var(--mc-border); } .bi { display: inline-block; @@ -164,13 +197,13 @@ body.modal-open { padding-right: inherit !important; } body { - font-family: "Noto Sans","Helvetica Neue",Helvetica,Arial,sans-serif; - font-size: 10.5pt; + font-family: var(--mc-font-family); + font-size: var(--mc-font-size); line-height: 1.5; } html { - font-family: "Noto Sans","Helvetica Neue",Helvetica,Arial,sans-serif; - font-size: 10.5pt; + font-family: var(--mc-font-family); + font-size: var(--mc-font-size); line-height: 1.5; } #mailcow-alert { @@ -206,7 +239,7 @@ legend { cursor: not-allowed; } .overlay { - background: #fff; + background: var(--mc-surface); position: absolute; z-index: 10000; top: 0; right: 0; bottom: 0; left: 0; @@ -215,9 +248,6 @@ legend { .bootstrap-select.btn-group .no-results { display: none; } -.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary { - color: rgb(197, 197, 197) !important; -} .haveibeenpwned { cursor: pointer; -webkit-user-select: none; @@ -239,7 +269,7 @@ legend { .footer { margin-top: 27px; margin-bottom: 20px; - color: #959595; + color: var(--mc-muted); display: flex; flex-direction: column; } @@ -337,7 +367,7 @@ code { overflow-x: auto!important; } .well { - border: 1px solid #dfdfdf; + border: 1px solid var(--mc-border); background-color: #f9f9f9; padding: 10px; } @@ -356,47 +386,47 @@ button[aria-expanded='true'] > .caret { } .list-group-details { - background: #fff; + background: var(--mc-surface); } .list-group-header { - background: #f7f7f7; + background: var(--mc-surface-alt); } .bg-primary, .alert-primary, .btn-primary { - background-color: #0F688D !important; - border-color: #0d526d !important; + background-color: var(--mc-primary) !important; + border-color: var(--mc-primary-border) !important; } .bg-info, .alert-info, .btn-info { - background-color: #148DBC !important; - border-color: #127ea8 !important; + background-color: var(--mc-info) !important; + border-color: var(--mc-info-border) !important; } .bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary { - color: rgb(137 137 137)!important; + color: var(--mc-placeholder) !important; } .progress { height: 16px; - background-color: #d5d5d5; + background-color: var(--mc-progress-bg); } .btn-outline-secondary:hover { - background-color: #f0f0f0; + background-color: var(--mc-btn-outline-hover-bg); } .btn.btn-outline-secondary { - color: #000000 !important; - border-color: #cfcfcf !important; + color: var(--mc-btn-outline-color) !important; + border-color: var(--mc-btn-outline-border) !important; } .btn-check:checked+.btn-outline-secondary, .btn-check:active+.btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show { - background-color: #f0f0f0 !important; + background-color: var(--mc-btn-outline-active-bg) !important; } .btn-check:checked+.btn-light, .btn-check:active+.btn-light, .btn-light:active, .btn-light.active, .show>.btn-light.dropdown-toggle { - color: #fff; - background-color: #555; + color: var(--mc-btn-light-active-color); + background-color: var(--mc-btn-light-active-bg); background-image: none; - border-color: #4d4d4d; + border-color: var(--mc-btn-light-active-border); } .btn-check:checked+.btn-light:focus, .btn-check:active+.btn-light:focus, .btn-light:active:focus, .btn-light.active:focus, .show>.btn-light.dropdown-toggle:focus, .btn-check:focus+.btn-light, .btn-light:focus { @@ -412,6 +442,26 @@ button[aria-expanded='true'] > .caret { text-decoration: none; } +/* role marker on login pages, header icons differ too (color blindness) */ +.login-card::before { + content: ""; + display: block; + height: 5px; + background: var(--mc-login-color); + border-radius: inherit; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +.login-user { + --mc-login-color: var(--mc-login-user); +} +.login-domainadmin { + --mc-login-color: var(--mc-login-domainadmin); +} +.login-admin { + --mc-login-color: var(--mc-login-admin); +} + .hr-title { display: flex; align-items: center; @@ -423,7 +473,7 @@ button[aria-expanded='true'] > .caret { .hr-title::after { content: ""; flex: 1; - border-bottom: 1px solid #ccc; + border-bottom: 1px solid var(--mc-hr); } .hr-title:not(:empty)::before { diff --git a/data/web/css/themes/lumen-bootstrap.css b/data/web/css/themes/lumen-bootstrap.css index bcf62683..65ef3ca3 100644 --- a/data/web/css/themes/lumen-bootstrap.css +++ b/data/web/css/themes/lumen-bootstrap.css @@ -1,17 +1,16 @@ @charset "UTF-8"; /*! - * Bootswatch v5.1.3 (https://bootswatch.com) - * Copyright 2012-2022 Thomas Park + * Bootswatch v5.3.8 (https://bootswatch.com) + * Theme: lumen + * Copyright 2012-2025 Thomas Park * Licensed under MIT * Based on Bootstrap */ /*! - * Bootstrap v5.1.3 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors - * Copyright 2011-2021 Twitter, Inc. + * Bootstrap v5.3.8 (https://getbootstrap.com/) + * Copyright 2011-2025 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ - /* source-sans-pro-300 - latin */ @font-face { font-family: 'Source Sans Pro'; @@ -90,8 +89,8 @@ url('/fonts/source-sans-pro-v21-latin-700italic.ttf') format('truetype'), /* Safari, Android, iOS */ url('/fonts/source-sans-pro-v21-latin-700italic.svg#SourceSansPro') format('svg'); /* Legacy iOS */ } - -:root { +:root, +[data-bs-theme=light] { --bs-blue: #158cba; --bs-indigo: #6610f2; --bs-purple: #6f42c1; @@ -102,6 +101,7 @@ --bs-green: #28b62c; --bs-teal: #20c997; --bs-cyan: #75caeb; + --bs-black: #000; --bs-white: #fff; --bs-gray: #999; --bs-gray-dark: #333; @@ -130,10 +130,32 @@ --bs-danger-rgb: 255, 65, 54; --bs-light-rgb: 246, 246, 246; --bs-dark-rgb: 85, 85, 85; + --bs-primary-text-emphasis: #08384a; + --bs-secondary-text-emphasis: #606060; + --bs-success-text-emphasis: #104912; + --bs-info-text-emphasis: #2f515e; + --bs-warning-text-emphasis: #66350b; + --bs-danger-text-emphasis: #661a16; + --bs-light-text-emphasis: #555; + --bs-dark-text-emphasis: #555; + --bs-primary-bg-subtle: #d0e8f1; + --bs-secondary-bg-subtle: #fcfcfc; + --bs-success-bg-subtle: #d4f0d5; + --bs-info-bg-subtle: #e3f4fb; + --bs-warning-bg-subtle: #ffe7d1; + --bs-danger-bg-subtle: #ffd9d7; + --bs-light-bg-subtle: #fbfbfb; + --bs-dark-bg-subtle: #ced4da; + --bs-primary-border-subtle: #a1d1e3; + --bs-secondary-border-subtle: #f9f9f9; + --bs-success-border-subtle: #a9e2ab; + --bs-info-border-subtle: #c8eaf7; + --bs-warning-border-subtle: #ffcea4; + --bs-danger-border-subtle: #ffb3af; + --bs-light-border-subtle: #f0f0f0; + --bs-dark-border-subtle: #adb5bd; --bs-white-rgb: 255, 255, 255; --bs-black-rgb: 0, 0, 0; - --bs-body-color-rgb: 34, 34, 34; - --bs-body-bg-rgb: 255, 255, 255; --bs-font-sans-serif: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); @@ -142,7 +164,106 @@ --bs-body-font-weight: 400; --bs-body-line-height: 1.5; --bs-body-color: #222; + --bs-body-color-rgb: 34, 34, 34; --bs-body-bg: #fff; + --bs-body-bg-rgb: 255, 255, 255; + --bs-emphasis-color: #000; + --bs-emphasis-color-rgb: 0, 0, 0; + --bs-secondary-color: rgba(34, 34, 34, 0.75); + --bs-secondary-color-rgb: 34, 34, 34; + --bs-secondary-bg: #f0f0f0; + --bs-secondary-bg-rgb: 240, 240, 240; + --bs-tertiary-color: rgba(34, 34, 34, 0.5); + --bs-tertiary-color-rgb: 34, 34, 34; + --bs-tertiary-bg: #f6f6f6; + --bs-tertiary-bg-rgb: 246, 246, 246; + --bs-heading-color: inherit; + --bs-link-color: #158cba; + --bs-link-color-rgb: 21, 140, 186; + --bs-link-decoration: underline; + --bs-link-hover-color: #117095; + --bs-link-hover-color-rgb: 17, 112, 149; + --bs-code-color: #e83e8c; + --bs-highlight-color: #222; + --bs-highlight-bg: #ffe7d1; + --bs-border-width: 1px; + --bs-border-style: solid; + --bs-border-color: #dee2e6; + --bs-border-color-translucent: rgba(0, 0, 0, 0.175); + --bs-border-radius: 0.375rem; + --bs-border-radius-sm: 0.25rem; + --bs-border-radius-lg: 0.5rem; + --bs-border-radius-xl: 1rem; + --bs-border-radius-xxl: 2rem; + --bs-border-radius-2xl: var(--bs-border-radius-xxl); + --bs-border-radius-pill: 50rem; + --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); + --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); + --bs-focus-ring-width: 0.25rem; + --bs-focus-ring-opacity: 0.25; + --bs-focus-ring-color: rgba(21, 140, 186, 0.25); + --bs-form-valid-color: #28b62c; + --bs-form-valid-border-color: #28b62c; + --bs-form-invalid-color: #ff4136; + --bs-form-invalid-border-color: #ff4136; +} + +[data-bs-theme=dark] { + color-scheme: dark; + --bs-body-color: #dee2e6; + --bs-body-color-rgb: 222, 226, 230; + --bs-body-bg: #222; + --bs-body-bg-rgb: 34, 34, 34; + --bs-emphasis-color: #fff; + --bs-emphasis-color-rgb: 255, 255, 255; + --bs-secondary-color: rgba(222, 226, 230, 0.75); + --bs-secondary-color-rgb: 222, 226, 230; + --bs-secondary-bg: #333; + --bs-secondary-bg-rgb: 51, 51, 51; + --bs-tertiary-color: rgba(222, 226, 230, 0.5); + --bs-tertiary-color-rgb: 222, 226, 230; + --bs-tertiary-bg: #2b2b2b; + --bs-tertiary-bg-rgb: 43, 43, 43; + --bs-primary-text-emphasis: #73bad6; + --bs-secondary-text-emphasis: #f6f6f6; + --bs-success-text-emphasis: #7ed380; + --bs-info-text-emphasis: #acdff3; + --bs-warning-text-emphasis: #ffb676; + --bs-danger-text-emphasis: #ff8d86; + --bs-light-text-emphasis: #f6f6f6; + --bs-dark-text-emphasis: #dee2e6; + --bs-primary-bg-subtle: #041c25; + --bs-secondary-bg-subtle: #303030; + --bs-success-bg-subtle: #082409; + --bs-info-bg-subtle: #17282f; + --bs-warning-bg-subtle: #331b05; + --bs-danger-bg-subtle: #330d0b; + --bs-light-bg-subtle: #333; + --bs-dark-bg-subtle: #1a1a1a; + --bs-primary-border-subtle: #0d5470; + --bs-secondary-border-subtle: #909090; + --bs-success-border-subtle: #186d1a; + --bs-info-border-subtle: #46798d; + --bs-warning-border-subtle: #995010; + --bs-danger-border-subtle: #992720; + --bs-light-border-subtle: #555; + --bs-dark-border-subtle: #333; + --bs-heading-color: inherit; + --bs-link-color: #73bad6; + --bs-link-hover-color: #8fc8de; + --bs-link-color-rgb: 115, 186, 214; + --bs-link-hover-color-rgb: 143, 200, 222; + --bs-code-color: #f18bba; + --bs-highlight-color: #dee2e6; + --bs-highlight-bg: #66350b; + --bs-border-color: #555; + --bs-border-color-translucent: rgba(255, 255, 255, 0.15); + --bs-form-valid-color: #7ed380; + --bs-form-valid-border-color: #7ed380; + --bs-form-invalid-color: #ff8d86; + --bs-form-invalid-border-color: #ff8d86; } *, @@ -173,20 +294,17 @@ body { hr { margin: 1rem 0; color: inherit; - background-color: currentColor; border: 0; + border-top: var(--bs-border-width) solid; opacity: 0.25; } -hr:not([size]) { - height: 1px; -} - h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { margin-top: 0; margin-bottom: 0.5rem; font-weight: 500; line-height: 1.2; + color: var(--bs-heading-color); } h1, .h1 { @@ -238,8 +356,7 @@ p { margin-bottom: 1rem; } -abbr[title], -abbr[data-bs-original-title] { +abbr[title] { -webkit-text-decoration: underline dotted; text-decoration: underline dotted; cursor: help; @@ -295,8 +412,9 @@ small, .small { } mark, .mark { - padding: 0.2em; - background-color: #fcf8e3; + padding: 0.1875em; + color: var(--bs-highlight-color); + background-color: var(--bs-highlight-bg); } sub, @@ -316,11 +434,11 @@ sup { } a { - color: #158cba; + color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); text-decoration: underline; } a:hover { - color: #117095; + --bs-link-color-rgb: var(--bs-link-hover-color-rgb); } a:not([href]):not([class]), a:not([href]):not([class]):hover { @@ -334,8 +452,6 @@ kbd, samp { font-family: var(--bs-font-monospace); font-size: 1em; - direction: ltr /* rtl:ignore */; - unicode-bidi: bidi-override; } pre { @@ -353,7 +469,7 @@ pre code { code { font-size: 0.875em; - color: #e83e8c; + color: var(--bs-code-color); word-wrap: break-word; } a > code { @@ -361,16 +477,15 @@ a > code { } kbd { - padding: 0.2rem 0.4rem; + padding: 0.1875rem 0.375rem; font-size: 0.875em; - color: #fff; - background-color: #222; - border-radius: 0.2rem; + color: var(--bs-body-bg); + background-color: var(--bs-body-color); + border-radius: 0.25rem; } kbd kbd { padding: 0; font-size: 1em; - font-weight: 700; } figure { @@ -390,7 +505,7 @@ table { caption { padding-top: 0.5rem; padding-bottom: 0.5rem; - color: #999; + color: var(--bs-secondary-color); text-align: left; } @@ -449,8 +564,8 @@ select:disabled { opacity: 1; } -[list]::-webkit-calendar-picker-indicator { - display: none; +[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator { + display: none !important; } button, @@ -487,8 +602,8 @@ legend { width: 100%; padding: 0; margin-bottom: 0.5rem; - font-size: calc(1.275rem + 0.3vw); line-height: inherit; + font-size: calc(1.275rem + 0.3vw); } @media (min-width: 1200px) { legend { @@ -514,8 +629,12 @@ legend + * { } [type=search] { - outline-offset: -2px; -webkit-appearance: textfield; + outline-offset: -2px; +} +[type=search]::-webkit-search-cancel-button { + cursor: pointer; + filter: grayscale(1); } /* rtl:raw: @@ -536,14 +655,11 @@ legend + * { ::-webkit-file-upload-button { font: inherit; + -webkit-appearance: button; } ::file-selector-button { font: inherit; -} - -::-webkit-file-upload-button { - font: inherit; -webkit-appearance: button; } @@ -574,9 +690,9 @@ progress { } .display-1 { - font-size: calc(1.625rem + 4.5vw); font-weight: 300; line-height: 1.2; + font-size: calc(1.625rem + 4.5vw); } @media (min-width: 1200px) { .display-1 { @@ -585,9 +701,9 @@ progress { } .display-2 { - font-size: calc(1.575rem + 3.9vw); font-weight: 300; line-height: 1.2; + font-size: calc(1.575rem + 3.9vw); } @media (min-width: 1200px) { .display-2 { @@ -596,9 +712,9 @@ progress { } .display-3 { - font-size: calc(1.525rem + 3.3vw); font-weight: 300; line-height: 1.2; + font-size: calc(1.525rem + 3.3vw); } @media (min-width: 1200px) { .display-3 { @@ -607,9 +723,9 @@ progress { } .display-4 { - font-size: calc(1.475rem + 2.7vw); font-weight: 300; line-height: 1.2; + font-size: calc(1.475rem + 2.7vw); } @media (min-width: 1200px) { .display-4 { @@ -618,9 +734,9 @@ progress { } .display-5 { - font-size: calc(1.425rem + 2.1vw); font-weight: 300; line-height: 1.2; + font-size: calc(1.425rem + 2.1vw); } @media (min-width: 1200px) { .display-5 { @@ -629,9 +745,9 @@ progress { } .display-6 { - font-size: calc(1.375rem + 1.5vw); font-weight: 300; line-height: 1.2; + font-size: calc(1.375rem + 1.5vw); } @media (min-width: 1200px) { .display-6 { @@ -676,7 +792,7 @@ progress { color: #999; } .blockquote-footer::before { - content: "— "; + content: "— "; } .img-fluid { @@ -686,9 +802,9 @@ progress { .img-thumbnail { padding: 0.25rem; - background-color: #fff; - border: 1px solid #dee2e6; - border-radius: 0.25rem; + background-color: var(--bs-body-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); max-width: 100%; height: auto; } @@ -704,7 +820,7 @@ progress { .figure-caption { font-size: 0.875em; - color: #999; + color: var(--bs-secondary-color); } .container, @@ -714,9 +830,11 @@ progress { .container-lg, .container-md, .container-sm { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; width: 100%; - padding-right: var(--bs-gutter-x, 0.75rem); - padding-left: var(--bs-gutter-x, 0.75rem); + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); margin-right: auto; margin-left: auto; } @@ -746,6 +864,15 @@ progress { max-width: 1320px; } } +:root { + --bs-breakpoint-xs: 0; + --bs-breakpoint-sm: 576px; + --bs-breakpoint-md: 768px; + --bs-breakpoint-lg: 992px; + --bs-breakpoint-xl: 1200px; + --bs-breakpoint-xxl: 1400px; +} + .row { --bs-gutter-x: 1.5rem; --bs-gutter-y: 0; @@ -765,7 +892,7 @@ progress { } .col { - flex: 1 0 0%; + flex: 1 0 0; } .row-cols-auto > * { @@ -785,7 +912,7 @@ progress { .row-cols-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } .row-cols-4 > * { @@ -800,7 +927,7 @@ progress { .row-cols-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } .col-auto { @@ -974,1089 +1101,875 @@ progress { @media (min-width: 576px) { .col-sm { - flex: 1 0 0%; + flex: 1 0 0; } - .row-cols-sm-auto > * { flex: 0 0 auto; width: auto; } - .row-cols-sm-1 > * { flex: 0 0 auto; width: 100%; } - .row-cols-sm-2 > * { flex: 0 0 auto; width: 50%; } - .row-cols-sm-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } - .row-cols-sm-4 > * { flex: 0 0 auto; width: 25%; } - .row-cols-sm-5 > * { flex: 0 0 auto; width: 20%; } - .row-cols-sm-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } - .col-sm-auto { flex: 0 0 auto; width: auto; } - .col-sm-1 { flex: 0 0 auto; width: 8.33333333%; } - .col-sm-2 { flex: 0 0 auto; width: 16.66666667%; } - .col-sm-3 { flex: 0 0 auto; width: 25%; } - .col-sm-4 { flex: 0 0 auto; width: 33.33333333%; } - .col-sm-5 { flex: 0 0 auto; width: 41.66666667%; } - .col-sm-6 { flex: 0 0 auto; width: 50%; } - .col-sm-7 { flex: 0 0 auto; width: 58.33333333%; } - .col-sm-8 { flex: 0 0 auto; width: 66.66666667%; } - .col-sm-9 { flex: 0 0 auto; width: 75%; } - .col-sm-10 { flex: 0 0 auto; width: 83.33333333%; } - .col-sm-11 { flex: 0 0 auto; width: 91.66666667%; } - .col-sm-12 { flex: 0 0 auto; width: 100%; } - .offset-sm-0 { margin-left: 0; } - .offset-sm-1 { margin-left: 8.33333333%; } - .offset-sm-2 { margin-left: 16.66666667%; } - .offset-sm-3 { margin-left: 25%; } - .offset-sm-4 { margin-left: 33.33333333%; } - .offset-sm-5 { margin-left: 41.66666667%; } - .offset-sm-6 { margin-left: 50%; } - .offset-sm-7 { margin-left: 58.33333333%; } - .offset-sm-8 { margin-left: 66.66666667%; } - .offset-sm-9 { margin-left: 75%; } - .offset-sm-10 { margin-left: 83.33333333%; } - .offset-sm-11 { margin-left: 91.66666667%; } - .g-sm-0, -.gx-sm-0 { + .gx-sm-0 { --bs-gutter-x: 0; } - .g-sm-0, -.gy-sm-0 { + .gy-sm-0 { --bs-gutter-y: 0; } - .g-sm-1, -.gx-sm-1 { + .gx-sm-1 { --bs-gutter-x: 0.25rem; } - .g-sm-1, -.gy-sm-1 { + .gy-sm-1 { --bs-gutter-y: 0.25rem; } - .g-sm-2, -.gx-sm-2 { + .gx-sm-2 { --bs-gutter-x: 0.5rem; } - .g-sm-2, -.gy-sm-2 { + .gy-sm-2 { --bs-gutter-y: 0.5rem; } - .g-sm-3, -.gx-sm-3 { + .gx-sm-3 { --bs-gutter-x: 1rem; } - .g-sm-3, -.gy-sm-3 { + .gy-sm-3 { --bs-gutter-y: 1rem; } - .g-sm-4, -.gx-sm-4 { + .gx-sm-4 { --bs-gutter-x: 1.5rem; } - .g-sm-4, -.gy-sm-4 { + .gy-sm-4 { --bs-gutter-y: 1.5rem; } - .g-sm-5, -.gx-sm-5 { + .gx-sm-5 { --bs-gutter-x: 3rem; } - .g-sm-5, -.gy-sm-5 { + .gy-sm-5 { --bs-gutter-y: 3rem; } } @media (min-width: 768px) { .col-md { - flex: 1 0 0%; + flex: 1 0 0; } - .row-cols-md-auto > * { flex: 0 0 auto; width: auto; } - .row-cols-md-1 > * { flex: 0 0 auto; width: 100%; } - .row-cols-md-2 > * { flex: 0 0 auto; width: 50%; } - .row-cols-md-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } - .row-cols-md-4 > * { flex: 0 0 auto; width: 25%; } - .row-cols-md-5 > * { flex: 0 0 auto; width: 20%; } - .row-cols-md-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } - .col-md-auto { flex: 0 0 auto; width: auto; } - .col-md-1 { flex: 0 0 auto; width: 8.33333333%; } - .col-md-2 { flex: 0 0 auto; width: 16.66666667%; } - .col-md-3 { flex: 0 0 auto; width: 25%; } - .col-md-4 { flex: 0 0 auto; width: 33.33333333%; } - .col-md-5 { flex: 0 0 auto; width: 41.66666667%; } - .col-md-6 { flex: 0 0 auto; width: 50%; } - .col-md-7 { flex: 0 0 auto; width: 58.33333333%; } - .col-md-8 { flex: 0 0 auto; width: 66.66666667%; } - .col-md-9 { flex: 0 0 auto; width: 75%; } - .col-md-10 { flex: 0 0 auto; width: 83.33333333%; } - .col-md-11 { flex: 0 0 auto; width: 91.66666667%; } - .col-md-12 { flex: 0 0 auto; width: 100%; } - .offset-md-0 { margin-left: 0; } - .offset-md-1 { margin-left: 8.33333333%; } - .offset-md-2 { margin-left: 16.66666667%; } - .offset-md-3 { margin-left: 25%; } - .offset-md-4 { margin-left: 33.33333333%; } - .offset-md-5 { margin-left: 41.66666667%; } - .offset-md-6 { margin-left: 50%; } - .offset-md-7 { margin-left: 58.33333333%; } - .offset-md-8 { margin-left: 66.66666667%; } - .offset-md-9 { margin-left: 75%; } - .offset-md-10 { margin-left: 83.33333333%; } - .offset-md-11 { margin-left: 91.66666667%; } - .g-md-0, -.gx-md-0 { + .gx-md-0 { --bs-gutter-x: 0; } - .g-md-0, -.gy-md-0 { + .gy-md-0 { --bs-gutter-y: 0; } - .g-md-1, -.gx-md-1 { + .gx-md-1 { --bs-gutter-x: 0.25rem; } - .g-md-1, -.gy-md-1 { + .gy-md-1 { --bs-gutter-y: 0.25rem; } - .g-md-2, -.gx-md-2 { + .gx-md-2 { --bs-gutter-x: 0.5rem; } - .g-md-2, -.gy-md-2 { + .gy-md-2 { --bs-gutter-y: 0.5rem; } - .g-md-3, -.gx-md-3 { + .gx-md-3 { --bs-gutter-x: 1rem; } - .g-md-3, -.gy-md-3 { + .gy-md-3 { --bs-gutter-y: 1rem; } - .g-md-4, -.gx-md-4 { + .gx-md-4 { --bs-gutter-x: 1.5rem; } - .g-md-4, -.gy-md-4 { + .gy-md-4 { --bs-gutter-y: 1.5rem; } - .g-md-5, -.gx-md-5 { + .gx-md-5 { --bs-gutter-x: 3rem; } - .g-md-5, -.gy-md-5 { + .gy-md-5 { --bs-gutter-y: 3rem; } } @media (min-width: 992px) { .col-lg { - flex: 1 0 0%; + flex: 1 0 0; } - .row-cols-lg-auto > * { flex: 0 0 auto; width: auto; } - .row-cols-lg-1 > * { flex: 0 0 auto; width: 100%; } - .row-cols-lg-2 > * { flex: 0 0 auto; width: 50%; } - .row-cols-lg-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } - .row-cols-lg-4 > * { flex: 0 0 auto; width: 25%; } - .row-cols-lg-5 > * { flex: 0 0 auto; width: 20%; } - .row-cols-lg-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } - .col-lg-auto { flex: 0 0 auto; width: auto; } - .col-lg-1 { flex: 0 0 auto; width: 8.33333333%; } - .col-lg-2 { flex: 0 0 auto; width: 16.66666667%; } - .col-lg-3 { flex: 0 0 auto; width: 25%; } - .col-lg-4 { flex: 0 0 auto; width: 33.33333333%; } - .col-lg-5 { flex: 0 0 auto; width: 41.66666667%; } - .col-lg-6 { flex: 0 0 auto; width: 50%; } - .col-lg-7 { flex: 0 0 auto; width: 58.33333333%; } - .col-lg-8 { flex: 0 0 auto; width: 66.66666667%; } - .col-lg-9 { flex: 0 0 auto; width: 75%; } - .col-lg-10 { flex: 0 0 auto; width: 83.33333333%; } - .col-lg-11 { flex: 0 0 auto; width: 91.66666667%; } - .col-lg-12 { flex: 0 0 auto; width: 100%; } - .offset-lg-0 { margin-left: 0; } - .offset-lg-1 { margin-left: 8.33333333%; } - .offset-lg-2 { margin-left: 16.66666667%; } - .offset-lg-3 { margin-left: 25%; } - .offset-lg-4 { margin-left: 33.33333333%; } - .offset-lg-5 { margin-left: 41.66666667%; } - .offset-lg-6 { margin-left: 50%; } - .offset-lg-7 { margin-left: 58.33333333%; } - .offset-lg-8 { margin-left: 66.66666667%; } - .offset-lg-9 { margin-left: 75%; } - .offset-lg-10 { margin-left: 83.33333333%; } - .offset-lg-11 { margin-left: 91.66666667%; } - .g-lg-0, -.gx-lg-0 { + .gx-lg-0 { --bs-gutter-x: 0; } - .g-lg-0, -.gy-lg-0 { + .gy-lg-0 { --bs-gutter-y: 0; } - .g-lg-1, -.gx-lg-1 { + .gx-lg-1 { --bs-gutter-x: 0.25rem; } - .g-lg-1, -.gy-lg-1 { + .gy-lg-1 { --bs-gutter-y: 0.25rem; } - .g-lg-2, -.gx-lg-2 { + .gx-lg-2 { --bs-gutter-x: 0.5rem; } - .g-lg-2, -.gy-lg-2 { + .gy-lg-2 { --bs-gutter-y: 0.5rem; } - .g-lg-3, -.gx-lg-3 { + .gx-lg-3 { --bs-gutter-x: 1rem; } - .g-lg-3, -.gy-lg-3 { + .gy-lg-3 { --bs-gutter-y: 1rem; } - .g-lg-4, -.gx-lg-4 { + .gx-lg-4 { --bs-gutter-x: 1.5rem; } - .g-lg-4, -.gy-lg-4 { + .gy-lg-4 { --bs-gutter-y: 1.5rem; } - .g-lg-5, -.gx-lg-5 { + .gx-lg-5 { --bs-gutter-x: 3rem; } - .g-lg-5, -.gy-lg-5 { + .gy-lg-5 { --bs-gutter-y: 3rem; } } @media (min-width: 1200px) { .col-xl { - flex: 1 0 0%; + flex: 1 0 0; } - .row-cols-xl-auto > * { flex: 0 0 auto; width: auto; } - .row-cols-xl-1 > * { flex: 0 0 auto; width: 100%; } - .row-cols-xl-2 > * { flex: 0 0 auto; width: 50%; } - .row-cols-xl-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } - .row-cols-xl-4 > * { flex: 0 0 auto; width: 25%; } - .row-cols-xl-5 > * { flex: 0 0 auto; width: 20%; } - .row-cols-xl-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } - .col-xl-auto { flex: 0 0 auto; width: auto; } - .col-xl-1 { flex: 0 0 auto; width: 8.33333333%; } - .col-xl-2 { flex: 0 0 auto; width: 16.66666667%; } - .col-xl-3 { flex: 0 0 auto; width: 25%; } - .col-xl-4 { flex: 0 0 auto; width: 33.33333333%; } - .col-xl-5 { flex: 0 0 auto; width: 41.66666667%; } - .col-xl-6 { flex: 0 0 auto; width: 50%; } - .col-xl-7 { flex: 0 0 auto; width: 58.33333333%; } - .col-xl-8 { flex: 0 0 auto; width: 66.66666667%; } - .col-xl-9 { flex: 0 0 auto; width: 75%; } - .col-xl-10 { flex: 0 0 auto; width: 83.33333333%; } - .col-xl-11 { flex: 0 0 auto; width: 91.66666667%; } - .col-xl-12 { flex: 0 0 auto; width: 100%; } - .offset-xl-0 { margin-left: 0; } - .offset-xl-1 { margin-left: 8.33333333%; } - .offset-xl-2 { margin-left: 16.66666667%; } - .offset-xl-3 { margin-left: 25%; } - .offset-xl-4 { margin-left: 33.33333333%; } - .offset-xl-5 { margin-left: 41.66666667%; } - .offset-xl-6 { margin-left: 50%; } - .offset-xl-7 { margin-left: 58.33333333%; } - .offset-xl-8 { margin-left: 66.66666667%; } - .offset-xl-9 { margin-left: 75%; } - .offset-xl-10 { margin-left: 83.33333333%; } - .offset-xl-11 { margin-left: 91.66666667%; } - .g-xl-0, -.gx-xl-0 { + .gx-xl-0 { --bs-gutter-x: 0; } - .g-xl-0, -.gy-xl-0 { + .gy-xl-0 { --bs-gutter-y: 0; } - .g-xl-1, -.gx-xl-1 { + .gx-xl-1 { --bs-gutter-x: 0.25rem; } - .g-xl-1, -.gy-xl-1 { + .gy-xl-1 { --bs-gutter-y: 0.25rem; } - .g-xl-2, -.gx-xl-2 { + .gx-xl-2 { --bs-gutter-x: 0.5rem; } - .g-xl-2, -.gy-xl-2 { + .gy-xl-2 { --bs-gutter-y: 0.5rem; } - .g-xl-3, -.gx-xl-3 { + .gx-xl-3 { --bs-gutter-x: 1rem; } - .g-xl-3, -.gy-xl-3 { + .gy-xl-3 { --bs-gutter-y: 1rem; } - .g-xl-4, -.gx-xl-4 { + .gx-xl-4 { --bs-gutter-x: 1.5rem; } - .g-xl-4, -.gy-xl-4 { + .gy-xl-4 { --bs-gutter-y: 1.5rem; } - .g-xl-5, -.gx-xl-5 { + .gx-xl-5 { --bs-gutter-x: 3rem; } - .g-xl-5, -.gy-xl-5 { + .gy-xl-5 { --bs-gutter-y: 3rem; } } @media (min-width: 1400px) { .col-xxl { - flex: 1 0 0%; + flex: 1 0 0; } - .row-cols-xxl-auto > * { flex: 0 0 auto; width: auto; } - .row-cols-xxl-1 > * { flex: 0 0 auto; width: 100%; } - .row-cols-xxl-2 > * { flex: 0 0 auto; width: 50%; } - .row-cols-xxl-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } - .row-cols-xxl-4 > * { flex: 0 0 auto; width: 25%; } - .row-cols-xxl-5 > * { flex: 0 0 auto; width: 20%; } - .row-cols-xxl-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } - .col-xxl-auto { flex: 0 0 auto; width: auto; } - .col-xxl-1 { flex: 0 0 auto; width: 8.33333333%; } - .col-xxl-2 { flex: 0 0 auto; width: 16.66666667%; } - .col-xxl-3 { flex: 0 0 auto; width: 25%; } - .col-xxl-4 { flex: 0 0 auto; width: 33.33333333%; } - .col-xxl-5 { flex: 0 0 auto; width: 41.66666667%; } - .col-xxl-6 { flex: 0 0 auto; width: 50%; } - .col-xxl-7 { flex: 0 0 auto; width: 58.33333333%; } - .col-xxl-8 { flex: 0 0 auto; width: 66.66666667%; } - .col-xxl-9 { flex: 0 0 auto; width: 75%; } - .col-xxl-10 { flex: 0 0 auto; width: 83.33333333%; } - .col-xxl-11 { flex: 0 0 auto; width: 91.66666667%; } - .col-xxl-12 { flex: 0 0 auto; width: 100%; } - .offset-xxl-0 { margin-left: 0; } - .offset-xxl-1 { margin-left: 8.33333333%; } - .offset-xxl-2 { margin-left: 16.66666667%; } - .offset-xxl-3 { margin-left: 25%; } - .offset-xxl-4 { margin-left: 33.33333333%; } - .offset-xxl-5 { margin-left: 41.66666667%; } - .offset-xxl-6 { margin-left: 50%; } - .offset-xxl-7 { margin-left: 58.33333333%; } - .offset-xxl-8 { margin-left: 66.66666667%; } - .offset-xxl-9 { margin-left: 75%; } - .offset-xxl-10 { margin-left: 83.33333333%; } - .offset-xxl-11 { margin-left: 91.66666667%; } - .g-xxl-0, -.gx-xxl-0 { + .gx-xxl-0 { --bs-gutter-x: 0; } - .g-xxl-0, -.gy-xxl-0 { + .gy-xxl-0 { --bs-gutter-y: 0; } - .g-xxl-1, -.gx-xxl-1 { + .gx-xxl-1 { --bs-gutter-x: 0.25rem; } - .g-xxl-1, -.gy-xxl-1 { + .gy-xxl-1 { --bs-gutter-y: 0.25rem; } - .g-xxl-2, -.gx-xxl-2 { + .gx-xxl-2 { --bs-gutter-x: 0.5rem; } - .g-xxl-2, -.gy-xxl-2 { + .gy-xxl-2 { --bs-gutter-y: 0.5rem; } - .g-xxl-3, -.gx-xxl-3 { + .gx-xxl-3 { --bs-gutter-x: 1rem; } - .g-xxl-3, -.gy-xxl-3 { + .gy-xxl-3 { --bs-gutter-y: 1rem; } - .g-xxl-4, -.gx-xxl-4 { + .gx-xxl-4 { --bs-gutter-x: 1.5rem; } - .g-xxl-4, -.gy-xxl-4 { + .gy-xxl-4 { --bs-gutter-y: 1.5rem; } - .g-xxl-5, -.gx-xxl-5 { + .gx-xxl-5 { --bs-gutter-x: 3rem; } - .g-xxl-5, -.gy-xxl-5 { + .gy-xxl-5 { --bs-gutter-y: 3rem; } } .table { - --bs-table-bg: transparent; + --bs-table-color-type: initial; + --bs-table-bg-type: initial; + --bs-table-color-state: initial; + --bs-table-bg-state: initial; + --bs-table-color: initial; + --bs-table-bg: var(--bs-body-bg); + --bs-table-border-color: var(--bs-border-color); --bs-table-accent-bg: transparent; - --bs-table-striped-color: #222; - --bs-table-striped-bg: rgba(0, 0, 0, 0.05); - --bs-table-active-color: #222; - --bs-table-active-bg: rgba(0, 0, 0, 0.1); - --bs-table-hover-color: #222; - --bs-table-hover-bg: rgba(0, 0, 0, 0.075); + --bs-table-striped-color: initial; + --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05); + --bs-table-active-color: initial; + --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1); + --bs-table-hover-color: initial; + --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075); width: 100%; margin-bottom: 1rem; - color: #222; vertical-align: top; - border-color: #dee2e6; + border-color: var(--bs-table-border-color); } .table > :not(caption) > * > * { padding: 0.5rem 0.5rem; + color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color))); background-color: var(--bs-table-bg); - border-bottom-width: 1px; - box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); + border-bottom-width: var(--bs-border-width); + box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg))); } .table > tbody { vertical-align: inherit; @@ -2064,8 +1977,9 @@ progress { .table > thead { vertical-align: bottom; } -.table > :not(:first-child) { - border-top: 2px solid currentColor; + +.table-group-divider { + border-top: calc(var(--bs-border-width) * 2) solid currentcolor; } .caption-top { @@ -2077,10 +1991,10 @@ progress { } .table-bordered > :not(caption) > * { - border-width: 1px 0; + border-width: var(--bs-border-width) 0; } .table-bordered > :not(caption) > * > * { - border-width: 0 1px; + border-width: 0 var(--bs-border-width); } .table-borderless > :not(caption) > * > * { @@ -2091,114 +2005,135 @@ progress { } .table-striped > tbody > tr:nth-of-type(odd) > * { - --bs-table-accent-bg: var(--bs-table-striped-bg); - color: var(--bs-table-striped-color); + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg); +} + +.table-striped-columns > :not(caption) > tr > :nth-child(even) { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg); } .table-active { - --bs-table-accent-bg: var(--bs-table-active-bg); - color: var(--bs-table-active-color); + --bs-table-color-state: var(--bs-table-active-color); + --bs-table-bg-state: var(--bs-table-active-bg); } .table-hover > tbody > tr:hover > * { - --bs-table-accent-bg: var(--bs-table-hover-bg); - color: var(--bs-table-hover-color); + --bs-table-color-state: var(--bs-table-hover-color); + --bs-table-bg-state: var(--bs-table-hover-bg); } .table-primary { + --bs-table-color: #fff; --bs-table-bg: #158cba; + --bs-table-border-color: #44a3c8; --bs-table-striped-bg: #2192bd; --bs-table-striped-color: #fff; --bs-table-active-bg: #2c98c1; --bs-table-active-color: #fff; --bs-table-hover-bg: #2795bf; --bs-table-hover-color: #fff; - color: #fff; - border-color: #2c98c1; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); } .table-secondary { + --bs-table-color: #000; --bs-table-bg: #f0f0f0; + --bs-table-border-color: silver; --bs-table-striped-bg: #e4e4e4; --bs-table-striped-color: #000; --bs-table-active-bg: #d8d8d8; --bs-table-active-color: #000; --bs-table-hover-bg: #dedede; --bs-table-hover-color: #000; - color: #000; - border-color: #d8d8d8; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); } .table-success { + --bs-table-color: #fff; --bs-table-bg: #28b62c; + --bs-table-border-color: #53c556; --bs-table-striped-bg: #33ba37; --bs-table-striped-color: #fff; --bs-table-active-bg: #3ebd41; --bs-table-active-color: #fff; --bs-table-hover-bg: #38bb3c; --bs-table-hover-color: #fff; - color: #fff; - border-color: #3ebd41; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); } .table-info { + --bs-table-color: #fff; --bs-table-bg: #75caeb; + --bs-table-border-color: #91d5ef; --bs-table-striped-bg: #7ccdec; --bs-table-striped-color: #fff; --bs-table-active-bg: #83cfed; --bs-table-active-color: #000; --bs-table-hover-bg: #7fceed; --bs-table-hover-color: #fff; - color: #fff; - border-color: #83cfed; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); } .table-warning { + --bs-table-color: #fff; --bs-table-bg: #ff851b; + --bs-table-border-color: #ff9d49; --bs-table-striped-bg: #ff8b26; --bs-table-striped-color: #fff; --bs-table-active-bg: #ff9132; --bs-table-active-color: #fff; --bs-table-hover-bg: #ff8e2c; --bs-table-hover-color: #fff; - color: #fff; - border-color: #ff9132; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); } .table-danger { + --bs-table-color: #fff; --bs-table-bg: #ff4136; + --bs-table-border-color: #ff675e; --bs-table-striped-bg: #ff4b40; --bs-table-striped-color: #fff; --bs-table-active-bg: #ff544a; --bs-table-active-color: #fff; --bs-table-hover-bg: #ff4f45; --bs-table-hover-color: #fff; - color: #fff; - border-color: #ff544a; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); } .table-light { + --bs-table-color: #000; --bs-table-bg: #f6f6f6; + --bs-table-border-color: #c5c5c5; --bs-table-striped-bg: #eaeaea; --bs-table-striped-color: #000; --bs-table-active-bg: #dddddd; --bs-table-active-color: #000; --bs-table-hover-bg: #e4e4e4; --bs-table-hover-color: #000; - color: #000; - border-color: #dddddd; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); } .table-dark { + --bs-table-color: #fff; --bs-table-bg: #555; + --bs-table-border-color: #777777; --bs-table-striped-bg: #5e5e5e; --bs-table-striped-color: #fff; --bs-table-active-bg: #666666; --bs-table-active-color: #fff; --bs-table-hover-bg: #626262; --bs-table-hover-color: #fff; - color: #fff; - border-color: #666666; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); } .table-responsive { @@ -2241,29 +2176,29 @@ progress { } .col-form-label { - padding-top: calc(0.375rem + 1px); - padding-bottom: calc(0.375rem + 1px); + padding-top: calc(0.375rem + var(--bs-border-width)); + padding-bottom: calc(0.375rem + var(--bs-border-width)); margin-bottom: 0; font-size: inherit; line-height: 1.5; } .col-form-label-lg { - padding-top: calc(0.5rem + 1px); - padding-bottom: calc(0.5rem + 1px); + padding-top: calc(0.5rem + var(--bs-border-width)); + padding-bottom: calc(0.5rem + var(--bs-border-width)); font-size: 1.25rem; } .col-form-label-sm { - padding-top: calc(0.25rem + 1px); - padding-bottom: calc(0.25rem + 1px); + padding-top: calc(0.25rem + var(--bs-border-width)); + padding-bottom: calc(0.25rem + var(--bs-border-width)); font-size: 0.875rem; } .form-text { margin-top: 0.25rem; font-size: 0.875em; - color: #999; + color: var(--bs-secondary-color); } .form-control { @@ -2273,14 +2208,14 @@ progress { font-size: 1rem; font-weight: 400; line-height: 1.5; - color: #222; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ced4da; + color: var(--bs-body-color); -webkit-appearance: none; -moz-appearance: none; appearance: none; - border-radius: 0.25rem; + background-color: var(--bs-body-bg); + background-clip: padding-box; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } @media (prefers-reduced-motion: reduce) { @@ -2295,25 +2230,31 @@ progress { cursor: pointer; } .form-control:focus { - color: #222; - background-color: #fff; + color: var(--bs-body-color); + background-color: var(--bs-body-bg); border-color: #8ac6dd; outline: 0; box-shadow: 0 0 0 0.25rem rgba(21, 140, 186, 0.25); } .form-control::-webkit-date-and-time-value { + min-width: 85px; height: 1.5em; + margin: 0; +} +.form-control::-webkit-datetime-edit { + display: block; + padding: 0; } .form-control::-moz-placeholder { - color: #999; + color: var(--bs-secondary-color); opacity: 1; } .form-control::placeholder { - color: #999; + color: var(--bs-secondary-color); opacity: 1; } -.form-control:disabled, .form-control[readonly] { - background-color: #f0f0f0; +.form-control:disabled { + background-color: var(--bs-secondary-bg); opacity: 1; } .form-control::-webkit-file-upload-button { @@ -2321,13 +2262,13 @@ progress { margin: -0.375rem -0.75rem; -webkit-margin-end: 0.75rem; margin-inline-end: 0.75rem; - color: #222; - background-color: #f0f0f0; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); pointer-events: none; border-color: inherit; border-style: solid; border-width: 0; - border-inline-end-width: 1px; + border-inline-end-width: var(--bs-border-width); border-radius: 0; -webkit-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; 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; @@ -2337,13 +2278,13 @@ progress { margin: -0.375rem -0.75rem; -webkit-margin-end: 0.75rem; margin-inline-end: 0.75rem; - color: #222; - background-color: #f0f0f0; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); pointer-events: none; border-color: inherit; border-style: solid; border-width: 0; - border-inline-end-width: 1px; + border-inline-end-width: var(--bs-border-width); border-radius: 0; 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; } @@ -2357,35 +2298,10 @@ progress { } } .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { - background-color: #e4e4e4; + background-color: var(--bs-secondary-bg); } .form-control:hover:not(:disabled):not([readonly])::file-selector-button { - background-color: #e4e4e4; -} -.form-control::-webkit-file-upload-button { - padding: 0.375rem 0.75rem; - margin: -0.375rem -0.75rem; - -webkit-margin-end: 0.75rem; - margin-inline-end: 0.75rem; - color: #222; - background-color: #f0f0f0; - pointer-events: none; - border-color: inherit; - border-style: solid; - border-width: 0; - border-inline-end-width: 1px; - border-radius: 0; - -webkit-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; - 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) { - .form-control::-webkit-file-upload-button { - -webkit-transition: none; - transition: none; - } -} -.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { - background-color: #e4e4e4; + background-color: var(--bs-secondary-bg); } .form-control-plaintext { @@ -2394,10 +2310,13 @@ progress { padding: 0.375rem 0; margin-bottom: 0; line-height: 1.5; - color: #222; + color: var(--bs-body-color); background-color: transparent; border: solid transparent; - border-width: 1px 0; + border-width: var(--bs-border-width) 0; +} +.form-control-plaintext:focus { + outline: 0; } .form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { padding-right: 0; @@ -2405,10 +2324,10 @@ progress { } .form-control-sm { - min-height: calc(1.5em + 0.5rem + 2px); + min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); padding: 0.25rem 0.5rem; font-size: 0.875rem; - border-radius: 0.2rem; + border-radius: var(--bs-border-radius-sm); } .form-control-sm::-webkit-file-upload-button { padding: 0.25rem 0.5rem; @@ -2422,18 +2341,12 @@ progress { -webkit-margin-end: 0.5rem; margin-inline-end: 0.5rem; } -.form-control-sm::-webkit-file-upload-button { - padding: 0.25rem 0.5rem; - margin: -0.25rem -0.5rem; - -webkit-margin-end: 0.5rem; - margin-inline-end: 0.5rem; -} .form-control-lg { - min-height: calc(1.5em + 1rem + 2px); + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); padding: 0.5rem 1rem; font-size: 1.25rem; - border-radius: 0.3rem; + border-radius: var(--bs-border-radius-lg); } .form-control-lg::-webkit-file-upload-button { padding: 0.5rem 1rem; @@ -2447,60 +2360,60 @@ progress { -webkit-margin-end: 1rem; margin-inline-end: 1rem; } -.form-control-lg::-webkit-file-upload-button { - padding: 0.5rem 1rem; - margin: -0.5rem -1rem; - -webkit-margin-end: 1rem; - margin-inline-end: 1rem; -} textarea.form-control { - min-height: calc(1.5em + 0.75rem + 2px); + min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); } textarea.form-control-sm { - min-height: calc(1.5em + 0.5rem + 2px); + min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); } textarea.form-control-lg { - min-height: calc(1.5em + 1rem + 2px); + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); } .form-control-color { width: 3rem; - height: auto; + height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); padding: 0.375rem; } .form-control-color:not(:disabled):not([readonly]) { cursor: pointer; } .form-control-color::-moz-color-swatch { - height: 1.5em; - border-radius: 0.25rem; + border: 0 !important; + border-radius: var(--bs-border-radius); } .form-control-color::-webkit-color-swatch { - height: 1.5em; - border-radius: 0.25rem; + border: 0 !important; + border-radius: var(--bs-border-radius); +} +.form-control-color.form-control-sm { + height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); +} +.form-control-color.form-control-lg { + height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); } .form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23333' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); display: block; width: 100%; padding: 0.375rem 2.25rem 0.375rem 0.75rem; - -moz-padding-start: calc(0.75rem - 3px); font-size: 1rem; font-weight: 400; line-height: 1.5; - color: #222; - background-color: #fff; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23333' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right 0.75rem center; - background-size: 16px 12px; - border: 1px solid #ced4da; - border-radius: 0.25rem; - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + color: var(--bs-body-color); -webkit-appearance: none; -moz-appearance: none; appearance: none; + background-color: var(--bs-body-bg); + background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } @media (prefers-reduced-motion: reduce) { .form-select { @@ -2517,11 +2430,11 @@ textarea.form-control-lg { background-image: none; } .form-select:disabled { - background-color: #f0f0f0; + background-color: var(--bs-secondary-bg); } .form-select:-moz-focusring { color: transparent; - text-shadow: 0 0 0 #222; + text-shadow: 0 0 0 var(--bs-body-color); } .form-select-sm { @@ -2529,7 +2442,7 @@ textarea.form-control-lg { padding-bottom: 0.25rem; padding-left: 0.5rem; font-size: 0.875rem; - border-radius: 0.2rem; + border-radius: var(--bs-border-radius-sm); } .form-select-lg { @@ -2537,7 +2450,11 @@ textarea.form-control-lg { padding-bottom: 0.5rem; padding-left: 1rem; font-size: 1.25rem; - border-radius: 0.3rem; + border-radius: var(--bs-border-radius-lg); +} + +[data-bs-theme=dark] .form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); } .form-check { @@ -2551,21 +2468,36 @@ textarea.form-control-lg { margin-left: -1.5em; } +.form-check-reverse { + padding-right: 1.5em; + padding-left: 0; + text-align: right; +} +.form-check-reverse .form-check-input { + float: right; + margin-right: -1.5em; + margin-left: 0; +} + .form-check-input { + --bs-form-check-bg: var(--bs-body-bg); + flex-shrink: 0; width: 1em; height: 1em; margin-top: 0.25em; vertical-align: top; - background-color: #fff; - background-repeat: no-repeat; - background-position: center; - background-size: contain; - border: 1px solid rgba(0, 0, 0, 0.25); -webkit-appearance: none; -moz-appearance: none; appearance: none; + background-color: var(--bs-form-check-bg); + background-image: var(--bs-form-check-bg-image); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: var(--bs-border-width) solid var(--bs-border-color); -webkit-print-color-adjust: exact; color-adjust: exact; + print-color-adjust: exact; } .form-check-input[type=checkbox] { border-radius: 0.25em; @@ -2586,15 +2518,15 @@ textarea.form-control-lg { border-color: #158cba; } .form-check-input:checked[type=checkbox] { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e"); + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); } .form-check-input:checked[type=radio] { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); } .form-check-input[type=checkbox]:indeterminate { background-color: #158cba; border-color: #158cba; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); } .form-check-input:disabled { pointer-events: none; @@ -2602,6 +2534,7 @@ textarea.form-control-lg { opacity: 0.5; } .form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { + cursor: default; opacity: 0.5; } @@ -2609,9 +2542,10 @@ textarea.form-control-lg { padding-left: 2.5em; } .form-switch .form-check-input { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); width: 2em; margin-left: -2.5em; - 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='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + background-image: var(--bs-form-switch-bg); background-position: left center; border-radius: 2em; transition: background-position 0.15s ease-in-out; @@ -2622,11 +2556,19 @@ textarea.form-control-lg { } } .form-switch .form-check-input:focus { - 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='%238ac6dd'/%3e%3c/svg%3e"); + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%238ac6dd'/%3e%3c/svg%3e"); } .form-switch .form-check-input:checked { background-position: right center; - 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"); + --bs-form-switch-bg: 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"); +} +.form-switch.form-check-reverse { + padding-right: 2.5em; + padding-left: 0; +} +.form-switch.form-check-reverse .form-check-input { + margin-right: -2.5em; + margin-left: 0; } .form-check-inline { @@ -2645,14 +2587,18 @@ textarea.form-control-lg { opacity: 0.65; } +[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e"); +} + .form-range { width: 100%; height: 1.5rem; padding: 0; - background-color: transparent; -webkit-appearance: none; -moz-appearance: none; appearance: none; + background-color: transparent; } .form-range:focus { outline: 0; @@ -2670,13 +2616,13 @@ textarea.form-control-lg { width: 1rem; height: 1rem; margin-top: -0.25rem; + -webkit-appearance: none; + appearance: none; background-color: #158cba; border: 0; border-radius: 1rem; -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - -webkit-appearance: none; - appearance: none; } @media (prefers-reduced-motion: reduce) { .form-range::-webkit-slider-thumb { @@ -2692,20 +2638,20 @@ textarea.form-control-lg { height: 0.5rem; color: transparent; cursor: pointer; - background-color: #dee2e6; + background-color: var(--bs-secondary-bg); border-color: transparent; border-radius: 1rem; } .form-range::-moz-range-thumb { width: 1rem; height: 1rem; + -moz-appearance: none; + appearance: none; background-color: #158cba; border: 0; border-radius: 1rem; -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - -moz-appearance: none; - appearance: none; } @media (prefers-reduced-motion: reduce) { .form-range::-moz-range-thumb { @@ -2721,7 +2667,7 @@ textarea.form-control-lg { height: 0.5rem; color: transparent; cursor: pointer; - background-color: #dee2e6; + background-color: var(--bs-secondary-bg); border-color: transparent; border-radius: 1rem; } @@ -2729,28 +2675,37 @@ textarea.form-control-lg { pointer-events: none; } .form-range:disabled::-webkit-slider-thumb { - background-color: #adb5bd; + background-color: var(--bs-secondary-color); } .form-range:disabled::-moz-range-thumb { - background-color: #adb5bd; + background-color: var(--bs-secondary-color); } .form-floating { position: relative; } .form-floating > .form-control, +.form-floating > .form-control-plaintext, .form-floating > .form-select { - height: calc(3.5rem + 2px); + height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + min-height: calc(3.5rem + calc(var(--bs-border-width) * 2)); line-height: 1.25; } .form-floating > label { position: absolute; top: 0; left: 0; + z-index: 2; + max-width: 100%; height: 100%; padding: 1rem 0.75rem; + overflow: hidden; + color: rgba(var(--bs-body-color-rgb), 0.65); + text-align: start; + text-overflow: ellipsis; + white-space: nowrap; pointer-events: none; - border: 1px solid transparent; + border: var(--bs-border-width) solid transparent; transform-origin: 0 0; transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; } @@ -2759,45 +2714,78 @@ textarea.form-control-lg { transition: none; } } -.form-floating > .form-control { +.form-floating > .form-control, +.form-floating > .form-control-plaintext { padding: 1rem 0.75rem; } -.form-floating > .form-control::-moz-placeholder { +.form-floating > .form-control::-moz-placeholder, .form-floating > .form-control-plaintext::-moz-placeholder { color: transparent; } -.form-floating > .form-control::placeholder { +.form-floating > .form-control::placeholder, +.form-floating > .form-control-plaintext::placeholder { color: transparent; } -.form-floating > .form-control:not(:-moz-placeholder-shown) { +.form-floating > .form-control:not(:-moz-placeholder-shown), .form-floating > .form-control-plaintext:not(:-moz-placeholder-shown) { padding-top: 1.625rem; padding-bottom: 0.625rem; } -.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) { +.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown), +.form-floating > .form-control-plaintext:focus, +.form-floating > .form-control-plaintext:not(:placeholder-shown) { padding-top: 1.625rem; padding-bottom: 0.625rem; } -.form-floating > .form-control:-webkit-autofill { +.form-floating > .form-control:-webkit-autofill, +.form-floating > .form-control-plaintext:-webkit-autofill { padding-top: 1.625rem; padding-bottom: 0.625rem; } .form-floating > .form-select { padding-top: 1.625rem; padding-bottom: 0.625rem; + padding-left: 0.75rem; } .form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { - opacity: 0.65; transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); } .form-floating > .form-control:focus ~ label, .form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-control-plaintext ~ label, .form-floating > .form-select ~ label { - opacity: 0.65; transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); } .form-floating > .form-control:-webkit-autofill ~ label { - opacity: 0.65; transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); } +.form-floating > textarea:not(:-moz-placeholder-shown) ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ""; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius); +} +.form-floating > textarea:focus ~ label::after, +.form-floating > textarea:not(:placeholder-shown) ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ""; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius); +} +.form-floating > textarea:disabled ~ label::after { + background-color: var(--bs-secondary-bg); +} +.form-floating > .form-control-plaintext ~ label { + border-width: var(--bs-border-width) 0; +} +.form-floating > :disabled ~ label, +.form-floating > .form-control:disabled ~ label { + color: #999; +} .input-group { position: relative; @@ -2807,22 +2795,24 @@ textarea.form-control-lg { width: 100%; } .input-group > .form-control, -.input-group > .form-select { +.input-group > .form-select, +.input-group > .form-floating { position: relative; flex: 1 1 auto; width: 1%; min-width: 0; } .input-group > .form-control:focus, -.input-group > .form-select:focus { - z-index: 3; +.input-group > .form-select:focus, +.input-group > .form-floating:focus-within { + z-index: 5; } .input-group .btn { position: relative; z-index: 2; } .input-group .btn:focus { - z-index: 3; + z-index: 5; } .input-group-text { @@ -2832,12 +2822,12 @@ textarea.form-control-lg { font-size: 1rem; font-weight: 400; line-height: 1.5; - color: #222; + color: var(--bs-body-color); text-align: center; white-space: nowrap; - background-color: #f0f0f0; - border: 1px solid #ced4da; - border-radius: 0.25rem; + background-color: var(--bs-tertiary-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); } .input-group-lg > .form-control, @@ -2846,7 +2836,7 @@ textarea.form-control-lg { .input-group-lg > .btn { padding: 0.5rem 1rem; font-size: 1.25rem; - border-radius: 0.3rem; + border-radius: var(--bs-border-radius-lg); } .input-group-sm > .form-control, @@ -2855,7 +2845,7 @@ textarea.form-control-lg { .input-group-sm > .btn { padding: 0.25rem 0.5rem; font-size: 0.875rem; - border-radius: 0.2rem; + border-radius: var(--bs-border-radius-sm); } .input-group-lg > .form-select, @@ -2863,18 +2853,27 @@ textarea.form-control-lg { padding-right: 3rem; } -.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu), -.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3) { +.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3), +.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, +.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select { border-top-right-radius: 0; border-bottom-right-radius: 0; } -.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu), -.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4) { +.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), +.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4), +.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control, +.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { - margin-left: -1px; + margin-left: calc(-1 * var(--bs-border-width)); + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .form-floating:not(:first-child) > .form-control, +.input-group > .form-floating:not(:first-child) > .form-select { border-top-left-radius: 0; border-bottom-left-radius: 0; } @@ -2884,7 +2883,7 @@ textarea.form-control-lg { width: 100%; margin-top: 0.25rem; font-size: 0.875em; - color: #28b62c; + color: var(--bs-form-valid-color); } .valid-tooltip { @@ -2897,8 +2896,8 @@ textarea.form-control-lg { margin-top: 0.1rem; font-size: 0.875rem; color: #fff; - background-color: rgba(40, 182, 44, 0.9); - border-radius: 0.25rem; + background-color: var(--bs-success); + border-radius: var(--bs-border-radius); } .was-validated :valid ~ .valid-feedback, @@ -2909,16 +2908,16 @@ textarea.form-control-lg { } .was-validated .form-control:valid, .form-control.is-valid { - border-color: #28b62c; + border-color: var(--bs-form-valid-border-color); 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='%2328b62c' 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-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328b62c' d='M2.3 6.73.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.1'/%3e%3c/svg%3e"); background-repeat: no-repeat; background-position: right calc(0.375em + 0.1875rem) center; 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: #28b62c; - box-shadow: 0 0 0 0.25rem rgba(40, 182, 44, 0.25); + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); } .was-validated textarea.form-control:valid, textarea.form-control.is-valid { @@ -2927,44 +2926,45 @@ textarea.form-control-lg { } .was-validated .form-select:valid, .form-select.is-valid { - border-color: #28b62c; + border-color: var(--bs-form-valid-border-color); } .was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328b62c' d='M2.3 6.73.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.1'/%3e%3c/svg%3e"); padding-right: 4.125rem; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23333' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328b62c' 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-position: right 0.75rem center, center right 2.25rem; background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } .was-validated .form-select:valid:focus, .form-select.is-valid:focus { - border-color: #28b62c; - box-shadow: 0 0 0 0.25rem rgba(40, 182, 44, 0.25); + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} + +.was-validated .form-control-color:valid, .form-control-color.is-valid { + width: calc(3rem + calc(1.5em + 0.75rem)); } .was-validated .form-check-input:valid, .form-check-input.is-valid { - border-color: #28b62c; + border-color: var(--bs-form-valid-border-color); } .was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { - background-color: #28b62c; + background-color: var(--bs-form-valid-color); } .was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { - box-shadow: 0 0 0 0.25rem rgba(40, 182, 44, 0.25); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); } .was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { - color: #28b62c; + color: var(--bs-form-valid-color); } .form-check-inline .form-check-input ~ .valid-feedback { margin-left: 0.5em; } -.was-validated .input-group .form-control:valid, .input-group .form-control.is-valid, -.was-validated .input-group .form-select:valid, -.input-group .form-select.is-valid { - z-index: 1; -} -.was-validated .input-group .form-control:valid:focus, .input-group .form-control.is-valid:focus, -.was-validated .input-group .form-select:valid:focus, -.input-group .form-select.is-valid:focus { +.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid, +.was-validated .input-group > .form-select:not(:focus):valid, +.input-group > .form-select:not(:focus).is-valid, +.was-validated .input-group > .form-floating:not(:focus-within):valid, +.input-group > .form-floating:not(:focus-within).is-valid { z-index: 3; } @@ -2973,7 +2973,7 @@ textarea.form-control-lg { width: 100%; margin-top: 0.25rem; font-size: 0.875em; - color: #ff4136; + color: var(--bs-form-invalid-color); } .invalid-tooltip { @@ -2986,8 +2986,8 @@ textarea.form-control-lg { margin-top: 0.1rem; font-size: 0.875rem; color: #fff; - background-color: rgba(255, 65, 54, 0.9); - border-radius: 0.25rem; + background-color: var(--bs-danger); + border-radius: var(--bs-border-radius); } .was-validated :invalid ~ .invalid-feedback, @@ -2998,7 +2998,7 @@ textarea.form-control-lg { } .was-validated .form-control:invalid, .form-control.is-invalid { - border-color: #ff4136; + border-color: var(--bs-form-invalid-border-color); 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 12 12' width='12' height='12' fill='none' stroke='%23ff4136'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff4136' stroke='none'/%3e%3c/svg%3e"); background-repeat: no-repeat; @@ -3006,8 +3006,8 @@ textarea.form-control-lg { 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: #ff4136; - box-shadow: 0 0 0 0.25rem rgba(255, 65, 54, 0.25); + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); } .was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { @@ -3016,52 +3016,71 @@ textarea.form-control-lg { } .was-validated .form-select:invalid, .form-select.is-invalid { - border-color: #ff4136; + border-color: var(--bs-form-invalid-border-color); } .was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff4136'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff4136' stroke='none'/%3e%3c/svg%3e"); padding-right: 4.125rem; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23333' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff4136'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff4136' stroke='none'/%3e%3c/svg%3e"); background-position: right 0.75rem center, center right 2.25rem; background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } .was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { - border-color: #ff4136; - box-shadow: 0 0 0 0.25rem rgba(255, 65, 54, 0.25); + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} + +.was-validated .form-control-color:invalid, .form-control-color.is-invalid { + width: calc(3rem + calc(1.5em + 0.75rem)); } .was-validated .form-check-input:invalid, .form-check-input.is-invalid { - border-color: #ff4136; + border-color: var(--bs-form-invalid-border-color); } .was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { - background-color: #ff4136; + background-color: var(--bs-form-invalid-color); } .was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { - box-shadow: 0 0 0 0.25rem rgba(255, 65, 54, 0.25); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); } .was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { - color: #ff4136; + color: var(--bs-form-invalid-color); } .form-check-inline .form-check-input ~ .invalid-feedback { margin-left: 0.5em; } -.was-validated .input-group .form-control:invalid, .input-group .form-control.is-invalid, -.was-validated .input-group .form-select:invalid, -.input-group .form-select.is-invalid { - z-index: 2; -} -.was-validated .input-group .form-control:invalid:focus, .input-group .form-control.is-invalid:focus, -.was-validated .input-group .form-select:invalid:focus, -.input-group .form-select.is-invalid:focus { - z-index: 3; +.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid, +.was-validated .input-group > .form-select:not(:focus):invalid, +.input-group > .form-select:not(:focus).is-invalid, +.was-validated .input-group > .form-floating:not(:focus-within):invalid, +.input-group > .form-floating:not(:focus-within).is-invalid { + z-index: 4; } .btn { + --bs-btn-padding-x: 0.75rem; + --bs-btn-padding-y: 0.375rem; + --bs-btn-font-family: ; + --bs-btn-font-size: 1rem; + --bs-btn-font-weight: 700; + --bs-btn-line-height: 1.5; + --bs-btn-color: var(--bs-body-color); + --bs-btn-bg: transparent; + --bs-btn-border-width: var(--bs-border-width); + --bs-btn-border-color: transparent; + --bs-btn-border-radius: var(--bs-border-radius); + --bs-btn-hover-border-color: transparent; + --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + --bs-btn-disabled-opacity: 0.65; + --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5); display: inline-block; - font-weight: 700; - line-height: 1.5; - color: #222; + padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); + font-family: var(--bs-btn-font-family); + font-size: var(--bs-btn-font-size); + font-weight: var(--bs-btn-font-weight); + line-height: var(--bs-btn-line-height); + color: var(--bs-btn-color); text-align: center; text-decoration: none; vertical-align: middle; @@ -3069,11 +3088,9 @@ textarea.form-control-lg { -webkit-user-select: none; -moz-user-select: none; user-select: none; - background-color: transparent; - border: 1px solid transparent; - padding: 0.375rem 0.75rem; - font-size: 1rem; - border-radius: 0.25rem; + border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); + border-radius: var(--bs-btn-border-radius); + background-color: var(--bs-btn-bg); 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) { @@ -3082,479 +3099,352 @@ textarea.form-control-lg { } } .btn:hover { - color: #222; + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); } -.btn-check:focus + .btn, .btn:focus { +.btn-check + .btn:hover { + color: var(--bs-btn-color); + background-color: var(--bs-btn-bg); + border-color: var(--bs-btn-border-color); +} +.btn:focus-visible { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); outline: 0; - box-shadow: 0 0 0 0.25rem rgba(21, 140, 186, 0.25); + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:focus-visible + .btn { + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show { + color: var(--bs-btn-active-color); + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color); +} +.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible { + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:checked:focus-visible + .btn { + box-shadow: var(--bs-btn-focus-box-shadow); } .btn:disabled, .btn.disabled, fieldset:disabled .btn { + color: var(--bs-btn-disabled-color); pointer-events: none; - opacity: 0.65; + background-color: var(--bs-btn-disabled-bg); + border-color: var(--bs-btn-disabled-border-color); + opacity: var(--bs-btn-disabled-opacity); } .btn-primary { - color: #fff; - background-color: #158cba; - border-color: #158cba; -} -.btn-primary:hover { - color: #fff; - background-color: #12779e; - border-color: #117095; -} -.btn-check:focus + .btn-primary, .btn-primary:focus { - color: #fff; - background-color: #12779e; - border-color: #117095; - box-shadow: 0 0 0 0.25rem rgba(56, 157, 196, 0.5); -} -.btn-check:checked + .btn-primary, .btn-check:active + .btn-primary, .btn-primary:active, .btn-primary.active, .show > .btn-primary.dropdown-toggle { - color: #fff; - background-color: #117095; - border-color: #10698c; -} -.btn-check:checked + .btn-primary:focus, .btn-check:active + .btn-primary:focus, .btn-primary:active:focus, .btn-primary.active:focus, .show > .btn-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(56, 157, 196, 0.5); -} -.btn-primary:disabled, .btn-primary.disabled { - color: #fff; - background-color: #158cba; - border-color: #158cba; + --bs-btn-color: #fff; + --bs-btn-bg: #158cba; + --bs-btn-border-color: #158cba; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #12779e; + --bs-btn-hover-border-color: #117095; + --bs-btn-focus-shadow-rgb: 56, 157, 196; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #117095; + --bs-btn-active-border-color: #10698c; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #158cba; + --bs-btn-disabled-border-color: #158cba; } .btn-secondary { - color: #000; - background-color: #f0f0f0; - border-color: #f0f0f0; -} -.btn-secondary:hover { - color: #000; - background-color: #f2f2f2; - border-color: #f2f2f2; -} -.btn-check:focus + .btn-secondary, .btn-secondary:focus { - color: #000; - background-color: #f2f2f2; - border-color: #f2f2f2; - box-shadow: 0 0 0 0.25rem rgba(204, 204, 204, 0.5); -} -.btn-check:checked + .btn-secondary, .btn-check:active + .btn-secondary, .btn-secondary:active, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle { - color: #000; - background-color: #f3f3f3; - border-color: #f2f2f2; -} -.btn-check:checked + .btn-secondary:focus, .btn-check:active + .btn-secondary:focus, .btn-secondary:active:focus, .btn-secondary.active:focus, .show > .btn-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(204, 204, 204, 0.5); -} -.btn-secondary:disabled, .btn-secondary.disabled { - color: #000; - background-color: #f0f0f0; - border-color: #f0f0f0; + --bs-btn-color: #000; + --bs-btn-bg: #f0f0f0; + --bs-btn-border-color: #f0f0f0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #f2f2f2; + --bs-btn-hover-border-color: #f2f2f2; + --bs-btn-focus-shadow-rgb: 204, 204, 204; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #f3f3f3; + --bs-btn-active-border-color: #f2f2f2; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #f0f0f0; + --bs-btn-disabled-border-color: #f0f0f0; } .btn-success { - color: #fff; - background-color: #28b62c; - border-color: #28b62c; -} -.btn-success:hover { - color: #fff; - background-color: #229b25; - border-color: #209223; -} -.btn-check:focus + .btn-success, .btn-success:focus { - color: #fff; - background-color: #229b25; - border-color: #209223; - box-shadow: 0 0 0 0.25rem rgba(72, 193, 76, 0.5); -} -.btn-check:checked + .btn-success, .btn-check:active + .btn-success, .btn-success:active, .btn-success.active, .show > .btn-success.dropdown-toggle { - color: #fff; - background-color: #209223; - border-color: #1e8921; -} -.btn-check:checked + .btn-success:focus, .btn-check:active + .btn-success:focus, .btn-success:active:focus, .btn-success.active:focus, .show > .btn-success.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(72, 193, 76, 0.5); -} -.btn-success:disabled, .btn-success.disabled { - color: #fff; - background-color: #28b62c; - border-color: #28b62c; + --bs-btn-color: #fff; + --bs-btn-bg: #28b62c; + --bs-btn-border-color: #28b62c; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #229b25; + --bs-btn-hover-border-color: #209223; + --bs-btn-focus-shadow-rgb: 72, 193, 76; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #209223; + --bs-btn-active-border-color: #1e8921; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #28b62c; + --bs-btn-disabled-border-color: #28b62c; } .btn-info { - color: #fff; - background-color: #75caeb; - border-color: #75caeb; -} -.btn-info:hover { - color: #fff; - background-color: #63acc8; - border-color: #5ea2bc; -} -.btn-check:focus + .btn-info, .btn-info:focus { - color: #fff; - background-color: #63acc8; - border-color: #5ea2bc; - box-shadow: 0 0 0 0.25rem rgba(138, 210, 238, 0.5); -} -.btn-check:checked + .btn-info, .btn-check:active + .btn-info, .btn-info:active, .btn-info.active, .show > .btn-info.dropdown-toggle { - color: #fff; - background-color: #5ea2bc; - border-color: #5898b0; -} -.btn-check:checked + .btn-info:focus, .btn-check:active + .btn-info:focus, .btn-info:active:focus, .btn-info.active:focus, .show > .btn-info.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(138, 210, 238, 0.5); -} -.btn-info:disabled, .btn-info.disabled { - color: #fff; - background-color: #75caeb; - border-color: #75caeb; + --bs-btn-color: #fff; + --bs-btn-bg: #75caeb; + --bs-btn-border-color: #75caeb; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #63acc8; + --bs-btn-hover-border-color: #5ea2bc; + --bs-btn-focus-shadow-rgb: 138, 210, 238; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #5ea2bc; + --bs-btn-active-border-color: #5898b0; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #75caeb; + --bs-btn-disabled-border-color: #75caeb; } .btn-warning { - color: #fff; - background-color: #ff851b; - border-color: #ff851b; -} -.btn-warning:hover { - color: #fff; - background-color: #d97117; - border-color: #cc6a16; -} -.btn-check:focus + .btn-warning, .btn-warning:focus { - color: #fff; - background-color: #d97117; - border-color: #cc6a16; - box-shadow: 0 0 0 0.25rem rgba(255, 151, 61, 0.5); -} -.btn-check:checked + .btn-warning, .btn-check:active + .btn-warning, .btn-warning:active, .btn-warning.active, .show > .btn-warning.dropdown-toggle { - color: #fff; - background-color: #cc6a16; - border-color: #bf6414; -} -.btn-check:checked + .btn-warning:focus, .btn-check:active + .btn-warning:focus, .btn-warning:active:focus, .btn-warning.active:focus, .show > .btn-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(255, 151, 61, 0.5); -} -.btn-warning:disabled, .btn-warning.disabled { - color: #fff; - background-color: #ff851b; - border-color: #ff851b; + --bs-btn-color: #fff; + --bs-btn-bg: #ff851b; + --bs-btn-border-color: #ff851b; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #d97117; + --bs-btn-hover-border-color: #cc6a16; + --bs-btn-focus-shadow-rgb: 255, 151, 61; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #cc6a16; + --bs-btn-active-border-color: #bf6414; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #ff851b; + --bs-btn-disabled-border-color: #ff851b; } .btn-danger { - color: #fff; - background-color: #ff4136; - border-color: #ff4136; -} -.btn-danger:hover { - color: #fff; - background-color: #d9372e; - border-color: #cc342b; -} -.btn-check:focus + .btn-danger, .btn-danger:focus { - color: #fff; - background-color: #d9372e; - border-color: #cc342b; - box-shadow: 0 0 0 0.25rem rgba(255, 94, 84, 0.5); -} -.btn-check:checked + .btn-danger, .btn-check:active + .btn-danger, .btn-danger:active, .btn-danger.active, .show > .btn-danger.dropdown-toggle { - color: #fff; - background-color: #cc342b; - border-color: #bf3129; -} -.btn-check:checked + .btn-danger:focus, .btn-check:active + .btn-danger:focus, .btn-danger:active:focus, .btn-danger.active:focus, .show > .btn-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(255, 94, 84, 0.5); -} -.btn-danger:disabled, .btn-danger.disabled { - color: #fff; - background-color: #ff4136; - border-color: #ff4136; + --bs-btn-color: #fff; + --bs-btn-bg: #ff4136; + --bs-btn-border-color: #ff4136; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #d9372e; + --bs-btn-hover-border-color: #cc342b; + --bs-btn-focus-shadow-rgb: 255, 94, 84; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #cc342b; + --bs-btn-active-border-color: #bf3129; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #ff4136; + --bs-btn-disabled-border-color: #ff4136; } .btn-light { - color: #000; - background-color: #f6f6f6; - border-color: #f6f6f6; -} -.btn-light:hover { - color: #000; - background-color: #f7f7f7; - border-color: #f7f7f7; -} -.btn-check:focus + .btn-light, .btn-light:focus { - color: #000; - background-color: #f7f7f7; - border-color: #f7f7f7; - box-shadow: 0 0 0 0.25rem rgba(209, 209, 209, 0.5); -} -.btn-check:checked + .btn-light, .btn-check:active + .btn-light, .btn-light:active, .btn-light.active, .show > .btn-light.dropdown-toggle { - color: #000; - background-color: #f8f8f8; - border-color: #f7f7f7; -} -.btn-check:checked + .btn-light:focus, .btn-check:active + .btn-light:focus, .btn-light:active:focus, .btn-light.active:focus, .show > .btn-light.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(209, 209, 209, 0.5); -} -.btn-light:disabled, .btn-light.disabled { - color: #000; - background-color: #f6f6f6; - border-color: #f6f6f6; + --bs-btn-color: #000; + --bs-btn-bg: #f6f6f6; + --bs-btn-border-color: #f6f6f6; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #d1d1d1; + --bs-btn-hover-border-color: #c5c5c5; + --bs-btn-focus-shadow-rgb: 209, 209, 209; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #c5c5c5; + --bs-btn-active-border-color: #b9b9b9; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #f6f6f6; + --bs-btn-disabled-border-color: #f6f6f6; } .btn-dark { - color: #fff; - background-color: #555; - border-color: #555; -} -.btn-dark:hover { - color: #fff; - background-color: #484848; - border-color: #444444; -} -.btn-check:focus + .btn-dark, .btn-dark:focus { - color: #fff; - background-color: #484848; - border-color: #444444; - box-shadow: 0 0 0 0.25rem rgba(111, 111, 111, 0.5); -} -.btn-check:checked + .btn-dark, .btn-check:active + .btn-dark, .btn-dark:active, .btn-dark.active, .show > .btn-dark.dropdown-toggle { - color: #fff; - background-color: #444444; - border-color: #404040; -} -.btn-check:checked + .btn-dark:focus, .btn-check:active + .btn-dark:focus, .btn-dark:active:focus, .btn-dark.active:focus, .show > .btn-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(111, 111, 111, 0.5); -} -.btn-dark:disabled, .btn-dark.disabled { - color: #fff; - background-color: #555; - border-color: #555; + --bs-btn-color: #fff; + --bs-btn-bg: #555; + --bs-btn-border-color: #555; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #6f6f6f; + --bs-btn-hover-border-color: #666666; + --bs-btn-focus-shadow-rgb: 111, 111, 111; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #777777; + --bs-btn-active-border-color: #666666; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #555; + --bs-btn-disabled-border-color: #555; } .btn-outline-primary { - color: #158cba; - border-color: #158cba; -} -.btn-outline-primary:hover { - color: #fff; - background-color: #158cba; - border-color: #158cba; -} -.btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus { - box-shadow: 0 0 0 0.25rem rgba(21, 140, 186, 0.5); -} -.btn-check:checked + .btn-outline-primary, .btn-check:active + .btn-outline-primary, .btn-outline-primary:active, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show { - color: #fff; - background-color: #158cba; - border-color: #158cba; -} -.btn-check:checked + .btn-outline-primary:focus, .btn-check:active + .btn-outline-primary:focus, .btn-outline-primary:active:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(21, 140, 186, 0.5); -} -.btn-outline-primary:disabled, .btn-outline-primary.disabled { - color: #158cba; - background-color: transparent; + --bs-btn-color: #158cba; + --bs-btn-border-color: #158cba; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #158cba; + --bs-btn-hover-border-color: #158cba; + --bs-btn-focus-shadow-rgb: 21, 140, 186; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #158cba; + --bs-btn-active-border-color: #158cba; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #158cba; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #158cba; + --bs-gradient: none; } .btn-outline-secondary { - color: #f0f0f0; - border-color: #f0f0f0; -} -.btn-outline-secondary:hover { - color: #000; - background-color: #f0f0f0; - border-color: #f0f0f0; -} -.btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus { - box-shadow: 0 0 0 0.25rem rgba(240, 240, 240, 0.5); -} -.btn-check:checked + .btn-outline-secondary, .btn-check:active + .btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show { - color: #000; - background-color: #f0f0f0; - border-color: #f0f0f0; -} -.btn-check:checked + .btn-outline-secondary:focus, .btn-check:active + .btn-outline-secondary:focus, .btn-outline-secondary:active:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(240, 240, 240, 0.5); -} -.btn-outline-secondary:disabled, .btn-outline-secondary.disabled { - color: #f0f0f0; - background-color: transparent; + --bs-btn-color: #f0f0f0; + --bs-btn-border-color: #f0f0f0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #f0f0f0; + --bs-btn-hover-border-color: #f0f0f0; + --bs-btn-focus-shadow-rgb: 240, 240, 240; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #f0f0f0; + --bs-btn-active-border-color: #f0f0f0; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #f0f0f0; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #f0f0f0; + --bs-gradient: none; } .btn-outline-success { - color: #28b62c; - border-color: #28b62c; -} -.btn-outline-success:hover { - color: #fff; - background-color: #28b62c; - border-color: #28b62c; -} -.btn-check:focus + .btn-outline-success, .btn-outline-success:focus { - box-shadow: 0 0 0 0.25rem rgba(40, 182, 44, 0.5); -} -.btn-check:checked + .btn-outline-success, .btn-check:active + .btn-outline-success, .btn-outline-success:active, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show { - color: #fff; - background-color: #28b62c; - border-color: #28b62c; -} -.btn-check:checked + .btn-outline-success:focus, .btn-check:active + .btn-outline-success:focus, .btn-outline-success:active:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(40, 182, 44, 0.5); -} -.btn-outline-success:disabled, .btn-outline-success.disabled { - color: #28b62c; - background-color: transparent; + --bs-btn-color: #28b62c; + --bs-btn-border-color: #28b62c; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #28b62c; + --bs-btn-hover-border-color: #28b62c; + --bs-btn-focus-shadow-rgb: 40, 182, 44; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #28b62c; + --bs-btn-active-border-color: #28b62c; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #28b62c; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #28b62c; + --bs-gradient: none; } .btn-outline-info { - color: #75caeb; - border-color: #75caeb; -} -.btn-outline-info:hover { - color: #fff; - background-color: #75caeb; - border-color: #75caeb; -} -.btn-check:focus + .btn-outline-info, .btn-outline-info:focus { - box-shadow: 0 0 0 0.25rem rgba(117, 202, 235, 0.5); -} -.btn-check:checked + .btn-outline-info, .btn-check:active + .btn-outline-info, .btn-outline-info:active, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show { - color: #fff; - background-color: #75caeb; - border-color: #75caeb; -} -.btn-check:checked + .btn-outline-info:focus, .btn-check:active + .btn-outline-info:focus, .btn-outline-info:active:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(117, 202, 235, 0.5); -} -.btn-outline-info:disabled, .btn-outline-info.disabled { - color: #75caeb; - background-color: transparent; + --bs-btn-color: #75caeb; + --bs-btn-border-color: #75caeb; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #75caeb; + --bs-btn-hover-border-color: #75caeb; + --bs-btn-focus-shadow-rgb: 117, 202, 235; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #75caeb; + --bs-btn-active-border-color: #75caeb; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #75caeb; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #75caeb; + --bs-gradient: none; } .btn-outline-warning { - color: #ff851b; - border-color: #ff851b; -} -.btn-outline-warning:hover { - color: #fff; - background-color: #ff851b; - border-color: #ff851b; -} -.btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus { - box-shadow: 0 0 0 0.25rem rgba(255, 133, 27, 0.5); -} -.btn-check:checked + .btn-outline-warning, .btn-check:active + .btn-outline-warning, .btn-outline-warning:active, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show { - color: #fff; - background-color: #ff851b; - border-color: #ff851b; -} -.btn-check:checked + .btn-outline-warning:focus, .btn-check:active + .btn-outline-warning:focus, .btn-outline-warning:active:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(255, 133, 27, 0.5); -} -.btn-outline-warning:disabled, .btn-outline-warning.disabled { - color: #ff851b; - background-color: transparent; + --bs-btn-color: #ff851b; + --bs-btn-border-color: #ff851b; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #ff851b; + --bs-btn-hover-border-color: #ff851b; + --bs-btn-focus-shadow-rgb: 255, 133, 27; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #ff851b; + --bs-btn-active-border-color: #ff851b; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #ff851b; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #ff851b; + --bs-gradient: none; } .btn-outline-danger { - color: #ff4136; - border-color: #ff4136; -} -.btn-outline-danger:hover { - color: #fff; - background-color: #ff4136; - border-color: #ff4136; -} -.btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus { - box-shadow: 0 0 0 0.25rem rgba(255, 65, 54, 0.5); -} -.btn-check:checked + .btn-outline-danger, .btn-check:active + .btn-outline-danger, .btn-outline-danger:active, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show { - color: #fff; - background-color: #ff4136; - border-color: #ff4136; -} -.btn-check:checked + .btn-outline-danger:focus, .btn-check:active + .btn-outline-danger:focus, .btn-outline-danger:active:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(255, 65, 54, 0.5); -} -.btn-outline-danger:disabled, .btn-outline-danger.disabled { - color: #ff4136; - background-color: transparent; + --bs-btn-color: #ff4136; + --bs-btn-border-color: #ff4136; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #ff4136; + --bs-btn-hover-border-color: #ff4136; + --bs-btn-focus-shadow-rgb: 255, 65, 54; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #ff4136; + --bs-btn-active-border-color: #ff4136; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #ff4136; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #ff4136; + --bs-gradient: none; } .btn-outline-light { - color: #f6f6f6; - border-color: #f6f6f6; -} -.btn-outline-light:hover { - color: #000; - background-color: #f6f6f6; - border-color: #f6f6f6; -} -.btn-check:focus + .btn-outline-light, .btn-outline-light:focus { - box-shadow: 0 0 0 0.25rem rgba(246, 246, 246, 0.5); -} -.btn-check:checked + .btn-outline-light, .btn-check:active + .btn-outline-light, .btn-outline-light:active, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show { - color: #000; - background-color: #f6f6f6; - border-color: #f6f6f6; -} -.btn-check:checked + .btn-outline-light:focus, .btn-check:active + .btn-outline-light:focus, .btn-outline-light:active:focus, .btn-outline-light.active:focus, .btn-outline-light.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(246, 246, 246, 0.5); -} -.btn-outline-light:disabled, .btn-outline-light.disabled { - color: #f6f6f6; - background-color: transparent; + --bs-btn-color: #f6f6f6; + --bs-btn-border-color: #f6f6f6; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #f6f6f6; + --bs-btn-hover-border-color: #f6f6f6; + --bs-btn-focus-shadow-rgb: 246, 246, 246; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #f6f6f6; + --bs-btn-active-border-color: #f6f6f6; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #f6f6f6; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #f6f6f6; + --bs-gradient: none; } .btn-outline-dark { - color: #555; - border-color: #555; -} -.btn-outline-dark:hover { - color: #fff; - background-color: #555; - border-color: #555; -} -.btn-check:focus + .btn-outline-dark, .btn-outline-dark:focus { - box-shadow: 0 0 0 0.25rem rgba(85, 85, 85, 0.5); -} -.btn-check:checked + .btn-outline-dark, .btn-check:active + .btn-outline-dark, .btn-outline-dark:active, .btn-outline-dark.active, .btn-outline-dark.dropdown-toggle.show { - color: #fff; - background-color: #555; - border-color: #555; -} -.btn-check:checked + .btn-outline-dark:focus, .btn-check:active + .btn-outline-dark:focus, .btn-outline-dark:active:focus, .btn-outline-dark.active:focus, .btn-outline-dark.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(85, 85, 85, 0.5); -} -.btn-outline-dark:disabled, .btn-outline-dark.disabled { - color: #555; - background-color: transparent; + --bs-btn-color: #555; + --bs-btn-border-color: #555; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #555; + --bs-btn-hover-border-color: #555; + --bs-btn-focus-shadow-rgb: 85, 85, 85; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #555; + --bs-btn-active-border-color: #555; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #555; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #555; + --bs-gradient: none; } .btn-link { - font-weight: 400; - color: #158cba; + --bs-btn-font-weight: 400; + --bs-btn-color: var(--bs-link-color); + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-hover-color: var(--bs-link-hover-color); + --bs-btn-hover-border-color: transparent; + --bs-btn-active-color: var(--bs-link-hover-color); + --bs-btn-active-border-color: transparent; + --bs-btn-disabled-color: #999; + --bs-btn-disabled-border-color: transparent; + --bs-btn-box-shadow: 0 0 0 #000; + --bs-btn-focus-shadow-rgb: 56, 157, 196; text-decoration: underline; } -.btn-link:hover { - color: #117095; +.btn-link:focus-visible { + color: var(--bs-btn-color); } -.btn-link:disabled, .btn-link.disabled { - color: #999; +.btn-link:hover { + color: var(--bs-btn-hover-color); } .btn-lg, .btn-group-lg > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - border-radius: 0.3rem; + --bs-btn-padding-y: 0.5rem; + --bs-btn-padding-x: 1rem; + --bs-btn-font-size: 1.25rem; + --bs-btn-border-radius: var(--bs-border-radius-lg); } .btn-sm, .btn-group-sm > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: 0.2rem; + --bs-btn-padding-y: 0.25rem; + --bs-btn-padding-x: 0.5rem; + --bs-btn-font-size: 0.875rem; + --bs-btn-border-radius: var(--bs-border-radius-sm); } .fade { @@ -3597,7 +3487,9 @@ textarea.form-control-lg { .dropup, .dropend, .dropdown, -.dropstart { +.dropstart, +.dropup-center, +.dropdown-center { position: relative; } @@ -3619,25 +3511,51 @@ textarea.form-control-lg { } .dropdown-menu { + --bs-dropdown-zindex: 1000; + --bs-dropdown-min-width: 10rem; + --bs-dropdown-padding-x: 0; + --bs-dropdown-padding-y: 0.5rem; + --bs-dropdown-spacer: 0.125rem; + --bs-dropdown-font-size: 1rem; + --bs-dropdown-color: var(--bs-body-color); + --bs-dropdown-bg: var(--bs-body-bg); + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-border-radius: var(--bs-border-radius); + --bs-dropdown-border-width: var(--bs-border-width); + --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width)); + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-divider-margin-y: 0.5rem; + --bs-dropdown-box-shadow: var(--bs-box-shadow); + --bs-dropdown-link-color: var(--bs-tertiary-color); + --bs-dropdown-link-hover-color: var(--bs-tertiary-color); + --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #158cba; + --bs-dropdown-link-disabled-color: var(--bs-tertiary-color); + --bs-dropdown-item-padding-x: 1rem; + --bs-dropdown-item-padding-y: 0.25rem; + --bs-dropdown-header-color: #999; + --bs-dropdown-header-padding-x: 1rem; + --bs-dropdown-header-padding-y: 0.5rem; position: absolute; - z-index: 1000; + z-index: var(--bs-dropdown-zindex); display: none; - min-width: 10rem; - padding: 0.5rem 0; + min-width: var(--bs-dropdown-min-width); + padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); margin: 0; - font-size: 1rem; - color: #222; + font-size: var(--bs-dropdown-font-size); + color: var(--bs-dropdown-color); text-align: left; list-style: none; - background-color: #fff; + background-color: var(--bs-dropdown-bg); background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0.25rem; + border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); + border-radius: var(--bs-dropdown-border-radius); } .dropdown-menu[data-bs-popper] { top: 100%; left: 0; - margin-top: 0.125rem; + margin-top: var(--bs-dropdown-spacer); } .dropdown-menu-start { @@ -3664,7 +3582,6 @@ textarea.form-control-lg { right: auto; left: 0; } - .dropdown-menu-sm-end { --bs-position: end; } @@ -3681,7 +3598,6 @@ textarea.form-control-lg { right: auto; left: 0; } - .dropdown-menu-md-end { --bs-position: end; } @@ -3698,7 +3614,6 @@ textarea.form-control-lg { right: auto; left: 0; } - .dropdown-menu-lg-end { --bs-position: end; } @@ -3715,7 +3630,6 @@ textarea.form-control-lg { right: auto; left: 0; } - .dropdown-menu-xl-end { --bs-position: end; } @@ -3732,7 +3646,6 @@ textarea.form-control-lg { right: auto; left: 0; } - .dropdown-menu-xxl-end { --bs-position: end; } @@ -3745,7 +3658,7 @@ textarea.form-control-lg { top: auto; bottom: 100%; margin-top: 0; - margin-bottom: 0.125rem; + margin-bottom: var(--bs-dropdown-spacer); } .dropup .dropdown-toggle::after { display: inline-block; @@ -3766,7 +3679,7 @@ textarea.form-control-lg { right: auto; left: 100%; margin-top: 0; - margin-left: 0.125rem; + margin-left: var(--bs-dropdown-spacer); } .dropend .dropdown-toggle::after { display: inline-block; @@ -3790,7 +3703,7 @@ textarea.form-control-lg { right: 100%; left: auto; margin-top: 0; - margin-right: 0.125rem; + margin-right: var(--bs-dropdown-spacer); } .dropstart .dropdown-toggle::after { display: inline-block; @@ -3819,35 +3732,37 @@ textarea.form-control-lg { .dropdown-divider { height: 0; - margin: 0.5rem 0; + margin: var(--bs-dropdown-divider-margin-y) 0; overflow: hidden; - border-top: 1px solid rgba(0, 0, 0, 0.15); + border-top: 1px solid var(--bs-dropdown-divider-bg); + opacity: 1; } .dropdown-item { display: block; width: 100%; - padding: 0.25rem 1rem; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); clear: both; font-weight: 400; - color: rgba(0, 0, 0, 0.5); + color: var(--bs-dropdown-link-color); text-align: inherit; text-decoration: none; white-space: nowrap; background-color: transparent; border: 0; + border-radius: var(--bs-dropdown-item-border-radius, 0); } .dropdown-item:hover, .dropdown-item:focus { - color: rgba(0, 0, 0, 0.55); - background-color: #f0f0f0; + color: var(--bs-dropdown-link-hover-color); + background-color: var(--bs-dropdown-link-hover-bg); } .dropdown-item.active, .dropdown-item:active { - color: #fff; + color: var(--bs-dropdown-link-active-color); text-decoration: none; - background-color: #158cba; + background-color: var(--bs-dropdown-link-active-bg); } .dropdown-item.disabled, .dropdown-item:disabled { - color: #adb5bd; + color: var(--bs-dropdown-link-disabled-color); pointer-events: none; background-color: transparent; } @@ -3858,46 +3773,32 @@ textarea.form-control-lg { .dropdown-header { display: block; - padding: 0.5rem 1rem; + padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x); margin-bottom: 0; font-size: 0.875rem; - color: #999; + color: var(--bs-dropdown-header-color); white-space: nowrap; } .dropdown-item-text { display: block; - padding: 0.25rem 1rem; - color: rgba(0, 0, 0, 0.5); + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + color: var(--bs-dropdown-link-color); } .dropdown-menu-dark { - color: #dee2e6; - background-color: #333; - border-color: rgba(0, 0, 0, 0.15); -} -.dropdown-menu-dark .dropdown-item { - color: #dee2e6; -} -.dropdown-menu-dark .dropdown-item:hover, .dropdown-menu-dark .dropdown-item:focus { - color: #fff; - background-color: rgba(255, 255, 255, 0.15); -} -.dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active { - color: #fff; - background-color: #158cba; -} -.dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled { - color: #adb5bd; -} -.dropdown-menu-dark .dropdown-divider { - border-color: rgba(0, 0, 0, 0.15); -} -.dropdown-menu-dark .dropdown-item-text { - color: #dee2e6; -} -.dropdown-menu-dark .dropdown-header { - color: #adb5bd; + --bs-dropdown-color: #dee2e6; + --bs-dropdown-bg: #333; + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-box-shadow: ; + --bs-dropdown-link-color: #dee2e6; + --bs-dropdown-link-hover-color: #fff; + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #158cba; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-header-color: #adb5bd; } .btn-group, @@ -3935,11 +3836,15 @@ textarea.form-control-lg { width: auto; } -.btn-group > .btn:not(:first-child), +.btn-group { + border-radius: var(--bs-border-radius); +} +.btn-group > :not(.btn-check:first-child) + .btn, .btn-group > .btn-group:not(:first-child) { - margin-left: -1px; + margin-left: calc(-1 * var(--bs-border-width)); } .btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn.dropdown-toggle-split:first-child, .btn-group > .btn-group:not(:last-child) > .btn { border-top-right-radius: 0; border-bottom-right-radius: 0; @@ -3983,20 +3888,27 @@ textarea.form-control-lg { } .btn-group-vertical > .btn:not(:first-child), .btn-group-vertical > .btn-group:not(:first-child) { - margin-top: -1px; + margin-top: calc(-1 * var(--bs-border-width)); } .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), .btn-group-vertical > .btn-group:not(:last-child) > .btn { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } -.btn-group-vertical > .btn ~ .btn, +.btn-group-vertical > .btn:nth-child(n+3), +.btn-group-vertical > :not(.btn-check) + .btn, .btn-group-vertical > .btn-group:not(:first-child) > .btn { border-top-left-radius: 0; border-top-right-radius: 0; } .nav { + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-link-color); + --bs-nav-link-hover-color: var(--bs-link-hover-color); + --bs-nav-link-disabled-color: var(--bs-secondary-color); display: flex; flex-wrap: wrap; padding-left: 0; @@ -4006,9 +3918,13 @@ textarea.form-control-lg { .nav-link { display: block; - padding: 0.5rem 1rem; - color: #158cba; + padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); + font-size: var(--bs-nav-link-font-size); + font-weight: var(--bs-nav-link-font-weight); + color: var(--bs-nav-link-color); text-decoration: none; + background: none; + border: 0; transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; } @media (prefers-reduced-motion: reduce) { @@ -4017,54 +3933,83 @@ textarea.form-control-lg { } } .nav-link:hover, .nav-link:focus { - color: #117095; + color: var(--bs-nav-link-hover-color); } -.nav-link.disabled { - color: #999; +.nav-link:focus-visible { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(21, 140, 186, 0.25); +} +.nav-link.disabled, .nav-link:disabled { + color: var(--bs-nav-link-disabled-color); pointer-events: none; cursor: default; } .nav-tabs { - border-bottom: 1px solid #f0f0f0; + --bs-nav-tabs-border-width: var(--bs-border-width); + --bs-nav-tabs-border-color: var(--bs-border-color); + --bs-nav-tabs-border-radius: var(--bs-border-radius); + --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color); + --bs-nav-tabs-link-active-color: var(--bs-emphasis-color); + --bs-nav-tabs-link-active-bg: var(--bs-body-bg); + --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg); + border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color); } .nav-tabs .nav-link { - margin-bottom: -1px; - background: none; - border: 1px solid transparent; - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; + margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); + border: var(--bs-nav-tabs-border-width) solid transparent; + border-top-left-radius: var(--bs-nav-tabs-border-radius); + border-top-right-radius: var(--bs-nav-tabs-border-radius); } .nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { - border-color: #f0f0f0; isolation: isolate; -} -.nav-tabs .nav-link.disabled { - color: #999; - background-color: transparent; - border-color: transparent; + border-color: var(--bs-nav-tabs-link-hover-border-color); } .nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link { - color: #222; - background-color: #fff; - border-color: #f0f0f0; + color: var(--bs-nav-tabs-link-active-color); + background-color: var(--bs-nav-tabs-link-active-bg); + border-color: var(--bs-nav-tabs-link-active-border-color); } .nav-tabs .dropdown-menu { - margin-top: -1px; + margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); border-top-left-radius: 0; border-top-right-radius: 0; } +.nav-pills { + --bs-nav-pills-border-radius: var(--bs-border-radius); + --bs-nav-pills-link-active-color: #fff; + --bs-nav-pills-link-active-bg: #158cba; +} .nav-pills .nav-link { - background: none; - border: 0; - border-radius: 0.25rem; + border-radius: var(--bs-nav-pills-border-radius); } .nav-pills .nav-link.active, .nav-pills .show > .nav-link { - color: #fff; - background-color: #158cba; + color: var(--bs-nav-pills-link-active-color); + background-color: var(--bs-nav-pills-link-active-bg); +} + +.nav-underline { + --bs-nav-underline-gap: 1rem; + --bs-nav-underline-border-width: 0.125rem; + --bs-nav-underline-link-active-color: var(--bs-emphasis-color); + gap: var(--bs-nav-underline-gap); +} +.nav-underline .nav-link { + padding-right: 0; + padding-left: 0; + border-bottom: var(--bs-nav-underline-border-width) solid transparent; +} +.nav-underline .nav-link:hover, .nav-underline .nav-link:focus { + border-bottom-color: currentcolor; +} +.nav-underline .nav-link.active, +.nav-underline .show > .nav-link { + font-weight: 700; + color: var(--bs-nav-underline-link-active-color); + border-bottom-color: currentcolor; } .nav-fill > .nav-link, @@ -4075,8 +4020,8 @@ textarea.form-control-lg { .nav-justified > .nav-link, .nav-justified .nav-item { - flex-basis: 0; flex-grow: 1; + flex-basis: 0; text-align: center; } @@ -4093,13 +4038,32 @@ textarea.form-control-lg { } .navbar { + --bs-navbar-padding-x: 0; + --bs-navbar-padding-y: 0.5rem; + --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65); + --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8); + --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3); + --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-padding-y: 0.3125rem; + --bs-navbar-brand-margin-end: 1rem; + --bs-navbar-brand-font-size: 1.25rem; + --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-nav-link-padding-x: 0.5rem; + --bs-navbar-toggler-padding-y: 0.25rem; + --bs-navbar-toggler-padding-x: 0.75rem; + --bs-navbar-toggler-font-size: 1.25rem; + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2834, 34, 34, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15); + --bs-navbar-toggler-border-radius: var(--bs-border-radius); + --bs-navbar-toggler-focus-width: 0.25rem; + --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; position: relative; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; - padding-top: 0.5rem; - padding-bottom: 0.5rem; + padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); } .navbar > .container, .navbar > .container-fluid, @@ -4114,23 +4078,33 @@ textarea.form-control-lg { justify-content: space-between; } .navbar-brand { - padding-top: 0.3125rem; - padding-bottom: 0.3125rem; - margin-right: 1rem; - font-size: 1.25rem; + padding-top: var(--bs-navbar-brand-padding-y); + padding-bottom: var(--bs-navbar-brand-padding-y); + margin-right: var(--bs-navbar-brand-margin-end); + font-size: var(--bs-navbar-brand-font-size); + color: var(--bs-navbar-brand-color); text-decoration: none; white-space: nowrap; } +.navbar-brand:hover, .navbar-brand:focus { + color: var(--bs-navbar-brand-hover-color); +} + .navbar-nav { + --bs-nav-link-padding-x: 0; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-navbar-color); + --bs-nav-link-hover-color: var(--bs-navbar-hover-color); + --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); display: flex; flex-direction: column; padding-left: 0; margin-bottom: 0; list-style: none; } -.navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; +.navbar-nav .nav-link.active, .navbar-nav .nav-link.show { + color: var(--bs-navbar-active-color); } .navbar-nav .dropdown-menu { position: static; @@ -4139,22 +4113,29 @@ textarea.form-control-lg { .navbar-text { padding-top: 0.5rem; padding-bottom: 0.5rem; + color: var(--bs-navbar-color); +} +.navbar-text a, +.navbar-text a:hover, +.navbar-text a:focus { + color: var(--bs-navbar-active-color); } .navbar-collapse { - flex-basis: 100%; flex-grow: 1; + flex-basis: 100%; align-items: center; } .navbar-toggler { - padding: 0.25rem 0.75rem; - font-size: 1.25rem; + padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); + font-size: var(--bs-navbar-toggler-font-size); line-height: 1; + color: var(--bs-navbar-color); background-color: transparent; - border: 1px solid transparent; - border-radius: 0.25rem; - transition: box-shadow 0.15s ease-in-out; + border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); + border-radius: var(--bs-navbar-toggler-border-radius); + transition: var(--bs-navbar-toggler-transition); } @media (prefers-reduced-motion: reduce) { .navbar-toggler { @@ -4167,7 +4148,7 @@ textarea.form-control-lg { .navbar-toggler:focus { text-decoration: none; outline: 0; - box-shadow: 0 0 0 0.25rem; + box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); } .navbar-toggler-icon { @@ -4175,6 +4156,7 @@ textarea.form-control-lg { width: 1.5em; height: 1.5em; vertical-align: middle; + background-image: var(--bs-navbar-toggler-icon-bg); background-repeat: no-repeat; background-position: center; background-size: 100%; @@ -4197,8 +4179,8 @@ textarea.form-control-lg { position: absolute; } .navbar-expand-sm .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); } .navbar-expand-sm .navbar-nav-scroll { overflow: visible; @@ -4210,28 +4192,22 @@ textarea.form-control-lg { .navbar-expand-sm .navbar-toggler { display: none; } - .navbar-expand-sm .offcanvas-header { + .navbar-expand-sm .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-sm .offcanvas .offcanvas-header { display: none; } - .navbar-expand-sm .offcanvas { - position: inherit; - bottom: 0; - z-index: 1000; - flex-grow: 1; - visibility: visible !important; - background-color: transparent; - border-right: 0; - border-left: 0; - transition: none; - transform: none; - } - .navbar-expand-sm .offcanvas-top, -.navbar-expand-sm .offcanvas-bottom { - height: auto; - border-top: 0; - border-bottom: 0; - } - .navbar-expand-sm .offcanvas-body { + .navbar-expand-sm .offcanvas .offcanvas-body { display: flex; flex-grow: 0; padding: 0; @@ -4250,8 +4226,8 @@ textarea.form-control-lg { position: absolute; } .navbar-expand-md .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); } .navbar-expand-md .navbar-nav-scroll { overflow: visible; @@ -4263,28 +4239,22 @@ textarea.form-control-lg { .navbar-expand-md .navbar-toggler { display: none; } - .navbar-expand-md .offcanvas-header { + .navbar-expand-md .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-md .offcanvas .offcanvas-header { display: none; } - .navbar-expand-md .offcanvas { - position: inherit; - bottom: 0; - z-index: 1000; - flex-grow: 1; - visibility: visible !important; - background-color: transparent; - border-right: 0; - border-left: 0; - transition: none; - transform: none; - } - .navbar-expand-md .offcanvas-top, -.navbar-expand-md .offcanvas-bottom { - height: auto; - border-top: 0; - border-bottom: 0; - } - .navbar-expand-md .offcanvas-body { + .navbar-expand-md .offcanvas .offcanvas-body { display: flex; flex-grow: 0; padding: 0; @@ -4303,8 +4273,8 @@ textarea.form-control-lg { position: absolute; } .navbar-expand-lg .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); } .navbar-expand-lg .navbar-nav-scroll { overflow: visible; @@ -4316,28 +4286,22 @@ textarea.form-control-lg { .navbar-expand-lg .navbar-toggler { display: none; } - .navbar-expand-lg .offcanvas-header { + .navbar-expand-lg .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-lg .offcanvas .offcanvas-header { display: none; } - .navbar-expand-lg .offcanvas { - position: inherit; - bottom: 0; - z-index: 1000; - flex-grow: 1; - visibility: visible !important; - background-color: transparent; - border-right: 0; - border-left: 0; - transition: none; - transform: none; - } - .navbar-expand-lg .offcanvas-top, -.navbar-expand-lg .offcanvas-bottom { - height: auto; - border-top: 0; - border-bottom: 0; - } - .navbar-expand-lg .offcanvas-body { + .navbar-expand-lg .offcanvas .offcanvas-body { display: flex; flex-grow: 0; padding: 0; @@ -4356,8 +4320,8 @@ textarea.form-control-lg { position: absolute; } .navbar-expand-xl .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); } .navbar-expand-xl .navbar-nav-scroll { overflow: visible; @@ -4369,28 +4333,22 @@ textarea.form-control-lg { .navbar-expand-xl .navbar-toggler { display: none; } - .navbar-expand-xl .offcanvas-header { + .navbar-expand-xl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xl .offcanvas .offcanvas-header { display: none; } - .navbar-expand-xl .offcanvas { - position: inherit; - bottom: 0; - z-index: 1000; - flex-grow: 1; - visibility: visible !important; - background-color: transparent; - border-right: 0; - border-left: 0; - transition: none; - transform: none; - } - .navbar-expand-xl .offcanvas-top, -.navbar-expand-xl .offcanvas-bottom { - height: auto; - border-top: 0; - border-bottom: 0; - } - .navbar-expand-xl .offcanvas-body { + .navbar-expand-xl .offcanvas .offcanvas-body { display: flex; flex-grow: 0; padding: 0; @@ -4409,8 +4367,8 @@ textarea.form-control-lg { position: absolute; } .navbar-expand-xxl .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); } .navbar-expand-xxl .navbar-nav-scroll { overflow: visible; @@ -4422,28 +4380,22 @@ textarea.form-control-lg { .navbar-expand-xxl .navbar-toggler { display: none; } - .navbar-expand-xxl .offcanvas-header { + .navbar-expand-xxl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-header { display: none; } - .navbar-expand-xxl .offcanvas { - position: inherit; - bottom: 0; - z-index: 1000; - flex-grow: 1; - visibility: visible !important; - background-color: transparent; - border-right: 0; - border-left: 0; - transition: none; - transform: none; - } - .navbar-expand-xxl .offcanvas-top, -.navbar-expand-xxl .offcanvas-bottom { - height: auto; - border-top: 0; - border-bottom: 0; - } - .navbar-expand-xxl .offcanvas-body { + .navbar-expand-xxl .offcanvas .offcanvas-body { display: flex; flex-grow: 0; padding: 0; @@ -4461,8 +4413,8 @@ textarea.form-control-lg { position: absolute; } .navbar-expand .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); } .navbar-expand .navbar-nav-scroll { overflow: visible; @@ -4474,114 +4426,75 @@ textarea.form-control-lg { .navbar-expand .navbar-toggler { display: none; } -.navbar-expand .offcanvas-header { +.navbar-expand .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; +} +.navbar-expand .offcanvas .offcanvas-header { display: none; } -.navbar-expand .offcanvas { - position: inherit; - bottom: 0; - z-index: 1000; - flex-grow: 1; - visibility: visible !important; - background-color: transparent; - border-right: 0; - border-left: 0; - transition: none; - transform: none; -} -.navbar-expand .offcanvas-top, -.navbar-expand .offcanvas-bottom { - height: auto; - border-top: 0; - border-bottom: 0; -} -.navbar-expand .offcanvas-body { +.navbar-expand .offcanvas .offcanvas-body { display: flex; flex-grow: 0; padding: 0; overflow-y: visible; } -.navbar-light .navbar-brand { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-nav .nav-link { - color: rgba(0, 0, 0, 0.55); -} -.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { - color: rgba(0, 0, 0, 0.7); -} -.navbar-light .navbar-nav .nav-link.disabled { - color: rgba(0, 0, 0, 0.3); -} -.navbar-light .navbar-nav .show > .nav-link, -.navbar-light .navbar-nav .nav-link.active { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-toggler { - color: rgba(0, 0, 0, 0.55); - border-color: rgba(0, 0, 0, 0.1); -} -.navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} -.navbar-light .navbar-text { - color: rgba(0, 0, 0, 0.55); -} -.navbar-light .navbar-text a, -.navbar-light .navbar-text a:hover, -.navbar-light .navbar-text a:focus { - color: rgba(0, 0, 0, 0.9); +.navbar-dark, +.navbar[data-bs-theme=dark] { + --bs-navbar-color: rgba(255, 255, 255, 0.55); + --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); + --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); + --bs-navbar-active-color: #fff; + --bs-navbar-brand-color: #fff; + --bs-navbar-brand-hover-color: #fff; + --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } -.navbar-dark .navbar-brand { - color: #fff; -} -.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { - color: #fff; -} -.navbar-dark .navbar-nav .nav-link { - color: rgba(255, 255, 255, 0.55); -} -.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { - color: rgba(255, 255, 255, 0.75); -} -.navbar-dark .navbar-nav .nav-link.disabled { - color: rgba(255, 255, 255, 0.25); -} -.navbar-dark .navbar-nav .show > .nav-link, -.navbar-dark .navbar-nav .nav-link.active { - color: #fff; -} -.navbar-dark .navbar-toggler { - color: rgba(255, 255, 255, 0.55); - border-color: rgba(255, 255, 255, 0.1); -} -.navbar-dark .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} -.navbar-dark .navbar-text { - color: rgba(255, 255, 255, 0.55); -} -.navbar-dark .navbar-text a, -.navbar-dark .navbar-text a:hover, -.navbar-dark .navbar-text a:focus { - color: #fff; +[data-bs-theme=dark] .navbar-toggler-icon { + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } .card { + --bs-card-spacer-y: 1rem; + --bs-card-spacer-x: 1rem; + --bs-card-title-spacer-y: 0.5rem; + --bs-card-title-color: ; + --bs-card-subtitle-color: ; + --bs-card-border-width: var(--bs-border-width); + --bs-card-border-color: var(--bs-border-color-translucent); + --bs-card-border-radius: var(--bs-border-radius); + --bs-card-box-shadow: ; + --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); + --bs-card-cap-padding-y: 0.5rem; + --bs-card-cap-padding-x: 1rem; + --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03); + --bs-card-cap-color: ; + --bs-card-height: ; + --bs-card-color: ; + --bs-card-bg: var(--bs-body-bg); + --bs-card-img-overlay-padding: 1rem; + --bs-card-group-margin: 0.75rem; position: relative; display: flex; flex-direction: column; min-width: 0; + height: var(--bs-card-height); + color: var(--bs-body-color); word-wrap: break-word; - background-color: #fff; + background-color: var(--bs-card-bg); background-clip: border-box; - border: 1px solid rgba(0, 0, 0, 0.125); - border-radius: 0.25rem; + border: var(--bs-card-border-width) solid var(--bs-card-border-color); + border-radius: var(--bs-card-border-radius); } .card > hr { margin-right: 0; @@ -4593,13 +4506,13 @@ textarea.form-control-lg { } .card > .list-group:first-child { border-top-width: 0; - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px); + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); } .card > .list-group:last-child { border-bottom-width: 0; - border-bottom-right-radius: calc(0.25rem - 1px); - border-bottom-left-radius: calc(0.25rem - 1px); + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); } .card > .card-header + .list-group, .card > .list-group + .card-footer { @@ -4608,16 +4521,19 @@ textarea.form-control-lg { .card-body { flex: 1 1 auto; - padding: 1rem 1rem; + padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); + color: var(--bs-card-color); } .card-title { - margin-bottom: 0.5rem; + margin-bottom: var(--bs-card-title-spacer-y); + color: var(--bs-card-title-color); } .card-subtitle { - margin-top: -0.25rem; + margin-top: calc(-0.5 * var(--bs-card-title-spacer-y)); margin-bottom: 0; + color: var(--bs-card-subtitle-color); } .card-text:last-child { @@ -4625,38 +4541,44 @@ textarea.form-control-lg { } .card-link + .card-link { - margin-left: 1rem; + margin-left: var(--bs-card-spacer-x); } .card-header { - padding: 0.5rem 1rem; + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); margin-bottom: 0; - background-color: rgba(0, 0, 0, 0.03); - border-bottom: 1px solid rgba(0, 0, 0, 0.125); + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); } .card-header:first-child { - border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; + border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0; } .card-footer { - padding: 0.5rem 1rem; - background-color: rgba(0, 0, 0, 0.03); - border-top: 1px solid rgba(0, 0, 0, 0.125); + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); } .card-footer:last-child { - border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); + border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius); } .card-header-tabs { - margin-right: -0.5rem; - margin-bottom: -0.5rem; - margin-left: -0.5rem; + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); border-bottom: 0; } +.card-header-tabs .nav-link.active { + background-color: var(--bs-card-bg); + border-bottom-color: var(--bs-card-bg); +} .card-header-pills { - margin-right: -0.5rem; - margin-left: -0.5rem; + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); } .card-img-overlay { @@ -4665,8 +4587,8 @@ textarea.form-control-lg { right: 0; bottom: 0; left: 0; - padding: 1rem; - border-radius: calc(0.25rem - 1px); + padding: var(--bs-card-img-overlay-padding); + border-radius: var(--bs-card-inner-border-radius); } .card-img, @@ -4677,18 +4599,18 @@ textarea.form-control-lg { .card-img, .card-img-top { - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px); + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); } .card-img, .card-img-bottom { - border-bottom-right-radius: calc(0.25rem - 1px); - border-bottom-left-radius: calc(0.25rem - 1px); + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); } .card-group > .card { - margin-bottom: 0.75rem; + margin-bottom: var(--bs-card-group-margin); } @media (min-width: 576px) { .card-group { @@ -4696,7 +4618,7 @@ textarea.form-control-lg { flex-flow: row wrap; } .card-group > .card { - flex: 1 0 0%; + flex: 1 0 0; margin-bottom: 0; } .card-group > .card + .card { @@ -4707,42 +4629,66 @@ textarea.form-control-lg { border-top-right-radius: 0; border-bottom-right-radius: 0; } - .card-group > .card:not(:last-child) .card-img-top, -.card-group > .card:not(:last-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:not(:last-child) .card-img-bottom, -.card-group > .card:not(:last-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:not(:first-child) { border-top-left-radius: 0; border-bottom-left-radius: 0; } - .card-group > .card:not(:first-child) .card-img-top, -.card-group > .card:not(:first-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:not(:first-child) .card-img-bottom, -.card-group > .card:not(:first-child) .card-footer { + .card-group > .card:not(:first-child) > .card-img-bottom, + .card-group > .card:not(:first-child) > .card-footer { border-bottom-left-radius: 0; } } +.accordion { + --bs-accordion-color: var(--bs-body-color); + --bs-accordion-bg: var(--bs-body-bg); + --bs-accordion-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, border-radius 0.15s ease; + --bs-accordion-border-color: var(--bs-border-color); + --bs-accordion-border-width: var(--bs-border-width); + --bs-accordion-border-radius: var(--bs-border-radius); + --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); + --bs-accordion-btn-padding-x: 1.25rem; + --bs-accordion-btn-padding-y: 1rem; + --bs-accordion-btn-color: var(--bs-body-color); + --bs-accordion-btn-bg: var(--bs-accordion-bg); + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23222' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + --bs-accordion-btn-icon-width: 1.25rem; + --bs-accordion-btn-icon-transform: rotate(-180deg); + --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%2308384a' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(21, 140, 186, 0.25); + --bs-accordion-body-padding-x: 1.25rem; + --bs-accordion-body-padding-y: 1rem; + --bs-accordion-active-color: var(--bs-primary-text-emphasis); + --bs-accordion-active-bg: var(--bs-primary-bg-subtle); +} + .accordion-button { position: relative; display: flex; align-items: center; width: 100%; - padding: 1rem 1.25rem; + padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); font-size: 1rem; - color: #222; + color: var(--bs-accordion-btn-color); text-align: left; - background-color: #fff; + background-color: var(--bs-accordion-btn-bg); border: 0; border-radius: 0; overflow-anchor: none; - 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, border-radius 0.15s ease; + transition: var(--bs-accordion-transition); } @media (prefers-reduced-motion: reduce) { .accordion-button { @@ -4750,24 +4696,24 @@ textarea.form-control-lg { } } .accordion-button:not(.collapsed) { - color: #137ea7; - background-color: #e8f4f8; - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125); + color: var(--bs-accordion-active-color); + background-color: var(--bs-accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color); } .accordion-button:not(.collapsed)::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23137ea7'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); - transform: rotate(-180deg); + background-image: var(--bs-accordion-btn-active-icon); + transform: var(--bs-accordion-btn-icon-transform); } .accordion-button::after { flex-shrink: 0; - width: 1.25rem; - height: 1.25rem; + width: var(--bs-accordion-btn-icon-width); + height: var(--bs-accordion-btn-icon-width); margin-left: auto; content: ""; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23222'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + background-image: var(--bs-accordion-btn-icon); background-repeat: no-repeat; - background-size: 1.25rem; - transition: transform 0.2s ease-in-out; + background-size: var(--bs-accordion-btn-icon-width); + transition: var(--bs-accordion-btn-icon-transition); } @media (prefers-reduced-motion: reduce) { .accordion-button::after { @@ -4779,9 +4725,8 @@ textarea.form-control-lg { } .accordion-button:focus { z-index: 3; - border-color: #8ac6dd; outline: 0; - box-shadow: 0 0 0 0.25rem rgba(21, 140, 186, 0.25); + box-shadow: var(--bs-accordion-btn-focus-box-shadow); } .accordion-header { @@ -4789,79 +4734,113 @@ textarea.form-control-lg { } .accordion-item { - background-color: #fff; - border: 1px solid rgba(0, 0, 0, 0.125); + color: var(--bs-accordion-color); + background-color: var(--bs-accordion-bg); + border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color); } .accordion-item:first-of-type { - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; + border-top-left-radius: var(--bs-accordion-border-radius); + border-top-right-radius: var(--bs-accordion-border-radius); } -.accordion-item:first-of-type .accordion-button { - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px); +.accordion-item:first-of-type > .accordion-header .accordion-button { + border-top-left-radius: var(--bs-accordion-inner-border-radius); + border-top-right-radius: var(--bs-accordion-inner-border-radius); } .accordion-item:not(:first-of-type) { border-top: 0; } .accordion-item:last-of-type { - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); } -.accordion-item:last-of-type .accordion-button.collapsed { - border-bottom-right-radius: calc(0.25rem - 1px); - border-bottom-left-radius: calc(0.25rem - 1px); +.accordion-item:last-of-type > .accordion-header .accordion-button.collapsed { + border-bottom-right-radius: var(--bs-accordion-inner-border-radius); + border-bottom-left-radius: var(--bs-accordion-inner-border-radius); } -.accordion-item:last-of-type .accordion-collapse { - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; +.accordion-item:last-of-type > .accordion-collapse { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); } .accordion-body { - padding: 1rem 1.25rem; + padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x); } -.accordion-flush .accordion-collapse { - border-width: 0; -} -.accordion-flush .accordion-item { +.accordion-flush > .accordion-item { border-right: 0; border-left: 0; border-radius: 0; } -.accordion-flush .accordion-item:first-child { +.accordion-flush > .accordion-item:first-child { border-top: 0; } -.accordion-flush .accordion-item:last-child { +.accordion-flush > .accordion-item:last-child { border-bottom: 0; } -.accordion-flush .accordion-item .accordion-button { +.accordion-flush > .accordion-item > .accordion-collapse, +.accordion-flush > .accordion-item > .accordion-header .accordion-button, +.accordion-flush > .accordion-item > .accordion-header .accordion-button.collapsed { border-radius: 0; } +[data-bs-theme=dark] .accordion-button::after { + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2373bad6'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e"); + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2373bad6'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e"); +} + .breadcrumb { + --bs-breadcrumb-padding-x: 0.75rem; + --bs-breadcrumb-padding-y: 0.375rem; + --bs-breadcrumb-margin-bottom: 1rem; + --bs-breadcrumb-bg: var(--bs-tertiary-bg); + --bs-breadcrumb-border-radius: 0.25rem; + --bs-breadcrumb-divider-color: var(--bs-secondary-color); + --bs-breadcrumb-item-padding-x: 0.5rem; + --bs-breadcrumb-item-active-color: var(--bs-secondary-color); display: flex; flex-wrap: wrap; - padding: 0.375rem 0.75rem; - margin-bottom: 1rem; + padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); + margin-bottom: var(--bs-breadcrumb-margin-bottom); + font-size: var(--bs-breadcrumb-font-size); list-style: none; - background-color: #f0f0f0; - border-radius: 0.25rem; + background-color: var(--bs-breadcrumb-bg); + border-radius: var(--bs-breadcrumb-border-radius); } .breadcrumb-item + .breadcrumb-item { - padding-left: 0.5rem; + padding-left: var(--bs-breadcrumb-item-padding-x); } .breadcrumb-item + .breadcrumb-item::before { float: left; - padding-right: 0.5rem; - color: #999; + padding-right: var(--bs-breadcrumb-item-padding-x); + color: var(--bs-breadcrumb-divider-color); content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; } .breadcrumb-item.active { - color: #999; + color: var(--bs-breadcrumb-item-active-color); } .pagination { + --bs-pagination-padding-x: 0.75rem; + --bs-pagination-padding-y: 0.375rem; + --bs-pagination-font-size: 1rem; + --bs-pagination-color: #555; + --bs-pagination-bg: var(--bs-tertiary-bg); + --bs-pagination-border-width: var(--bs-border-width); + --bs-pagination-border-color: var(--bs-border-color); + --bs-pagination-border-radius: var(--bs-border-radius); + --bs-pagination-hover-color: #555; + --bs-pagination-hover-bg: var(--bs-tertiary-bg); + --bs-pagination-hover-border-color: var(--bs-border-color); + --bs-pagination-focus-color: var(--bs-link-hover-color); + --bs-pagination-focus-bg: var(--bs-secondary-bg); + --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(21, 140, 186, 0.25); + --bs-pagination-active-color: #fff; + --bs-pagination-active-bg: #158cba; + --bs-pagination-active-border-color: #127ba3; + --bs-pagination-disabled-color: #999; + --bs-pagination-disabled-bg: var(--bs-tertiary-bg); + --bs-pagination-disabled-border-color: var(--bs-border-color); display: flex; padding-left: 0; list-style: none; @@ -4870,10 +4849,12 @@ textarea.form-control-lg { .page-link { position: relative; display: block; - color: #555; + padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); + font-size: var(--bs-pagination-font-size); + color: var(--bs-pagination-color); text-decoration: none; - background-color: #f0f0f0; - border: 1px solid #dee2e6; + background-color: var(--bs-pagination-bg); + border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); 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) { @@ -4883,84 +4864,73 @@ textarea.form-control-lg { } .page-link:hover { z-index: 2; - color: #555; - background-color: #f0f0f0; - border-color: #dee2e6; + color: var(--bs-pagination-hover-color); + background-color: var(--bs-pagination-hover-bg); + border-color: var(--bs-pagination-hover-border-color); } .page-link:focus { z-index: 3; - color: #117095; - background-color: #f0f0f0; + color: var(--bs-pagination-focus-color); + background-color: var(--bs-pagination-focus-bg); outline: 0; - box-shadow: 0 0 0 0.25rem rgba(21, 140, 186, 0.25); + box-shadow: var(--bs-pagination-focus-box-shadow); +} +.page-link.active, .active > .page-link { + z-index: 3; + color: var(--bs-pagination-active-color); + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color); +} +.page-link.disabled, .disabled > .page-link { + color: var(--bs-pagination-disabled-color); + pointer-events: none; + background-color: var(--bs-pagination-disabled-bg); + border-color: var(--bs-pagination-disabled-border-color); } .page-item:not(:first-child) .page-link { - margin-left: -1px; + margin-left: calc(-1 * var(--bs-border-width)); } -.page-item.active .page-link { - z-index: 3; - color: #fff; - background-color: #158cba; - border-color: #127ba3; -} -.page-item.disabled .page-link { - color: #999; - pointer-events: none; - background-color: #f0f0f0; - border-color: #dee2e6; -} - -.page-link { - padding: 0.375rem 0.75rem; -} - .page-item:first-child .page-link { - border-top-left-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; + border-top-left-radius: var(--bs-pagination-border-radius); + border-bottom-left-radius: var(--bs-pagination-border-radius); } .page-item:last-child .page-link { - border-top-right-radius: 0.25rem; - border-bottom-right-radius: 0.25rem; + border-top-right-radius: var(--bs-pagination-border-radius); + border-bottom-right-radius: var(--bs-pagination-border-radius); } -.pagination-lg .page-link { - padding: 0.75rem 1.5rem; - font-size: 1.25rem; -} -.pagination-lg .page-item:first-child .page-link { - border-top-left-radius: 0.3rem; - border-bottom-left-radius: 0.3rem; -} -.pagination-lg .page-item:last-child .page-link { - border-top-right-radius: 0.3rem; - border-bottom-right-radius: 0.3rem; +.pagination-lg { + --bs-pagination-padding-x: 1.5rem; + --bs-pagination-padding-y: 0.75rem; + --bs-pagination-font-size: 1.25rem; + --bs-pagination-border-radius: var(--bs-border-radius-lg); } -.pagination-sm .page-link { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; -} -.pagination-sm .page-item:first-child .page-link { - border-top-left-radius: 0.2rem; - border-bottom-left-radius: 0.2rem; -} -.pagination-sm .page-item:last-child .page-link { - border-top-right-radius: 0.2rem; - border-bottom-right-radius: 0.2rem; +.pagination-sm { + --bs-pagination-padding-x: 0.5rem; + --bs-pagination-padding-y: 0.25rem; + --bs-pagination-font-size: 0.875rem; + --bs-pagination-border-radius: var(--bs-border-radius-sm); } .badge { + --bs-badge-padding-x: 0.65em; + --bs-badge-padding-y: 0.35em; + --bs-badge-font-size: 0.75em; + --bs-badge-font-weight: 700; + --bs-badge-color: #fff; + --bs-badge-border-radius: var(--bs-border-radius); display: inline-block; - padding: 0.35em 0.65em; - font-size: 0.75em; - font-weight: 700; + padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); + font-size: var(--bs-badge-font-size); + font-weight: var(--bs-badge-font-weight); line-height: 1; - color: #fff; + color: var(--bs-badge-color); text-align: center; white-space: nowrap; vertical-align: baseline; - border-radius: 0.25rem; + border-radius: var(--bs-badge-border-radius); } .badge:empty { display: none; @@ -4972,11 +4942,22 @@ textarea.form-control-lg { } .alert { + --bs-alert-bg: transparent; + --bs-alert-padding-x: 1rem; + --bs-alert-padding-y: 1rem; + --bs-alert-margin-bottom: 1rem; + --bs-alert-color: inherit; + --bs-alert-border-color: transparent; + --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color); + --bs-alert-border-radius: var(--bs-border-radius); + --bs-alert-link-color: inherit; position: relative; - padding: 1rem 1rem; - margin-bottom: 1rem; - border: 1px solid transparent; - border-radius: 0.25rem; + padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); + margin-bottom: var(--bs-alert-margin-bottom); + color: var(--bs-alert-color); + background-color: var(--bs-alert-bg); + border: var(--bs-alert-border); + border-radius: var(--bs-alert-border-radius); } .alert-heading { @@ -4985,6 +4966,7 @@ textarea.form-control-lg { .alert-link { font-weight: 700; + color: var(--bs-alert-link-color); } .alert-dismissible { @@ -4999,95 +4981,82 @@ textarea.form-control-lg { } .alert-primary { - color: #0d5470; - background-color: #d0e8f1; - border-color: #b9ddea; -} -.alert-primary .alert-link { - color: #0a435a; + --bs-alert-color: var(--bs-primary-text-emphasis); + --bs-alert-bg: var(--bs-primary-bg-subtle); + --bs-alert-border-color: var(--bs-primary-border-subtle); + --bs-alert-link-color: var(--bs-primary-text-emphasis); } .alert-secondary { - color: #909090; - background-color: #fcfcfc; - border-color: #fbfbfb; -} -.alert-secondary .alert-link { - color: #737373; + --bs-alert-color: var(--bs-secondary-text-emphasis); + --bs-alert-bg: var(--bs-secondary-bg-subtle); + --bs-alert-border-color: var(--bs-secondary-border-subtle); + --bs-alert-link-color: var(--bs-secondary-text-emphasis); } .alert-success { - color: #186d1a; - background-color: #d4f0d5; - border-color: #bfe9c0; -} -.alert-success .alert-link { - color: #135715; + --bs-alert-color: var(--bs-success-text-emphasis); + --bs-alert-bg: var(--bs-success-bg-subtle); + --bs-alert-border-color: var(--bs-success-border-subtle); + --bs-alert-link-color: var(--bs-success-text-emphasis); } .alert-info { - color: #46798d; - background-color: #e3f4fb; - border-color: #d6eff9; -} -.alert-info .alert-link { - color: #386171; + --bs-alert-color: var(--bs-info-text-emphasis); + --bs-alert-bg: var(--bs-info-bg-subtle); + --bs-alert-border-color: var(--bs-info-border-subtle); + --bs-alert-link-color: var(--bs-info-text-emphasis); } .alert-warning { - color: #995010; - background-color: #ffe7d1; - border-color: #ffdabb; -} -.alert-warning .alert-link { - color: #7a400d; + --bs-alert-color: var(--bs-warning-text-emphasis); + --bs-alert-bg: var(--bs-warning-bg-subtle); + --bs-alert-border-color: var(--bs-warning-border-subtle); + --bs-alert-link-color: var(--bs-warning-text-emphasis); } .alert-danger { - color: #992720; - background-color: #ffd9d7; - border-color: #ffc6c3; -} -.alert-danger .alert-link { - color: #7a1f1a; + --bs-alert-color: var(--bs-danger-text-emphasis); + --bs-alert-bg: var(--bs-danger-bg-subtle); + --bs-alert-border-color: var(--bs-danger-border-subtle); + --bs-alert-link-color: var(--bs-danger-text-emphasis); } .alert-light { - color: #949494; - background-color: #fdfdfd; - border-color: #fcfcfc; -} -.alert-light .alert-link { - color: #767676; + --bs-alert-color: var(--bs-light-text-emphasis); + --bs-alert-bg: var(--bs-light-bg-subtle); + --bs-alert-border-color: var(--bs-light-border-subtle); + --bs-alert-link-color: var(--bs-light-text-emphasis); } .alert-dark { - color: #333333; - background-color: #dddddd; - border-color: #cccccc; -} -.alert-dark .alert-link { - color: #292929; -} - -@-webkit-keyframes progress-bar-stripes { - 0% { - background-position-x: 1rem; - } + --bs-alert-color: var(--bs-dark-text-emphasis); + --bs-alert-bg: var(--bs-dark-bg-subtle); + --bs-alert-border-color: var(--bs-dark-border-subtle); + --bs-alert-link-color: var(--bs-dark-text-emphasis); } @keyframes progress-bar-stripes { 0% { - background-position-x: 1rem; + background-position-x: var(--bs-progress-height); } } -.progress { +.progress, +.progress-stacked { + --bs-progress-height: 1rem; + --bs-progress-font-size: 0.75rem; + --bs-progress-bg: var(--bs-secondary-bg); + --bs-progress-border-radius: var(--bs-border-radius); + --bs-progress-box-shadow: var(--bs-box-shadow-inset); + --bs-progress-bar-color: #fff; + --bs-progress-bar-bg: #158cba; + --bs-progress-bar-transition: width 0.6s ease; display: flex; - height: 1rem; + height: var(--bs-progress-height); overflow: hidden; - font-size: 0.75rem; - background-color: #f0f0f0; - border-radius: 0.25rem; + font-size: var(--bs-progress-font-size); + background-color: var(--bs-progress-bg); + border-radius: var(--bs-progress-border-radius); } .progress-bar { @@ -5095,11 +5064,11 @@ textarea.form-control-lg { flex-direction: column; justify-content: center; overflow: hidden; - color: #fff; + color: var(--bs-progress-bar-color); text-align: center; white-space: nowrap; - background-color: #158cba; - transition: width 0.6s ease; + background-color: var(--bs-progress-bar-bg); + transition: var(--bs-progress-bar-transition); } @media (prefers-reduced-motion: reduce) { .progress-bar { @@ -5109,61 +5078,68 @@ textarea.form-control-lg { .progress-bar-striped { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 1rem 1rem; + background-size: var(--bs-progress-height) var(--bs-progress-height); +} + +.progress-stacked > .progress { + overflow: visible; +} + +.progress-stacked > .progress > .progress-bar { + width: 100%; } .progress-bar-animated { - -webkit-animation: 1s linear infinite progress-bar-stripes; animation: 1s linear infinite progress-bar-stripes; } @media (prefers-reduced-motion: reduce) { .progress-bar-animated { - -webkit-animation: none; animation: none; } } .list-group { + --bs-list-group-color: var(--bs-body-color); + --bs-list-group-bg: var(--bs-body-bg); + --bs-list-group-border-color: var(--bs-border-color); + --bs-list-group-border-width: var(--bs-border-width); + --bs-list-group-border-radius: var(--bs-border-radius); + --bs-list-group-item-padding-x: 1rem; + --bs-list-group-item-padding-y: 0.5rem; + --bs-list-group-action-color: var(--bs-secondary-color); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-tertiary-bg); + --bs-list-group-action-active-color: var(--bs-body-color); + --bs-list-group-action-active-bg: var(--bs-secondary-bg); + --bs-list-group-disabled-color: var(--bs-secondary-color); + --bs-list-group-disabled-bg: var(--bs-body-bg); + --bs-list-group-active-color: #fff; + --bs-list-group-active-bg: #158cba; + --bs-list-group-active-border-color: #158cba; display: flex; flex-direction: column; padding-left: 0; margin-bottom: 0; - border-radius: 0.25rem; + border-radius: var(--bs-list-group-border-radius); } .list-group-numbered { list-style-type: none; counter-reset: section; } -.list-group-numbered > li::before { +.list-group-numbered > .list-group-item::before { content: counters(section, ".") ". "; counter-increment: section; } -.list-group-item-action { - width: 100%; - color: #555; - text-align: inherit; -} -.list-group-item-action:hover, .list-group-item-action:focus { - z-index: 1; - color: #555; - text-decoration: none; - background-color: #f6f6f6; -} -.list-group-item-action:active { - color: #222; - background-color: #f0f0f0; -} - .list-group-item { position: relative; display: block; - padding: 0.5rem 1rem; - color: #222; + padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x); + color: var(--bs-list-group-color); text-decoration: none; - background-color: #fff; - border: 1px solid rgba(0, 0, 0, 0.125); + background-color: var(--bs-list-group-bg); + border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color); } .list-group-item:first-child { border-top-left-radius: inherit; @@ -5174,332 +5150,373 @@ textarea.form-control-lg { border-bottom-left-radius: inherit; } .list-group-item.disabled, .list-group-item:disabled { - color: #999; + color: var(--bs-list-group-disabled-color); pointer-events: none; - background-color: #fff; + background-color: var(--bs-list-group-disabled-bg); } .list-group-item.active { z-index: 2; - color: #fff; - background-color: #158cba; - border-color: #158cba; + color: var(--bs-list-group-active-color); + background-color: var(--bs-list-group-active-bg); + border-color: var(--bs-list-group-active-border-color); } .list-group-item + .list-group-item { border-top-width: 0; } .list-group-item + .list-group-item.active { - margin-top: -1px; - border-top-width: 1px; + margin-top: calc(-1 * var(--bs-list-group-border-width)); + border-top-width: var(--bs-list-group-border-width); +} + +.list-group-item-action { + width: 100%; + color: var(--bs-list-group-action-color); + text-align: inherit; +} +.list-group-item-action:not(.active):hover, .list-group-item-action:not(.active):focus { + z-index: 1; + color: var(--bs-list-group-action-hover-color); + text-decoration: none; + background-color: var(--bs-list-group-action-hover-bg); +} +.list-group-item-action:not(.active):active { + color: var(--bs-list-group-action-active-color); + background-color: var(--bs-list-group-action-active-bg); } .list-group-horizontal { flex-direction: row; } -.list-group-horizontal > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; +.list-group-horizontal > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); border-top-right-radius: 0; } -.list-group-horizontal > .list-group-item:last-child { - border-top-right-radius: 0.25rem; +.list-group-horizontal > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); border-bottom-left-radius: 0; } .list-group-horizontal > .list-group-item.active { margin-top: 0; } .list-group-horizontal > .list-group-item + .list-group-item { - border-top-width: 1px; + border-top-width: var(--bs-list-group-border-width); border-left-width: 0; } .list-group-horizontal > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); } @media (min-width: 576px) { .list-group-horizontal-sm { flex-direction: row; } - .list-group-horizontal-sm > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; + .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); border-top-right-radius: 0; } - .list-group-horizontal-sm > .list-group-item:last-child { - border-top-right-radius: 0.25rem; + .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); border-bottom-left-radius: 0; } .list-group-horizontal-sm > .list-group-item.active { margin-top: 0; } .list-group-horizontal-sm > .list-group-item + .list-group-item { - border-top-width: 1px; + border-top-width: var(--bs-list-group-border-width); border-left-width: 0; } .list-group-horizontal-sm > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); } } @media (min-width: 768px) { .list-group-horizontal-md { flex-direction: row; } - .list-group-horizontal-md > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; + .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); border-top-right-radius: 0; } - .list-group-horizontal-md > .list-group-item:last-child { - border-top-right-radius: 0.25rem; + .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); border-bottom-left-radius: 0; } .list-group-horizontal-md > .list-group-item.active { margin-top: 0; } .list-group-horizontal-md > .list-group-item + .list-group-item { - border-top-width: 1px; + border-top-width: var(--bs-list-group-border-width); border-left-width: 0; } .list-group-horizontal-md > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); } } @media (min-width: 992px) { .list-group-horizontal-lg { flex-direction: row; } - .list-group-horizontal-lg > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; + .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); border-top-right-radius: 0; } - .list-group-horizontal-lg > .list-group-item:last-child { - border-top-right-radius: 0.25rem; + .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); border-bottom-left-radius: 0; } .list-group-horizontal-lg > .list-group-item.active { margin-top: 0; } .list-group-horizontal-lg > .list-group-item + .list-group-item { - border-top-width: 1px; + border-top-width: var(--bs-list-group-border-width); border-left-width: 0; } .list-group-horizontal-lg > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); } } @media (min-width: 1200px) { .list-group-horizontal-xl { flex-direction: row; } - .list-group-horizontal-xl > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; + .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); border-top-right-radius: 0; } - .list-group-horizontal-xl > .list-group-item:last-child { - border-top-right-radius: 0.25rem; + .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); border-bottom-left-radius: 0; } .list-group-horizontal-xl > .list-group-item.active { margin-top: 0; } .list-group-horizontal-xl > .list-group-item + .list-group-item { - border-top-width: 1px; + border-top-width: var(--bs-list-group-border-width); border-left-width: 0; } .list-group-horizontal-xl > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); } } @media (min-width: 1400px) { .list-group-horizontal-xxl { flex-direction: row; } - .list-group-horizontal-xxl > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; + .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); border-top-right-radius: 0; } - .list-group-horizontal-xxl > .list-group-item:last-child { - border-top-right-radius: 0.25rem; + .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); border-bottom-left-radius: 0; } .list-group-horizontal-xxl > .list-group-item.active { margin-top: 0; } .list-group-horizontal-xxl > .list-group-item + .list-group-item { - border-top-width: 1px; + border-top-width: var(--bs-list-group-border-width); border-left-width: 0; } .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); } } .list-group-flush { border-radius: 0; } .list-group-flush > .list-group-item { - border-width: 0 0 1px; + border-width: 0 0 var(--bs-list-group-border-width); } .list-group-flush > .list-group-item:last-child { border-bottom-width: 0; } .list-group-item-primary { - color: #0d5470; - background-color: #d0e8f1; -} -.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { - color: #0d5470; - background-color: #bbd1d9; -} -.list-group-item-primary.list-group-item-action.active { - color: #fff; - background-color: #0d5470; - border-color: #0d5470; + --bs-list-group-color: var(--bs-primary-text-emphasis); + --bs-list-group-bg: var(--bs-primary-bg-subtle); + --bs-list-group-border-color: var(--bs-primary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-primary-border-subtle); + --bs-list-group-active-color: var(--bs-primary-bg-subtle); + --bs-list-group-active-bg: var(--bs-primary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-primary-text-emphasis); } .list-group-item-secondary { - color: #909090; - background-color: #fcfcfc; -} -.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { - color: #909090; - background-color: #e3e3e3; -} -.list-group-item-secondary.list-group-item-action.active { - color: #fff; - background-color: #909090; - border-color: #909090; + --bs-list-group-color: var(--bs-secondary-text-emphasis); + --bs-list-group-bg: var(--bs-secondary-bg-subtle); + --bs-list-group-border-color: var(--bs-secondary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle); + --bs-list-group-active-color: var(--bs-secondary-bg-subtle); + --bs-list-group-active-bg: var(--bs-secondary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis); } .list-group-item-success { - color: #186d1a; - background-color: #d4f0d5; -} -.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { - color: #186d1a; - background-color: #bfd8c0; -} -.list-group-item-success.list-group-item-action.active { - color: #fff; - background-color: #186d1a; - border-color: #186d1a; + --bs-list-group-color: var(--bs-success-text-emphasis); + --bs-list-group-bg: var(--bs-success-bg-subtle); + --bs-list-group-border-color: var(--bs-success-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-success-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-success-border-subtle); + --bs-list-group-active-color: var(--bs-success-bg-subtle); + --bs-list-group-active-bg: var(--bs-success-text-emphasis); + --bs-list-group-active-border-color: var(--bs-success-text-emphasis); } .list-group-item-info { - color: #46798d; - background-color: #e3f4fb; -} -.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { - color: #46798d; - background-color: #ccdce2; -} -.list-group-item-info.list-group-item-action.active { - color: #fff; - background-color: #46798d; - border-color: #46798d; + --bs-list-group-color: var(--bs-info-text-emphasis); + --bs-list-group-bg: var(--bs-info-bg-subtle); + --bs-list-group-border-color: var(--bs-info-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-info-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-info-border-subtle); + --bs-list-group-active-color: var(--bs-info-bg-subtle); + --bs-list-group-active-bg: var(--bs-info-text-emphasis); + --bs-list-group-active-border-color: var(--bs-info-text-emphasis); } .list-group-item-warning { - color: #995010; - background-color: #ffe7d1; -} -.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { - color: #995010; - background-color: #e6d0bc; -} -.list-group-item-warning.list-group-item-action.active { - color: #fff; - background-color: #995010; - border-color: #995010; + --bs-list-group-color: var(--bs-warning-text-emphasis); + --bs-list-group-bg: var(--bs-warning-bg-subtle); + --bs-list-group-border-color: var(--bs-warning-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-warning-border-subtle); + --bs-list-group-active-color: var(--bs-warning-bg-subtle); + --bs-list-group-active-bg: var(--bs-warning-text-emphasis); + --bs-list-group-active-border-color: var(--bs-warning-text-emphasis); } .list-group-item-danger { - color: #992720; - background-color: #ffd9d7; -} -.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { - color: #992720; - background-color: #e6c3c2; -} -.list-group-item-danger.list-group-item-action.active { - color: #fff; - background-color: #992720; - border-color: #992720; + --bs-list-group-color: var(--bs-danger-text-emphasis); + --bs-list-group-bg: var(--bs-danger-bg-subtle); + --bs-list-group-border-color: var(--bs-danger-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-danger-border-subtle); + --bs-list-group-active-color: var(--bs-danger-bg-subtle); + --bs-list-group-active-bg: var(--bs-danger-text-emphasis); + --bs-list-group-active-border-color: var(--bs-danger-text-emphasis); } .list-group-item-light { - color: #949494; - background-color: #fdfdfd; -} -.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { - color: #949494; - background-color: #e4e4e4; -} -.list-group-item-light.list-group-item-action.active { - color: #fff; - background-color: #949494; - border-color: #949494; + --bs-list-group-color: var(--bs-light-text-emphasis); + --bs-list-group-bg: var(--bs-light-bg-subtle); + --bs-list-group-border-color: var(--bs-light-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-light-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-light-border-subtle); + --bs-list-group-active-color: var(--bs-light-bg-subtle); + --bs-list-group-active-bg: var(--bs-light-text-emphasis); + --bs-list-group-active-border-color: var(--bs-light-text-emphasis); } .list-group-item-dark { - color: #333333; - background-color: #dddddd; -} -.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { - color: #333333; - background-color: #c7c7c7; -} -.list-group-item-dark.list-group-item-action.active { - color: #fff; - background-color: #333333; - border-color: #333333; + --bs-list-group-color: var(--bs-dark-text-emphasis); + --bs-list-group-bg: var(--bs-dark-bg-subtle); + --bs-list-group-border-color: var(--bs-dark-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-dark-border-subtle); + --bs-list-group-active-color: var(--bs-dark-bg-subtle); + --bs-list-group-active-bg: var(--bs-dark-text-emphasis); + --bs-list-group-active-border-color: var(--bs-dark-text-emphasis); } .btn-close { + --bs-btn-close-color: #fff; + --bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3e%3c/svg%3e"); + --bs-btn-close-opacity: 0.4; + --bs-btn-close-hover-opacity: 1; + --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(21, 140, 186, 0.25); + --bs-btn-close-focus-opacity: 1; + --bs-btn-close-disabled-opacity: 0.25; box-sizing: content-box; width: 1em; height: 1em; padding: 0.25em 0.25em; - color: #fff; - background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat; + color: var(--bs-btn-close-color); + background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat; + filter: var(--bs-btn-close-filter); border: 0; - border-radius: 0.25rem; - opacity: 0.4; + border-radius: 0.375rem; + opacity: var(--bs-btn-close-opacity); } .btn-close:hover { - color: #fff; + color: var(--bs-btn-close-color); text-decoration: none; - opacity: 1; + opacity: var(--bs-btn-close-hover-opacity); } .btn-close:focus { outline: 0; - box-shadow: 0 0 0 0.25rem rgba(21, 140, 186, 0.25); - opacity: 1; + box-shadow: var(--bs-btn-close-focus-shadow); + opacity: var(--bs-btn-close-focus-opacity); } .btn-close:disabled, .btn-close.disabled { pointer-events: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; - opacity: 0.25; + opacity: var(--bs-btn-close-disabled-opacity); } .btn-close-white { - filter: invert(1) grayscale(100%) brightness(200%); + --bs-btn-close-filter: invert(1) grayscale(100%) brightness(200%); +} + +:root, +[data-bs-theme=light] { + --bs-btn-close-filter: ; +} + +[data-bs-theme=dark] { + --bs-btn-close-filter: invert(1) grayscale(100%) brightness(200%); } .toast { - width: 350px; + --bs-toast-zindex: 1090; + --bs-toast-padding-x: 0.75rem; + --bs-toast-padding-y: 0.5rem; + --bs-toast-spacing: 1.5rem; + --bs-toast-max-width: 350px; + --bs-toast-font-size: 0.875rem; + --bs-toast-color: ; + --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-border-width: var(--bs-border-width); + --bs-toast-border-color: var(--bs-border-color-translucent); + --bs-toast-border-radius: var(--bs-border-radius); + --bs-toast-box-shadow: var(--bs-box-shadow); + --bs-toast-header-color: var(--bs-secondary-color); + --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-header-border-color: var(--bs-border-color-translucent); + width: var(--bs-toast-max-width); max-width: 100%; - font-size: 0.875rem; + font-size: var(--bs-toast-font-size); + color: var(--bs-toast-color); pointer-events: auto; - background-color: rgba(255, 255, 255, 0.85); + background-color: var(--bs-toast-bg); background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.1); - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); - border-radius: 0.25rem; + border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); + box-shadow: var(--bs-toast-box-shadow); + border-radius: var(--bs-toast-border-radius); } .toast.showing { opacity: 0; @@ -5509,6 +5526,9 @@ textarea.form-control-lg { } .toast-container { + --bs-toast-zindex: 1090; + position: absolute; + z-index: var(--bs-toast-zindex); width: -webkit-max-content; width: -moz-max-content; width: max-content; @@ -5516,35 +5536,56 @@ textarea.form-control-lg { pointer-events: none; } .toast-container > :not(:last-child) { - margin-bottom: 0.75rem; + margin-bottom: var(--bs-toast-spacing); } .toast-header { display: flex; align-items: center; - padding: 0.5rem 0.75rem; - color: #999; - background-color: rgba(255, 255, 255, 0.85); + padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); + color: var(--bs-toast-header-color); + background-color: var(--bs-toast-header-bg); background-clip: padding-box; - border-bottom: 1px solid rgba(0, 0, 0, 0.05); - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px); + border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color); + border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); + border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); } .toast-header .btn-close { - margin-right: -0.375rem; - margin-left: 0.75rem; + margin-right: calc(-0.5 * var(--bs-toast-padding-x)); + margin-left: var(--bs-toast-padding-x); } .toast-body { - padding: 0.75rem; + padding: var(--bs-toast-padding-x); word-wrap: break-word; } .modal { + --bs-modal-zindex: 1055; + --bs-modal-width: 500px; + --bs-modal-padding: 1rem; + --bs-modal-margin: 0.5rem; + --bs-modal-color: var(--bs-body-color); + --bs-modal-bg: var(--bs-body-bg); + --bs-modal-border-color: rgba(0, 0, 0, 0.1); + --bs-modal-border-width: var(--bs-border-width); + --bs-modal-border-radius: var(--bs-border-radius-lg); + --bs-modal-box-shadow: var(--bs-box-shadow-sm); + --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width))); + --bs-modal-header-padding-x: 1rem; + --bs-modal-header-padding-y: 1rem; + --bs-modal-header-padding: 1rem 1rem; + --bs-modal-header-border-color: var(--bs-border-color); + --bs-modal-header-border-width: var(--bs-border-width); + --bs-modal-title-line-height: 1.5; + --bs-modal-footer-gap: 0.5rem; + --bs-modal-footer-bg: ; + --bs-modal-footer-border-color: var(--bs-border-color); + --bs-modal-footer-border-width: var(--bs-border-width); position: fixed; top: 0; left: 0; - z-index: 1055; + z-index: var(--bs-modal-zindex); display: none; width: 100%; height: 100%; @@ -5556,12 +5597,12 @@ textarea.form-control-lg { .modal-dialog { position: relative; width: auto; - margin: 0.5rem; + margin: var(--bs-modal-margin); pointer-events: none; } .modal.fade .modal-dialog { - transition: transform 0.3s ease-out; transform: translate(0, -50px); + transition: transform 0.3s ease-out; } @media (prefers-reduced-motion: reduce) { .modal.fade .modal-dialog { @@ -5576,7 +5617,7 @@ textarea.form-control-lg { } .modal-dialog-scrollable { - height: calc(100% - 1rem); + height: calc(100% - var(--bs-modal-margin) * 2); } .modal-dialog-scrollable .modal-content { max-height: 100%; @@ -5589,7 +5630,7 @@ textarea.form-control-lg { .modal-dialog-centered { display: flex; align-items: center; - min-height: calc(100% - 1rem); + min-height: calc(100% - var(--bs-modal-margin) * 2); } .modal-content { @@ -5597,98 +5638,101 @@ textarea.form-control-lg { display: flex; flex-direction: column; width: 100%; + color: var(--bs-modal-color); pointer-events: auto; - background-color: #fff; + background-color: var(--bs-modal-bg); background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.1); - border-radius: 0.3rem; + border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); + border-radius: var(--bs-modal-border-radius); outline: 0; } .modal-backdrop { + --bs-backdrop-zindex: 1050; + --bs-backdrop-bg: #000; + --bs-backdrop-opacity: 0.5; position: fixed; top: 0; left: 0; - z-index: 1050; + z-index: var(--bs-backdrop-zindex); width: 100vw; height: 100vh; - background-color: #000; + background-color: var(--bs-backdrop-bg); } .modal-backdrop.fade { opacity: 0; } .modal-backdrop.show { - opacity: 0.5; + opacity: var(--bs-backdrop-opacity); } .modal-header { display: flex; flex-shrink: 0; align-items: center; - justify-content: space-between; - padding: 1rem 1rem; - border-bottom: 1px solid #dee2e6; - border-top-left-radius: calc(0.3rem - 1px); - border-top-right-radius: calc(0.3rem - 1px); + padding: var(--bs-modal-header-padding); + border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); + border-top-left-radius: var(--bs-modal-inner-border-radius); + border-top-right-radius: var(--bs-modal-inner-border-radius); } .modal-header .btn-close { - padding: 0.5rem 0.5rem; - margin: -0.5rem -0.5rem -0.5rem auto; + padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5); + margin-top: calc(-0.5 * var(--bs-modal-header-padding-y)); + margin-right: calc(-0.5 * var(--bs-modal-header-padding-x)); + margin-bottom: calc(-0.5 * var(--bs-modal-header-padding-y)); + margin-left: auto; } .modal-title { margin-bottom: 0; - line-height: 1.5; + line-height: var(--bs-modal-title-line-height); } .modal-body { position: relative; flex: 1 1 auto; - padding: 1rem; + padding: var(--bs-modal-padding); } .modal-footer { display: flex; - flex-wrap: wrap; flex-shrink: 0; + flex-wrap: wrap; align-items: center; justify-content: flex-end; - padding: 0.75rem; - border-top: 1px solid #dee2e6; - border-bottom-right-radius: calc(0.3rem - 1px); - border-bottom-left-radius: calc(0.3rem - 1px); + padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5); + background-color: var(--bs-modal-footer-bg); + border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); + border-bottom-right-radius: var(--bs-modal-inner-border-radius); + border-bottom-left-radius: var(--bs-modal-inner-border-radius); } .modal-footer > * { - margin: 0.25rem; + margin: calc(var(--bs-modal-footer-gap) * 0.5); } @media (min-width: 576px) { + .modal { + --bs-modal-margin: 1.75rem; + --bs-modal-box-shadow: var(--bs-box-shadow); + } .modal-dialog { - max-width: 500px; - margin: 1.75rem auto; + max-width: var(--bs-modal-width); + margin-right: auto; + margin-left: auto; } - - .modal-dialog-scrollable { - height: calc(100% - 3.5rem); - } - - .modal-dialog-centered { - min-height: calc(100% - 3.5rem); - } - .modal-sm { - max-width: 300px; + --bs-modal-width: 300px; } } @media (min-width: 992px) { .modal-lg, -.modal-xl { - max-width: 800px; + .modal-xl { + --bs-modal-width: 800px; } } @media (min-width: 1200px) { .modal-xl { - max-width: 1140px; + --bs-modal-width: 1140px; } } .modal-fullscreen { @@ -5702,15 +5746,13 @@ textarea.form-control-lg { border: 0; border-radius: 0; } -.modal-fullscreen .modal-header { +.modal-fullscreen .modal-header, +.modal-fullscreen .modal-footer { border-radius: 0; } .modal-fullscreen .modal-body { overflow-y: auto; } -.modal-fullscreen .modal-footer { - border-radius: 0; -} @media (max-width: 575.98px) { .modal-fullscreen-sm-down { @@ -5724,15 +5766,13 @@ textarea.form-control-lg { border: 0; border-radius: 0; } - .modal-fullscreen-sm-down .modal-header { + .modal-fullscreen-sm-down .modal-header, + .modal-fullscreen-sm-down .modal-footer { border-radius: 0; } .modal-fullscreen-sm-down .modal-body { overflow-y: auto; } - .modal-fullscreen-sm-down .modal-footer { - border-radius: 0; - } } @media (max-width: 767.98px) { .modal-fullscreen-md-down { @@ -5746,15 +5786,13 @@ textarea.form-control-lg { border: 0; border-radius: 0; } - .modal-fullscreen-md-down .modal-header { + .modal-fullscreen-md-down .modal-header, + .modal-fullscreen-md-down .modal-footer { border-radius: 0; } .modal-fullscreen-md-down .modal-body { overflow-y: auto; } - .modal-fullscreen-md-down .modal-footer { - border-radius: 0; - } } @media (max-width: 991.98px) { .modal-fullscreen-lg-down { @@ -5768,15 +5806,13 @@ textarea.form-control-lg { border: 0; border-radius: 0; } - .modal-fullscreen-lg-down .modal-header { + .modal-fullscreen-lg-down .modal-header, + .modal-fullscreen-lg-down .modal-footer { border-radius: 0; } .modal-fullscreen-lg-down .modal-body { overflow-y: auto; } - .modal-fullscreen-lg-down .modal-footer { - border-radius: 0; - } } @media (max-width: 1199.98px) { .modal-fullscreen-xl-down { @@ -5790,15 +5826,13 @@ textarea.form-control-lg { border: 0; border-radius: 0; } - .modal-fullscreen-xl-down .modal-header { + .modal-fullscreen-xl-down .modal-header, + .modal-fullscreen-xl-down .modal-footer { border-radius: 0; } .modal-fullscreen-xl-down .modal-body { overflow-y: auto; } - .modal-fullscreen-xl-down .modal-footer { - border-radius: 0; - } } @media (max-width: 1399.98px) { .modal-fullscreen-xxl-down { @@ -5812,21 +5846,30 @@ textarea.form-control-lg { border: 0; border-radius: 0; } - .modal-fullscreen-xxl-down .modal-header { + .modal-fullscreen-xxl-down .modal-header, + .modal-fullscreen-xxl-down .modal-footer { border-radius: 0; } .modal-fullscreen-xxl-down .modal-body { overflow-y: auto; } - .modal-fullscreen-xxl-down .modal-footer { - border-radius: 0; - } } .tooltip { - position: absolute; - z-index: 1080; + --bs-tooltip-zindex: 1080; + --bs-tooltip-max-width: 200px; + --bs-tooltip-padding-x: 0.5rem; + --bs-tooltip-padding-y: 0.25rem; + --bs-tooltip-margin: ; + --bs-tooltip-font-size: 0.875rem; + --bs-tooltip-color: var(--bs-body-bg); + --bs-tooltip-bg: var(--bs-emphasis-color); + --bs-tooltip-border-radius: var(--bs-border-radius); + --bs-tooltip-opacity: 0.9; + --bs-tooltip-arrow-width: 0.8rem; + --bs-tooltip-arrow-height: 0.4rem; + z-index: var(--bs-tooltip-zindex); display: block; - margin: 0; + margin: var(--bs-tooltip-margin); font-family: var(--bs-font-sans-serif); font-style: normal; font-weight: 400; @@ -5838,21 +5881,20 @@ textarea.form-control-lg { text-transform: none; letter-spacing: normal; word-break: normal; - word-spacing: normal; white-space: normal; + word-spacing: normal; line-break: auto; - font-size: 0.875rem; + font-size: var(--bs-tooltip-font-size); word-wrap: break-word; opacity: 0; } .tooltip.show { - opacity: 0.9; + opacity: var(--bs-tooltip-opacity); } .tooltip .tooltip-arrow { - position: absolute; display: block; - width: 0.8rem; - height: 0.4rem; + width: var(--bs-tooltip-arrow-width); + height: var(--bs-tooltip-arrow-height); } .tooltip .tooltip-arrow::before { position: absolute; @@ -5861,74 +5903,83 @@ textarea.form-control-lg { border-style: solid; } -.bs-tooltip-top, .bs-tooltip-auto[data-popper-placement^=top] { - padding: 0.4rem 0; -} .bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow { - bottom: 0; + bottom: calc(-1 * var(--bs-tooltip-arrow-height)); } .bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { top: -1px; - border-width: 0.4rem 0.4rem 0; - border-top-color: #000; + border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-top-color: var(--bs-tooltip-bg); } -.bs-tooltip-end, .bs-tooltip-auto[data-popper-placement^=right] { - padding: 0 0.4rem; -} +/* rtl:begin:ignore */ .bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { - left: 0; - width: 0.4rem; - height: 0.8rem; + left: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); } .bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { right: -1px; - border-width: 0.4rem 0.4rem 0.4rem 0; - border-right-color: #000; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-right-color: var(--bs-tooltip-bg); } -.bs-tooltip-bottom, .bs-tooltip-auto[data-popper-placement^=bottom] { - padding: 0.4rem 0; -} +/* rtl:end:ignore */ .bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow { - top: 0; + top: calc(-1 * var(--bs-tooltip-arrow-height)); } .bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { bottom: -1px; - border-width: 0 0.4rem 0.4rem; - border-bottom-color: #000; + border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-bottom-color: var(--bs-tooltip-bg); } -.bs-tooltip-start, .bs-tooltip-auto[data-popper-placement^=left] { - padding: 0 0.4rem; -} +/* rtl:begin:ignore */ .bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { - right: 0; - width: 0.4rem; - height: 0.8rem; + right: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); } .bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { left: -1px; - border-width: 0.4rem 0 0.4rem 0.4rem; - border-left-color: #000; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-left-color: var(--bs-tooltip-bg); } +/* rtl:end:ignore */ .tooltip-inner { - max-width: 200px; - padding: 0.25rem 0.5rem; - color: #fff; + max-width: var(--bs-tooltip-max-width); + padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); + color: var(--bs-tooltip-color); text-align: center; - background-color: #000; - border-radius: 0.25rem; + background-color: var(--bs-tooltip-bg); + border-radius: var(--bs-tooltip-border-radius); } .popover { - position: absolute; - top: 0; - left: 0 /* rtl:ignore */; - z-index: 1070; + --bs-popover-zindex: 1070; + --bs-popover-max-width: 276px; + --bs-popover-font-size: 0.875rem; + --bs-popover-bg: var(--bs-body-bg); + --bs-popover-border-width: var(--bs-border-width); + --bs-popover-border-color: var(--bs-border-color-translucent); + --bs-popover-border-radius: var(--bs-border-radius-lg); + --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width)); + --bs-popover-box-shadow: var(--bs-box-shadow); + --bs-popover-header-padding-x: 1rem; + --bs-popover-header-padding-y: 0.5rem; + --bs-popover-header-font-size: 1rem; + --bs-popover-header-color: inherit; + --bs-popover-header-bg: var(--bs-secondary-bg); + --bs-popover-body-padding-x: 1rem; + --bs-popover-body-padding-y: 1rem; + --bs-popover-body-color: var(--bs-body-color); + --bs-popover-arrow-width: 1rem; + --bs-popover-arrow-height: 0.5rem; + --bs-popover-arrow-border: var(--bs-popover-border-color); + z-index: var(--bs-popover-zindex); display: block; - max-width: 276px; + max-width: var(--bs-popover-max-width); font-family: var(--bs-font-sans-serif); font-style: normal; font-weight: 400; @@ -5940,21 +5991,20 @@ textarea.form-control-lg { text-transform: none; letter-spacing: normal; word-break: normal; - word-spacing: normal; white-space: normal; + word-spacing: normal; line-break: auto; - font-size: 0.875rem; + font-size: var(--bs-popover-font-size); word-wrap: break-word; - background-color: #fff; + background-color: var(--bs-popover-bg); background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0.3rem; + border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-radius: var(--bs-popover-border-radius); } .popover .popover-arrow { - position: absolute; display: block; - width: 1rem; - height: 0.5rem; + width: var(--bs-popover-arrow-width); + height: var(--bs-popover-arrow-height); } .popover .popover-arrow::before, .popover .popover-arrow::after { position: absolute; @@ -5962,94 +6012,104 @@ textarea.form-control-lg { content: ""; border-color: transparent; border-style: solid; + border-width: 0; } .bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow { - bottom: calc(-0.5rem - 1px); + bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +} +.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { + border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; } .bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before { bottom: 0; - border-width: 0.5rem 0.5rem 0; - border-top-color: rgba(0, 0, 0, 0.25); + border-top-color: var(--bs-popover-arrow-border); } .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { - bottom: 1px; - border-width: 0.5rem 0.5rem 0; - border-top-color: #fff; + bottom: var(--bs-popover-border-width); + border-top-color: var(--bs-popover-bg); } +/* rtl:begin:ignore */ .bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow { - left: calc(-0.5rem - 1px); - width: 0.5rem; - height: 1rem; + left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; } .bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before { left: 0; - border-width: 0.5rem 0.5rem 0.5rem 0; - border-right-color: rgba(0, 0, 0, 0.25); + border-right-color: var(--bs-popover-arrow-border); } .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { - left: 1px; - border-width: 0.5rem 0.5rem 0.5rem 0; - border-right-color: #fff; + left: var(--bs-popover-border-width); + border-right-color: var(--bs-popover-bg); } +/* rtl:end:ignore */ .bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow { - top: calc(-0.5rem - 1px); + top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +} +.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { + border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); } .bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before { top: 0; - border-width: 0 0.5rem 0.5rem 0.5rem; - border-bottom-color: rgba(0, 0, 0, 0.25); + border-bottom-color: var(--bs-popover-arrow-border); } .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { - top: 1px; - border-width: 0 0.5rem 0.5rem 0.5rem; - border-bottom-color: #fff; + top: var(--bs-popover-border-width); + border-bottom-color: var(--bs-popover-bg); } .bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before { position: absolute; top: 0; left: 50%; display: block; - width: 1rem; - margin-left: -0.5rem; + width: var(--bs-popover-arrow-width); + margin-left: calc(-0.5 * var(--bs-popover-arrow-width)); content: ""; - border-bottom: 1px solid #f0f0f0; + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg); } +/* rtl:begin:ignore */ .bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow { - right: calc(-0.5rem - 1px); - width: 0.5rem; - height: 1rem; + right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); } .bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before { right: 0; - border-width: 0.5rem 0 0.5rem 0.5rem; - border-left-color: rgba(0, 0, 0, 0.25); + border-left-color: var(--bs-popover-arrow-border); } .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { - right: 1px; - border-width: 0.5rem 0 0.5rem 0.5rem; - border-left-color: #fff; + right: var(--bs-popover-border-width); + border-left-color: var(--bs-popover-bg); } +/* rtl:end:ignore */ .popover-header { - padding: 0.5rem 1rem; + padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x); margin-bottom: 0; - font-size: 1rem; - background-color: #f0f0f0; - border-bottom: 1px solid rgba(0, 0, 0, 0.2); - border-top-left-radius: calc(0.3rem - 1px); - border-top-right-radius: calc(0.3rem - 1px); + font-size: var(--bs-popover-header-font-size); + color: var(--bs-popover-header-color); + background-color: var(--bs-popover-header-bg); + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-top-left-radius: var(--bs-popover-inner-border-radius); + border-top-right-radius: var(--bs-popover-inner-border-radius); } .popover-header:empty { display: none; } .popover-body { - padding: 1rem 1rem; - color: #222; + padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); + color: var(--bs-popover-body-color); } .carousel { @@ -6093,7 +6153,6 @@ textarea.form-control-lg { display: block; } -/* rtl:begin:ignore */ .carousel-item-next:not(.carousel-item-start), .active.carousel-item-end { transform: translateX(100%); @@ -6104,7 +6163,6 @@ textarea.form-control-lg { transform: translateX(-100%); } -/* rtl:end:ignore */ .carousel-fade .carousel-item { opacity: 0; transition-property: opacity; @@ -6124,7 +6182,7 @@ textarea.form-control-lg { } @media (prefers-reduced-motion: reduce) { .carousel-fade .active.carousel-item-start, -.carousel-fade .active.carousel-item-end { + .carousel-fade .active.carousel-item-end { transition: none; } } @@ -6143,13 +6201,14 @@ textarea.form-control-lg { color: #fff; text-align: center; background: none; + filter: var(--bs-carousel-control-icon-filter); border: 0; opacity: 0.5; transition: opacity 0.15s ease; } @media (prefers-reduced-motion: reduce) { .carousel-control-prev, -.carousel-control-next { + .carousel-control-next { transition: none; } } @@ -6180,20 +6239,12 @@ textarea.form-control-lg { background-size: 100% 100%; } -/* rtl:options: { - "autoRename": true, - "stringMap":[ { - "name" : "prev-next", - "search" : "prev", - "replace" : "next" - } ] -} */ .carousel-control-prev-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e"); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e")*/; } .carousel-control-next-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e")*/; } .carousel-indicators { @@ -6208,7 +6259,6 @@ textarea.form-control-lg { margin-right: 15%; margin-bottom: 1rem; margin-left: 15%; - list-style: none; } .carousel-indicators [data-bs-target] { box-sizing: content-box; @@ -6220,7 +6270,7 @@ textarea.form-control-lg { margin-left: 3px; text-indent: -999px; cursor: pointer; - background-color: #fff; + background-color: var(--bs-carousel-indicator-active-bg); background-clip: padding-box; border: 0; border-top: 10px solid transparent; @@ -6244,25 +6294,38 @@ textarea.form-control-lg { left: 15%; padding-top: 1.25rem; padding-bottom: 1.25rem; - color: #fff; + color: var(--bs-carousel-caption-color); text-align: center; } -.carousel-dark .carousel-control-prev-icon, -.carousel-dark .carousel-control-next-icon { - filter: invert(1) grayscale(100); -} -.carousel-dark .carousel-indicators [data-bs-target] { - background-color: #000; -} -.carousel-dark .carousel-caption { - color: #000; +.carousel-dark { + --bs-carousel-indicator-active-bg: #000; + --bs-carousel-caption-color: #000; + --bs-carousel-control-icon-filter: invert(1) grayscale(100); } -@-webkit-keyframes spinner-border { - to { - transform: rotate(360deg) /* rtl:ignore */; - } +:root, +[data-bs-theme=light] { + --bs-carousel-indicator-active-bg: #fff; + --bs-carousel-caption-color: #fff; + --bs-carousel-control-icon-filter: ; +} + +[data-bs-theme=dark] { + --bs-carousel-indicator-active-bg: #000; + --bs-carousel-caption-color: #000; + --bs-carousel-control-icon-filter: invert(1) grayscale(100); +} + +.spinner-grow, +.spinner-border { + display: inline-block; + flex-shrink: 0; + width: var(--bs-spinner-width); + height: var(--bs-spinner-height); + vertical-align: var(--bs-spinner-vertical-align); + border-radius: 50%; + animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name); } @keyframes spinner-border { @@ -6271,31 +6334,20 @@ textarea.form-control-lg { } } .spinner-border { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: -0.125em; - border: 0.25em solid currentColor; + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-border-width: 0.25em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-border; + border: var(--bs-spinner-border-width) solid currentcolor; border-right-color: transparent; - border-radius: 50%; - -webkit-animation: 0.75s linear infinite spinner-border; - animation: 0.75s linear infinite spinner-border; } .spinner-border-sm { - width: 1rem; - height: 1rem; - border-width: 0.2em; -} - -@-webkit-keyframes spinner-grow { - 0% { - transform: scale(0); - } - 50% { - opacity: 1; - transform: none; - } + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; + --bs-spinner-border-width: 0.2em; } @keyframes spinner-grow { @@ -6308,47 +6360,487 @@ textarea.form-control-lg { } } .spinner-grow { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: -0.125em; - background-color: currentColor; - border-radius: 50%; + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-grow; + background-color: currentcolor; opacity: 0; - -webkit-animation: 0.75s linear infinite spinner-grow; - animation: 0.75s linear infinite spinner-grow; } .spinner-grow-sm { - width: 1rem; - height: 1rem; + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; } @media (prefers-reduced-motion: reduce) { .spinner-border, -.spinner-grow { - -webkit-animation-duration: 1.5s; - animation-duration: 1.5s; + .spinner-grow { + --bs-spinner-animation-speed: 1.5s; } } +.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm { + --bs-offcanvas-zindex: 1045; + --bs-offcanvas-width: 400px; + --bs-offcanvas-height: 30vh; + --bs-offcanvas-padding-x: 1rem; + --bs-offcanvas-padding-y: 1rem; + --bs-offcanvas-color: var(--bs-body-color); + --bs-offcanvas-bg: var(--bs-body-bg); + --bs-offcanvas-border-width: var(--bs-border-width); + --bs-offcanvas-border-color: rgba(0, 0, 0, 0.1); + --bs-offcanvas-box-shadow: var(--bs-box-shadow-sm); + --bs-offcanvas-transition: transform 0.3s ease-in-out; + --bs-offcanvas-title-line-height: 1.5; +} + +@media (max-width: 575.98px) { + .offcanvas-sm { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-sm { + transition: none; + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-sm.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-sm.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-sm.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) { + transform: none; + } + .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show { + visibility: visible; + } +} +@media (min-width: 576px) { + .offcanvas-sm { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-sm .offcanvas-header { + display: none; + } + .offcanvas-sm .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 767.98px) { + .offcanvas-md { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-md { + transition: none; + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-md.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-md.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-md.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) { + transform: none; + } + .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show { + visibility: visible; + } +} +@media (min-width: 768px) { + .offcanvas-md { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-md .offcanvas-header { + display: none; + } + .offcanvas-md .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 991.98px) { + .offcanvas-lg { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-lg { + transition: none; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-lg.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-lg.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-lg.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) { + transform: none; + } + .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show { + visibility: visible; + } +} +@media (min-width: 992px) { + .offcanvas-lg { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-lg .offcanvas-header { + display: none; + } + .offcanvas-lg .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 1199.98px) { + .offcanvas-xl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xl { + transition: none; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-xl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-xl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-xl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) { + transform: none; + } + .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show { + visibility: visible; + } +} +@media (min-width: 1200px) { + .offcanvas-xl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xl .offcanvas-header { + display: none; + } + .offcanvas-xl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 1399.98px) { + .offcanvas-xxl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xxl { + transition: none; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-xxl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-xxl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-xxl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) { + transform: none; + } + .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show { + visibility: visible; + } +} +@media (min-width: 1400px) { + .offcanvas-xxl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xxl .offcanvas-header { + display: none; + } + .offcanvas-xxl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + .offcanvas { position: fixed; bottom: 0; - z-index: 1045; + z-index: var(--bs-offcanvas-zindex); display: flex; flex-direction: column; max-width: 100%; + color: var(--bs-offcanvas-color); visibility: hidden; - background-color: #fff; + background-color: var(--bs-offcanvas-bg); background-clip: padding-box; outline: 0; - transition: transform 0.3s ease-in-out; + transition: var(--bs-offcanvas-transition); } @media (prefers-reduced-motion: reduce) { .offcanvas { transition: none; } } +.offcanvas.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); +} +.offcanvas.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); +} +.offcanvas.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); +} +.offcanvas.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); +} +.offcanvas.showing, .offcanvas.show:not(.hiding) { + transform: none; +} +.offcanvas.showing, .offcanvas.hiding, .offcanvas.show { + visibility: visible; +} .offcanvas-backdrop { position: fixed; @@ -6369,72 +6861,33 @@ textarea.form-control-lg { .offcanvas-header { display: flex; align-items: center; - justify-content: space-between; - padding: 1rem 1rem; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); } .offcanvas-header .btn-close { - padding: 0.5rem 0.5rem; - margin-top: -0.5rem; - margin-right: -0.5rem; - margin-bottom: -0.5rem; + padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5); + margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y)); + margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x)); + margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y)); + margin-left: auto; } .offcanvas-title { margin-bottom: 0; - line-height: 1.5; + line-height: var(--bs-offcanvas-title-line-height); } .offcanvas-body { flex-grow: 1; - padding: 1rem 1rem; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); overflow-y: auto; } -.offcanvas-start { - top: 0; - left: 0; - width: 400px; - border-right: 1px solid rgba(0, 0, 0, 0.1); - transform: translateX(-100%); -} - -.offcanvas-end { - top: 0; - right: 0; - width: 400px; - border-left: 1px solid rgba(0, 0, 0, 0.1); - transform: translateX(100%); -} - -.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: 30vh; - max-height: 100%; - border-bottom: 1px solid rgba(0, 0, 0, 0.1); - transform: translateY(-100%); -} - -.offcanvas-bottom { - right: 0; - left: 0; - height: 30vh; - max-height: 100%; - border-top: 1px solid rgba(0, 0, 0, 0.1); - transform: translateY(100%); -} - -.offcanvas.show { - transform: none; -} - .placeholder { display: inline-block; min-height: 1em; vertical-align: middle; cursor: wait; - background-color: currentColor; + background-color: currentcolor; opacity: 0.5; } .placeholder.btn::before { @@ -6455,16 +6908,9 @@ textarea.form-control-lg { } .placeholder-glow .placeholder { - -webkit-animation: placeholder-glow 2s ease-in-out infinite; animation: placeholder-glow 2s ease-in-out infinite; } -@-webkit-keyframes placeholder-glow { - 50% { - opacity: 0.2; - } -} - @keyframes placeholder-glow { 50% { opacity: 0.2; @@ -6475,17 +6921,9 @@ textarea.form-control-lg { mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); -webkit-mask-size: 200% 100%; mask-size: 200% 100%; - -webkit-animation: placeholder-wave 2s linear infinite; animation: placeholder-wave 2s linear infinite; } -@-webkit-keyframes placeholder-wave { - 100% { - -webkit-mask-position: -200% 0%; - mask-position: -200% 0%; - } -} - @keyframes placeholder-wave { 100% { -webkit-mask-position: -200% 0%; @@ -6498,60 +6936,175 @@ textarea.form-control-lg { content: ""; } +.text-bg-primary { + color: #fff !important; + background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-secondary { + color: #000 !important; + background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-success { + color: #fff !important; + background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-info { + color: #fff !important; + background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-warning { + color: #fff !important; + background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-danger { + color: #fff !important; + background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-light { + color: #000 !important; + background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-dark { + color: #fff !important; + background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important; +} + .link-primary { - color: #158cba; + color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important; } .link-primary:hover, .link-primary:focus { - color: #117095; + color: RGBA(17, 112, 149, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(17, 112, 149, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(17, 112, 149, var(--bs-link-underline-opacity, 1)) !important; } .link-secondary { - color: #f0f0f0; + color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important; } .link-secondary:hover, .link-secondary:focus { - color: #f3f3f3; + color: RGBA(243, 243, 243, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(243, 243, 243, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(243, 243, 243, var(--bs-link-underline-opacity, 1)) !important; } .link-success { - color: #28b62c; + color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important; } .link-success:hover, .link-success:focus { - color: #209223; + color: RGBA(32, 146, 35, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(32, 146, 35, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(32, 146, 35, var(--bs-link-underline-opacity, 1)) !important; } .link-info { - color: #75caeb; + color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important; } .link-info:hover, .link-info:focus { - color: #5ea2bc; + color: RGBA(94, 162, 188, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(94, 162, 188, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(94, 162, 188, var(--bs-link-underline-opacity, 1)) !important; } .link-warning { - color: #ff851b; + color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important; } .link-warning:hover, .link-warning:focus { - color: #cc6a16; + color: RGBA(204, 106, 22, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(204, 106, 22, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(204, 106, 22, var(--bs-link-underline-opacity, 1)) !important; } .link-danger { - color: #ff4136; + color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important; } .link-danger:hover, .link-danger:focus { - color: #cc342b; + color: RGBA(204, 52, 43, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(204, 52, 43, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(204, 52, 43, var(--bs-link-underline-opacity, 1)) !important; } .link-light { - color: #f6f6f6; + color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important; } .link-light:hover, .link-light:focus { - color: #f8f8f8; + color: RGBA(248, 248, 248, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(248, 248, 248, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(248, 248, 248, var(--bs-link-underline-opacity, 1)) !important; } .link-dark { - color: #555; + color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important; } .link-dark:hover, .link-dark:focus { - color: #444444; + color: RGBA(68, 68, 68, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(68, 68, 68, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(68, 68, 68, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-body-emphasis { + color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-body-emphasis:hover, .link-body-emphasis:focus { + color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important; + -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important; + text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important; +} + +.focus-ring:focus { + outline: 0; + box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color); +} + +.icon-link { + display: inline-flex; + gap: 0.375rem; + align-items: center; + -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5)); + text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5)); + text-underline-offset: 0.25em; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +.icon-link > .bi { + flex-shrink: 0; + width: 1em; + height: 1em; + fill: currentcolor; + transition: 0.2s ease-in-out transform; +} +@media (prefers-reduced-motion: reduce) { + .icon-link > .bi { + transition: none; + } +} + +.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi { + transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0)); } .ratio { @@ -6610,6 +7163,13 @@ textarea.form-control-lg { z-index: 1020; } +.sticky-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; +} + @media (min-width: 576px) { .sticky-sm-top { position: -webkit-sticky; @@ -6617,6 +7177,12 @@ textarea.form-control-lg { top: 0; z-index: 1020; } + .sticky-sm-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } } @media (min-width: 768px) { .sticky-md-top { @@ -6625,6 +7191,12 @@ textarea.form-control-lg { top: 0; z-index: 1020; } + .sticky-md-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } } @media (min-width: 992px) { .sticky-lg-top { @@ -6633,6 +7205,12 @@ textarea.form-control-lg { top: 0; z-index: 1020; } + .sticky-lg-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } } @media (min-width: 1200px) { .sticky-xl-top { @@ -6641,6 +7219,12 @@ textarea.form-control-lg { top: 0; z-index: 1020; } + .sticky-xl-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } } @media (min-width: 1400px) { .sticky-xxl-top { @@ -6649,6 +7233,12 @@ textarea.form-control-lg { top: 0; z-index: 1020; } + .sticky-xxl-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } } .hstack { display: flex; @@ -6666,7 +7256,6 @@ textarea.form-control-lg { .visually-hidden, .visually-hidden-focusable:not(:focus):not(:focus-within) { - position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; @@ -6676,6 +7265,14 @@ textarea.form-control-lg { white-space: nowrap !important; border: 0 !important; } +.visually-hidden:not(caption), +.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) { + position: absolute !important; +} +.visually-hidden *, +.visually-hidden-focusable:not(:focus):not(:focus-within) * { + overflow: hidden !important; +} .stretched-link::after { position: absolute; @@ -6696,9 +7293,9 @@ textarea.form-control-lg { .vr { display: inline-block; align-self: stretch; - width: 1px; + width: var(--bs-border-width); min-height: 1em; - background-color: currentColor; + background-color: currentcolor; opacity: 0.25; } @@ -6738,6 +7335,31 @@ textarea.form-control-lg { float: none !important; } +.object-fit-contain { + -o-object-fit: contain !important; + object-fit: contain !important; +} + +.object-fit-cover { + -o-object-fit: cover !important; + object-fit: cover !important; +} + +.object-fit-fill { + -o-object-fit: fill !important; + object-fit: fill !important; +} + +.object-fit-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; +} + +.object-fit-none { + -o-object-fit: none !important; + object-fit: none !important; +} + .opacity-0 { opacity: 0 !important; } @@ -6774,6 +7396,38 @@ textarea.form-control-lg { overflow: scroll !important; } +.overflow-x-auto { + overflow-x: auto !important; +} + +.overflow-x-hidden { + overflow-x: hidden !important; +} + +.overflow-x-visible { + overflow-x: visible !important; +} + +.overflow-x-scroll { + overflow-x: scroll !important; +} + +.overflow-y-auto { + overflow-y: auto !important; +} + +.overflow-y-hidden { + overflow-y: hidden !important; +} + +.overflow-y-visible { + overflow-y: visible !important; +} + +.overflow-y-scroll { + overflow-y: scroll !important; +} + .d-inline { display: inline !important; } @@ -6790,6 +7444,10 @@ textarea.form-control-lg { display: grid !important; } +.d-inline-grid { + display: inline-grid !important; +} + .d-table { display: table !important; } @@ -6815,21 +7473,53 @@ textarea.form-control-lg { } .shadow { - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; + box-shadow: var(--bs-box-shadow) !important; } .shadow-sm { - box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; + box-shadow: var(--bs-box-shadow-sm) !important; } .shadow-lg { - box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; + box-shadow: var(--bs-box-shadow-lg) !important; } .shadow-none { box-shadow: none !important; } +.focus-ring-primary { + --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-secondary { + --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-success { + --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-info { + --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-warning { + --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-danger { + --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-light { + --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-dark { + --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity)); +} + .position-static { position: static !important; } @@ -6912,7 +7602,7 @@ textarea.form-control-lg { } .border { - border: 1px solid #dee2e6 !important; + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } .border-0 { @@ -6920,7 +7610,7 @@ textarea.form-control-lg { } .border-top { - border-top: 1px solid #dee2e6 !important; + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } .border-top-0 { @@ -6928,7 +7618,7 @@ textarea.form-control-lg { } .border-end { - border-right: 1px solid #dee2e6 !important; + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } .border-end-0 { @@ -6936,7 +7626,7 @@ textarea.form-control-lg { } .border-bottom { - border-bottom: 1px solid #dee2e6 !important; + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } .border-bottom-0 { @@ -6944,7 +7634,7 @@ textarea.form-control-lg { } .border-start { - border-left: 1px solid #dee2e6 !important; + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } .border-start-0 { @@ -6952,39 +7642,85 @@ textarea.form-control-lg { } .border-primary { - border-color: #158cba !important; + --bs-border-opacity: 1; + border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important; } .border-secondary { - border-color: #f0f0f0 !important; + --bs-border-opacity: 1; + border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important; } .border-success { - border-color: #28b62c !important; + --bs-border-opacity: 1; + border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important; } .border-info { - border-color: #75caeb !important; + --bs-border-opacity: 1; + border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; } .border-warning { - border-color: #ff851b !important; + --bs-border-opacity: 1; + border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important; } .border-danger { - border-color: #ff4136 !important; + --bs-border-opacity: 1; + border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important; } .border-light { - border-color: #f6f6f6 !important; + --bs-border-opacity: 1; + border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important; } .border-dark { - border-color: #555 !important; + --bs-border-opacity: 1; + border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; +} + +.border-black { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important; } .border-white { - border-color: #fff !important; + --bs-border-opacity: 1; + border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important; +} + +.border-primary-subtle { + border-color: var(--bs-primary-border-subtle) !important; +} + +.border-secondary-subtle { + border-color: var(--bs-secondary-border-subtle) !important; +} + +.border-success-subtle { + border-color: var(--bs-success-border-subtle) !important; +} + +.border-info-subtle { + border-color: var(--bs-info-border-subtle) !important; +} + +.border-warning-subtle { + border-color: var(--bs-warning-border-subtle) !important; +} + +.border-danger-subtle { + border-color: var(--bs-danger-border-subtle) !important; +} + +.border-light-subtle { + border-color: var(--bs-light-border-subtle) !important; +} + +.border-dark-subtle { + border-color: var(--bs-dark-border-subtle) !important; } .border-1 { @@ -7007,6 +7743,26 @@ textarea.form-control-lg { border-width: 5px !important; } +.border-opacity-10 { + --bs-border-opacity: 0.1; +} + +.border-opacity-25 { + --bs-border-opacity: 0.25; +} + +.border-opacity-50 { + --bs-border-opacity: 0.5; +} + +.border-opacity-75 { + --bs-border-opacity: 0.75; +} + +.border-opacity-100 { + --bs-border-opacity: 1; +} + .w-25 { width: 25% !important; } @@ -7119,30 +7875,6 @@ textarea.form-control-lg { flex-wrap: wrap-reverse !important; } -.gap-0 { - gap: 0 !important; -} - -.gap-1 { - gap: 0.25rem !important; -} - -.gap-2 { - gap: 0.5rem !important; -} - -.gap-3 { - gap: 1rem !important; -} - -.gap-4 { - gap: 1.5rem !important; -} - -.gap-5 { - gap: 3rem !important; -} - .justify-content-start { justify-content: flex-start !important; } @@ -7657,6 +8389,84 @@ textarea.form-control-lg { padding-left: 3rem !important; } +.gap-0 { + gap: 0 !important; +} + +.gap-1 { + gap: 0.25rem !important; +} + +.gap-2 { + gap: 0.5rem !important; +} + +.gap-3 { + gap: 1rem !important; +} + +.gap-4 { + gap: 1.5rem !important; +} + +.gap-5 { + gap: 3rem !important; +} + +.row-gap-0 { + row-gap: 0 !important; +} + +.row-gap-1 { + row-gap: 0.25rem !important; +} + +.row-gap-2 { + row-gap: 0.5rem !important; +} + +.row-gap-3 { + row-gap: 1rem !important; +} + +.row-gap-4 { + row-gap: 1.5rem !important; +} + +.row-gap-5 { + row-gap: 3rem !important; +} + +.column-gap-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; +} + +.column-gap-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; +} + +.column-gap-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; +} + +.column-gap-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; +} + +.column-gap-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; +} + +.column-gap-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; +} + .font-monospace { font-family: var(--bs-font-monospace) !important; } @@ -7693,18 +8503,26 @@ textarea.form-control-lg { font-style: normal !important; } -.fw-light { - font-weight: 300 !important; -} - .fw-lighter { font-weight: lighter !important; } +.fw-light { + font-weight: 300 !important; +} + .fw-normal { font-weight: 400 !important; } +.fw-medium { + font-weight: 500 !important; +} + +.fw-semibold { + font-weight: 600 !important; +} + .fw-bold { font-weight: 700 !important; } @@ -7837,7 +8655,7 @@ textarea.form-control-lg { .text-muted { --bs-text-opacity: 1; - color: #999 !important; + color: var(--bs-secondary-color) !important; } .text-black-50 { @@ -7850,6 +8668,21 @@ textarea.form-control-lg { color: rgba(255, 255, 255, 0.5) !important; } +.text-body-secondary { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; +} + +.text-body-tertiary { + --bs-text-opacity: 1; + color: var(--bs-tertiary-color) !important; +} + +.text-body-emphasis { + --bs-text-opacity: 1; + color: var(--bs-emphasis-color) !important; +} + .text-reset { --bs-text-opacity: 1; color: inherit !important; @@ -7871,6 +8704,204 @@ textarea.form-control-lg { --bs-text-opacity: 1; } +.text-primary-emphasis { + color: var(--bs-primary-text-emphasis) !important; +} + +.text-secondary-emphasis { + color: var(--bs-secondary-text-emphasis) !important; +} + +.text-success-emphasis { + color: var(--bs-success-text-emphasis) !important; +} + +.text-info-emphasis { + color: var(--bs-info-text-emphasis) !important; +} + +.text-warning-emphasis { + color: var(--bs-warning-text-emphasis) !important; +} + +.text-danger-emphasis { + color: var(--bs-danger-text-emphasis) !important; +} + +.text-light-emphasis { + color: var(--bs-light-text-emphasis) !important; +} + +.text-dark-emphasis { + color: var(--bs-dark-text-emphasis) !important; +} + +.link-opacity-10 { + --bs-link-opacity: 0.1; +} + +.link-opacity-10-hover:hover { + --bs-link-opacity: 0.1; +} + +.link-opacity-25 { + --bs-link-opacity: 0.25; +} + +.link-opacity-25-hover:hover { + --bs-link-opacity: 0.25; +} + +.link-opacity-50 { + --bs-link-opacity: 0.5; +} + +.link-opacity-50-hover:hover { + --bs-link-opacity: 0.5; +} + +.link-opacity-75 { + --bs-link-opacity: 0.75; +} + +.link-opacity-75-hover:hover { + --bs-link-opacity: 0.75; +} + +.link-opacity-100 { + --bs-link-opacity: 1; +} + +.link-opacity-100-hover:hover { + --bs-link-opacity: 1; +} + +.link-offset-1 { + text-underline-offset: 0.125em !important; +} + +.link-offset-1-hover:hover { + text-underline-offset: 0.125em !important; +} + +.link-offset-2 { + text-underline-offset: 0.25em !important; +} + +.link-offset-2-hover:hover { + text-underline-offset: 0.25em !important; +} + +.link-offset-3 { + text-underline-offset: 0.375em !important; +} + +.link-offset-3-hover:hover { + text-underline-offset: 0.375em !important; +} + +.link-underline-primary { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-secondary { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-success { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-info { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-warning { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-danger { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-light { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-dark { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important; +} + +.link-underline-opacity-0 { + --bs-link-underline-opacity: 0; +} + +.link-underline-opacity-0-hover:hover { + --bs-link-underline-opacity: 0; +} + +.link-underline-opacity-10 { + --bs-link-underline-opacity: 0.1; +} + +.link-underline-opacity-10-hover:hover { + --bs-link-underline-opacity: 0.1; +} + +.link-underline-opacity-25 { + --bs-link-underline-opacity: 0.25; +} + +.link-underline-opacity-25-hover:hover { + --bs-link-underline-opacity: 0.25; +} + +.link-underline-opacity-50 { + --bs-link-underline-opacity: 0.5; +} + +.link-underline-opacity-50-hover:hover { + --bs-link-underline-opacity: 0.5; +} + +.link-underline-opacity-75 { + --bs-link-underline-opacity: 0.75; +} + +.link-underline-opacity-75-hover:hover { + --bs-link-underline-opacity: 0.75; +} + +.link-underline-opacity-100 { + --bs-link-underline-opacity: 1; +} + +.link-underline-opacity-100-hover:hover { + --bs-link-underline-opacity: 1; +} + .bg-primary { --bs-bg-opacity: 1; background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; @@ -7931,6 +8962,16 @@ textarea.form-control-lg { background-color: transparent !important; } +.bg-body-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-body-tertiary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important; +} + .bg-opacity-10 { --bs-bg-opacity: 0.1; } @@ -7951,6 +8992,38 @@ textarea.form-control-lg { --bs-bg-opacity: 1; } +.bg-primary-subtle { + background-color: var(--bs-primary-bg-subtle) !important; +} + +.bg-secondary-subtle { + background-color: var(--bs-secondary-bg-subtle) !important; +} + +.bg-success-subtle { + background-color: var(--bs-success-bg-subtle) !important; +} + +.bg-info-subtle { + background-color: var(--bs-info-bg-subtle) !important; +} + +.bg-warning-subtle { + background-color: var(--bs-warning-bg-subtle) !important; +} + +.bg-danger-subtle { + background-color: var(--bs-danger-bg-subtle) !important; +} + +.bg-light-subtle { + background-color: var(--bs-light-bg-subtle) !important; +} + +.bg-dark-subtle { + background-color: var(--bs-dark-bg-subtle) !important; +} + .bg-gradient { background-image: var(--bs-gradient) !important; } @@ -7982,7 +9055,7 @@ textarea.form-control-lg { } .rounded { - border-radius: 0.25rem !important; + border-radius: var(--bs-border-radius) !important; } .rounded-0 { @@ -7990,15 +9063,23 @@ textarea.form-control-lg { } .rounded-1 { - border-radius: 0.2rem !important; + border-radius: var(--bs-border-radius-sm) !important; } .rounded-2 { - border-radius: 0.25rem !important; + border-radius: var(--bs-border-radius) !important; } .rounded-3 { - border-radius: 0.3rem !important; + border-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-4 { + border-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-5 { + border-radius: var(--bs-border-radius-xxl) !important; } .rounded-circle { @@ -8006,27 +9087,187 @@ textarea.form-control-lg { } .rounded-pill { - border-radius: 50rem !important; + border-radius: var(--bs-border-radius-pill) !important; } .rounded-top { - border-top-left-radius: 0.25rem !important; - border-top-right-radius: 0.25rem !important; + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} + +.rounded-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} + +.rounded-top-1 { + border-top-left-radius: var(--bs-border-radius-sm) !important; + border-top-right-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-top-2 { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} + +.rounded-top-3 { + border-top-left-radius: var(--bs-border-radius-lg) !important; + border-top-right-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-top-4 { + border-top-left-radius: var(--bs-border-radius-xl) !important; + border-top-right-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-top-5 { + border-top-left-radius: var(--bs-border-radius-xxl) !important; + border-top-right-radius: var(--bs-border-radius-xxl) !important; +} + +.rounded-top-circle { + border-top-left-radius: 50% !important; + border-top-right-radius: 50% !important; +} + +.rounded-top-pill { + border-top-left-radius: var(--bs-border-radius-pill) !important; + border-top-right-radius: var(--bs-border-radius-pill) !important; } .rounded-end { - border-top-right-radius: 0.25rem !important; - border-bottom-right-radius: 0.25rem !important; + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} + +.rounded-end-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +.rounded-end-1 { + border-top-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-right-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-end-2 { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} + +.rounded-end-3 { + border-top-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-right-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-end-4 { + border-top-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-right-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-end-5 { + border-top-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; +} + +.rounded-end-circle { + border-top-right-radius: 50% !important; + border-bottom-right-radius: 50% !important; +} + +.rounded-end-pill { + border-top-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-right-radius: var(--bs-border-radius-pill) !important; } .rounded-bottom { - border-bottom-right-radius: 0.25rem !important; - border-bottom-left-radius: 0.25rem !important; + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} + +.rounded-bottom-0 { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} + +.rounded-bottom-1 { + border-bottom-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-left-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-bottom-2 { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} + +.rounded-bottom-3 { + border-bottom-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-left-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-bottom-4 { + border-bottom-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-left-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-bottom-5 { + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; +} + +.rounded-bottom-circle { + border-bottom-right-radius: 50% !important; + border-bottom-left-radius: 50% !important; +} + +.rounded-bottom-pill { + border-bottom-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-left-radius: var(--bs-border-radius-pill) !important; } .rounded-start { - border-bottom-left-radius: 0.25rem !important; - border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} + +.rounded-start-0 { + border-bottom-left-radius: 0 !important; + border-top-left-radius: 0 !important; +} + +.rounded-start-1 { + border-bottom-left-radius: var(--bs-border-radius-sm) !important; + border-top-left-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-start-2 { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} + +.rounded-start-3 { + border-bottom-left-radius: var(--bs-border-radius-lg) !important; + border-top-left-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-start-4 { + border-bottom-left-radius: var(--bs-border-radius-xl) !important; + border-top-left-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-start-5 { + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; + border-top-left-radius: var(--bs-border-radius-xxl) !important; +} + +.rounded-start-circle { + border-bottom-left-radius: 50% !important; + border-top-left-radius: 50% !important; +} + +.rounded-start-pill { + border-bottom-left-radius: var(--bs-border-radius-pill) !important; + border-top-left-radius: var(--bs-border-radius-pill) !important; } .visible { @@ -8037,653 +9278,583 @@ textarea.form-control-lg { visibility: hidden !important; } +.z-n1 { + z-index: -1 !important; +} + +.z-0 { + z-index: 0 !important; +} + +.z-1 { + z-index: 1 !important; +} + +.z-2 { + z-index: 2 !important; +} + +.z-3 { + z-index: 3 !important; +} + @media (min-width: 576px) { .float-sm-start { float: left !important; } - .float-sm-end { float: right !important; } - .float-sm-none { float: none !important; } - + .object-fit-sm-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-sm-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-sm-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-sm-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-sm-none { + -o-object-fit: none !important; + object-fit: none !important; + } .d-sm-inline { display: inline !important; } - .d-sm-inline-block { display: inline-block !important; } - .d-sm-block { display: block !important; } - .d-sm-grid { display: grid !important; } - + .d-sm-inline-grid { + display: inline-grid !important; + } .d-sm-table { display: table !important; } - .d-sm-table-row { display: table-row !important; } - .d-sm-table-cell { display: table-cell !important; } - .d-sm-flex { display: flex !important; } - .d-sm-inline-flex { display: inline-flex !important; } - .d-sm-none { display: none !important; } - .flex-sm-fill { flex: 1 1 auto !important; } - .flex-sm-row { flex-direction: row !important; } - .flex-sm-column { flex-direction: column !important; } - .flex-sm-row-reverse { flex-direction: row-reverse !important; } - .flex-sm-column-reverse { flex-direction: column-reverse !important; } - .flex-sm-grow-0 { flex-grow: 0 !important; } - .flex-sm-grow-1 { flex-grow: 1 !important; } - .flex-sm-shrink-0 { flex-shrink: 0 !important; } - .flex-sm-shrink-1 { flex-shrink: 1 !important; } - .flex-sm-wrap { flex-wrap: wrap !important; } - .flex-sm-nowrap { flex-wrap: nowrap !important; } - .flex-sm-wrap-reverse { flex-wrap: wrap-reverse !important; } - - .gap-sm-0 { - gap: 0 !important; - } - - .gap-sm-1 { - gap: 0.25rem !important; - } - - .gap-sm-2 { - gap: 0.5rem !important; - } - - .gap-sm-3 { - gap: 1rem !important; - } - - .gap-sm-4 { - gap: 1.5rem !important; - } - - .gap-sm-5 { - gap: 3rem !important; - } - .justify-content-sm-start { justify-content: flex-start !important; } - .justify-content-sm-end { justify-content: flex-end !important; } - .justify-content-sm-center { justify-content: center !important; } - .justify-content-sm-between { justify-content: space-between !important; } - .justify-content-sm-around { justify-content: space-around !important; } - .justify-content-sm-evenly { justify-content: space-evenly !important; } - .align-items-sm-start { align-items: flex-start !important; } - .align-items-sm-end { align-items: flex-end !important; } - .align-items-sm-center { align-items: center !important; } - .align-items-sm-baseline { align-items: baseline !important; } - .align-items-sm-stretch { align-items: stretch !important; } - .align-content-sm-start { align-content: flex-start !important; } - .align-content-sm-end { align-content: flex-end !important; } - .align-content-sm-center { align-content: center !important; } - .align-content-sm-between { align-content: space-between !important; } - .align-content-sm-around { align-content: space-around !important; } - .align-content-sm-stretch { align-content: stretch !important; } - .align-self-sm-auto { align-self: auto !important; } - .align-self-sm-start { align-self: flex-start !important; } - .align-self-sm-end { align-self: flex-end !important; } - .align-self-sm-center { align-self: center !important; } - .align-self-sm-baseline { align-self: baseline !important; } - .align-self-sm-stretch { align-self: stretch !important; } - .order-sm-first { order: -1 !important; } - .order-sm-0 { order: 0 !important; } - .order-sm-1 { order: 1 !important; } - .order-sm-2 { order: 2 !important; } - .order-sm-3 { order: 3 !important; } - .order-sm-4 { order: 4 !important; } - .order-sm-5 { order: 5 !important; } - .order-sm-last { order: 6 !important; } - .m-sm-0 { margin: 0 !important; } - .m-sm-1 { margin: 0.25rem !important; } - .m-sm-2 { margin: 0.5rem !important; } - .m-sm-3 { margin: 1rem !important; } - .m-sm-4 { margin: 1.5rem !important; } - .m-sm-5 { margin: 3rem !important; } - .m-sm-auto { margin: auto !important; } - .mx-sm-0 { margin-right: 0 !important; margin-left: 0 !important; } - .mx-sm-1 { margin-right: 0.25rem !important; margin-left: 0.25rem !important; } - .mx-sm-2 { margin-right: 0.5rem !important; margin-left: 0.5rem !important; } - .mx-sm-3 { margin-right: 1rem !important; margin-left: 1rem !important; } - .mx-sm-4 { margin-right: 1.5rem !important; margin-left: 1.5rem !important; } - .mx-sm-5 { margin-right: 3rem !important; margin-left: 3rem !important; } - .mx-sm-auto { margin-right: auto !important; margin-left: auto !important; } - .my-sm-0 { margin-top: 0 !important; margin-bottom: 0 !important; } - .my-sm-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } - .my-sm-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } - .my-sm-3 { margin-top: 1rem !important; margin-bottom: 1rem !important; } - .my-sm-4 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } - .my-sm-5 { margin-top: 3rem !important; margin-bottom: 3rem !important; } - .my-sm-auto { margin-top: auto !important; margin-bottom: auto !important; } - .mt-sm-0 { margin-top: 0 !important; } - .mt-sm-1 { margin-top: 0.25rem !important; } - .mt-sm-2 { margin-top: 0.5rem !important; } - .mt-sm-3 { margin-top: 1rem !important; } - .mt-sm-4 { margin-top: 1.5rem !important; } - .mt-sm-5 { margin-top: 3rem !important; } - .mt-sm-auto { margin-top: auto !important; } - .me-sm-0 { margin-right: 0 !important; } - .me-sm-1 { margin-right: 0.25rem !important; } - .me-sm-2 { margin-right: 0.5rem !important; } - .me-sm-3 { margin-right: 1rem !important; } - .me-sm-4 { margin-right: 1.5rem !important; } - .me-sm-5 { margin-right: 3rem !important; } - .me-sm-auto { margin-right: auto !important; } - .mb-sm-0 { margin-bottom: 0 !important; } - .mb-sm-1 { margin-bottom: 0.25rem !important; } - .mb-sm-2 { margin-bottom: 0.5rem !important; } - .mb-sm-3 { margin-bottom: 1rem !important; } - .mb-sm-4 { margin-bottom: 1.5rem !important; } - .mb-sm-5 { margin-bottom: 3rem !important; } - .mb-sm-auto { margin-bottom: auto !important; } - .ms-sm-0 { margin-left: 0 !important; } - .ms-sm-1 { margin-left: 0.25rem !important; } - .ms-sm-2 { margin-left: 0.5rem !important; } - .ms-sm-3 { margin-left: 1rem !important; } - .ms-sm-4 { margin-left: 1.5rem !important; } - .ms-sm-5 { margin-left: 3rem !important; } - .ms-sm-auto { margin-left: auto !important; } - .p-sm-0 { padding: 0 !important; } - .p-sm-1 { padding: 0.25rem !important; } - .p-sm-2 { padding: 0.5rem !important; } - .p-sm-3 { padding: 1rem !important; } - .p-sm-4 { padding: 1.5rem !important; } - .p-sm-5 { padding: 3rem !important; } - .px-sm-0 { padding-right: 0 !important; padding-left: 0 !important; } - .px-sm-1 { padding-right: 0.25rem !important; padding-left: 0.25rem !important; } - .px-sm-2 { padding-right: 0.5rem !important; padding-left: 0.5rem !important; } - .px-sm-3 { padding-right: 1rem !important; padding-left: 1rem !important; } - .px-sm-4 { padding-right: 1.5rem !important; padding-left: 1.5rem !important; } - .px-sm-5 { padding-right: 3rem !important; padding-left: 3rem !important; } - .py-sm-0 { padding-top: 0 !important; padding-bottom: 0 !important; } - .py-sm-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } - .py-sm-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } - .py-sm-3 { padding-top: 1rem !important; padding-bottom: 1rem !important; } - .py-sm-4 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } - .py-sm-5 { padding-top: 3rem !important; padding-bottom: 3rem !important; } - .pt-sm-0 { padding-top: 0 !important; } - .pt-sm-1 { padding-top: 0.25rem !important; } - .pt-sm-2 { padding-top: 0.5rem !important; } - .pt-sm-3 { padding-top: 1rem !important; } - .pt-sm-4 { padding-top: 1.5rem !important; } - .pt-sm-5 { padding-top: 3rem !important; } - .pe-sm-0 { padding-right: 0 !important; } - .pe-sm-1 { padding-right: 0.25rem !important; } - .pe-sm-2 { padding-right: 0.5rem !important; } - .pe-sm-3 { padding-right: 1rem !important; } - .pe-sm-4 { padding-right: 1.5rem !important; } - .pe-sm-5 { padding-right: 3rem !important; } - .pb-sm-0 { padding-bottom: 0 !important; } - .pb-sm-1 { padding-bottom: 0.25rem !important; } - .pb-sm-2 { padding-bottom: 0.5rem !important; } - .pb-sm-3 { padding-bottom: 1rem !important; } - .pb-sm-4 { padding-bottom: 1.5rem !important; } - .pb-sm-5 { padding-bottom: 3rem !important; } - .ps-sm-0 { padding-left: 0 !important; } - .ps-sm-1 { padding-left: 0.25rem !important; } - .ps-sm-2 { padding-left: 0.5rem !important; } - .ps-sm-3 { padding-left: 1rem !important; } - .ps-sm-4 { padding-left: 1.5rem !important; } - .ps-sm-5 { padding-left: 3rem !important; } - + .gap-sm-0 { + gap: 0 !important; + } + .gap-sm-1 { + gap: 0.25rem !important; + } + .gap-sm-2 { + gap: 0.5rem !important; + } + .gap-sm-3 { + gap: 1rem !important; + } + .gap-sm-4 { + gap: 1.5rem !important; + } + .gap-sm-5 { + gap: 3rem !important; + } + .row-gap-sm-0 { + row-gap: 0 !important; + } + .row-gap-sm-1 { + row-gap: 0.25rem !important; + } + .row-gap-sm-2 { + row-gap: 0.5rem !important; + } + .row-gap-sm-3 { + row-gap: 1rem !important; + } + .row-gap-sm-4 { + row-gap: 1.5rem !important; + } + .row-gap-sm-5 { + row-gap: 3rem !important; + } + .column-gap-sm-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-sm-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-sm-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-sm-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-sm-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-sm-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } .text-sm-start { text-align: left !important; } - .text-sm-end { text-align: right !important; } - .text-sm-center { text-align: center !important; } @@ -8692,649 +9863,559 @@ textarea.form-control-lg { .float-md-start { float: left !important; } - .float-md-end { float: right !important; } - .float-md-none { float: none !important; } - + .object-fit-md-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-md-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-md-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-md-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-md-none { + -o-object-fit: none !important; + object-fit: none !important; + } .d-md-inline { display: inline !important; } - .d-md-inline-block { display: inline-block !important; } - .d-md-block { display: block !important; } - .d-md-grid { display: grid !important; } - + .d-md-inline-grid { + display: inline-grid !important; + } .d-md-table { display: table !important; } - .d-md-table-row { display: table-row !important; } - .d-md-table-cell { display: table-cell !important; } - .d-md-flex { display: flex !important; } - .d-md-inline-flex { display: inline-flex !important; } - .d-md-none { display: none !important; } - .flex-md-fill { flex: 1 1 auto !important; } - .flex-md-row { flex-direction: row !important; } - .flex-md-column { flex-direction: column !important; } - .flex-md-row-reverse { flex-direction: row-reverse !important; } - .flex-md-column-reverse { flex-direction: column-reverse !important; } - .flex-md-grow-0 { flex-grow: 0 !important; } - .flex-md-grow-1 { flex-grow: 1 !important; } - .flex-md-shrink-0 { flex-shrink: 0 !important; } - .flex-md-shrink-1 { flex-shrink: 1 !important; } - .flex-md-wrap { flex-wrap: wrap !important; } - .flex-md-nowrap { flex-wrap: nowrap !important; } - .flex-md-wrap-reverse { flex-wrap: wrap-reverse !important; } - - .gap-md-0 { - gap: 0 !important; - } - - .gap-md-1 { - gap: 0.25rem !important; - } - - .gap-md-2 { - gap: 0.5rem !important; - } - - .gap-md-3 { - gap: 1rem !important; - } - - .gap-md-4 { - gap: 1.5rem !important; - } - - .gap-md-5 { - gap: 3rem !important; - } - .justify-content-md-start { justify-content: flex-start !important; } - .justify-content-md-end { justify-content: flex-end !important; } - .justify-content-md-center { justify-content: center !important; } - .justify-content-md-between { justify-content: space-between !important; } - .justify-content-md-around { justify-content: space-around !important; } - .justify-content-md-evenly { justify-content: space-evenly !important; } - .align-items-md-start { align-items: flex-start !important; } - .align-items-md-end { align-items: flex-end !important; } - .align-items-md-center { align-items: center !important; } - .align-items-md-baseline { align-items: baseline !important; } - .align-items-md-stretch { align-items: stretch !important; } - .align-content-md-start { align-content: flex-start !important; } - .align-content-md-end { align-content: flex-end !important; } - .align-content-md-center { align-content: center !important; } - .align-content-md-between { align-content: space-between !important; } - .align-content-md-around { align-content: space-around !important; } - .align-content-md-stretch { align-content: stretch !important; } - .align-self-md-auto { align-self: auto !important; } - .align-self-md-start { align-self: flex-start !important; } - .align-self-md-end { align-self: flex-end !important; } - .align-self-md-center { align-self: center !important; } - .align-self-md-baseline { align-self: baseline !important; } - .align-self-md-stretch { align-self: stretch !important; } - .order-md-first { order: -1 !important; } - .order-md-0 { order: 0 !important; } - .order-md-1 { order: 1 !important; } - .order-md-2 { order: 2 !important; } - .order-md-3 { order: 3 !important; } - .order-md-4 { order: 4 !important; } - .order-md-5 { order: 5 !important; } - .order-md-last { order: 6 !important; } - .m-md-0 { margin: 0 !important; } - .m-md-1 { margin: 0.25rem !important; } - .m-md-2 { margin: 0.5rem !important; } - .m-md-3 { margin: 1rem !important; } - .m-md-4 { margin: 1.5rem !important; } - .m-md-5 { margin: 3rem !important; } - .m-md-auto { margin: auto !important; } - .mx-md-0 { margin-right: 0 !important; margin-left: 0 !important; } - .mx-md-1 { margin-right: 0.25rem !important; margin-left: 0.25rem !important; } - .mx-md-2 { margin-right: 0.5rem !important; margin-left: 0.5rem !important; } - .mx-md-3 { margin-right: 1rem !important; margin-left: 1rem !important; } - .mx-md-4 { margin-right: 1.5rem !important; margin-left: 1.5rem !important; } - .mx-md-5 { margin-right: 3rem !important; margin-left: 3rem !important; } - .mx-md-auto { margin-right: auto !important; margin-left: auto !important; } - .my-md-0 { margin-top: 0 !important; margin-bottom: 0 !important; } - .my-md-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } - .my-md-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } - .my-md-3 { margin-top: 1rem !important; margin-bottom: 1rem !important; } - .my-md-4 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } - .my-md-5 { margin-top: 3rem !important; margin-bottom: 3rem !important; } - .my-md-auto { margin-top: auto !important; margin-bottom: auto !important; } - .mt-md-0 { margin-top: 0 !important; } - .mt-md-1 { margin-top: 0.25rem !important; } - .mt-md-2 { margin-top: 0.5rem !important; } - .mt-md-3 { margin-top: 1rem !important; } - .mt-md-4 { margin-top: 1.5rem !important; } - .mt-md-5 { margin-top: 3rem !important; } - .mt-md-auto { margin-top: auto !important; } - .me-md-0 { margin-right: 0 !important; } - .me-md-1 { margin-right: 0.25rem !important; } - .me-md-2 { margin-right: 0.5rem !important; } - .me-md-3 { margin-right: 1rem !important; } - .me-md-4 { margin-right: 1.5rem !important; } - .me-md-5 { margin-right: 3rem !important; } - .me-md-auto { margin-right: auto !important; } - .mb-md-0 { margin-bottom: 0 !important; } - .mb-md-1 { margin-bottom: 0.25rem !important; } - .mb-md-2 { margin-bottom: 0.5rem !important; } - .mb-md-3 { margin-bottom: 1rem !important; } - .mb-md-4 { margin-bottom: 1.5rem !important; } - .mb-md-5 { margin-bottom: 3rem !important; } - .mb-md-auto { margin-bottom: auto !important; } - .ms-md-0 { margin-left: 0 !important; } - .ms-md-1 { margin-left: 0.25rem !important; } - .ms-md-2 { margin-left: 0.5rem !important; } - .ms-md-3 { margin-left: 1rem !important; } - .ms-md-4 { margin-left: 1.5rem !important; } - .ms-md-5 { margin-left: 3rem !important; } - .ms-md-auto { margin-left: auto !important; } - .p-md-0 { padding: 0 !important; } - .p-md-1 { padding: 0.25rem !important; } - .p-md-2 { padding: 0.5rem !important; } - .p-md-3 { padding: 1rem !important; } - .p-md-4 { padding: 1.5rem !important; } - .p-md-5 { padding: 3rem !important; } - .px-md-0 { padding-right: 0 !important; padding-left: 0 !important; } - .px-md-1 { padding-right: 0.25rem !important; padding-left: 0.25rem !important; } - .px-md-2 { padding-right: 0.5rem !important; padding-left: 0.5rem !important; } - .px-md-3 { padding-right: 1rem !important; padding-left: 1rem !important; } - .px-md-4 { padding-right: 1.5rem !important; padding-left: 1.5rem !important; } - .px-md-5 { padding-right: 3rem !important; padding-left: 3rem !important; } - .py-md-0 { padding-top: 0 !important; padding-bottom: 0 !important; } - .py-md-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } - .py-md-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } - .py-md-3 { padding-top: 1rem !important; padding-bottom: 1rem !important; } - .py-md-4 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } - .py-md-5 { padding-top: 3rem !important; padding-bottom: 3rem !important; } - .pt-md-0 { padding-top: 0 !important; } - .pt-md-1 { padding-top: 0.25rem !important; } - .pt-md-2 { padding-top: 0.5rem !important; } - .pt-md-3 { padding-top: 1rem !important; } - .pt-md-4 { padding-top: 1.5rem !important; } - .pt-md-5 { padding-top: 3rem !important; } - .pe-md-0 { padding-right: 0 !important; } - .pe-md-1 { padding-right: 0.25rem !important; } - .pe-md-2 { padding-right: 0.5rem !important; } - .pe-md-3 { padding-right: 1rem !important; } - .pe-md-4 { padding-right: 1.5rem !important; } - .pe-md-5 { padding-right: 3rem !important; } - .pb-md-0 { padding-bottom: 0 !important; } - .pb-md-1 { padding-bottom: 0.25rem !important; } - .pb-md-2 { padding-bottom: 0.5rem !important; } - .pb-md-3 { padding-bottom: 1rem !important; } - .pb-md-4 { padding-bottom: 1.5rem !important; } - .pb-md-5 { padding-bottom: 3rem !important; } - .ps-md-0 { padding-left: 0 !important; } - .ps-md-1 { padding-left: 0.25rem !important; } - .ps-md-2 { padding-left: 0.5rem !important; } - .ps-md-3 { padding-left: 1rem !important; } - .ps-md-4 { padding-left: 1.5rem !important; } - .ps-md-5 { padding-left: 3rem !important; } - + .gap-md-0 { + gap: 0 !important; + } + .gap-md-1 { + gap: 0.25rem !important; + } + .gap-md-2 { + gap: 0.5rem !important; + } + .gap-md-3 { + gap: 1rem !important; + } + .gap-md-4 { + gap: 1.5rem !important; + } + .gap-md-5 { + gap: 3rem !important; + } + .row-gap-md-0 { + row-gap: 0 !important; + } + .row-gap-md-1 { + row-gap: 0.25rem !important; + } + .row-gap-md-2 { + row-gap: 0.5rem !important; + } + .row-gap-md-3 { + row-gap: 1rem !important; + } + .row-gap-md-4 { + row-gap: 1.5rem !important; + } + .row-gap-md-5 { + row-gap: 3rem !important; + } + .column-gap-md-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-md-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-md-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-md-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-md-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-md-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } .text-md-start { text-align: left !important; } - .text-md-end { text-align: right !important; } - .text-md-center { text-align: center !important; } @@ -9343,649 +10424,559 @@ textarea.form-control-lg { .float-lg-start { float: left !important; } - .float-lg-end { float: right !important; } - .float-lg-none { float: none !important; } - + .object-fit-lg-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-lg-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-lg-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-lg-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-lg-none { + -o-object-fit: none !important; + object-fit: none !important; + } .d-lg-inline { display: inline !important; } - .d-lg-inline-block { display: inline-block !important; } - .d-lg-block { display: block !important; } - .d-lg-grid { display: grid !important; } - + .d-lg-inline-grid { + display: inline-grid !important; + } .d-lg-table { display: table !important; } - .d-lg-table-row { display: table-row !important; } - .d-lg-table-cell { display: table-cell !important; } - .d-lg-flex { display: flex !important; } - .d-lg-inline-flex { display: inline-flex !important; } - .d-lg-none { display: none !important; } - .flex-lg-fill { flex: 1 1 auto !important; } - .flex-lg-row { flex-direction: row !important; } - .flex-lg-column { flex-direction: column !important; } - .flex-lg-row-reverse { flex-direction: row-reverse !important; } - .flex-lg-column-reverse { flex-direction: column-reverse !important; } - .flex-lg-grow-0 { flex-grow: 0 !important; } - .flex-lg-grow-1 { flex-grow: 1 !important; } - .flex-lg-shrink-0 { flex-shrink: 0 !important; } - .flex-lg-shrink-1 { flex-shrink: 1 !important; } - .flex-lg-wrap { flex-wrap: wrap !important; } - .flex-lg-nowrap { flex-wrap: nowrap !important; } - .flex-lg-wrap-reverse { flex-wrap: wrap-reverse !important; } - - .gap-lg-0 { - gap: 0 !important; - } - - .gap-lg-1 { - gap: 0.25rem !important; - } - - .gap-lg-2 { - gap: 0.5rem !important; - } - - .gap-lg-3 { - gap: 1rem !important; - } - - .gap-lg-4 { - gap: 1.5rem !important; - } - - .gap-lg-5 { - gap: 3rem !important; - } - .justify-content-lg-start { justify-content: flex-start !important; } - .justify-content-lg-end { justify-content: flex-end !important; } - .justify-content-lg-center { justify-content: center !important; } - .justify-content-lg-between { justify-content: space-between !important; } - .justify-content-lg-around { justify-content: space-around !important; } - .justify-content-lg-evenly { justify-content: space-evenly !important; } - .align-items-lg-start { align-items: flex-start !important; } - .align-items-lg-end { align-items: flex-end !important; } - .align-items-lg-center { align-items: center !important; } - .align-items-lg-baseline { align-items: baseline !important; } - .align-items-lg-stretch { align-items: stretch !important; } - .align-content-lg-start { align-content: flex-start !important; } - .align-content-lg-end { align-content: flex-end !important; } - .align-content-lg-center { align-content: center !important; } - .align-content-lg-between { align-content: space-between !important; } - .align-content-lg-around { align-content: space-around !important; } - .align-content-lg-stretch { align-content: stretch !important; } - .align-self-lg-auto { align-self: auto !important; } - .align-self-lg-start { align-self: flex-start !important; } - .align-self-lg-end { align-self: flex-end !important; } - .align-self-lg-center { align-self: center !important; } - .align-self-lg-baseline { align-self: baseline !important; } - .align-self-lg-stretch { align-self: stretch !important; } - .order-lg-first { order: -1 !important; } - .order-lg-0 { order: 0 !important; } - .order-lg-1 { order: 1 !important; } - .order-lg-2 { order: 2 !important; } - .order-lg-3 { order: 3 !important; } - .order-lg-4 { order: 4 !important; } - .order-lg-5 { order: 5 !important; } - .order-lg-last { order: 6 !important; } - .m-lg-0 { margin: 0 !important; } - .m-lg-1 { margin: 0.25rem !important; } - .m-lg-2 { margin: 0.5rem !important; } - .m-lg-3 { margin: 1rem !important; } - .m-lg-4 { margin: 1.5rem !important; } - .m-lg-5 { margin: 3rem !important; } - .m-lg-auto { margin: auto !important; } - .mx-lg-0 { margin-right: 0 !important; margin-left: 0 !important; } - .mx-lg-1 { margin-right: 0.25rem !important; margin-left: 0.25rem !important; } - .mx-lg-2 { margin-right: 0.5rem !important; margin-left: 0.5rem !important; } - .mx-lg-3 { margin-right: 1rem !important; margin-left: 1rem !important; } - .mx-lg-4 { margin-right: 1.5rem !important; margin-left: 1.5rem !important; } - .mx-lg-5 { margin-right: 3rem !important; margin-left: 3rem !important; } - .mx-lg-auto { margin-right: auto !important; margin-left: auto !important; } - .my-lg-0 { margin-top: 0 !important; margin-bottom: 0 !important; } - .my-lg-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } - .my-lg-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } - .my-lg-3 { margin-top: 1rem !important; margin-bottom: 1rem !important; } - .my-lg-4 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } - .my-lg-5 { margin-top: 3rem !important; margin-bottom: 3rem !important; } - .my-lg-auto { margin-top: auto !important; margin-bottom: auto !important; } - .mt-lg-0 { margin-top: 0 !important; } - .mt-lg-1 { margin-top: 0.25rem !important; } - .mt-lg-2 { margin-top: 0.5rem !important; } - .mt-lg-3 { margin-top: 1rem !important; } - .mt-lg-4 { margin-top: 1.5rem !important; } - .mt-lg-5 { margin-top: 3rem !important; } - .mt-lg-auto { margin-top: auto !important; } - .me-lg-0 { margin-right: 0 !important; } - .me-lg-1 { margin-right: 0.25rem !important; } - .me-lg-2 { margin-right: 0.5rem !important; } - .me-lg-3 { margin-right: 1rem !important; } - .me-lg-4 { margin-right: 1.5rem !important; } - .me-lg-5 { margin-right: 3rem !important; } - .me-lg-auto { margin-right: auto !important; } - .mb-lg-0 { margin-bottom: 0 !important; } - .mb-lg-1 { margin-bottom: 0.25rem !important; } - .mb-lg-2 { margin-bottom: 0.5rem !important; } - .mb-lg-3 { margin-bottom: 1rem !important; } - .mb-lg-4 { margin-bottom: 1.5rem !important; } - .mb-lg-5 { margin-bottom: 3rem !important; } - .mb-lg-auto { margin-bottom: auto !important; } - .ms-lg-0 { margin-left: 0 !important; } - .ms-lg-1 { margin-left: 0.25rem !important; } - .ms-lg-2 { margin-left: 0.5rem !important; } - .ms-lg-3 { margin-left: 1rem !important; } - .ms-lg-4 { margin-left: 1.5rem !important; } - .ms-lg-5 { margin-left: 3rem !important; } - .ms-lg-auto { margin-left: auto !important; } - .p-lg-0 { padding: 0 !important; } - .p-lg-1 { padding: 0.25rem !important; } - .p-lg-2 { padding: 0.5rem !important; } - .p-lg-3 { padding: 1rem !important; } - .p-lg-4 { padding: 1.5rem !important; } - .p-lg-5 { padding: 3rem !important; } - .px-lg-0 { padding-right: 0 !important; padding-left: 0 !important; } - .px-lg-1 { padding-right: 0.25rem !important; padding-left: 0.25rem !important; } - .px-lg-2 { padding-right: 0.5rem !important; padding-left: 0.5rem !important; } - .px-lg-3 { padding-right: 1rem !important; padding-left: 1rem !important; } - .px-lg-4 { padding-right: 1.5rem !important; padding-left: 1.5rem !important; } - .px-lg-5 { padding-right: 3rem !important; padding-left: 3rem !important; } - .py-lg-0 { padding-top: 0 !important; padding-bottom: 0 !important; } - .py-lg-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } - .py-lg-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } - .py-lg-3 { padding-top: 1rem !important; padding-bottom: 1rem !important; } - .py-lg-4 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } - .py-lg-5 { padding-top: 3rem !important; padding-bottom: 3rem !important; } - .pt-lg-0 { padding-top: 0 !important; } - .pt-lg-1 { padding-top: 0.25rem !important; } - .pt-lg-2 { padding-top: 0.5rem !important; } - .pt-lg-3 { padding-top: 1rem !important; } - .pt-lg-4 { padding-top: 1.5rem !important; } - .pt-lg-5 { padding-top: 3rem !important; } - .pe-lg-0 { padding-right: 0 !important; } - .pe-lg-1 { padding-right: 0.25rem !important; } - .pe-lg-2 { padding-right: 0.5rem !important; } - .pe-lg-3 { padding-right: 1rem !important; } - .pe-lg-4 { padding-right: 1.5rem !important; } - .pe-lg-5 { padding-right: 3rem !important; } - .pb-lg-0 { padding-bottom: 0 !important; } - .pb-lg-1 { padding-bottom: 0.25rem !important; } - .pb-lg-2 { padding-bottom: 0.5rem !important; } - .pb-lg-3 { padding-bottom: 1rem !important; } - .pb-lg-4 { padding-bottom: 1.5rem !important; } - .pb-lg-5 { padding-bottom: 3rem !important; } - .ps-lg-0 { padding-left: 0 !important; } - .ps-lg-1 { padding-left: 0.25rem !important; } - .ps-lg-2 { padding-left: 0.5rem !important; } - .ps-lg-3 { padding-left: 1rem !important; } - .ps-lg-4 { padding-left: 1.5rem !important; } - .ps-lg-5 { padding-left: 3rem !important; } - + .gap-lg-0 { + gap: 0 !important; + } + .gap-lg-1 { + gap: 0.25rem !important; + } + .gap-lg-2 { + gap: 0.5rem !important; + } + .gap-lg-3 { + gap: 1rem !important; + } + .gap-lg-4 { + gap: 1.5rem !important; + } + .gap-lg-5 { + gap: 3rem !important; + } + .row-gap-lg-0 { + row-gap: 0 !important; + } + .row-gap-lg-1 { + row-gap: 0.25rem !important; + } + .row-gap-lg-2 { + row-gap: 0.5rem !important; + } + .row-gap-lg-3 { + row-gap: 1rem !important; + } + .row-gap-lg-4 { + row-gap: 1.5rem !important; + } + .row-gap-lg-5 { + row-gap: 3rem !important; + } + .column-gap-lg-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-lg-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-lg-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-lg-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-lg-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-lg-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } .text-lg-start { text-align: left !important; } - .text-lg-end { text-align: right !important; } - .text-lg-center { text-align: center !important; } @@ -9994,649 +10985,559 @@ textarea.form-control-lg { .float-xl-start { float: left !important; } - .float-xl-end { float: right !important; } - .float-xl-none { float: none !important; } - + .object-fit-xl-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-xl-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-xl-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-xl-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-xl-none { + -o-object-fit: none !important; + object-fit: none !important; + } .d-xl-inline { display: inline !important; } - .d-xl-inline-block { display: inline-block !important; } - .d-xl-block { display: block !important; } - .d-xl-grid { display: grid !important; } - + .d-xl-inline-grid { + display: inline-grid !important; + } .d-xl-table { display: table !important; } - .d-xl-table-row { display: table-row !important; } - .d-xl-table-cell { display: table-cell !important; } - .d-xl-flex { display: flex !important; } - .d-xl-inline-flex { display: inline-flex !important; } - .d-xl-none { display: none !important; } - .flex-xl-fill { flex: 1 1 auto !important; } - .flex-xl-row { flex-direction: row !important; } - .flex-xl-column { flex-direction: column !important; } - .flex-xl-row-reverse { flex-direction: row-reverse !important; } - .flex-xl-column-reverse { flex-direction: column-reverse !important; } - .flex-xl-grow-0 { flex-grow: 0 !important; } - .flex-xl-grow-1 { flex-grow: 1 !important; } - .flex-xl-shrink-0 { flex-shrink: 0 !important; } - .flex-xl-shrink-1 { flex-shrink: 1 !important; } - .flex-xl-wrap { flex-wrap: wrap !important; } - .flex-xl-nowrap { flex-wrap: nowrap !important; } - .flex-xl-wrap-reverse { flex-wrap: wrap-reverse !important; } - - .gap-xl-0 { - gap: 0 !important; - } - - .gap-xl-1 { - gap: 0.25rem !important; - } - - .gap-xl-2 { - gap: 0.5rem !important; - } - - .gap-xl-3 { - gap: 1rem !important; - } - - .gap-xl-4 { - gap: 1.5rem !important; - } - - .gap-xl-5 { - gap: 3rem !important; - } - .justify-content-xl-start { justify-content: flex-start !important; } - .justify-content-xl-end { justify-content: flex-end !important; } - .justify-content-xl-center { justify-content: center !important; } - .justify-content-xl-between { justify-content: space-between !important; } - .justify-content-xl-around { justify-content: space-around !important; } - .justify-content-xl-evenly { justify-content: space-evenly !important; } - .align-items-xl-start { align-items: flex-start !important; } - .align-items-xl-end { align-items: flex-end !important; } - .align-items-xl-center { align-items: center !important; } - .align-items-xl-baseline { align-items: baseline !important; } - .align-items-xl-stretch { align-items: stretch !important; } - .align-content-xl-start { align-content: flex-start !important; } - .align-content-xl-end { align-content: flex-end !important; } - .align-content-xl-center { align-content: center !important; } - .align-content-xl-between { align-content: space-between !important; } - .align-content-xl-around { align-content: space-around !important; } - .align-content-xl-stretch { align-content: stretch !important; } - .align-self-xl-auto { align-self: auto !important; } - .align-self-xl-start { align-self: flex-start !important; } - .align-self-xl-end { align-self: flex-end !important; } - .align-self-xl-center { align-self: center !important; } - .align-self-xl-baseline { align-self: baseline !important; } - .align-self-xl-stretch { align-self: stretch !important; } - .order-xl-first { order: -1 !important; } - .order-xl-0 { order: 0 !important; } - .order-xl-1 { order: 1 !important; } - .order-xl-2 { order: 2 !important; } - .order-xl-3 { order: 3 !important; } - .order-xl-4 { order: 4 !important; } - .order-xl-5 { order: 5 !important; } - .order-xl-last { order: 6 !important; } - .m-xl-0 { margin: 0 !important; } - .m-xl-1 { margin: 0.25rem !important; } - .m-xl-2 { margin: 0.5rem !important; } - .m-xl-3 { margin: 1rem !important; } - .m-xl-4 { margin: 1.5rem !important; } - .m-xl-5 { margin: 3rem !important; } - .m-xl-auto { margin: auto !important; } - .mx-xl-0 { margin-right: 0 !important; margin-left: 0 !important; } - .mx-xl-1 { margin-right: 0.25rem !important; margin-left: 0.25rem !important; } - .mx-xl-2 { margin-right: 0.5rem !important; margin-left: 0.5rem !important; } - .mx-xl-3 { margin-right: 1rem !important; margin-left: 1rem !important; } - .mx-xl-4 { margin-right: 1.5rem !important; margin-left: 1.5rem !important; } - .mx-xl-5 { margin-right: 3rem !important; margin-left: 3rem !important; } - .mx-xl-auto { margin-right: auto !important; margin-left: auto !important; } - .my-xl-0 { margin-top: 0 !important; margin-bottom: 0 !important; } - .my-xl-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } - .my-xl-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } - .my-xl-3 { margin-top: 1rem !important; margin-bottom: 1rem !important; } - .my-xl-4 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } - .my-xl-5 { margin-top: 3rem !important; margin-bottom: 3rem !important; } - .my-xl-auto { margin-top: auto !important; margin-bottom: auto !important; } - .mt-xl-0 { margin-top: 0 !important; } - .mt-xl-1 { margin-top: 0.25rem !important; } - .mt-xl-2 { margin-top: 0.5rem !important; } - .mt-xl-3 { margin-top: 1rem !important; } - .mt-xl-4 { margin-top: 1.5rem !important; } - .mt-xl-5 { margin-top: 3rem !important; } - .mt-xl-auto { margin-top: auto !important; } - .me-xl-0 { margin-right: 0 !important; } - .me-xl-1 { margin-right: 0.25rem !important; } - .me-xl-2 { margin-right: 0.5rem !important; } - .me-xl-3 { margin-right: 1rem !important; } - .me-xl-4 { margin-right: 1.5rem !important; } - .me-xl-5 { margin-right: 3rem !important; } - .me-xl-auto { margin-right: auto !important; } - .mb-xl-0 { margin-bottom: 0 !important; } - .mb-xl-1 { margin-bottom: 0.25rem !important; } - .mb-xl-2 { margin-bottom: 0.5rem !important; } - .mb-xl-3 { margin-bottom: 1rem !important; } - .mb-xl-4 { margin-bottom: 1.5rem !important; } - .mb-xl-5 { margin-bottom: 3rem !important; } - .mb-xl-auto { margin-bottom: auto !important; } - .ms-xl-0 { margin-left: 0 !important; } - .ms-xl-1 { margin-left: 0.25rem !important; } - .ms-xl-2 { margin-left: 0.5rem !important; } - .ms-xl-3 { margin-left: 1rem !important; } - .ms-xl-4 { margin-left: 1.5rem !important; } - .ms-xl-5 { margin-left: 3rem !important; } - .ms-xl-auto { margin-left: auto !important; } - .p-xl-0 { padding: 0 !important; } - .p-xl-1 { padding: 0.25rem !important; } - .p-xl-2 { padding: 0.5rem !important; } - .p-xl-3 { padding: 1rem !important; } - .p-xl-4 { padding: 1.5rem !important; } - .p-xl-5 { padding: 3rem !important; } - .px-xl-0 { padding-right: 0 !important; padding-left: 0 !important; } - .px-xl-1 { padding-right: 0.25rem !important; padding-left: 0.25rem !important; } - .px-xl-2 { padding-right: 0.5rem !important; padding-left: 0.5rem !important; } - .px-xl-3 { padding-right: 1rem !important; padding-left: 1rem !important; } - .px-xl-4 { padding-right: 1.5rem !important; padding-left: 1.5rem !important; } - .px-xl-5 { padding-right: 3rem !important; padding-left: 3rem !important; } - .py-xl-0 { padding-top: 0 !important; padding-bottom: 0 !important; } - .py-xl-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } - .py-xl-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } - .py-xl-3 { padding-top: 1rem !important; padding-bottom: 1rem !important; } - .py-xl-4 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } - .py-xl-5 { padding-top: 3rem !important; padding-bottom: 3rem !important; } - .pt-xl-0 { padding-top: 0 !important; } - .pt-xl-1 { padding-top: 0.25rem !important; } - .pt-xl-2 { padding-top: 0.5rem !important; } - .pt-xl-3 { padding-top: 1rem !important; } - .pt-xl-4 { padding-top: 1.5rem !important; } - .pt-xl-5 { padding-top: 3rem !important; } - .pe-xl-0 { padding-right: 0 !important; } - .pe-xl-1 { padding-right: 0.25rem !important; } - .pe-xl-2 { padding-right: 0.5rem !important; } - .pe-xl-3 { padding-right: 1rem !important; } - .pe-xl-4 { padding-right: 1.5rem !important; } - .pe-xl-5 { padding-right: 3rem !important; } - .pb-xl-0 { padding-bottom: 0 !important; } - .pb-xl-1 { padding-bottom: 0.25rem !important; } - .pb-xl-2 { padding-bottom: 0.5rem !important; } - .pb-xl-3 { padding-bottom: 1rem !important; } - .pb-xl-4 { padding-bottom: 1.5rem !important; } - .pb-xl-5 { padding-bottom: 3rem !important; } - .ps-xl-0 { padding-left: 0 !important; } - .ps-xl-1 { padding-left: 0.25rem !important; } - .ps-xl-2 { padding-left: 0.5rem !important; } - .ps-xl-3 { padding-left: 1rem !important; } - .ps-xl-4 { padding-left: 1.5rem !important; } - .ps-xl-5 { padding-left: 3rem !important; } - + .gap-xl-0 { + gap: 0 !important; + } + .gap-xl-1 { + gap: 0.25rem !important; + } + .gap-xl-2 { + gap: 0.5rem !important; + } + .gap-xl-3 { + gap: 1rem !important; + } + .gap-xl-4 { + gap: 1.5rem !important; + } + .gap-xl-5 { + gap: 3rem !important; + } + .row-gap-xl-0 { + row-gap: 0 !important; + } + .row-gap-xl-1 { + row-gap: 0.25rem !important; + } + .row-gap-xl-2 { + row-gap: 0.5rem !important; + } + .row-gap-xl-3 { + row-gap: 1rem !important; + } + .row-gap-xl-4 { + row-gap: 1.5rem !important; + } + .row-gap-xl-5 { + row-gap: 3rem !important; + } + .column-gap-xl-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-xl-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-xl-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-xl-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-xl-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-xl-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } .text-xl-start { text-align: left !important; } - .text-xl-end { text-align: right !important; } - .text-xl-center { text-align: center !important; } @@ -10645,649 +11546,559 @@ textarea.form-control-lg { .float-xxl-start { float: left !important; } - .float-xxl-end { float: right !important; } - .float-xxl-none { float: none !important; } - + .object-fit-xxl-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-xxl-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-xxl-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-xxl-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-xxl-none { + -o-object-fit: none !important; + object-fit: none !important; + } .d-xxl-inline { display: inline !important; } - .d-xxl-inline-block { display: inline-block !important; } - .d-xxl-block { display: block !important; } - .d-xxl-grid { display: grid !important; } - + .d-xxl-inline-grid { + display: inline-grid !important; + } .d-xxl-table { display: table !important; } - .d-xxl-table-row { display: table-row !important; } - .d-xxl-table-cell { display: table-cell !important; } - .d-xxl-flex { display: flex !important; } - .d-xxl-inline-flex { display: inline-flex !important; } - .d-xxl-none { display: none !important; } - .flex-xxl-fill { flex: 1 1 auto !important; } - .flex-xxl-row { flex-direction: row !important; } - .flex-xxl-column { flex-direction: column !important; } - .flex-xxl-row-reverse { flex-direction: row-reverse !important; } - .flex-xxl-column-reverse { flex-direction: column-reverse !important; } - .flex-xxl-grow-0 { flex-grow: 0 !important; } - .flex-xxl-grow-1 { flex-grow: 1 !important; } - .flex-xxl-shrink-0 { flex-shrink: 0 !important; } - .flex-xxl-shrink-1 { flex-shrink: 1 !important; } - .flex-xxl-wrap { flex-wrap: wrap !important; } - .flex-xxl-nowrap { flex-wrap: nowrap !important; } - .flex-xxl-wrap-reverse { flex-wrap: wrap-reverse !important; } - - .gap-xxl-0 { - gap: 0 !important; - } - - .gap-xxl-1 { - gap: 0.25rem !important; - } - - .gap-xxl-2 { - gap: 0.5rem !important; - } - - .gap-xxl-3 { - gap: 1rem !important; - } - - .gap-xxl-4 { - gap: 1.5rem !important; - } - - .gap-xxl-5 { - gap: 3rem !important; - } - .justify-content-xxl-start { justify-content: flex-start !important; } - .justify-content-xxl-end { justify-content: flex-end !important; } - .justify-content-xxl-center { justify-content: center !important; } - .justify-content-xxl-between { justify-content: space-between !important; } - .justify-content-xxl-around { justify-content: space-around !important; } - .justify-content-xxl-evenly { justify-content: space-evenly !important; } - .align-items-xxl-start { align-items: flex-start !important; } - .align-items-xxl-end { align-items: flex-end !important; } - .align-items-xxl-center { align-items: center !important; } - .align-items-xxl-baseline { align-items: baseline !important; } - .align-items-xxl-stretch { align-items: stretch !important; } - .align-content-xxl-start { align-content: flex-start !important; } - .align-content-xxl-end { align-content: flex-end !important; } - .align-content-xxl-center { align-content: center !important; } - .align-content-xxl-between { align-content: space-between !important; } - .align-content-xxl-around { align-content: space-around !important; } - .align-content-xxl-stretch { align-content: stretch !important; } - .align-self-xxl-auto { align-self: auto !important; } - .align-self-xxl-start { align-self: flex-start !important; } - .align-self-xxl-end { align-self: flex-end !important; } - .align-self-xxl-center { align-self: center !important; } - .align-self-xxl-baseline { align-self: baseline !important; } - .align-self-xxl-stretch { align-self: stretch !important; } - .order-xxl-first { order: -1 !important; } - .order-xxl-0 { order: 0 !important; } - .order-xxl-1 { order: 1 !important; } - .order-xxl-2 { order: 2 !important; } - .order-xxl-3 { order: 3 !important; } - .order-xxl-4 { order: 4 !important; } - .order-xxl-5 { order: 5 !important; } - .order-xxl-last { order: 6 !important; } - .m-xxl-0 { margin: 0 !important; } - .m-xxl-1 { margin: 0.25rem !important; } - .m-xxl-2 { margin: 0.5rem !important; } - .m-xxl-3 { margin: 1rem !important; } - .m-xxl-4 { margin: 1.5rem !important; } - .m-xxl-5 { margin: 3rem !important; } - .m-xxl-auto { margin: auto !important; } - .mx-xxl-0 { margin-right: 0 !important; margin-left: 0 !important; } - .mx-xxl-1 { margin-right: 0.25rem !important; margin-left: 0.25rem !important; } - .mx-xxl-2 { margin-right: 0.5rem !important; margin-left: 0.5rem !important; } - .mx-xxl-3 { margin-right: 1rem !important; margin-left: 1rem !important; } - .mx-xxl-4 { margin-right: 1.5rem !important; margin-left: 1.5rem !important; } - .mx-xxl-5 { margin-right: 3rem !important; margin-left: 3rem !important; } - .mx-xxl-auto { margin-right: auto !important; margin-left: auto !important; } - .my-xxl-0 { margin-top: 0 !important; margin-bottom: 0 !important; } - .my-xxl-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } - .my-xxl-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } - .my-xxl-3 { margin-top: 1rem !important; margin-bottom: 1rem !important; } - .my-xxl-4 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } - .my-xxl-5 { margin-top: 3rem !important; margin-bottom: 3rem !important; } - .my-xxl-auto { margin-top: auto !important; margin-bottom: auto !important; } - .mt-xxl-0 { margin-top: 0 !important; } - .mt-xxl-1 { margin-top: 0.25rem !important; } - .mt-xxl-2 { margin-top: 0.5rem !important; } - .mt-xxl-3 { margin-top: 1rem !important; } - .mt-xxl-4 { margin-top: 1.5rem !important; } - .mt-xxl-5 { margin-top: 3rem !important; } - .mt-xxl-auto { margin-top: auto !important; } - .me-xxl-0 { margin-right: 0 !important; } - .me-xxl-1 { margin-right: 0.25rem !important; } - .me-xxl-2 { margin-right: 0.5rem !important; } - .me-xxl-3 { margin-right: 1rem !important; } - .me-xxl-4 { margin-right: 1.5rem !important; } - .me-xxl-5 { margin-right: 3rem !important; } - .me-xxl-auto { margin-right: auto !important; } - .mb-xxl-0 { margin-bottom: 0 !important; } - .mb-xxl-1 { margin-bottom: 0.25rem !important; } - .mb-xxl-2 { margin-bottom: 0.5rem !important; } - .mb-xxl-3 { margin-bottom: 1rem !important; } - .mb-xxl-4 { margin-bottom: 1.5rem !important; } - .mb-xxl-5 { margin-bottom: 3rem !important; } - .mb-xxl-auto { margin-bottom: auto !important; } - .ms-xxl-0 { margin-left: 0 !important; } - .ms-xxl-1 { margin-left: 0.25rem !important; } - .ms-xxl-2 { margin-left: 0.5rem !important; } - .ms-xxl-3 { margin-left: 1rem !important; } - .ms-xxl-4 { margin-left: 1.5rem !important; } - .ms-xxl-5 { margin-left: 3rem !important; } - .ms-xxl-auto { margin-left: auto !important; } - .p-xxl-0 { padding: 0 !important; } - .p-xxl-1 { padding: 0.25rem !important; } - .p-xxl-2 { padding: 0.5rem !important; } - .p-xxl-3 { padding: 1rem !important; } - .p-xxl-4 { padding: 1.5rem !important; } - .p-xxl-5 { padding: 3rem !important; } - .px-xxl-0 { padding-right: 0 !important; padding-left: 0 !important; } - .px-xxl-1 { padding-right: 0.25rem !important; padding-left: 0.25rem !important; } - .px-xxl-2 { padding-right: 0.5rem !important; padding-left: 0.5rem !important; } - .px-xxl-3 { padding-right: 1rem !important; padding-left: 1rem !important; } - .px-xxl-4 { padding-right: 1.5rem !important; padding-left: 1.5rem !important; } - .px-xxl-5 { padding-right: 3rem !important; padding-left: 3rem !important; } - .py-xxl-0 { padding-top: 0 !important; padding-bottom: 0 !important; } - .py-xxl-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } - .py-xxl-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } - .py-xxl-3 { padding-top: 1rem !important; padding-bottom: 1rem !important; } - .py-xxl-4 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } - .py-xxl-5 { padding-top: 3rem !important; padding-bottom: 3rem !important; } - .pt-xxl-0 { padding-top: 0 !important; } - .pt-xxl-1 { padding-top: 0.25rem !important; } - .pt-xxl-2 { padding-top: 0.5rem !important; } - .pt-xxl-3 { padding-top: 1rem !important; } - .pt-xxl-4 { padding-top: 1.5rem !important; } - .pt-xxl-5 { padding-top: 3rem !important; } - .pe-xxl-0 { padding-right: 0 !important; } - .pe-xxl-1 { padding-right: 0.25rem !important; } - .pe-xxl-2 { padding-right: 0.5rem !important; } - .pe-xxl-3 { padding-right: 1rem !important; } - .pe-xxl-4 { padding-right: 1.5rem !important; } - .pe-xxl-5 { padding-right: 3rem !important; } - .pb-xxl-0 { padding-bottom: 0 !important; } - .pb-xxl-1 { padding-bottom: 0.25rem !important; } - .pb-xxl-2 { padding-bottom: 0.5rem !important; } - .pb-xxl-3 { padding-bottom: 1rem !important; } - .pb-xxl-4 { padding-bottom: 1.5rem !important; } - .pb-xxl-5 { padding-bottom: 3rem !important; } - .ps-xxl-0 { padding-left: 0 !important; } - .ps-xxl-1 { padding-left: 0.25rem !important; } - .ps-xxl-2 { padding-left: 0.5rem !important; } - .ps-xxl-3 { padding-left: 1rem !important; } - .ps-xxl-4 { padding-left: 1.5rem !important; } - .ps-xxl-5 { padding-left: 3rem !important; } - + .gap-xxl-0 { + gap: 0 !important; + } + .gap-xxl-1 { + gap: 0.25rem !important; + } + .gap-xxl-2 { + gap: 0.5rem !important; + } + .gap-xxl-3 { + gap: 1rem !important; + } + .gap-xxl-4 { + gap: 1.5rem !important; + } + .gap-xxl-5 { + gap: 3rem !important; + } + .row-gap-xxl-0 { + row-gap: 0 !important; + } + .row-gap-xxl-1 { + row-gap: 0.25rem !important; + } + .row-gap-xxl-2 { + row-gap: 0.5rem !important; + } + .row-gap-xxl-3 { + row-gap: 1rem !important; + } + .row-gap-xxl-4 { + row-gap: 1.5rem !important; + } + .row-gap-xxl-5 { + row-gap: 3rem !important; + } + .column-gap-xxl-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-xxl-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-xxl-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-xxl-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-xxl-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-xxl-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } .text-xxl-start { text-align: left !important; } - .text-xxl-end { text-align: right !important; } - .text-xxl-center { text-align: center !important; } @@ -11296,15 +12107,12 @@ textarea.form-control-lg { .fs-1 { font-size: 2.5rem !important; } - .fs-2 { font-size: 2rem !important; } - .fs-3 { font-size: 1.75rem !important; } - .fs-4 { font-size: 1.5rem !important; } @@ -11313,39 +12121,33 @@ textarea.form-control-lg { .d-print-inline { display: inline !important; } - .d-print-inline-block { display: inline-block !important; } - .d-print-block { display: block !important; } - .d-print-grid { display: grid !important; } - + .d-print-inline-grid { + display: inline-grid !important; + } .d-print-table { display: table !important; } - .d-print-table-row { display: table-row !important; } - .d-print-table-cell { display: table-cell !important; } - .d-print-flex { display: flex !important; } - .d-print-inline-flex { display: inline-flex !important; } - .d-print-none { display: none !important; } @@ -11378,6 +12180,9 @@ textarea.form-control-lg { .navbar.bg-dark { border-color: #4d4d4d; } +.navbar.bg-body-secondary, .navbar.bg-body-tertiary { + border-color: rgba(0, 0, 0, 0.1); +} .btn { border-style: solid; @@ -11441,6 +12246,10 @@ textarea.form-control-lg { border-color: #4d4d4d; } +.btn-outline-secondary { + color: var(--bs-tertiary-color); +} + [class*=btn-outline] { border-top-width: 1px; } @@ -11462,6 +12271,11 @@ textarea.form-control-lg { color: #999; } +.table-secondary, +.table-light { + --bs-table-color: #222; +} + .form-control { box-shadow: inset 0 2px 0 rgba(0, 0, 0, 0.075); } @@ -11473,16 +12287,17 @@ textarea.form-control-lg { } .nav-tabs .nav-link { - color: #222; + color: var(--bs-body-color); } .nav-tabs .nav-link, .nav-tabs .nav-link.disabled, .nav-tabs .nav-link.disabled:hover, .nav-tabs .nav-link.disabled:focus { margin-top: 6px; - border-color: #f0f0f0; + border-color: var(--bs-border-color); transition: padding-bottom 0.2s ease-in-out, margin-top 0.2s ease-in-out, border-bottom 0.2s ease-in-out; } .nav-tabs .nav-link:not(.disabled):hover, .nav-tabs .nav-link:not(.disabled):focus, .nav-tabs .nav-link.active { padding-bottom: calc(0.5rem + 6px); margin-top: 0; + color: var(--bs-body-color); border-bottom-color: transparent; } .nav-tabs.nav-justified > li { @@ -11497,7 +12312,7 @@ textarea.form-control-lg { } .breadcrumb { - border-color: #d8d8d8; + border-color: var(--bs-border-color); border-style: solid; border-width: 0 1px 4px 1px; } diff --git a/data/web/css/themes/mailcow-darkmode.css b/data/web/css/themes/mailcow-darkmode.css index 83befeaf..901a6bcc 100644 --- a/data/web/css/themes/mailcow-darkmode.css +++ b/data/web/css/themes/mailcow-darkmode.css @@ -1,62 +1,103 @@ +/* theme tokens, override in css/themes//dark.css */ +:root { + --mc-body-bg: #1c1c1e; + --mc-body-color: #f2f2f7; + --mc-surface: #2c2c2e; + --mc-surface-alt: #282828; + --mc-text: #ccc; + --mc-text-soft: #bbb; + --mc-muted: #8e8e93; + --mc-border: #555; + --mc-tab-border: #444444; + --mc-link: #6fc7e9; + --mc-link-hover: #3daedb; + --mc-btn-bg: #5e5e5e; + --mc-btn-border: #4c4c4e; + --mc-input-bg: #424242; + --mc-input-color: #e2e2e2; + --mc-input-border: #999; + --mc-dropdown-bg: #424242; + --mc-table-bg: #3a3a3a; + --mc-table-stripe: #282828; + --mc-table-stripe-row: #424242; + --mc-table-hover: #343434; + --mc-table-border: #5c5c5c; + --mc-progress-bg: #555; + --mc-placeholder: #d4d4d4; + --mc-btn-outline-color: #e0e0e0; + --mc-btn-outline-border: #7a7a7a; + --mc-btn-outline-hover-bg: #5c5c5c; + --mc-btn-outline-active-bg: #7a7a7a; + --mc-btn-light-active-color: #f2f2f7; + --mc-btn-light-active-bg: #242424; + --mc-btn-light-active-border: #1c1c1e; + --mc-btn-dark-bg: #242424; + --mc-input-disabled-bg: #6e6e6e; + --mc-input-disabled-color: #a8a8a8; + --mc-list-header-bg: #444; + --mc-list-details-bg: #555; + --mc-chip-bg: #444; + --mc-table-child-bg: #414141; + --mc-dtr-bg: #7a7a7a; + --mc-dtr-border: #5c5c5c; + --mc-dtr-color: #e0e0e0; + --mc-dtr-hover-bg: #7a7a7a; + --mc-dtr-active-bg: #949494; +} + body { - background-color: #1c1c1e; - color: #f2f2f7; + background-color: var(--mc-body-bg); + color: var(--mc-body-color); } .card { - border: 1px solid #2c2c2e; - background-color: #2c2c2e; + border: 1px solid var(--mc-surface); + background-color: var(--mc-surface); } legend { - color: #f2f2f7; + color: var(--mc-body-color); } .card-header { - color: #8e8e93; - background-color: #1c1c1e; + color: var(--mc-muted); + background-color: var(--mc-body-bg); border-color: transparent; } .card-body { - --bs-card-color: #bbb; + --bs-card-color: var(--mc-text-soft); } .btn-secondary, .paginate_button, .page-link, .btn-light { - color: #f2f2f7 !important; - background-color: #5e5e5e !important; - border-color: #4c4c4e !important; + color: var(--mc-body-color) !important; + background-color: var(--mc-btn-bg) !important; + border-color: var(--mc-btn-border) !important; } .btn-dark { - color: #f2f2f7 !important; - background-color: #242424 !important; - border-color: #1c1c1e !important; -} - -.btn-secondary:focus, .btn-secondary:hover, .btn-group.open .dropdown-toggle.btn-secondary { - background-color: #444444; - border-color: #4c4c4e !important; - color: #f2f2f7; + color: var(--mc-body-color) !important; + background-color: var(--mc-btn-dark-bg) !important; + border-color: var(--mc-body-bg) !important; } .btn-check:checked+.btn-secondary, .btn-check:active+.btn-secondary, .btn-secondary:active, .btn-secondary.active, .show>.btn-secondary.dropdown-toggle { - border-color: #5e5e5e !important; + border-color: var(--mc-btn-bg) !important; } .alert-secondary { - color: #f2f2f7 !important; - background-color: #5e5e5e !important; - border-color: #4c4c4e !important; + color: var(--mc-body-color) !important; + background-color: var(--mc-btn-bg) !important; + border-color: var(--mc-btn-border) !important; } .bg-secondary { - color: #f2f2f7 !important; - background-color: #5e5e5e !important; + color: var(--mc-body-color) !important; + background-color: var(--mc-btn-bg) !important; } .alert-secondary, .alert-secondary a, .alert-secondary .alert-link { - color: #f2f2f7; + color: var(--mc-body-color); } .page-item.active .page-link { @@ -65,18 +106,18 @@ legend { } .btn-secondary:focus, .btn-secondary:hover, .btn-group.open .dropdown-toggle.btn-secondary { - background-color: #5e5e5e; - border-color: #4c4c4e !important; - color: #f2f2f7; + background-color: var(--mc-btn-bg); + border-color: var(--mc-btn-border) !important; + color: var(--mc-body-color); } .btn-secondary:disabled, .btn-secondary.disabled { - border-color: #5e5e5e !important; + border-color: var(--mc-btn-bg) !important; } .modal-content { - --bs-modal-color: #bbb; - background-color: #2c2c2e; + --bs-modal-color: var(--mc-text-soft); + background-color: var(--mc-surface); } .modal-header { @@ -84,7 +125,7 @@ legend { } .modal-title { - color: #bbb; + color: var(--mc-text-soft); } .modal .btn-close { @@ -92,12 +133,12 @@ legend { } .navbar.bg-light { - background-color: #1c1c1e !important; - border-color: #2c2c2e; + background-color: var(--mc-body-bg) !important; + border-color: var(--mc-surface); } .nav-link { - color: #8e8e93 !important; + color: var(--mc-muted) !important; } .nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link { @@ -105,23 +146,23 @@ legend { } .nav-tabs, .nav-tabs .nav-link { - border-color: #444444 !important; + border-color: var(--mc-tab-border) !important; } .nav-tabs .nav-link:not(.disabled):hover, .nav-tabs .nav-link:not(.disabled):focus, .nav-tabs .nav-link.active { - border-bottom-color: #1c1c1e !important; + border-bottom-color: var(--mc-body-bg) !important; } .card .nav-tabs .nav-link:not(.disabled):hover, .card .nav-tabs .nav-link:not(.disabled):focus, .card .nav-tabs .nav-link.active { - border-bottom-color: #2c2c2e !important; + border-bottom-color: var(--mc-surface) !important; } .table, .table-striped>tbody>tr:nth-of-type(odd)>*, tbody tr { - color: #f2f2f7 !important; + color: var(--mc-body-color) !important; } .dropdown-menu { - background-color: #424242; + background-color: var(--mc-dropdown-bg); border: 1px solid #282828; } .dropdown-menu>li>a:focus, .dropdown-menu>li>a:hover { @@ -132,79 +173,79 @@ legend { color: #fff; } .bootstrap-select>.dropdown-toggle.bs-placeholder, .bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary { - color: #d4d4d4 !important; + color: var(--mc-placeholder) !important; } tbody tr { - color: #ccc; + color: var(--mc-text); } .navbar-default .navbar-nav>.open>a, .navbar-default .navbar-nav>.open>a:focus, .navbar-default .navbar-nav>.open>a:hover { - color: #ccc; + color: var(--mc-text); } .navbar-default .navbar-nav>.active>a, .navbar-default .navbar-nav>.active>a:focus, .navbar-default .navbar-nav>.active>a:hover { - color: #ccc; + color: var(--mc-text); } .list-group-item { - background-color: #282828; - border: 1px solid #555; + background-color: var(--mc-surface-alt); + border: 1px solid var(--mc-border); } .table-striped>tbody>tr:nth-of-type(odd) { - background-color: #424242; + background-color: var(--mc-table-stripe-row); } table.dataTable>tbody>tr.child ul.dtr-details>li { border-bottom: 1px solid rgba(255, 255, 255, 0.13); } .label.label-last-login { - color: #ccc !important; + color: var(--mc-text) !important; background-color: #555 !important; } .progress { - background-color: #555; + background-color: var(--mc-progress-bg); } .h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { - color: #ccc; + color: var(--mc-text); } div.numberedtextarea-number { color: #999; } .well { - border: 1px solid #555; - background-color: #282828; + border: 1px solid var(--mc-border); + background-color: var(--mc-surface-alt); } pre { - color: #ccc; - background-color: #282828; - border: 1px solid #555; + color: var(--mc-text); + background-color: var(--mc-surface-alt); + border: 1px solid var(--mc-border); } .form-control { background-color: transparent; } input.form-control, textarea.form-control { - color: #e2e2e2 !important; - background-color: #424242 !important; - border: 1px solid #999; + color: var(--mc-input-color) !important; + background-color: var(--mc-input-bg) !important; + border: 1px solid var(--mc-input-border); } input.form-control:focus, textarea.form-control { - background-color: #424242 !important; + background-color: var(--mc-input-bg) !important; } input.form-control:disabled, textarea.form-disabled { - color: #a8a8a8 !important; - background-color: #6e6e6e !important; + color: var(--mc-input-disabled-color) !important; + background-color: var(--mc-input-disabled-bg) !important; } .input-group-addon { - color: #ccc; - background-color: #424242 !important; - border: 1px solid #999; + color: var(--mc-text); + background-color: var(--mc-input-bg) !important; + border: 1px solid var(--mc-input-border); } .input-group-text { - color: #ccc; + color: var(--mc-text); background-color: #1c1c1c; } .list-group-item { - color: #ccc; + color: var(--mc-text); } .dropdown-item { - color: #ccc; + color: var(--mc-text); } .dropdown-item:hover { color: #616161 !important; @@ -214,9 +255,9 @@ input.form-control:disabled, textarea.form-disabled { background-color: #007aff; } .form-select { - color: #e2e2e2!important; - background-color: #424242!important; - border: 1px solid #999; + color: var(--mc-input-color)!important; + background-color: var(--mc-input-bg)!important; + border: 1px solid var(--mc-input-border); } .responsive-tabs .card-header button[data-bs-toggle="collapse"] { @@ -240,15 +281,15 @@ input.form-control:disabled, textarea.form-disabled { a { - color: #6fc7e9; + color: var(--mc-link); text-decoration: underline; } a:hover { - color: #3daedb; + color: var(--mc-link-hover); } .breadcrumb-item.active { - color: #ccc; + color: var(--mc-text); } @@ -273,11 +314,11 @@ a:hover { background-color: #3a3a3a; } .accordion-button { - color: #bbb; + color: var(--mc-text-soft); background-color: #2c2c2c; } .accordion-button:not(.collapsed) { - color: #6fc7e9; + color: var(--mc-link); background-color: #2c2c2c; } .accordion-button::after { @@ -300,15 +341,15 @@ a:hover { } .tag-box { - background-color: #282828; - border: 1px solid #555; + background-color: var(--mc-surface-alt); + border: 1px solid var(--mc-border); } .tag-input { color: #fff; - background-color: #282828; + background-color: var(--mc-surface-alt); } .tag-add { - color: #ccc; + color: var(--mc-text); } .tag-add:hover { color: #d1d1d1; @@ -318,19 +359,19 @@ a:hover { color: #fff; } .btn-outline-secondary:hover { - background-color: #5c5c5c; + background-color: var(--mc-btn-outline-hover-bg); } .btn.btn-outline-secondary { - color: #e0e0e0 !important; - border-color: #7a7a7a !important; + color: var(--mc-btn-outline-color) !important; + border-color: var(--mc-btn-outline-border) !important; } .btn-check:checked+.btn-outline-secondary, .btn-check:active+.btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show { - background-color: #7a7a7a !important; + background-color: var(--mc-btn-outline-active-bg) !important; } .btn-check:checked+.btn-light, .btn-check:active+.btn-light, .btn-light:active, .btn-light.active, .show>.btn-light.dropdown-toggle { - color: #f2f2f7 !important; - background-color: #242424 !important; - border-color: #1c1c1e !important; + color: var(--mc-btn-light-active-color) !important; + background-color: var(--mc-btn-light-active-bg) !important; + border-color: var(--mc-btn-light-active-border) !important; } .btn-input-missing, .btn-input-missing:hover, @@ -348,16 +389,16 @@ a:hover { } .list-group-details { - background: #555; + background: var(--mc-list-details-bg); } .list-group-header { - background: #444; + background: var(--mc-list-header-bg); } span.mail-address-item { - background-color: #444; + background-color: var(--mc-chip-bg); border-radius: 4px; - border: 1px solid #555; + border: 1px solid var(--mc-border); padding: 2px 7px; display: inline-block; margin: 2px 6px 2px 0; @@ -365,52 +406,52 @@ span.mail-address-item { table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control:before:hover, table.dataTable.dtr-inline.collapsed>tbody>tr>th.dtr-control:before:hover { - background-color: #7a7a7a !important; + background-color: var(--mc-dtr-hover-bg) !important; } table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control:before, table.dataTable.dtr-inline.collapsed>tbody>tr>th.dtr-control:before { - background-color: #7a7a7a !important; - border: 1.5px solid #5c5c5c !important; - color: #e0e0e0 !important; + background-color: var(--mc-dtr-bg) !important; + border: 1.5px solid var(--mc-dtr-border) !important; + color: var(--mc-dtr-color) !important; } table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td.dtr-control:before, table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th.dtr-control:before { - background-color: #949494; + background-color: var(--mc-dtr-active-bg); } table.dataTable.dtr-inline.collapsed>tbody>tr>td.child, table.dataTable.dtr-inline.collapsed>tbody>tr>th.child, table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty { - background-color: #414141; + background-color: var(--mc-table-child-bg); } table.table, .table-striped>tbody>tr:nth-of-type(odd)>*, tbody tr { - color: #ccc !important; + color: var(--mc-text) !important; } .table-secondary { --bs-table-bg: #282828; --bs-table-striped-bg: #343434; - --bs-table-striped-color: #f2f2f7; + --bs-table-striped-color: var(--mc-body-color); --bs-table-active-bg: #4c4c4c; - --bs-table-active-color: #f2f2f7; + --bs-table-active-color: var(--mc-body-color); --bs-table-hover-bg: #3a3a3a; - --bs-table-hover-color: #f2f2f7; - color: #ccc; + --bs-table-hover-color: var(--mc-body-color); + color: var(--mc-text); border-color: #3a3a3a; } .table-light { --bs-table-bg: #3a3a3a; --bs-table-striped-bg: #444444; - --bs-table-striped-color: #f2f2f7; + --bs-table-striped-color: var(--mc-body-color); --bs-table-active-bg: #5c5c5c; - --bs-table-active-color: #f2f2f7; + --bs-table-active-color: var(--mc-body-color); --bs-table-hover-bg: #4c4c4c; - --bs-table-hover-color: #f2f2f7; - color: #ccc; + --bs-table-hover-color: var(--mc-body-color); + color: var(--mc-text); border-color: #4c4c4c; } @@ -430,23 +471,23 @@ table.table, .table-striped>tbody>tr:nth-of-type(odd)>*, tbody tr { .table-striped>tbody>tr:nth-of-type(odd)>td, .table-striped>tbody>tr:nth-of-type(odd)>th { - background-color: #282828; + background-color: var(--mc-table-stripe); } .table-hover>tbody>tr:hover { - background-color: #343434; + background-color: var(--mc-table-hover); } .table>:not(caption)>*>* { - border-color: #5c5c5c; - --bs-table-color-state:#bbb; - --bs-table-bg: #3a3a3a; + border-color: var(--mc-table-border); + --bs-table-color-state:var(--mc-text-soft); + --bs-table-bg: var(--mc-table-bg); } .text-muted { - --bs-secondary-color: #8e8e93; + --bs-secondary-color: var(--mc-muted); } input::placeholder { - color: #8e8e93 !important; + color: var(--mc-muted) !important; } .form-select { diff --git a/data/web/css/themes/servercow/dark.css b/data/web/css/themes/servercow/dark.css new file mode 100644 index 00000000..56943509 --- /dev/null +++ b/data/web/css/themes/servercow/dark.css @@ -0,0 +1,212 @@ +/* servercow theme, dark mode, bundled after mailcow core dark mode */ + +:root { + --sc-brown-hover: #806b55; + --sc-brown-active: #8a745c; + --sc-brown-soft: rgba(201, 180, 154, .18); + --sc-brown-tint: rgba(201, 180, 154, .08); + --sc-link: #c9b49a; + --sc-danger-text: #ff8a8a; + --sc-ink: #ece7e1; + --sc-muted: #a89f94; + --sc-placeholder: #8a8177; + --sc-bg: #171513; + --sc-surface: #211e1b; + --sc-cap: #2a2622; + --sc-addon: #2a2622; + --sc-line: #463f38; + --sc-divider: #34302b; + --sc-cap-line: #3d3732; + --sc-stripe: rgba(255, 255, 255, .025); + --sc-hover: rgba(201, 180, 154, .08); + --sc-focus-border: #8a7864; + --sc-focus: rgba(201, 180, 154, .25); + --sc-shadow: 0 0 10px 0 rgba(0, 0, 0, .5); + --bs-body-color: #ece7e1; + --bs-body-bg: #171513; + /* core dark tokens, see css/themes/mailcow-darkmode.css */ + --mc-body-bg: var(--sc-bg); + --mc-body-color: var(--sc-ink); + --mc-surface: var(--sc-surface); + --mc-surface-alt: var(--sc-cap); + --mc-text: var(--sc-ink); + --mc-text-soft: var(--sc-ink); + --mc-muted: var(--sc-muted); + --mc-border: var(--sc-divider); + --mc-tab-border: var(--sc-divider); + --mc-link: var(--sc-link); + --mc-link-hover: #e0cfba; + --mc-btn-bg: var(--sc-cap); + --mc-btn-border: var(--sc-line); + --mc-input-bg: var(--sc-bg); + --mc-input-color: var(--sc-ink); + --mc-input-border: var(--sc-line); + --mc-dropdown-bg: var(--sc-surface); + --mc-table-bg: transparent; + --mc-table-stripe: var(--sc-stripe); + --mc-table-stripe-row: transparent; + --mc-table-hover: var(--sc-hover); + --mc-table-border: var(--sc-divider); + --mc-progress-bg: var(--sc-cap); + --mc-placeholder: var(--sc-placeholder); + --mc-hr: var(--sc-divider); + --mc-btn-outline-color: var(--sc-ink); + --mc-btn-outline-border: var(--sc-line); + --mc-btn-outline-hover-bg: var(--sc-brown-tint); + --mc-btn-outline-active-bg: var(--sc-brown); + --mc-btn-light-active-color: #fff; + --mc-btn-light-active-bg: var(--sc-brown); + --mc-btn-light-active-border: var(--sc-brown); + --mc-btn-dark-bg: var(--sc-brown); + --mc-input-disabled-bg: var(--sc-cap); + --mc-input-disabled-color: var(--sc-muted); + --mc-list-header-bg: var(--sc-cap); + --mc-list-details-bg: var(--sc-surface); + --mc-chip-bg: var(--sc-cap); + --mc-table-child-bg: var(--sc-surface); + --mc-dtr-bg: var(--sc-cap); + --mc-dtr-border: var(--sc-line); + --mc-dtr-color: var(--sc-link); + --mc-dtr-hover-bg: var(--sc-hover); + --mc-dtr-active-bg: var(--sc-brown-soft); +} + +/* navbar */ +.navbar.bg-light { + background-color: var(--sc-surface) !important; + border-bottom-color: var(--sc-green); +} +.navbar-light .navbar-nav .nav-link { + color: var(--sc-ink) !important; +} +.navbar-light .navbar-nav .nav-link:hover, +.navbar-light .navbar-nav .nav-link:focus, +.navbar-light .navbar-nav .nav-link.active, +.navbar-light .navbar-nav .show > .nav-link { + color: var(--sc-link) !important; +} +.dropdown-menu { + border-color: var(--sc-cap-line); +} +.dropdown-item:hover, .dropdown-item:focus { + color: var(--sc-link) !important; +} + +/* cards and modals */ +.card-header { + color: var(--sc-ink); + background-color: var(--sc-cap); + border-color: var(--sc-cap-line); +} +.modal-content { + background-color: var(--sc-surface); +} +.modal-header { + border-color: var(--sc-cap-line); +} +.input-group-text { + background-color: var(--sc-addon); +} +.form-control::file-selector-button { + color: var(--sc-ink); + background-color: var(--sc-cap); + border-color: var(--sc-line); +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + color: var(--sc-link); + background-color: var(--sc-line); +} +.form-check-input:not(:checked) { + background-color: var(--sc-bg); + border-color: var(--sc-line); +} +kbd { + color: var(--sc-ink); + background-color: var(--sc-cap); +} + +/* buttons */ +.btn-secondary:hover, .btn-secondary:focus, .btn-light:hover, .btn-light:focus, .page-link:hover { + color: var(--sc-link) !important; + background-color: var(--sc-line) !important; +} +.btn-check:checked + .btn-secondary, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle, +.page-item.active .page-link { + color: #fff !important; + background-color: var(--sc-brown) !important; + border-color: var(--sc-brown) !important; +} + +/* tabs */ +.nav-tabs .nav-link { + color: var(--sc-ink) !important; + border-bottom-color: transparent !important; +} +.nav-tabs .nav-link:not(.disabled):hover, .nav-tabs .nav-link:not(.disabled):focus, +.card .nav-tabs .nav-link:not(.disabled):hover, .card .nav-tabs .nav-link:not(.disabled):focus { + color: var(--sc-link) !important; + border-bottom-color: transparent !important; +} +.nav-tabs .nav-link.active, .card .nav-tabs .nav-link.active { + color: var(--sc-link) !important; + border-bottom-color: var(--sc-link) !important; +} + +/* semantic text */ +.text-success { + color: var(--sc-green) !important; +} +.text-warning { + color: var(--sc-warning) !important; +} + +/* alerts, opaque dark tints (also used for floating notifications) */ +.alert-primary { + color: #e6d9c9 !important; + background-color: #3c342b !important; + border-color: #5e4f3e !important; +} +.alert-info { + color: #cfe9f6 !important; + background-color: #2f3334 !important; + border-color: #44535a !important; +} +.alert-success { + color: #cdeea0; + background-color: #2e3419; + border-color: #405515; +} +.alert-danger { + color: #f9c4c4; + background-color: #402a28; + border-color: #693a38; +} +.alert-warning { + color: #f5d496; + background-color: #3c2f19; + border-color: #654815; +} +.alert-secondary, .alert-light { + color: var(--sc-ink) !important; + background-color: var(--sc-cap) !important; + border-color: var(--sc-divider) !important; +} + +.alert .btn-close { + filter: invert(1) grayscale(100%) brightness(200%); +} + +/* slider */ +.noUi-target { + background: var(--sc-bg); + border-color: var(--sc-line); + box-shadow: none; +} +.noUi-handle { + background: var(--sc-cap); + border-color: var(--sc-line); + box-shadow: none; +} +.noUi-handle::before, .noUi-handle::after { + background: var(--sc-line); +} diff --git a/data/web/css/themes/servercow/fonts/LICENSE-RobotoSlab.txt b/data/web/css/themes/servercow/fonts/LICENSE-RobotoSlab.txt new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/data/web/css/themes/servercow/fonts/LICENSE-RobotoSlab.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/data/web/css/themes/servercow/fonts/OFL-Poppins.txt b/data/web/css/themes/servercow/fonts/OFL-Poppins.txt new file mode 100644 index 00000000..76df3b56 --- /dev/null +++ b/data/web/css/themes/servercow/fonts/OFL-Poppins.txt @@ -0,0 +1,93 @@ +Copyright 2020 The Poppins Project Authors (https://github.com/itfoundry/Poppins) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-500.woff b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-500.woff new file mode 100644 index 00000000..fc6d5c76 Binary files /dev/null and b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-500.woff differ diff --git a/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-500.woff2 b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-500.woff2 new file mode 100644 index 00000000..abfe9913 Binary files /dev/null and b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-500.woff2 differ diff --git a/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-600.woff b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-600.woff new file mode 100644 index 00000000..08368fc2 Binary files /dev/null and b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-600.woff differ diff --git a/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-600.woff2 b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-600.woff2 new file mode 100644 index 00000000..068762f8 Binary files /dev/null and b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-600.woff2 differ diff --git a/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-italic.woff b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-italic.woff new file mode 100644 index 00000000..86fbaddf Binary files /dev/null and b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-italic.woff differ diff --git a/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-italic.woff2 b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-italic.woff2 new file mode 100644 index 00000000..981bdb30 Binary files /dev/null and b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-italic.woff2 differ diff --git a/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-regular.woff b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-regular.woff new file mode 100644 index 00000000..b925aa32 Binary files /dev/null and b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-regular.woff differ diff --git a/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-regular.woff2 b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-regular.woff2 new file mode 100644 index 00000000..d83f92c0 Binary files /dev/null and b/data/web/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-regular.woff2 differ diff --git a/data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-500.woff b/data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-500.woff new file mode 100644 index 00000000..8621fd61 Binary files /dev/null and b/data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-500.woff differ diff --git a/data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-500.woff2 b/data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-500.woff2 new file mode 100644 index 00000000..2e409732 Binary files /dev/null and b/data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-500.woff2 differ diff --git a/data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-regular.woff b/data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-regular.woff new file mode 100644 index 00000000..8c8b94f4 Binary files /dev/null and b/data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-regular.woff differ diff --git a/data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-regular.woff2 b/data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-regular.woff2 new file mode 100644 index 00000000..f55bf376 Binary files /dev/null and b/data/web/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-regular.woff2 differ diff --git a/data/web/css/themes/servercow/theme.css b/data/web/css/themes/servercow/theme.css new file mode 100644 index 00000000..14bcecd1 --- /dev/null +++ b/data/web/css/themes/servercow/theme.css @@ -0,0 +1,584 @@ +/* servercow theme for mailcow, based on the servercow customer portal */ + +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local(''), + url('/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-regular.woff2') format('woff2'), + url('/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-regular.woff') format('woff'); +} +@font-face { + font-family: 'Poppins'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: local(''), + url('/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-italic.woff2') format('woff2'), + url('/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-italic.woff') format('woff'); +} +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: local(''), + url('/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-500.woff2') format('woff2'), + url('/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-500.woff') format('woff'); +} +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: local(''), + url('/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-600.woff2') format('woff2'), + url('/css/themes/servercow/fonts/poppins-v24-latin_latin-ext-600.woff') format('woff'); +} +@font-face { + font-family: 'Roboto Slab'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local(''), + url('/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-regular.woff2') format('woff2'), + url('/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-regular.woff') format('woff'); +} +@font-face { + font-family: 'Roboto Slab'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: local(''), + url('/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-500.woff2') format('woff2'), + url('/css/themes/servercow/fonts/roboto-slab-v36-cyrillic_greek_latin-500.woff') format('woff'); +} + +/* tokens */ +:root { + --sc-brown: #6F5D49; + --sc-brown-hover: #5e4f3e; + --sc-brown-active: #594a3a; + --sc-brown-soft: rgba(111, 93, 73, .2); + --sc-brown-tint: rgba(111, 93, 73, .08); + --sc-link: #6F5D49; + --sc-green: #8AD608; + --sc-blue: #96D0EC; + --sc-warning: #e3950b; + --sc-danger: #ef6f6f; + --sc-danger-hover: #e85e5e; + --sc-danger-text: #c43c3c; + --sc-ink: #212529; + --sc-muted: #6c757d; + --sc-placeholder: #6c757d; + --sc-bg: #F6F8F8; + --sc-surface: #ffffff; + --sc-cap: #f7f7f7; + --sc-addon: #e9ecef; + --sc-line: #ced4da; + --sc-divider: #dee2e6; + --sc-cap-line: rgba(0, 0, 0, .175); + --sc-stripe: rgba(111, 93, 73, .04); + --sc-hover: rgba(111, 93, 73, .08); + --sc-focus-border: #b7aea4; + --sc-focus: rgba(111, 93, 73, .25); + --sc-shadow: 0 0 10px 0 rgba(134, 134, 134, .3); + --sc-font: 'Poppins', system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + --sc-font-head: 'Roboto Slab', Georgia, serif; + --bs-body-color: #212529; + --bs-body-bg: #F6F8F8; + --bs-body-font-family: var(--sc-font); + /* core tokens, see css/build/014-mailcow.css */ + --mc-font-family: var(--sc-font); + --mc-font-size: 10pt; + --mc-body-bg: var(--sc-bg); + --mc-primary: var(--sc-brown); + --mc-primary-border: var(--sc-brown); + --mc-info: var(--sc-blue); + --mc-info-border: var(--sc-blue); + --mc-border: var(--sc-divider); + --mc-surface: var(--sc-surface); + --mc-surface-alt: var(--sc-cap); + --mc-muted: var(--sc-muted); + --mc-hr: var(--sc-divider); + --mc-progress-bg: var(--sc-addon); + --mc-placeholder: var(--sc-placeholder); + --mc-btn-outline-color: var(--sc-ink); + --mc-btn-outline-border: var(--sc-line); + --mc-btn-outline-hover-bg: var(--sc-brown-tint); + --mc-btn-outline-active-bg: var(--sc-brown); + --mc-btn-light-active-color: #fff; + --mc-btn-light-active-bg: var(--sc-brown); + --mc-btn-light-active-border: var(--sc-brown); + --mc-dtr-bg: var(--sc-surface); + --mc-dtr-border: var(--sc-line); + --mc-dtr-color: var(--sc-brown); + --mc-dtr-hover-bg: var(--sc-brown-tint); + --mc-dtr-active-bg: var(--sc-brown-soft); + --mc-login-user: var(--sc-green); + --mc-login-domainadmin: #f5c400; + --mc-login-admin: var(--sc-danger); +} + +/* base */ +body { + color: var(--sc-ink); + -webkit-font-smoothing: antialiased; +} +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6, legend, .modal-title { + font-family: var(--sc-font-head); + font-weight: 500; + color: var(--sc-ink); +} +a { + color: var(--sc-link); +} +a:hover { + color: var(--sc-brown-hover); +} +.text-muted, .text-secondary { + color: var(--sc-muted) !important; +} +::selection { + background: var(--sc-brown-soft); +} +hr { + border-color: var(--sc-divider); + opacity: 1; +} +::placeholder { + color: var(--sc-placeholder) !important; +} + +/* navbar, white with green line */ +.navbar.bg-light { + background-color: var(--sc-surface) !important; + border: 0; + border-bottom: 5px solid var(--sc-green); +} +.navbar-light .navbar-nav .nav-link { + color: var(--sc-ink); +} +.navbar-light .navbar-nav .nav-link:hover, +.navbar-light .navbar-nav .nav-link:focus, +.navbar-light .navbar-nav .nav-link.active, +.navbar-light .navbar-nav .show > .nav-link { + color: var(--sc-brown); +} +@media (min-width: 992px) { + .navbar-nav .nav-link { + height: 60px; + } +} +.dropdown-menu { + border: 1px solid var(--sc-cap-line); + border-radius: 0; + box-shadow: var(--sc-shadow); +} +.dropdown-item { + color: var(--sc-ink); +} +.dropdown-item:hover, .dropdown-item:focus { + color: var(--sc-brown) !important; + background-color: var(--sc-brown-soft); +} +.dropdown-item.active, .dropdown-item:active { + color: #fff; + background-color: var(--sc-brown); +} + +/* cards, white with soft shadow */ +.card { + border: 0 !important; + border-radius: 0; + background-color: var(--sc-surface); + box-shadow: var(--sc-shadow); +} +.card-header, .card-header:first-child { + font-family: var(--sc-font-head); + font-weight: 500; + font-size: 1.1rem; + color: var(--sc-ink); + background-color: var(--sc-cap); + border-bottom: 1px solid var(--sc-cap-line); + border-radius: 0; + padding: .5rem 1rem; +} +.card-header .btn, .card-header .form-control, .card-header .form-select { + font-family: var(--sc-font); + font-size: .875rem; +} +.card-footer { + background-color: var(--sc-cap); + border-top: 1px solid var(--sc-cap-line); + border-radius: 0; +} +.card .card { + box-shadow: none; + border: 1px solid var(--sc-divider) !important; +} +/* colored headers become a top line */ +.card:has(> .card-header.bg-danger) { + border-top: 4px solid var(--sc-danger) !important; +} +.card-header.bg-danger, .card-header.bg-success, .card-header.bg-primary, .card-header.bg-info { + color: var(--sc-ink) !important; + background-color: var(--sc-cap) !important; +} +.list-group-item { + border-color: var(--sc-divider); +} + +/* modals */ +.modal-content { + border: 0; + border-radius: 0; + box-shadow: 0 8px 40px rgba(0, 0, 0, .2); +} +.modal-header { + background-color: var(--sc-cap); + border-bottom: 1px solid var(--sc-cap-line); + border-radius: 0; +} +.modal-footer { + border-top: 1px solid var(--sc-divider); +} + +/* buttons, flat and square */ +.btn { + border-width: 1px; + border-radius: 0; + font-weight: 400; + transition: none; +} +.btn:not(.disabled):hover, +.btn:not(.disabled):active { + margin-top: 0; + border-bottom-width: 1px; +} +.btn:focus, .btn-check:focus + .btn { + box-shadow: 0 0 0 .2rem var(--sc-focus); +} +.btn-primary, .btn-primary:hover, .btn-primary:focus, .btn-primary:active { + color: #fff; +} +.btn-primary:hover, .btn-primary:focus, .btn-primary:active { + background-color: var(--sc-brown-hover) !important; + border-color: var(--sc-brown-active) !important; +} +/* main call to action, portal primary */ +.btn-success, .btn-success:not(.disabled):hover, .btn-success:not(.disabled):active, .btn-success:focus, +.btn-success:disabled, .btn-success.disabled { + color: #fff; + background-color: var(--sc-brown); + border-color: var(--sc-brown); +} +.btn-success:hover, .btn-success:active, .btn-success:focus { + background-color: var(--sc-brown-hover); + border-color: var(--sc-brown-active); +} +.btn-danger, .btn-danger:not(.disabled):hover, .btn-danger:not(.disabled):active, .btn-danger:focus, +.btn-danger:disabled, .btn-danger.disabled { + color: #000; + background-color: var(--sc-danger); + border-color: var(--sc-danger); +} +.btn-danger:hover, .btn-danger:active, .btn-danger:focus { + background-color: var(--sc-danger-hover); + border-color: var(--sc-danger-hover); +} +.btn-warning, .btn-warning:not(.disabled):hover, .btn-warning:not(.disabled):active, .btn-warning:focus { + color: #000; + background-color: var(--sc-warning); + border-color: var(--sc-warning); +} +.bg-info, .alert-info, .btn-info, .badge.bg-info > a { + color: #000 !important; +} +.btn-secondary, .btn-secondary:not(.disabled):hover, .btn-secondary:not(.disabled):active, .btn-secondary:focus, +.btn-light, .btn-light:not(.disabled):hover, .btn-light:not(.disabled):active, .btn-light:focus { + color: var(--sc-ink); + background-color: var(--sc-surface); + border-color: var(--sc-line); +} +.btn-secondary:hover, .btn-secondary:active, .btn-secondary:focus, +.btn-light:hover, .btn-light:focus { + color: var(--sc-brown); + background-color: var(--sc-brown-tint); + border-color: var(--sc-line); +} +.btn-check:checked + .btn-secondary, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: var(--sc-brown); + border-color: var(--sc-brown); +} +.btn-check:checked + .btn-outline-secondary, .btn-outline-secondary.active { + color: #fff !important; + border-color: var(--sc-brown) !important; +} +.btn-outline-primary { + color: var(--sc-brown); + border-color: var(--sc-brown); +} +.btn-outline-primary:hover { + color: #fff; + background-color: var(--sc-brown); + border-color: var(--sc-brown); +} +/* active toggle, e.g. tagging options */ +.btn-dark, .btn-dark:hover, .btn-dark:focus, .btn-dark:active { + color: #fff; + background-color: var(--sc-brown); + border-color: var(--sc-brown); +} +.btn-xs, .btn-group-xs > .btn { + border-radius: 0; +} + +/* forms */ +.form-control, .form-select { + border-color: var(--sc-line); + border-radius: 0; + box-shadow: none; + color: var(--sc-ink); + background-color: var(--sc-surface); +} +.form-control:focus, .form-select:focus { + border-color: var(--sc-focus-border); + box-shadow: 0 0 0 .25rem var(--sc-focus); +} +.form-control::file-selector-button { + color: var(--sc-ink); + background-color: var(--sc-addon); + border-color: var(--sc-line); +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + color: var(--sc-brown); + background-color: var(--sc-brown-soft); +} +.input-group-text { + color: var(--sc-ink); + background-color: var(--sc-addon); + border-color: var(--sc-line); + border-radius: 0; +} +.input-group > :not(:first-child), .input-group > :not(:last-child) { + border-radius: 0; +} +.form-check-input { + border-color: var(--sc-line); +} +.form-check-input:checked { + background-color: var(--sc-brown); + border-color: var(--sc-brown); +} +.form-check-input:focus { + border-color: var(--sc-focus-border); + box-shadow: 0 0 0 .25rem var(--sc-focus); +} +.bootstrap-select > .dropdown-toggle { + border-radius: 0; +} +.bootstrap-select > .dropdown-toggle.bs-placeholder, +.bootstrap-select > .dropdown-toggle.bs-placeholder:hover, +.bootstrap-select > .dropdown-toggle.bs-placeholder:focus, +.bootstrap-select > .dropdown-toggle.bs-placeholder:active { + color: var(--mc-placeholder); +} +.bootstrap-select .dropdown-menu li a.active, .bootstrap-select .dropdown-menu li a:active { + color: #fff; + background-color: var(--sc-brown); +} +div.numberedtextarea-number { + color: var(--sc-muted); +} + +/* nav tabs */ +.nav-tabs { + border-bottom: 1px solid var(--sc-divider); +} +.nav-tabs .nav-link, +.nav-tabs .nav-link.disabled, .nav-tabs .nav-link.disabled:hover, .nav-tabs .nav-link.disabled:focus { + margin-top: 0; + color: var(--sc-ink); + border: 0; + border-bottom: 3px solid transparent; + border-radius: 0; + background: none; +} +.nav-tabs .nav-link:not(.disabled):hover, .nav-tabs .nav-link:not(.disabled):focus { + padding-bottom: .5rem; + color: var(--sc-brown); +} +.nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link, +.nav-tabs .nav-link:not(.disabled).active { + padding-bottom: .5rem; + color: var(--sc-brown); + background: none; + border-bottom: 3px solid var(--sc-brown); +} +.nav-pills .nav-link { + border-radius: 0; + color: var(--sc-ink); +} +.nav-pills .nav-link.active, .nav-pills .show > .nav-link { + background-color: var(--sc-brown); +} + +/* tables */ +.table { + --bs-table-bg: transparent; + --bs-table-striped-bg: var(--sc-stripe); + --bs-table-striped-color: var(--sc-ink); + --bs-table-hover-color: var(--sc-ink); + --bs-table-hover-bg: var(--sc-hover); + color: var(--sc-ink); + border-color: var(--sc-divider); +} +.table > thead > tr > th, table.dataTable thead th { + color: var(--sc-ink); + font-weight: 600; + border-bottom: 1px solid var(--sc-line); +} +table.dataTable.table-striped > tbody > tr.odd > * { + box-shadow: inset 0 0 0 9999px var(--sc-stripe); +} +table.dataTable.table-hover > tbody > tr:hover > * { + box-shadow: inset 0 0 0 9999px var(--sc-hover); +} +.table > :not(:first-child) { + border-top: 0; +} +.dataTables_wrapper .dataTables_filter input, +.dataTables_wrapper .dataTables_length select { + border: 1px solid var(--sc-line); + border-radius: 0; +} +.pagination > li > a, .pagination > li > span, .pagination .page-link, +.pagination > li > a:hover, .pagination > li > a:focus, .pagination > li > a:active { + top: 0; + color: var(--sc-brown); + font-weight: 400; + text-transform: none; + background-color: var(--sc-surface); + border: 1px solid var(--sc-divider); + border-radius: 0 !important; +} +.pagination > li > a:hover, .pagination > li > a:focus { + background-color: var(--sc-brown-tint); +} +.pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:active, +.page-item.disabled .page-link { + color: var(--sc-muted); + background-color: var(--sc-surface); + border-width: 1px; + border-color: var(--sc-divider); +} +.page-item.active .page-link { + color: #fff; + background-color: var(--sc-brown); + border-color: var(--sc-brown); +} +.breadcrumb { + border: 1px solid var(--sc-divider); + border-radius: 0; +} + +/* alerts like the portal */ +.alert { + border: 1px solid; + border-radius: 0; +} +.alert-primary { + color: #43382c !important; + background-color: #e2dfdb !important; + border-color: #d4cec8 !important; +} +.alert-info { + color: #3c535e !important; + background-color: #eaf6fb !important; + border-color: #e0f1f9 !important; +} +.alert-success { + color: #375603; + background-color: #e8f7ce; + border-color: #dcf3b5; +} +.alert-danger { + color: #8f4343; + background-color: #fce2e2; + border-color: #fad4d4; +} +.alert-warning { + color: #885907; + background-color: #f9eace; + border-color: #f7dfb6; +} +.alert-secondary, .alert-light { + color: var(--sc-ink); + background-color: var(--sc-cap); + border-color: var(--sc-divider); +} +.alert .alert-link { + color: inherit; +} +.alert .btn-close { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e"); + opacity: .5; +} + +/* badges and semantic colors, readable text on top */ +.badge { + font-weight: 500; + border-radius: 0; +} +.bg-success { + color: #000 !important; + background-color: var(--sc-green) !important; +} +.bg-warning { + color: #000 !important; + background-color: var(--sc-warning) !important; +} +.bg-danger { + color: #000 !important; + background-color: var(--sc-danger) !important; +} +.badge.bg-secondary, .badge.bg-light { + color: var(--sc-ink); + background-color: var(--sc-addon) !important; +} +.text-success { + color: #4f8a0b !important; +} +.text-danger { + color: var(--sc-danger-text) !important; +} +.text-warning { + color: #9a6100 !important; +} +.progress { + border-radius: 0; +} +.progress-bar { + color: #000; + background-color: var(--sc-green); +} +.progress-bar.bg-danger, .progress-bar-danger { + color: #000; + background-color: var(--sc-danger) !important; +} +.progress-bar-warning { + color: #000; + background-color: var(--sc-warning) !important; +} + + +/* footer */ +.footer, .footer a { + color: var(--sc-muted); +} +.footer hr { + border-color: var(--sc-divider); +} diff --git a/data/web/css/themes/servercow/theme.json b/data/web/css/themes/servercow/theme.json new file mode 100644 index 00000000..2c8f041b --- /dev/null +++ b/data/web/css/themes/servercow/theme.json @@ -0,0 +1,4 @@ +{ + "name": "servercow", + "description": "Based on the servercow theme" +} diff --git a/data/web/inc/ajax/dns_diagnostics.php b/data/web/inc/ajax/dns_diagnostics.php index 95e34e88..5efbaa47 100644 --- a/data/web/inc/ajax/dns_diagnostics.php +++ b/data/web/inc/ajax/dns_diagnostics.php @@ -380,13 +380,13 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm else { $state = state_nomatch; } - $state .= '
' . $current[$data_field[$current['type']]]; + $state .= '
' . htmlspecialchars($current[$data_field[$current['type']]]); } if ($current['type'] == 'TXT' && stripos($current['txt'], 'v=dmarc') === 0 && $record[2] == $dmarc_link) { $current['txt'] = str_replace(' ', '', $current['txt']); - $state = $current[$data_field[$current['type']]] . state_optional; + $state = htmlspecialchars($current[$data_field[$current['type']]]) . state_optional; } elseif ($current['type'] == 'TXT' && stripos($current['txt'], 'v=spf') === 0 && @@ -396,7 +396,7 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm if (in_array($ip, $rslt) && in_array(expand_ipv6($ip6), $rslt)) { $state = state_good; } - $state .= '
' . $current[$data_field[$current['type']]] . state_optional; + $state .= '
' . htmlspecialchars($current[$data_field[$current['type']]]) . state_optional; } elseif ($current['type'] == 'TXT' && stripos($current['txt'], 'v=dkim') === 0 && @@ -426,7 +426,7 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm if ($state == state_nomatch) { $state = array(); foreach ($currents as $current) { - $state[] = $current[$data_field[$current['type']]]; + $state[] = htmlspecialchars($current[$data_field[$current['type']]]); } $state = implode('
', $state); } @@ -436,12 +436,22 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm %s %s %s - ', $record[0], $record[1], $record[2], $state); + ', htmlspecialchars($record[0]), htmlspecialchars($record[1]), $record[2], $state); $record[3] = explode('
', $state); } unset($record); + // Make a hostname RHS absolute so it is not read relative to $ORIGIN. + // Already-absolute names, the SRV root target "." and IP addresses are left alone. + $absolutize = function($host) { + $host = trim($host); + if ($host === '' || $host === '.' || substr($host, -1) === '.' || filter_var($host, FILTER_VALIDATE_IP)) { + return $host; + } + return $host . '.'; + }; + $dns_data = sprintf("\$ORIGIN %s.\n", $domain); foreach ($records as $record) { if ($domain == substr($record[0], -strlen($domain))) { @@ -462,22 +472,32 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm $val = str_replace(state_optional, '', $val); $val = str_replace(state_good, '', $val); if (strlen($val) > 0) { + // these are all TXT values, their RHS is a character string, not a name $vals[] = sprintf("%s\tIN\t%s\t%s\n", $label, $record[1], $val); } } } else { + if ($record[1] == 'MX' || $record[1] == 'CNAME') { + $val = $absolutize($val); + } + elseif ($record[1] == 'SRV') { + // format here is "target port"; only the target is a name + $parts = explode(' ', $val, 2); + $parts[0] = $absolutize($parts[0]); + $val = implode(' ', $parts); + } $vals[] = sprintf("%s\tIN\t%s\t%s\n", $label, $record[1], $val); } foreach ($vals as $val) { - $dns_data .= str_replace($domain, $domain . '.', $val); + $dns_data .= $val; } } } ?> - .txt' type='text/csv'>Download + .txt' type='text/csv'>Download @@ -193,7 +194,7 @@ $(window).scroll(function() { }); // Select language and reopen active URL without POST function setLang(sel) { - $.post( '{{ uri }}', {lang: sel} ); + $.post( '{{ uri|escape("js") }}', {lang: sel} ); window.location.href = window.location.pathname + window.location.search; } // FIDO2 functions @@ -473,6 +474,10 @@ function recursiveBase64StrToArrayBuffer(obj) { window.location.reload(); } else { var msg = (data && data[0] && data[0].msg) ? data[0].msg : 'Password change failed.'; + // the API returns raw language keys, resolve them like the alert box does + if (Object.prototype.hasOwnProperty.call(lang_danger, msg)) { + msg = lang_danger[msg]; + } $('#changePWAlert').show().text(msg); } }, diff --git a/data/web/templates/domainadmin_index.twig b/data/web/templates/domainadmin_index.twig index 2fc7bad9..b0d70c94 100644 --- a/data/web/templates/domainadmin_index.twig +++ b/data/web/templates/domainadmin_index.twig @@ -6,9 +6,9 @@
-
+