Initial commit
No files matched your search
@@ -0,0 +1,16 @@
|
||||
.git
|
||||
.venv
|
||||
**/__pycache__/
|
||||
*.py[cod]
|
||||
db.sqlite3
|
||||
.env
|
||||
htmlcov/
|
||||
.pytest_cache/
|
||||
.mypy_cache/
|
||||
*.log
|
||||
staticfiles/
|
||||
proposal/
|
||||
template/
|
||||
docs/
|
||||
*.pptx
|
||||
.~lock.*
|
||||
@@ -0,0 +1,99 @@
|
||||
# Local development defaults. Copy to `.env` (gitignored) — never commit secrets.
|
||||
# docker compose auto-loads `.env` for ${VAR} substitution into the web container.
|
||||
#
|
||||
# After seeding a client: scripts/bootstrap-client.sh <slug> "<Site Name>" <domain>
|
||||
# then copy this file and fill secrets.
|
||||
|
||||
DJANGO_ENV=dev
|
||||
DJANGO_DEBUG=true
|
||||
DJANGO_SECRET_KEY=dev-only-change-me
|
||||
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1,0.0.0.0
|
||||
|
||||
# Leave empty for SQLite, or point at local compose Postgres:
|
||||
# DATABASE_URL=postgres://client_site:client_site@127.0.0.1:5432/client_site
|
||||
|
||||
SITE_UNDER_CONSTRUCTION=false
|
||||
SITE_NAME=Your Company
|
||||
SITE_TAGLINE=A tagline for the public site
|
||||
PUBLIC_SITE_URL=http://127.0.0.1:8000
|
||||
CONTACT_PHONE=
|
||||
CONTACT_EMAIL=hello@example.com
|
||||
CONTACT_ADDRESS=
|
||||
CONTACT_SERVICE_AREA=
|
||||
CREDIT_NAME=AI ML Operations, LLC
|
||||
CREDIT_URL=https://aimloperations.com
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Catalog feature flags
|
||||
# Local/dev defaults ON so the template is a working seed.
|
||||
# Client prod/beta secrets: false unless that add-on was purchased.
|
||||
# Disabled apps are omitted from INSTALLED_APPS (no models, admin, URLs, nav).
|
||||
# ---------------------------------------------------------------------------
|
||||
FEATURE_EMAIL_SMS=true
|
||||
FEATURE_DIRECT_MAIL=true
|
||||
FEATURE_BLOG=true
|
||||
FEATURE_PAYMENTS=true
|
||||
FEATURE_SOCIAL=true
|
||||
FEATURE_SOCIAL_AI=true
|
||||
|
||||
# reCAPTCHA (optional locally — form skips captcha when empty)
|
||||
RECAPTCHA_PUBLIC_KEY=
|
||||
RECAPTCHA_PRIVATE_KEY=
|
||||
|
||||
# SMTP2GO — required when FEATURE_EMAIL_SMS=true in beta/prod
|
||||
EMAIL_HOST=mail.smtp2go.com
|
||||
EMAIL_HOST_USER=
|
||||
EMAIL_HOST_PASSWORD=
|
||||
EMAIL_PORT=2525
|
||||
EMAIL_USE_TLS=true
|
||||
# Inbox From. Docker Compose .env cannot parse: "Name" <addr>
|
||||
# Use bare address (SITE_NAME is wrapped) OR one quoted string:
|
||||
# DEFAULT_FROM_EMAIL="Your Company <noreply@example.com>"
|
||||
DEFAULT_FROM_EMAIL=noreply@example.com
|
||||
# Console (default in DJANGO_ENV=dev) prints mail to container logs.
|
||||
# EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
|
||||
SMTP2GO_SMS_API_KEY=
|
||||
# Unified SMTP2GO webhook (email + SMS): …/portal/messaging/webhooks/smtp2go/
|
||||
# Authorization = Bearer + this secret.
|
||||
SMTP2GO_WEBHOOK_SECRET=
|
||||
|
||||
# Postcards — PCM Integrations. Required when FEATURE_DIRECT_MAIL=true in beta/prod
|
||||
POSTCARD_PROVIDER=pcm
|
||||
PCM_API_KEY=
|
||||
PCM_API_SECRET=
|
||||
# PCM_CHILD_REF_NBR=
|
||||
PCM_WEBHOOK_SECRETS=
|
||||
# PCM_WEBHOOK_SECRET=
|
||||
# Quote JSON (compose/shell break on bare {…, …}).
|
||||
# PCM_RETURN_ADDRESS='{"firstName":"Jane","lastName":"Doe","address":"123 Main","city":"Town","state":"IL","zipCode":"60189"}'
|
||||
PCM_RETURN_ADDRESS=
|
||||
|
||||
# Stripe — required when FEATURE_PAYMENTS=true
|
||||
STRIPE_SECRET_KEY=
|
||||
STRIPE_PUBLISHABLE_KEY=
|
||||
STRIPE_WEBHOOK_SECRET=
|
||||
STRIPE_CURRENCY=usd
|
||||
|
||||
# Social — SOCIAL_TOKEN_ENCRYPTION_KEY required when FEATURE_SOCIAL=true
|
||||
# LinkedIn / Instagram App ID + Secret: Portal → Social accounts (not env).
|
||||
META_APP_ID=
|
||||
META_APP_SECRET=
|
||||
# Generate: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
||||
SOCIAL_TOKEN_ENCRYPTION_KEY=
|
||||
|
||||
# Ollama (LAN) — FEATURE_SOCIAL_AI. Default is the internal host, not public Ollama.
|
||||
OLLAMA_BASE_URL=http://10.0.0.128:11434
|
||||
OLLAMA_MODEL=llama3.2
|
||||
|
||||
# Nominatim (LAN) — address autocomplete via Django /api/address-suggest/
|
||||
NOMINATIM_BASE_URL=http://10.0.0.128:8089
|
||||
NOMINATIM_TIMEOUT_SECONDS=8
|
||||
NOMINATIM_COUNTRY_CODES=us
|
||||
|
||||
# Tianji analytics (off in local/dev by default)
|
||||
TIANJI_ENABLED=false
|
||||
TIANJI_TRACKER_URL=https://tianji.aimloperations.com/tracker.js
|
||||
TIANJI_WEBSITE_ID=
|
||||
|
||||
# DISPATCH_DUE_INTERVAL_SECONDS=15
|
||||
GUNICORN_WORKERS=2
|
||||
@@ -0,0 +1,92 @@
|
||||
# Secret env files for server-infra deploy. Never commit.
|
||||
# Copy on the control node:
|
||||
# ~/Documents/secrets/<slug>_site/<slug>_site_prod.env
|
||||
# ~/Documents/secrets/<slug>_site/<slug>_site_beta.env
|
||||
#
|
||||
# Docker Compose: if a secret contains $ (e.g. DATABASE_URL password), escape
|
||||
# each $ as $$ or compose will treat $word as a variable.
|
||||
|
||||
DJANGO_ENV=prod
|
||||
DJANGO_DEBUG=false
|
||||
DJANGO_SECRET_KEY=replace-with-a-long-random-secret
|
||||
DJANGO_ALLOWED_HOSTS=example.com,www.example.com
|
||||
|
||||
SITE_UNDER_CONSTRUCTION=true
|
||||
|
||||
SITE_NAME=Your Company
|
||||
SITE_TAGLINE=A tagline for the public site
|
||||
PUBLIC_SITE_URL=https://example.com
|
||||
DEFAULT_FROM_EMAIL=noreply@example.com
|
||||
CONTACT_PHONE=
|
||||
CONTACT_EMAIL=
|
||||
CONTACT_ADDRESS=
|
||||
CONTACT_SERVICE_AREA=
|
||||
CREDIT_NAME=AI ML Operations, LLC
|
||||
CREDIT_URL=https://aimloperations.com
|
||||
|
||||
# Optional catalog features — false unless purchased.
|
||||
# Turning a flag on later: set true, redeploy, migrate. Do not auto-drop tables.
|
||||
FEATURE_EMAIL_SMS=false
|
||||
FEATURE_DIRECT_MAIL=false
|
||||
FEATURE_BLOG=false
|
||||
FEATURE_PAYMENTS=false
|
||||
FEATURE_SOCIAL=false
|
||||
FEATURE_SOCIAL_AI=false
|
||||
|
||||
# Shared external Postgres (10.0.0.230)
|
||||
DATABASE_URL=postgres://westfarn:replace-db-password@10.0.0.230:5432/client_site
|
||||
|
||||
WEB_PORT=8004
|
||||
|
||||
RECAPTCHA_PUBLIC_KEY=replace-me
|
||||
RECAPTCHA_PRIVATE_KEY=replace-me
|
||||
|
||||
# Required when FEATURE_EMAIL_SMS=true
|
||||
EMAIL_HOST=mail.smtp2go.com
|
||||
EMAIL_HOST_USER=
|
||||
EMAIL_HOST_PASSWORD=
|
||||
EMAIL_PORT=2525
|
||||
EMAIL_USE_TLS=true
|
||||
SMTP2GO_SMS_API_KEY=
|
||||
SMTP2GO_WEBHOOK_SECRET=
|
||||
|
||||
# Required when FEATURE_DIRECT_MAIL=true
|
||||
POSTCARD_PROVIDER=pcm
|
||||
PCM_API_KEY=
|
||||
PCM_API_SECRET=
|
||||
PCM_WEBHOOK_SECRETS=
|
||||
PCM_RETURN_ADDRESS=
|
||||
|
||||
# Required when FEATURE_PAYMENTS=true (also requires FEATURE_EMAIL_SMS=true)
|
||||
STRIPE_SECRET_KEY=
|
||||
STRIPE_PUBLISHABLE_KEY=
|
||||
STRIPE_WEBHOOK_SECRET=
|
||||
STRIPE_CURRENCY=usd
|
||||
|
||||
# Required when FEATURE_SOCIAL=true
|
||||
META_APP_ID=
|
||||
META_APP_SECRET=
|
||||
SOCIAL_TOKEN_ENCRYPTION_KEY=
|
||||
|
||||
# Required when FEATURE_SOCIAL_AI=true (requires FEATURE_SOCIAL)
|
||||
OLLAMA_BASE_URL=http://10.0.0.128:11434
|
||||
OLLAMA_MODEL=llama3.2
|
||||
OLLAMA_TIMEOUT_SECONDS=120
|
||||
|
||||
NOMINATIM_BASE_URL=http://10.0.0.128:8089
|
||||
NOMINATIM_TIMEOUT_SECONDS=8
|
||||
NOMINATIM_COUNTRY_CODES=us
|
||||
|
||||
TIANJI_ENABLED=true
|
||||
TIANJI_TRACKER_URL=https://tianji.aimloperations.com/tracker.js
|
||||
TIANJI_WEBSITE_ID=
|
||||
|
||||
GUNICORN_WORKERS=2
|
||||
GUNICORN_BIND=0.0.0.0:8000
|
||||
|
||||
# BETA overrides — <slug>-preview.aimloperations.com
|
||||
# DJANGO_ENV=beta
|
||||
# SITE_UNDER_CONSTRUCTION=false
|
||||
# PUBLIC_SITE_URL=https://example-preview.aimloperations.com
|
||||
# DATABASE_URL=postgres://westfarn:replace-db-password@10.0.0.230:5432/client_site_beta
|
||||
# WEB_PORT=8014
|
||||
@@ -0,0 +1,30 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: self-hosted
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install uv
|
||||
run: |
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
||||
|
||||
- name: Install dependencies
|
||||
run: uv sync --frozen
|
||||
|
||||
- name: Run unit tests
|
||||
env:
|
||||
DJANGO_ENV: dev
|
||||
DJANGO_SECRET_KEY: test-secret-key
|
||||
DATABASE_URL: ""
|
||||
DB_HOST: ""
|
||||
run: |
|
||||
cd site
|
||||
uv run python manage.py test
|
||||
@@ -0,0 +1,74 @@
|
||||
name: Deploy Beta
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
unit-tests:
|
||||
runs-on: self-hosted
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install uv
|
||||
run: |
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
||||
|
||||
- name: Install dependencies
|
||||
run: uv sync --frozen
|
||||
|
||||
- name: Run unit tests
|
||||
env:
|
||||
DJANGO_ENV: dev
|
||||
DJANGO_SECRET_KEY: test-secret-key
|
||||
DATABASE_URL: ""
|
||||
DB_HOST: ""
|
||||
run: |
|
||||
cd site
|
||||
uv run python manage.py test
|
||||
|
||||
docker:
|
||||
needs: unit-tests
|
||||
runs-on: self-hosted
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Build Docker image
|
||||
run: docker compose build
|
||||
|
||||
- name: Run containerized tests
|
||||
run: |
|
||||
set -euo pipefail
|
||||
unset DATABASE_URL DB_HOST DB_NAME DB_USER DB_PASSWORD DB_PORT \
|
||||
COMPOSE_DATABASE_URL DJANGO_ENV DJANGO_SECRET_KEY DJANGO_DEBUG \
|
||||
DJANGO_ALLOWED_HOSTS || true
|
||||
|
||||
PROJECT="client-ci-${{ gitea.sha }}"
|
||||
cleanup() { docker compose -p "$PROJECT" down -v --remove-orphans || true; }
|
||||
trap cleanup EXIT
|
||||
|
||||
docker compose -p "$PROJECT" up -d --wait db
|
||||
docker compose -p "$PROJECT" run --rm --no-deps --entrypoint "" \
|
||||
-e DJANGO_ENV=dev \
|
||||
-e DJANGO_SECRET_KEY=test-secret-key \
|
||||
-e DJANGO_DEBUG=true \
|
||||
-e DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1,testserver \
|
||||
-e DATABASE_URL=postgres://client_site:client_site@db:5432/client_site \
|
||||
-e SITE_UNDER_CONSTRUCTION=false \
|
||||
web uv run python manage.py test
|
||||
|
||||
deploy-beta:
|
||||
needs: docker
|
||||
runs-on: self-hosted
|
||||
env:
|
||||
SERVER_INFRA_ROOT: /home/westfarn/Documents/repos/server-infra
|
||||
ANSIBLE_PRIVATE_KEY_FILE: /home/westfarn/.ssh/ansible_deploy
|
||||
steps:
|
||||
- name: Deploy client_site beta to all webservers
|
||||
run: |
|
||||
"$SERVER_INFRA_ROOT/scripts/deploy.sh" \
|
||||
--app client_site \
|
||||
--env beta \
|
||||
--ref "${{ gitea.sha }}"
|
||||
@@ -0,0 +1,72 @@
|
||||
name: Deploy Prod
|
||||
|
||||
on:
|
||||
workflow_dispatch: {}
|
||||
|
||||
jobs:
|
||||
unit-tests:
|
||||
runs-on: self-hosted
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install uv
|
||||
run: |
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
||||
|
||||
- name: Install dependencies
|
||||
run: uv sync --frozen
|
||||
|
||||
- name: Run unit tests
|
||||
env:
|
||||
DJANGO_ENV: dev
|
||||
DJANGO_SECRET_KEY: test-secret-key
|
||||
DATABASE_URL: ""
|
||||
DB_HOST: ""
|
||||
run: |
|
||||
cd site
|
||||
uv run python manage.py test
|
||||
|
||||
docker:
|
||||
needs: unit-tests
|
||||
runs-on: self-hosted
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Build Docker image
|
||||
run: docker compose build
|
||||
|
||||
- name: Run containerized tests
|
||||
run: |
|
||||
set -euo pipefail
|
||||
unset DATABASE_URL DB_HOST DB_NAME DB_USER DB_PASSWORD DB_PORT \
|
||||
COMPOSE_DATABASE_URL DJANGO_ENV DJANGO_SECRET_KEY DJANGO_DEBUG \
|
||||
DJANGO_ALLOWED_HOSTS || true
|
||||
|
||||
PROJECT="client-ci-${{ gitea.sha }}"
|
||||
cleanup() { docker compose -p "$PROJECT" down -v --remove-orphans || true; }
|
||||
trap cleanup EXIT
|
||||
|
||||
docker compose -p "$PROJECT" up -d --wait db
|
||||
docker compose -p "$PROJECT" run --rm --no-deps --entrypoint "" \
|
||||
-e DJANGO_ENV=dev \
|
||||
-e DJANGO_SECRET_KEY=test-secret-key \
|
||||
-e DJANGO_DEBUG=true \
|
||||
-e DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1,testserver \
|
||||
-e DATABASE_URL=postgres://client_site:client_site@db:5432/client_site \
|
||||
-e SITE_UNDER_CONSTRUCTION=false \
|
||||
web uv run python manage.py test
|
||||
|
||||
deploy-prod:
|
||||
needs: docker
|
||||
runs-on: self-hosted
|
||||
env:
|
||||
SERVER_INFRA_ROOT: /home/westfarn/Documents/repos/server-infra
|
||||
ANSIBLE_PRIVATE_KEY_FILE: /home/westfarn/.ssh/ansible_deploy
|
||||
steps:
|
||||
- name: Deploy client_site prod to all webservers
|
||||
run: |
|
||||
"$SERVER_INFRA_ROOT/scripts/deploy.sh" \
|
||||
--app client_site \
|
||||
--env prod \
|
||||
--ref "${{ gitea.sha }}"
|
||||
@@ -0,0 +1,179 @@
|
||||
# ---> Python
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
cover/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
.pybuilder/
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# IPython
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# pyenv
|
||||
# For a library or package, you might want to ignore these files since the code is
|
||||
# intended to run in multiple environments; otherwise, check them in:
|
||||
# .python-version
|
||||
|
||||
# pipenv
|
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||
# install all needed dependencies.
|
||||
#Pipfile.lock
|
||||
|
||||
# UV
|
||||
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
||||
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||
# commonly ignored for libraries.
|
||||
#uv.lock
|
||||
|
||||
# poetry
|
||||
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
||||
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||
# commonly ignored for libraries.
|
||||
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
||||
#poetry.lock
|
||||
|
||||
# pdm
|
||||
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
||||
#pdm.lock
|
||||
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
||||
# in version control.
|
||||
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
|
||||
.pdm.toml
|
||||
.pdm-python
|
||||
.pdm-build/
|
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||
__pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat.pid
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
# mkdocs documentation (do not ignore ./site — that is the Django project)
|
||||
# /site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# pytype static type analyzer
|
||||
.pytype/
|
||||
|
||||
# Cython debug symbols
|
||||
cython_debug/
|
||||
|
||||
# PyCharm
|
||||
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
#.idea/
|
||||
|
||||
# Ruff stuff:
|
||||
.ruff_cache/
|
||||
|
||||
# PyPI configuration file
|
||||
.pypirc
|
||||
|
||||
|
||||
# Django collectstatic output
|
||||
staticfiles/
|
||||
@@ -0,0 +1,29 @@
|
||||
FROM python:3.12-slim
|
||||
|
||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||
PYTHONUNBUFFERED=1 \
|
||||
UV_COMPILE_BYTECODE=1 \
|
||||
UV_LINK_MODE=copy \
|
||||
UV_PROJECT_ENVIRONMENT=/app/.venv
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends libpq5 \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
|
||||
|
||||
COPY pyproject.toml uv.lock ./
|
||||
RUN uv sync --frozen --no-dev
|
||||
|
||||
COPY site ./site
|
||||
COPY scripts/docker-entrypoint.sh /entrypoint.sh
|
||||
COPY scripts/worker-entrypoint.sh /worker-entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh /worker-entrypoint.sh
|
||||
|
||||
WORKDIR /app/site
|
||||
|
||||
EXPOSE 8000
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
@@ -0,0 +1,63 @@
|
||||
# web_django_template
|
||||
|
||||
Gitea template for AI ML Operations client websites
|
||||
([Web Design & Hosting](https://aimloperations.com/web_design)).
|
||||
|
||||
Clone this repo (or **Use this template**), run `scripts/bootstrap-client.sh`,
|
||||
set branding + `FEATURE_*` flags in the secret env file, deploy.
|
||||
|
||||
Always included: public site (landing, about, contact) and client portal
|
||||
(login, dashboard, leads, UTM analytics). Optional catalog add-ons are
|
||||
separate Django apps. A flag that is off keeps the app out of
|
||||
`INSTALLED_APPS` — no models, admin, URLs, or portal nav.
|
||||
|
||||
## Catalog → flags
|
||||
|
||||
| Catalog item | Flag | App |
|
||||
|---|---|---|
|
||||
| Public site | (always on) | `public` |
|
||||
| Client portal + UTM | (always on) | `accounts`, `dashboard`, `leads`, `analytics`, `contacts`, `core` |
|
||||
| Email & SMS | `FEATURE_EMAIL_SMS` | `email_sms` |
|
||||
| Direct mail (PCM) | `FEATURE_DIRECT_MAIL` | `directmail` |
|
||||
| Blog | `FEATURE_BLOG` | `blog` |
|
||||
| Payments (Stripe) | `FEATURE_PAYMENTS` | `payments` (requires email/SMS) |
|
||||
| Social consolidation | `FEATURE_SOCIAL` | `social` |
|
||||
| AI social generator | `FEATURE_SOCIAL_AI` | `social_ai` (requires social) |
|
||||
|
||||
## New client
|
||||
|
||||
```bash
|
||||
# 1. Create repo from this Gitea template, clone it.
|
||||
# 2. Rename package + branding placeholders:
|
||||
./scripts/bootstrap-client.sh acme_site "Acme HVAC" acmehvac.com
|
||||
|
||||
# 3. Brand public templates and static/brand/ (logo, colors, copy).
|
||||
|
||||
# 4. Secrets on the control node:
|
||||
mkdir -p ~/Documents/secrets/acme_site
|
||||
cp .env.prod.example ~/Documents/secrets/acme_site/acme_site_prod.env
|
||||
# Flip only purchased FEATURE_* flags. Fill provider secrets.
|
||||
./scripts/validate-env.sh ~/Documents/secrets/acme_site/acme_site_prod.env
|
||||
|
||||
# 5. Infra: Postgres on 10.0.0.230, server-infra app_catalog, NPM, CI.
|
||||
# 6. Deploy. Create a portal user (createsuperuser).
|
||||
```
|
||||
|
||||
Local:
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
uv sync
|
||||
cd site
|
||||
uv run python manage.py migrate
|
||||
uv run python manage.py runserver
|
||||
# or: docker compose up
|
||||
```
|
||||
|
||||
## Stack
|
||||
|
||||
Django 6 + uv · Postgres (prod/beta); SQLite locally · dj-queue · Docker ·
|
||||
server-infra Ansible deploy.
|
||||
|
||||
Ollama for social drafts lives on the LAN at `http://10.0.0.128:11434`.
|
||||
Do not call a public Ollama host.
|
||||
@@ -0,0 +1,23 @@
|
||||
# Production compose for server-infra deploy. No bundled Postgres — use shared
|
||||
# external DB via DATABASE_URL in .env (see .env.prod.example).
|
||||
#
|
||||
# Web runs on every app host (active/active). Start the dj-queue worker on
|
||||
# exactly ONE host via:
|
||||
# docker compose -f docker-compose.prod.yml --profile worker up -d
|
||||
# Worker also polls dispatch_due so scheduled campaigns/social posts fire.
|
||||
services:
|
||||
web:
|
||||
build: .
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "${WEB_PORT:-8004}:8000"
|
||||
env_file:
|
||||
- .env
|
||||
|
||||
worker:
|
||||
build: .
|
||||
restart: unless-stopped
|
||||
profiles: ["worker"]
|
||||
entrypoint: ["/worker-entrypoint.sh"]
|
||||
env_file:
|
||||
- .env
|
||||
@@ -0,0 +1,116 @@
|
||||
services:
|
||||
db:
|
||||
image: postgres:16-alpine
|
||||
environment:
|
||||
POSTGRES_DB: client_site
|
||||
POSTGRES_USER: client_site
|
||||
POSTGRES_PASSWORD: client_site
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U client_site -d client_site"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
start_period: 10s
|
||||
|
||||
web:
|
||||
build: .
|
||||
ports:
|
||||
- "8000:8000"
|
||||
# Bind-mount source so edit → runserver auto-reload (no rebuild).
|
||||
volumes:
|
||||
- ./site:/app/site
|
||||
# No required env_file — CI has no .env. Defaults below; for local secrets:
|
||||
# docker compose --env-file .env up
|
||||
#
|
||||
# Do NOT interpolate ${DATABASE_URL} here. On the Act runner / control node that
|
||||
# var often points at shared prod/beta Postgres; compose would bake it into
|
||||
# containerized tests. Use COMPOSE_DATABASE_URL only if you need to override.
|
||||
environment:
|
||||
DJANGO_ENV: ${DJANGO_ENV:-dev}
|
||||
DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY:-dev-only-change-me}
|
||||
DJANGO_DEBUG: ${DJANGO_DEBUG:-true}
|
||||
DJANGO_ALLOWED_HOSTS: ${DJANGO_ALLOWED_HOSTS:-localhost,127.0.0.1,0.0.0.0}
|
||||
DATABASE_URL: ${COMPOSE_DATABASE_URL:-postgres://client_site:client_site@db:5432/client_site}
|
||||
SITE_UNDER_CONSTRUCTION: ${SITE_UNDER_CONSTRUCTION:-false}
|
||||
FEATURE_EMAIL_SMS: ${FEATURE_EMAIL_SMS:-true}
|
||||
FEATURE_DIRECT_MAIL: ${FEATURE_DIRECT_MAIL:-true}
|
||||
FEATURE_BLOG: ${FEATURE_BLOG:-true}
|
||||
FEATURE_PAYMENTS: ${FEATURE_PAYMENTS:-true}
|
||||
FEATURE_SOCIAL: ${FEATURE_SOCIAL:-true}
|
||||
FEATURE_SOCIAL_AI: ${FEATURE_SOCIAL_AI:-true}
|
||||
PUBLIC_SITE_URL: ${PUBLIC_SITE_URL:-http://127.0.0.1:8000}
|
||||
EMAIL_HOST: ${EMAIL_HOST:-mail.smtp2go.com}
|
||||
EMAIL_HOST_USER: ${EMAIL_HOST_USER:-}
|
||||
EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD:-}
|
||||
EMAIL_PORT: ${EMAIL_PORT:-2525}
|
||||
EMAIL_USE_TLS: ${EMAIL_USE_TLS:-true}
|
||||
DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL:-noreply@example.com}
|
||||
# Dev default = console. Set smtp backend in `.env` for real SMTP2GO sends.
|
||||
EMAIL_BACKEND: ${EMAIL_BACKEND:-django.core.mail.backends.console.EmailBackend}
|
||||
SMTP2GO_SMS_API_KEY: ${SMTP2GO_SMS_API_KEY:-}
|
||||
SMTP2GO_WEBHOOK_SECRET: ${SMTP2GO_WEBHOOK_SECRET:-}
|
||||
POSTCARD_PROVIDER: ${POSTCARD_PROVIDER:-pcm}
|
||||
PCM_API_KEY: ${PCM_API_KEY:-}
|
||||
PCM_API_SECRET: ${PCM_API_SECRET:-}
|
||||
PCM_CHILD_REF_NBR: ${PCM_CHILD_REF_NBR:-}
|
||||
PCM_WEBHOOK_SECRETS: ${PCM_WEBHOOK_SECRETS:-}
|
||||
PCM_WEBHOOK_SECRET: ${PCM_WEBHOOK_SECRET:-}
|
||||
# Quote JSON in `.env`: PCM_RETURN_ADDRESS='{"firstName":"…",...}'
|
||||
PCM_RETURN_ADDRESS: ${PCM_RETURN_ADDRESS:-}
|
||||
PCM_RETURN_LINE1: ${PCM_RETURN_LINE1:-}
|
||||
PCM_RETURN_LINE2: ${PCM_RETURN_LINE2:-}
|
||||
PCM_RETURN_CITY: ${PCM_RETURN_CITY:-}
|
||||
PCM_RETURN_STATE: ${PCM_RETURN_STATE:-}
|
||||
PCM_RETURN_ZIP: ${PCM_RETURN_ZIP:-}
|
||||
META_APP_ID: ${META_APP_ID:-}
|
||||
META_APP_SECRET: ${META_APP_SECRET:-}
|
||||
SOCIAL_TOKEN_ENCRYPTION_KEY: ${SOCIAL_TOKEN_ENCRYPTION_KEY:-}
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
|
||||
worker:
|
||||
build: .
|
||||
entrypoint: ["/worker-entrypoint.sh"]
|
||||
volumes:
|
||||
- ./site:/app/site
|
||||
environment:
|
||||
DJANGO_ENV: ${DJANGO_ENV:-dev}
|
||||
DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY:-dev-only-change-me}
|
||||
DJANGO_DEBUG: ${DJANGO_DEBUG:-true}
|
||||
DJANGO_ALLOWED_HOSTS: ${DJANGO_ALLOWED_HOSTS:-localhost,127.0.0.1,0.0.0.0}
|
||||
DATABASE_URL: ${COMPOSE_DATABASE_URL:-postgres://client_site:client_site@db:5432/client_site}
|
||||
PUBLIC_SITE_URL: ${PUBLIC_SITE_URL:-http://127.0.0.1:8000}
|
||||
DISPATCH_DUE_INTERVAL_SECONDS: ${DISPATCH_DUE_INTERVAL_SECONDS:-15}
|
||||
EMAIL_HOST: ${EMAIL_HOST:-mail.smtp2go.com}
|
||||
EMAIL_HOST_USER: ${EMAIL_HOST_USER:-}
|
||||
EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD:-}
|
||||
EMAIL_PORT: ${EMAIL_PORT:-2525}
|
||||
EMAIL_USE_TLS: ${EMAIL_USE_TLS:-true}
|
||||
DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL:-noreply@example.com}
|
||||
EMAIL_BACKEND: ${EMAIL_BACKEND:-django.core.mail.backends.console.EmailBackend}
|
||||
SMTP2GO_SMS_API_KEY: ${SMTP2GO_SMS_API_KEY:-}
|
||||
SMTP2GO_WEBHOOK_SECRET: ${SMTP2GO_WEBHOOK_SECRET:-}
|
||||
POSTCARD_PROVIDER: ${POSTCARD_PROVIDER:-pcm}
|
||||
PCM_API_KEY: ${PCM_API_KEY:-}
|
||||
PCM_API_SECRET: ${PCM_API_SECRET:-}
|
||||
PCM_CHILD_REF_NBR: ${PCM_CHILD_REF_NBR:-}
|
||||
PCM_WEBHOOK_SECRETS: ${PCM_WEBHOOK_SECRETS:-}
|
||||
PCM_WEBHOOK_SECRET: ${PCM_WEBHOOK_SECRET:-}
|
||||
PCM_RETURN_ADDRESS: ${PCM_RETURN_ADDRESS:-}
|
||||
PCM_RETURN_LINE1: ${PCM_RETURN_LINE1:-}
|
||||
PCM_RETURN_LINE2: ${PCM_RETURN_LINE2:-}
|
||||
PCM_RETURN_CITY: ${PCM_RETURN_CITY:-}
|
||||
PCM_RETURN_STATE: ${PCM_RETURN_STATE:-}
|
||||
PCM_RETURN_ZIP: ${PCM_RETURN_ZIP:-}
|
||||
META_APP_ID: ${META_APP_ID:-}
|
||||
META_APP_SECRET: ${META_APP_SECRET:-}
|
||||
SOCIAL_TOKEN_ENCRYPTION_KEY: ${SOCIAL_TOKEN_ENCRYPTION_KEY:-}
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
@@ -0,0 +1,27 @@
|
||||
[project]
|
||||
name = "web-django-template"
|
||||
version = "0.1.0"
|
||||
description = "Template for AI ML Operations client websites (public site + portal + optional catalog apps)"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.12"
|
||||
dependencies = [
|
||||
"django>=6.0,<7",
|
||||
"dj-queue[postgres]>=0.13.0",
|
||||
"django-phonenumber-field>=8.1.0",
|
||||
"django-recaptcha>=4.1.0",
|
||||
"cryptography>=44.0.0",
|
||||
"gunicorn>=23.0.0",
|
||||
"phonenumbers>=9.0.0",
|
||||
"psycopg[binary]>=3.3.3",
|
||||
"requests>=2.32.0",
|
||||
"stripe>=11.0.0",
|
||||
"whitenoise>=6.9.0",
|
||||
]
|
||||
|
||||
[dependency-groups]
|
||||
dev = [
|
||||
"pre-commit>=4.1.0",
|
||||
]
|
||||
|
||||
[tool.uv]
|
||||
package = false
|
||||
@@ -0,0 +1,60 @@
|
||||
#!/usr/bin/env bash
|
||||
# Seed a client repo from this template.
|
||||
# Usage: scripts/bootstrap-client.sh <slug> "<Site Name>" <domain>
|
||||
# Example: scripts/bootstrap-client.sh acme_site "Acme HVAC" acmehvac.com
|
||||
set -euo pipefail
|
||||
|
||||
SLUG="${1:?Usage: $0 <slug> \"<Site Name>\" <domain>}"
|
||||
SITE_NAME="${2:?Usage: $0 <slug> \"<Site Name>\" <domain>}"
|
||||
DOMAIN="${3:?Usage: $0 <slug> \"<Site Name>\" <domain>}"
|
||||
|
||||
if [[ ! "$SLUG" =~ ^[a-z][a-z0-9_]*$ ]]; then
|
||||
echo "slug must be snake_case starting with a letter (e.g. acme_site)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
cd "$ROOT"
|
||||
|
||||
if [[ "$SLUG" == "client_site" ]]; then
|
||||
echo "slug is already client_site — branding defaults only."
|
||||
else
|
||||
echo "Renaming package client_site → $SLUG"
|
||||
if [[ -d site/client_site ]]; then
|
||||
mv site/client_site "site/$SLUG"
|
||||
fi
|
||||
grep -rl 'client_site' \
|
||||
--exclude-dir=.git --exclude-dir=.venv --exclude-dir=__pycache__ \
|
||||
--exclude='*.png' --exclude='*.jpg' --exclude='*.woff*' --exclude='*.eot' \
|
||||
--exclude='uv.lock' . \
|
||||
| while read -r f; do
|
||||
sed -i "s/client_site/${SLUG}/g" "$f"
|
||||
done
|
||||
fi
|
||||
|
||||
python3 -c "
|
||||
from pathlib import Path
|
||||
name, domain = '''${SITE_NAME}''', '''${DOMAIN}'''
|
||||
for rel in ('.env.example', '.env.prod.example'):
|
||||
p = Path(rel)
|
||||
if not p.exists():
|
||||
continue
|
||||
text = p.read_text()
|
||||
text = text.replace('SITE_NAME=Your Company', f'SITE_NAME={name}')
|
||||
text = text.replace('hello@example.com', f'hello@{domain}')
|
||||
text = text.replace('noreply@example.com', f'noreply@{domain}')
|
||||
text = text.replace('PUBLIC_SITE_URL=https://example.com', f'PUBLIC_SITE_URL=https://{domain}')
|
||||
text = text.replace('DJANGO_ALLOWED_HOSTS=example.com,www.example.com',
|
||||
f'DJANGO_ALLOWED_HOSTS={domain},www.{domain}')
|
||||
p.write_text(text)
|
||||
"
|
||||
|
||||
echo
|
||||
echo "Next:"
|
||||
echo " 1. Brand public templates + static/brand/ (logo, colors, copy)."
|
||||
echo " 2. Copy .env.prod.example → ~/Documents/secrets/${SLUG}/${SLUG}_prod.env"
|
||||
echo " Flip only the FEATURE_* flags they bought. Fill provider secrets."
|
||||
echo " 3. Validate: ./scripts/validate-env.sh ~/Documents/secrets/${SLUG}/${SLUG}_prod.env"
|
||||
echo " 4. Infra: Postgres on 10.0.0.230, server-infra app_catalog, NPM vhost, CI deploy."
|
||||
echo " 5. Deploy. Smoke public home/contact, portal login, leads, UTM."
|
||||
echo " Disabled feature URLs must 404 and must not appear in portal nav."
|
||||
@@ -0,0 +1,56 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
cd /app/site
|
||||
|
||||
wait_for_database() {
|
||||
if [[ -z "${DATABASE_URL:-}" && -z "${DB_HOST:-}" ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "Waiting for database..."
|
||||
for _ in $(seq 1 30); do
|
||||
if uv run python - <<'PY'
|
||||
import os
|
||||
import sys
|
||||
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "client_site.settings")
|
||||
|
||||
import django
|
||||
from django.db import connections
|
||||
from django.db.utils import OperationalError
|
||||
|
||||
django.setup()
|
||||
|
||||
try:
|
||||
connections["default"].ensure_connection()
|
||||
except OperationalError:
|
||||
sys.exit(1)
|
||||
PY
|
||||
then
|
||||
echo "Database is ready."
|
||||
return 0
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
echo "Database did not become ready in time." >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
wait_for_database
|
||||
|
||||
uv run python manage.py migrate --noinput
|
||||
|
||||
# Local compose defaults to DJANGO_ENV=dev: runserver + source bind-mount → hot reload.
|
||||
# Prod/beta images keep gunicorn (no file watch).
|
||||
if [[ "${DJANGO_ENV:-}" == "dev" || "${DJANGO_USE_RUNSERVER:-}" == "true" ]]; then
|
||||
echo "Starting Django runserver (auto-reload on)."
|
||||
exec uv run python manage.py runserver "${GUNICORN_BIND:-0.0.0.0:8000}"
|
||||
fi
|
||||
|
||||
uv run python manage.py collectstatic --noinput
|
||||
|
||||
exec uv run gunicorn client_site.wsgi:application \
|
||||
--bind "${GUNICORN_BIND:-0.0.0.0:8000}" \
|
||||
--workers "${GUNICORN_WORKERS:-2}"
|
||||
@@ -0,0 +1,97 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ENV_FILE="${1:?Usage: $0 <env-file>}"
|
||||
|
||||
if [[ ! -f "$ENV_FILE" ]]; then
|
||||
echo "Environment file not found: $ENV_FILE" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -a
|
||||
# shellcheck disable=SC1090
|
||||
source "$ENV_FILE"
|
||||
set +a
|
||||
|
||||
DJANGO_ENV="${DJANGO_ENV:-prod}"
|
||||
_true() { [[ "${1:-}" =~ ^(1|true|yes|on)$ ]]; }
|
||||
|
||||
required_vars=(
|
||||
DJANGO_SECRET_KEY
|
||||
DJANGO_ALLOWED_HOSTS
|
||||
DATABASE_URL
|
||||
WEB_PORT
|
||||
)
|
||||
|
||||
if [[ "$DJANGO_ENV" == "prod" || "$DJANGO_ENV" == "beta" ]]; then
|
||||
required_vars+=(
|
||||
RECAPTCHA_PUBLIC_KEY
|
||||
RECAPTCHA_PRIVATE_KEY
|
||||
)
|
||||
fi
|
||||
|
||||
if [[ "$DJANGO_ENV" == "prod" ]]; then
|
||||
required_vars+=(
|
||||
SITE_UNDER_CONSTRUCTION
|
||||
TIANJI_WEBSITE_ID
|
||||
)
|
||||
fi
|
||||
|
||||
if _true "${FEATURE_EMAIL_SMS:-}"; then
|
||||
required_vars+=(
|
||||
EMAIL_HOST_USER
|
||||
EMAIL_HOST_PASSWORD
|
||||
SMTP2GO_SMS_API_KEY
|
||||
SMTP2GO_WEBHOOK_SECRET
|
||||
)
|
||||
fi
|
||||
if _true "${FEATURE_DIRECT_MAIL:-}"; then
|
||||
required_vars+=(
|
||||
PCM_API_KEY
|
||||
PCM_API_SECRET
|
||||
PCM_WEBHOOK_SECRETS
|
||||
PCM_RETURN_ADDRESS
|
||||
)
|
||||
fi
|
||||
if _true "${FEATURE_PAYMENTS:-}"; then
|
||||
required_vars+=(
|
||||
STRIPE_SECRET_KEY
|
||||
STRIPE_PUBLISHABLE_KEY
|
||||
STRIPE_WEBHOOK_SECRET
|
||||
)
|
||||
if ! _true "${FEATURE_EMAIL_SMS:-}"; then
|
||||
echo "FEATURE_PAYMENTS requires FEATURE_EMAIL_SMS" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
if _true "${FEATURE_SOCIAL:-}"; then
|
||||
required_vars+=(SOCIAL_TOKEN_ENCRYPTION_KEY)
|
||||
fi
|
||||
if _true "${FEATURE_SOCIAL_AI:-}"; then
|
||||
required_vars+=(OLLAMA_BASE_URL OLLAMA_MODEL)
|
||||
if ! _true "${FEATURE_SOCIAL:-}"; then
|
||||
echo "FEATURE_SOCIAL_AI requires FEATURE_SOCIAL" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
missing=()
|
||||
for var in "${required_vars[@]}"; do
|
||||
if [[ -z "${!var:-}" ]]; then
|
||||
missing+=("$var")
|
||||
fi
|
||||
done
|
||||
|
||||
if ((${#missing[@]} > 0)); then
|
||||
echo "Missing required environment variables in $ENV_FILE:" >&2
|
||||
printf ' - %s\n' "${missing[@]}" >&2
|
||||
echo "Copy .env.prod.example to ~/Documents/secrets/<slug>_site/<slug>_site_${DJANGO_ENV}.env and set values." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ "$DJANGO_ENV" == "prod" && "$DJANGO_SECRET_KEY" == change-me* ]]; then
|
||||
echo "DJANGO_SECRET_KEY must be changed from the example value for production." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Environment validation passed (DJANGO_ENV=$DJANGO_ENV)."
|
||||
@@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
cd /app/site
|
||||
|
||||
wait_for_database() {
|
||||
if [[ -z "${DATABASE_URL:-}" && -z "${DB_HOST:-}" ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "Waiting for database..."
|
||||
for _ in $(seq 1 30); do
|
||||
if uv run python - <<'PY'
|
||||
import os
|
||||
import sys
|
||||
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "client_site.settings")
|
||||
|
||||
import django
|
||||
from django.db import connections
|
||||
from django.db.utils import OperationalError
|
||||
|
||||
django.setup()
|
||||
|
||||
try:
|
||||
connections["default"].ensure_connection()
|
||||
except OperationalError:
|
||||
sys.exit(1)
|
||||
PY
|
||||
then
|
||||
echo "Database is ready."
|
||||
return 0
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
echo "Database did not become ready in time." >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
wait_for_database
|
||||
|
||||
uv run python manage.py migrate --noinput
|
||||
|
||||
# Email branding (and anything else that resolves static URLs) needs the
|
||||
# ManifestStaticFilesStorage map. Web entrypoint already collectstatics;
|
||||
# worker must too or hashed lookups raise ValueError.
|
||||
uv run python manage.py collectstatic --noinput
|
||||
|
||||
interval="${DISPATCH_DUE_INTERVAL_SECONDS:-15}"
|
||||
echo "Starting dispatch_due poller (every ${interval}s)."
|
||||
uv run python manage.py dispatch_due --loop --interval "${interval}" &
|
||||
dispatch_pid=$!
|
||||
|
||||
cleanup() {
|
||||
echo "Stopping dispatch_due poller..."
|
||||
kill "${dispatch_pid}" 2>/dev/null || true
|
||||
wait "${dispatch_pid}" 2>/dev/null || true
|
||||
}
|
||||
trap cleanup EXIT INT TERM
|
||||
|
||||
# Dev uses ImmediateBackend: enqueue runs inline in dispatch_due. No dj-queue.
|
||||
if [[ "${DJANGO_ENV:-}" == "dev" ]]; then
|
||||
echo "Dev worker: dispatch_due loop publishes scheduled work."
|
||||
wait "${dispatch_pid}"
|
||||
exit $?
|
||||
fi
|
||||
|
||||
# dj-queue supervisor (workers + dispatcher + scheduler). Run on ONE host only.
|
||||
uv run python manage.py dj_queue
|
||||
@@ -0,0 +1,9 @@
|
||||
from django.contrib import admin
|
||||
|
||||
from accounts.models import RealtorProfile
|
||||
|
||||
|
||||
@admin.register(RealtorProfile)
|
||||
class RealtorProfileAdmin(admin.ModelAdmin):
|
||||
list_display = ("user", "display_name", "phone")
|
||||
search_fields = ("user__username", "display_name")
|
||||
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class AccountsConfig(AppConfig):
|
||||
default_auto_field = "django.db.models.BigAutoField"
|
||||
name = "accounts"
|
||||
@@ -0,0 +1,33 @@
|
||||
# Generated by Django 6.1 on 2026-08-26 11:38
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='RealtorProfile',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('display_name', models.CharField(blank=True, max_length=120)),
|
||||
('phone', models.CharField(blank=True, max_length=32)),
|
||||
('title', models.CharField(blank=True, max_length=120)),
|
||||
('bio', models.TextField(blank=True)),
|
||||
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='realtor_profile', to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,19 @@
|
||||
from django.conf import settings
|
||||
from django.db import models
|
||||
|
||||
from core.models import TimeStampedModel
|
||||
|
||||
|
||||
class RealtorProfile(TimeStampedModel):
|
||||
user = models.OneToOneField(
|
||||
settings.AUTH_USER_MODEL,
|
||||
on_delete=models.CASCADE,
|
||||
related_name="realtor_profile",
|
||||
)
|
||||
display_name = models.CharField(max_length=120, blank=True)
|
||||
phone = models.CharField(max_length=32, blank=True)
|
||||
title = models.CharField(max_length=120, blank=True)
|
||||
bio = models.TextField(blank=True)
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self.display_name or self.user.get_username()
|
||||
@@ -0,0 +1,42 @@
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Sign in · Portal · {{ SITE_NAME }}</title>
|
||||
<link rel="icon" href="{% static 'brand/favicon-32.png' %}" type="image/png">
|
||||
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Work+Sans:300,400,500,700%7CPoppins:400,600,700">
|
||||
<link rel="stylesheet" href="{% static 'css/portal.css' %}">
|
||||
</head>
|
||||
<body class="portal">
|
||||
<div class="login-wrap">
|
||||
<div class="login-card">
|
||||
<h1>{{ SITE_NAME }} portal</h1>
|
||||
<p class="sub">{{ SITE_TAGLINE }}</p>
|
||||
<p class="sub" style="margin-top:0;margin-bottom:16px;font-size:13px">Leads, campaigns, and social — one place.</p>
|
||||
{% if form.errors %}
|
||||
<ul class="portal-flash">
|
||||
<li class="error">Invalid email or password.</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
<form class="form-grid" method="post" action="{% url 'accounts:login' %}">
|
||||
{% csrf_token %}
|
||||
{% if next %}<input type="hidden" name="next" value="{{ next }}">{% endif %}
|
||||
<div class="field">
|
||||
<label for="id_username">Email</label>
|
||||
<input id="id_username" type="text" name="username" autocomplete="username" required value="{{ form.username.value|default:'' }}">
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="id_password">Password</label>
|
||||
<input id="id_password" type="password" name="password" autocomplete="current-password" required>
|
||||
</div>
|
||||
<button class="btn btn-primary" type="submit" data-tianji-event="login_submit">Sign in</button>
|
||||
</form>
|
||||
<p style="margin-top:16px;font-size:13px;color:#6b7280">
|
||||
<a href="{% url 'public:home' %}">← Back to site</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,17 @@
|
||||
from django.contrib.auth import views as auth_views
|
||||
from django.urls import path
|
||||
|
||||
app_name = "accounts"
|
||||
|
||||
urlpatterns = [
|
||||
path(
|
||||
"login/",
|
||||
auth_views.LoginView.as_view(template_name="accounts/login.html"),
|
||||
name="login",
|
||||
),
|
||||
path(
|
||||
"logout/",
|
||||
auth_views.LogoutView.as_view(),
|
||||
name="logout",
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
from django.contrib import admin
|
||||
|
||||
from analytics.models import Attribution, PageView, UTMVisit
|
||||
|
||||
|
||||
@admin.register(PageView)
|
||||
class PageViewAdmin(admin.ModelAdmin):
|
||||
list_display = ("path", "created_at")
|
||||
list_filter = ("created_at",)
|
||||
search_fields = ("path",)
|
||||
date_hierarchy = "created_at"
|
||||
readonly_fields = ("id", "path", "created_at", "updated_at")
|
||||
|
||||
|
||||
@admin.register(UTMVisit)
|
||||
class UTMVisitAdmin(admin.ModelAdmin):
|
||||
list_display = ("utm_source", "utm_campaign", "path", "created_at")
|
||||
search_fields = ("utm_source", "utm_campaign", "correlation_id")
|
||||
|
||||
|
||||
@admin.register(Attribution)
|
||||
class AttributionAdmin(admin.ModelAdmin):
|
||||
list_display = ("lead", "utm_source", "utm_campaign", "created_at")
|
||||
@@ -0,0 +1,17 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class AnalyticsConfig(AppConfig):
|
||||
default_auto_field = "django.db.models.BigAutoField"
|
||||
name = "analytics"
|
||||
|
||||
def ready(self):
|
||||
from core.registry import register_portal_nav
|
||||
|
||||
register_portal_nav(
|
||||
section="analytics",
|
||||
label="Analytics",
|
||||
url_name="analytics:report",
|
||||
group="Overview",
|
||||
order=30,
|
||||
)
|
||||
@@ -0,0 +1,106 @@
|
||||
import logging
|
||||
|
||||
from django.utils.crypto import get_random_string
|
||||
|
||||
from analytics.models import Attribution, PageView, UTMVisit
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
CORRELATION_COOKIE = "ms_cid"
|
||||
|
||||
# Portal, auth, health, assets, and transactional public endpoints.
|
||||
_SKIP_PREFIXES = (
|
||||
"/portal/",
|
||||
"/admin/",
|
||||
"/accounts/",
|
||||
"/api/",
|
||||
"/healthz",
|
||||
"/static/",
|
||||
"/media/",
|
||||
"/unsubscribe/",
|
||||
)
|
||||
_SKIP_PATHS = frozenset({"/robots.txt", "/sitemap.xml", "/favicon.ico"})
|
||||
|
||||
|
||||
class PublicPageViewMiddleware:
|
||||
"""Record successful GET hits on public marketing pages."""
|
||||
|
||||
def __init__(self, get_response):
|
||||
self.get_response = get_response
|
||||
|
||||
def __call__(self, request):
|
||||
response = self.get_response(request)
|
||||
if _should_record_page_view(request, response):
|
||||
try:
|
||||
PageView.objects.create(path=request.path[:512])
|
||||
except Exception:
|
||||
logger.exception("Failed to record page view for %s", request.path)
|
||||
return response
|
||||
|
||||
|
||||
def _should_record_page_view(request, response) -> bool:
|
||||
if request.method != "GET":
|
||||
return False
|
||||
if getattr(response, "status_code", 0) != 200:
|
||||
return False
|
||||
path = request.path
|
||||
if path in _SKIP_PATHS:
|
||||
return False
|
||||
return not any(path.startswith(prefix) for prefix in _SKIP_PREFIXES)
|
||||
|
||||
|
||||
class UTMTrackingMiddleware:
|
||||
"""Capture UTM params into UTMVisit and stash a correlation id cookie."""
|
||||
|
||||
def __init__(self, get_response):
|
||||
self.get_response = get_response
|
||||
|
||||
def __call__(self, request):
|
||||
cid = request.COOKIES.get(CORRELATION_COOKIE) or get_random_string(32)
|
||||
request.utm_correlation_id = cid
|
||||
|
||||
params = request.GET
|
||||
has_utm = any(params.get(k) for k in (
|
||||
"utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"
|
||||
))
|
||||
if has_utm or params.get("utm_source"):
|
||||
UTMVisit.objects.create(
|
||||
correlation_id=cid,
|
||||
path=request.path[:512],
|
||||
referrer=(request.META.get("HTTP_REFERER") or "")[:1024],
|
||||
utm_source=params.get("utm_source", "")[:128],
|
||||
utm_medium=params.get("utm_medium", "")[:128],
|
||||
utm_campaign=params.get("utm_campaign", "")[:128],
|
||||
utm_term=params.get("utm_term", "")[:128],
|
||||
utm_content=params.get("utm_content", "")[:128],
|
||||
user_agent=(request.META.get("HTTP_USER_AGENT") or "")[:512],
|
||||
)
|
||||
|
||||
response = self.get_response(request)
|
||||
if CORRELATION_COOKIE not in request.COOKIES:
|
||||
response.set_cookie(
|
||||
CORRELATION_COOKIE,
|
||||
cid,
|
||||
max_age=60 * 60 * 24 * 30,
|
||||
samesite="Lax",
|
||||
)
|
||||
return response
|
||||
|
||||
|
||||
def attribute_lead_from_request(request, lead) -> Attribution | None:
|
||||
cid = getattr(request, "utm_correlation_id", None) or request.COOKIES.get(
|
||||
CORRELATION_COOKIE
|
||||
)
|
||||
visit = None
|
||||
if cid:
|
||||
visit = (
|
||||
UTMVisit.objects.filter(correlation_id=cid).order_by("-created_at").first()
|
||||
)
|
||||
return Attribution.objects.create(
|
||||
lead=lead,
|
||||
visit=visit,
|
||||
utm_source=visit.utm_source if visit else "",
|
||||
utm_medium=visit.utm_medium if visit else "",
|
||||
utm_campaign=visit.utm_campaign if visit else "",
|
||||
)
|
||||
@@ -0,0 +1,66 @@
|
||||
# Generated by Django 6.1 on 2026-08-26 11:38
|
||||
|
||||
import django.db.models.deletion
|
||||
import uuid
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('leads', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='UTMVisit',
|
||||
fields=[
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
||||
('correlation_id', models.CharField(db_index=True, max_length=64)),
|
||||
('path', models.CharField(blank=True, max_length=512)),
|
||||
('referrer', models.URLField(blank=True, max_length=1024)),
|
||||
('utm_source', models.CharField(blank=True, max_length=128)),
|
||||
('utm_medium', models.CharField(blank=True, max_length=128)),
|
||||
('utm_campaign', models.CharField(blank=True, max_length=128)),
|
||||
('utm_term', models.CharField(blank=True, max_length=128)),
|
||||
('utm_content', models.CharField(blank=True, max_length=128)),
|
||||
('user_agent', models.CharField(blank=True, max_length=512)),
|
||||
],
|
||||
options={
|
||||
'ordering': ['-created_at'],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='PageView',
|
||||
fields=[
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
||||
('path', models.CharField(db_index=True, max_length=512)),
|
||||
],
|
||||
options={
|
||||
'ordering': ['-created_at'],
|
||||
'indexes': [models.Index(fields=['created_at', 'path'], name='analytics_p_created_9e8b64_idx')],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Attribution',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('utm_source', models.CharField(blank=True, max_length=128)),
|
||||
('utm_medium', models.CharField(blank=True, max_length=128)),
|
||||
('utm_campaign', models.CharField(blank=True, max_length=128)),
|
||||
('lead', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='attribution', to='leads.lead')),
|
||||
('visit', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='analytics.utmvisit')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,52 @@
|
||||
from django.db import models
|
||||
|
||||
from core.models import TimeStampedModel, UUIDPrimaryKeyModel
|
||||
from leads.models import Lead
|
||||
|
||||
|
||||
class PageView(UUIDPrimaryKeyModel, TimeStampedModel):
|
||||
"""One successful GET of a public marketing page."""
|
||||
|
||||
path = models.CharField(max_length=512, db_index=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ["-created_at"]
|
||||
indexes = [
|
||||
models.Index(fields=["created_at", "path"]),
|
||||
]
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self.path or "/"
|
||||
|
||||
|
||||
class UTMVisit(UUIDPrimaryKeyModel, TimeStampedModel):
|
||||
correlation_id = models.CharField(max_length=64, db_index=True)
|
||||
path = models.CharField(max_length=512, blank=True)
|
||||
referrer = models.URLField(blank=True, max_length=1024)
|
||||
utm_source = models.CharField(max_length=128, blank=True)
|
||||
utm_medium = models.CharField(max_length=128, blank=True)
|
||||
utm_campaign = models.CharField(max_length=128, blank=True)
|
||||
utm_term = models.CharField(max_length=128, blank=True)
|
||||
utm_content = models.CharField(max_length=128, blank=True)
|
||||
user_agent = models.CharField(max_length=512, blank=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ["-created_at"]
|
||||
|
||||
def __str__(self) -> str:
|
||||
return f"{self.utm_source or 'direct'} / {self.path}"
|
||||
|
||||
|
||||
class Attribution(TimeStampedModel):
|
||||
lead = models.OneToOneField(
|
||||
Lead, on_delete=models.CASCADE, related_name="attribution"
|
||||
)
|
||||
visit = models.ForeignKey(
|
||||
UTMVisit, null=True, blank=True, on_delete=models.SET_NULL
|
||||
)
|
||||
utm_source = models.CharField(max_length=128, blank=True)
|
||||
utm_medium = models.CharField(max_length=128, blank=True)
|
||||
utm_campaign = models.CharField(max_length=128, blank=True)
|
||||
|
||||
def __str__(self) -> str:
|
||||
return f"attr {self.lead_id} ← {self.utm_source or 'direct'}"
|
||||
@@ -0,0 +1,3 @@
|
||||
"""Analytics services."""
|
||||
|
||||
from analytics.middleware import attribute_lead_from_request # noqa: F401
|
||||
@@ -0,0 +1,150 @@
|
||||
{% extends "portal_base.html" %}
|
||||
{% block title %}Analytics · Portal{% endblock %}
|
||||
{% block topbar_title %}Analytics{% endblock %}
|
||||
{% block portal_content %}
|
||||
<div class="analytics-overview">
|
||||
<div class="stat-card">
|
||||
<div class="label">Views (last 30 days)</div>
|
||||
<div class="value">{{ pageviews_last_30_days }}</div>
|
||||
</div>
|
||||
<div class="panel">
|
||||
<div class="panel-h"><h2>Top pages</h2><span class="muted" style="font-size:12px">Public visits, last 30 days</span></div>
|
||||
<div class="panel-b" style="padding:0">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Page</th>
|
||||
<th>Visits</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for row in top_pages %}
|
||||
<tr>
|
||||
<td>{{ row.path }}</td>
|
||||
<td>{{ row.count }}</td>
|
||||
</tr>
|
||||
{% empty %}
|
||||
<tr><td colspan="2" class="empty-state">No public page views in the last 30 days.</td></tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stat-row">
|
||||
<div class="stat-card">
|
||||
<div class="label">UTM landings</div>
|
||||
<div class="value">{{ total_visits }}</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="label">Attributed leads</div>
|
||||
<div class="value">{{ total_attributed }}</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="label">Top source</div>
|
||||
<div class="value" style="font-size:18px">{{ top_source|default:"—" }}</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="label">Top campaign</div>
|
||||
<div class="value" style="font-size:18px">{{ top_campaign|default:"—" }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="panel-h"><h2>Landing volume by source</h2></div>
|
||||
<div class="panel-b">
|
||||
<div class="chart-placeholder">
|
||||
{% for row in visits_by_source|slice:":8" %}
|
||||
<div class="bar" style="height:{{ row.bar_pct }}%" title="{{ row.utm_source|default:'(direct)' }}: {{ row.count }}"></div>
|
||||
{% empty %}
|
||||
<div class="bar" style="height:12%"></div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="panel-h"><h2>UTM landings</h2><span class="muted" style="font-size:12px">From ?utm_* hits</span></div>
|
||||
<div class="panel-b" style="padding:0">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Source</th>
|
||||
<th>Medium</th>
|
||||
<th>Campaign</th>
|
||||
<th>Landings</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for row in visits_by_combo %}
|
||||
<tr>
|
||||
<td>{{ row.utm_source|default:"(direct)" }}</td>
|
||||
<td>{{ row.utm_medium|default:"—" }}</td>
|
||||
<td>{{ row.utm_campaign|default:"—" }}</td>
|
||||
<td>{{ row.count }}</td>
|
||||
</tr>
|
||||
{% empty %}
|
||||
<tr><td colspan="4" class="empty-state">No UTM landings yet. Open a public URL with ?utm_source=…</td></tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="panel-h"><h2>Recent landings</h2></div>
|
||||
<div class="panel-b" style="padding:0">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>When</th>
|
||||
<th>Path</th>
|
||||
<th>Source</th>
|
||||
<th>Campaign</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for visit in recent_visits %}
|
||||
<tr>
|
||||
<td>{{ visit.created_at|date:"M j, g:i A" }}</td>
|
||||
<td>{{ visit.path }}</td>
|
||||
<td>{{ visit.utm_source|default:"—" }}</td>
|
||||
<td>{{ visit.utm_campaign|default:"—" }}</td>
|
||||
</tr>
|
||||
{% empty %}
|
||||
<tr><td colspan="4" class="empty-state">No visits recorded.</td></tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="panel-h"><h2>Lead attribution</h2><span class="muted" style="font-size:12px">After contact-form submit</span></div>
|
||||
<div class="panel-b" style="padding:0">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Source</th>
|
||||
<th>Medium</th>
|
||||
<th>Campaign</th>
|
||||
<th>Leads</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for row in leads_by_combo %}
|
||||
<tr>
|
||||
<td>{{ row.utm_source|default:"(direct)" }}</td>
|
||||
<td>{{ row.utm_medium|default:"—" }}</td>
|
||||
<td>{{ row.utm_campaign|default:"—" }}</td>
|
||||
<td>{{ row.count }}</td>
|
||||
</tr>
|
||||
{% empty %}
|
||||
<tr><td colspan="4" class="empty-state">No attributed leads yet — submit the contact form after a UTM landing.</td></tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,84 @@
|
||||
from datetime import timedelta
|
||||
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.test import Client, TestCase
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
|
||||
from analytics.models import PageView, UTMVisit
|
||||
|
||||
|
||||
class PublicPageViewTests(TestCase):
|
||||
def setUp(self):
|
||||
self.client = Client()
|
||||
|
||||
def test_home_records_page_view(self):
|
||||
response = self.client.get("/")
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(PageView.objects.count(), 1)
|
||||
self.assertEqual(PageView.objects.get().path, "/")
|
||||
|
||||
def test_about_records_page_view(self):
|
||||
self.client.get(reverse("public:about"))
|
||||
self.assertEqual(PageView.objects.filter(path="/about/").count(), 1)
|
||||
|
||||
def test_plain_visit_does_not_create_utm_visit(self):
|
||||
self.client.get("/")
|
||||
self.assertEqual(PageView.objects.count(), 1)
|
||||
self.assertEqual(UTMVisit.objects.count(), 0)
|
||||
|
||||
def test_utm_hit_records_both(self):
|
||||
self.client.get("/?utm_source=test&utm_campaign=demo")
|
||||
self.assertEqual(PageView.objects.count(), 1)
|
||||
self.assertEqual(UTMVisit.objects.count(), 1)
|
||||
|
||||
def test_healthz_not_recorded(self):
|
||||
self.client.get("/healthz/")
|
||||
self.assertEqual(PageView.objects.count(), 0)
|
||||
|
||||
def test_portal_and_admin_not_recorded(self):
|
||||
self.client.get("/portal/")
|
||||
self.client.get("/admin/")
|
||||
self.assertEqual(PageView.objects.count(), 0)
|
||||
|
||||
def test_robots_and_sitemap_not_recorded(self):
|
||||
self.client.get("/robots.txt")
|
||||
self.client.get("/sitemap.xml")
|
||||
self.assertEqual(PageView.objects.count(), 0)
|
||||
|
||||
def test_missing_page_not_recorded(self):
|
||||
response = self.client.get("/not-a-real-page/")
|
||||
self.assertEqual(response.status_code, 404)
|
||||
self.assertEqual(PageView.objects.count(), 0)
|
||||
|
||||
def test_contact_post_not_recorded(self):
|
||||
self.client.post(reverse("public:contact"), {})
|
||||
self.assertEqual(PageView.objects.count(), 0)
|
||||
|
||||
|
||||
class AnalyticsReportTests(TestCase):
|
||||
def setUp(self):
|
||||
self.client = Client()
|
||||
user = get_user_model().objects.create_user(
|
||||
username="monica", password="pass-word-1"
|
||||
)
|
||||
self.client.force_login(user)
|
||||
|
||||
def test_views_card_uses_public_pageviews(self):
|
||||
self.client.get("/")
|
||||
self.client.get(reverse("public:about"))
|
||||
self.client.get(reverse("public:about"))
|
||||
stale = PageView.objects.create(path="/terms/")
|
||||
PageView.objects.filter(pk=stale.pk).update(
|
||||
created_at=timezone.now() - timedelta(days=31)
|
||||
)
|
||||
|
||||
response = self.client.get(reverse("analytics:report"))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.context["pageviews_last_30_days"], 3)
|
||||
top = {row["path"]: row["count"] for row in response.context["top_pages"]}
|
||||
self.assertEqual(top["/about/"], 2)
|
||||
self.assertEqual(top["/"], 1)
|
||||
self.assertNotIn("/terms/", top)
|
||||
self.assertContains(response, "Top pages")
|
||||
self.assertContains(response, "/about/")
|
||||
@@ -0,0 +1,9 @@
|
||||
from django.urls import path
|
||||
|
||||
from analytics import views
|
||||
|
||||
app_name = "analytics"
|
||||
|
||||
urlpatterns = [
|
||||
path("", views.report, name="report"),
|
||||
]
|
||||
@@ -0,0 +1,79 @@
|
||||
from datetime import timedelta
|
||||
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.db.models import Count
|
||||
from django.shortcuts import render
|
||||
from django.utils import timezone
|
||||
|
||||
from analytics.models import Attribution, PageView, UTMVisit
|
||||
|
||||
|
||||
def _bar_pct(rows, key="count"):
|
||||
max_count = max((row[key] for row in rows), default=1) or 1
|
||||
for row in rows:
|
||||
row["bar_pct"] = max(12, int(100 * row[key] / max_count))
|
||||
return rows
|
||||
|
||||
|
||||
@login_required
|
||||
def report(request):
|
||||
since_30d = timezone.now() - timedelta(days=30)
|
||||
pageviews_qs = PageView.objects.filter(created_at__gte=since_30d)
|
||||
pageviews_last_30_days = pageviews_qs.count()
|
||||
top_pages = list(
|
||||
pageviews_qs.values("path").annotate(count=Count("id")).order_by("-count")[:20]
|
||||
)
|
||||
|
||||
visits_by_source = _bar_pct(
|
||||
list(
|
||||
UTMVisit.objects.values("utm_source")
|
||||
.annotate(count=Count("id"))
|
||||
.order_by("-count")[:20]
|
||||
)
|
||||
)
|
||||
visits_by_combo = list(
|
||||
UTMVisit.objects.values("utm_source", "utm_medium", "utm_campaign")
|
||||
.annotate(count=Count("id"))
|
||||
.order_by("-count")[:50]
|
||||
)
|
||||
top_visit = visits_by_source[0] if visits_by_source else None
|
||||
top_visit_campaign = (
|
||||
UTMVisit.objects.exclude(utm_campaign="")
|
||||
.values("utm_campaign")
|
||||
.annotate(count=Count("id"))
|
||||
.order_by("-count")
|
||||
.first()
|
||||
)
|
||||
|
||||
leads_by_source = _bar_pct(
|
||||
list(
|
||||
Attribution.objects.values("utm_source")
|
||||
.annotate(count=Count("id"))
|
||||
.order_by("-count")[:20]
|
||||
)
|
||||
)
|
||||
leads_by_combo = list(
|
||||
Attribution.objects.values("utm_source", "utm_medium", "utm_campaign")
|
||||
.annotate(count=Count("id"))
|
||||
.order_by("-count")[:50]
|
||||
)
|
||||
|
||||
recent_visits = UTMVisit.objects.all()[:25]
|
||||
|
||||
return render(
|
||||
request,
|
||||
"analytics/report.html",
|
||||
{
|
||||
"pageviews_last_30_days": pageviews_last_30_days,
|
||||
"top_pages": top_pages,
|
||||
"total_visits": UTMVisit.objects.count(),
|
||||
"total_attributed": Attribution.objects.count(),
|
||||
"top_source": (top_visit or {}).get("utm_source") or "(direct)",
|
||||
"top_campaign": (top_visit_campaign or {}).get("utm_campaign") or "—",
|
||||
"visits_by_source": visits_by_source,
|
||||
"visits_by_combo": visits_by_combo,
|
||||
"leads_by_source": leads_by_source,
|
||||
"leads_by_combo": leads_by_combo,
|
||||
"recent_visits": recent_visits,
|
||||
},
|
||||
)
|
||||
@@ -0,0 +1,11 @@
|
||||
from django.contrib import admin
|
||||
|
||||
from blog.models import Post
|
||||
|
||||
|
||||
@admin.register(Post)
|
||||
class PostAdmin(admin.ModelAdmin):
|
||||
list_display = ("title", "is_published", "published_at", "author", "updated_at")
|
||||
list_filter = ("is_published",)
|
||||
prepopulated_fields = {"slug": ("title",)}
|
||||
search_fields = ("title", "excerpt", "body")
|
||||
@@ -0,0 +1,12 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class BlogConfig(AppConfig):
|
||||
default_auto_field = "django.db.models.BigAutoField"
|
||||
name = "blog"
|
||||
verbose_name = "Blog"
|
||||
|
||||
def ready(self):
|
||||
from blog import hooks
|
||||
|
||||
hooks.register()
|
||||
@@ -0,0 +1,18 @@
|
||||
from core.registry import register_feature, register_portal_nav, register_public_nav
|
||||
|
||||
|
||||
def register() -> None:
|
||||
register_feature("blog")
|
||||
register_public_nav(
|
||||
section="blog",
|
||||
label="Blog",
|
||||
url_name="blog:list",
|
||||
order=40,
|
||||
)
|
||||
register_portal_nav(
|
||||
section="blog",
|
||||
label="Blog posts",
|
||||
url_name="blog_portal:portal_list",
|
||||
group="Content",
|
||||
order=10,
|
||||
)
|
||||
@@ -0,0 +1,36 @@
|
||||
# Generated by Django 6.1 on 2026-08-26 11:38
|
||||
|
||||
import django.db.models.deletion
|
||||
import uuid
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Post',
|
||||
fields=[
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
||||
('title', models.CharField(max_length=200)),
|
||||
('slug', models.SlugField(max_length=220, unique=True)),
|
||||
('excerpt', models.TextField(blank=True)),
|
||||
('body', models.TextField()),
|
||||
('is_published', models.BooleanField(default=False)),
|
||||
('published_at', models.DateTimeField(blank=True, null=True)),
|
||||
('author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='blog_posts', to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
options={
|
||||
'ordering': ['-published_at', '-created_at'],
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,45 @@
|
||||
from django.conf import settings
|
||||
from django.db import models
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
from django.utils.text import slugify
|
||||
|
||||
from core.models import TimeStampedModel, UUIDPrimaryKeyModel
|
||||
|
||||
|
||||
class Post(UUIDPrimaryKeyModel, TimeStampedModel):
|
||||
title = models.CharField(max_length=200)
|
||||
slug = models.SlugField(max_length=220, unique=True)
|
||||
excerpt = models.TextField(blank=True)
|
||||
body = models.TextField()
|
||||
is_published = models.BooleanField(default=False)
|
||||
published_at = models.DateTimeField(null=True, blank=True)
|
||||
author = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL,
|
||||
null=True,
|
||||
blank=True,
|
||||
on_delete=models.SET_NULL,
|
||||
related_name="blog_posts",
|
||||
)
|
||||
|
||||
class Meta:
|
||||
ordering = ["-published_at", "-created_at"]
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self.title
|
||||
|
||||
def get_absolute_url(self) -> str:
|
||||
return reverse("blog:detail", kwargs={"slug": self.slug})
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if not self.slug:
|
||||
base = slugify(self.title)[:200] or "post"
|
||||
slug = base
|
||||
n = 2
|
||||
while Post.objects.filter(slug=slug).exclude(pk=self.pk).exists():
|
||||
slug = f"{base}-{n}"
|
||||
n += 1
|
||||
self.slug = slug
|
||||
if self.is_published and self.published_at is None:
|
||||
self.published_at = timezone.now()
|
||||
super().save(*args, **kwargs)
|
||||
@@ -0,0 +1,12 @@
|
||||
from django.urls import path
|
||||
|
||||
from blog import views
|
||||
|
||||
app_name = "blog_portal"
|
||||
|
||||
urlpatterns = [
|
||||
path("", views.portal_list, name="portal_list"),
|
||||
path("new/", views.portal_edit, name="portal_new"),
|
||||
path("<uuid:pk>/", views.portal_edit, name="portal_edit"),
|
||||
path("<uuid:pk>/delete/", views.portal_delete, name="portal_delete"),
|
||||
]
|
||||
@@ -0,0 +1,10 @@
|
||||
from django.urls import path
|
||||
|
||||
from blog import views
|
||||
|
||||
app_name = "blog"
|
||||
|
||||
urlpatterns = [
|
||||
path("", views.post_list, name="list"),
|
||||
path("<slug:slug>/", views.post_detail, name="detail"),
|
||||
]
|
||||
@@ -0,0 +1,12 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}{{ post.title }} · {{ SITE_NAME }}{% endblock %}
|
||||
{% block content %}
|
||||
<section class="section section-lg">
|
||||
<div class="container">
|
||||
<p><a href="{% url 'blog:list' %}">← Blog</a></p>
|
||||
<h1>{{ post.title }}</h1>
|
||||
<p class="muted">{% if post.published_at %}{{ post.published_at|date:"F j, Y" }}{% endif %}</p>
|
||||
<div>{{ post.body|linebreaks }}</div>
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,18 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Blog · {{ SITE_NAME }}{% endblock %}
|
||||
{% block content %}
|
||||
<section class="section section-lg">
|
||||
<div class="container">
|
||||
<h1 class="text-uppercase">Blog</h1>
|
||||
{% for post in posts %}
|
||||
<article style="margin:0 0 32px">
|
||||
<h2><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h2>
|
||||
<p class="muted">{% if post.published_at %}{{ post.published_at|date:"F j, Y" }}{% endif %}</p>
|
||||
<p>{{ post.excerpt|default:post.body|truncatewords:40 }}</p>
|
||||
</article>
|
||||
{% empty %}
|
||||
<p>No posts yet.</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,20 @@
|
||||
{% extends "portal_base.html" %}
|
||||
{% block title %}{% if post %}Edit{% else %}New{% endif %} post · Portal{% endblock %}
|
||||
{% block topbar_title %}{% if post %}Edit post{% else %}New post{% endif %}{% endblock %}
|
||||
{% block portal_content %}
|
||||
<form method="post" class="form-grid">
|
||||
{% csrf_token %}
|
||||
<div class="field"><label>Title</label><input name="title" required value="{{ post.title|default:'' }}"></div>
|
||||
<div class="field"><label>Slug</label><input name="slug" value="{{ post.slug|default:'' }}" placeholder="auto from title"></div>
|
||||
<div class="field"><label>Excerpt</label><textarea name="excerpt" style="min-height:64px">{{ post.excerpt|default:'' }}</textarea></div>
|
||||
<div class="field"><label>Body</label><textarea name="body" required style="min-height:220px">{{ post.body|default:'' }}</textarea></div>
|
||||
<label><input type="checkbox" name="is_published" {% if post.is_published %}checked{% endif %}> Published</label>
|
||||
<button class="btn btn-primary" type="submit">Save</button>
|
||||
</form>
|
||||
{% if post %}
|
||||
<form method="post" action="{% url 'blog_portal:portal_delete' post.pk %}" style="margin-top:24px" onsubmit="return confirm('Delete this post?');">
|
||||
{% csrf_token %}
|
||||
<button class="btn btn-ghost" type="submit">Delete</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,20 @@
|
||||
{% extends "portal_base.html" %}
|
||||
{% block title %}Blog posts · Portal{% endblock %}
|
||||
{% block topbar_title %}Blog posts{% endblock %}
|
||||
{% block portal_content %}
|
||||
<p><a class="btn btn-primary" href="{% url 'blog_portal:portal_new' %}">New post</a></p>
|
||||
<table class="table">
|
||||
<thead><tr><th>Title</th><th>Status</th><th></th></tr></thead>
|
||||
<tbody>
|
||||
{% for post in posts %}
|
||||
<tr>
|
||||
<td><a href="{% url 'blog_portal:portal_edit' post.pk %}">{{ post.title }}</a></td>
|
||||
<td>{% if post.is_published %}Published{% else %}Draft{% endif %}</td>
|
||||
<td><a href="{{ post.get_absolute_url }}">View</a></td>
|
||||
</tr>
|
||||
{% empty %}
|
||||
<tr><td colspan="3" class="empty-state">No posts yet.</td></tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,43 @@
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.test import Client, TestCase
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
|
||||
from blog.models import Post
|
||||
|
||||
|
||||
class BlogPublicTests(TestCase):
|
||||
def test_list_hides_drafts(self):
|
||||
Post.objects.create(title="Draft", body="x", is_published=False)
|
||||
Post.objects.create(
|
||||
title="Live",
|
||||
body="hello",
|
||||
is_published=True,
|
||||
published_at=timezone.now(),
|
||||
)
|
||||
response = Client().get(reverse("blog:list"))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(response, "Live")
|
||||
self.assertNotContains(response, "Draft")
|
||||
|
||||
def test_portal_requires_login(self):
|
||||
response = Client().get(reverse("blog_portal:portal_list"))
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
|
||||
class BlogPortalTests(TestCase):
|
||||
def setUp(self):
|
||||
User = get_user_model()
|
||||
self.user = User.objects.create_user("editor", password="test-pass-123")
|
||||
self.client = Client()
|
||||
self.client.login(username="editor", password="test-pass-123")
|
||||
|
||||
def test_create_published_post(self):
|
||||
response = self.client.post(
|
||||
reverse("blog_portal:portal_new"),
|
||||
{"title": "Hello", "body": "World", "is_published": "on"},
|
||||
)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
post = Post.objects.get()
|
||||
self.assertTrue(post.is_published)
|
||||
self.assertEqual(post.slug, "hello")
|
||||
@@ -0,0 +1,64 @@
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.shortcuts import get_object_or_404, redirect, render
|
||||
from django.utils import timezone
|
||||
from django.utils.text import slugify
|
||||
from django.views.decorators.http import require_http_methods, require_POST
|
||||
|
||||
from blog.models import Post
|
||||
|
||||
|
||||
def post_list(request):
|
||||
posts = Post.objects.filter(is_published=True)
|
||||
return render(request, "blog/list.html", {"posts": posts})
|
||||
|
||||
|
||||
def post_detail(request, slug):
|
||||
post = get_object_or_404(Post, slug=slug, is_published=True)
|
||||
return render(request, "blog/detail.html", {"post": post})
|
||||
|
||||
|
||||
@login_required
|
||||
def portal_list(request):
|
||||
posts = Post.objects.all()
|
||||
return render(request, "blog/portal/list.html", {"posts": posts})
|
||||
|
||||
|
||||
@login_required
|
||||
@require_http_methods(["GET", "POST"])
|
||||
def portal_edit(request, pk=None):
|
||||
post = get_object_or_404(Post, pk=pk) if pk else None
|
||||
if request.method == "POST":
|
||||
title = (request.POST.get("title") or "").strip()
|
||||
body = (request.POST.get("body") or "").strip()
|
||||
excerpt = (request.POST.get("excerpt") or "").strip()
|
||||
slug = (request.POST.get("slug") or "").strip()
|
||||
is_published = request.POST.get("is_published") == "on"
|
||||
if not title or not body:
|
||||
messages.error(request, "Title and body are required.")
|
||||
else:
|
||||
if post is None:
|
||||
post = Post(author=request.user)
|
||||
post.title = title
|
||||
post.body = body
|
||||
post.excerpt = excerpt
|
||||
post.slug = slugify(slug)[:220] if slug else ""
|
||||
post.is_published = is_published
|
||||
if is_published and post.published_at is None:
|
||||
post.published_at = timezone.now()
|
||||
if not is_published:
|
||||
post.published_at = None
|
||||
post.save()
|
||||
messages.success(request, f'Saved “{post.title}”.')
|
||||
return redirect("blog_portal:portal_list")
|
||||
return render(request, "blog/portal/edit.html", {"post": post})
|
||||
|
||||
|
||||
@login_required
|
||||
@require_POST
|
||||
def portal_delete(request, pk):
|
||||
post = get_object_or_404(Post, pk=pk)
|
||||
title = post.title
|
||||
post.delete()
|
||||
messages.success(request, f'Deleted “{title}”.')
|
||||
return redirect("blog_portal:portal_list")
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
"""ASGI config for client_site."""
|
||||
|
||||
import os
|
||||
|
||||
from django.core.asgi import get_asgi_application
|
||||
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "client_site.settings")
|
||||
|
||||
application = get_asgi_application()
|
||||
@@ -0,0 +1,12 @@
|
||||
"""Load environment-specific Django settings based on DJANGO_ENV."""
|
||||
|
||||
import os
|
||||
|
||||
_environment = os.environ.get("DJANGO_ENV", "dev").lower()
|
||||
|
||||
if _environment == "prod":
|
||||
from .prod import * # noqa: F403
|
||||
elif _environment == "beta":
|
||||
from .beta import * # noqa: F403
|
||||
else:
|
||||
from .dev import * # noqa: F403
|
||||
@@ -0,0 +1,381 @@
|
||||
"""Shared Django settings for all environments."""
|
||||
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
from urllib.parse import urlparse
|
||||
|
||||
BASE_DIR = Path(__file__).resolve().parent.parent.parent
|
||||
|
||||
|
||||
def env(key: str, default: str | None = None) -> str | None:
|
||||
return os.environ.get(key, default)
|
||||
|
||||
|
||||
def env_bool(key: str, default: bool = False) -> bool:
|
||||
value = os.environ.get(key)
|
||||
if value is None:
|
||||
return default
|
||||
return value.lower() in {"1", "true", "yes", "on"}
|
||||
|
||||
|
||||
def env_list(key: str, default: str = "") -> list[str]:
|
||||
value = os.environ.get(key, default)
|
||||
if not value:
|
||||
return []
|
||||
value = value.strip()
|
||||
if value.startswith("["):
|
||||
try:
|
||||
parsed = json.loads(value)
|
||||
except ValueError:
|
||||
parsed = None
|
||||
if isinstance(parsed, list):
|
||||
return [str(item).strip() for item in parsed if str(item).strip()]
|
||||
return [item.strip() for item in value.split(",") if item.strip()]
|
||||
|
||||
|
||||
def database_config() -> dict:
|
||||
database_url = env("DATABASE_URL")
|
||||
if database_url:
|
||||
parsed = urlparse(database_url)
|
||||
return {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.postgresql",
|
||||
"NAME": parsed.path.lstrip("/"),
|
||||
"USER": parsed.username or "",
|
||||
"PASSWORD": parsed.password or "",
|
||||
"HOST": parsed.hostname or "",
|
||||
"PORT": str(parsed.port or 5432),
|
||||
}
|
||||
}
|
||||
|
||||
if env("DB_HOST"):
|
||||
return {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.postgresql",
|
||||
"NAME": env("DB_NAME", "client_site"),
|
||||
"USER": env("DB_USER", "client_site"),
|
||||
"PASSWORD": env("DB_PASSWORD", ""),
|
||||
"HOST": env("DB_HOST"),
|
||||
"PORT": env("DB_PORT", "5432"),
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3",
|
||||
"NAME": BASE_DIR / "db.sqlite3",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def build_csrf_trusted_origins(
|
||||
allowed_hosts: list[str], explicit: list[str] | None = None
|
||||
) -> list[str]:
|
||||
"""Build CSRF_TRUSTED_ORIGINS for Django 4+ Origin checks on HTTPS POSTs."""
|
||||
if explicit:
|
||||
return explicit
|
||||
|
||||
local_hosts = {"localhost", "127.0.0.1", "0.0.0.0"}
|
||||
origins: list[str] = []
|
||||
for host in allowed_hosts:
|
||||
if not host or host == "*" or host.startswith("."):
|
||||
continue
|
||||
hostname = host.split(":")[0]
|
||||
scheme = "http" if hostname in local_hosts else "https"
|
||||
origins.append(f"{scheme}://{host}")
|
||||
return origins
|
||||
|
||||
|
||||
SECRET_KEY = env(
|
||||
"DJANGO_SECRET_KEY",
|
||||
"django-insecure-dev-only-change-me-before-production",
|
||||
)
|
||||
|
||||
DEBUG = env_bool("DJANGO_DEBUG", False)
|
||||
|
||||
allowed_hosts = env_list("DJANGO_ALLOWED_HOSTS", "*")
|
||||
ALLOWED_HOSTS = allowed_hosts if allowed_hosts else ["*"]
|
||||
|
||||
CSRF_TRUSTED_ORIGINS = build_csrf_trusted_origins(
|
||||
ALLOWED_HOSTS,
|
||||
env_list("DJANGO_CSRF_TRUSTED_ORIGINS"),
|
||||
)
|
||||
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
|
||||
# Catalog feature flags. Secret env is the source of truth.
|
||||
# Dev/test default ON so the template is a working seed; prod/beta secrets
|
||||
# must set each flag explicitly (see scripts/validate-env.sh).
|
||||
_feature_default = os.environ.get("DJANGO_ENV", "dev").lower() not in {"prod", "beta"}
|
||||
FEATURE_EMAIL_SMS = env_bool("FEATURE_EMAIL_SMS", _feature_default)
|
||||
FEATURE_DIRECT_MAIL = env_bool("FEATURE_DIRECT_MAIL", _feature_default)
|
||||
FEATURE_BLOG = env_bool("FEATURE_BLOG", _feature_default)
|
||||
FEATURE_PAYMENTS = env_bool("FEATURE_PAYMENTS", _feature_default)
|
||||
FEATURE_SOCIAL = env_bool("FEATURE_SOCIAL", _feature_default)
|
||||
FEATURE_SOCIAL_AI = env_bool("FEATURE_SOCIAL_AI", _feature_default)
|
||||
|
||||
if FEATURE_PAYMENTS and not FEATURE_EMAIL_SMS:
|
||||
raise ImproperlyConfigured("FEATURE_PAYMENTS requires FEATURE_EMAIL_SMS")
|
||||
if FEATURE_SOCIAL_AI and not FEATURE_SOCIAL:
|
||||
raise ImproperlyConfigured("FEATURE_SOCIAL_AI requires FEATURE_SOCIAL")
|
||||
|
||||
CORE_APPS = [
|
||||
"core.apps.CoreConfig",
|
||||
"public.apps.PublicConfig",
|
||||
"accounts.apps.AccountsConfig",
|
||||
"dashboard.apps.DashboardConfig",
|
||||
"leads.apps.LeadsConfig",
|
||||
"contacts.apps.ContactsConfig",
|
||||
"analytics.apps.AnalyticsConfig",
|
||||
]
|
||||
OPTIONAL_APPS = [
|
||||
(FEATURE_EMAIL_SMS, "email_sms.apps.EmailSmsConfig"),
|
||||
(FEATURE_DIRECT_MAIL, "directmail.apps.DirectmailConfig"),
|
||||
(FEATURE_BLOG, "blog.apps.BlogConfig"),
|
||||
(FEATURE_PAYMENTS, "payments.apps.PaymentsConfig"),
|
||||
(FEATURE_SOCIAL, "social.apps.SocialConfig"),
|
||||
(FEATURE_SOCIAL_AI, "social_ai.apps.SocialAiConfig"),
|
||||
]
|
||||
DJANGO_APPS = [
|
||||
"django.contrib.admin",
|
||||
"django.contrib.auth",
|
||||
"django.contrib.contenttypes",
|
||||
"django.contrib.sessions",
|
||||
"django.contrib.messages",
|
||||
"whitenoise.runserver_nostatic",
|
||||
"django.contrib.staticfiles",
|
||||
"phonenumber_field",
|
||||
"django_recaptcha",
|
||||
"dj_queue",
|
||||
]
|
||||
INSTALLED_APPS = (
|
||||
CORE_APPS
|
||||
+ [app for enabled, app in OPTIONAL_APPS if enabled]
|
||||
+ DJANGO_APPS
|
||||
)
|
||||
|
||||
MIDDLEWARE = [
|
||||
"django.middleware.security.SecurityMiddleware",
|
||||
"whitenoise.middleware.WhiteNoiseMiddleware",
|
||||
"django.contrib.sessions.middleware.SessionMiddleware",
|
||||
"django.middleware.common.CommonMiddleware",
|
||||
"django.middleware.csrf.CsrfViewMiddleware",
|
||||
"django.contrib.auth.middleware.AuthenticationMiddleware",
|
||||
"django.contrib.messages.middleware.MessageMiddleware",
|
||||
"django.middleware.clickjacking.XFrameOptionsMiddleware",
|
||||
"analytics.middleware.UTMTrackingMiddleware",
|
||||
"analytics.middleware.PublicPageViewMiddleware",
|
||||
"public.middleware.UnderConstructionMiddleware",
|
||||
]
|
||||
|
||||
ROOT_URLCONF = "client_site.urls"
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
||||
"DIRS": [BASE_DIR / "client_site" / "templates"],
|
||||
"APP_DIRS": True,
|
||||
"OPTIONS": {
|
||||
"context_processors": [
|
||||
"django.template.context_processors.debug",
|
||||
"django.template.context_processors.request",
|
||||
"django.contrib.auth.context_processors.auth",
|
||||
"django.contrib.messages.context_processors.messages",
|
||||
"public.context_processors.site_branding",
|
||||
"public.context_processors.tianji_tracking",
|
||||
"core.context_processors.feature_registry",
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
WSGI_APPLICATION = "client_site.wsgi.application"
|
||||
|
||||
DATABASES = database_config()
|
||||
|
||||
AUTH_PASSWORD_VALIDATORS = [
|
||||
{
|
||||
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
|
||||
},
|
||||
{
|
||||
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
|
||||
},
|
||||
{
|
||||
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
|
||||
},
|
||||
{
|
||||
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
|
||||
},
|
||||
]
|
||||
|
||||
LANGUAGE_CODE = "en-us"
|
||||
TIME_ZONE = "America/Chicago"
|
||||
USE_I18N = True
|
||||
USE_TZ = True
|
||||
|
||||
STATIC_URL = "static/"
|
||||
STATIC_ROOT = BASE_DIR / "staticfiles"
|
||||
STATICFILES_DIRS = [
|
||||
BASE_DIR / "client_site" / "static",
|
||||
]
|
||||
# Uploaded blobs live in the DB (core.StoredFile). Default storage is
|
||||
# in-memory only so nothing is written to disk accidentally.
|
||||
STORAGES = {
|
||||
"default": {
|
||||
"BACKEND": "django.core.files.storage.memory.InMemoryStorage",
|
||||
},
|
||||
"staticfiles": {
|
||||
"BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
|
||||
},
|
||||
}
|
||||
|
||||
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
|
||||
|
||||
LOGIN_URL = "accounts:login"
|
||||
LOGIN_REDIRECT_URL = "dashboard:home"
|
||||
LOGOUT_REDIRECT_URL = "accounts:login"
|
||||
|
||||
# --- Feature gates ---
|
||||
# When true, public visitors only see the under-construction page.
|
||||
# Prod launch holding page: SITE_UNDER_CONSTRUCTION=true
|
||||
# Beta (full app): SITE_UNDER_CONSTRUCTION=false
|
||||
SITE_UNDER_CONSTRUCTION = env_bool("SITE_UNDER_CONSTRUCTION", False)
|
||||
|
||||
# --- Branding / public site ---
|
||||
SITE_NAME = env("SITE_NAME", "Your Company")
|
||||
SITE_TAGLINE = env("SITE_TAGLINE", "A tagline for the public site")
|
||||
PUBLIC_SITE_URL = env("PUBLIC_SITE_URL", "")
|
||||
CONTACT_PHONE = env("CONTACT_PHONE", "")
|
||||
CONTACT_EMAIL = env("CONTACT_EMAIL", "hello@example.com")
|
||||
CONTACT_ADDRESS = env("CONTACT_ADDRESS", "")
|
||||
CONTACT_SERVICE_AREA = env("CONTACT_SERVICE_AREA", "")
|
||||
CREDIT_NAME = env("CREDIT_NAME", "AI ML Operations, LLC")
|
||||
CREDIT_URL = env("CREDIT_URL", "https://aimloperations.com")
|
||||
|
||||
|
||||
def format_from_email(address: str | None, display_name: str | None = None) -> str:
|
||||
"""
|
||||
Ensure From header includes a display name for inbox UIs.
|
||||
|
||||
Bare ``noreply@…`` shows as "noreply". Prefer
|
||||
``"Your Company" <noreply@…>`` (RFC 5322).
|
||||
|
||||
Docker Compose ``.env`` cannot parse split quotes like
|
||||
``"Name" <addr>`` — use a bare address (this helper adds SITE_NAME)
|
||||
or one pair of quotes around the whole value:
|
||||
``DEFAULT_FROM_EMAIL="Your Company <addr@domain>"``.
|
||||
"""
|
||||
raw = (address or "").strip()
|
||||
if not raw:
|
||||
return ""
|
||||
# Strip a single layer of wrapping quotes from env/compose.
|
||||
if len(raw) >= 2 and raw[0] == raw[-1] and raw[0] in {'"', "'"}:
|
||||
raw = raw[1:-1].strip()
|
||||
if "<" in raw and ">" in raw:
|
||||
return raw
|
||||
name = (display_name or SITE_NAME or "").strip()
|
||||
if not name:
|
||||
return raw
|
||||
safe = name.replace("\\", "\\\\").replace('"', '\\"')
|
||||
return f'"{safe}" <{raw}>'
|
||||
|
||||
|
||||
# Inbox "From" — not the same as EMAIL_HOST_USER (SMTP login).
|
||||
DEFAULT_FROM_EMAIL = format_from_email(
|
||||
env("DEFAULT_FROM_EMAIL", "noreply@example.com")
|
||||
)
|
||||
|
||||
# --- reCAPTCHA v3 ---
|
||||
RECAPTCHA_PUBLIC_KEY = env("RECAPTCHA_PUBLIC_KEY", "")
|
||||
RECAPTCHA_PRIVATE_KEY = env("RECAPTCHA_PRIVATE_KEY", "")
|
||||
|
||||
# --- Email (SMTP2GO) ---
|
||||
EMAIL_HOST = env("EMAIL_HOST", "mail.smtp2go.com")
|
||||
EMAIL_HOST_USER = env("EMAIL_HOST_USER", "")
|
||||
EMAIL_HOST_PASSWORD = env("EMAIL_HOST_PASSWORD", "")
|
||||
EMAIL_PORT = int(env("EMAIL_PORT", "2525") or "2525")
|
||||
EMAIL_USE_TLS = env_bool("EMAIL_USE_TLS", True)
|
||||
EMAIL_BACKEND = env(
|
||||
"EMAIL_BACKEND",
|
||||
"django.core.mail.backends.smtp.EmailBackend",
|
||||
)
|
||||
|
||||
# --- SMTP2GO SMS ---
|
||||
SMTP2GO_SMS_API_KEY = env("SMTP2GO_SMS_API_KEY", "")
|
||||
SMTP2GO_SMS_API_URL = env(
|
||||
"SMTP2GO_SMS_API_URL",
|
||||
"https://api.smtp2go.com/v3/sms/send",
|
||||
)
|
||||
# Optional shared secret: ?token=… or Authorization: Bearer …
|
||||
SMTP2GO_WEBHOOK_SECRET = env("SMTP2GO_WEBHOOK_SECRET", "")
|
||||
|
||||
# --- Postcards (PCM Integrations default) ---
|
||||
POSTCARD_PROVIDER = env("POSTCARD_PROVIDER", "pcm")
|
||||
# Login credentials for POST /auth/login → short-lived Bearer token.
|
||||
PCM_API_KEY = env("PCM_API_KEY", "")
|
||||
PCM_API_SECRET = env("PCM_API_SECRET", "")
|
||||
# Optional child-app reference for PCM multi-account (childRefNbr).
|
||||
PCM_CHILD_REF_NBR = env("PCM_CHILD_REF_NBR", "")
|
||||
# PCM webhook auth: each subscription has its own signature secret (copy from PCM UI).
|
||||
# Prefer PCM_WEBHOOK_SECRETS=sec1,sec2,… ; PCM_WEBHOOK_SECRET still accepted (single).
|
||||
PCM_WEBHOOK_SECRETS = env("PCM_WEBHOOK_SECRETS", "")
|
||||
PCM_WEBHOOK_SECRET = env("PCM_WEBHOOK_SECRET", "")
|
||||
# JSON object: company, firstName, lastName, address, address2, city, state, zipCode
|
||||
PCM_RETURN_ADDRESS = env("PCM_RETURN_ADDRESS", "")
|
||||
PCM_RETURN_LINE1 = env("PCM_RETURN_LINE1", "")
|
||||
PCM_RETURN_LINE2 = env("PCM_RETURN_LINE2", "")
|
||||
PCM_RETURN_CITY = env("PCM_RETURN_CITY", "")
|
||||
PCM_RETURN_STATE = env("PCM_RETURN_STATE", "")
|
||||
PCM_RETURN_ZIP = env("PCM_RETURN_ZIP", "")
|
||||
# Legacy / alternate providers (POSTCARD_PROVIDER=lob|click2mail|postgrid)
|
||||
LOB_API_KEY = env("LOB_API_KEY", "")
|
||||
CLICK2MAIL_API_KEY = env("CLICK2MAIL_API_KEY", "")
|
||||
POSTGRID_API_KEY = env("POSTGRID_API_KEY", "")
|
||||
|
||||
# --- Social (native APIs) ---
|
||||
META_APP_ID = env("META_APP_ID", "")
|
||||
META_APP_SECRET = env("META_APP_SECRET", "")
|
||||
# LinkedIn Client ID/Secret live in SocialAppCredentials (portal UI), not env.
|
||||
SOCIAL_TOKEN_ENCRYPTION_KEY = env("SOCIAL_TOKEN_ENCRYPTION_KEY", "")
|
||||
|
||||
# --- Ollama (social post drafting) ---
|
||||
# Host-network reachable from app hosts; default matches internal LAN Ollama.
|
||||
OLLAMA_BASE_URL = env("OLLAMA_BASE_URL", "http://10.0.0.128:11434")
|
||||
OLLAMA_MODEL = env("OLLAMA_MODEL", "llama3.2")
|
||||
OLLAMA_TIMEOUT_SECONDS = int(env("OLLAMA_TIMEOUT_SECONDS", "120") or "120")
|
||||
|
||||
# --- Stripe (FEATURE_PAYMENTS) ---
|
||||
STRIPE_SECRET_KEY = env("STRIPE_SECRET_KEY", "")
|
||||
STRIPE_PUBLISHABLE_KEY = env("STRIPE_PUBLISHABLE_KEY", "")
|
||||
STRIPE_WEBHOOK_SECRET = env("STRIPE_WEBHOOK_SECRET", "")
|
||||
STRIPE_CURRENCY = env("STRIPE_CURRENCY", "usd")
|
||||
|
||||
# --- Nominatim (address suggest; server-side proxy only) ---
|
||||
# Self-hosted on ai-server-4080. Nominatim has no native API keys — gate with
|
||||
# LAN UFW + this Django proxy. Optional NOMINATIM_API_KEY is forwarded as
|
||||
# X-API-Key if you later put auth in front of Nominatim.
|
||||
NOMINATIM_BASE_URL = env("NOMINATIM_BASE_URL", "http://10.0.0.128:8089")
|
||||
NOMINATIM_TIMEOUT_SECONDS = int(env("NOMINATIM_TIMEOUT_SECONDS", "8") or "8")
|
||||
NOMINATIM_COUNTRY_CODES = env("NOMINATIM_COUNTRY_CODES", "us")
|
||||
NOMINATIM_USER_AGENT = env(
|
||||
"NOMINATIM_USER_AGENT",
|
||||
"client_site/1.0 (address-suggest; contact admin)",
|
||||
)
|
||||
NOMINATIM_API_KEY = env("NOMINATIM_API_KEY", "")
|
||||
|
||||
# --- Tianji analytics (pageviews + events; notice banner, not opt-in) ---
|
||||
TIANJI_ENABLED = env_bool("TIANJI_ENABLED", not DEBUG)
|
||||
TIANJI_TRACKER_URL = env(
|
||||
"TIANJI_TRACKER_URL",
|
||||
"https://tianji.aimloperations.com/tracker.js",
|
||||
)
|
||||
TIANJI_WEBSITE_ID = env("TIANJI_WEBSITE_ID", "cmshzhxdf6gee10qzkzrfn9iw")
|
||||
|
||||
# --- Django Tasks ---
|
||||
# Dev: ImmediateBackend (settings/dev.py). Beta/prod: dj-queue (settings/beta.py|prod.py).
|
||||
TASKS = {
|
||||
"default": {
|
||||
"BACKEND": "django.tasks.backends.immediate.ImmediateBackend",
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
"""Beta/staging settings — full functionality for preview."""
|
||||
|
||||
from .base import * # noqa: F403
|
||||
from .logging import build_logging_config, logging_level_for_env
|
||||
|
||||
DEBUG = env_bool("DJANGO_DEBUG", False) # noqa: F405
|
||||
TIANJI_ENABLED = env_bool("TIANJI_ENABLED", True) # noqa: F405
|
||||
|
||||
if DEBUG:
|
||||
import warnings
|
||||
|
||||
warnings.warn("DEBUG is enabled in beta environment.", stacklevel=1)
|
||||
|
||||
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
|
||||
USE_X_FORWARDED_HOST = True
|
||||
SESSION_COOKIE_SECURE = not DEBUG
|
||||
CSRF_COOKIE_SECURE = not DEBUG
|
||||
|
||||
# Beta always runs the full app unless explicitly overridden.
|
||||
SITE_UNDER_CONSTRUCTION = env_bool("SITE_UNDER_CONSTRUCTION", False) # noqa: F405
|
||||
|
||||
DATABASE_ROUTERS = ["dj_queue.routers.DjQueueRouter"]
|
||||
TASKS = {
|
||||
"default": {
|
||||
"BACKEND": "dj_queue.backend.DjQueueBackend",
|
||||
"QUEUES": [],
|
||||
"OPTIONS": {},
|
||||
},
|
||||
}
|
||||
|
||||
LOGGING = build_logging_config(logging_level_for_env("beta"), "beta")
|
||||
@@ -0,0 +1,38 @@
|
||||
"""Development settings."""
|
||||
|
||||
from .base import * # noqa: F403
|
||||
from .logging import build_logging_config, logging_level_for_env
|
||||
|
||||
DEBUG = True
|
||||
|
||||
SITE_UNDER_CONSTRUCTION = env_bool("SITE_UNDER_CONSTRUCTION", False) # noqa: F405
|
||||
TIANJI_ENABLED = env_bool("TIANJI_ENABLED", False) # noqa: F405
|
||||
|
||||
STORAGES = {
|
||||
"default": {
|
||||
"BACKEND": "django.core.files.storage.memory.InMemoryStorage",
|
||||
},
|
||||
"staticfiles": {
|
||||
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
|
||||
},
|
||||
}
|
||||
|
||||
EMAIL_BACKEND = env( # noqa: F405
|
||||
"EMAIL_BACKEND",
|
||||
"django.core.mail.backends.console.EmailBackend",
|
||||
)
|
||||
|
||||
# ALLOWED_HOSTS default "*" → empty CSRF_TRUSTED_ORIGINS, which breaks browser
|
||||
# Origin checks on POST. Always trust local runserver origins in dev.
|
||||
_local_csrf = [
|
||||
"http://127.0.0.1:8000",
|
||||
"http://localhost:8000",
|
||||
"http://0.0.0.0:8000",
|
||||
"http://127.0.0.1:8001",
|
||||
"http://localhost:8001",
|
||||
]
|
||||
CSRF_TRUSTED_ORIGINS = list(
|
||||
dict.fromkeys([*_local_csrf, *CSRF_TRUSTED_ORIGINS]) # noqa: F405
|
||||
)
|
||||
|
||||
LOGGING = build_logging_config(logging_level_for_env("dev"), "dev")
|
||||
@@ -0,0 +1,61 @@
|
||||
"""Environment-specific logging configuration."""
|
||||
|
||||
import os
|
||||
|
||||
|
||||
def build_logging_config(level: str, environment: str) -> dict:
|
||||
"""Return a Django LOGGING dict for the given level and environment name."""
|
||||
return {
|
||||
"version": 1,
|
||||
"disable_existing_loggers": False,
|
||||
"formatters": {
|
||||
"verbose": {
|
||||
"format": (
|
||||
f"{{levelname}} {{asctime}} {{name}} {{filename}}:{{lineno}} "
|
||||
f"{{process:d}} {{thread:d}} [env={environment}] {{message}}"
|
||||
),
|
||||
"style": "{",
|
||||
},
|
||||
"simple": {
|
||||
"format": (
|
||||
f"{{levelname}} [env={environment}] "
|
||||
f"{{filename}}:{{lineno}} {{message}}"
|
||||
),
|
||||
"style": "{",
|
||||
},
|
||||
},
|
||||
"handlers": {
|
||||
"console": {
|
||||
"class": "logging.StreamHandler",
|
||||
"formatter": "verbose" if environment == "dev" else "simple",
|
||||
},
|
||||
},
|
||||
"root": {
|
||||
"handlers": ["console"],
|
||||
"level": level,
|
||||
},
|
||||
"loggers": {
|
||||
"django": {
|
||||
"handlers": ["console"],
|
||||
"level": level,
|
||||
"propagate": False,
|
||||
},
|
||||
"django.request": {
|
||||
"handlers": ["console"],
|
||||
"level": "ERROR" if environment == "prod" else level,
|
||||
"propagate": False,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
def logging_level_for_env(environment: str) -> str:
|
||||
override = os.environ.get("DJANGO_LOG_LEVEL")
|
||||
if override:
|
||||
return override.upper()
|
||||
|
||||
if environment == "dev":
|
||||
return "DEBUG"
|
||||
if environment == "beta":
|
||||
return "INFO"
|
||||
return "WARNING"
|
||||
@@ -0,0 +1,31 @@
|
||||
"""Production settings."""
|
||||
|
||||
from .base import * # noqa: F403
|
||||
from .logging import build_logging_config, logging_level_for_env
|
||||
|
||||
DEBUG = False
|
||||
|
||||
TIANJI_ENABLED = env_bool("TIANJI_ENABLED", True) # noqa: F405
|
||||
|
||||
if not env("DJANGO_SECRET_KEY"): # noqa: F405
|
||||
raise ValueError("DJANGO_SECRET_KEY must be set in production.")
|
||||
|
||||
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
|
||||
USE_X_FORWARDED_HOST = True
|
||||
SESSION_COOKIE_SECURE = True
|
||||
CSRF_COOKIE_SECURE = True
|
||||
|
||||
# Prod holds visitors on under-construction until launch (set false when ready).
|
||||
if env("SITE_UNDER_CONSTRUCTION") is None: # noqa: F405
|
||||
SITE_UNDER_CONSTRUCTION = True # noqa: F405
|
||||
|
||||
DATABASE_ROUTERS = ["dj_queue.routers.DjQueueRouter"]
|
||||
TASKS = {
|
||||
"default": {
|
||||
"BACKEND": "dj_queue.backend.DjQueueBackend",
|
||||
"QUEUES": [],
|
||||
"OPTIONS": {},
|
||||
},
|
||||
}
|
||||
|
||||
LOGGING = build_logging_config(logging_level_for_env("prod"), "prod")
|
||||
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
@@ -0,0 +1,35 @@
|
||||
/* Address autocomplete dropdown (public + portal). */
|
||||
.address-ac-wrap {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.address-ac-list {
|
||||
position: absolute;
|
||||
z-index: 40;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: calc(100% + 2px);
|
||||
margin: 0;
|
||||
padding: 4px 0;
|
||||
list-style: none;
|
||||
max-height: 240px;
|
||||
overflow-y: auto;
|
||||
background: #fff;
|
||||
border: 1px solid #d1d5db;
|
||||
border-radius: 6px;
|
||||
box-shadow: 0 8px 24px rgba(15, 23, 42, 0.12);
|
||||
}
|
||||
|
||||
.address-ac-item {
|
||||
padding: 8px 12px;
|
||||
font-size: 13px;
|
||||
line-height: 1.35;
|
||||
color: #111827;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.address-ac-item:hover,
|
||||
.address-ac-item:focus {
|
||||
background: #f3f4f6;
|
||||
outline: none;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
/*!
|
||||
* Bootstrap v4.0.0 (https://getbootstrap.com)
|
||||
* Copyright 2011-2018 The Bootstrap Authors
|
||||
* Copyright 2011-2018 Twitter, Inc.
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||
*/
:root {
--blue: #007bff;
--indigo: #6610f2;
--purple: #6f42c1;
--pink: #e83e8c;
--red: #dc3545;
--orange: #fd7e14;
--yellow: #ffc107;
--green: #28a745;
--teal: #20c997;
--cyan: #17a2b8;
--white: #fff;
--gray: #6c757d;
--gray-dark: #343a40;
--breakpoint-xs: 0;
--breakpoint-sm: 576px;
--breakpoint-md: 768px;
--breakpoint-lg: 992px;
--breakpoint-xl: 1200px;
--breakpoint-xxl: 1600px;
--font-family-sans-serif: "Work Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
--font-family-monospace: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
font-family: sans-serif;
line-height: 1.15;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
-ms-overflow-style: scrollbar;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
@-ms-viewport {
width: device-width;
}
article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {
display: block;
}
body {
margin: 0;
font-family: "Work Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
font-size: 16px;
font-weight: 300;
line-height: 1.5;
color: #74757f;
text-align: left;
background-color: #fff;
}
[tabindex="-1"]:focus {
outline: 0 !important;
}
hr {
box-sizing: content-box;
height: 0;
overflow: visible;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
margin-bottom: 0.5rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title],
abbr[data-original-title] {
text-decoration: underline;
text-decoration: underline dotted;
cursor: help;
border-bottom: 0;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: inherit;
}
dd {
margin-bottom: .5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
}
dfn {
font-style: italic;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 80%;
}
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -.25em;
}
sup {
top: -.5em;
}
a {
color: #0045b6;
text-decoration: none;
background-color: transparent;
-webkit-text-decoration-skip: objects;
}
a:hover {
color: #00286a;
text-decoration: underline;
}
a:not([href]):not([tabindex]) {
text-decoration: none;
}
a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
text-decoration: none;
}
a:not([href]):not([tabindex]):focus {
outline: 0;
}
pre,
code,
kbd,
samp {
font-family: monospace, monospace;
font-size: 1em;
}
pre {
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
-ms-overflow-style: scrollbar;
}
figure {
margin: 0 0 1rem;
}
img {
vertical-align: middle;
border-style: none;
}
svg:not(:root) {
overflow: hidden;
}
table {
border-collapse: collapse;
}
caption {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
color: #6c757d;
text-align: left;
caption-side: bottom;
}
th {
text-align: inherit;
}
label {
display: inline-block;
margin-bottom: .5rem;
}
button {
border-radius: 0;
}
button:focus {
outline: 1px dotted;
outline: 5px auto -webkit-focus-ring-color;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
input {
overflow: visible;
}
button,
select {
text-transform: none;
}
button,
html [type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
padding: 0;
border-style: none;
}
input[type="radio"],
input[type="checkbox"] {
box-sizing: border-box;
padding: 0;
}
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"] {
-webkit-appearance: listbox;
}
textarea {
overflow: auto;
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
display: block;
width: 100%;
max-width: 100%;
padding: 0;
margin-bottom: .5rem;
font-size: 1.5rem;
line-height: inherit;
color: inherit;
white-space: normal;
}
progress {
vertical-align: baseline;
}
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
[type="search"] {
outline-offset: -2px;
-webkit-appearance: none;
}
[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
summary {
display: list-item;
cursor: pointer;
}
template {
display: none;
}
[hidden] {
display: none !important;
}
h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6 {
margin-bottom: 0.5rem;
font-family: "Poppins", sans-serif;
font-weight: 400;
line-height: 1.1;
color: #151515;
}
h1,Line truncated
|
||||
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
*
|
||||
* Fonts
|
||||
*/
/*
|
||||
*
|
||||
* Font Awesome Icons 4.7.0
|
||||
* --------------------------------------------------
|
||||
*/
@font-face {
font-family: 'FontAwesome';
src: url("../fonts/fontawesome-webfont.eot?v=4.7.0");
src: url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"), url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"), url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"), url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"), url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg");
font-weight: normal;
font-style: normal;
}
.fa {
display: inline-block;
font-family: 'FontAwesome';
font-size: inherit;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
[class*='fa-']:before {
font-weight: 400;
font-family: 'FontAwesome';
}
/* makes the font 33% larger relative to the icon container */
.fa-lg {
font-size: 1.33333333em;
line-height: 0.75em;
vertical-align: -15%;
}
.fa-2x {
font-size: 2em;
}
.fa-3x {
font-size: 3em;
}
.fa-4x {
font-size: 4em;
}
.fa-5x {
font-size: 5em;
}
.fa-fw {
width: 1.28571429em;
text-align: center;
}
.fa-ul {
padding-left: 0;
margin-left: 2.14285714em;
list-style-type: none;
}
.fa-ul > li {
position: relative;
}
.fa-li {
position: absolute;
left: -2.14285714em;
width: 2.14285714em;
top: 0.14285714em;
text-align: center;
}
.fa-li.fa-lg {
left: -1.85714286em;
}
.fa-border {
padding: .2em .25em .15em;
border: solid 0.08em #eeeeee;
border-radius: .1em;
}
.fa-pull-left {
float: left;
}
.fa-pull-right {
float: right;
}
.fa.fa-pull-left {
margin-right: .3em;
}
.fa.fa-pull-right {
margin-left: .3em;
}
/* Deprecated as of 4.4.0 */
.pull-right {
float: right;
}
.pull-left {
float: left;
}
.fa.pull-left {
margin-right: .3em;
}
.fa.pull-right {
margin-left: .3em;
}
.fa-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear;
}
.fa-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8);
}
@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
.fa-rotate-90 {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
-webkit-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);
}
.fa-rotate-180 {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
-webkit-transform: rotate(180deg);
-ms-transform: rotate(180deg);
transform: rotate(180deg);
}
.fa-rotate-270 {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
-webkit-transform: rotate(270deg);
-ms-transform: rotate(270deg);
transform: rotate(270deg);
}
.fa-flip-horizontal {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
-webkit-transform: scale(-1, 1);
-ms-transform: scale(-1, 1);
transform: scale(-1, 1);
}
.fa-flip-vertical {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
-webkit-transform: scale(1, -1);
-ms-transform: scale(1, -1);
transform: scale(1, -1);
}
:root .fa-rotate-90,
:root .fa-rotate-180,
:root .fa-rotate-270,
:root .fa-flip-horizontal,
:root .fa-flip-vertical {
filter: none;
}
.fa-stack {
position: relative;
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
vertical-align: middle;
}
.fa-stack-1x,
.fa-stack-2x {
position: absolute;
left: 0;
width: 100%;
text-align: center;
}
.fa-stack-1x {
line-height: inherit;
}
.fa-stack-2x {
font-size: 2em;
}
.fa-inverse {
color: #ffffff;
}
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
|
||||
readers do not read off random characters that represent icons */
.fa-glass:before {
content: "\f000";
}
.fa-music:before {
content: "\f001";
}
.fa-search:before {
content: "\f002";
}
.fa-envelope-o:before {
content: "\f003";
}
.fa-heart:before {
content: "\f004";
}
.fa-star:before {
content: "\f005";
}
.fa-star-o:before {
content: "\f006";
}
.fa-user:before {
content: "\f007";
}
.fa-film:before {
content: "\f008";
}
.fa-th-large:before {
content: "\f009";
}
.fa-th:before {
content: "\f00a";
}
.fa-th-list:before {
content: "\f00b";
}
.fa-check:before {
content: "\f00c";
}
.fa-remove:before,
.fa-close:before,
.fa-times:before {
content: "\f00d";
}
.fa-search-plus:before {
content: "\f00e";
}
.fa-search-minus:before {
content: "\f010";
}
.fa-power-off:before {
content: "\f011";
}
.fa-signal:before {
content: "\f012";
}
.fa-gear:before,
.fa-cog:before {
content: "\f013";
}
.fa-trash-o:before {
content: "\f014";
}
.fa-home:before {
content: "\f015";
}
.fa-file-o:before {
content: "\f016";
}
.fa-clock-o:before {
content: "\f017";
}
.fa-road:before {
content: "\f018";
}
.fa-download:before {
content: "\f019";
}
.fa-arrow-circle-o-down:before {
content: "\f01a";
}
.fa-arrow-circle-o-up:before {
content: "\f01b";
}
.fa-inbox:before {
content: "\f01c";
}
.fa-play-circle-o:before {
content: "\f01d";
}
.fa-rotate-right:before,
.fa-repeat:before {
content: "\f01e";
}
.fa-refresh:before {
content: "\f021";
}
.fa-list-alt:before {
content: "\f022";
}
.fa-lock:before {
content: "\f023";
}
.fa-flag:before {
content: "\f024";
}
.fa-headphones:before {
content: "\f025";
}
.fa-volume-off:before {
content: "\f026";
}
.fa-volume-down:before {
content: "\f027";
}
.fa-volume-up:before {
content: "\f028";
}
.fa-qrcode:before {
content: "\f029";
}
.fa-barcode:before {
content: "\f02a";
}
.fa-tag:before {
content: "\f02b";
}
.fa-tags:before {
content: "\f02c";
}
.fa-book:before {
content: "\f02d";
}
.fa-bookmark:before {
content: "\f02e";
}
.fa-print:before {
content: "\f02f";
}
.fa-camera:before {
content: "\f030";
}
.fa-font:before {
content: "\f031";
}
.fa-bold:before {
content: "\f032";
}
.fa-italic:before {
content: "\f033";
}
.fa-text-height:before {
content: "\f034";
}
.fa-text-width:before {
content: "\f035";
}
.fa-align-left:before {
content: "\f036";
}
.fa-align-center:before {
content: "\f037";
}
.fa-align-right:before {
content: "\f038";
}
.fa-align-justify:before {
content: "\f039";
}
.fa-list:before {
content: "\f03a";
}
.fa-dedent:before,
.fa-outdent:before {
content: "\f03b";
}
.fa-indent:before {
content: "\f03c";
}
.fa-video-camera:before {
content: "\f03d";
}
.fa-photo:before,
.fa-image:before,
.fa-picture-o:before {
content: "\f03e";
}
.fa-pencil:before {
content: "\f040";
}
.fa-map-marker:before {
content: "\f041";
}
.fa-adjust:before {
content: "\f042";
}
.fa-tint:before {
content: "\f043";
}
.fa-edit:before,
.fa-pencil-square-o:before {
content: "\f044";
}
.fa-share-square-o:before {
content: "\f045";
}
.fa-check-square-o:before {
content: "\f046";
}
.fa-arrows:before {
content: "\f047";
}
.fa-step-backward:before {
content: "\f048";
}
.fa-fast-backward:before {
content: "\f049";
}
.fa-backward:before {
content: "\f04a";
}
.fa-play:before {
content: "\f04b";
}
.fa-pause:before {
content: "\f04c";
}
.fa-stop:before {
content: "\f04d";
}
.fa-forward:before {
content: "\f04e";
}
.fa-fast-forward:before {
content: "\f050";
}
.fa-step-forward:before {
content: "\f051";
}
.fa-eject:before {
content: "\f052";
}
.fa-chevron-left:before {
content: "\f053";
}
.fa-chevron-right:before {
content: "\f054";
}
.fa-plus-circle:before {
content: "\f055";
}
.fa-minus-circle:before {
content: "\f056";
}
.fa-times-circle:before {
content: "\f057";
}
.fa-check-circle:before {
content: "\f058";
}
.fa-question-circle:before {
content: "\f059";
}
.fa-info-circle:before {
content: "\f05a";
}
.fa-crosshairs:before {
content: "\f05b";
}
.fa-times-circle-o:before {
content: "\f05c";
}
.fa-check-circle-o:before {
content: "\f05d";
}
.fa-ban:before {
content: "\f05e";
}
.fa-arrow-left:before {
content: "\f060";
}
.fa-arrow-right:before {
content: "\f061";
}
.fa-arrow-up:before {
content: "\f062";
}
.fa-arrow-down:before {
content: "\f063";
}
.fa-mail-forward:before,
.fa-share:before {
content: "\f064";
}
.fa-expand:before {
content: "\f065";
}
.fa-compress:before {
content: "\f066";
}
.fa-plus:before {
content: "\f067";
}
.fa-minus:before {
content: "\f068";
}
.fa-asterisk:before {
content: "\f069";
}
.fa-exclamation-circle:before {
content: "\f06a";
}
.fa-gift:before {
content: "\f06b";
}
.fa-leaf:before {
content: "\f06c";
}
.fa-fire:before {
content: "\f06d";
}
.fa-eye:before {
content: "\f06e";
}
.fa-eye-slash:before {
content: "\f070";
}
.fa-warning:before,
.fa-exclamation-triangle:before {
content: "\f071";
}
.fa-plane:Line truncated
|
||||
*
|
||||
* Material Design Icons
|
||||
* --------------------------------------------------
|
||||
*/
@font-face {
font-family: "Material Design Icons";
src: url("../fonts/materialdesignicons-webfont.eot?v=1.4.57");
src: url("../fonts/materialdesignicons-webfont.eot?#iefix&v=1.4.57") format("embedded-opentype"), url("../fonts/materialdesignicons-webfont.woff2?v=1.4.57") format("woff2"), url("../fonts/materialdesignicons-webfont.woff?v=1.4.57") format("woff"), url("../fonts/materialdesignicons-webfont.ttf?v=1.4.57") format("truetype"), url("../fonts/materialdesignicons-webfont.svg?v=1.4.57#materialdesigniconsregular") format("svg");
font-weight: normal;
font-style: normal;
}
.mdi {
display: inline-block;
font: normal normal normal 24px/1 "Material Design Icons";
font-size: inherit;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
transform: translate(0, 0);
}
.mdi-access-point:before {
content: "\f101";
}
.mdi-access-point-network:before {
content: "\f102";
}
.mdi-account:before {
content: "\f103";
}
.mdi-account-alert:before {
content: "\f104";
}
.mdi-account-box:before {
content: "\f105";
}
.mdi-account-box-outline:before {
content: "\f106";
}
.mdi-account-check:before {
content: "\f107";
}
.mdi-account-circle:before {
content: "\f108";
}
.mdi-account-convert:before {
content: "\f109";
}
.mdi-account-key:before {
content: "\f10a";
}
.mdi-account-location:before {
content: "\f10b";
}
.mdi-account-minus:before {
content: "\f10c";
}
.mdi-account-multiple:before {
content: "\f10d";
}
.mdi-account-multiple-outline:before {
content: "\f10e";
}
.mdi-account-multiple-plus:before {
content: "\f10f";
}
.mdi-account-network:before {
content: "\f110";
}
.mdi-account-off:before {
content: "\f111";
}
.mdi-account-outline:before {
content: "\f112";
}
.mdi-account-plus:before {
content: "\f113";
}
.mdi-account-remove:before {
content: "\f114";
}
.mdi-account-search:before {
content: "\f115";
}
.mdi-account-star:before {
content: "\f116";
}
.mdi-account-star-variant:before {
content: "\f117";
}
.mdi-account-switch:before {
content: "\f118";
}
.mdi-adjust:before {
content: "\f119";
}
.mdi-air-conditioner:before {
content: "\f11a";
}
.mdi-airballoon:before {
content: "\f11b";
}
.mdi-airplane:before {
content: "\f11c";
}
.mdi-airplane-off:before {
content: "\f11d";
}
.mdi-airplay:before {
content: "\f11e";
}
.mdi-alarm:before {
content: "\f11f";
}
.mdi-alarm-check:before {
content: "\f120";
}
.mdi-alarm-multiple:before {
content: "\f121";
}
.mdi-alarm-off:before {
content: "\f122";
}
.mdi-alarm-plus:before {
content: "\f123";
}
.mdi-album:before {
content: "\f124";
}
.mdi-alert:before {
content: "\f125";
}
.mdi-alert-box:before {
content: "\f126";
}
.mdi-alert-circle:before {
content: "\f127";
}
.mdi-alert-octagon:before {
content: "\f128";
}
.mdi-alert-outline:before {
content: "\f129";
}
.mdi-alpha:before {
content: "\f12a";
}
.mdi-alphabetical:before {
content: "\f12b";
}
.mdi-amazon:before {
content: "\f12c";
}
.mdi-amazon-clouddrive:before {
content: "\f12d";
}
.mdi-ambulance:before {
content: "\f12e";
}
.mdi-anchor:before {
content: "\f12f";
}
.mdi-android:before {
content: "\f130";
}
.mdi-android-debug-bridge:before {
content: "\f131";
}
.mdi-android-studio:before {
content: "\f132";
}
.mdi-apple:before {
content: "\f133";
}
.mdi-apple-finder:before {
content: "\f134";
}
.mdi-apple-ios:before {
content: "\f135";
}
.mdi-apple-mobileme:before {
content: "\f136";
}
.mdi-apple-safari:before {
content: "\f137";
}
.mdi-appnet:before {
content: "\f138";
}
.mdi-apps:before {
content: "\f139";
}
.mdi-archive:before {
content: "\f13a";
}
.mdi-arrange-bring-forward:before {
content: "\f13b";
}
.mdi-arrange-bring-to-front:before {
content: "\f13c";
}
.mdi-arrange-send-backward:before {
content: "\f13d";
}
.mdi-arrange-send-to-back:before {
content: "\f13e";
}
.mdi-arrow-all:before {
content: "\f13f";
}
.mdi-arrow-bottom-drop-circle:before {
content: "\f140";
}
.mdi-arrow-bottom-left:before {
content: "\f141";
}
.mdi-arrow-bottom-right:before {
content: "\f142";
}
.mdi-arrow-collapse:before {
content: "\f143";
}
.mdi-arrow-down:before {
content: "\f144";
}
.mdi-arrow-down-bold:before {
content: "\f145";
}
.mdi-arrow-down-bold-circle:before {
content: "\f146";
}
.mdi-arrow-down-bold-circle-outline:before {
content: "\f147";
}
.mdi-arrow-down-bold-hexagon-outline:before {
content: "\f148";
}
.mdi-arrow-expand:before {
content: "\f149";
}
.mdi-arrow-left:before {
content: "\f14a";
}
.mdi-arrow-left-bold:before {
content: "\f14b";
}
.mdi-arrow-left-bold-circle:before {
content: "\f14c";
}
.mdi-arrow-left-bold-circle-outline:before {
content: "\f14d";
}
.mdi-arrow-left-bold-hexagon-outline:before {
content: "\f14e";
}
.mdi-arrow-right:before {
content: "\f14f";
}
.mdi-arrow-right-bold:before {
content: "\f150";
}
.mdi-arrow-right-bold-circle:before {
content: "\f151";
}
.mdi-arrow-right-bold-circle-outline:before {Line truncated
|
||||
* Title: Bigmug Line Flaticon Pack
|
||||
* Author: Catalin Fertu
|
||||
* Source: http://www.flaticon.com/packs/bigmug-line
|
||||
* License: CC BY 3.0 (http://creativecommons.org/licenses/by/3.0/)
|
||||
*/
@font-face {
font-family: "fl-bigmug-line";
src: url("../fonts/fl-bigmug-line.eot");
src: url("../fonts/fl-bigmug-line.eot#iefix") format("embedded-opentype"), url("../fonts/fl-bigmug-line.woff") format("woff"), url("../fonts/fl-bigmug-line.ttf") format("truetype"), url("../fonts/fl-bigmug-line.svg") format("svg");
font-weight: normal;
font-style: normal;
}
.fl-bigmug-line-ico,
[class^="fl-bigmug-line-"]:before, [class*=" fl-bigmug-line-"]:before,
[class^="fl-bigmug-line-"]:after, [class*=" fl-bigmug-line-"]:after {
font-family: 'fl-bigmug-line';
font-size: inherit;
font-weight: 400;
font-style: normal;
}
.fl-bigmug-line-add137:before {
content: "\e000";
}
.fl-bigmug-line-add139:before {
content: "\e001";
}
.fl-bigmug-line-add149:before {
content: "\e002";
}
.fl-bigmug-line-airplane86:before {
content: "\e003";
}
.fl-bigmug-line-alarm31:before {
content: "\e004";
}
.fl-bigmug-line-arrow592:before {
content: "\e005";
}
.fl-bigmug-line-attach8:before {
content: "\e006";
}
.fl-bigmug-line-attachment15:before {
content: "\e007";
}
.fl-bigmug-line-audio46:before {
content: "\e008";
}
.fl-bigmug-line-back44:before {
content: "\e009";
}
.fl-bigmug-line-back46:before {
content: "\e00a";
}
.fl-bigmug-line-big104:before {
content: "\e00b";
}
.fl-bigmug-line-book188:before {
content: "\e00c";
}
.fl-bigmug-line-bookmark28:before {
content: "\e00d";
}
.fl-bigmug-line-bottle34:before {
content: "\e00e";
}
.fl-bigmug-line-button5:before {
content: "\e00f";
}
.fl-bigmug-line-buttons5:before {
content: "\e010";
}
.fl-bigmug-line-cellphone55:before {
content: "\e011";
}
.fl-bigmug-line-cellular9:before {
content: "\e012";
}
.fl-bigmug-line-center10:before {
content: "\e013";
}
.fl-bigmug-line-chat51:before {
content: "\e014";
}
.fl-bigmug-line-chat55:before {
content: "\e015";
}
.fl-bigmug-line-checkmark14:before {
content: "\e016";
}
.fl-bigmug-line-checkmark15:before {
content: "\e017";
}
.fl-bigmug-line-checkmark16:before {
content: "\e018";
}
.fl-bigmug-line-circular220:before {
content: "\e019";
}
.fl-bigmug-line-circular224:before {
content: "\e01a";
}
.fl-bigmug-line-circular228:before {
content: "\e01b";
}
.fl-bigmug-line-circular229:before {
content: "\e01c";
}
.fl-bigmug-line-clipboard68:before {
content: "\e01d";
}
.fl-bigmug-line-close42:before {
content: "\e01e";
}
.fl-bigmug-line-cloud255:before {
content: "\e01f";
}
.fl-bigmug-line-cloud260:before {
content: "\e020";
}
.fl-bigmug-line-cocktail26:before {
content: "\e021";
}
.fl-bigmug-line-code30:before {
content: "\e022";
}
.fl-bigmug-line-collapse5:before {
content: "\e023";
}
.fl-bigmug-line-comment45:before {
content: "\e024";
}
.fl-bigmug-line-compass80:before {
content: "\e025";
}
.fl-bigmug-line-contract5:before {
content: "\e026";
}
.fl-bigmug-line-copy23:before {
content: "\e027";
}
.fl-bigmug-line-crescent23:before {
content: "\e028";
}
.fl-bigmug-line-cropping1:before {
content: "\e029";
}
.fl-bigmug-line-cross81:before {
content: "\e02a";
}
.fl-bigmug-line-cross83:before {
content: "\e02b";
}
.fl-bigmug-line-cube29:before {
content: "\e02c";
}
.fl-bigmug-line-double97:before {
content: "\e02d";
}
.fl-bigmug-line-double98:before {
content: "\e02e";
}
.fl-bigmug-line-double99:before {
content: "\e02f";
}
.fl-bigmug-line-down55:before {
content: "\e030";
}
.fl-bigmug-line-down56:before {
content: "\e031";
}
.fl-bigmug-line-down58:before {
content: "\e032";
}
.fl-bigmug-line-down59:before {
content: "\e033";
}
.fl-bigmug-line-down64:before {
content: "\e034";
}
.fl-bigmug-line-download136:before {
content: "\e035";
}
.fl-bigmug-line-download142:before {
content: "\e036";
}
.fl-bigmug-line-download146:before {
content: "\e037";
}
.fl-bigmug-line-download147:before {
content: "\e038";
}
.fl-bigmug-line-download148:before {
content: "\e039";
}
.fl-bigmug-line-electrical17:before {
content: "\e03a";
}
.fl-bigmug-line-electronic57:before {
content: "\e03b";
}
.fl-bigmug-line-email64:before {
content: "\e03c";
}
.fl-bigmug-line-email67:before {
content: "\e03d";
}
.fl-bigmug-line-equalization3:before {
content: "\e03e";
}
.fl-bigmug-line-equalizer26:before {
content: "\e03f";
}
.fl-bigmug-line-event6:before {
content: "\e040";
}
.fl-bigmug-line-expand25:before {
content: "\e041";
}
.fl-bigmug-line-expanding2:before {
content: "\e042";
}
.fl-bigmug-line-fast33:before {
content: "\e043";
}
.fl-bigmug-line-favourites5:before {
content: "\e044";
}
.fl-bigmug-line-file68:before {
content: "\e045";
}
.fl-bigmug-line-file69:before {
content: "\e046";
}
.fl-bigmug-line-film57:before {
content: "\e047";
}
.fl-bigmug-line-flag53:before {
content: "\e048";
}
.fl-bigmug-line-fog10:before {
content: "\e049";
}
.fl-bigmug-line-foggy3:before {
content: "\e04a";
}
.fl-bigmug-line-folder173:before {
content: "\e04b";
}
.fl-bigmug-line-fork34:before {
content: "\e04c";
}
.fl-bigmug-line-four87:before {
conteLine truncated
|
||||
@@ -0,0 +1,692 @@
|
||||
:root {
|
||||
--monica-primary: #00626c;
|
||||
--monica-primary-light: #008898;
|
||||
--monica-ink: #212121;
|
||||
--monica-muted: #6b7280;
|
||||
--monica-surface: #f4f7f7;
|
||||
--monica-border: #d9e3e4;
|
||||
--monica-ok: #1a7f4b;
|
||||
--monica-warn: #b45309;
|
||||
--monica-danger: #b91c1c;
|
||||
--portal-sidebar: 240px;
|
||||
--exit-dark: #080808;
|
||||
--exit-teal: #00626c;
|
||||
--exit-teal-bright: #008898;
|
||||
}
|
||||
|
||||
/* Portal shell */
|
||||
body.portal {
|
||||
margin: 0;
|
||||
background: var(--monica-surface);
|
||||
font-family: "Work Sans", sans-serif;
|
||||
color: var(--monica-ink);
|
||||
}
|
||||
.portal-shell { display: flex; min-height: 100vh; }
|
||||
.portal-sidebar {
|
||||
width: var(--portal-sidebar);
|
||||
background: #080808;
|
||||
color: #cbd5e1;
|
||||
flex-shrink: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
.portal-brand {
|
||||
padding: 16px 18px;
|
||||
border-bottom: 1px solid rgba(255,255,255,0.08);
|
||||
font-family: Poppins, sans-serif;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
font-size: 14px;
|
||||
text-decoration: none;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
.portal-brand img {
|
||||
height: 36px;
|
||||
width: auto;
|
||||
display: block;
|
||||
}
|
||||
.portal-brand span { color: #7dd3da; font-size: 12px; letter-spacing: 0.04em; }
|
||||
.portal-nav { padding: 12px 0; flex: 1; }
|
||||
.portal-nav a {
|
||||
display: block;
|
||||
padding: 10px 18px;
|
||||
color: #94a3b8;
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
border-left: 3px solid transparent;
|
||||
}
|
||||
.portal-nav a:hover { color: #fff; background: rgba(255,255,255,0.04); }
|
||||
.portal-nav a.active { color: #fff; background: rgba(0,98,108,0.28); border-left-color: #00a0ab; }
|
||||
.portal-nav .nav-section {
|
||||
font-size: 10px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.1em;
|
||||
color: #64748b;
|
||||
padding: 16px 18px 6px;
|
||||
}
|
||||
.portal-main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
|
||||
.portal-topbar {
|
||||
background: #fff;
|
||||
border-bottom: 1px solid var(--monica-border);
|
||||
padding: 14px 24px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 16px;
|
||||
}
|
||||
.portal-topbar h1 { margin: 0; font-size: 20px; font-family: Poppins, sans-serif; font-weight: 600; }
|
||||
.portal-content { padding: 24px; flex: 1; }
|
||||
.portal-user { font-size: 13px; color: var(--monica-muted); }
|
||||
.portal-user strong { color: var(--monica-ink); }
|
||||
|
||||
/* Portal widgets */
|
||||
.stat-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 16px; margin-bottom: 24px; }
|
||||
.analytics-overview {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(140px, 1fr) 4fr;
|
||||
gap: 16px;
|
||||
margin-bottom: 24px;
|
||||
align-items: stretch;
|
||||
}
|
||||
.analytics-overview .stat-card {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
}
|
||||
.analytics-overview .panel { margin-bottom: 0; }
|
||||
@media (max-width: 800px) {
|
||||
.analytics-overview { grid-template-columns: 1fr; }
|
||||
}
|
||||
.stat-card {
|
||||
background: #fff;
|
||||
border: 1px solid var(--monica-border);
|
||||
padding: 18px;
|
||||
}
|
||||
.stat-card .label { font-size: 12px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--monica-muted); }
|
||||
.stat-card .value { font-size: 28px; font-weight: 700; font-family: Poppins, sans-serif; margin-top: 4px; }
|
||||
.stat-card .delta { font-size: 12px; margin-top: 4px; color: var(--monica-ok); }
|
||||
|
||||
.panel {
|
||||
background: #fff;
|
||||
border: 1px solid var(--monica-border);
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.panel-h {
|
||||
padding: 14px 18px;
|
||||
border-bottom: 1px solid var(--monica-border);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
}
|
||||
.panel-h h2 { margin: 0; font-size: 15px; font-family: Poppins, sans-serif; font-weight: 600; }
|
||||
.panel-b { padding: 18px; }
|
||||
|
||||
.btn {
|
||||
display: inline-block;
|
||||
padding: 9px 18px;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
font-family: "Work Sans", sans-serif;
|
||||
}
|
||||
.btn-primary { background: var(--monica-primary); color: #fff; }
|
||||
.btn-primary:hover { background: #004e56; color: #fff; text-decoration: none; }
|
||||
.btn-ghost { background: transparent; border: 1px solid var(--monica-border); color: var(--monica-ink); }
|
||||
.btn-sm { padding: 6px 12px; font-size: 12px; }
|
||||
|
||||
.table { width: 100%; border-collapse: collapse; font-size: 14px; }
|
||||
.table th {
|
||||
text-align: left;
|
||||
font-size: 11px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
color: var(--monica-muted);
|
||||
padding: 10px 12px;
|
||||
border-bottom: 1px solid var(--monica-border);
|
||||
font-weight: 600;
|
||||
}
|
||||
.table td { padding: 12px; border-bottom: 1px solid var(--monica-border); vertical-align: middle; }
|
||||
.table tr:hover td { background: #f8fafc; }
|
||||
.table a { color: var(--monica-primary); text-decoration: none; font-weight: 500; }
|
||||
|
||||
.badge {
|
||||
display: inline-block;
|
||||
padding: 2px 8px;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
border-radius: 2px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.04em;
|
||||
}
|
||||
.badge-new { background: #d0eef0; color: #00626c; }
|
||||
.badge-contacted { background: #fef3c7; color: #92400e; }
|
||||
.badge-won { background: #d1fae5; color: #065f46; }
|
||||
.badge-lost { background: #fee2e2; color: #991b1b; }
|
||||
.badge-sent { background: #d0eef0; color: #00626c; }
|
||||
.badge-scheduled { background: #ede9fe; color: #5b21b6; }
|
||||
.badge-delivered { background: #d1fae5; color: #065f46; }
|
||||
.badge-opened { background: #dbeafe; color: #1e40af; }
|
||||
.badge-clicked { background: #ede9fe; color: #5b21b6; }
|
||||
.badge-failed { background: #fee2e2; color: #991b1b; }
|
||||
.badge-optin { background: #d1fae5; color: #065f46; }
|
||||
.badge-optout { background: #f3f4f6; color: #4b5563; }
|
||||
.badge-draft { background: #f3f4f6; color: #4b5563; }
|
||||
.badge-completed { background: #d1fae5; color: #065f46; }
|
||||
.badge-cancelled { background: #f3f4f6; color: #4b5563; }
|
||||
.badge-sending { background: #d0eef0; color: #00626c; }
|
||||
.badge-queued { background: #ede9fe; color: #5b21b6; }
|
||||
.badge-bounced { background: #fee2e2; color: #991b1b; }
|
||||
.badge-published { background: #d1fae5; color: #065f46; }
|
||||
.badge-publishing { background: #d0eef0; color: #00626c; }
|
||||
|
||||
.form-grid { display: grid; gap: 16px; }
|
||||
.form-grid.cols-2 { grid-template-columns: 1fr 1fr; }
|
||||
@media (max-width: 700px) { .form-grid.cols-2 { grid-template-columns: 1fr; } }
|
||||
.field label { display: block; font-size: 12px; font-weight: 600; margin-bottom: 6px; color: #374151; }
|
||||
.field input, .field select, .field textarea {
|
||||
width: 100%;
|
||||
padding: 10px 12px;
|
||||
border: 1px solid var(--monica-border);
|
||||
font: inherit;
|
||||
background: #fff;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.field textarea { min-height: 100px; resize: vertical; }
|
||||
.field .hint { font-size: 12px; color: var(--monica-muted); margin-top: 4px; }
|
||||
|
||||
.channel-tabs { display: flex; gap: 0; border-bottom: 1px solid var(--monica-border); margin-bottom: 18px; }
|
||||
.channel-tabs a {
|
||||
padding: 10px 16px;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
color: var(--monica-muted);
|
||||
text-decoration: none;
|
||||
border-bottom: 2px solid transparent;
|
||||
margin-bottom: -1px;
|
||||
}
|
||||
.channel-tabs a.active { color: var(--monica-primary); border-bottom-color: var(--monica-primary); }
|
||||
|
||||
.chart-placeholder {
|
||||
height: 220px;
|
||||
background: linear-gradient(180deg, #e8f4f5 0%, #fff 100%);
|
||||
border: 1px dashed #a8d8dc;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
gap: 12px;
|
||||
padding: 24px 16px 12px;
|
||||
}
|
||||
.chart-placeholder > .bar {
|
||||
flex: 1;
|
||||
background: var(--monica-primary);
|
||||
opacity: 0.75;
|
||||
border-radius: 2px 2px 0 0;
|
||||
min-height: 8px;
|
||||
}
|
||||
.chart-placeholder .chart-bar-col {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
justify-content: flex-end;
|
||||
min-width: 0;
|
||||
height: 100%;
|
||||
}
|
||||
.chart-placeholder .chart-bar-col .bar {
|
||||
width: 100%;
|
||||
background: var(--monica-primary);
|
||||
opacity: 0.75;
|
||||
border-radius: 2px 2px 0 0;
|
||||
min-height: 8px;
|
||||
transition: height 0.25s ease;
|
||||
}
|
||||
.chart-placeholder .chart-bar-meta {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 2px;
|
||||
margin-top: 8px;
|
||||
text-align: center;
|
||||
}
|
||||
.chart-placeholder .chart-bar-value {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
color: #0f172a;
|
||||
line-height: 1.2;
|
||||
}
|
||||
.chart-placeholder .chart-bar-label {
|
||||
font-size: 11px;
|
||||
color: var(--monica-muted);
|
||||
line-height: 1.2;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.consent-pills { display: flex; gap: 6px; flex-wrap: wrap; }
|
||||
.preview-pane {
|
||||
background: #f8fafc;
|
||||
border: 1px solid var(--monica-border);
|
||||
padding: 16px;
|
||||
font-size: 14px;
|
||||
min-height: 160px;
|
||||
}
|
||||
.calendar-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(7, 1fr);
|
||||
gap: 4px;
|
||||
font-size: 12px;
|
||||
}
|
||||
.calendar-grid .dow { text-align: center; color: var(--monica-muted); font-weight: 600; padding: 6px; }
|
||||
.calendar-grid .day {
|
||||
aspect-ratio: 1;
|
||||
border: 1px solid var(--monica-border);
|
||||
background: #fff;
|
||||
padding: 6px;
|
||||
position: relative;
|
||||
}
|
||||
.calendar-grid .day.has-post { background: #e8f4f5; }
|
||||
.calendar-grid .day .dot {
|
||||
width: 6px; height: 6px; border-radius: 50%;
|
||||
background: var(--monica-primary);
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.login-wrap {
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: linear-gradient(160deg, #080808, #00626c 60%, #e8f4f5 60%);
|
||||
padding: 24px;
|
||||
}
|
||||
.login-card {
|
||||
background: #fff;
|
||||
width: 100%;
|
||||
max-width: 400px;
|
||||
padding: 36px 32px;
|
||||
border: 1px solid var(--monica-border);
|
||||
}
|
||||
.login-card h1 { font-family: Poppins, sans-serif; font-size: 22px; margin: 0 0 6px; }
|
||||
.login-card .sub { color: var(--monica-muted); font-size: 14px; margin-bottom: 24px; }
|
||||
|
||||
.split { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
|
||||
@media (max-width: 900px) {
|
||||
.portal-shell { flex-direction: column; }
|
||||
.portal-sidebar { width: 100%; }
|
||||
.portal-nav { display: flex; flex-wrap: wrap; padding: 8px; }
|
||||
.portal-nav .nav-section { display: none; }
|
||||
.portal-nav a { border-left: none; border-bottom: 2px solid transparent; padding: 8px 12px; }
|
||||
.portal-nav a.active { border-bottom-color: #00a0ab; }
|
||||
.split { grid-template-columns: 1fr; }
|
||||
}
|
||||
|
||||
/* Public brand — EXIT Realty logo from exitrealtywheaton.com */
|
||||
.page .rd-navbar-brand {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
.page .rd-navbar-brand img {
|
||||
display: block !important;
|
||||
height: 44px;
|
||||
width: auto;
|
||||
max-width: 160px;
|
||||
}
|
||||
.page .rd-navbar-brand::before,
|
||||
.page .rd-navbar-brand::after { content: none !important; display: none !important; }
|
||||
.page .rd-navbar-brand .brand-site {
|
||||
font-family: Poppins, sans-serif;
|
||||
font-weight: 700;
|
||||
font-size: 13px;
|
||||
letter-spacing: 0.04em;
|
||||
color: #00626c;
|
||||
text-decoration: none;
|
||||
line-height: 1.2;
|
||||
}
|
||||
.page .rd-navbar-brand .brand-site span {
|
||||
display: block;
|
||||
font-size: 10px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.12em;
|
||||
text-transform: uppercase;
|
||||
color: #6b7280;
|
||||
}
|
||||
|
||||
/* Shared extras */
|
||||
.muted { color: var(--monica-muted); font-size: 12px; }
|
||||
.text-warn { color: var(--monica-warn); font-size: 12px; }
|
||||
.hint-block { font-size: 13px; color: var(--monica-muted); margin: 12px 0 0; }
|
||||
.plain-list { margin: 0 0 12px; padding-left: 18px; }
|
||||
.plain-list li { margin-bottom: 6px; }
|
||||
.check-row { display: flex; align-items: center; gap: 8px; font-size: 14px; }
|
||||
.check-row.account-pick { align-items: flex-start; }
|
||||
.account-pick-copy {
|
||||
min-width: 0;
|
||||
overflow-wrap: anywhere;
|
||||
word-break: break-word;
|
||||
}
|
||||
.account-pick-copy strong { display: block; font-weight: 600; }
|
||||
.account-rename {
|
||||
display: flex;
|
||||
gap: 6px;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.account-rename input[type="text"] {
|
||||
flex: 1;
|
||||
min-width: 160px;
|
||||
max-width: 100%;
|
||||
padding: 8px 10px;
|
||||
border: 1px solid var(--monica-border);
|
||||
font: inherit;
|
||||
background: #fff;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.row-warn td { background: #fffbeb; }
|
||||
.auth-alert {
|
||||
background: #fff7ed;
|
||||
border: 1px solid #fdba74;
|
||||
color: #9a3412;
|
||||
padding: 12px 16px;
|
||||
margin-bottom: 16px;
|
||||
font-size: 14px;
|
||||
}
|
||||
.auth-alert a { color: #9a3412; font-weight: 600; }
|
||||
|
||||
/* Social accounts */
|
||||
.connect-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||
gap: 12px;
|
||||
}
|
||||
@media (max-width: 900px) {
|
||||
.connect-grid { grid-template-columns: 1fr; }
|
||||
}
|
||||
.connect-card {
|
||||
display: flex; gap: 14px; align-items: flex-start; text-align: left;
|
||||
padding: 14px; border: 1px solid var(--monica-border); background: #fff;
|
||||
cursor: pointer; font: inherit; width: 100%;
|
||||
}
|
||||
.connect-card:hover { border-color: var(--monica-primary); }
|
||||
.connect-card.is-active { border-color: var(--monica-primary); box-shadow: inset 0 0 0 1px var(--monica-primary); }
|
||||
.connect-card p { margin: 4px 0 0; font-size: 13px; color: var(--monica-muted); }
|
||||
.connect-form-panel {
|
||||
margin-top: 16px;
|
||||
padding-top: 16px;
|
||||
border-top: 1px solid var(--monica-border);
|
||||
}
|
||||
.connect-steps {
|
||||
margin: 0 0 16px;
|
||||
padding-left: 18px;
|
||||
font-size: 13px;
|
||||
color: var(--monica-muted);
|
||||
}
|
||||
.connect-steps li { margin-bottom: 8px; }
|
||||
.connect-steps a { color: var(--monica-primary); }
|
||||
.platform-icon {
|
||||
width: 40px; height: 40px; border-radius: 8px; display: flex; align-items: center;
|
||||
justify-content: center; color: #fff; font-weight: 700; flex-shrink: 0; font-size: 14px;
|
||||
}
|
||||
.platform-icon.meta { background: #1877f2; }
|
||||
.platform-icon.ig { background: linear-gradient(45deg, #f58529, #dd2a7b, #8134af); font-size: 12px; }
|
||||
.platform-icon.li { background: #0a66c2; }
|
||||
.platform-pill {
|
||||
display: inline-block; padding: 2px 8px; font-size: 11px; font-weight: 600;
|
||||
color: #fff; border-radius: 2px;
|
||||
}
|
||||
.platform-pill.meta { background: #1877f2; }
|
||||
.platform-pill.ig { background: #dd2a7b; }
|
||||
.platform-pill.li { background: #0a66c2; }
|
||||
|
||||
/* Import wizard */
|
||||
.steps {
|
||||
display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 20px;
|
||||
}
|
||||
.step {
|
||||
display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--monica-muted);
|
||||
padding: 8px 12px; background: #fff; border: 1px solid var(--monica-border);
|
||||
}
|
||||
.step span {
|
||||
width: 22px; height: 22px; border-radius: 50%; background: #e5e7eb; color: #374151;
|
||||
display: inline-flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 700;
|
||||
}
|
||||
.step.active { border-color: var(--monica-primary); color: var(--monica-ink); }
|
||||
.step.active span { background: var(--monica-primary); color: #fff; }
|
||||
.dropzone {
|
||||
border: 2px dashed var(--monica-border); padding: 32px; text-align: center; background: #f8fafc;
|
||||
}
|
||||
|
||||
/* Designer shared layout */
|
||||
.designer-layout {
|
||||
display: grid; grid-template-columns: minmax(280px, 380px) 1fr; gap: 20px; align-items: start;
|
||||
}
|
||||
.designer-layout.with-ai {
|
||||
grid-template-columns: minmax(260px, 340px) minmax(240px, 320px) 1fr;
|
||||
}
|
||||
@media (max-width: 1200px) {
|
||||
.designer-layout.with-ai { grid-template-columns: 1fr 1fr; }
|
||||
.designer-layout.with-ai .designer-preview-col { grid-column: 1 / -1; }
|
||||
}
|
||||
@media (max-width: 960px) {
|
||||
.designer-layout,
|
||||
.designer-layout.with-ai { grid-template-columns: 1fr; }
|
||||
}
|
||||
|
||||
/* PCM Integrations embedded designer */
|
||||
.pcm-iframe-wrap {
|
||||
padding: 0 !important;
|
||||
min-height: 70vh;
|
||||
background: #f8fafc;
|
||||
}
|
||||
.pcm-iframe-wrap iframe {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: min(80vh, 900px);
|
||||
border: 0;
|
||||
background: #fff;
|
||||
}
|
||||
.pcm-designer .table tr.is-active td {
|
||||
background: #e8f4f5;
|
||||
}
|
||||
|
||||
/* Size picker */
|
||||
.size-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
|
||||
.size-option {
|
||||
border: 1px solid var(--monica-border); background: #fff; padding: 10px 12px;
|
||||
text-align: left; cursor: pointer; font: inherit; color: inherit;
|
||||
}
|
||||
.size-option:hover { border-color: var(--monica-primary); }
|
||||
.size-option.active {
|
||||
border-color: var(--monica-primary); background: #e8f4f5;
|
||||
box-shadow: inset 3px 0 0 var(--monica-primary);
|
||||
}
|
||||
.size-option .sz-name { font-weight: 700; font-size: 13px; font-family: Poppins, sans-serif; }
|
||||
.size-option .sz-meta { font-size: 11px; color: var(--monica-muted); margin-top: 2px; }
|
||||
.size-option .sz-badge {
|
||||
display: inline-block; margin-top: 6px; font-size: 10px; font-weight: 600;
|
||||
text-transform: uppercase; letter-spacing: 0.04em; color: var(--monica-primary);
|
||||
}
|
||||
|
||||
/* Media library */
|
||||
.media-library { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
|
||||
.media-tile {
|
||||
position: relative; aspect-ratio: 4 / 3; border: 2px solid transparent;
|
||||
background-size: cover; background-position: center; background-color: #e5e7eb;
|
||||
cursor: pointer; padding: 0; overflow: hidden;
|
||||
}
|
||||
.media-tile.active { border-color: var(--monica-primary); }
|
||||
.media-tile .media-label {
|
||||
position: absolute; left: 0; right: 0; bottom: 0; padding: 4px 6px;
|
||||
background: rgba(15, 23, 42, 0.72); color: #fff; font-size: 10px;
|
||||
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
|
||||
}
|
||||
.media-tile.upload-tile {
|
||||
border: 2px dashed var(--monica-border); background: #f8fafc;
|
||||
display: flex; flex-direction: column; align-items: center; justify-content: center;
|
||||
gap: 4px; color: var(--monica-muted); font-size: 11px; font-weight: 600;
|
||||
}
|
||||
.media-tile.upload-tile:hover { border-color: var(--monica-primary); color: var(--monica-primary); }
|
||||
.media-tile.upload-tile span { font-size: 22px; line-height: 1; color: var(--monica-primary); }
|
||||
.dropzone.compact { padding: 16px; font-size: 13px; cursor: pointer; }
|
||||
.dropzone.compact:hover { border-color: var(--monica-primary); }
|
||||
.library-hint { font-size: 12px; color: var(--monica-muted); margin: 8px 0 0; }
|
||||
|
||||
/* AI chat assist */
|
||||
.ai-chat {
|
||||
display: flex; flex-direction: column; height: min(640px, 75vh);
|
||||
background: #fff; border: 1px solid var(--monica-border);
|
||||
}
|
||||
.ai-chat-h {
|
||||
padding: 12px 14px; border-bottom: 1px solid var(--monica-border);
|
||||
display: flex; align-items: center; justify-content: space-between; gap: 8px;
|
||||
}
|
||||
.ai-chat-h h2 { margin: 0; font-size: 15px; font-family: Poppins, sans-serif; font-weight: 600; }
|
||||
.ai-pill {
|
||||
font-size: 10px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
|
||||
background: #e8f4f5; color: var(--monica-primary); padding: 3px 8px;
|
||||
}
|
||||
.ai-chat-messages {
|
||||
flex: 1; overflow-y: auto; padding: 14px; display: flex; flex-direction: column; gap: 12px;
|
||||
background: linear-gradient(180deg, #f8fafc 0%, #fff 40%);
|
||||
}
|
||||
.ai-msg { max-width: 92%; font-size: 13px; line-height: 1.45; }
|
||||
.ai-msg.bot { align-self: flex-start; }
|
||||
.ai-msg.user { align-self: flex-end; }
|
||||
.ai-msg .bubble {
|
||||
padding: 10px 12px; border: 1px solid var(--monica-border); background: #fff;
|
||||
}
|
||||
.ai-msg.user .bubble {
|
||||
background: var(--monica-primary); color: #fff; border-color: var(--monica-primary);
|
||||
}
|
||||
.ai-msg .who {
|
||||
font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em;
|
||||
color: var(--monica-muted); margin-bottom: 4px;
|
||||
}
|
||||
.ai-msg.user .who { text-align: right; color: var(--monica-primary); }
|
||||
.ai-draft {
|
||||
margin-top: 8px; padding: 10px; background: #f8fafc; border: 1px dashed #a8d8dc;
|
||||
white-space: pre-wrap; font-size: 12px; color: var(--monica-ink);
|
||||
}
|
||||
.ai-msg-actions { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
|
||||
.ai-chat-prompts {
|
||||
padding: 8px 12px; border-top: 1px solid var(--monica-border);
|
||||
display: flex; flex-wrap: wrap; gap: 6px; background: #fafbfc;
|
||||
}
|
||||
.chip {
|
||||
border: 1px solid var(--monica-border); background: #fff; font: inherit;
|
||||
font-size: 11px; font-weight: 600; padding: 5px 10px; cursor: pointer; color: var(--monica-ink);
|
||||
}
|
||||
.chip:hover { border-color: var(--monica-primary); color: var(--monica-primary); }
|
||||
.ai-chat-input {
|
||||
border-top: 1px solid var(--monica-border); padding: 10px 12px;
|
||||
display: flex; gap: 8px; align-items: flex-end;
|
||||
}
|
||||
.ai-chat-input textarea {
|
||||
flex: 1; min-height: 44px; max-height: 100px; resize: vertical;
|
||||
border: 1px solid var(--monica-border); padding: 8px 10px; font: inherit; font-size: 13px;
|
||||
}
|
||||
.ai-chat-input .btn { flex-shrink: 0; }
|
||||
|
||||
/* Postcard */
|
||||
.postcard {
|
||||
width: 100%; max-width: 420px; aspect-ratio: 6 / 4; position: relative; overflow: hidden;
|
||||
background: #111; box-shadow: 0 12px 40px rgba(15, 23, 42, 0.25); color: #fff;
|
||||
transition: max-width 0.2s, aspect-ratio 0.2s;
|
||||
}
|
||||
.postcard.size-4x6 { max-width: 420px; aspect-ratio: 6 / 4; }
|
||||
.postcard.size-6x9 { max-width: 480px; aspect-ratio: 9 / 6; }
|
||||
.postcard.size-6x11 { max-width: 520px; aspect-ratio: 11 / 6; }
|
||||
.postcard.size-square { max-width: 400px; aspect-ratio: 1 / 1; }
|
||||
.postcard-media {
|
||||
position: absolute; inset: 0; background-size: cover; background-position: center;
|
||||
}
|
||||
.postcard-overlay { position: absolute; inset: 0; pointer-events: none; }
|
||||
.postcard-overlay.ov-dark { background: linear-gradient(transparent 35%, rgba(0,0,0,.75)); }
|
||||
.postcard-overlay.ov-light { background: linear-gradient(transparent 50%, rgba(255,255,255,.92)); }
|
||||
.postcard-overlay.ov-none { background: none; }
|
||||
.postcard-overlay.ov-light ~ .postcard-copy,
|
||||
.ov-light + .postcard-copy { color: #111; }
|
||||
.postcard-copy {
|
||||
position: absolute; left: 20px; right: 20px; bottom: 18px; z-index: 2;
|
||||
}
|
||||
.postcard-headline {
|
||||
font-family: Poppins, sans-serif; font-weight: 700; font-size: 28px; letter-spacing: 0.04em;
|
||||
border-left: 4px solid #00626c; padding-left: 10px; line-height: 1.1;
|
||||
}
|
||||
.postcard-sub { margin-top: 8px; font-size: 14px; opacity: 0.95; }
|
||||
.postcard-back { background: #fafafa; color: #212121; }
|
||||
.postcard-back-grid { display: grid; grid-template-columns: 1.2fr 1fr; height: 100%; }
|
||||
.postcard-back-msg { padding: 16px; display: flex; flex-direction: column; gap: 10px; border-right: 1px dashed #cbd5e1; }
|
||||
.postcard-back-body { font-size: 12px; white-space: pre-wrap; flex: 1; line-height: 1.45; }
|
||||
.postcard-agent { font-size: 11px; font-weight: 600; color: #00626c; }
|
||||
.postcard-qr {
|
||||
width: 48px; height: 48px; background: #111; color: #fff; font-size: 10px;
|
||||
display: flex; align-items: center; justify-content: center; letter-spacing: 0.05em;
|
||||
}
|
||||
.postcard-back-mail { padding: 12px; position: relative; }
|
||||
.stamp {
|
||||
width: 44px; height: 52px; border: 2px dashed #94a3b8; float: right;
|
||||
font-size: 9px; color: #94a3b8; display: flex; align-items: center; justify-content: center;
|
||||
}
|
||||
.addr-block {
|
||||
margin-top: 48px; font-size: 12px; line-height: 1.4;
|
||||
border-bottom: 1px solid #e2e8f0; padding-bottom: 8px;
|
||||
}
|
||||
|
||||
/* Social live preview */
|
||||
.platform-toggles { display: flex; flex-wrap: wrap; gap: 8px; }
|
||||
.toggle-pill {
|
||||
border: 1px solid var(--monica-border); padding: 8px 12px; font-size: 13px;
|
||||
background: #fff; display: inline-flex; align-items: center; gap: 6px;
|
||||
}
|
||||
.toggle-pill.warn { border-color: #fdba74; background: #fff7ed; }
|
||||
.social-phone {
|
||||
width: 100%; max-width: 360px; background: #fff; border: 1px solid #d1d5db;
|
||||
box-shadow: 0 8px 30px rgba(15,23,42,.12); overflow: hidden; font-size: 14px;
|
||||
}
|
||||
.social-phone.ig { max-width: 340px; }
|
||||
.soc-header {
|
||||
display: flex; align-items: center; gap: 10px; padding: 12px 14px; position: relative;
|
||||
}
|
||||
.soc-avatar {
|
||||
width: 40px; height: 40px; background: #00626c; color: #fff; display: flex;
|
||||
align-items: center; justify-content: center; font-weight: 700; font-size: 13px; flex-shrink: 0;
|
||||
}
|
||||
.soc-avatar.round { border-radius: 50%; background: linear-gradient(45deg, #f58529, #dd2a7b); }
|
||||
.soc-avatar.sq { border-radius: 4px; background: #0a66c2; }
|
||||
.soc-name { font-weight: 700; font-size: 13px; }
|
||||
.soc-meta { font-size: 11px; color: #6b7280; }
|
||||
.soc-more { margin-left: auto; color: #6b7280; }
|
||||
.soc-caption { padding: 0 14px 12px; white-space: pre-wrap; line-height: 1.4; font-size: 13px; }
|
||||
.soc-image {
|
||||
height: 200px; background-size: cover; background-position: center; background-color: #e5e7eb;
|
||||
}
|
||||
.soc-image.square { height: 340px; }
|
||||
.soc-actions {
|
||||
padding: 10px 14px; border-top: 1px solid #e5e7eb; font-size: 12px; color: #4b5563; font-weight: 600;
|
||||
}
|
||||
.ig-act { font-size: 18px; border-top: none; padding-top: 8px; }
|
||||
|
||||
|
||||
|
||||
/* Portal logout button in topbar */
|
||||
.portal-user form { display: inline; margin: 0; }
|
||||
.portal-user button.linkish {
|
||||
background: none; border: 0; padding: 0; color: var(--monica-primary);
|
||||
font: inherit; font-size: 13px; font-weight: 600; cursor: pointer; text-decoration: underline;
|
||||
}
|
||||
.portal-flash { list-style: none; margin: 0 0 16px; padding: 0; }
|
||||
.portal-flash li {
|
||||
padding: 10px 14px; background: #e8f4f5; border-left: 3px solid var(--monica-primary);
|
||||
margin-bottom: 8px; font-size: 14px;
|
||||
}
|
||||
.portal-flash li.error { background: #fee2e2; border-left-color: #b91c1c; }
|
||||
.toolbar { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; justify-content: space-between; margin-bottom: 16px; }
|
||||
.toolbar-filters { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
|
||||
.toolbar-filters input, .toolbar-filters select {
|
||||
padding: 8px 10px; border: 1px solid var(--monica-border); font: inherit; font-size: 13px; background: #fff;
|
||||
}
|
||||
.empty-state { padding: 24px; color: var(--monica-muted); font-size: 14px; }
|
||||
@@ -0,0 +1,211 @@
|
||||
:root {
|
||||
--bg: #1a2332;
|
||||
--bg-2: #243044;
|
||||
--ink: #f3efe6;
|
||||
--muted: #b7c0ce;
|
||||
--accent: #c4a574;
|
||||
--accent-2: #7ea08a;
|
||||
--danger: #c97b7b;
|
||||
--radius: 2px;
|
||||
--font-display: "Fraunces", Georgia, serif;
|
||||
--font-body: "Source Sans 3", system-ui, sans-serif;
|
||||
}
|
||||
|
||||
* { box-sizing: border-box; }
|
||||
html, body { margin: 0; padding: 0; }
|
||||
body {
|
||||
font-family: var(--font-body);
|
||||
color: var(--ink);
|
||||
background:
|
||||
radial-gradient(1200px 600px at 10% -10%, #2c3d55 0%, transparent 55%),
|
||||
radial-gradient(900px 500px at 100% 0%, #3a2f28 0%, transparent 45%),
|
||||
var(--bg);
|
||||
min-height: 100vh;
|
||||
line-height: 1.5;
|
||||
}
|
||||
a { color: var(--accent); text-decoration: none; }
|
||||
a:hover { text-decoration: underline; }
|
||||
.site-header, .site-footer {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 1rem 1.5rem;
|
||||
gap: 1rem;
|
||||
}
|
||||
.site-header nav { display: flex; gap: 1rem; flex-wrap: wrap; }
|
||||
.brand {
|
||||
font-family: var(--font-display);
|
||||
font-size: 1.4rem;
|
||||
color: var(--ink);
|
||||
font-weight: 700;
|
||||
}
|
||||
main { padding: 1.5rem; max-width: 1100px; margin: 0 auto; }
|
||||
.hero {
|
||||
min-height: 70vh;
|
||||
display: grid;
|
||||
align-content: end;
|
||||
gap: 0.75rem;
|
||||
padding: 2rem 0 3rem;
|
||||
}
|
||||
.hero h1 {
|
||||
font-family: var(--font-display);
|
||||
font-size: clamp(2.4rem, 6vw, 4.2rem);
|
||||
margin: 0;
|
||||
max-width: 14ch;
|
||||
line-height: 1.05;
|
||||
}
|
||||
.hero p { max-width: 42ch; color: var(--muted); font-size: 1.1rem; }
|
||||
.btn {
|
||||
display: inline-block;
|
||||
background: var(--accent);
|
||||
color: #1a2332;
|
||||
padding: 0.7rem 1.2rem;
|
||||
border: 0;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
}
|
||||
.btn.secondary { background: transparent; color: var(--ink); border: 1px solid var(--muted); }
|
||||
.flash { list-style: none; padding: 0 1.5rem; }
|
||||
.flash li { background: var(--bg-2); padding: 0.6rem 0.9rem; margin: 0.4rem 0; }
|
||||
.form-grid { display: grid; gap: 0.8rem; max-width: 32rem; }
|
||||
.form-grid label { display: grid; gap: 0.3rem; color: var(--muted); }
|
||||
.form-grid input, .form-grid textarea, .form-grid select {
|
||||
background: var(--bg-2);
|
||||
border: 1px solid #3a4a63;
|
||||
color: var(--ink);
|
||||
padding: 0.6rem 0.7rem;
|
||||
font: inherit;
|
||||
}
|
||||
.portal-shell { display: grid; grid-template-columns: 220px 1fr; gap: 1.5rem; min-height: 70vh; }
|
||||
.portal-nav {
|
||||
background: rgba(36, 48, 68, 0.85);
|
||||
padding: 1rem;
|
||||
display: grid;
|
||||
gap: 0.55rem;
|
||||
align-content: start;
|
||||
}
|
||||
.portal-nav a { color: var(--ink); }
|
||||
.portal-logout { margin: 0; }
|
||||
.portal-logout button {
|
||||
background: none;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
color: var(--ink);
|
||||
font: inherit;
|
||||
cursor: pointer;
|
||||
text-align: left;
|
||||
}
|
||||
.portal-logout button:hover { text-decoration: underline; }
|
||||
.brand-mini { font-family: var(--font-display); margin: 0 0 0.5rem; color: var(--accent); }
|
||||
.stat-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 0.8rem; }
|
||||
.stat {
|
||||
background: rgba(36, 48, 68, 0.9);
|
||||
padding: 1rem;
|
||||
}
|
||||
.stat strong { display: block; font-size: 1.6rem; font-family: var(--font-display); }
|
||||
.table { width: 100%; border-collapse: collapse; }
|
||||
.table th, .table td { text-align: left; padding: 0.55rem 0.4rem; border-bottom: 1px solid #33455f; }
|
||||
.holding {
|
||||
min-height: 80vh;
|
||||
display: grid;
|
||||
align-content: center;
|
||||
gap: 1rem;
|
||||
max-width: 36rem;
|
||||
}
|
||||
.holding h1 { font-family: var(--font-display); font-size: clamp(2rem, 5vw, 3rem); margin: 0; }
|
||||
.muted { color: var(--muted); }
|
||||
.error { color: var(--danger); }
|
||||
|
||||
.visually-hidden {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.site-footer {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.footer-meta { display: grid; gap: 0.25rem; }
|
||||
.footer-meta p { margin: 0; color: var(--muted); }
|
||||
.footer-links { margin: 0; }
|
||||
.footer-link-btn {
|
||||
background: none;
|
||||
border: none;
|
||||
padding: 0;
|
||||
color: var(--muted);
|
||||
font: inherit;
|
||||
font-size: 0.9rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
.footer-link-btn:hover {
|
||||
color: var(--accent);
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.cookie-consent-banner {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 1100;
|
||||
padding: 1rem;
|
||||
background: rgba(26, 35, 50, 0.97);
|
||||
border-top: 1px solid rgba(196, 165, 116, 0.35);
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
.cookie-consent-content {
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 1rem;
|
||||
}
|
||||
.cookie-consent-text {
|
||||
flex: 1 1 420px;
|
||||
color: var(--muted);
|
||||
font-size: 0.95rem;
|
||||
margin: 0;
|
||||
}
|
||||
.cookie-consent-text-short { display: none; }
|
||||
.cookie-consent-actions {
|
||||
display: flex;
|
||||
gap: 0.75rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.cookie-consent-banner {
|
||||
padding: 0.625rem 0.75rem;
|
||||
padding-bottom: max(0.625rem, env(safe-area-inset-bottom));
|
||||
}
|
||||
.cookie-consent-content {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
gap: 0.625rem;
|
||||
}
|
||||
.cookie-consent-text-short { display: inline; }
|
||||
.cookie-consent-text-full { display: none; }
|
||||
.cookie-consent-text {
|
||||
flex: none;
|
||||
font-size: 0.8125rem;
|
||||
line-height: 1.35;
|
||||
}
|
||||
.cookie-consent-actions { width: 100%; }
|
||||
.cookie-consent-actions .btn {
|
||||
flex: 1;
|
||||
padding: 0.5rem 0.75rem;
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 800px) {
|
||||
.portal-shell { grid-template-columns: 1fr; }
|
||||
}
|
||||
@@ -0,0 +1,239 @@
|
||||
@charset "UTF-8";
/*
|
||||
* Trunk version 2.0.0
|
||||
*/
a:focus,
button:focus {
outline: none !important;
}
button::-moz-focus-inner {
border: 0;
}
*:focus {
outline: none;
}
blockquote {
padding: 0;
margin: 0;
}
input,
button,
select,
textarea {
outline: none;
}
label {
margin-bottom: 0;
}
p {
margin: 0;
}
ul,
ol {
list-style: none;
padding: 0;
margin: 0;
}
ul li,
ol li {
display: block;
}
dl {
margin: 0;
}
dt,
dd {
line-height: inherit;
}
dt {
font-weight: inherit;
}
dd {
margin-bottom: 0;
}
cite {
font-style: normal;
}
form {
margin-bottom: 0;
}
blockquote {
padding-left: 0;
border-left: 0;
}
address {
margin-top: 0;
margin-bottom: 0;
}
figure {
margin-bottom: 0;
}
html p a:hover {
text-decoration: none;
}
/*
|
||||
*
|
||||
* Typography
|
||||
*/
body {
font-family: "Work Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
font-size: 14px;
line-height: 1.7;
font-weight: 300;
color: #74757f;
background-color: #fff;
-webkit-text-size-adjust: none;
-webkit-font-smoothing: subpixel-antialiased;
letter-spacing: .03em;
}
@media (min-width: 768px) {
body {
font-size: 16px;
line-height: 1.5;
}
}
h1, h2, h3, h4, h5, h6, [class^='heading-'] {
margin-top: 0;
margin-bottom: 0;
color: #151515;
}
h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, h5 a:hover, h6 a:hover, [class^='heading-'] a:hover {
color: #0045b6;
}
h1 span, h2 span, h3 span, h4 span, h5 span, h6 span, [class^='heading-'] span {
display: inline-block;
}
h1 span[data-toggle='modal'], h2 span[data-toggle='modal'], h3 span[data-toggle='modal'], h4 span[data-toggle='modal'], h5 span[data-toggle='modal'], h6 span[data-toggle='modal'], [class^='heading-'] span[data-toggle='modal'] {
border-bottom: 2px dashed rgba(0, 69, 182, 0.3);
cursor: pointer;
}
h1 > span.icon, h2 > span.icon, h3 > span.icon, h4 > span.icon, h5 > span.icon, h6 > span.icon, [class^='heading-'] > span.icon {
display: inline-block;
margin-right: 5px;
}
h1,
.heading-1 {
font-size: 30px;
line-height: 1.15;
letter-spacing: 0;
}
@media (min-width: 576px) {
h1,
.heading-1 {
font-size: 32px;
}
}
@media (min-width: 768px) {
h1,
.heading-1 {
font-size: 46px;
line-height: 1.25;
}
}
@media (min-width: 992px) {
h1,
.heading-1 {
font-size: 54px;
}
}
@media (min-width: 1200px) {
h1,
.heading-1 {
font-size: 58px;
}
}
@media (min-width: 1600px) {
h1,
.heading-1 {
font-size: 90px;
line-height: 0.88889;
}
}
h2,
.heading-2 {
font-family: "Poppins", sans-serif;
font-size: 28px;
line-height: 1.4;
letter-spacing: 0;
}
@media (min-width: 576px) {
h2,
.heading-2 {
font-size: 30px;
}
}
@media (min-width: 768px) {
h2,
.heading-2 {
font-size: 44px;
}
}
@media (min-width: 1200px) {
h2,
.heading-2 {
font-size: 50px;
line-height: 1.4;
}
}
h3,
.heading-3 {
font-size: 24px;
line-height: 1.3;
letter-spacing: 0;
}
@media (min-width: 768px) {
h3,
.heading-3 {
font-size: 30px;
line-height: 1.4;
}
}
@media (min-width: 1200px) {
h3,
.heading-3 {
font-size: 38px;
line-height: 1.21053;
}
}
h3 .big,
.heading-3 .big {
font-size: 2em;
line-height: 1;
}
h4,
.heading-4 {
font-size: 18px;
line-height: 1.5;
letter-spacing: 0;
}
@media (min-width: 1200px) {
h4,
.heading-4 {
font-size: 24px;
line-height: 1.33333;
}
}
h4.h4-smaller,
.heading-4.h4-smaller {
font-size: 19px;
}
@media (min-width: 1200px) {
h4.h4-smaller,
.heading-4.h4-smaller {
font-size: 22px;
line-height: 1.45455;
}
}
h5,
.heading-5 {
font-size: 16px;
line-height: 1.5;
letter-spacing: .01em;
}
@media (min-width: 768px) {
h5,
.heading-5 {
font-size: 22px;
line-height: 1.27273;
}
}
h6,
.heading-6 {
font-family: "Poppins", sans-serif;
font-size: 14px;
line-height: 1.8;
letter-spacing: .2em;
text-transform: uppercase;
}
@media (min-width: 768px) {
h6,
.heading-6 {
font-size: 16px;
line-height: 1.5;
font-weight: 700;
}
}
.title-decorated {
position: relative;
padding-left: 40px;
text-align: left;
}
.title-decorated::before {
content: '';
position: absolute;
left: 0;
top: 12px;
width: 30px;
border-bottom: 1px solid;
}
.title-docor-text {
font-size: 20px;
color: #fff;
}
@media (min-width: 576px) {
.title-docor-text {
font-size: 24px;
}
}
@media (min-width: 768px) {
.title-docor-text {
padding-left: 96px;
font-size: 37px;
}
.title-docor-text::before {
width: 74px;
border-bottom-width: 2px;
}
}
@media (min-width: 768px) {
.title-decorated-lg {
padding-left: 80px;
}
.title-decorated-lg::before {
width: 62px;
}
.title-decorated-lg + p {
margin-top: 32px;
}
}
small,
.small {
display: block;
font-size: 12px;
line-height: 1.5;
}
mark,
.mark {
padding: 3px 5px;
color: #fff;
background: #0045b6;
}
strong {
font-weight: 700;
color: #74757f;
}
.big {
font-size: 16px;
line-height: 1.55;
}
@media (min-width: 768px) {
.big {
font-size: 20px;
line-height: 1.6;
}
}
.lead {
font-size: 24px;
line-height: 34px;
font-weight: 300;
}
code {
padding: 4px 5px;
border-radius: 0;
font-size: 90%;
color: #111111;
background: #f5f6fa;
}
.text-large {
font-family: "Poppins", sans-serif;
font-size: 30px;
font-weight: 500;
letter-spacing: 0;
line-height: 1.2;
text-transform: uppercase;
}
@media (min-width: 576px) {
.text-large {
font-size: 55px;
}
}
@media (min-width: 768px) {
.text-large {
font-size: 68px;
}
}
@media (min-width: 992px) {
.text-large {
font-size: 80px;
}
}
@media (min-width: 1200px) {
.text-large {
font-size: 100px;
}
}
.context-dark .text-large, .bg-gray-700 .text-large, .bg-gray-800 .text-large, .bg-primary .text-large, .bg-primary-darker .text-large {
color: #fff;
}
.text-extra-large {
font-size: 100px;
line-height: .8Line truncated
|
||||
*
|
||||
* Brand
|
||||
*/
.brand {
display: inline-block;
}
.brand .brand-logo-light {
display: none;
}
.brand .brand-logo-dark {
display: block;
}
/*
|
||||
*
|
||||
* Links
|
||||
*/
a {
transition: all 0.3s ease-in-out;
}
a, a:focus, a:active, a:hover {
text-decoration: none;
}
a, a:focus, a:active {
color: #0045b6;
}
a:hover {
color: #00286a;
}
a[href*='tel'], a[href*='mailto'] {
white-space: nowrap;
}
.link-hover {
color: #343db0;
}
.link-default, .link-default:active, .link-default:focus {
color: #74757f;
}
.link-default:hover {
color: #0045b6;
}
.context-dark .link-default, .bg-gray-700 .link-default, .bg-gray-800 .link-default, .bg-primary .link-default, .bg-primary-darker .link-default {
color: #aeb1be;
}
.context-dark .link-default:hover, .bg-gray-700 .link-default:hover, .bg-gray-800 .link-default:hover, .bg-primary .link-default:hover, .bg-primary-darker .link-default:hover {
color: #fff;
}
.link-image {
display: block;
max-width: 75%;
margin-left: auto;
margin-right: auto;
opacity: .45;
transition: all 0.3s ease-in-out;
}
.link-image:hover {
opacity: 1;
}
.privacy-link {
display: inline-block;
color: #4854ed;
}
* + .privacy-link {
margin-top: 25px;
}
/*
|
||||
*
|
||||
* Blocks
|
||||
*/
.block-center, .block-sm, .block-lg {
margin-left: auto;
margin-right: auto;
}
.block-sm {
max-width: 560px;
}
.block-lg {
max-width: 768px;
}
.block-center {
padding: 10px;
}
.block-center:hover .block-center-header {
background-color: #0045b6;
}
.block-center-title {
background-color: #fff;
}
@media (max-width: 1599.98px) {
.block-center {
padding: 20px;
}
.block-center:hover .block-center-header {
background-color: #fff;
}
.block-center-header {
background-color: #0045b6;
}
}
/*
|
||||
*
|
||||
* Boxes
|
||||
*/
.box-minimal {
display: flex;
margin-left: -15px;
text-align: left;
}
.box-minimal > * {
margin-left: 15px;
}
.box-chloe__icon {
font-size: 26px;
}
.box-minimal-icon .box-chloe__icon {
position: relative;
top: 4px;
min-width: 26px;
font-size: 24px;
line-height: 1;
color: #0045b6;
}
.box-minimal-icon .box-chloe__icon.fl-bigmug-line-checkmark14 {
font-size: 20px;
}
.box-minimal-icon .box-chloe__icon .box-chloe__icon {
position: relative;
top: 4px;
min-width: 26px;
font-size: 24px;
line-height: 1;
}
.box-minimal-text {
width: 100%;
max-width: 320px;
margin-left: auto;
margin-right: auto;
}
* + .box-minimal {
margin-top: 30px;
}
* + .box-minimal-title {
margin-top: 10px;
}
* + .box-minimal-text {
margin-top: 15px;
}
@media (max-width: 575.98px) {
.box-minimal {
max-width: 360px;
margin-left: auto;
margin-right: auto;
}
}
@media (max-width: 767.98px) {
.box-minimal * + p {
margin-top: 7px;
}
}
@media (min-width: 768px) {
.box-minimal {
padding-right: 15px;
margin-left: -30px;
}
.box-minimal > * {
margin-left: 30px;
}
}
@media (min-width: 992px) and (max-width: 1199.98px) {
.box-minimal {
padding-right: 0;
}
.box-minimal-title {
font-size: 22px;
}
}
@media (min-width: 1200px) {
.box-minimal-icon, .box-chloe__icon {
top: 0;
font-size: 36px;
}
.box-minimal-icon .box-chloe__icon, .box-chloe__icon .box-chloe__icon {
font-size: 32px;
top: 0;
}
.box-minimal-icon.fl-bigmug-line-checkmark14, .box-chloe__icon.fl-bigmug-line-checkmark14 {
font-size: 30px;
}
}
.box-light {
text-align: left;
}
.box-light-icon {
font-size: 30px;
line-height: 1;
color: #0045b6;
}
* + .box-light-title {
margin-top: 10px;
}
@media (max-width: 575.98px) {
.box-light {
max-width: 300px;
margin-left: auto;
margin-right: auto;
}
}
@media (min-width: 768px) {
.box-light {
max-width: 240px;
}
.box-chloe__icon {
font-size: 32px;
}
* + .box-light-title {
margin-top: 16px;
}
}
@media (min-width: 768px) and (max-width: 1199.98px) {
.box-light-title {
font-size: 20px;
}
}
@media (min-width: 992px) {
.box-light-icon {
font-size: 32px;
}
* + .box-light-title {
margin-top: 25px;
}
}
@media (min-width: 1200px) {
.box-light-icon {
font-size: 40px;
}
}
.box-creative {
max-width: 330px;
margin-left: auto;
margin-right: auto;
text-align: center;
cursor: default;
}
.box-creative:hover .box-creative-icon {
color: #fff;
}
.box-creative:hover .box-creative-icon::after {
opacity: 1;
visibility: visible;
transform: translate3d(0, 0, 0);
}
.box-creative-shadow .box-creative-icon {
background: #fff;
border: 0;
box-shadow: 0 17px 24px 0 rgba(0, 0, 0, 0.05);
}
.box-creative-icon {
position: relative;
z-index: 0;
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.8em;
height: 2.8em;
border: 2px solid #e8e9ee;
border-radius: 50%;
font-size: 24px;
line-height: 1;
color: #0045b6;
}
.box-creative-icon::before {
position: relative;
z-index: 2;
}
.box-creative-icon::after {
content: '';
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: -1;
border-radius: inherit;
background: #0045b6;
border-color: #0045b6;
pointer-events: none;
opacity: 0;
visibility: hidden;
transition: .15s ease-in;
transform: scale3d(1.05, 1.05, 1.05);
}
* + .box-creative-icon {
margin-top: 10px;
}
* + .box-creative-title {
margin-top: 10px;
}
@media (min-width: 768px) {
.box-creative-icon {
font-size: 30px;
}
* + .box-creative-title {
margin-top: 15px;
}
}
@media (max-width: 991.98px) {
.box-creative * + p {
margin-top: 10px;
}
}
@media (min-width: 1200px) {
.box-creative-icon {
width: 2.4em;
height: 2.4em;
font-size: 40px;
}
* + .box-creative-title {
margin-top: 24px;
}
}
.box-1 {
max-width: 280px;
margin-left: auto;
margin-right: auto;
}
@media (min-width: 768px) {
.box-2 {
padding-right: 30px;
}
}
@media (min-width: 992px) {
.box-2 {
padding-right: 35px;
}
}
@media (min-width: 1200px) {
.box-2 {
padding-right: 100px;
}
}
@media (min-width: 992px) {
.box-3 {
padding-left: 10px;
}
}
@media (min-width: 1200px) {
.box-3 {
padding-left: 70px;
}
}
div.box-cta-1 {
display: inline-table;
text-align: center;
vertical-align: middle;
margin-bottom: -25px;
margin-left: -40px;
}
div.box-cta-1:empty {
margin-bottom: 0;
margin-left: 0;
}
div.box-cta-1 > * {
display: inline-block;
margin: 0 0 25px 40px;
}
div.box-cta-1 > * {
margin-top: 0;
vertical-align: middle;
}
div.box-cta-thin {
display: inline-table;
text-align: center;
vertical-align: middle;
margin-bottom: -25px;
margin-left: -30px;
}
div.box-cta-thin:empty {
margin-bottom: 0;
margin-left: 0;
}
div.box-cta-thin > * {
display: inline-block;
margin: 0 0 25px 30px;
}
div.box-cta-thin > * {
margin-top: 0;
vertical-align: middle;
}
@media (min-width: 768px) and (max-width: 991.98px) {
div.box-cta-thin > * {
max-width: 500px;
}
}
.box-indigo {
positionLine truncated
|
||||
* Element groups
|
||||
*/
html .group {
margin-bottom: -15px;
margin-left: -20px;
}
html .group:empty {
margin-bottom: 0;
margin-left: 0;
}
html .group > * {
display: inline-block;
margin: 0 0 15px 20px;
}
@media (min-width: 992px) {
html .group {
margin-left: -30px;
}
html .group > * {
margin-left: 30px;
}
}
html .group-xs {
margin-bottom: -7px;
margin-left: -7px;
}
html .group-xs:empty {
margin-bottom: 0;
margin-left: 0;
}
html .group-xs > * {
display: inline-block;
margin: 0 0 7px 7px;
}
html .group-sm {
margin-bottom: -10px;
margin-left: -10px;
}
html .group-sm:empty {
margin-bottom: 0;
margin-left: 0;
}
html .group-sm > * {
display: inline-block;
margin: 0 0 10px 10px;
}
html .group-lg {
margin-bottom: -25px;
margin-left: -40px;
}
html .group-lg:empty {
margin-bottom: 0;
margin-left: 0;
}
html .group-lg > * {
display: inline-block;
margin: 0 0 25px 40px;
}
html .group-xl {
margin-bottom: -20px;
margin-left: -30px;
}
html .group-xl:empty {
margin-bottom: 0;
margin-left: 0;
}
html .group-xl > * {
display: inline-block;
margin: 0 0 20px 30px;
}
@media (min-width: 992px) {
html .group-xl {
margin-bottom: -20px;
margin-left: -45px;
}
html .group-xl > * {
margin-bottom: 20px;
margin-left: 45px;
}
}
html .group-sm-justify .button {
padding-left: 20px;
padding-right: 20px;
}
@media (min-width: 768px) {
html .group-sm-justify {
display: flex;
align-items: center;
justify-content: center;
}
html .group-sm-justify > * {
flex-grow: 1;
flex-shrink: 0;
}
html .group-sm-justify .button {
min-width: 130px;
padding-left: 20px;
padding-right: 20px;
}
}
html .group-middle {
display: table;
vertical-align: middle;
}
html .group-middle > * {
vertical-align: middle;
}
* + .group {
margin-top: 30px;
}
* + .group-xs {
margin-top: 35px;
}
* + .group-sm {
margin-top: 30px;
}
* + .group-xl {
margin-top: 20px;
}
/*
|
||||
*
|
||||
* Responsive units
|
||||
*/
.unit {
display: flex;
flex: 0 1 100%;
margin-bottom: -30px;
margin-left: -20px;
}
.unit > * {
margin-bottom: 30px;
margin-left: 20px;
}
.unit:empty {
margin-bottom: 0;
margin-left: 0;
}
.unit-body {
flex: 0 1 auto;
}
.unit-left,
.unit-right {
flex: 0 0 auto;
max-width: 100%;
}
.unit-spacing-xs {
margin-bottom: -15px;
margin-left: -7px;
}
.unit-spacing-xs > * {
margin-bottom: 15px;
margin-left: 7px;
}
/*
|
||||
*
|
||||
* Lists
|
||||
*/
.list > li + li {
margin-top: 10px;
}
.list-xs > li + li {
margin-top: 8px;
}
.list-sm > li + li {
margin-top: 15px;
}
.list-md > li + li {
margin-top: 18px;
}
.list-lg > li + li {
margin-top: 25px;
}
.list-xl li + li {
margin-top: 30px;
}
@media (min-width: 1200px) {
.list-xl * + p {
margin-top: 18px;
}
}
@media (min-width: 1600px) {
.list-xl * + p {
margin-top: 24px;
}
}
@media (min-width: 768px) {
.list-xl > li + li {
margin-top: 60px;
}
}
@media (min-width: 1600px) {
.list-xl > li + li {
margin-top: 78px;
}
}
.list-inline > li {
display: inline-block;
}
html .list-inline-md {
transform: translate3d(0, -8px, 0);
margin-bottom: -8px;
margin-left: -10px;
margin-right: -10px;
}
html .list-inline-md > * {
margin-top: 8px;
padding-left: 10px;
padding-right: 10px;
}
@media (min-width: 992px) {
html .list-inline-md {
margin-left: -14px;
margin-right: -14px;
}
html .list-inline-md > * {
padding-left: 14px;
padding-right: 14px;
}
}
.list-terms dt {
font-size: 20px;
line-height: 1.3;
font-weight: 700;
letter-spacing: 0;
color: #495057;
}
.list-terms dt + dd {
margin-top: 8px;
}
.list-terms dd + dt {
margin-top: 25px;
}
* + .list-terms {
margin-top: 25px;
}
.list-terms + .privacy-link {
margin-top: 20px;
}
@media (min-width: 768px) {
.list-terms dt {
font-size: 24px;
}
.list-terms dd + dt {
margin-top: 40px;
}
}
@media (min-width: 992px) {
.list-terms dt + dd {
margin-top: 18px;
}
.list-terms dd + dt {
margin-top: 55px;
}
}
@media (min-width: 1200px) {
.list-terms dt {
max-width: 85%;
}
}
@media (min-width: 1600px) {
.list-terms dd + dt {
margin-top: 75px;
}
.list-terms + .privacy-link {
margin-top: 75px;
}
}
.index-list {
counter-reset: li;
}
.index-list > li .list-index-counter:before {
content: counter(li, decimal-leading-zero);
counter-increment: li;
}
.list-marked {
text-align: left;
}
.list-marked > li::before {
position: relative;
top: 1px;
display: inline-block;
min-width: 25px;
content: '\f14f';
font: 400 14px 'Material Design Icons';
line-height: inherit;
color: #aeb1be;
}
.list-marked > li + li {
margin-top: 9px;
}
* + .list-marked {
margin-top: 15px;
}
.list-ordered {
counter-reset: li;
text-align: left;
}
.list-ordered > li {
position: relative;
padding-left: 25px;
}
.list-ordered > li:before {
content: counter(li, decimal) ".";
counter-increment: li;
position: absolute;
top: 0;
left: 0;
display: inline-block;
width: 15px;
color: #aeb1be;
}
.list-ordered > li + li {
margin-top: 9px;
}
* + .list-ordered {
margin-top: 15px;
}
.list-nav {
transform: translate3d(0, -10px, 0);
margin-bottom: -10px;
margin-left: -10px;
margin-right: -10px;
font-family: "Poppins", sans-serif;
font-weight: 400;
font-size: .875em;
letter-spacing: .08em;
text-transform: uppercase;
color: #495057;
}
.list-nav > * {
margin-top: 10px;
padding-left: 10px;
padding-right: 10px;
}
.list-nav li {
display: inline-block;
vertical-align: middle;
}
.list-nav a {
color: inherit;
}
.list-nav a:hover {
color: #0045b6;
}
@media (min-width: 768px) {
.list-nav {
margin-left: -13px;
margin-right: -13px;
}
.list-nav > * {
padding-left: 13px;
padding-right: 13px;
}
}
@media (min-width: 992px) {
.list-nav {
margin-left: -28px;
margin-right: -28px;
}
.list-nav > * {
padding-left: 28px;
padding-right: 28px;
}
}
.context-dark .list-nav, .bg-gray-700 .list-nav, .bg-gray-800 .list-nav, .bg-primary .list-nav, .bg-primary-darker .list-nav {
color: #fff;
}
.context-dark .list-nav a:hover, .bg-gray-700 .list-nav a:hover, .bg-gray-800 .list-nav a:hover, .bg-primary .list-nav a:hover, .bg-primary-darker .list-nav a:hover {
color: #aeb1be;
}
.list-inline-bordered {
margin-left: -18px;
margin-right: -18px;
color: #495057;
}
.list-inline-bordered > * {
padding-left: 18px;
padding-right: 18px;
}
.list-inline-bordered * {
color: inherit;
}
.list-inline-bordered > li > button {
background: none;
border: none;
display: inline-block;
padding: 0;
outline: none;
outline-offset: 0;
cursor: pointer;
-webkit-appearance: none;
transition: .22s;
}
.list-inline-bordered > li > button::-moz-focus-inner {
border: none;
padding: 0;
}
.list-inline-bordered > li {
display: inline-block;
line-height: 24px;
}
.list-inline-bordered > li:not(:last-child) {
border-right: 1px solid #74757f;
}
.context-dark .list-inline-bordered, .bg-gray-700 .list-inline-bordered, .bg-gray-800 .list-inline-bordered, .bg-primary .list-inline-bordered, .bg-primary-darker .list-inline-bordered {
color: #fff;
}
.context-dark .list-inline-bordered button.active, .bg-gray-700 .list-inline-bordered button.active, .bg-gray-800 .list-inline-bordered button.active, .bg-primary .list-inline-bordered button.active, .bg-primary-darker .list-inline-bordered button.active,
.context-dark .list-inline-bordered button:hover,
.bg-gray-700 .list-inline-bordered button:hover,
.bg-gray-800 .list-inline-bLine truncated
|
||||
*
|
||||
* Images
|
||||
*/
img {
display: inline-block;
max-width: 100%;
height: auto;
}
.img-responsive {
width: 100%;
}
/*
|
||||
*
|
||||
* Icons
|
||||
*/
.icon {
display: inline-block;
font-size: 16px;
line-height: 1;
}
.icon::before {
position: relative;
display: inline-block;
font-weight: 400;
font-style: normal;
speak: none;
text-transform: none;
}
.icon-creative {
display: inline-block;
text-align: center;
width: 2em;
height: 2em;
line-height: 2em;
border-radius: 50%;
}
.icon-creative, .icon-creative:active, .icon-creative:focus {
color: #aeb1be;
}
.icon-creative::after {
content: '';
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: -1;
border-radius: inherit;
pointer-events: none;
opacity: 0;
transform: scale3d(0, 0, 0);
transition: .22s;
}
.icon-creative:hover {
color: #fff;
}
.icon-creative:hover::after {
opacity: 1;
transform: scale3d(1, 1, 1);
}
.icon-creative[class*='facebook']::after {
background: #2059a0;
}
.icon-creative[class*='twitter']::after {
background: #00aae6;
}
.icon-creative[class*='instagram']::after {
background: linear-gradient(to top, #f15823 0%, #a7058e 100%);
}
.icon-creative[class*='google']::after {
background: #ff3807;
}
.icon-creative[class*='linkedin']::after {
background: #2881a8;
}
.icon-modern {
width: 2em;
height: 2em;
line-height: 2em;
text-align: center;
border-radius: 50%;
border: 1px solid #e8e9ee;
color: #151515;
}
.icon-circle {
border-radius: 50%;
}
.icon-sm {
font-size: 20px;
}
.icon-md {
font-size: 1.5em;
}
.icon-lg {
font-size: 1.875em;
}
/*
|
||||
*
|
||||
* Tables custom
|
||||
*/
.table {
width: 100%;
max-width: 100%;
text-align: left;
background: #fff;
border-collapse: collapse;
}
.table th,
.table td {
color: #495057;
vertical-align: middle;
}
.table th {
padding: 13px 24px;
border-top: 0;
font-size: 16px;
font-weight: 300;
}
.table thead th {
border-bottom: 1px solid #aeb1be;
}
.table td {
padding: 23px 24px;
}
.table tbody tr:first-child td {
border-top: 0;
}
.table tr td {
border-bottom: 1px solid #e8e9ee;
}
.table tfoot td {
font-weight: 700;
}
* + .table-responsive {
margin-top: 30px;
}
@media (min-width: 768px) {
* + .table-responsive {
margin-top: 40px;
}
}
.table-hover tbody tr {
transition: .55s;
}
.table-hover tbody tr:hover {
background: #f5f6fa;
}
.table-job-positions th,
.table-job-positions td {
white-space: nowrap;
}
.table-job-positions td:first-child {
width: 8%;
padding-right: 6px;
text-align: center;
}
.table-job-positions .position {
color: #0045b6;
}
.table-job-positions time {
display: block;
white-space: nowrap;
}
@media (max-width: 575.98px) {
.table-job-positions th,
.table-job-positions td {
padding-left: 12px;
padding-right: 12px;
}
.table-job-positions td {
padding-top: 10px;
padding-bottom: 10px;
}
}
.table-responsive + .button-lg {
margin-top: 30px;
}
@media (min-width: 1200px) {
.table-responsive + .button-lg {
margin-top: 40px;
}
}
@media (min-width: 1600px) {
.table-responsive + .button-lg {
margin-top: 55px;
}
}
/*
|
||||
*
|
||||
* Dividers
|
||||
*/
hr {
margin-top: 0;
margin-bottom: 0;
border-top: 1px solid #e8e9ee;
}
.context-dark hr, .bg-gray-700 hr, .bg-gray-800 hr, .bg-primary hr, .bg-primary-darker hr {
border-top-color: #74757f;
}
.divider-small {
font-size: 0;
line-height: 0;
}
.divider-small::after {
content: '';
display: inline-block;
width: 70px;
height: 2px;
background-color: #0045b6;
}
.divider-small + h3, .divider-small + .heading-3,
.divider-small-outer + h3, .divider-small-outer + .heading-3 {
margin-top: 20px;
}
/*
|
||||
*
|
||||
* Buttons
|
||||
*/
.button {
position: relative;
overflow: hidden;
display: inline-block;
padding: 13px 35px;
font-size: 14px;
line-height: 1.25;
border: 2px solid;
border-radius: 6px;
font-family: "Poppins", sans-serif;
font-weight: 500;
letter-spacing: 0.1em;
text-transform: uppercase;
white-space: nowrap;
text-overflow: ellipsis;
text-align: center;
cursor: pointer;
vertical-align: middle;
user-select: none;
transition: 0.25s cubic-bezier(0.2, 1, 0.3, 1);
}
.form-btn {
display: block;
width: 100%;
height: 100%;
}
.button-block {
display: block;
width: 100%;
}
.button-default, .button-default:focus {
color: #aeb1be;
background-color: #495057;
border-color: #495057;
}
.button-default:hover, .button-default:active {
color: #fff;
background-color: #0045b6;
border-color: #0045b6;
}
.button.button-primary, .button.button-primary:focus {
color: #fff;
background-color: #0045b6;
border-color: #0045b6;
}
.button.button-primary:hover, .button.button-primary:active {
color: #fff;
background-color: #232426;
border-color: #232426;
}
html .button.button-primary-lighten, html .button.button-primary-lighten:focus {
color: #fff;
background-color: #0045b6;
border-color: #0045b6;
}
html .button.button-primary-lighten:hover, html .button.button-primary-lighten:active {
color: #fff;
background-color: #232426;
border-color: #232426;
}
.button-accent-outline, .button-accent-outline:focus {
color: #151515;
background-color: transparent;
border-color: #0045b6;
}
.button-accent-outline:hover, .button-accent-outline:active {
color: #fff;
background-color: #0045b6;
border-color: #0045b6;
}
.button-primary-outline, .button-primary-outline:focus {
color: #151515;
background-color: transparent;
border-color: #151515;
}
.button-primary-outline:hover, .button-primary-outline:active {
color: #fff;
background-color: #0045b6;
border-color: #0045b6;
}
.button-gray-bordered {
border-width: 1px;
}
.button-gray-bordered, .button-gray-bordered:focus {
color: #151515;
background-color: transparent;
border-color: #aeb1be;
}
.button-gray-bordered:hover, .button-gray-bordered:active {
color: #fff;
background-color: #0045b6;
border-color: #0045b6;
}
.button-primary-white, .button-primary-white:focus {
color: #111111;
background-color: #fff;
border-color: transparent;
}
.button-primary-white:hover, .button-primary-white:active {
color: #fff;
background-color: #0045b6;
border-color: #0045b6;
}
.button.button-facebook, .button.button-facebook:focus {
color: #fff;
background-color: #2059a0;
border-color: #2059a0;
}
.button.button-facebook:hover, .button.button-facebook:active {
color: #fff;
background-color: #2465b5;
border-color: #2465b5;
}
.button.button-twitter, .button.button-twitter:focus {
color: #fff;
background-color: #00aae6;
border-color: #00aae6;
}
.button.button-twitter:hover, .button.button-twitter:active {
color: #fff;
background-color: #01bdff;
border-color: #01bdff;
}
.button.button-google, .button.button-google:focus {
color: #fff;
background-color: #ff3807;
border-color: #ff3807;
}
.button.button-google:hover, .button.button-google:active {
color: #fff;
background-color: #ff4c21;
border-color: #ff4c21;
}
.button-winona {
position: relative;
overflow: hidden;
display: inline-block;
vertical-align: middle;
text-align: center;
}
.button-winona .content-original,
.button-winona .content-dubbed {
vertical-align: middle;
transition: transform 0.3s cubic-bezier(0.2, 1, 0.3, 1), opacity 0.3s cubic-bezier(0.2, 1, 0.3, 1);
}
.button-winona .content-original {
display: block;
}
.button-winona .content-dubbed {
position: absolute;
width: 100%;
top: 50%;
left: 0;
opacity: 0;
transform: translate3d(0, 0, 0);
}
.button-winona:hover .content-original {
opacity: 0;
transform: translate3d(0, -30%, 0);
}
.button-winona:hover .content-dubbed {
opacity: 1;
transform: translate3d(0, 0, 0) translateY(-50%);
}
.button-sm {
padding: 9px 32px;
font-size: 12px;
line-height: 1.5;
}
.button-lg {
padding: 14px 35px;
font-size: 15px;
line-height: 1.5;
}
@media (min-width: 576px) {
.button-lg {
font-size: 16px;
padding-left: 55px;
padding-right: 55px;
}
}
.button-lg--smaller {
padding-left: 35px;
padding-right: 35px;
}
html .button.button-icon {
display: inline-flex;
}
.button-icon {
justify-content: center;
align-items: center;
vertical-align: middle;
}
.button-icon .icon {
position: relative;
top: -1px;
display: inline-block;
vertical-align: middle;
color: inherit;
font-size: 1.55em;
line-height: 1em;
transition: none;
}
.button-icon:hover .icon {
color: inherit;
}
.button-icon-left .icon {
padding-right: 5px;
}
.button-icon-right {
flex-direction: row-reverse;
}
.button-icon-right .icon {
padding-left: 8px;
}
.button-icon.button-icon-only {
padding-left: 20px;
padding-right: 20px;
}
.button-icon.button-lg .icon {
padding-right: 8px;
}
.button-icon.button-lg.button-icon-right .icon {
padding: 0 0 0 8pxLine truncated
|
||||
*
|
||||
* Form styles
|
||||
*/
.rd-form {
position: relative;
text-align: left;
}
.rd-form .button {
min-height: 48px;
}
.rd-form .button-icon-only {
padding-top: 11px;
padding-bottom: 11px;
}
* + .rd-form {
margin-top: 20px;
}
input:-webkit-autofill ~ label,
input:-webkit-autofill ~ .form-validation {
color: #000 !important;
}
.form-wrap {
position: relative;
}
.form-wrap.has-error .form-input {
border-color: #dc0000;
}
.form-wrap.has-focus .form-input {
border-color: #0045b6;
}
* + .form-wrap {
margin-top: 24px;
}
.form-input {
display: block;
width: 100%;
min-height: 48px;
padding: 11px 19px;
font-size: 16px;
font-weight: 400;
line-height: 1.5;
color: #495057;
background-color: #fff;
background-image: none;
border-radius: 6px;
-webkit-appearance: none;
transition: .3s ease-in-out;
font-family: "Work Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
border: 1px solid #c5c6cd;
}
.form-input:focus {
outline: 0;
}
textarea.form-input {
height: 150px;
min-height: 48px;
max-height: 255px;
resize: vertical;
}
.form-label,
.form-label-outside {
margin-bottom: 0;
font-weight: 300;
}
.form-label {
position: absolute;
top: 24px;
left: 0;
right: 0;
padding-left: 19px;
padding-right: 19px;
font-size: 16px;
font-weight: 400;
line-height: 1.5;
color: #495057;
pointer-events: none;
text-align: left;
z-index: 9;
transition: .25s;
will-change: transform;
transform: translateY(-50%);
}
.form-label.focus {
opacity: 0;
}
.form-label.auto-fill {
color: #495057;
}
.form-label-outside {
width: 100%;
padding-right: 150px;
margin-bottom: 4px;
font-size: 14px;
color: #aeb1be;
cursor: pointer;
}
.form-label-outside ~ .form-validation {
top: 10px;
}
[data-x-mode='true'] .form-label {
pointer-events: auto;
}
.form-validation {
position: absolute;
right: 15px;
top: 0;
z-index: 11;
margin-top: 3px;
font-size: 10px;
font-weight: 500;
line-height: 12px;
letter-spacing: 0;
color: #dc0000;
transition: .3s;
transform: scale3d(1, 1, 1);
}
.form-validation:empty {
transform: scale3d(1, 0, 1);
}
.form-validation-left .form-validation {
top: 2px;
bottom: auto;
right: auto;
left: 14px;
}
#form-output-global {
position: fixed;
bottom: 30px;
left: 15px;
z-index: 2000;
visibility: hidden;
transform: translate3d(-500px, 0, 0);
transition: .3s all ease;
}
#form-output-global.active {
visibility: visible;
transform: translate3d(0, 0, 0);
}
@media (min-width: 576px) {
#form-output-global {
left: 30px;
}
}
.form-output {
position: absolute;
top: 100%;
left: 0;
font-size: 10px;
font-weight: 400;
line-height: 1.2;
margin-top: 2px;
transition: .3s;
opacity: 0;
visibility: hidden;
}
.form-output.active {
opacity: 1;
visibility: visible;
}
.form-output.error {
color: #dc0000;
}
.form-output.success {
color: #98bf44;
}
.radio .radio-custom,
.radio-inline .radio-custom,
.checkbox .checkbox-custom,
.checkbox-inline .checkbox-custom {
opacity: 0;
}
.radio .radio-custom, .radio .radio-custom-dummy,
.radio-inline .radio-custom,
.radio-inline .radio-custom-dummy,
.checkbox .checkbox-custom,
.checkbox .checkbox-custom-dummy,
.checkbox-inline .checkbox-custom,
.checkbox-inline .checkbox-custom-dummy {
position: absolute;
left: 0;
width: 14px;
height: 14px;
outline: none;
cursor: pointer;
}
.radio .radio-custom-dummy,
.radio-inline .radio-custom-dummy,
.checkbox .checkbox-custom-dummy,
.checkbox-inline .checkbox-custom-dummy {
pointer-events: none;
background: #fff;
}
.radio .radio-custom-dummy::after,
.radio-inline .radio-custom-dummy::after,
.checkbox .checkbox-custom-dummy::after,
.checkbox-inline .checkbox-custom-dummy::after {
position: absolute;
opacity: 0;
transition: .22s;
}
.radio .radio-custom:focus,
.radio-inline .radio-custom:focus,
.checkbox .checkbox-custom:focus,
.checkbox-inline .checkbox-custom:focus {
outline: none;
}
.radio input,
.radio-inline input,
.checkbox input,
.checkbox-inline input {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
clip-path: inset(50%);
border: 0;
}
.radio-custom:checked + .radio-custom-dummy:after,
.checkbox-custom:checked + .checkbox-custom-dummy:after {
opacity: 1;
}
.radio,
.radio-inline {
padding-left: 28px;
}
.radio .radio-custom-dummy,
.radio-inline .radio-custom-dummy {
top: 1px;
left: 0;
width: 18px;
height: 18px;
border-radius: 50%;
border: 1px solid #74757f;
}
.radio .radio-custom-dummy::after,
.radio-inline .radio-custom-dummy::after {
content: '';
top: 3px;
right: 3px;
bottom: 3px;
left: 3px;
background: #495057;
border-radius: inherit;
}
.checkbox,
.checkbox-inline {
padding-left: 28px;
}
.checkbox .checkbox-custom-dummy,
.checkbox-inline .checkbox-custom-dummy {
left: 0;
width: 18px;
height: 18px;
margin: 0;
border: 1px solid #74757f;
}
.checkbox .checkbox-custom-dummy::after,
.checkbox-inline .checkbox-custom-dummy::after {
contentLine truncated
|
||||
*
|
||||
* Posts
|
||||
*/
.post-inline {
max-width: 313px;
}
.post-inline-title a {
color: inherit;
}
.post-inline-meta {
transform: translate3d(0, -5px, 0);
margin-bottom: -5px;
margin-left: -10px;
margin-right: -10px;
color: rgba(255, 255, 255, 0.3);
}
.post-inline-meta > * {
margin-top: 5px;
padding-left: 10px;
padding-right: 10px;
}
.post-inline-meta > li {
position: relative;
display: inline-block;
}
.post-inline-meta > li:not(:last-child)::after {
content: '';
position: absolute;
right: 0;
top: 50%;
width: 1px;
height: 1px;
border-radius: 50%;
background: #495057;
}
.post-inline-meta a {
color: inherit;
}
* + .post-inline {
margin-top: 15px;
}
* + .post-inline-meta {
margin-top: 5px;
}
@media (min-width: 768px) {
* + .post-inline {
margin-top: 22px;
}
}
.context-dark .post-inline-title, .bg-gray-700 .post-inline-title, .bg-gray-800 .post-inline-title, .bg-primary .post-inline-title, .bg-primary-darker .post-inline-title {
color: #fff;
}
.context-dark .post-inline-title a:hover, .bg-gray-700 .post-inline-title a:hover, .bg-gray-800 .post-inline-title a:hover, .bg-primary .post-inline-title a:hover, .bg-primary-darker .post-inline-title a:hover {
color: #aeb1be;
}
.context-dark .post-inline-meta > li:not(:last-child)::after, .bg-gray-700 .post-inline-meta > li:not(:last-child)::after, .bg-gray-800 .post-inline-meta > li:not(:last-child)::after, .bg-primary .post-inline-meta > li:not(:last-child)::after, .bg-primary-darker .post-inline-meta > li:not(:last-child)::after {
background: #aeb1be;
}
.context-dark .post-inline-meta a:hover, .bg-gray-700 .post-inline-meta a:hover, .bg-gray-800 .post-inline-meta a:hover, .bg-primary .post-inline-meta a:hover, .bg-primary-darker .post-inline-meta a:hover {
color: #fff;
}
.post-classic {
text-align: left;
}
.post-classic-media {
position: relative;
display: block;
}
.post-classic-media::before {
content: '';
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: rgba(73, 80, 87, 0.4);
transition: .4s ease-in-out;
opacity: 0;
visibility: hidden;
pointer-events: none;
}
.post-classic-media img {
width: 100%;
}
.post-classic-media:hover::before {
opacity: 1;
visibility: visible;
}
.post-classic-meta {
transform: translate3d(0, -3px, 0);
margin-bottom: -3px;
margin-left: -14px;
margin-right: -14px;
color: #aeb1be;
}
.post-classic-meta > * {
margin-top: 3px;
padding-left: 14px;
padding-right: 14px;
}
.post-classic-meta > li {
position: relative;
display: inline-block;
}
.post-classic-meta > li:not(:last-child)::after {
content: '';
position: absolute;
right: 0;
top: 50%;
width: 2px;
height: 2px;
background: #aeb1be;
transform: translate3d(0, -50%, 0);
}
.post-classic-meta a:hover {
color: #343db0;
}
* + .post-classic-meta {
margin-top: 15px;
}
* + .post-classic-title {
margin-top: 9px;
}
@media (max-width: 575.98px) {
.post-classic {
max-width: 360px;
margin-left: auto;
margin-right: auto;
}
}
@media (min-width: 576px) and (max-width: 767.98px) {
.post-classic-title {
font-size: 17px;
}
}
@media (min-width: 768px) {
.post-classic-meta {
transform: translate3d(0, -5px, 0);
margin-bottom: -5px;
margin-left: -20px;
margin-right: -20px;
}
.post-classic-meta > * {
margin-top: 5px;
padding-left: 20px;
padding-right: 20px;
}
* + .post-classic-meta {
margin-top: 25px;
}
}
@media (min-width: 992px) and (max-width: 1199.98px) {
.post-classic-meta {
margin-left: -15px;
margin-right: -15px;
font-size: 14px;
}
.post-classic-meta > * {
padding-left: 15px;
padding-right: 15px;
}
}
.post-modern {
text-align: left;
}
.post-modern-title {
color: #151515;
font-weight: 400;
}
.post-modern-title a:hover {
color: #0045b6;
}
.post-modern-media {
position: relative;
display: block;
}
.post-modern-media::before {
content: '';
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: rgba(73, 80, 87, 0.4);
transition: .22s ease-in-out;
opacity: 0;
visibility: hidden;
pointer-events: none;
}
.post-modern-media img {
width: 100%;
}
.post-modern-media:hover::before {
opacity: 1;
visibility: visible;
}
.post-modern-meta {
transform: translate3d(0, -5px, 0);
margin-bottom: -5px;
margin-left: -15px;
margin-right: -15px;
color: #495057;
font-weight: 500;
}
.post-modern-meta > * {
margin-top: 5px;
padding-left: 15px;
padding-right: 15px;
}
.post-modern-meta > li {
position: relative;
display: inline-block;
line-height: 24px;
font-size: 18px;
}
.post-modern-meta > li:not(:last-child)::after {
content: '';
position: absolute;
right: 0;
top: 50%;
width: 1px;
height: 1.5em;
background: #e8e9ee;
transform: translate3d(0, -50%, 0);
}
.post-modern-meta a:hover {
color: #343db0;
}
.post-modern-meta + p {
color: #151515;
}
* + .post-modern-title {
margin-top: 9px;
}
* + .post-modern-meta {
margin-top: 10px;
}
@media (max-width: 575.98px) {
.post-modern {
max-width: 430px;
margin-left: auto;
marginLine truncated
|
||||
*
|
||||
* Quotes
|
||||
*/
.quote-light-mark {
fill: #aeb1be;
}
.quote-light-cite {
font-size: 20px;
color: #0045b6;
}
.quote-light-caption {
line-height: 1.2;
}
.quote-light-text {
font-size: 16px;
line-height: 1.5;
letter-spacing: 0;
color: #495057;
}
html img.quote-light-image {
display: inline-block;
}
* + .quote-light {
margin-top: 30px;
}
* + .quote-light-caption {
margin-top: 3px;
}
* + .quote-light-mark {
margin-top: 15px;
}
* + .quote-light-text {
margin-top: 8px;
}
* + .quote-light-footer {
margin-top: 20px;
}
@media (min-width: 576px) {
.quote-light-cite {
font-size: 20px;
}
}
@media (min-width: 768px) {
.quote-light-cite {
font-size: 24px;
}
.quote-light-text {
font-size: 21px;
line-height: 1.45;
}
* + .quote-light {
margin-top: 40px;
}
* + .quote-light-mark {
margin-top: 35px;
}
* + .quote-light-text {
margin-top: 15px;
}
* + .quote-light-footer {
margin-top: 30px;
}
}
@media (min-width: 1600px) {
.quote-light-text {
font-size: 24px;
line-height: 1.33333;
}
* + .quote-light {
margin-top: 50px;
}
* + .quote-light-mark {
margin-top: 50px;
}
* + .quote-light-footer {
margin-top: 45px;
}
}
.quote-classic {
text-align: left;
}
.quote-classic-meta {
display: flex;
align-items: center;
flex-wrap: wrap;
margin-bottom: -20px;
margin-left: -20px;
}
.quote-classic-meta:empty {
margin-bottom: 0;
margin-left: 0;
}
.quote-classic-meta > * {
display: inline-block;
margin: 0 0 20px 20px;
}
.quote-classic-avatar {
position: relative;
overflow: hidden;
width: 50px;
height: 50px;
border-radius: 50%;
flex-shrink: 0;
}
.quote-classic-avatar img {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
min-height: 100%;
min-width: 100%;
width: auto;
height: auto;
max-width: none;
}
@supports (object-fit: cover) {
.quote-classic-avatar img {
left: 0;
top: 0;
width: 100%;
height: 100%;
transform: none;
object-fit: cover;
object-position: center center;
}
}
.quote-classic-cite {
font-size: 24px;
line-height: 1.2;
color: #151515;
font-family: "Poppins", sans-serif;
}
.quote-classic-caption {
color: #151515;
}
* + .quote-classic-text {
margin-top: 25px;
}
* + .quote-classic-caption {
margin-top: 0;
}
@media (max-width: 575.98px) {
.quote-classic {
margin-left: auto;
margin-right: auto;
}
}
.quote-modern {
text-align: left;
}
.quote-modern-meta {
display: flex;
align-items: center;
flex-wrap: wrap;
margin-bottom: -20px;
margin-left: -20px;
}
.quote-modern-meta:empty {
margin-bottom: 0;
margin-left: 0;
}
.quote-modern-meta > * {
display: inline-block;
margin: 0 0 20px 20px;
}
.quote-modern-avatar {
position: relative;
overflow: hidden;
z-index: 2;
width: 50px;
height: 50px;
border-radius: 50%;
flex-shrink: 0;
}
.quote-modern-avatar img {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
min-height: 100%;
min-width: 100%;
width: auto;
height: auto;
max-width: none;
}
@supports (object-fit: cover) {
.quote-modern-avatar img {
left: 0;
top: 0;
width: 100%;
height: 100%;
transform: none;
object-fit: cover;
object-position: center center;
}
}
.quote-modern-cite {
font-size: 20px;
line-height: 1.2;
color: #0045b6;
}
.quote-modern-caption {
color: #aeb1be;
}
.quote-modern-mark {
fill: #aeb1be;
}
* + .quote-modern-meta {
margin-top: 25px;
}
* + .quote-modern-caption {
margin-top: 0;
}
* + .quote-modern-text {
margin-top: 10px;
}
.quote-modern-big .quote-modern-text {
font-size: 18px;
line-height: 1.5;
color: #495057;
}
@media (min-width: 992px) {
.quote-modern-big .quote-modern-text {
font-size: 20px;
}
}
@media (min-width: 1200px) {
.quote-modern-big .quote-modern-text {
font-size: 24px;
line-height: 1.33333;
}
.quote-modern-big * + .quote-modern-text {
margin-top: 20px;
}
}
/*
|
||||
*
|
||||
* Thumbnails
|
||||
*/
.video-overlay {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-position: center center;
background-size: cover;
cursor: pointer;
}
.figure-light figcaption {
padding-top: 15px;
color: #74757f;
}
* + .figure-light {
margin-top: 20px;
}
@media (min-width: 1200px) {
* + .figure-light {
margin-top: 40px;
}
}
.figure-card {
position: relative;
overflow: hidden;
display: flex;
}
.figure-card .figure-card-sizer {
display: block;
width: 100%;
}
.figure-card .figure-card-sizer::before {
display: block;
content: '';
visibility: hidden;
padding-bottom: 56.25%;
}
.figure-card img {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
min-height: 100%;
min-width: 100%;
width: auto;
height: auto;
max-width: none;
}
@supports (object-fit: cover) {
.figure-card img {
height: 100%;
width: 100%;
left: 0;
top: 0;
transform: none;
object-fit: cover;
object-position: center center;
}
}
.thumbnail-video-1 {
position: relative;
text-align: center;
}
.thumbnail-video-1 .embed-responsive::before {
min-height: 250px;
}
.thumbnail-video-1 .video-overlay {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 20px;
z-index: 1;
background-position: 80% center;
}
.thumbnail-video-1 .video-overlay::after {
content: '';
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: rgba(0, 0, 0, 0.4);
z-index: -1;
}
.thumbnail-video-1 * + .button-video {
margin-top: 25px;
}
.thumbnail-minimal {
position: relative;
overflow: hidden;
display: block;
}
.thumbnail-minimal::before {
content: '';
display: block;
padding-bottom: 100%;
}
.thumbnail-minimal-image {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
min-height: 100%;
min-width: 100%;
width: auto;
height: auto;
max-width: none;
}
@supports (object-fit: cover) {
.thumbnail-minimal-image {
left: 0;
top: 0;
width: 100%;
height: 100%;
transform: none;
object-fit: cover;
object-position: center center;
}
}
.thumbnail-minimal-caption {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1;
background: rgba(0, 69, 182, 0.6);
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
visibility: hidden;
transition: all 0.3s ease-in-out;
}
.thumbnail-minimal-caption::before {
content: '\f504';
font-family: 'Material Design Icons';
font-size: 30px;
line-height: 1;
color: #fff;
}
.thumbnail-minimal:hover .thumbnail-minimal-caption {
opacity: 1;
visibility: visible;
}
.thumbnail-classic {
position: relative;
overflow: hidden;
display: flex;
text-align: left;
}
.thumbnail-classic * {
color: inherit;
}
.thumbnail-classic, .thumbnail-classic:active, .thumbnail-classic:focus, .thumbnail-classic:hover {
color: #fff;
}
.thumbnail-classic:hover {
color: #fff;
}
.thumbnail-classic > * {
width: 100%;
flex-shrink: 0;
}
.thumbnail-classic-sm .thumbnail-classic-dummy::before {
padding-bottom: 69.18919%;
}
.thumbnail-classic-dummy {
width: 100%;
}
.thumbnail-classic-dummy::before {
content: '';
display: block;
visibility: hidden;
pointer-events: none;
padding-bottom: 73.84615%;
}
.thumbnail-classic-image {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
min-height: 100%;
min-width: 100%;
width: auto;
height: auto;
max-width: none;
}
@supports (object-fit: cover) {
.thumbnail-classic-image {
left: 0;
top: 0;
width: 100%;
height: 100%;
transform: none;
object-fit: cover;
object-position: center center;
}
}
.thumbnail-classic-caption {
position: relative;
z-index: 1;
display: flex;
flex-direction: column;
justify-content: flex-end;
width: 100%;
padding: 20px;
background: rgba(73, 80, 87, 0.4);
font-size: 14px;
}
.thumbnail-classic-caption * + p {
margin-top: 5px;
}
.thumbnail-classic-title {
font-size: 20px;
line-height: 1.3;
}
@media (max-width: 575.98px) {
.thumbnail-classic {
max-width: 360px;
margin-left: auto;
margin-right: auto;
}
}
@media (min-width: 768px) {
.thumbnail-classic-caption {
padding: 25px 20px;
}
}
@media (min-width: 992px) {
.thumbnail-classic-lg .thumbnail-classic-dummy::before {
padding-bottom: 147.69231%;
}
}
@media (min-width: 1200px) {
.thumbnail-classic-caption {
padding: 30px 40px;
font-size: 16px;
}
.thumbnail-classic-caption * + p {
margin-top: 8px;
}
.thumbnail-classic-title {
font-size: 24px;
}
}
html:not(.tablet):not(.mobile) .thumbnail-classic-caption {
opacity: 0;
visibility: hidden;
transition: .3s all linear;
background: rgba(73, 80, 87, 0.6);
}
html:not(.tablet):not(.mobile) .thumbnail-classic:hover .thumbnail-classic-caption {
opacity: 1;
visibility: visible;
}
html:not(.tablet):not(.mobile) .hoverdir-item .thumbnail-classic-caption {
opacity: 1;
visibility: visible;
transform: translate(-100%, 0);
}
html:not(.tablet):not(.mobile)[data-x-mode='true'] .Line truncated
|
||||
*
|
||||
* Breadcrumbs
|
||||
*/
.breadcrumbs-custom {
position: relative;
display: flex;
background-color: #495057;
background-position: 20% 20%;
}
.breadcrumbs-custom .breadcrumbs-custom-subtitle {
color: #aeb1be;
}
@media (min-width: 576px) {
.breadcrumbs-custom {
padding: 60px 0;
}
}
@media (min-width: 1200px) {
.breadcrumbs-custom {
padding: 0;
}
}
.breadcrumbs-custom-inner {
display: flex;
min-height: inherit;
width: 100%;
padding: 50px 0 25px;
}
.breadcrumbs-custom-container {
display: flex;
flex-direction: column;
justify-content: space-between;
}
.breadcrumbs-custom-container::before {
content: '';
display: block;
}
.breadcrumbs-custom-path {
margin-left: -15px;
margin-right: -15px;
}
.breadcrumbs-custom-path > * {
padding-left: 15px;
padding-right: 15px;
}
.breadcrumbs-custom-path li {
position: relative;
display: inline-block;
vertical-align: middle;
color: #aeb1be;
}
.breadcrumbs-custom-path li::after {
content: "";
font-family: "FontAwesome";
position: absolute;
top: 51%;
right: -5px;
display: inline-block;
font-size: inherit;
font-style: normal;
color: rgba(255, 255, 255, 0.5);
transform: translate3d(0, -50%, 0);
}
.breadcrumbs-custom-path li:last-child:after {
display: none;
}
.breadcrumbs-custom-path a {
display: inline;
vertical-align: middle;
}
.breadcrumbs-custom-path a, .breadcrumbs-custom-path a:active, .breadcrumbs-custom-path a:focus {
color: #aeb1be;
}
.breadcrumbs-custom-path a:hover {
color: #fff;
}
* + .breadcrumbs-custom-path {
margin-top: 25px;
}
.breadcrumbs-custom-subtitle + .breadcrumbs-custom-title {
margin-top: 15px;
}
@media (min-width: 576px) {
.breadcrumbs-custom-path {
margin-left: -30px;
margin-right: -30px;
}
.breadcrumbs-custom-path > * {
padding-left: 30px;
padding-right: 30px;
}
* + .breadcrumbs-custom-path {
margin-top: 30px;
}
}
@media (min-width: 768px) {
.breadcrumbs-custom {
min-height: 23.75vw;
}
.breadcrumbs-custom-inner {
padding: 80px 0 30px;
}
.breadcrumbs-custom-subtitle + .breadcrumbs-custom-title {
margin-top: 5px;
}
}
@media (min-width: 992px) {
.breadcrumbs-custom-inner {
padding-bottom: 40px;
}
.breadcrumbs-custom-subtitle + .breadcrumbs-custom-title {
margin-top: 10px;
}
}
@media (min-width: 1600px) {
.breadcrumbs-custom {
min-height: 520px;
}
.breadcrumbs-custom-inner {
padding: 130px 0 40px 0;
}
.breadcrumbs-custom-subtitle + .breadcrumbs-custom-title {
margin-top: 20px;
}
}
/*
|
||||
*
|
||||
* Pagination custom
|
||||
*/
.pagination {
font-size: 0;
line-height: 0;
margin-bottom: -10px;
margin-left: -10px;
}
.pagination:empty {
margin-bottom: 0;
margin-left: 0;
}
.pagination > * {
display: inline-block;
margin: 0 0 10px 10px;
}
.page-item {
display: inline-block;
vertical-align: middle;
text-align: center;
font-weight: 700;
}
.page-link {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 48px;
min-height: 48px;
padding: 10px 10px;
border: 0;
border-radius: 6px;
font-family: "Poppins", sans-serif;
font-size: 14px;
font-weight: 500;
line-height: 1.71429;
background-color: #0045b6;
color: #fff;
transition: all 0.3s ease-in-out;
}
.page-link.button-winona * {
line-height: inherit;
}
.page-link.button-winona .content-dubbed {
margin-top: -1px;
}
.page-link:hover, .page-link:focus, .page-link:active {
color: #fff;
background-color: #151515;
}
.page-item.active > .page-link, .page-item.active > .page-link:hover, .page-item.active > .page-link:focus, .page-item.active > .page-link:active {
color: #fff;
background-color: #151515;
}
.page-item.disabled > .page-link, .page-item.disabled > .page-link:hover, .page-item.disabled > .page-link:focus, .page-item.disabled > .page-link:active {
color: #74757f;
background-color: #e8e9ee;
}
.page-item-control .icon::before {
font-family: 'FontAwesome';
font-size: 11px;
line-height: 24px;
}
.page-item-control:first-child .icon::before {
content: '\f053';
margin-left: -1px;
}
.page-item-control:last-child .icon::before {
content: '\f054';
margin-right: -1px;
}
* + .pagination {
margin-top: 35px;
}
@media (min-width: 992px) {
* + .pagination {
margin-top: 55px;
}
}
@media (min-width: 1600px) {
* + .pagination {
margin-top: 70px;
}
}
/*
|
||||
*
|
||||
* Snackbars
|
||||
*/
.snackbars {
padding: 9px 16px;
margin-left: auto;
margin-right: auto;
color: #fff;
text-align: left;
background-color: #0045b6;
box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.15);
border-radius: 6px;
font-size: 14px;
}
.snackbars .icon-xxs {
font-size: 18px;
}
.snackbars p span:last-child {
padding-left: 14px;
}
.snackbars-left {
display: inline-block;
margin-bottom: 0;
}
.snackbars-right {
display: inline-block;
float: right;
text-transform: uppercase;
}
.snackbars-right:hover {
text-decoration: underline;
}
@media (min-width: 576px) {
.snackbars {
max-width: 540px;
padding: 12px 15px;
font-size: 15px;
}
}
/*
|
||||
*
|
||||
* Footers
|
||||
*/
.footer-standard h4 + *,
.footer-standard .heading-4 + * {
margin-top: 14px;
}
.footer-standard-main {
padding: 35px 0 15px;
}
.footer-standard-aside {
padding: 30px 0;
}
.footer-standard-aside {
margin-bottom: -18px;
text-align: center;
}
.footer-standard-aside > * {
margin-bottom: 18px;
}
.footer-standard-aside > * {
margin-top: 0;
}
@media (max-width: 575.98px) {
.footer-standard .box-1 {
margin-left: 0;
}
}
@media (min-width: 768px) and (max-width: 991.98px) {
.footer-standard .box-1 {
margin-left: 0;
}
}
@media (min-width: 768px) {
.footer-standard h4 + *,
.footer-standard .heading-4 + * {
margin-top: 25px;
}
.footer-standard-main {
padding: 55px 0 20px;
}
.footer-standard-aside {
display: flex;
align-items: center;
flex-wrap: wrap;
justify-content: space-between;
text-align: center;
margin-left: -20px;
}
.footer-standard-aside > * {
margin-left: 20px;
}
}
@media (min-width: 1200px) {
.footer-standard-main {
padding: 80px 0 50px;
}
}
.footer-minimal {
padding: 30px 0;
}
.footer-minimal-inner {
margin-bottom: -18px;
text-align: center;
}
.footer-minimal-inner > * {
margin-bottom: 18px;
}
.footer-minimal-inner > * {
margin-top: 0;
}
.footer-minimal-inner .rights a {
padding-bottom: 2px;
position: relative;
}
.footer-minimal-inner .rights a:before {
content: '';
position: absolute;
left: 0;
height: 1px;
bottom: 0;
width: 0;
display: block;
transition: all ease .35s;
background-color: #fff;
}
.footer-minimal-inner .rights a:hover {
color: #fff;
}
.footer-minimal-inner .rights a:hover:before {
content: '';
width: 100%;
transition: all ease .35s;
}
@media (min-width: 768px) {
.footer-minimal-inner {
display: flex;
align-items: center;
flex-wrap: wrap;
justify-content: space-between;
text-align: center;
margin-left: -20px;
}
.footer-minimal-inner > * {
margin-left: 20px;
}
}
.footer-advanced.bg-gray-700 h1, .footer-advanced.bg-gray-700 h2, .footer-advanced.bg-gray-700 h3, .footer-advanced.bg-gray-700 h4, .footer-advanced.bg-gray-700 h5, .footer-advanced.bg-gray-700 h6, .footer-advanced.bg-gray-700 [class^='heading-'] {
color: #aeb1be;
}
.footer-advanced h4 + *,
.footer-advanced .heading-4 + * {
margin-top: 14px;
}
.footer-advanced-main {
padding: 35px 0 15px;
}
.footer-advanced-aside {
padding: 30px 0;
}
.footer-advanced-layout {
margin-bottom: -18px;
text-align: center;
}
.footer-advanced-layout > * {
margin-bottom: 18px;
}
.footer-advanced-layout > * {
margin-top: 0;
}
@media (min-width: 768px) and (max-width: 991.98px) {
.footer-advanced .box-1 {
margin-left: 0;
}
}
@media (min-width: 992px) and (max-width: 1199.98px) {
.footer-advanced-text {
font-size: 14px;
line-height: 1.7;
}
}
.footer-advanced-text {
color: rgba(255, 255, 255, 0.3);
}
@media (min-width: 768px) {
.footer-advanced-main {
padding: 55px 0 20px;
}
.footer-advanced-aside {
padding: 35px 0;
}
.footer-advanced-layout {
display: flex;
align-items: center;
flex-wrap: wrap;
justify-content: space-between;
text-align: center;
margin-left: -20px;
}
.footer-advanced-layout > * {
margin-left: 20px;
}
.footer-advanced-aside + .container {
margin-top: 10px;
}
}
@media (min-width: 1200px) {
.footer-advanced h4 + *,
.footer-advanced .heading-4 + * {
margin-top: 35px;
}
.footer-advanced-main {
padding: 80px 0 60px;
}
.footer-advanced-aside + .container {
margin-top: 20px;
}
}
.footer-linked.bg-gray-700 h1, .footer-linked.bg-gray-700 h2, .footer-linked.bg-gray-700 h3, .footer-linked.bg-gray-700 h4, .footer-linked.bg-gray-700 h5, .footer-linked.bg-gray-700 h6, .footer-linked.bg-gray-700 [class^='heading-'] {
color: #aeb1be;
}
.footer-linked.bg-gray-700 .list {
color: #fff;
}
.footer-linked.bg-gray-700 .list a:hover {
color: rgba(255, 255, 255, 0.6);
}
.footer-linked h4 + *,
.footer-linked .heading-4 + * {
margin-top: 14px;
}
.footer-linked h4 + hr,
.footer-linked .heading-4 + hr {
margin-top: 15px;
}
.footer-linked * + .row {
margin-top: 25px;
}
.footer-linked-main {
padding: 35px 0 15px;
}
.footer-linked-aside {
padding: 30px 0;
}
.footer-linked-layout {
margin-bottom: -18px;
text-align: center;
}
.footer-linked-layout > * {
margin-bottom: 18px;
}
.footer-linked-layout > * {
margin-top: 0;
}
@media (min-width: 768px) and (max-width: 991.98px) {
.footer-linked .box-1 {
margin-left: 0;
}
}
@media (min-width: 992px) and (max-width: 1199.98px) {
.footer-linked-text {
font-size: 14px;
line-height: 1.7;
}
}
@media (min-width: 768px) {
.footer-linked-main {
padding: 65px 0 40px;
}
.footer-linked-aside {
padding: 30px 0;
}
.footer-linked-layout {
display: flex;
align-items: center;
flex-wrap: wrap;
justify-content: space-between;
text-align: center;
margin-left: -20px;
}
.footer-linked-layout > * {
margin-left: 20px;
}
.footer-linked-aside + .container {
margin-top: 10px;
}
}
@media (min-width: 1200px) {
.footer-linked Line truncated
|
||||
*
|
||||
* Pricing tables
|
||||
*/
.pricing-minimal {
position: relative;
z-index: 1;
padding: 25px 20px;
border: 1px solid #aeb1be;
border-radius: 6px;
text-align: left;
transition: .22s;
cursor: default;
}
.pricing-minimal:hover {
border-color: #0045b6;
}
.pricing-minimal:hover::before {
visibility: visible;
transform: translate3d(0, 0, 0);
}
.pricing-minimal-price {
font-size: 26px;
line-height: 1;
font-weight: 700;
letter-spacing: 0;
color: #495057;
}
.pricing-minimal-price span {
display: inline;
}
.pricing-minimal-price-currency {
font-size: .65em;
vertical-align: top;
}
.pricing-minimal-divider {
border-bottom: 1px solid #aeb1be;
}
* + .pricing-minimal-price {
margin-top: 10px;
}
* + .pricing-minimal-divider {
margin-top: 20px;
}
@media (max-width: 575.98px) {
.pricing-minimal {
max-width: 350px;
margin-left: auto;
margin-right: auto;
}
}
@media (min-width: 576px) {
.pricing-minimal {
padding: 20px;
}
}
@media (min-width: 768px) {
.pricing-minimal-price {
font-size: 36px;
}
}
@media (min-width: 768px) {
.pricing-minimal {
padding: 30px 38px;
}
}
@media (min-width: 992px) and (max-width: 1199.98px) {
.pricing-minimal {
padding: 25px 20px;
}
}
@media (min-width: 1200px) {
.pricing-minimal {
padding: 38px 40px;
}
}
.pricing-modern {
padding: 35px 20px;
border: 1px solid #aeb1be;
border-radius: 6px;
text-align: center;
}
.pricing-modern * + .button {
margin-top: 20px;
}
.pricing-group-modern {
border: 1px solid #aeb1be;
border-radius: 6px;
}
.pricing-group-modern .pricing-modern {
border: 0;
border-radius: 0;
}
.pricing-modern-rating {
color: #0045b6;
}
.pricing-modern-rating > li {
display: inline-block;
width: 26px;
font-size: 30px;
line-height: .9;
}
.pricing-modern-title {
font-weight: 700;
}
.pricing-modern-table {
display: inline-table;
}
.pricing-modern-table td {
padding: 3px 8px;
color: #74757f;
}
.pricing-modern-table td:first-child {
text-align: right;
color: #495057;
}
.pricing-modern-table td:last-child {
text-align: left;
}
.pricing-modern-price {
font-size: 24px;
font-weight: 300;
line-height: 1.2;
}
.pricing-modern-price span {
display: inline;
}
.pricing-modern-price-currency {
font-size: .65em;
vertical-align: top;
}
* + .pricing-group-modern {
margin-top: 35px;
}
* + .pricing-modern-title {
margin-top: 5px;
}
* + .pricing-modern-table {
margin-top: 20px;
}
* + .pricing-modern-price {
margin-top: 15px;
}
@media (max-width: 575.98px) {
.pricing-group-modern {
max-width: 360px;
margin-left: auto;
margin-right: auto;
}
.pricing-group-modern .pricing-modern + .pricing-modern {
border-top: 1px solid #aeb1be;
}
}
@media (min-width: 576px) and (max-width: 991.98px) {
.pricing-group-modern .pricing-modern:nth-child(odd) {
border-right: 1px solid #aeb1be;
}
.pricing-group-modern .pricing-modern:nth-child(n + 3) {
border-top: 1px solid #aeb1be;
}
}
@media (min-width: 576px) {
.pricing-group-modern {
display: flex;
flex-wrap: wrap;
}
.pricing-group-modern .pricing-modern {
width: 100%;
max-width: 50%;
}
.pricing-modern {
padding: 55px 20px;
}
* + .pricing-group-modern {
margin-top: 50px;
}
* + .pricing-modern-table {
margin-top: 25px;
}
* + .pricing-modern-price {
margin-top: 30px;
}
}
@media (min-width: 768px) {
.pricing-modern-price {
font-size: 30px;
}
}
@media (min-width: 992px) {
.pricing-group-modern .pricing-modern {
max-width: 25%;
border-right: 1px solid #aeb1be;
}
.pricing-group-modern .pricing-modern:nth-child(4n) {
border-right: 0;
}
.pricing-group-modern .pricing-modern:nth-child(n + 5) {
border-top: 1px solid #aeb1be;
}
}
@media (min-width: 992px) and (max-width: 1199.98px) {
.pricing-modern .button {
display: block;
padding-left: 15px;
padding-right: 15px;
}
}
@media (min-width: 1200px) {
.pricing-modern-price {
font-size: 36px;
}
* + .pricing-modern-table {
margin-top: 35px;
}
* + .pricing-modern-price {
margin-top: 40px;
}
}
@media (min-width: 1600px) {
* + .pricing-group-modern {
margin-top: 75px;
}
}
/*
|
||||
*
|
||||
* Profiles
|
||||
*/
.profile-classic {
text-align: left;
}
.profile-classic-main {
position: relative;
overflow: hidden;
z-index: 1;
border-radius: 6px;
}
.profile-classic-image {
min-width: 100%;
}
.profile-classic-caption {
position: absolute;
left: 0;
right: 0;
bottom: 0;
padding: 10px;
background: rgba(0, 69, 182, 0.6);
}
.profile-classic-caption .icon-creative {
color: #fff;
}
.profile-classic-title {
color: #0045b6;
}
.profile-classic-title a:hover {
color: #343db0;
}
.profile-classic-position {
color: #aeb1be;
}
* + .profile-classic-title {
margin-top: 15px;
}
* + .profile-classic-position {
margin-top: 5px;
}
@media (max-width: 575.98px) {
.profile-classic {
max-width: 360px;
margin-left: auto;
margin-right: auto;
}
}
@media (min-width: 576px) and (max-width: 767.98px) {
.profile-classic-caption {
padding-left: 5px;
padding-right: 5px;
}
.profile-classic-caption .icon-sm {
font-size: 18px;
}
.profile-classic-caption .group {
margin-left: -3px;
}
.profile-classic-caption .group > * {
margin-left: 3px;
}
}
@media (min-width: 992px) and (max-width: 1199.98px) {
.profile-classic-caption {
padding-left: 5px;
padding-right: 5px;
}
.profile-classic-caption .icon-sm {
font-size: 18px;
}
.profile-classic-caption .group {
margin-left: -3px;
}
.profile-classic-caption .group > * {
margin-left: 3px;
}
}
@media (min-width: 1200px) {
* + .profile-classic-title {
margin-top: 20px;
}
}
html:not(.tablet):not(.mobile) .profile-classic:hover .profile-classic-caption {
opacity: 1;
visibility: visible;
}
html:not(.tablet):not(.mobile) .profile-classic-caption {
top: 0;
display: flex;
flex-direction: column;
justify-content: flex-end;
opacity: 0;
visibility: hidden;
transition: .33s ease-in-out;
}
.profile-creative {
display: flex;
margin-left: -15px;
text-align: left;
color: #74757f;
}
.profile-creative > * {
margin-left: 15px;
}
.profile-creative-figure {
position: relative;
overflow: hidden;
max-width: 80px;
flex-shrink: 0;
}
.profile-creative-image {
width: 100%;
border-radius: 6px;
}
.profile-creative-main {
flex-grow: 1;
}
.profile-creative-title a {
color: #151515;
font-weight: 300;
}
.profile-creative-title a:hover {
color: #0045b6;
}
.profile-creative-position {
color: #151515;
}
.profile-creative-contacts {
color: #151515;
}
.profile-creative-contacts a {
color: inherit;
font-weight: 400;
}
.profile-creative-contacts a:hover {
color: #0045b6;
}
* + .profile-creative-position {
margin-top: 0;
}
* + .profile-creative-contacts {
margin-top: 15px;
}
@media (min-width: 576px) {
.profile-creative {
margin-left: -30px;
}
.profile-creative > * {
margin-left: 30px;
}
.profile-creative-figure {
max-width: 22%;
}
}
@media (min-width: 768px) {
.profile-creative-figure {
max-width: 29%;
}
.profile-creative-main {
padding-right: 30px;
}
* + .profile-creative-contacts {
margin-top: 22px;
}
}
@media (min-width: 992px) and (max-width: 1199.98px) {
.profile-creative {
margin-left: -20px;
}
.profile-creative > * {
margin-left: 20px;
}
.profile-creative-figure {
max-width: 25%;
}
.profile-creative-main {
padding-right: 10px;
}
}
.profile-minimal {
position: relative;
overflow: hidden;
border-radius: 6px;
color: #fff;
text-align: left;
}
.profile-minimal::before {
content: '';
display: block;
padding-bottom: 100%;
}
.profile-minimal-image {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
min-height: 100%;
min-width: 100%;
width: auto;
height: auto;
max-width: none;
}
@supports (object-fit: cover) {
.profile-minimal-image {
left: 0;
top: 0;
width: 100%;
height: 100%;
transform: none;
object-fit: cover;
object-position: center center;
}
}
.profile-minimal-caption {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
display: flex;
flex-direction: column;
justify-content: flex-end;
padding: 25px;
background: rgba(73, 80, 87, 0.4);
}
.profile-minimal-title {
color: #fff;
}
* + .profile-minimal-position {
margin-top: 5px;
}
@media (max-width: 575.98px) {
.profile-minimal {
max-width: 360px;
margin-left: auto;
margin-right: auto;
}
}
@media (min-width: 1200px) {
.profile-minimal-caption {
padding: 35px;
}
* + .profile-minimal-position {
margin-top: 10px;
}
}
html:not(.tablet):not(.mobile) .profile-minimal:hover .profile-minimal-caption {
opacity: 1;
visibility: visible;
}
html:not(.tablet):not(.mobile) .profile-minimal-caption {
opacity: 0;
visibility: hidden;
transition: .35s ease-in;
background: rgba(73, 80, 87, 0.6);
}
.profile-modern {
text-align: left;
}
.profile-modern > * + * {
margin-top: 35px;
}
.profile-modern-header {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
margin-bottom: -10px;
margin-left: -20px;
}
.profile-modern-header:empty {
margin-bottom: 0;
margin-left: 0;
}
.profile-modern-header > * {
display: inline-block;
margin: 0 0 Line truncated
|
||||
*
|
||||
* Counters
|
||||
*/
.counter-minimal {
position: relative;
text-align: center;
color: #495057;
}
.counter-minimal-icon {
font-size: 24px;
line-height: 1;
color: #0045b6;
}
.counter-minimal-main {
font-family: "Poppins", sans-serif;
font-size: 36px;
font-weight: 500;
line-height: 1.2;
letter-spacing: 0;
}
.counter-minimal-main > * {
display: inline;
font: inherit;
}
.counter-minimal-main span {
display: inline;
}
* + .counter-minimal-title {
margin-top: 10px;
}
* + .counter-minimal-main {
margin-top: 15px;
}
@media (max-width: 575.98px) {
.counter-minimal-title {
font-size: 16px;
line-height: 1.4;
}
}
@media (min-width: 768px) {
.counter-minimal-icon {
font-size: 28px;
}
}
@media (min-width: 768px) {
.counter-minimal-title {
font-size: 18px;
}
.counter-minimal-main {
font-size: 48px;
}
}
@media (min-width: 1200px) {
* + .counter-minimal-main {
margin-top: 25px;
}
* + .counter-minimal-title {
margin-top: 18px;
}
}
/*
|
||||
*
|
||||
* Layouts
|
||||
*/
.layout-bordered {
text-align: center;
}
.layout-bordered-item {
border: 0 solid #d3d5db;
}
.layout-bordered-item-inner {
display: flex;
flex-direction: column;
justify-content: center;
max-width: 290px;
padding: 0 15px;
margin-left: auto;
margin-right: auto;
}
.layout-bordered-item-inner a {
color: #151515;
}
.layout-bordered-item-inner > * + * {
margin-top: 10px;
}
@media (max-width: 767.98px) {
.layout-bordered-item {
padding: 30px 0;
}
.layout-bordered-item:first-child {
padding-top: 0;
}
.layout-bordered-item:last-child {
padding-bottom: 0;
}
.layout-bordered-item + .layout-bordered-item {
border-top-width: 1px;
}
}
@media (min-width: 768px) {
.layout-bordered {
display: flex;
}
.layout-bordered-item {
flex-grow: 1;
}
.layout-bordered-item-inner > * + * {
margin-top: 15px;
}
}
@media (min-width: 768px) and (max-width: 991.98px) {
.layout-bordered-item {
font-size: 15px;
}
}
@media (min-width: 768px) {
.layout-bordered-item {
flex-basis: 33.333%;
border-right-width: 1px;
}
.layout-bordered-item:first-child {
border-left-width: 1px;
}
}
.layout-navbar-demo {
position: relative;
overflow: hidden;
min-height: 400px;
background: #e8e9ee;
}
.layout-navbar-demo.layout-navbar-demo-lg {
min-height: 650px;
}
.layout-navbar-demo .rd-navbar-fixed .rd-navbar-panel {
position: relative;
z-index: 10;
}
.layout-navbar-demo .rd-navbar-fixed .rd-navbar-nav-wrap {
position: absolute;
z-index: 9;
}
.layout-navbar-demo .rd-navbar-fixed .rd-navbar-main-outer,
.layout-navbar-demo .rd-navbar-fixed .rd-navbar-main-element {
position: static;
}
.layout-navbar-demo .rd-navbar-fixed .rd-navbar-search {
position: static;
}
.layout-navbar-demo .rd-navbar-fixed .rd-navbar-panel .rd-navbar-search-toggle {
position: static;
z-index: 10;
}
.layout-navbar-demo .rd-navbar-fixed div.rd-navbar-block {
top: -1px;
right: 10px;
white-space: nowrap;
}
.layout-navbar-demo .rd-navbar-fixed div.rd-navbar-block > * {
display: inline-block;
margin-top: 0;
white-space: normal;
vertical-align: middle;
}
.layout-navbar-demo .rd-navbar-fixed div.rd-navbar-block > * + * {
margin-left: 8px;
}
.layout-navbar-demo .rd-navbar-fixed div.rd-navbar-block .rd-navbar-search-toggle {
margin-top: 6px;
}
.layout-navbar-demo .rd-navbar-fixed div.rd-navbar-popup {
position: absolute;
}
.layout-navbar-demo .rd-navbar-fixed.rd-navbar [class*='rd-navbar-fixed-element'] {
position: absolute;
z-index: 1000;
}
.layout-navbar-demo .rd-navbar-fixed.rd-navbar .rd-search {
position: absolute;
z-index: 1;
}
.layout-navbar-demo .rd-navbar-fixed .rd-navbar-collapse-content {
position: absolute;
z-index: 1;
}
@media (min-width: 1200px) {
.layout-navbar-demo {
min-height: 550px;
}
.layout-navbar-demo.layout-navbar-demo-lg {
min-height: 650px;
}
}
.container + .layout-navbar-demo {
margin-top: 20px;
}
.blog-layout-aside {
padding: 4px 0;
background: #f5f6fa;
}
.blog-layout-aside .rd-search .form-input {
border-color: transparent;
}
.blog-layout-aside-item {
padding: 25px 30px;
}
.blog-layout-aside-item .blog-layout-aside-title + * {
margin-top: 15px;
}
.blog-layout-aside-item a {
color: #151515;
}
.blog-layout-aside-title {
font-size: 22px;
line-height: 1.5;
}
* + .blog-layout-aside {
margin-top: 55px;
}
@media (min-width: 768px) {
* + .blog-layout-aside {
margin-top: 70px;
}
}
@media (min-width: 768px) and (max-width: 991.98px) {
.blog-layout-aside {
columns: 2;
break-inside: avoid;
}
.blog-layout-aside-item {
display: inline-block;
width: 100%;
}
}
@media (min-width: 992px) {
.blog-layout {
display: flex;
align-items: flex-start;
margin-left: -30px;
}
.blog-layout > * {
margin-left: 30px;
}
.blog-layout-main {
flex-grow: 1;
max-width: 66.66667%;
}
.blog-layout-aside {
flex-shrink: 0;
max-width: 33.33333%;
}
* + .blog-layout-aside {
margin-top: 0;
}
}
@media (min-width: 1200px) {
.blog-layout-aside-item {
padding: 35px 40px;
}
}
.blog-layout-aside .list-marked * > a {
transition: all ease .35s;
display: inline-block;
}
.blog-layout-aside .list-marked * > a:hover {
text-indent: 5px;
transition: all ease .35s;
}
/*
|
||||
*
|
||||
* Timeline
|
||||
*/
.timeline-classic {
text-align: left;
}
.timeline-classic-item {
position: relative;
overflow: hidden;
padding: 0 0 70px 35px;
margin-bottom: -25px;
}
.timeline-classic-item:last-child {
padding-bottom: 0;
margin-bottom: 0;
}
.timeline-classic-item-image {
width: 100%;
}
.timeline-classic-item-title {
font-family: "Poppins", sans-serif;
font-size: 24px;
line-height: 1.2;
font-weight: 300;
letter-spacing: 0;
text-transform: uppercase;
}
.thumbnail-classic-item-subtitle {
font-size: 16px;
line-height: 1.5;
color: #151515;
}
.timeline-classic-item-divider {
position: absolute;
top: 0;
left: 0;
display: flex;
flex-grow: 1;
flex-direction: column;
align-items: center;
padding-top: 25px;
}
.timeline-classic-item-divider::before {
content: '';
display: block;
width: 15px;
height: 15px;
border: 2px solid #0045b6;
border-radius: 50%;
}
.timeline-classic-item-divider::after {
content: '';
position: absolute;
top: 40px;
left: 50%;
margin-left: -1px;
width: 2px;
height: 300vh;
background: #0045b6;
min-height: 100px;
}
* + .timeline-classic-item-main {
margin-top: 20px;
}
.context-dark .timeline-classic-item-divider::before, .bg-gray-700 .timeline-classic-item-divider::before, .bg-gray-800 .timeline-classic-item-divider::before, .bg-primary .timeline-classic-item-divider::before, .bg-primary-darker .timeline-classic-item-divider::before {
border-color: #fff;
}
.context-dark .timeline-classic-item-divider::after, .bg-gray-700 .timeline-classic-item-divider::after, .bg-gray-800 .timeline-classic-item-divider::after, .bg-primary .timeline-classic-item-divider::after, .bg-primary-darker .timeline-classic-item-divider::after {
background: #fff;
}
.context-dark .thumbnail-classic-item-subtitle, .bg-gray-700 .thumbnail-classic-item-subtitle, .bg-gray-800 .thumbnail-classic-item-subtitle, .bg-primary .thumbnail-classic-item-subtitle, .bg-primary-darker .thumbnail-classic-item-subtitle {
color: #fff;
}
@media (max-width: 575.98px) {
.timeline-classic-item {
max-width: 450px;
margin-left: auto;
margin-right: auto;
}
}
@media (max-width: 767.98px) {
.timeline-classic-item {
flex-wrap: wrap;
}
.timeline-classic-item-main,
.timeline-classic-item-aside {
width: 100%;
}
}
@media (min-width: 768px) {
.timeline-classic-item {
display: flex;
padding-left: 0;
padding-bottom: 90px;
}
.timeline-classic-item-aside {
max-width: 33.33%;
}
.timeline-classic-item-main {
max-width: 60%;
}
.timeline-classic-item-divider {
position: relative;
padding: 25px 20px 0;
}
.timeline-classic-item-title {
font-size: 32px;
}
.thumbnail-classic-item-subtitle {
font-size: 18px;
line-height: 1.4;
}
* + .timeline-classic-item-main {
margin-top: 0;
}
}
@media (min-width: 992px) {
.timeline-classic-item * + h4,
.timeline-classic-item * + .heading-4 {
margin-top: 20px;
}
.timeline-classic-item-title {
font-size: 36px;
}
.thumbnail-classic-item-subtitle {
font-size: 20px;
line-height: 1.4;
}
.timeline-classic-item-aside {
max-width: 37%;
}
.timeline-classic-item-main {
max-width: 50%;
}
}
@media (min-width: 1200px) {
.timeline-classic-item-aside {
max-width: 33.33%;
}
.timeline-classic-item-title {
font-size: 48px;
}
}
@media (min-width: 1600px) {
.timeline-classic-item {
padding-bottom: 125px;
}
.timeline-classic-item * + h4,
.timeline-classic-item * + .heading-4 {
margin-top: 30px;
}
}
/*
|
||||
*
|
||||
* Careers
|
||||
*/
.career-classic {
text-align: left;
}
.career-classic-divider {
border-bottom: 1px solid #aeb1be;
}
.career-classic-list {
transform: translate3d(0, -10px, 0);
margin-bottom: -10px;
margin-left: -20px;
margin-right: -20px;
}
.career-classic-list > * {
margin-top: 10px;
padding-left: 20px;
padding-right: 20px;
}
.career-classic-list > li {
display: inline-block;
vertical-align: middle;
white-space: nowrap;
}
.career-classic-list > li > * {
display: inline-block;
vertical-align: middle;
}
.career-classic-list > li > * + * {
margin-left: 8px;
}
.career-classic-list .icon {
font-size: 1.25em;
color: #0045b6;
}
* + .career-classic-divider {
margin-top: 10px;
}
* + .career-classic-list {
margin-top: 15px;
}
@media (max-width: 575.98px) {
.career-classic {
max-width: 360px;
margin-left: auto;
margin-right: auto;
}
}
@media (min-width: 768px) {
* + .career-classic-divider {
margin-top: 20px;
}
* + .career-classic-list {
margin-top: 20px;
}
}
/*
|
||||
*
|
||||
* Comments
|
||||
*/
.comment-classic {
display: flex;
align-items: flex-start;
text-align: left;
padding-bottom: 20px;
border-bottom: 1px solid #e8e9ee;
}
.comment-classic > * + * {
margin-left: 20px;
}
.comment-classic-figure {
position: relative;
flex-shrink: 0;
width: 48px;
height: 48px;
}
.comment-classic-image {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
min-height: 100%;
min-width: 100%;
width: auto;
height: auto;
border-radius: 50%;
max-width: none;
}
@supports (object-fit: cover) {
.comment-classic-image {
left: 0;
top: 0;
width: 100%;
height: 100%;
transform: none;
object-fit: cover;
object-position: center center;
}
}
.comment-classic-main {
flex-grow: 1;
}
.comment-classic-name {
color: #0045b6;
}
.comment-classic-text {
color: #495057;
}
.comment-classic-meta {
display: flex;
align-items: center;
justify-content: space-between;
}
.comment-classic-meta time {
color: #74757f;
}
.comment-classic-reply {
font-size: 24px;
line-height: 1;
color: #aeb1be;
}
.comment-classic-reply::before {
content: '\f549';
font-family: 'Material Design Icons';
}
.comment-classic-reply:hover {
color: #0045b6;
}
* + .comment-classic-text {
margin-top: 8px;
}
* + .comment-classic-meta {
margin-top: 5px;
}
@media (min-width: 576px) {
.comment-classic > * + * {
margin-left: 25px;
}
.comment-classic-reply {
font-size: 28px;
}
}
.comment-classic-group .comment-classic-group {
margin-left: 25px;
}
.comment-classic-group * + .comment-classic-group {
margin-top: 30px;
}
* + .comment-classic-group {
margin-top: 50px;
}
.comment-classic-group + .comment-classic-group {
margin-top: 30px;
}
@media (min-width: 768px) {
.comment-classic-group .comment-classic-group {
margin-left: 75px;
}
}
/*
|
||||
*
|
||||
* Jumbotron Classic
|
||||
*/
.jumbotron-classic.bg-gray-700 h6,
.jumbotron-classic.bg-gray-700 .heading-6 {
color: #fff;
}
.jumbotron-classic.parallax-container {
background-position: 60% center;
}
.jumbotron-classic .parallax-content {
width: 100%;
}
.jumbotron-classic-content {
max-width: 650px;
display: flex;
flex-direction: column;
justify-content: center;
height: 100%;
}
.jumbotron-classic-content .title-docor-text:before {
top: 50%;
}
@media (max-width: 1599.98px) {
.jumbotron-classic-content {
padding: 120px 0;
}
}
@media (max-width: 767.98px) {
.jumbotron-classic-content {
padding: 60px 0 80px 0;
}
}
@media (max-width: 1199.98px) {
.jumbotron-classic.parallax-container::before {
content: '';
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
pointer-events: none;
background: linear-gradient(to right, rgba(73, 80, 87, 0.6), rgba(73, 80, 87, 0.2));
}
}
@media (min-width: 768px) {
.jumbotron-classic-inner {
padding: 200px 0 140px;
}
}
@media (min-width: 1600px) {
.jumbotron-classic-content {
padding: 200px 0 150px;
}
}
.jumbotron-modern {
position: relative;
display: flex;
text-align: center;
}
.jumbotron-modern-inner {
position: relative;
z-index: 1;
display: flex;
align-items: center;
width: 100%;
padding: 50px 0;
}
.jumbotron-modern-content {
max-width: 770px;
margin-left: auto;
margin-right: auto;
}
@media (max-width: 767.98px) {
.jumbotron-modern .form-layout-1 {
display: inline-block;
max-width: 360px;
}
}
@media (max-width: 1199.98px) {
.jumbotron-modern::before {
content: '';
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
pointer-events: none;
background: linear-gradient(to bottom, rgba(73, 80, 87, 0.4), rgba(73, 80, 87, 0));
}
}
@media (min-width: 768px) {
.jumbotron-modern-inner {
padding: 100px 0 140px;
}
}
@media (min-width: 1200px) {
.jumbotron-modern-inner {
min-height: 41.66667vw;
}
}
.jumbotron-indigo-header {
padding: 40px 0;
}
.jumbotron-indigo-main {
padding: 10px 0 40px;
}
@media (min-width: 768px) {
.jumbotron-indigo-header {
padding: 50px 0;
}
.jumbotron-indigo-main {
padding: 50px 0 185px;
}
}
/*
|
||||
*
|
||||
* Page layout
|
||||
*/
.page {
position: relative;
overflow: hidden;
min-height: 100vh;
}
.page.fadeIn {
animation-timing-function: ease-out;
}
.page.fadeOut {
animation-timing-function: ease-in;
}
[data-x-mode] .page {
opacity: 1;
}
html.boxed body {
background: #f5f6fa url(../images/bg-pattern-boxed.png) repeat fixed;
}
@media (min-width: 1630px) {
html.boxed .page {
max-width: 1600px;
margin-left: auto;
margin-right: auto;
box-shadow: 0 0 23px 0 rgba(1, 1, 1, 0.1);
}
html.boxed .rd-navbar-static {
max-width: 1600px;
margin-left: auto;
margin-right: auto;
}
html.boxed .rd-navbar-static.rd-navbar--is-stuck {
max-width: 1600px;
width: 100%;
left: calc(50% - 1600px);
right: calc(50% - 1600px);
}
}
.page-header-navbar {
position: relative;
z-index: 1080;
}
.page-header-navbar .rd-navbar-wrap {
position: absolute;
top: 0;
left: 0;
right: 0;
z-index: 1080;
}
/*
|
||||
*
|
||||
* Text styling
|
||||
*/
.text-italic {
font-style: italic;
}
.text-normal {
font-style: normal;
}
.text-underline {
text-decoration: underline;
}
.text-strike {
text-decoration: line-through;
}
.font-weight-thin {
font-weight: 100;
}
.font-weight-light {
font-weight: 300;
}
.font-weight-regular {
font-weight: 400;
}
.font-weight-medium {
font-weight: 500;
}
.font-weight-sbold {
font-weight: 600;
}
.font-weight-ubold {
font-weight: 900;
}
.text-spacing-0 {
letter-spacing: 0;
}
/*
|
||||
*
|
||||
* Offsets
|
||||
*/
* + p,
* + .list-inline-comma {
margin-top: 16px;
}
h3 + p, .heading-3 + p,
h3 + .p, .heading-3 + .p {
margin-top: 18px;
}
h4 + p, .heading-4 + p,
h4 + .p, .heading-4 + .p {
margin-top: 16px;
}
* + h1,
* + .heading-1 {
margin-top: 15px;
}
h3 + h1, h3 + .heading-1,
.heading-3 + h1, .heading-3 + .heading-1 {
margin-top: 5px;
}
h6 + h1,
h6 + .heading-1,
.heading-6 + h1,
.heading-6 + .heading-1 {
margin-top: 10px;
}
* + h4,
* + .heading-4 {
margin-top: 15px;
}
* + h5,
* + .heading-5 {
margin-top: 15px;
}
h6 + p,
.heading-6 + p {
margin-top: 22px;
}
p + h2,
p + .heading-2 {
margin-top: 15px;
}
p + p {
margin-top: 14px;
}
img + p {
margin-top: 15px;
}
h3 + p {
font-size: 16px;
}
h3 + img {
margin-top: 42px;
}
p + hr {
margin-top: 35px;
}
* + .row {
margin-top: 30px;
}
* + .big {
margin-top: 20px;
}
* + .text-block {
margin-top: 25px;
}
* + .button,
* + .button-outer {
margin-top: 25px;
}
* + .list-sm {
margin-top: 25px;
}
* + form.form-inline {
margin-top: 18px;
}
* + form.rd-form-small {
margin-top: 25px;
}
html * + .offset-top-1 {
margin-top: 40px;
}
html * + .offset-top-2 {
margin-top: 50px;
}
html * + .offset-top-3 {
margin-top: 20px;
}
html * + .offset-top-4 {
margin-top: 18px;
}
html .page * + .offset-top-5 {
margin-top: 40px;
}
h3 + .row, .heading-3 + .row,
h3 + .owl-carousel, .heading-3 + .owl-carousel {
margin-top: 35px;
}
.container + .container {
margin-top: 35px;
}
.container + .section {
margin-top: 25px;
}
.row + .row {
margin-top: 35px;
}
.row + .button-lg {
margin-top: 30px;
}
.list-sm + .group-xs {
margin-top: 20px;
}
@media (min-width: 768px) {
* + p,
* + .list-inline-comma {
margin-top: 20px;
}
* + .big {
margin-top: 25px;
}
* + .button,
* + .button-outer {
margin-top: 34px;
}
* + .row {
margin-top: 40px;
}
* + .text-block {
margin-top: 30px;
}
.container + .section {
margin-top: 30px;
}
.row + .button-lg {
margin-top: 45px;
}
html * + .offset-top-2 {
margin-top: 50px;
}
}
@media (min-width: 992px) {
* + h1,
* + .heading-1 {
margin-top: 22px;
}
h3 + p, .heading-3 + p,
h3 + .p, .heading-3 + .p {
margin-top: 24px;
}
h3 + .row, .heading-3 + .row,
h3 + .owl-carousel, .heading-3 + .owl-carousel {
margin-top: 55px;
}
html * + .offset-top-1 {
margin-top: 60px;
}
html * + .offset-top-3 {
margin-top: 30px;
}
html * + .offset-top-4 {
margin-top: 24px;
}
html .page * + .offset-top-5 {
margin-top: 60px;
}
.progress-linear + .button {
margin-top: 55px;
}
.row + .group {
margin-top: 45px;
}
}
@media (min-width: 1200px) {
* + .button,
* + .button-outer {
margin-top: 40px;
}
* + .rd-form {
margin-top: 40px;
}
h3 + p, .heading-3 + p,
h3 + .p, .heading-3 + .p {
margin-top: 20px;
}
html * + .offset-top-1 {
margin-top: 70px;
}
.container + .container {
margin-top: 60px;
}
.row + .row {
margin-top: 60px;
}
}
@media (min-width: 1600px) {
h3 + .row, .heading-3 + .row,
h3 + .owl-carousel, .heading-3 + .owl-carousel {
margin-top: 75px;
}
html * + .offset-top-1 {
margin-top: 144px;
}
html * + .offset-top-2 {
margin-top: 50px;
}
.row + .button-lg {
margin-top: 70px;
}
}
.row-0 {
margin-bottom: 0px;
}
.row-0:empty {
margin-bottom: 0;
}
.row-0 > * {
margin-bottom: 0px;
}
.row-10 {
margin-bottom: -10px;
}
.row-10:empty {
margin-bottom: 0;
}
.row-10 > * {
margin-bottom: 10px;
}
.row-x-10 {
margin-bottom: -10px;
margin-left: -5px;
margin-right: -5px;
}
.row-x-10:empty {
margin-bottom: 0;
}
.row-x-10 > * {
margin-bottom: 10px;
}
.row-x-10 > [class*='col'] {
padding-left: 5px;
padding-right: 5px;
}
.row-20 {
margin-bottom: -20px;
}
.row-20:empty {
margin-bottom: 0;
}
.row-20 > * {
margin-bottom: 20px;
}
.row-30 {
margin-bottom: -30px;
}
.row-30:empty {
margin-bottom: 0;
}
.row-30 > * {
margin-bottom: 30px;
}
.row-50 {
margin-bottom: -50px;
}
.row-50:empty {
margin-bottom: 0;
}
.row-50 > * {
margin-bottom: 50px;
}
.row-60 {
margin-bottom: -50px;
}
.row-60:empty {
margin-bottom: 0;
}
.row-60 > * {
margin-bottom: 50px;
}
.row-45 {
margin-bottom: -45px;
}
.row-45:empty {
margin-bottom: 0;
}
.row-45 > * {
margin-bottom: 45px;
}
@media (min-width: 768px) {
.row-md-50 {
margin-bottom: -50px;
}
.row-md-50:empty {
margin-bottom: 0;
}
.row-md-50 > * {
margin-bottom: 50px;
}
}
@media (min-width: 992px) {
.row-md-30 {
margin-bottom: -30px;
}
.row-md-30:empty {
margin-bottom: 0;
}
.row-md-30 > * {
margin-bottom: 30px;
}
}
@media (min-width: 1600px) {
.row-xxl-70 {
margin-bottom: -70px;
}
.row-xxl-70:empty {
margin-bottom: 0;
}
.row-xxl-70 > * {
margin-bottom: 70px;
}
}
/*
|
||||
*
|
||||
* Sections
|
||||
*/
.section-xs {
padding: 30px 0;
}
.section-sm {
padding: 35px 0;
}
.section-sm.section-first {
padding-top: 65px;
}
.section-sm.section-last {
padding-bottom: 80px;
}
.section-md,
.section-lg,
.section-xl {
padding: 50px 0;
}
.section-1 {
padding: 35px 0;
}
.section-collapse + .section-collapse {
padding-top: 0;
}
.section-collapse:last-child {
padding-bottom: 0;
}
html [class*='section-'].section-bottom-0 {
padding-bottom: 0;
}
@media (min-width: 576px) {
.section-xs {
padding: 40px 0;
}
}
@media (min-width: 768px) {
.section-sm {
padding: 45px 0;
}
.section-sm.section-first {
padding-top: 90px;
}
.section-sm.section-last {
padding-bottom: 90px;
}
.section-md {
padding: 60px 0;
}
.section-lg {
padding: 72px 0;
}
.section-lg.section-first {
padding-top: 100px;
}
.section-lg.section-last {
padding-bottom: 100px;
}
.section-xl {
padding: 80px 0;
}
.section-1 {
padding: 60px 0;
}
}
@media (min-width: 992px) {
.section-md {
padding: 60px 0 70px;
}
.section-xl {
padding: 100px 0;
}
.section-1 {
padding: 80px 0;
}
}
@media (min-width: 1200px) {
.section-sm {
padding: 60px 0;
}
.section-sm.section-first {
padding-top: 80px;
}
.section-sm.section-last {
padding-bottom: 80px;
}
}
@media (min-width: 1600px) {
.section-sm.section-first {
padding-top: 120px;
}
.section-sm.section-last {
padding-bottom: 120px;
}
.section-md {
padding: 85px 0 95px;
}
.section-lg {
padding: 120px 0;
}
.section-lg.section-first {
padding-top: 120px;
}
.section-lg.section-last {
padding-bottom: 120px;
}
.section-xl {
padding: 160px 0;
}
.section-1 {
padding: 90px 0 100px;
}
}
.section-single {
display: flex;
}
.section-single::before {
content: '';
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
pointer-events: none;
background: rgba(21, 21, 21, 0.4);
}
.section-single * + .rd-mailform-wrap {
margin-top: 35px;
}
.section-single * + .countdown-wrap {
margin-top: 30px;
}
.section-single .countdown-wrap + * {
margin-top: 35px;
}
.section-single-dummy {
visibility: hidden;
pointer-events: none;
}
.section-single-header {
padding: calc(1em + 3vh) 0 calc(1em + 2vh);
}
.section-single-main {
padding: calc(1em + 4vh) 0;
}
.section-single-footer {
padding: calc(1em + 2vh) 0 calc(1em + 3vh);
}
.section-single-inner {
position: relative;
z-index: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
width: 100%;
min-height: 100vh;
padding-top: 6vh;
}
.section-single-inner > * {
width: 100%;
}
@supports (display: grid) {
.section-single-inner {
display: grid;
justify-items: center;
align-content: space-between;
grid-template-columns: 1fr;
}
}
@media (max-width: 575.98px) {
.section-single .section-single-main-content {
max-width: 240px;
margin-left: auto;
margin-right: auto;
}
}
@media (max-width: 767.98px) {
.section-single .button-lg {
font-size: 15px;
padding-left: 25px;
padding-right: 25px;
}
}
@media (min-width: 768px) {
.section-single::before {
display: none;
}
.section-single-inner {
padding-top: 7vh;
}
}
@media (min-width: 1200px) {
.section-single * + .countdown-wrap {
margin-top: 50px;
}
.section-single .countdown-wrap + * {
margin-top: 50px;
}
}
.section-overlap {
position: relative;
padding: 40px 0;
}
.section-overlap .row {
flex-wrap: nowrap;
flex-direction: column;
align-items: flex-end;
}
.section-overlap [class*='col'] {
flex-basis: auto;
}
.section-overlap * + [class*='col'] {
margin-top: 10px;
}
.section-overlap * + .col-offset-1 {
margin-top: 20px;
}
.section-overlap-image {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-size: cover;
background-position: center center;
background-repeat: no-repeat;
}
.section-overlap-content {
position: relative;
z-index: 1;
}
@media (max-width: 767.98px) {
.section-overlap-content .container {
padding: 20px 15px;
background: linear-gradient(to right, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.8));
}
.section-overlap-content .container > * {
max-width: 380px;
}
}
@media (max-width: 767.98px) and (min-width: 576px) {
.section-overlap-content .container {
padding: 40px 50px;
}
}
@media (min-width: 768px) and (max-width: 991.98px) {
.section-overlap-image::before {
content: '';
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1;
pointer-events: none;
background: linear-gradient(to left, rgba(245, 246, 250, 0.4), rgba(245, 246, 250, 0));
}
}
@media (min-width: 768px) {
.section-overlap {
padding: 75px 0;
}
.section-overlap * + [class*='col'] {
margin-top: 20px;
}
.section-overlap * + .col-offset-1 {
margin-top: 40px;
}
.section-overlap-image {
background-position: 80% 50%;
width: calc(50% - 60px + 35px);
}
}
@media (min-width: 992px) {
.section-overlap {
padding: 100px 0;
}
.section-overlap-image {
width: calc(50% - -80Line truncated
|
||||
*
|
||||
* Grid modules
|
||||
*/
.range {
display: flex;
flex-wrap: wrap;
}
.cell-inner {
width: 100%;
padding-right: 15px;
padding-left: 15px;
}
.range > [class*='cell'] {
position: relative;
width: 100%;
min-height: 1px;
}
.range > [class*='cell'] > .row {
margin: 0;
}
.range > [class*='cell'].container {
padding: 0;
}
.range > [class*='col'] {
padding: 0;
}
@media (min-width: 576px) {
.cell-sm-6 {
flex: 0 0 50%;
max-width: 50%;
}
.cell-sm-6 .cell-inner {
max-width: 270px;
}
.range > [class*='cell-sm']:nth-child(odd) .cell-inner {
margin-left: auto;
}
.range.flex-sm-row-reverse > [class*='cell-sm']:nth-child(odd) .cell-inner {
margin-left: 0;
}
.range.flex-sm-row-reverse > [class*='cell-sm']:nth-child(even) .cell-inner {
margin-left: auto;
}
.range > [class*='cell-sm'].container {
margin: 0;
}
}
@media (min-width: 768px) {
.range > [class*='cell-md']:nth-child(odd) .cell-inner {
margin-left: auto;
}
.range.flex-md-row-reverse > [class*='cell-md']:nth-child(odd) .cell-inner {
margin-left: 0;
}
.range.flex-md-row-reverse > [class*='cell-md']:nth-child(even) .cell-inner {
margin-left: auto;
}
.range > [class*='cell-md'].container {
margin: 0;
}
}
@media (min-width: 992px) {
[class*='cell-lg'] > .row > [class*='col'] {
flex-basis: 100%;
}
.cell-lg-5 {
flex: 0 0 calc(50% - 80px);
max-width: calc(50% - 80px);
}
.cell-lg-5 .cell-inner {
max-width: 400px;
}
.cell-lg-6 {
flex: 0 0 50%;
max-width: 50%;
}
.cell-lg-6 .cell-inner {
max-width: 480px;
}
.range > [class*='cell-lg']:nth-child(odd) .cell-inner {
margin-left: auto;
}
.range.flex-lg-row-reverse > [class*='cell-lg']:nth-child(odd) .cell-inner {
margin-left: 0;
}
.range.flex-lg-row-reverse > [class*='cell-lg']:nth-child(even) .cell-inner {
margin-left: auto;
}
.range > [class*='cell-lg'].container {
margin: 0;
}
}
@media (min-width: 1200px) {
.range > [class*='cell-xl'].container {
margin: 0;
}
.range > [class*='cell-xl']:nth-child(odd) .cell-inner {
margin-left: auto;
}
.range .cell-inner {
flex-basis: 100%;
}
.cell-xl-7 {
flex: 0 0 calc(50% - -100px);
max-width: calc(50% - -100px);
}
.cell-xl-7 .cell-inner {
max-width: 700px;
}
.cell-lg-6,
.cell-xl-6 {
flex: 0 0 50%;
max-width: 50%;
}
.cell-lg-6 .cell-inner,
.cell-xl-6 .cell-inner {
max-width: 600px;
}
.cell-xl-5 {
flex: 0 0 calc(50% - 100px);
max-width: calc(50% - 100px);
}
.cell-xl-5 .cell-inner {
max-width: 500px;
}
.cell-xl-4 {
flex: 0 0 calc(50% - 200px);
max-width: calc(50% - 200px);
}
.cell-xl-4 .cell-inner {
max-width: 400px;
}
}
@media (min-width: 1600px) {
.cell-xxl-6 {
flex: 0 0 50%;
max-width: 50%;
}
.cell-xxl-6 .cell-inner {
max-width: 600px;
}
}
/*
|
||||
*
|
||||
* Backgrounds
|
||||
*/
.context-dark, .bg-gray-700, .bg-gray-800, .bg-primary, .bg-primary-darker,
.context-dark h1,
.bg-gray-700 h1,
.bg-gray-800 h1,
.bg-primary h1,
.bg-primary-darker h1, .context-dark h2, .bg-gray-700 h2, .bg-gray-800 h2, .bg-primary h2, .bg-primary-darker h2, .context-dark h3, .bg-gray-700 h3, .bg-gray-800 h3, .bg-primary h3, .bg-primary-darker h3, .context-dark h4, .bg-gray-700 h4, .bg-gray-800 h4, .bg-primary h4, .bg-primary-darker h4, .context-dark h5, .bg-gray-700 h5, .bg-gray-800 h5, .bg-primary h5, .bg-primary-darker h5, .context-dark h6, .bg-gray-700 h6, .bg-gray-800 h6, .bg-primary h6, .bg-primary-darker h6, .context-dark [class^='heading-'], .bg-gray-700 [class^='heading-'], .bg-gray-800 [class^='heading-'], .bg-primary [class^='heading-'], .bg-primary-darker [class^='heading-'] {
color: #fff;
}
.context-dark p a, .bg-gray-700 p a, .bg-gray-800 p a, .bg-primary p a, .bg-primary-darker p a {
color: inherit;
}
.context-dark .big, .bg-gray-700 .big, .bg-gray-800 .big, .bg-primary .big, .bg-primary-darker .big {
color: #fff;
}
.context-dark .brand .brand-logo-dark, .bg-gray-700 .brand .brand-logo-dark, .bg-gray-800 .brand .brand-logo-dark, .bg-primary .brand .brand-logo-dark, .bg-primary-darker .brand .brand-logo-dark {
display: none;
}
.context-dark .brand .brand-logo-light, .bg-gray-700 .brand .brand-logo-light, .bg-gray-800 .brand .brand-logo-light, .bg-primary .brand .brand-logo-light, .bg-primary-darker .brand .brand-logo-light {
display: block;
}
.context-dark .button-primary:hover, .bg-gray-700 .button-primary:hover, .bg-gray-800 .button-primary:hover, .bg-primary .button-primary:hover, .bg-primary-darker .button-primary:hover {
background: #4854ed;
border-color: #4854ed;
}
/**
|
||||
* Light Backgrounds
|
||||
*/
.bg-gray-100 {
background-color: #f5f6fa;
}
/**
|
||||
* Dark Backgrounds
|
||||
*/
.bg-gray-700 {
color: #aeb1be;
background-color: #232426;
}
.bg-gray-700 a {
color: inherit;
}
.bg-gray-700 a:hover {
color: #fff;
}
.bg-gray-700 p a:hover {
color: #fff;
}
.bg-gray-800 {
background-color: #151515;
}
/**
|
||||
* Accent Backgrounds
|
||||
*/
.bg-primary {
background-color: #0045b6;
}
.bg-primary-darker {
background-color: #29293a;
}
/**
|
||||
* Background Image
|
||||
*/
[class*='bg-'] {
background-size: cover;
background-position: center center;
}
@media (max-width: 1199.98px) {
.bg-image-light {
position: relative;
}
.bg-image-light::before {
content: '';
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: rgba(255, 255, 255, 0.1);
}
}
.bg-image-1 {
position: relative;
background-position: 30% 100%;
}
.bg-image-1::before {
content: '';
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: #495057;
opacity: .6;
}
.bg-image-1 > * {
position: relative;
z-index: 1;
}
@media (min-width: 576px) {
.bg-image-1 {
background-position: 72% 100%;
}
.bg-image-1::before {
opacity: .2;
}
}
@media (min-width: 768px) {
.bg-image-1 {
background-position: 54% 100%;
}
.bg-image-1::before {
display: none;
}
}
@media (min-width: 992px) {
html:not(.tablet):not(.mobile) .bg-fixed {
background-attachment: fixed;
}
}
.primary-overlay {
position: relative;
}
.primary-overlay:before {
position: absolute;
content: '';
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba(21, 21, 21, 0.45);
pointer-events: none;
z-index: 1;
display: block;
}
/*
|
||||
*
|
||||
* Utilities custom
|
||||
*/
.height-fill {
position: relative;
display: flex;
flex-direction: column;
align-items: stretch;
}
.height-fill > * {
flex-grow: 1;
flex-shrink: 0;
}
.object-inline {
white-space: nowrap;
}
.object-inline > * {
display: inline-block;
min-width: 20px;
vertical-align: top;
white-space: normal;
}
.object-inline.wow span {
display: inline-block;
}
.object-inline > * + * {
margin-left: 11px;
}
.wow-outer .object-inline span {
display: inline-block;
}
.oh {
position: relative;
overflow: hidden;
}
.text-decoration-lines {
position: relative;
overflow: hidden;
width: 100%;
text-align: center;
}
.text-decoration-lines-content {
position: relative;
display: inline-block;
padding: 0 20px;
}
.text-decoration-lines-content::before, .text-decoration-lines-content::after {
content: '';
position: absolute;
height: 1px;
background: #aeb1be;
top: 50%;
width: 100vw;
}
.text-decoration-lines-content::before {
left: 0;
transform: translate3d(-100%, 0, 0);
}
.text-decoration-lines-content::after {
right: 0;
transform: translate3d(100%, 0, 0);
}
* + .text-decoration-lines {
margin-top: 30px;
}
.text-block > * {
margin-left: .125em;
margin-right: .125em;
}
@media (min-width: 992px) {
.offset-right-1 {
margin-right: 40px;
}
}
.banner {
background-position: center center;
background-size: cover;
}
.phone-frame {
max-width: 296px;
padding: 0 5px;
margin-left: auto;
margin-right: auto;
box-shadow: -46.037px 40.02px 21px 0px rgba(0, 0, 0, 0.02);
}
@media (max-width: 767.98px) {
.phone-frame {
display: none;
}
}
.tip-mark {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2em;
height: 2em;
padding-left: 2px;
margin-bottom: 5px;
font-size: 12px;
line-height: 2em;
vertical-align: middle;
text-align: center;
border-radius: 50%;
border: 1px solid #e8e9ee;
color: #0045b6;
}
/*
|
||||
*
|
||||
* Insets
|
||||
*/
@media (min-width: 576px) {
.inset-left-1 {
padding-left: 10px;
}
}
@media (min-width: 768px) {
.inset-left-1 {
padding-left: 30px;
}
}
@media (min-width: 992px) {
.inset-left-1 {
padding-left: 0;
}
}
@media (min-width: 992px) and (max-width: 1199.98px) {
.inset-left-2 {
padding-left: 30px;
}
}
@media (min-width: 576px) {
.inset-right-1 {
padding-right: 20px;
}
}
@media (min-width: 768px) {
.inset-right-1 {
padding-right: 30px;
}
}
@media (min-width: 992px) and (max-width: 1199.98px) {
.inset-right-1 {
padding-right: 0;
}
}
@media (min-width: 992px) {
.inset-right-2 {
padding-right: 30px;
}
}
@media (min-width: 1200px) {
.inset-right-2 {
padding-right: 0;
}
}
@media (min-width: 992px) {
.inset-right-3 {
padding-left: 5px;
}
}
@media (min-width: 1200px) {
.inset-right-3 {
padding-right: 0;
}
}
/*
|
||||
*
|
||||
* Animate.css
|
||||
*/
.animated {
animation-duration: 1s;
animation-fill-mode: both;
opacity: 1;
}
.animated.infinite {
animation-iteration-count: infinite;
}
.animated.hinge {
animation-duration: 2s;
}
html:not(.lt-ie10) .not-animated {
opacity: 0;
}
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
.fadeIn {
animation-name: fadeIn;
}
@keyframes fadeInUp {
0% {
opacity: 0;
transform: translate3d(0, 100%, 0);
}
100% {
opacity: 1;
transform: none;
}
}
.fadeInUp {
animation-name: fadeInUp;
}
@keyframes fadeInDown {
0% {
opacity: 0;
transform: translate3d(0, -100%, 0);
}
100% {
opacity: 1;
transform: none;
}
}
.fadeInDown {
animation-name: fadeInDown;
}
@keyframes fadeInLeft {
0% {
opacity: 0;
transform: translate3d(-100%, 0, 0);
}
100% {
opacity: 1;
transform: none;
}
}
.fadeInLeft {
animation-name: fadeInLeft;
}
@keyframes fadeInRight {
0% {
opacity: 0;
transform: translate3d(100%, 0, 0);
}
100% {
opacity: 1;
transform: none;
}
}
.fadeInRight {
animation-name: fadeInRight;
}
@keyframes fadeOut {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.fadeOut {
animation-name: fadeOut;
}
@keyframes slideInDown {
0% {
transform: translate3d(0, -100%, 0);
visibility: visible;
}
100% {
transform: translate3d(0, 0, 0);
}
}
.slideInDown {
animation-name: slideInDown;
}
@keyframes slideInUp {
0% {
transform: translate3d(0, 100%, 0);
visibility: visible;
}
100% {
transform: translate3d(0, 0, 0);
}
}
.slideInUp {
animation-name: slideInUp;
}
@keyframes slideInLeft {
0% {
transform: translate3d(-100%, 0, 0);
visibility: visible;
}
100% {
transform: translate3d(0, 0, 0);
}
}
.slideInLeft {
animation-name: slideInLeft;
}
@keyframes slideInRight {
0% {
transform: translate3d(100%, 0, 0);
visibility: visible;
}
100% {
transform: translate3d(0, 0, 0);
}
}
.slideInRight {
animation-name: slideInRight;
}
@keyframes slideOutDown {
0% {
transform: translate3d(0, 0, 0);
}
100% {
visibility: hidden;
transform: translate3d(0, 100%, 0);
}
}
.slideOutDown {
animation-name: slideOutDown;
}
@keyframes scaleInY {
0% {
top: 0;
bottom: 100%;
}
50% {
transform: scale3d(1, 1, 1);
}
100% {
top: 100%;
bottom: auto;
transform: scale3d(1, 0, 1);
}
}
@keyframes scaleFadeIn {
0% {
height: 0;
}
100% {
height: 100%;
}
}
.scaleFadeIn {
display: flex;
overflow: hidden;
animation-name: scaleFadeIn;
animation-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
.scaleFadeInWrap {
display: flex;
align-items: stretch;
}
.wow-outer {
position: relative;
overflow: hidden;
}
@keyframes scaleInVertical {
0% {
transform: scale3d(1, 0, 1);
}
100% {
transform: scale3d(1, 1, 1);
}
}
.scaleInVertical {
animation-name: scaleInVertical;
}
@keyframes fadeInLeftSmall {
0% {
opacity: 0;
transform: translate3d(-20px, 0, 0);
}
100% {
opacity: 1;
transform: none;
}
}
.fadeInLeftSmall {
animation-name: fadeInLeftSmall;
}
@keyframes fadeInUpSmall {
0% {
opacity: 0;
transform: translate3d(0, 20px, 0);
}
100% {
opacity: 1;
transform: none;
}
}
.fadeInUpSmall {
animation-name: fadeInUpSmall;
}
@keyframes fadeSlideInDown {
0% {
opacity: 0;
transform: translate3d(0, -50%, 0);
visibility: visible;
}
10% {
opacity: 1;
}
100% {
transform: translate3d(0, 0, 0);
}
}
.fadeSlideInDown {
animation-name: fadeSlideInDown;
}
@keyframes fadeSlideInUp {
0% {
opacity: 0;
transform: translate3d(0, 50%, 0);
visibility: visible;
}
10% {
opacity: 1;
}
100% {
transform: translate3d(0, 0, 0);
}
}
.fadeSlideInUp {
animation-name: fadeSlideInUp;
}
.wow {
backface-visibility: hidden;
}
/*
|
||||
*
|
||||
* Preloader
|
||||
*/
.preloader {
position: fixed;
left: 0;
top: 0;
bottom: 0;
right: 0;
z-index: 10000;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 20px;
transition: .3s all ease;
pointer-events: none;
backface-visibility: hidden;
}
.preloader::before, .preloader::after {
content: '';
position: absolute;
left: 0;
right: 0;
transition: .2s linear;
transform: translateY(0);
pointer-events: none;
}
.preloader::before {
top: 0;
bottom: 50%;
background: #fff;
}
.preloader::after {
top: 50%;
bottom: 0;
background: #f5f6fa;
}
.preloader.loaded::before, .preloader.loaded::after {
transition: .4s linear;
}
.preloader.loaded::before {
transform: translateY(-100%);
}
.preloader.loaded::after {
transform: translateY(100%);
}
.preloader.loaded .preloader-logo,
.preloader.loaded .preloader-body {
opacity: 0;
visibility: hidden;
transition: 0s;
}
.preloader-logo,
.preloader-body {
transition: 0s .2s;
}
.preloader-logo {
position: relative;
z-index: 10;
transform: translate3d(0, -50%, 0);
padding: 40px;
}
.preloader-body {
position: absolute;
top: 50%;
transform: translate3d(0, -50%, 0);
left: 0;
right: 0;
z-index: 10;
text-align: center;
}
#loadingProgressG {
width: 100vw;
height: 5px;
overflow: hidden;
background: #e8e9ee;
border-radius: 6px;
margin: auto;
}
.loadingProgressG {
background: #0045b6;
margin-top: 0;
margin-left: -100vw;
animation-name: bounce_loadingProgressG;
animation-duration: 2.5s;
animation-iteration-count: infinite;
animation-timing-function: linear;
width: 100vw;
height: 5px;
transition: .5s;
}
@keyframes bounce_loadingProgressG {
0% {
margin-left: -100vw;
}
100% {
margin-left: 100vw;
}
}
/*
|
||||
*
|
||||
* ToTop
|
||||
*/
.ui-to-top {
position: fixed;
right: 15px;
bottom: 15px;
z-index: 100;
width: 48px;
height: 48px;
border-radius: 6px;
color: #fff;
background: #0045b6;
overflow: hidden;
text-align: center;
text-decoration: none;
transition: transform 0.45s ease-in-out, background 0.3s cubic-bezier(0.2, 1, 0.3, 1);
transform: translate3d(0, 100px, 0);
}
.ui-to-top::before, .ui-to-top::after {
content: '\f239';
font-family: 'Material Design Icons';
font-size: 20px;
line-height: 48px;
vertical-align: middle;
transition: transform 0.3s cubic-bezier(0.2, 1, 0.3, 1), opacity 0.3s cubic-bezier(0.2, 1, 0.3, 1);
}
.ui-to-top::before {
display: block;
}
.ui-to-top::after {
position: absolute;
width: 100%;
top: 50%;
left: 0;
opacity: 0;
transform: translate3d(0, 0, 0);
}
.ui-to-top:hover::before {
opacity: 0;
transform: translate3d(0, -30%, 0);
}
.ui-to-top:hover::after {
opacity: 1;
transform: translate3d(0, 0, 0) translateY(-50%);
}
.ui-to-top:hover {
color: #fff;
background: #4854ed;
text-decoration: none;
}
.ui-to-top:focus {
color: #fff;
}
.ui-to-top.active {
transform: translate3d(0, 0, 0);
}
html.mobile .ui-to-top,
html.tablet .ui-to-top {
display: none !important;
}
@media (min-width: 576px) {
.ui-to-top {
right: 40px;
bottom: 40px;
}
}
/*
|
||||
*
|
||||
* RD Navbar
|
||||
*/
@keyframes rd-navbar-slide-down {
0% {
transform: translateY(-100%);
}
100% {
transform: translateY(0);
}
}
@keyframes rd-navbar-slide-up {
0% {
transform: translateY(0);
}
100% {
transform: translateY(-100%);
}
}
.rd-navbar-wrap, .rd-navbar,
.rd-menu,
.rd-navbar-nav,
.rd-navbar-panel, .rd-navbar-static .rd-menu, .rd-navbar-fixed .rd-navbar-nav-wrap, .rd-navbar-fixed .rd-navbar-submenu {
transition: 0.35s all cubic-bezier(0.65, 0.05, 0.36, 1);
}
.rd-navbar--no-transition, .rd-navbar--no-transition * {
transition: none !important;
}
.rd-navbar,
.rd-navbar.rd-navbar--is-clone {
display: none;
}
.rd-navbar.rd-navbar-fixed + .rd-navbar.rd-navbar--is-clone,
.rd-navbar.rd-navbar-sidebar + .rd-navbar.rd-navbar--is-clone {
display: none;
}
.rd-navbar {
display: none;
background: #fff;
}
.rd-navbar-outer {
position: relative;
z-index: 1080;
}
.rd-nav-link {
font: 400 14px/20px "Poppins", sans-serif;
letter-spacing: .08em;
text-transform: uppercase;
}
.rd-navbar-toggle {
display: inline-block;
position: relative;
width: 40px;
height: 40px;
line-height: 40px;
cursor: pointer;
color: #495057;
background-color: transparent;
border: none;
display: none;
}
.rd-navbar-toggle span {
position: relative;
display: block;
margin: auto;
transition: .3s all ease;
}
.rd-navbar-toggle span::after, .rd-navbar-toggle span::before {
content: "";
position: absolute;
left: 0;
top: -6px;
transition: .3s all ease;
}
.rd-navbar-toggle span::after {
top: 5px;
}
.rd-navbar-toggle span::after, .rd-navbar-toggle span::before, .rd-navbar-toggle span {
width: 24px;
height: 2px;
background-color: #495057;
backface-visibility: hidden;
border-radius: 5;
}
.rd-navbar-toggle.active span {
background: transparent;
transition: .01s;
}
.rd-navbar-toggle.active span::before, .rd-navbar-toggle.active span::after {
transform-origin: 50% 50%;
top: 0;
}
.rd-navbar-toggle.active span::before {
transform: rotate(45deg);
}
.rd-navbar-toggle.active span::after {
transform: rotate(-45deg);
}
.rd-navbar-collapse-toggle {
background: none;
border: none;
display: inline-block;
padding: 0;
outline: none;
outline-offset: 0;
cursor: pointer;
-webkit-appearance: none;
display: inline-block;
position: relative;
width: 40px;
height: 40px;
line-height: 40px;
cursor: pointer;
color: #495057;
display: none;
}
.rd-navbar-collapse-toggle::-moz-focus-inner {
border: none;
padding: 0;
}
.rd-navbar-collapse-toggle span {
top: 50%;
margin-top: -2.5px;
}
.rd-navbar-collapse-toggle span, .rd-navbar-collapse-toggle span::before, .rd-navbar-collapse-toggle span::after {
position: absolute;
width: 5px;
height: 5px;
line-height: 5px;
text-align: center;
background: #495057;
left: 50%;
margin-left: -2.5px;
border-radius: 50%;
transition: .3s all ease;
}
.rd-navbar-collapse-toggle span::before, .rd-navbar-collapse-toggle span::after {
content: '';
}
.rd-navbar-collapse-toggle span::before {
bottom: 100%;
margin-bottom: 2.5px;
}
.rd-navbar-collapse-toggle span::after {
top: 100%;
margin-top: 2.5px;
}
.rd-navbar-collapse-toggle.active span {
transform: scale(0.7);
}
.rd-navbar-collapse-toggle.active span::before {
transform: translateY(15px);
}
.rd-navbar-collapse-toggle.active span::after {
transform: translateY(-15px);
}
.rd-navbar-brand a {
display: block;
}
.rd-navbar-search {
position: relative;
display: inline-flex;
}
.rd-navbar-search .form-input {
padding-right: 50px;
}
.rd-navbar-search .rd-search-form-submit {
position: absolute;
top: 0;
bottom: 0;
right: 0;
width: 50px;
padding: 0;
margin: 0;
border: none;
cursor: pointer;
background-color: transparent;
font-size: 20px;
color: #aeb1be;
transition: .33s;
}
.rd-navbar-search .rd-search-form-submit:hover {
color: #0045b6;
}
.rd-navbar-search .rd-search-results-live {
pointer-events: none;
}
.rd-navbar-search .rd-search-results-live > * {
pointer-events: auto;
}
.rd-navbar-search-toggle {
background: none;
border: none;
display: inline-block;
padding: 0;
outline: none;
outline-offset: 0;
cursor: pointer;
-webkit-appearance: none;
}
.rd-navbar-search-toggle::-moz-focus-inner {
border: none;
padding: 0;
}
.rd-navbar-dropdown {
display: none;
}
.rd-navbar-popup {
position: absolute;
padding: 15px 25px 20px 20px;
width: calc(100vw - 10px);
border-radius: 6px;
opacity: 0;
visibility: hidden;
transition: .2s;
overflow: hidden;
background-color: #495057;
}
.rd-navbar-popup::before {
content: '';
position: absolute;
right: 0;
left: 0;
top: 0;
bottom: 0;
z-index: -1;
transform: scale3d(1, 0.1, 1);
transform-origin: 50% 0;
background: #495057;
border-radius: inherit;
transition: .5s;
}
.rd-navbar-popup > * {
position: relative;
z-index: 1;
opacity: 0;
visibility: hidden;
transition: .5s;
transform-origin: 50% 0;
transform: scale3d(1, 0.9, 1);
}
.rd-navbar-popup.active {
opacity: 1;
visibility: visible;
}
.rd-navbar-popup.active > * {
opacity: Line truncated
|
||||
* @subsection RD Navbar Static
|
||||
*/
.rd-navbar-static {
display: block;
position: relative;
}
.rd-navbar-static .rd-nav-item {
display: inline-block;
}
.rd-navbar-static .rd-nav-item.focus .rd-nav-link, .rd-navbar-static .rd-nav-item.opened .rd-nav-link {
color: rgba(255, 255, 255, 0.5);
background: transparent;
}
.rd-navbar-static .rd-nav-item.focus > .rd-navbar-submenu-toggle, .rd-navbar-static .rd-nav-item.opened > .rd-navbar-submenu-toggle {
color: #fff;
}
.rd-navbar-static .rd-nav-item.active .rd-nav-link {
color: rgba(255, 255, 255, 0.5);
background: transparent;
}
.rd-navbar-static .rd-nav-item.active > .rd-navbar-submenu-toggle {
color: #fff;
}
.rd-navbar-static .rd-nav-item.focus > .rd-navbar-submenu-toggle::before,
.rd-navbar-static .rd-nav-item.opened > .rd-navbar-submenu-toggle::before,
.rd-navbar-static .rd-nav-item .rd-nav-link:hover + .rd-navbar-submenu-toggle::before {
transform: rotate(180deg);
color: rgba(255, 255, 255, 0.5);
}
.rd-navbar-static .rd-nav-item > .rd-navbar-submenu-toggle {
margin-left: 4px;
font-family: "Material Design Icons";
font-size: 16px;
cursor: pointer;
color: #fff;
}
.rd-navbar-static .rd-nav-item > .rd-navbar-submenu-toggle::before {
position: relative;
display: inline-block;
transition: .22s;
content: '\f236';
}
.rd-navbar-static .rd-nav-item > .rd-navbar-submenu-toggle:hover {
color: rgba(255, 255, 255, 0.4);
}
.rd-navbar-static .rd-nav-item > .rd-navbar-submenu {
margin-top: 20px;
}
.rd-navbar-static .rd-nav-item + .rd-nav-item {
margin-left: 35px;
}
.rd-navbar-static .rd-nav-link {
position: relative;
display: inline-block;
color: #fff;
transition: .25s;
padding-bottom: 2px;
}
.rd-navbar-static .rd-nav-link:hover {
color: rgba(255, 255, 255, 0.4);
}
.rd-navbar-static .rd-menu {
position: absolute;
z-index: 15;
display: block;
padding: 16px 27px;
margin-top: 22px;
margin-left: -27px;
visibility: hidden;
opacity: 0;
text-align: left;
box-shadow: 0 5px 10px 1px rgba(20, 20, 28, 0.3);
border-radius: 6px;
transform: translate3d(0, 30px, 0);
}
.rd-navbar-static .rd-dropdown-item + .rd-dropdown-item,
.rd-navbar-static .rd-megamenu-list-item + .rd-megamenu-list-item {
margin-top: 7px;
}
.rd-navbar-static .rd-navbar-dropdown {
position: absolute;
left: 0;
width: 290px;
background: #232426;
z-index: 5;
}
.rd-navbar-static .rd-navbar-dropdown .rd-navbar-dropdown {
top: -1px;
left: 100%;
z-index: 2;
margin-top: -15px;
margin-left: 15px;
transform: translate3d(30px, 0, 0);
}
.rd-navbar-static .rd-navbar-dropdown .rd-navbar-dropdown.rd-navbar-open-left {
left: auto;
right: 100%;
margin-left: 0;
margin-right: 15px;
transform: translate3d(-30px, 0, 0);
}
.rd-navbar-static .rd-dropdown-item.focus .rd-dropdown-link, .rd-navbar-static .rd-dropdown-item.opened .rd-dropdown-link {
color: #fff;
}
.rd-navbar-static .rd-dropdown-link {
color: #aeb1be;
}
.rd-navbar-static .rd-dropdown-link:hover {
color: #fff;
}
.rd-navbar-static .rd-navbar-dropdown li > a,
.rd-navbar-static .rd-megamenu-list li > a {
position: relative;
left: -13px;
display: flex;
padding: 4px 18px 4px 0;
text-align: left;
}
.rd-navbar-static .rd-navbar-dropdown li > a, .rd-navbar-static .rd-navbar-dropdown li > a:focus, .rd-navbar-static .rd-navbar-dropdown li > a:active,
.rd-navbar-static .rd-megamenu-list li > a,
.rd-navbar-static .rd-megamenu-list li > a:focus,
.rd-navbar-static .rd-megamenu-list li > a:active {
color: #aeb1be;
}
.rd-navbar-static .rd-navbar-dropdown li > a:hover,
.rd-navbar-static .rd-megamenu-list li > a:hover {
color: #fff;
}
.rd-navbar-static .rd-navbar-dropdown li > a, .rd-navbar-static .rd-navbar-dropdown li > a::before,
.rd-navbar-static .rd-megamenu-list li > a,
.rd-navbar-static .rd-megamenu-list li > a::before {
transition: all .2s ease-in-out;
}
.rd-navbar-static .rd-navbar-dropdown li > a::before,
.rd-navbar-static .rd-megamenu-list li > a::before {
position: relative;
top: -1px;
left: -6px;
display: inline-block;
content: '\f238';
font-family: 'Material Design Icons';
font-size: inherit;
line-height: inherit;
color: #fff;
opacity: 0;
visibility: hidden;
}
.rd-navbar-static .rd-navbar-dropdown li.focus > a,
.rd-navbar-static .rd-navbar-dropdown li.opened > a,
.rd-navbar-static .rd-navbar-dropdown li > a:hover,
.rd-navbar-static .rd-megamenu-list li.focus > a,
.rd-navbar-static .rd-megamenu-list li.opened > a,
.rd-navbar-static .rd-megamenu-list li > a:hover {
left: -13px;
padding-left: 18px;
padding-right: 0;
}
.rd-navbar-static .rd-navbar-dropdown li.focus > a::before,
.rd-navbar-static .rd-navbar-dropdown li.opened > a::before,
.rd-navbar-static .rd-navbar-dropdown li > a:hover::before,
.rd-navbar-static .rd-megamenu-list li.focus > a::before,
.rd-navbar-static .rd-megamenu-list li.opened > a::before,
.rd-navbar-static .rd-megamenu-list li > a:hover::before {
left: -7px;
opacity: 1;
visibility: visible;
}
.rd-navbar-static .rd-navbar-megamenu {
display: flex;
left: 0;
overflow: hidden;
max-width: 7Line truncated
|
||||
*
|
||||
* RD Navbar Fixed
|
||||
*/
.rd-navbar-fixed {
display: block;
width: 100%;
}
.rd-navbar-fixed .rd-navbar-toggle {
display: inline-block;
}
.rd-navbar-fixed .rd-navbar-brand {
position: relative;
top: -2px;
margin-left: 12px;
font-size: 0;
line-height: 0;
text-align: left;
}
.rd-navbar-fixed .rd-navbar-brand img {
max-width: 160px;
max-height: 58px;
width: auto;
height: auto;
}
.rd-navbar-fixed .rd-navbar-panel {
position: fixed;
left: 0;
top: 0;
right: 0;
z-index: 1080;
display: flex;
align-items: center;
height: 56px;
padding: 8px;
}
.rd-navbar-fixed .rd-navbar-nav-wrap {
position: fixed;
left: 0;
top: -56px;
bottom: -56px;
z-index: 1079;
width: 270px;
padding: 112px 0 81px;
overflow-y: auto;
overflow-x: hidden;
-webkit-overflow-scrolling: touch;
font-size: 14px;
line-height: 34px;
transform: translateX(-110%);
}
.rd-navbar-fixed .rd-navbar-nav-wrap::-webkit-scrollbar {
width: 4px;
}
.rd-navbar-fixed .rd-navbar-nav-wrap::-webkit-scrollbar-thumb {
background: #1d73ff;
border: none;
border-radius: 0;
opacity: .2;
}
.rd-navbar-fixed .rd-navbar-nav-wrap::-webkit-scrollbar-track {
background: #0045b6;
border: none;
border-radius: 0;
}
.rd-navbar-fixed .rd-navbar-nav-wrap.active {
transform: translateX(0);
}
.rd-navbar-fixed .rd-navbar-nav {
display: block;
margin: 15px 0;
height: auto;
text-align: left;
}
.rd-navbar-fixed .rd-nav-item {
text-align: left;
}
.rd-navbar-fixed .rd-nav-item + .rd-nav-item {
margin-top: 4px;
}
.rd-navbar-fixed .rd-nav-link {
display: block;
padding: 14px 56px 14px 18px;
}
.rd-navbar-fixed li.opened > .rd-navbar-dropdown {
padding: 4px 0 0;
}
.rd-navbar-fixed li.opened > .rd-navbar-megamenu {
padding-top: 15px;
padding-bottom: 15px;
}
.rd-navbar-fixed li.opened > .rd-menu {
opacity: 1;
height: auto;
}
.rd-navbar-fixed li.opened > .rd-navbar-submenu-toggle::after {
transform: rotate(180deg);
}
.rd-navbar-fixed .rd-menu {
display: none;
transition: opacity 0.3s, height 0.4s ease;
opacity: 0;
height: 0;
overflow: hidden;
}
.rd-navbar-fixed .rd-navbar-submenu {
position: relative;
}
.rd-navbar-fixed .rd-navbar-submenu .rd-navbar-dropdown .rd-navbar-submenu-toggle:after {
height: 34px;
line-height: 34px;
}
.rd-navbar-fixed .rd-navbar-submenu .rd-navbar-dropdown > li > a {
padding-left: 30px;
}
.rd-navbar-fixed .rd-navbar-submenu .rd-navbar-dropdown li li > a,
.rd-navbar-fixed .rd-navbar-submenu .rd-navbar-megamenu ul li li > a {
padding-left: 46px;
}
.rd-navbar-fixed .rd-navbar-submenu.opened > .rd-navbar-dropdown,
.rd-navbar-fixed .rd-navbar-submenu.opened > .rd-navbar-megamenu {
display: block;
}
.rd-navbar-fixed .rd-megamenu-list > li > a,
.rd-navbar-fixed .rd-navbar-dropdown > li > a {
display: block;
padding: 9px 56px 9px 16px;
font-size: 14px;
line-height: 1.5;
}
.rd-navbar-fixed .rd-megamenu-list > li + li,
.rd-navbar-fixed .rd-navbar-dropdown > li + li {
margin-top: 3px;
}
.rd-navbar-fixed .rd-megamenu-list > li > a {
padding-left: 30px;
}
.rd-navbar-fixed .rd-navbar-megamenu .rd-megamenu-title {
position: relative;
display: block;
padding: 0 18px 7px;
font-size: 16px;
line-height: 1.5;
}
.rd-navbar-fixed .rd-navbar-megamenu .rd-megamenu-title::after {
content: '';
position: absolute;
left: 20px;
right: 20px;
bottom: 0;
border-bottom: 1px solid;
}
.rd-navbar-fixed .rd-navbar-megamenu * + .rd-megamenu-list {
margin-top: 11px;
}
.rd-navbar-fixed .rd-navbar-megamenu * + .rd-megamenu-title {
margin-top: 20px;
}
.rd-navbar-fixed .rd-navbar-megamenu > li + li {
margin-top: 20px;
}
.rd-navbar-fixed .rd-navbar-submenu-toggle {
cursor: pointer;
}
.rd-navbar-fixed .rd-navbar-submenu-toggle::after {
content: '\f107';
position: absolute;
top: 0;
right: 0;
width: 56px;
height: 48px;
font: 400 14px "FontAwesome";
line-height: 48px;
text-align: center;
transition: 0.4s all ease;
z-index: 2;
cursor: pointer;
}
.rd-navbar-fixed .rd-navbar-collapse-toggle {
display: block;
top: 8px;
z-index: 1081;
}
.rd-navbar-fixed .rd-navbar-collapse-content {
position: fixed;
right: 0;
top: 56px;
z-index: 1079;
transform: translate3d(0, -10px, 0);
padding: 30px;
width: auto;
border-radius: 0 0 0 6px;
text-align: left;
font-size: 14px;
opacity: 0;
visibility: hidden;
transition: .3s;
}
.rd-navbar-fixed .rd-navbar-collapse-content.active {
transform: translate3d(0, 0, 0);
opacity: 1;
visibility: visible;
}
.rd-navbar-fixed .rd-navbar-collapse-content > * + * {
margin-top: 25px;
}
.rd-navbar-fixed .rd-navbar-main-outer,
.rd-navbar-fixed .rd-navbar-main-element {
position: absolute;
float: left;
width: 100%;
}
.rd-navbar-fixed .rd-navbar-search .rd-search {
position: fixed;
right: 0;
left: 0;
top: 56px;
z-index: 1079;
width: 100%;
opacity: 0;
visibility: hidden;
transition: .3s;
transform: translate3d(0, -100%, 0);
}
.rd-navbar-fixed .rd-navbar-search .rd-search-results-live {
display: none;
}
.rd-navbar-fixed .rd-navbar-search .form-input {
padding-right: 60px;
}
Line truncated
|
||||
*
|
||||
* RD Navbar Sidebar
|
||||
*/
.rd-navbar-sidebar {
display: block;
background: #fff;
}
.rd-navbar-sidebar .rd-navbar-main-outer {
padding-left: 15px;
padding-right: 15px;
}
.rd-navbar-sidebar .rd-navbar-main {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
padding: 22px 60px 22px 0;
max-width: 1200px;
margin-left: auto;
margin-right: auto;
transition: 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}
.rd-navbar-sidebar .rd-navbar-main-element {
display: flex;
align-items: center;
}
.rd-navbar-sidebar .rd-navbar-main-element > * + * {
margin-left: 20px;
}
.rd-navbar-sidebar .rd-navbar-toggle {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
display: block;
z-index: 1102;
}
.rd-navbar-sidebar .rd-navbar-panel {
min-width: 200px;
text-align: center;
}
.rd-navbar-sidebar .rd-navbar-brand img {
width: auto;
height: auto;
max-width: 200px;
max-height: 200px;
}
.rd-navbar-sidebar .rd-navbar-nav-wrap {
position: fixed;
top: 0;
bottom: 0;
right: 0;
z-index: 1101;
width: 450px;
padding: 94px 0 0 0;
background: #fff;
transition: 0.5s cubic-bezier(0.4, 0, 0.2, 1);
transform: translateX(100%);
box-shadow: 0 0 13px 0 rgba(174, 177, 190, 0.16);
}
.rd-navbar-sidebar .rd-navbar-nav-wrap.active {
transition-delay: .1s;
transform: translateX(0);
}
.rd-navbar-sidebar .rd-navbar-nav {
height: calc(100vh - 100px);
overflow-x: hidden;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
border-top: 1px solid #e8e9ee;
}
.rd-navbar-sidebar .rd-nav-item {
position: relative;
display: block;
padding: 19px 30px 19px 40px;
}
.rd-navbar-sidebar .rd-nav-item.active .rd-nav-link {
color: #0045b6;
}
.rd-navbar-sidebar .rd-nav-item .rd-nav-link,
.rd-navbar-sidebar .rd-nav-item > .rd-navbar-submenu-toggle {
font-size: 18px;
}
.rd-navbar-sidebar .rd-nav-item + .rd-nav-item {
border-top: 1px solid #e8e9ee;
}
.rd-navbar-sidebar .rd-nav-item:last-child {
border-bottom: 1px solid #e8e9ee;
margin-bottom: 30px;
}
.rd-navbar-sidebar .rd-nav-link {
max-width: calc(100% - 30px);
word-break: break-all;
font-size: 18px;
line-height: 1.4;
text-transform: none;
color: #aeb1be;
}
.rd-navbar-sidebar .rd-nav-link:hover {
color: #0045b6;
}
.rd-navbar-sidebar .rd-navbar-submenu .opened > .rd-navbar-submenu-toggle::after {
transform: rotate(180deg);
}
.rd-navbar-sidebar .rd-navbar-submenu > .rd-navbar-dropdown,
.rd-navbar-sidebar .rd-navbar-submenu > .rd-navbar-megamenu {
display: none;
opacity: 0;
visibility: hidden;
will-change: opacity, visibility;
transition: opacity .2s;
}
.rd-navbar-sidebar .rd-navbar-submenu.opened > .rd-navbar-dropdown,
.rd-navbar-sidebar .rd-navbar-submenu.opened > .rd-navbar-megamenu {
display: block;
opacity: 1;
visibility: visible;
}
.rd-navbar-sidebar .rd-navbar-submenu > .rd-navbar-submenu > .rd-navbar-dropdown,
.rd-navbar-sidebar .rd-navbar-submenu > .rd-navbar-submenu > .rd-navbar-megamenu {
transform: translateY(30px);
}
.rd-navbar-sidebar .rd-navbar-submenu > .rd-navbar-submenu.opened > .rd-navbar-dropdown,
.rd-navbar-sidebar .rd-navbar-submenu > .rd-navbar-submenu.opened > .rd-navbar-megamenu {
transform: translateY(0);
}
.rd-navbar-sidebar .rd-navbar-submenu > .rd-navbar-submenu .rd-navbar-submenu > .rd-navbar-dropdown {
transform: translateX(-20px);
}
.rd-navbar-sidebar .rd-navbar-submenu > .rd-navbar-submenu .rd-navbar-submenu.opened > .rd-navbar-dropdown {
transform: translateX(0);
}
.rd-navbar-sidebar .rd-nav-item > .rd-navbar-submenu-toggle,
.rd-navbar-sidebar .rd-nav-item .rd-navbar--has-dropdown > .rd-navbar-submenu-toggle {
position: absolute;
top: 0;
right: 0;
padding-top: inherit;
padding-right: inherit;
padding-left: 10px;
margin-bottom: inherit;
display: inline-block;
width: 30px;
margin-left: 5px;
text-align: center;
cursor: pointer;
color: #495057;
}
.rd-navbar-sidebar .rd-nav-item > .rd-navbar-submenu-toggle:hover,
.rd-navbar-sidebar .rd-nav-item .rd-navbar--has-dropdown > .rd-navbar-submenu-toggle:hover {
color: #0045b6;
}
.rd-navbar-sidebar .rd-nav-item > .rd-navbar-submenu-toggle::after,
.rd-navbar-sidebar .rd-nav-item .rd-navbar--has-dropdown > .rd-navbar-submenu-toggle::after {
content: '\f107';
position: relative;
display: inline-block;
font-family: "FontAwesome";
font-size: inherit;
line-height: inherit;
text-align: center;
vertical-align: middle;
transition: 0.4s all ease;
z-index: 2;
will-change: transform;
}
.rd-navbar-sidebar .rd-nav-item .rd-navbar--has-dropdown > .rd-navbar-submenu-toggle {
font-size: 14px;
color: #aeb1be;
margin-left: 7px;
}
.rd-navbar-sidebar .rd-menu {
margin-top: 31px;
}
.rd-navbar-sidebar .rd-navbar-dropdown,
.rd-navbar-sidebar .rd-megamenu-list {
font-size: 14px;
}
.rd-navbar-sidebar .rd-navbar-dropdown li > a,
.rd-navbar-sidebar .rd-megamenu-list li > a {
position: relative;
left: -13px;
display: flex;
padding: 4px 18px 4px 0;
text-align: left;
}
.rd-navbar-sidebar .rd-navbar-dropdown li > a, .rd-navbar-sidebar .Line truncated
|
||||
*
|
||||
* RD Navbar Minimal
|
||||
*
|
||||
*/
.rd-navbar-minimal.rd-navbar-static {
border-bottom: 1px solid transparent;
}
.rd-navbar-minimal.rd-navbar-static .rd-navbar-main-outer {
padding-left: 15px;
padding-right: 15px;
}
.rd-navbar-minimal.rd-navbar-static .rd-navbar-main {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1170px;
padding: 20px 0;
margin-left: auto;
margin-right: auto;
}
.rd-navbar-minimal.rd-navbar-static .rd-navbar-main-element {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
min-width: 690px;
}
.rd-navbar-minimal.rd-navbar-static .rd-navbar-brand img {
width: auto;
height: auto;
max-width: 200px;
max-height: 200px;
}
.rd-navbar-minimal.rd-navbar-static .rd-navbar-megamenu {
margin-top: 24px;
width: calc(100% + 27px + 15px);
}
.rd-navbar-minimal.rd-navbar-static .rd-navbar-search-toggle span {
font-size: 20px;
}
@media (min-width: 1200px) {
.rd-navbar-minimal.rd-navbar-static .rd-navbar-main {
padding: 30px 0;
}
.rd-navbar-minimal.rd-navbar-static .rd-menu {
margin-top: 34px;
}
}
.rd-navbar-minimal.rd-navbar-static.rd-navbar--is-stuck, .rd-navbar-minimal.rd-navbar-static.rd-navbar--is-clone {
border-bottom-color: #e8e9ee;
}
.rd-navbar-minimal.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-main, .rd-navbar-minimal.rd-navbar-static.rd-navbar--is-clone .rd-navbar-main {
padding: 20px 0;
}
.rd-navbar-minimal.rd-navbar-static.rd-navbar--is-stuck .rd-menu, .rd-navbar-minimal.rd-navbar-static.rd-navbar--is-clone .rd-menu {
margin-top: 24px;
}
.rd-navbar-minimal.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-nav-item > .rd-navbar-submenu, .rd-navbar-minimal.rd-navbar-static.rd-navbar--is-clone .rd-navbar-nav-item > .rd-navbar-submenu {
margin-top: 17px;
}
.rd-navbar-minimal.rd-navbar-fixed .rd-navbar-search-toggle {
position: fixed;
right: 10px;
top: 5px;
}
.rd-navbar-minimal.rd-navbar-fixed .rd-navbar-search .form-input {
border-width: 1px 0 1px 0;
border-radius: 0;
}
.rd-navbar-minimal-wide.rd-navbar-static .rd-navbar-main {
padding: 54px 0;
}
.rd-navbar-minimal-wide.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-main {
padding: 21px 0;
}
.context-dark .rd-navbar-minimal .rd-nav-link, .bg-gray-700 .rd-navbar-minimal .rd-nav-link, .bg-gray-800 .rd-navbar-minimal .rd-nav-link, .bg-primary .rd-navbar-minimal .rd-nav-link, .bg-primary-darker .rd-navbar-minimal .rd-nav-link,
.context-dark .rd-navbar-minimal .rd-navbar-submenu-toggle,
.bg-gray-700 .rd-navbar-minimal .rd-navbar-submenu-toggle,
.bg-gray-800 .rd-navbar-minimal .rd-navbar-submenu-toggle,
.bg-primary .rd-navbar-minimal .rd-navbar-submenu-toggle,
.bg-primary-darker .rd-navbar-minimal .rd-navbar-submenu-toggle,
.context-dark .rd-navbar-minimal .rd-navbar-search-toggle,
.bg-gray-700 .rd-navbar-minimal .rd-navbar-search-toggle,
.bg-gray-800 .rd-navbar-minimal .rd-navbar-search-toggle,
.bg-primary .rd-navbar-minimal .rd-navbar-search-toggle,
.bg-primary-darker .rd-navbar-minimal .rd-navbar-search-toggle {
color: #fff;
}
.context-dark .rd-navbar-minimal.rd-navbar-static, .bg-gray-700 .rd-navbar-minimal.rd-navbar-static, .bg-gray-800 .rd-navbar-minimal.rd-navbar-static, .bg-primary .rd-navbar-minimal.rd-navbar-static, .bg-primary-darker .rd-navbar-minimal.rd-navbar-static {
background-color: transparent;
}
.context-dark .rd-navbar-minimal.rd-navbar-static .rd-nav-item.opened .rd-nav-link, .bg-gray-700 .rd-navbar-minimal.rd-navbar-static .rd-nav-item.opened .rd-nav-link, .bg-gray-800 .rd-navbar-minimal.rd-navbar-static .rd-nav-item.opened .rd-nav-link, .bg-primary .rd-navbar-minimal.rd-navbar-static .rd-nav-item.opened .rd-nav-link, .bg-primary-darker .rd-navbar-minimal.rd-navbar-static .rd-nav-item.opened .rd-nav-link,
.context-dark .rd-navbar-minimal.rd-navbar-static .rd-nav-item.focus .rd-nav-link,
.bg-gray-700 .rd-navbar-minimal.rd-navbar-static .rd-nav-item.focus .rd-nav-link,
.bg-gray-800 .rd-navbar-minimal.rd-navbar-static .rd-nav-item.focus .rd-nav-link,
.bg-primary .rd-navbar-minimal.rd-navbar-static .rd-nav-item.focus .rd-nav-link,
.bg-primary-darker .rd-navbar-minimal.rd-navbar-static .rd-nav-item.focus .rd-nav-link,
.context-dark .rd-navbar-minimal.rd-navbar-static .rd-nav-item.active .rd-nav-link,
.bg-gray-700 .rd-navbar-minimal.rd-navbar-static .rd-nav-item.active .rd-nav-link,
.bg-gray-800 .rd-navbar-minimal.rd-navbar-static .rd-nav-item.active .rd-nav-link,
.bg-primary .rd-navbar-minimal.rd-navbar-static .rd-nav-item.active .rd-nav-link,
.bg-primary-darker .rd-navbar-minimal.rd-navbar-static .rd-nav-item.active .rd-nav-link,
.context-dark .rd-navbar-minimal.rd-navbar-static .rd-nav-item.opened .rd-navbar-submenu-toggle,
.bg-gray-700 .rd-navbar-minimal.rd-navbar-static .rd-nav-item.opened .rd-navbar-submenu-toggle,
.bg-gray-800 .rd-navbar-minimal.rd-navbar-static .rd-nav-item.opened .rd-navbar-submenu-toggle,
.bg-primary .rd-navbar-minimal.rd-navbar-static .rd-nav-item.opened .rd-navbar-submenu-toggle,
.bg-primary-Line truncated
|
||||
*
|
||||
* RD Navbar Corporate
|
||||
*
|
||||
*/
.rd-navbar-corporate.rd-navbar-static .rd-navbar-aside-outer,
.rd-navbar-corporate.rd-navbar-static .rd-navbar-main-outer {
padding-left: 15px;
padding-right: 15px;
}
.rd-navbar-corporate.rd-navbar-static .rd-navbar-aside,
.rd-navbar-corporate.rd-navbar-static .rd-navbar-main {
max-width: 1170px;
margin-left: auto;
margin-right: auto;
}
.rd-navbar-corporate.rd-navbar-static .rd-navbar-aside {
display: flex;
align-items: center;
justify-content: space-between;
padding: 30px 0 40px;
}
.rd-navbar-corporate.rd-navbar-static .rd-navbar-main-outer {
background: rgba(51, 51, 51, 0.1);
position: absolute;
top: 100%;
z-index: 10;
width: 100%;
}
.rd-navbar-corporate.rd-navbar-static .rd-navbar-main {
position: relative;
padding: 16px 0;
}
.rd-navbar-corporate.rd-navbar-static .rd-navbar-nav-wrap {
position: relative;
display: flex;
flex-direction: row-reverse;
align-items: center;
justify-content: space-between;
min-width: 690px;
}
.ie-10 .rd-navbar-corporate.rd-navbar-static .rd-navbar-collapse,
.ie-11 .rd-navbar-corporate.rd-navbar-static .rd-navbar-collapse {
width: 100%;
max-width: 870px;
}
.ie-10 .rd-navbar-corporate.rd-navbar-static .unit,
.ie-11 .rd-navbar-corporate.rd-navbar-static .unit {
flex: auto;
}
.rd-navbar-corporate.rd-navbar-static .rd-navbar-panel + .rd-navbar-collapse {
margin-left: 50px;
}
.rd-navbar-corporate.rd-navbar-static .rd-navbar-collapse-content {
display: flex;
align-items: center;
justify-content: center;
}
.rd-navbar-corporate.rd-navbar-static .rd-navbar-collapse-content .button {
flex-shrink: 0;
}
.rd-navbar-corporate.rd-navbar-static .rd-navbar-collapse-content > * {
margin-top: 0;
}
.rd-navbar-corporate.rd-navbar-static .rd-navbar-collapse-content > * + * {
margin-left: 50px;
}
.rd-navbar-corporate.rd-navbar-static .rd-menu {
margin-top: 21px;
}
.rd-navbar-corporate.rd-navbar-static .rd-navbar-megamenu {
margin-top: 24px;
}
@media (min-width: 1200px) {
.rd-navbar-corporate.rd-navbar-static .rd-navbar-collapse-content > * + * {
margin-left: 92px;
}
.rd-navbar-corporate.rd-navbar-static .rd-nav-item + .rd-nav-item {
margin-left: 55px;
}
}
.rd-navbar-corporate.rd-navbar-static.rd-navbar--is-stuck, .rd-navbar-corporate.rd-navbar-static.rd-navbar--is-clone {
border-bottom-color: #e8e9ee;
}
.rd-navbar-corporate.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-aside-outer, .rd-navbar-corporate.rd-navbar-static.rd-navbar--is-clone .rd-navbar-aside-outer {
display: none;
}
.rd-navbar-corporate.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-main-outer, .rd-navbar-corporate.rd-navbar-static.rd-navbar--is-clone .rd-navbar-main-outer {
background: #232426;
box-shadow: 0 5px 10px 0px rgba(20, 20, 28, 0.3);
}
.rd-navbar-corporate.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-nav-item > .rd-navbar-submenu, .rd-navbar-corporate.rd-navbar-static.rd-navbar--is-clone .rd-navbar-nav-item > .rd-navbar-submenu {
margin-top: 17px;
}
.rd-navbar-corporate.rd-navbar-fixed .rd-navbar-search {
margin: 20px 5px;
}
.rd-navbar-corporate.rd-navbar-fixed .rd-navbar-search-toggle {
display: none;
}
.rd-navbar-corporate.rd-navbar-fixed .rd-search {
position: relative;
top: 0;
left: 0;
transform: none;
opacity: 1;
visibility: visible;
z-index: 1;
}
.rd-navbar-corporate.rd-navbar-fixed .rd-navbar-nav {
margin: 0;
}
/**
|
||||
*
|
||||
* RD Navbar Thin
|
||||
*
|
||||
*/
.rd-navbar-thin.rd-navbar-static {
background-color: #495057;
border-bottom: 1px solid transparent;
}
.rd-navbar-thin.rd-navbar-static .rd-navbar-main-outer {
padding-left: 15px;
padding-right: 15px;
}
.rd-navbar-thin.rd-navbar-static .rd-navbar-main {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1170px;
padding: 23px 0;
margin-left: auto;
margin-right: auto;
}
.rd-navbar-thin.rd-navbar-static .rd-navbar-nav-wrap {
position: absolute;
top: 0;
bottom: 0;
left: 200px;
right: 80px;
z-index: 102;
display: flex;
align-items: center;
justify-content: flex-end;
min-width: 690px;
background: #495057;
opacity: 0;
visibility: hidden;
transition: .44s ease-in-out;
}
.rd-navbar-thin.rd-navbar-static .rd-navbar-nav-wrap .rd-navbar-brand {
display: none;
}
.rd-navbar-thin.rd-navbar-static .rd-navbar-nav-wrap.active {
opacity: 1;
visibility: visible;
}
.rd-navbar-thin.rd-navbar-static .rd-navbar-panel {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
padding-right: 50px;
}
.ie-10 .rd-navbar-thin.rd-navbar-static .rd-navbar-panel,
.ie-11 .rd-navbar-thin.rd-navbar-static .rd-navbar-panel {
justify-content: flex-start;
}
.ie-10 .rd-navbar-thin.rd-navbar-static .rd-navbar-block,
.ie-11 .rd-navbar-thin.rd-navbar-static .rd-navbar-block {
width: 100%;
justify-content: flex-end;
}
.rd-navbar-thin.rd-navbar-static .rd-navbar-toggle {
position: absolute;
right: 0;
top: 50%;
display: block;
transform: translate3d(0, -50%, 0);
}
.rd-navbar-thin.rd-navbar-static .rd-navbar-block {
display: flex;
align-items: center;
}
.rd-navbar-thin.rd-navbar-static .rd-navbar-brand {
max-width: 300px;
}
.rd-navbar-thin.rd-navbar-static .rd-navbar-brand img {
width: auto;
height: auto;
max-width: 200px;
max-height: 200px;
}
.rd-navbar-thin.rd-navbar-static .rd-nav-link,
.rd-navbar-thin.rd-navbar-static .rd-navbar-submenu-toggle,
.rd-navbar-thin.rd-navbar-static .rd-navbar-search-toggle {
color: #fff;
}
.rd-navbar-thin.rd-navbar-static .rd-nav-item.opened .rd-nav-link,
.rd-navbar-thin.rd-navbar-static .rd-nav-item.focus .rd-nav-link,
.rd-navbar-thin.rd-navbar-static .rd-nav-item.active .rd-nav-link,
.rd-navbar-thin.rd-navbar-static .rd-nav-item.opened .rd-navbar-submenu-toggle,
.rd-navbar-thin.rd-navbar-static .rd-nav-item.focus .rd-navbar-submenu-toggle,
.rd-navbar-thin.rd-navbar-static .rd-nav-item.active .rd-navbar-submenu-toggle,
.rd-navbar-thin.rd-navbar-static .rd-nav-link:hover,
.rd-navbar-thin.rd-navbar-static .rd-nav-link:hover ~ .rd-navbar-submenu-toggle,
.rd-navbar-thin.rd-navbar-static .rd-navbar-search-toggle:hover {
color: #1d73ff;
}
.rd-navbar-thin.rd-navbar-static .rd-menu {
margin-top: 27px;
}
.rd-navbar-thin.rd-navbar-static .rd-navbar-megamenu {
margin-top: 24px;
width: calc(100% + 27px + 15px);
}
.rd-navbar-thin.rd-navbar-static .rd-navbar-search {
position: static;
}
.rd-navbar-thin.rd-navbar-static * + .rd-navbar-search-toggle {
margin-left: 60px;
}
.rd-navbar-thin.rd-navbar-static .rd-search {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
display: flex;
width: calc(100% - 70px);
margin: 0;
}
.rd-navbar-thin.rd-navbar-static .rd-search .form-wrap {
display: flex;
width: 100%;
background: #495057;
}
.rd-navbar-thin.rd-navbar-static .rd-search .form-wrap::before {
content: '\f43b';
position: absolute;
top: 50%;
transform: translate3d(0, -50%, 0);
font-family: 'Material Design Icons';
font-size: 30px;
line-height: 1;
color: #fff;
}
.rd-navbar-thin.rd-navbar-static .rd-search .form-input,
.rd-navbar-thin.rd-navbar-static .rd-search .form-label {
padding-left: 40px;
font-size: 30px;
color: #fff;
}
.rd-navbar-thin.rd-navbar-static .rd-search .form-input {
background-color: transparent;
border: 0;
border-radius: 0;
}
.rd-navbar-thin.rd-navbar-static .rd-search .form-label {
top: 50%;
transform: translate3d(0, -50%, 0);
}
.rd-navbar-thin.rd-navbar-static .rd-search-results-live {
height: 100vh;
margin: 1px 0 0 0;
}
.rd-navbar-thin.rd-navbar-static .search-list {
display: flex;
flex-wrap: wrap;
margin-bottom: -20px;
}
.rd-navbar-thin.rd-navbar-static .search-list-item {
width: 25%;
padding-left: 15px;
padding-right: 15px;
margin-bottom: 20px;
}
.rd-navbar-thin.rd-navbar-static .search-list-item + .search-list-item {
margin-top: 0;
}
.rd-navbar-thin.rd-navbar-static .rd-navbar-search-toggle {
position: relative;
z-index: 12;
}
.rd-navbar-thin.rd-navbar-static .rd-navbar-popup {
left: 50%;
z-index: 110;
transform: translateX(-50%);
margin-top: 30px;
}
.rd-navbar-thin.rd-navbar-static .list-inline-bordered {
position: relative;
}
@media (min-width: 992px) and (max-width: 1199.98px) {
.rd-navbar-thin.rd-navbar-static .rd-nav-item + .rd-nav-item {
margin-left: 30px;
}
}
@media (min-width: 1200px) {
.rd-navbar-thin.rd-navbar-static .rd-navbar-panel {
padding-right: 70px;
}
.rd-navbar-thin.rd-navbar-statLine truncated
|
||||
*
|
||||
* Swiper
|
||||
*/
.swiper-container {
position: relative;
display: flex;
margin: 0 auto;
overflow: hidden;
list-style: none;
padding: 0;
/* Fix of Webkit flickering */
z-index: 1;
pointer-events: none;
}
.swiper-container, .swiper-container * {
backface-visibility: hidden;
}
.swiper-container-no-flexbox .swiper-slide {
float: left;
}
.swiper-container-vertical > .swiper-wrapper {
flex-direction: column;
}
.swiper-wrapper {
position: relative;
z-index: 1;
display: flex;
align-self: stretch;
align-items: stretch;
width: 100%;
height: auto;
min-height: inherit;
transition-property: transform;
box-sizing: content-box;
}
.swiper-container-android .swiper-slide,
.swiper-wrapper {
transform: translate3d(0px, 0, 0);
}
.swiper-container-multirow > .swiper-wrapper {
flex-wrap: wrap;
}
.swiper-container-free-mode > .swiper-wrapper {
transition-timing-function: ease-out;
margin: 0 auto;
}
.swiper-slide {
flex-shrink: 0;
width: 100%;
height: 100%;
position: relative;
background-size: cover;
transition-property: transform, transform;
pointer-events: auto;
contain: paint;
}
.swiper-invisible-blank-slide {
visibility: hidden;
}
/* Auto Height */
.swiper-container-autoheight, .swiper-container-autoheight .swiper-slide {
height: auto;
}
.swiper-container-autoheight .swiper-wrapper {
align-items: flex-start;
transition-property: transform, height;
}
/* 3D Effects */
.swiper-container-3d {
perspective: 1200px;
}
.swiper-container-3d .swiper-wrapper,
.swiper-container-3d .swiper-slide,
.swiper-container-3d .swiper-slide-shadow-left,
.swiper-container-3d .swiper-slide-shadow-right,
.swiper-container-3d .swiper-slide-shadow-top,
.swiper-container-3d .swiper-slide-shadow-bottom,
.swiper-container-3d .swiper-cube-shadow {
transform-style: preserve-3d;
}
.swiper-container-3d .swiper-slide-shadow-left,
.swiper-container-3d .swiper-slide-shadow-right,
.swiper-container-3d .swiper-slide-shadow-top,
.swiper-container-3d .swiper-slide-shadow-bottom {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: 10;
}
.swiper-container-3d .swiper-slide-shadow-left {
background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
}
.swiper-container-3d .swiper-slide-shadow-right {
background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
}
.swiper-container-3d .swiper-slide-shadow-top {
background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
}
.swiper-container-3d .swiper-slide-shadow-bottom {
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
}
/* IE10 Windows Phone 8 Fixes */
.swiper-container-wp8-horizontal,
.swiper-container-wp8-horizontal > .swiper-wrapper {
touch-action: pan-y;
}
.swiper-container-wp8-vertical,
.swiper-container-wp8-vertical > .swiper-wrapper {
touch-action: pan-x;
}
.swiper-button-prev,
.swiper-button-next {
position: absolute;
top: 50%;
width: 27px;
height: 44px;
margin-top: -22px;
z-index: 10;
cursor: pointer;
background-size: 27px 44px;
background-position: center;
background-repeat: no-repeat;
}
.swiper-button-prev.swiper-button-disabled,
.swiper-button-next.swiper-button-disabled {
opacity: 0.35;
cursor: auto;
pointer-events: none;
}
.swiper-button-lock {
display: none;
}
.swiper-pagination {
position: absolute;
text-align: center;
transition: 300ms opacity;
transform: translate3d(0, 0, 0);
z-index: 10;
}
.swiper-pagination.swiper-pagination-hidden {
opacity: 0;
}
/* Common Styles */
.swiper-pagination-fraction,
.swiper-pagination-custom,
.swiper-container-horizontal > .swiper-pagination-bullets {
bottom: 10px;
left: 0;
width: 100%;
}
/* Bullets */
.swiper-pagination-bullets-dynamic {
overflow: hidden;
font-size: 0;
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet {
transform: scale(0.33);
position: relative;
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active {
transform: scale(1);
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev {
transform: scale(0.66);
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev {
transform: scale(0.33);
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next {
transform: scale(0.66);
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next {
transform: scale(0.33);
}
.swiper-pagination-bullet {
width: 8px;
height: 8px;
display: inline-block;
border-radius: 100%;
background: #000;
}
button.swiper-pagination-bullet {
border: none;
margin: 0;
padding: 0;
box-shadow: none;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
.swiper-pagination-clickable .swiper-pagination-bullet {
cursor: pointer;
}
.swiper-pagination-bullet-active {
opacity: 1;
background: #007aff;
}
.swiper-container-vertical > .swiper-pagination-bullets {
right: 10px;
top: 50%;
transform: translate3d(0px, -50%, 0);
}
Line truncated
|
||||
*
|
||||
* RD Google Map
|
||||
*/
.google-map {
color: #000;
height: 200px;
}
.google-map img {
max-width: none !important;
}
@media (min-width: 576px) {
.google-map {
height: 250px;
}
}
@media (min-width: 768px) {
.google-map {
height: 300px;
}
}
@media (min-width: 992px) {
.google-map {
height: 350px;
}
}
@media (min-width: 1200px) {
.google-map {
height: 766px;
}
}
.ie-10 .google-map,
.ie-11 .google-map {
height: 770px;
}
.map_locations {
display: none;
}
.google-map-container, .google-map {
width: 100%;
}
.google-map-markers {
display: none;
}
/*
|
||||
*
|
||||
* Search Results
|
||||
*/
.rd-search-results-live {
position: absolute;
left: 0;
right: 0;
top: 100%;
max-height: 600px;
overflow-y: auto;
margin: -3px 0 0;
text-align: left;
z-index: 998;
}
.rd-search-results-live #search-results {
position: relative;
padding: 10px 0 0;
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
color: #495057;
background: #fff;
border: 1px solid #c5c6cd;
border-top: 0;
opacity: 0;
visibility: hidden;
transform-origin: 50% 0;
transform: scale(1, 0.9);
transition: .3s all ease;
}
.rd-search-results-live #search-results.active {
opacity: 1;
visibility: visible;
transform: scale(1, 1);
}
.rd-search-results-live #search-results.active .form-input {
border-bottom-left-radius: 0;
}
.rd-search-results-live .search-quick-result {
padding-left: 15px;
padding-right: 15px;
font-family: "Poppins", sans-serif;
font-size: 14px;
font-weight: 500;
letter-spacing: .08em;
line-height: 30px;
text-transform: uppercase;
color: #151515;
}
.rd-search-results-live .search-list {
margin-top: 11px;
}
.rd-search-results-live .search-list li:only-child {
padding: 0 15px 15px;
}
.rd-search-results-live .search-link {
color: #aeb1be;
}
.rd-search-results-live .search-link:hover {
color: #0045b6;
}
.rd-search-results-live .search-error {
padding: 0 0 20px;
font-size: 14px;
line-height: 1.6;
}
.rd-search-results-live .search-title {
position: relative;
font-size: 16px;
font-weight: 400;
color: #151515;
}
.rd-search-results-live .search-title a:hover {
color: #0045b6;
}
.rd-search-results-live .search-link {
display: block;
}
.rd-search-results-live .search-list-item-all {
margin-top: 18px;
width: 100%;
}
.rd-search-results-live .search-submit {
position: relative;
overflow: hidden;
z-index: 0;
display: block;
padding: 10px 20px;
margin: 0 -1px;
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
font-family: "Poppins", sans-serif;
font-size: 12px;
font-weight: 500;
letter-spacing: 0.1em;
text-transform: uppercase;
text-align: center;
color: #fff;
background: #0045b6;
}
.rd-search-results-live .search-submit:hover {
color: #fff;
background: #4854ed;
}
.rd-search-results-live .match {
display: none;
}
.not-empty ~ .rd-search-results-live {
visibility: visible;
opacity: 1;
}
.rd-search-results-live p {
font-size: 14px;
}
.rd-search-results-live .search-list-item {
padding: 0 15px;
}
.rd-search-results-live * + p {
margin-top: 3px;
}
.rd-search-results-live .search-list-item + .search-list-item {
margin-top: 17px;
}
.rd-search-results .search-list {
counter-reset: li;
text-align: left;
padding-left: 0;
font-size: 18px;
list-style-type: none;
overflow: hidden;
}
.rd-search-results .search-list li div {
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
white-space: nowrap;
}
.rd-search-results .search-list li:only-child::before {
display: none;
}
.rd-search-results .search-list-item {
position: relative;
padding-left: 40px;
font-size: 16px;
color: #9b9b9b;
}
.rd-search-results .search-list-item::before {
content: counter(li, decimal) ".";
counter-increment: li;
position: absolute;
left: 0;
top: -0.1em;
line-height: inherit;
}
.rd-search-results .search-title {
position: relative;
color: #0045b6;
}
.rd-search-results .search-title a {
color: inherit;
}
.rd-search-results .search-title a:hover {
color: #343db0;
}
.rd-search-results .search {
color: #fff;
padding: 0 .25em;
background: #0045b6;
}
.rd-search-results .match {
padding: 5px;
font-size: 12px;
line-height: 1.7;
letter-spacing: .1em;
text-transform: uppercase;
color: #000;
}
.rd-search-results .match em {
margin: 0;
font-style: normal;
}
.rd-search-results * + .match {
margin-top: 10px;
}
.rd-search-results .search-list-item + .search-list-item {
margin-top: 40px;
}
* + .rd-search-results {
margin-top: 40px;
}
@media (min-width: 768px) {
.rd-search-results .search-list-item::before {
top: 4px;
}
.rd-search-results * + p {
margin-top: 12px;
}
* + .rd-search-results {
margin-top: 55px;
}
}
@media (min-width: 992px) {
.rd-search-results .search-list-item {
padding-left: 50px;
}
.rd-search-results * + p {
margin-top: 17px;
}
.rd-search-results .search-list-item + .search-list-item {
margin-top: 50px;
}
}
@media (min-width: 1200px) {
* + .rd-search-results {
margin-top: 70px;
}
}
@media (min-width: 1600px) {
.rd-search-results .search-list-item + .search-list-item {
margin-top: 70px;
}
}
.rd-search-classic {
position: relative;
}
.rd-search-classic .form-wrap-inner {
position: relative;
}
.rd-search-classic .form-input {
padding-right: 50px;
}
.rd-search-classic .form-input,
.rd-search-classic .form-label {
letter-spacing: 0;
}
.rd-search-classic .rd-search-submit {
background: none;
border: none;
display: inline-block;
padding: 0;
outline: none;
outline-offset: 0;
cursor: pointer;
-webkit-appearance: none;
position: absolute;
top: 0;
right: 0;
bottomLine truncated
|
||||
*
|
||||
* Isotope
|
||||
*/
@keyframes sprite-animation {
from {
background-position: 0 0;
}
}
[data-isotope-layout] {
z-index: 0;
display: block;
overflow: hidden;
min-height: 160px;
margin-left: -15px;
margin-right: -15px;
transition: .4s all ease;
}
[data-isotope-layout]:after {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 64px;
height: 64px;
margin-top: 15px;
background-image: url("../images/isotope-loader.png");
background-position: -1152px 0;
animation: 0.7s sprite-animation steps(18) infinite;
transition: .4s all ease;
transform: translate3d(-50%, -50%, 0);
}
[data-isotope-layout] [class*="col-"] {
display: block;
opacity: 0;
will-change: transform;
backface-visibility: hidden;
transition: .1s opacity ease-in;
}
[data-isotope-layout].isotope--loaded [class*="col-"] {
opacity: 1;
}
[data-isotope-layout].isotope--loaded:after {
opacity: 0;
visibility: hidden;
}
.isotope.isotope-condensed {
margin-left: 0;
margin-right: 0;
overflow: hidden;
}
.isotope.isotope-condensed [class*='col'] {
padding: 0;
margin: 0 0 30px 0;
}
@media (min-width: 576px) {
.isotope.isotope-condensed [class*='col'] {
margin: 0 -1px -1px 0;
}
}
.isotope-filters-list {
position: relative;
font-size: 16px;
margin-left: -20px;
margin-bottom: -10px;
}
.isotope-filters-list > * {
margin-left: 20px;
}
.isotope-filters-list::after {
content: '';
position: absolute;
left: 20px;
right: 0;
bottom: 10px;
border-bottom: 1px solid #e8e9ee;
}
.isotope-filters-list li {
display: inline-block;
margin-bottom: 10px;
}
.isotope-filters-list a {
position: relative;
display: block;
z-index: 1;
padding-bottom: 10px;
color: #74757f;
}
.isotope-filters-list a::after {
content: '';
position: absolute;
right: 0;
bottom: 0;
width: 0;
height: 1px;
transition: .4s;
background: #0045b6;
}
.isotope-filters-list a:hover {
color: #495057;
}
.isotope-filters-list a.active {
color: #495057;
}
.isotope-filters-list a.active::after {
right: auto;
left: 0;
width: 100%;
}
@media (min-width: 992px) {
.isotope-filters-list {
font-size: 18px;
margin-left: -48px;
}
.isotope-filters-list > * {
margin-left: 48px;
}
.isotope-filters-list::after {
left: 45px;
}
}
@media (min-width: 1200px) {
.isotope-filters-list {
font-size: 20px;
}
}
@media (max-width: 767.98px) {
.isotope-responsive {
margin-left: -7px;
margin-right: -7px;
margin-bottom: -14px;
}
.isotope-responsive:empty {
margin-bottom: 0;
}
.isotope-responsive > * {
margin-bottom: 14px;
}
.isotope-responsive [class*='col'] {
padding-left: 7px;
padding-right: 7px;
}
}
@media (min-width: 768px) {
.isotope-responsive {
margin-bottom: -30px;
}
.isotope-responsive:empty {
margin-bottom: 0;
}
.isotope-responsive > * {
margin-bottom: 30px;
}
}
@media (max-width: 767.98px) {
.isotope-filters-modern {
position: relative;
z-index: 10;
}
.isotope-filters-toggle {
display: block;
padding: 10px 20px;
color: #fff;
background: #0045b6;
box-shadow: none;
border: 0;
}
.isotope-filters-toggle .caret {
position: relative;
display: inline-block;
margin-left: 5px;
font-family: "FontAwesome";
font-size: 14px;
transition: .22s;
will-change: transform;
}
.isotope-filters-toggle .caret::before {
content: '\f107';
}
.isotope-filters-toggle.active .caret {
transform: scale(1, -1);
}
.isotope-filters-list {
position: absolute;
top: 100%;
left: 0;
z-index: 10;
min-width: 240px;
margin: 5px 0 0 0;
padding: 20px;
border: 1px solid #e8e9ee;
opacity: 0;
visibility: hidden;
background: #fff;
transition: .3s ease-in;
}
.isotope-filters-list::after {
display: none;
}
.isotope-filters-list.active {
opacity: 1;
visibility: visible;
}
.isotope-filters-list li {
display: block;
width: 100%;
margin-left: 0;
}
.isotope-filters-list a {
padding: 0;
}
.isotope-filters-list a::after {
display: none;
}
}
@media (min-width: 768px) {
.isotope-filters-modern .isotope-filters-toggle {
display: none;
}
}
* + .isotope {
margin-top: 30px;
}
@media (min-width: 768px) {
* + .isotope {
margin-top: 47px;
}
}
.nav {
display: block;
}
.tabs-custom {
text-align: left;
}
.tabs-custom .nav-tabs {
font-size: 0;
line-height: 0;
word-spacing: 0;
border: 0;
}
.tabs-custom .nav-tabs:before, .tabs-custom .nav-tabs:after {
display: none;
}
.tabs-custom .nav-item {
float: none;
border: 0;
cursor: pointer;
transition: .33s all ease;
}
.tabs-custom .nav-link {
margin: 0;
border-radius: 0;
border: 0;
}
.tabs-custom .nav-link.active {
cursor: default;
border: 0;
}
.tab-content > .tab-pane {
display: block;
visibility: hidden;
height: 0;
overflow: hidden;
}
.tab-content > .active {
visibility: visible;
height: auto;
overflow: visible;
}
.tabs-line .nav-tabs {
position: relative;
}
.tabs-line .nav-link {
font-size: 16px;
line-height: 1.4;
text-align: center;
vertical-align: middle;
}
.tabs-line * + .tab-content {
maLine truncated
|
||||
* Card corporate
|
||||
*/
.card-corporate {
border-top: 1px solid #f5f6fa;
text-align: left;
}
.card-corporate:last-child {
border-bottom: 1px solid #f5f6fa;
}
.card-corporate .card-collapse {
background: #fff;
}
.card-corporate .card-title a {
position: relative;
z-index: 1;
padding: 15px 40px 15px 70px;
font-size: 17px;
line-height: 1.5;
letter-spacing: 0;
color: #495057;
transition: 1.3s all ease;
}
.card-corporate .card-title a[aria-expanded='true'], .card-corporate .card-title a:hover {
color: #0045b6;
}
.card-corporate .card-title a .card-arrow {
transition: .33s;
}
.card-corporate .card-title a.collapsed {
color: #495057;
border-bottom-width: 0;
}
.card-corporate .card-title a.collapsed .card-arrow::before {
opacity: 1;
}
.card-corporate .card-title a.collapsed .card-arrow::after {
opacity: 0;
}
.card-corporate .card-arrow {
position: absolute;
top: 16px;
left: 13px;
z-index: 2;
width: 20px;
height: 20px;
color: #0045b6;
transition: .33s all ease;
text-align: center;
}
.card-corporate .card-arrow::before, .card-corporate .card-arrow::after {
position: absolute;
z-index: 4;
font-family: 'Material Design Icons';
font-size: 24px;
line-height: 1;
transition: .22s;
}
.card-corporate .card-arrow::before {
content: '\f505';
opacity: 0;
}
.card-corporate .card-arrow::after {
content: '\f466';
opacity: 1;
}
.card-corporate .card-collapse {
position: relative;
z-index: 1;
color: #74757f;
}
.card-corporate .card-body {
padding: 2px 44px 25px 70px;
}
@media (max-width: 767.98px) {
.card-corporate .card-arrow {
left: 0;
}
.card-corporate .card-title a,
.card-corporate .card-body {
padding-left: 50px;
}
}
@media (min-width: 768px) {
.card-corporate .card-title a {
font-size: 20px;
line-height: 1.4;
}
.card-corporate .card-arrow {
top: 18px;
}
}
/*
|
||||
*
|
||||
* Tooltop Custom
|
||||
*/
.tooltip {
font-size: 16px;
line-height: 1.2;
}
.tooltip-inner {
background-color: #0045b6;
}
.bs-tooltip-top .arrow::before {
border-top-color: #0045b6;
}
.bs-tooltip-right .arrow::before {
border-right-color: #0045b6;
}
.bs-tooltip-bottom .arrow::before {
border-bottom-color: #0045b6;
}
.bs-tooltip-left .arrow::before {
border-left-color: #0045b6;
}
@media (min-width: 1200px) {
.tooltip-inner {
padding: 9px 18px;
}
}
/*
|
||||
*
|
||||
* Modal Custom
|
||||
*/
.modal {
display: flex !important;
padding: 30px 15px 7vh;
visibility: hidden;
}
.modal .close {
cursor: pointer;
color: #74757f;
transition: .22s;
}
.modal .close span::before {
content: '\f24c';
font-family: 'Material Design Icons';
}
.modal .close:hover {
color: #495057;
}
.modal.show {
visibility: visible;
}
.modal.fade .modal-dialog {
transform: translate3d(0, -30px, 0);
}
.modal.show .modal-dialog {
transform: translate3d(0, 0, 0);
}
.modal-dialog {
display: flex;
align-items: flex-start;
justify-content: center;
margin: 0 auto;
}
.modal-content {
height: 100%;
border-radius: 6px;
}
.modal-body {
height: 100%;
overflow-y: auto;
}
@media (min-width: 768px) {
.modal-header,
.modal-body {
padding-left: 30px;
padding-right: 30px;
}
.modal-header {
padding-top: 20px;
padding-bottom: 20px;
}
.modal-body {
padding-top: 30px;
padding-bottom: 30px;
}
.modal-dialog {
max-width: 800px;
}
}
/*
|
||||
*
|
||||
* Progress Bars
|
||||
*/
.progress-linear {
position: relative;
text-align: left;
}
.progress-linear .progress-header {
display: flex;
align-items: center;
justify-content: space-between;
transform: translate3d(0, -10px, 0);
margin-bottom: -10px;
margin-left: -5px;
margin-right: -5px;
}
.progress-linear .progress-header > * {
margin-top: 10px;
padding-left: 5px;
padding-right: 5px;
}
.progress-linear .progress-bar-linear-wrap {
height: 2px;
background: #f5f6fa;
}
.progress-linear .progress-bar-linear {
width: 0;
height: inherit;
background: #0045b6;
transition: .5s all ease-in-out;
}
.progress-linear .progress-value::after {
content: '\0025';
}
* + .progress-linear {
margin-top: 25px;
}
* + .progress-linear-outer {
margin-top: 25px;
}
* + .progress-bar-linear-wrap {
margin-top: 8px;
}
.progress-linear + .progress-linear {
margin-top: 20px;
}
.progress-linear-outer + .progress-linear-outer {
margin-top: 20px;
}
@media (min-width: 768px) {
* + .progress-linear {
margin-top: 40px;
}
* + .progress-linear-outer {
margin-top: 40px;
}
}
@media (min-width: 1200px) {
.progress-linear + .progress-linear {
margin-top: 34px;
}
.progress-linear-outer + .progress-linear-outer {
margin-top: 34px;
}
}
/*
|
||||
*
|
||||
* Time Circles
|
||||
*/
.time_circles {
position: relative;
width: 100%;
}
.time_circles > div {
position: absolute;
top: 0 !important;
bottom: 0;
display: flex;
align-items: center;
flex-wrap: wrap;
justify-content: center;
margin-top: -10px;
text-align: center;
}
@media (min-width: 1200px) {
#DateCountdown {
width: 100%;
}
}
.time_circles > div > h4 {
position: absolute;
left: 0;
top: calc(100% + 14px);
right: 0;
transform: translateY(-100%);
margin: 0;
padding: 0;
text-align: center;
font-family: "Work Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
font-size: 14px !important;
line-height: 1.2 !important;
color: #868e96;
}
.time_circles > div > h4 + * {
margin-top: 0;
}
@media (min-width: 576px) {
.time_circles > div > h4 {
font-size: 16px !important;
}
}
.time_circles > div > span {
display: block;
text-align: center;
letter-spacing: 0;
font-size: 24px !important;
font-weight: 700;
line-height: 1 !important;
color: #111111;
}
.context-dark .time_circles > div > span, .bg-gray-700 .time_circles > div > span, .bg-gray-800 .time_circles > div > span, .bg-primary .time_circles > div > span, .bg-primary-darker .time_circles > div > span {
color: #fff;
}
.context-dark .time_circles > div > h4, .bg-gray-700 .time_circles > div > h4, .bg-gray-800 .time_circles > div > h4, .bg-primary .time_circles > div > h4, .bg-primary-darker .time_circles > div > h4 {
color: #fff;
}
.countdown-wrap {
max-width: 530px;
padding-bottom: 20px;
}
* + .countdown-wrap {
margin-top: 35px;
}
.countdown-wrap + .button {
margin-top: 40px;
}
/*
|
||||
* jQuery mousewheel plugin
|
||||
*/
/*
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
1. BASIC STYLE
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
*/
.mCustomScrollbar {
-ms-touch-action: pinch-zoom;
touch-action: pinch-zoom;
/* direct pointer events to js */
}
.mCustomScrollbar.mCS_no_scrollbar, .mCustomScrollbar.mCS_touch_action {
-ms-touch-action: auto;
touch-action: auto;
}
.mCustomScrollBox {
/* contains plugin's markup */
position: relative;
overflow: hidden;
height: 100%;
max-width: 100%;
outline: none;
direction: ltr;
}
.mCSB_container {
/* contains the original content */
overflow: hidden;
width: auto;
height: auto;
}
/*
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
2. VERTICAL SCROLLBAR
|
||||
y-axis
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
*/
.mCSB_inside > .mCSB_container {
margin-right: 30px;
}
.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden {
margin-right: 0;
}
/* non-visible scrollbar */
.mCS-dir-rtl-custom > .mCSB_inside > .mCSB_container {
/* RTL direction/left-side scrollbar */
margin-right: 0;
margin-left: 30px;
}
.mCS-dir-rtl-custom > .mCSB_inside > .mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden {
margin-left: 0;
}
/* RTL direction/left-side scrollbar */
.mCSB_scrollTools {
/* contains scrollbar markup (draggable element, dragger rail, buttons etc.) */
position: absolute;
width: 16px;
height: auto;
left: auto;
top: 0;
right: 0;
bottom: 0;
}
.mCSB_outside + .mCSB_scrollTools {
right: -26px;
}
/* scrollbar position: outside */
.mCS-dir-rtl-custom > .mCSB_inside > .mCSB_scrollTools,
.mCS-dir-rtl-custom > .mCSB_outside + .mCSB_scrollTools {
/* RTL direction/left-side scrollbar */
right: auto;
left: 0;
}
.mCS-dir-rtl-custom > .mCSB_outside + .mCSB_scrollTools {
left: -26px;
}
/* RTL direction/left-side scrollbar (scrollbar position: outside) */
.mCSB_scrollTools .mCSB_draggerContainer {
/* contains the draggable element and dragger rail markup */
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
height: auto;
}
.mCSB_scrollTools a + .mCSB_draggerContainer {
margin: 20px 0;
}
.mCSB_scrollTools .mCSB_draggerRail {
width: 16px;
height: 100%;
margin: 0 auto;
border-radius: 0;
}
.mCSB_scrollTools .mCSB_dragger {
/* the draggable element */
cursor: pointer;
width: 100%;
height: 30px;
/* minimum dragger height */
z-index: 1;
}
.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar {
/* the dragger element */
position: relative;
width: 16px;
height: 100%;
margin: 0 auto;
border-radius: 0;
text-align: center;
}
.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,
.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar {
width: 12px;
/* auto-expanded scrollbar */
}
.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail,
.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail {
width: 8px;
/* auto-expanded scrollbar */
}
.mCSB_scrollTools .mCSB_buttonUp,
.mCSB_scrollTools .mCSB_buttonDown {
display: block;
position: absolute;
height: 20px;
width: 100%;
overflow: hidden;
margin: 0 auto;
cursor: pointer;
}
.mCSB_scrollTools .mCSB_buttonDown {
bottom: 0;
}
/*
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
3. HORIZONTAL SCROLLBAR
|
||||
x-axis
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
*/
.mCSB_horizontal.mCSB_inside > .mCSB_container {
margin-right: 0;
margin-bottom: 30px;
}
.mCSB_horizontal.mCSB_outside > .mCSB_container {
min-height: 100%;
}
.mCSB_horizontal > .mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden {
margin-bottom: 0;
}
/* non-visible scrollbar */
.mCSB_scrollTools.mCSB_scrollTools_horizontal {
width: auto;
height: 16px;
top: auto;
right: 0;
bottom: 0;
left: 0;
}
.mCustomScrollBox + .mCSB_scrollTools.mCSB_scrollTools_horizontal,
.mCustomScrollBox + .mCSB_scrollTools + .mCSB_scrollTools.mCSB_scrollTools_horizontal {
bottom: -26px;
}
/* scrollbar position: outside */
.mCSB_scrollTools.mCSB_scrollTools_horizontal a + .mCSB_draggerContainer {
margin: 0 20px;
}
.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail {
width: 100%;
height: 2px;
margin: 7px 0;
}
.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger {
width: 30px;
/* minimum dragger width */
height: 100%;
left: 0;
}
.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar {
width: 100%;
height: 4px;
margin: 6px auto;
}
.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,
.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar {
height: 12px;
/* auto-expanded scrollbar */
margin: 2px auto;
}
.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail,
.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail {
height: 8px;
/* auto-expanded scrollbar */
margin: 4px 0;
}
.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,
.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight {
display: block;
position: absolute;
width: 20px;
height: 100%;
overflow: hidden;
margin: 0 auto;
cursor: pointer;
}
.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft {
left: 0;
}
.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight {
right: 0;
}
/*
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
4. VERTICAL AND HORIZONTAL SCROLLBARS
|
||||
yx-axis
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
*/
.mCSB_container_wrapper {
position: absolute;
height: auto;
width: auto;
overflow: hidden;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin-right: 30px;
margin-bottom: 30px;
}
.mCSB_container_wrapper > .mCSB_container {
padding-right: 30px;
padding-bottom: 30px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.mCSB_vertical_horizontal > .mCSB_scrollTools.mCSB_scrollTools_vertical {
bottom: 20px;
}
.mCSB_vertical_horizontal > .mCSB_scrollTools.mCSB_scrollTools_horizontal {
right: 20px;
}
/* non-visible horizontal scrollbar */
.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden + .mCSB_scrollTools.mCSB_scrollTools_vertical {
bottom: 0;
}
/* non-visible vertical scrollbar/RTL direction/left-side scrollbar */
.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden + .mCSB_scrollTools ~ .mCSB_scrollTools.mCSB_scrollTools_horizontal,
.mCS-dir-rtl-custom > .mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_scrollTools.mCSB_scrollTools_horizontal {
right: 0;
}
/* RTL direction/left-side scrollbar */
.mCS-dir-rtl-custom > .mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_scrollTools.mCSB_scrollTools_horizontal {
left: 20px;
}
/* non-visible scrollbar/RTL direction/left-side scrollbar */
.mCS-dir-rtl-custom > .mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden + .mCSB_scrollTools ~ .mCSB_scrollTools.mCSB_scrollTools_horizontal {
left: 0;
}
.mCS-dir-rtl-custom > .mCSB_inside > .mCSB_container_wrapper {
/* RTL direction/left-side scrollbar */
margin-right: 0;
margin-left: 30px;
}
.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden > .mCSB_container {
padding-right: 0;
}
.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden > .mCSB_container {
padding-bottom: 0;
}
.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden {
margin-right: 0;
/* non-visible scrollbar */
margin-left: 0;
}
/* non-visible horizontal scrollbar */
.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden {
margin-bottom: 0;
}
/*
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
5. TRANSITIONS
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
*/
.mCSB_scrollTools,
.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
.mCSB_scrollTools .mCSB_buttonUp,
.mCSB_scrollTools .mCSB_buttonDown,
.mCSB_scrollTools .mCSB_buttonLeft,
.mCSB_scrollTools .mCSB_buttonRight {
-webkit-transition: opacity .2s ease-in-out, background-color .2s ease-in-out;
-moz-transition: opacity .2s ease-in-out, background-color .2s ease-in-out;
-o-transition: opacity .2s ease-in-out, background-color .2s ease-in-out;
transition: opacity .2s ease-in-out, background-color .2s ease-in-out;
}
.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,
.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,
.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,
.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail {
-webkit-transition: width .2s ease-out .2s, height .2s ease-out .2s, margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, opacity .2s ease-in-out, background-color .2s ease-in-out;
-moz-transition: width .2s ease-out .2s, height .2s ease-out .2s, margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, opacity .2s ease-in-out, background-color .2s ease-in-out;
-o-transition: width .2s ease-out .2s, height .2s ease-out .2s, margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, opacity .2s ease-in-out, background-color .2s ease-in-out;
transition: width .2s ease-out .2s, height .2s ease-out .2s, margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, opacity .2s ease-in-out, background-color .2s ease-in-out;
}
/*
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
6. SCROLLBAR COLORS, OPACITY AND BACKGROUNDS
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
*/
/*
|
||||
----------------------------------------
|
||||
6.1 THEMES
|
||||
----------------------------------------
|
||||
*/
/* default theme ("light") */
.mCSB_scrollTools .mCSB_draggerRail {
background-color: transparent;
}
.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar {
background-color: #f2f3f8;
}
.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,
.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar {
background-color: #d1d4e6;
}
.mCSB_scrollTools .mCSB_buttonUp,
.mCSB_scrollTools .mCSB_buttonDown,
.mCSB_scrollTools .mCSB_buttonLeft,
.mCSB_scrollTools .mCSB_buttonRight {
background-image: url(../images/mCSB_buttons.png);
/* css sprites */
background-repeat: no-repeat;
opacity: 0.4;
}
.mCSB_scrollTools .mCSB_buttonUp {
background-position: 0 0;
}
.mCSB_scrollTools .mCSB_buttonDown {
background-position: 0 -20px;
}
.mCSB_scrollTools .mCSB_buttonLeft {
background-position: 0 -40px;
}
.mCSB_scrollTools .mCSB_buttonRight {
background-position: 0 -56px;
}
.mCSB_scrollTools .mCSB_buttonUp:hover,
.mCSB_scrollTools .mCSB_buttonDown:hover,
.mCSB_scrollTools .mCSB_buttonLeft:hover,
.mCSB_scrollTools .mCSB_buttonRight:hover {
opacity: 0.75;
}
.mCSB_scrollTools .mCSB_buttonUp:active,
.mCSB_scrollTools .mCSB_buttonDown:active,
.mCSB_scrollTools .mCSB_buttonLeft:active,
.mCSB_scrollTools .mCSB_buttonRight:active {
opacity: 0.9;
}
/* theme: "dark" */
.mCS-dark.mCSB_scrollTools .mCSB_draggerRail {
background-color: #000000;
background-color: rgba(0, 0, 0, 0.15);
}
.mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar {
background-color: #000000;
background-color: rgba(0, 0, 0, 0.75);
}
.mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar {
background-color: rgba(0, 0, 0, 0.85);
}
.mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
.mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar {
background-color: rgba(0, 0, 0, 0.9);
}
.mCS-dark.mCSB_scrollTools .mCSB_buttonUp {
background-position: -80px 0;
}
.mCS-dark.mCSB_scrollTools .mCSB_buttonDown {
background-position: -80px -20px;
}
.mCS-dark.mCSB_scrollTools .mCSB_buttonLeft {
background-position: -80px -40px;
}
.mCS-dark.mCSB_scrollTools .mCSB_buttonRight {
background-position: -80px -56px;
}
/*
|
||||
*
|
||||
* Owl Carousel
|
||||
*/
.owl-carousel .animated {
animation-duration: 1000ms;
animation-fill-mode: both;
}
.owl-carousel .owl-animated-in {
z-index: 0;
}
.owl-carousel .owl-animated-out {
z-index: 1;
}
.owl-carousel .fadeOut {
animation-name: fadeOut;
}
@keyframes fadeOut {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
/*
|
||||
* Owl Carousel - Auto Height Plugin
|
||||
*/
.owl-height {
transition: height 500ms ease-in-out;
}
/*
|
||||
* Core Owl Carousel CSS File
|
||||
*/
.owl-carousel {
display: none;
width: 100%;
-webkit-tap-highlight-color: transparent;
/* position relative and z-index fix webkit rendering fonts issue */
position: relative;
z-index: 1;
}
.owl-carousel .owl-stage {
position: relative;
-ms-touch-action: pan-Y;
}
.owl-carousel .owl-stage:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}
.owl-carousel .owl-stage-outer {
position: relative;
overflow: hidden;
/* fix for flashing background */
-webkit-transform: translate3d(0px, 0px, 0px);
}
.owl-carousel .owl-controls .owl-nav .owl-prev,
.owl-carousel .owl-controls .owl-nav .owl-next,
.owl-carousel .owl-controls .owl-dot {
cursor: pointer;
user-select: none;
}
.owl-carousel.owl-loaded {
display: block;
}
.owl-carousel.owl-loading {
opacity: 0;
display: block;
}
.owl-carousel.owl-hidden {
opacity: 0;
}
.owl-carousel .owl-refresh .owl-item {
display: none;
}
.owl-carousel .owl-item {
position: relative;
min-height: 1px;
float: left;
-webkit-tap-highlight-color: transparent;
-webkit-touch-callout: none;
}
.owl-carousel .owl-grab {
cursor: move;
cursor: -webkit-grab;
cursor: grab;
}
.owl-carousel.owl-rtl {
direction: rtl;
}
.owl-carousel.owl-rtl .owl-item {
float: right;
}
/* No Js */
.no-js .owl-carousel {
display: block;
}
/*
|
||||
* Owl Carousel - Lazy Load Plugin
|
||||
*/
.owl-carousel .owl-item .owl-lazy {
opacity: 0;
transition: opacity 400ms ease;
}
/*
|
||||
* Owl Carousel - Video Plugin
|
||||
*/
.owl-carousel .owl-video-wrapper {
position: relative;
height: 100%;
background: #000000;
}
.owl-carousel .owl-video-play-icon {
position: absolute;
height: 80px;
width: 80px;
left: 50%;
top: 50%;
margin-left: -40px;
margin-top: -40px;
font: 400 40px/80px 'FontAwesome';
cursor: pointer;
z-index: 1;
transition: scale 100ms ease;
}
.owl-carousel .owl-video-play-icon:before {
content: '\f144';
}
.owl-carousel .owl-video-play-icon:hover {
transform: scale(1.3);
}
.owl-carousel .owl-video-playing .owl-video-tn,
.owl-carousel .owl-video-playing .owl-video-play-icon {
display: none;
}
.owl-carousel .owl-video-tn {
opacity: 0;
height: 100%;
background-position: center center;
background-repeat: no-repeat;
background-size: contain;
transition: opacity 400ms ease;
}
.owl-carousel .owl-video-frame {
position: relative;
z-index: 1;
}
/*
|
||||
* Owl Navigation
|
||||
*/
.owl-nav.disabled {
display: none !important;
}
.owl-prev,
.owl-next {
position: absolute;
top: 50%;
transform: translateY(-50%);
font: 400 46px/50px 'FontAwesome';
color: #aeb1be;
}
.owl-prev:hover,
.owl-next:hover {
color: #0045b6;
}
.owl-prev {
left: 0;
}
.owl-prev::before {
content: '\f104';
}
.owl-next {
right: 0;
}
.owl-next::before {
content: '\f105';
}
/*
|
||||
* Owl Pagination
|
||||
*/
.owl-dots {
margin-top: 10px;
}
.owl-dots.disabled {
display: none !important;
}
@media (min-width: 576px) {
.owl-dots {
margin-top: 25px;
}
}
button.owl-dot {
background: none;
border: none;
display: inline-block;
padding: 0;
outline: none;
outline-offset: 0;
cursor: pointer;
-webkit-appearance: none;
}
button.owl-dot::-moz-focus-inner {
border: none;
padding: 0;
}
.owl-dot {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
vertical-align: middle;
width: 14px;
height: 14px;
border-radius: 50%;
margin-left: 14px;
margin-right: 14px;
text-align: center;
outline: none;
cursor: pointer;
}
.owl-dot::before {
content: '';
display: block;
width: 100%;
height: 100%;
transform: scale3d(0.56, 0.56, 0.56);
background: #e8e9ee;
border-radius: inherit;
transition: .2s;
}
.owl-dot:only-child {
display: none;
}
.owl-dot:hover::before, .owl-dot.active::before {
transform: scale3d(1, 1, 1);
background-color: #0045b6;
}
* + .owl-carousel {
margin-top: 30px;
}
.owl-carousel-1 {
text-align: center;
}
.owl-carousel-1 .owl-stage {
position: relative;
display: flex;
align-items: center;
}
.owl-carousel-centered-pagination .owl-dots {
text-align: center;
}
.owl-carousel-indigo {
position: relative;
overflow: hidden;
max-width: 100vw;
padding: 0 15px;
margin-left: auto;
margin-right: auto;
pointer-events: none;
}
.owl-carousel-indigo, .owl-carousel-indigo * {
backface-visibility: hidden;
}
.owl-carousel-indigo .owl-stage-outer {
padding: 23px;
margin: -23px;
}
.owl-carousel-indigo .owl-item.active {
pointer-events: auto;
}
.owl-carousel-indigo .owl-dots {
pointer-events: auto;
}
.owl-carousel-indigo * + .owl-dots {
margin-top: 25px;
}
@media (max-width: 575.98px) {
.owl-carousel-indigo .owl-dot {
width: 11px;
height: 11px;
margin: 0 6px;
}
}
@media (min-width: 768px) {
.owl-carousel-indigo {
padding: 0 0;
}
.owl-carousel-indigo * + .owl-dots {
margin-top: 60px;
}
}
.owl-carousel-dots-space .owl-dots {
margin-bottom: 25px;
}
.lg-sub-html, .lg-toolbar {
background-color: rgba(0, 0, 0, 0.45);
}
@font-face {
font-family: lg;
src: url(../fonts/lg.eot?n1z373);
src: url(../fonts/lg.eot?#iefixn1z373) format("embedded-opentype"), url(../fonts/lg.woff?n1z373) format("woff"), url(../fonts/lg.ttf?n1z373) format("truetype"), url(../fonts/lg.svg?n1z373#lg) format("svg");
font-weight: 400;
font-style: normal;
}
.lg-icon {
font-family: lg;
speak: none;
font-style: normal;
font-weight: 400;
font-variant: normal;
text-transform: none;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.lg-actions .lg-next, .lg-actions .lg-prev {
background-color: rgba(0, 0, 0, 0.45);
border-radius: 2px;
color: #999;
cursor: pointer;
display: block;
font-size: 22px;
margin-top: -10px;
padding: 8px 10px 9px;
position: absolute;
top: 50%;
z-index: 1180;
border: none;
outline: 0;
}
.lg-actions .lg-next.disabled, .lg-actions .lg-prev.disabled {
pointer-events: none;
opacity: .5;
}
.lg-actions .lg-next:hover, .lg-actions .lg-prev:hover {
color: #fff;
}
.lg-actions .lg-next {
right: 20px;
}
.lg-actions .lg-next:before {
content: "\e095";
}
.lg-actions .lg-prev {
left: 20px;
}
.lg-actions .lg-prev:after {
content: "\e094";
}
@-webkit-keyframes lg-right-end {
0%, 100% {
left: 0;
}
50% {
left: -30px;
}
}
@-moz-keyframes lg-right-end {
0%, 100% {
left: 0;
}
50% {
left: -30px;
}
}
@-ms-keyframes lg-right-end {
0%, 100% {
left: 0;
}
50% {
left: -30px;
}
}
@keyframes lg-right-end {
0%, 100% {
left: 0;
}
50% {
left: -30px;
}
}
@-webkit-keyframes lg-left-end {
0%, 100% {
left: 0;
}
50% {
left: 30px;
}
}
@-moz-keyframes lg-left-end {
0%, 100% {
left: 0;
}
50% {
left: 30px;
}
}
@-ms-keyframes lg-left-end {
0%, 100% {
left: 0;
}
50% {
left: 30px;
}
}
@keyframes lg-left-end {
0%, 100% {
left: 0;
}
50% {
left: 30px;
}
}
.lg-outer.lg-right-end .lg-object {
-webkit-animation: lg-right-end .3s;
-o-animation: lg-right-end .3s;
animation: lg-right-end .3s;
position: relative;
}
.lg-outer.lg-left-end .lg-object {
-webkit-animation: lg-left-end .3s;
-o-animation: lg-left-end .3s;
animation: lg-left-end .3s;
position: relative;
}
.lg-toolbar {
z-index: 1182;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
.lg-toolbar .lg-icon {
color: #999;
cursor: pointer;
float: right;
font-size: 24px;
height: 47px;
line-height: 27px;
padding: 10px 0;
text-align: center;
width: 50px;
text-decoration: none !important;
outline: 0;
transition: color .2s linear;
}
@media (max-width: 575.98px) {
.lg-toolbar .lg-icon {
font-size: 21px;
width: 36px;
}
}
@media (max-width: 575.98px) {
#lg-counter {
font-size: 14px;
line-height: 27px;
}
}
.lg-toolbar .lg-icon:hover {
color: #fff;
}
.lg-toolbar .lg-close:after {
content: "\e070";
}
.lg-toolbar .lg-download:after {
content: Line truncated
|
||||
*
|
||||
* Material Parallax
|
||||
*/
.parallax-content {
position: relative;
z-index: 1;
}
.parallax-container {
position: relative;
overflow: hidden;
background-position: center center;
background-size: cover;
}
.material-parallax {
position: absolute;
top: 0;
left: -1px;
right: -1px;
bottom: 0;
z-index: 0;
background-position: center center;
}
.ipad .parallax-container,
.iphone .parallax-container {
background-attachment: scroll !important;
}
.material-parallax img {
display: none;
position: absolute;
left: 50%;
bottom: 0;
min-width: 101%;
min-height: 101%;
max-width: none;
transform: translate3d(-50%, 0, 0);
}
/*
|
||||
*
|
||||
* Slick Carousel
|
||||
*/
/*rtl:begin:ignore*/
.slick-slider {
position: relative;
display: block;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-ms-touch-action: pan-y;
touch-action: pan-y;
-webkit-tap-highlight-color: transparent;
}
.slick-list {
position: relative;
overflow: hidden;
display: block;
margin: 0;
padding: 0;
}
.slick-list:focus {
outline: none;
}
.slick-list.dragging {
cursor: pointer;
cursor: hand;
}
.slick-slider .slick-track,
.slick-slider .slick-list {
transform: translate3d(0, 0, 0);
}
.slick-track {
position: relative;
left: 0;
top: 0;
display: block;
}
.slick-track::before, .slick-track::after {
content: "";
display: table;
}
.slick-track::after {
clear: both;
}
.slick-loading .slick-track {
visibility: hidden;
}
.slick-slide {
float: left;
height: 100%;
min-height: 1px;
display: none;
}
[dir="rtl"] .slick-slide {
float: right;
}
.slick-slide img {
display: block;
}
.slick-slide.slick-loading img {
display: none;
}
.slick-slide.dragging img {
pointer-events: none;
}
.slick-initialized .slick-slide {
display: block;
}
.slick-loading .slick-slide {
visibility: hidden;
}
.slick-vertical .slick-slide {
display: block;
height: auto;
border: 1px solid transparent;
}
.slick-arrow.slick-hidden {
display: none;
}
.slick-loading .slick-list {
background: #fff url("./../images/ajax-loader.gif") center center no-repeat;
}
/* Icons */
/* Arrows */
.slick-prev,
.slick-next {
position: absolute;
display: block;
height: 20px;
width: 20px;
line-height: 0;
font-size: 0;
cursor: pointer;
color: transparent;
background-color: transparent;
top: 50%;
transform: translate(0, -50%);
padding: 0;
border: none;
outline: none;
z-index: 9;
}
.slick-prev.slick-disabled:before,
.slick-next.slick-disabled:before {
opacity: 0.25;
}
.slick-prev::before,
.slick-next::before {
font-family: "fl-bigmug-line";
font-size: 24px;
line-height: 1;
color: #0045b6;
opacity: 0.75;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
transition: .22s;
}
.slick-prev:hover::before,
.slick-next:hover::before {
color: #343db0;
}
.slick-prev {
left: 0;
}
[dir="rtl"] .slick-prev {
left: auto;
right: 0;
}
.slick-prev:before {
content: "";
}
[dir="rtl"] .slick-prev:before {
content: "";
}
.slick-next {
right: 0;
}
[dir="rtl"] .slick-next {
left: 0;
right: auto;
}
.slick-next:before {
content: "";
}
[dir="rtl"] .slick-next:before {
content: "";
}
/* Dots */
.slick-dots {
position: absolute;
bottom: -45px;
list-style: none;
display: block;
text-align: center;
padding: 0;
width: 100%;
}
.slick-dots li {
position: relative;
display: inline-block;
height: 20px;
width: 20px;
margin: 0 5px;
padding: 0;
cursor: pointer;
}
.slick-dots li button {
border: 0;
background: transparent;
display: block;
height: 20px;
width: 20px;
outline: none;
line-height: 0;
font-size: 0;
color: transparent;
padding: 5px;
cursor: pointer;
}
.slick-dots li button:hover, .slick-dots li button:focus {
outline: none;
}
.slick-dots li button:hover:before, .slick-dots li button:focus:before {
opacity: 1;
}
.slick-dots li button:before {
position: absolute;
top: 0;
left: 0;
content: "";
font-family: "fl-bigmug-line";
font-size: 6px;
line-height: 20px;
text-align: center;
color: #0045b6;
opacity: 0.25;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.slick-dots li.slick-active button:before {
color: #0045b6;
opacity: 0.75;
}
/*rtl:end:ignore*/
.slick-widget-testimonials .carousel-child {
max-width: 570px;
padding: 0 50px;
margin-left: auto;
margin-right: auto;
}
.slick-widget-testimonials .carousel-child .item {
border-radius: 50%;
cursor: pointer;
transform: scale3d(0.66, 0.66, 0.66);
transition: .22s;
text-align: center;
}
.slick-widget-testimonials .carousel-child .slick-center {
transform: scale3d(1, 1, 1);
}
.slick-widget-testimonials .carousel-child img {
border-radius: inherit;
max-width: 100%;
margin: 0 auto;
}
@media (max-width: 575.98px) {
.slick-widget-testimonials .carousel-child .slick-prev {
left: 30px;
}
.slick-widget-testimonials .carousel-child .slick-next {
right: 30px;
}
}
.slick-widget-testimonials .carousel-parent {
max-width: 780px;
margin-left: auto;
margin-right: auto;
}
.slick-widget-testimonials .carousel-parent .item > * {
transform-origin: 50% 0;
opacity: 0;
transition: .44s;
}
.slick-widget-testimonials .carousel-parent .slick-active > * {
opacity: 1;
}
.slick-widget-testimonials > * + * {
margin-top: 20px;
}
* + .slick-widget-testimonials {
margin-top: 30px;
}
@media (min-width: 768px) {
* + .slick-widget-testimonials {
margin-top: 55px;
}
}
@media (min-width: 1200px) {
* + .slick-widget-testimonials {
margin-top: 75px;
}
}
/*
|
||||
*
|
||||
* Select 2 v4
|
||||
*/
.select2 {
width: 100% !important;
}
.select2-container {
box-sizing: border-box;
display: inline-block;
margin: 0;
position: relative;
vertical-align: middle;
}
.select2-container .select2-container--default .select2-selection--single {
width: 100% !important;
}
.select2-container .select2-selection--single {
display: block;
cursor: pointer;
user-select: none;
}
.select2-container .select2-selection--single .select2-selection__rendered {
display: block;
padding-left: 8px;
padding-right: 20px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.select2-container .select2-selection--single .select2-selection__clear {
position: relative;
}
.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
padding-right: 8px;
padding-left: 20px;
}
.select2-container .select2-selection--multiple {
display: block;
cursor: pointer;
min-height: 32px;
user-select: none;
-webkit-user-select: none;
}
.select2-container .select2-selection--multiple .select2-selection__rendered {
display: inline-block;
overflow: hidden;
padding-left: 8px;
text-overflow: ellipsis;
white-space: nowrap;
}
.select2-container .select2-search--inline {
float: left;
}
.select2-container .select2-search--inline .select2-search__field {
border: none;
font-size: 100%;
margin-top: 5px;
padding: 0;
}
.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
-webkit-appearance: none;
}
.select2-dropdown {
position: absolute;
left: -100000px;
z-index: 1051;
display: block;
overflow: hidden;
width: 100%;
border: 1px;
border-radius: 6px;
background-color: #fff;
box-shadow: 0 0 5px 0 rgba(73, 80, 87, 0.2);
}
.select2-results {
display: block;
}
.select2-results__options {
list-style: none;
margin: 0;
padding: 0;
}
.select2-results__option {
padding: 6px;
user-select: none;
-webkit-user-select: none;
}
.select2-results__option[aria-selected] {
cursor: pointer;
}
.select2-container--open .select2-dropdown {
left: 0;
}
.select2-container--open .select2-dropdown--above {
border-bottom: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.select2-container--open .select2-dropdown--below {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.select2-search--dropdown {
display: block;
padding: 4px;
}
.select2-search--dropdown .select2-search__field {
padding: 4px;
width: 100%;
box-sizing: border-box;
}
.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
-webkit-appearance: none;
}
.select2-search--dropdown.select2-search--hide {
display: none;
}
.select2-close-mask {
border: 0;
margin: 0;
padding: 0;
display: block;
position: fixed;
left: 0;
top: 0;
min-height: 100%;
min-width: 100%;
height: auto;
width: auto;
opacity: 0;
z-index: 99;
background-color: #fff;
filter: alpha(opacity=0);
}
.select2-hidden-accessible {
border: 0 !important;
clip: rect(0 0 0 0) !important;
height: 1px !important;
margin: -1px !important;
overflow: hidden !important;
padding: 0 !important;
position: absolute !important;
width: 1px !important;
}
.select2-container--default .select2-selection--single {
background-color: #fff;
border: 1px;
border-radius: 6px;
border-style: solid;
border-color: #aeb1be;
}
.select2-container--default .select2-selection--single .select2-selection__rendered {
display: block;
padding: 11px 29px 11px 19px;
color: #495057;
font-size: 16px;
line-height: 1.5;
font-weight: 400;
min-height: 48px;
}
.select2-container--default .select2-selection--single .select2-selection__clear {
cursor: pointer;
float: right;
font-weight: 700;
}
.select2-container--default .select2-selection--single .select2-selection__placeholder {
color: #74757f;
}
.select2-container--default .select2-selection--single .select2-selection__arrow {
position: absolute;
top: 50%;
transform: translate3d(0, -50%, 0);
right: 5px;
width: 20px;
}
.select2-container--default .select2-selection--single .select2-selection__arrow b {
pointer-events: none;
color: #495057;
}
.select2-container--default .select2-selection--single .select2-selection__arrow b::before {
position: relative;
display: inline-block;
content: "";
font-family: "Material Design Icons";
font-size: 18px;
transform: rotate(0deg);
transition: .1s;
}
.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear {
float: left;
}
.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow {
left: 1px;
right: auto;
}
.select2-container--default.select2-container--disabled .select2-selection--single {
background-color: #f5f6fa;
cursor: default;
}
.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
display: none;
}
.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrowLine truncated
|
||||
*
|
||||
* D3 Charts
|
||||
*/
.c3 svg {
padding-left: 4px;
width: 100%;
-webkit-tap-highlight-color: transparent;
}
.c3 path,
.c3 line {
fill: none;
stroke: #9f9f9f;
}
.c3 text {
font-family: "Work Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
font-size: 16px;
fill: #9b9b9b;
user-select: none;
}
.c3-legend-item-tile,
.c3-xgrid-focus,
.c3-ygrid,
.c3-event-rect,
.c3-bars path {
shape-rendering: crispEdges;
}
.c3-chart-arc path {
stroke: #fff;
}
.c3-chart-arc text {
fill: #fff;
font-size: 14px;
}
/*-- Axis --*/
/*-- Grid --*/
.c3-grid line {
stroke: #eaebee;
}
.c3-grid text {
fill: #aaa;
}
.c3-xgrid,
.c3-ygrid {
stroke-dasharray: 0 0;
}
/*-- Text on Chart --*/
.c3-text.c3-empty {
fill: #808080;
font-size: 2em;
}
/*-- Line --*/
.c3-line {
stroke-width: 3px;
}
/*-- Point --*/
.c3-circle._expanded_ {
stroke-width: 2px;
stroke: white;
}
.c3-selected-circle {
fill: white;
stroke-width: 2px;
}
/*-- Bar --*/
.c3-bar {
stroke-width: 0;
}
.c3-bar._expanded_ {
fill-opacity: 0.75;
}
/*-- Focus --*/
.c3-target.c3-focused {
opacity: 1;
}
.c3-target.c3-focused path.c3-line,
.c3-target.c3-focused path.c3-step {
stroke-width: 2px;
}
.c3-target.c3-defocused {
opacity: 0.3 !important;
}
/*-- Region --*/
.c3-region {
fill: steelblue;
fill-opacity: .1;
}
/*-- Brush --*/
.c3-brush .extent {
fill-opacity: .1;
fill: #000;
}
/*-- Select - Drag --*/
/*-- Legend --*/
.c3-legend-item {
font-size: 12px;
}
.c3-legend-item-hidden {
opacity: 0.15;
}
.c3-legend-background {
opacity: 0.75;
fill: white;
stroke: lightgray;
stroke-width: 1;
}
/*-- Title --*/
.c3-title {
font: 14px sans-serif;
}
/*-- Tooltip --*/
.c3-tooltip-container {
z-index: 10;
}
.c3-tooltip {
border-collapse: collapse;
border-spacing: 0;
background-color: #fff;
empty-cells: show;
opacity: 0.9;
border: 1px solid #ccc;
}
.c3-tooltip tr {
border: 1px solid #ccc;
}
.c3-tooltip th {
background-color: #aaa;
font-size: 14px;
line-height: 1.2;
padding: 2px 5px;
text-align: left;
color: #fff;
}
.c3-tooltip td {
font-size: 13px;
padding: 3px 6px;
background-color: #fff;
color: #000;
border-left: 1px dotted #999;
}
.c3-tooltip td > span {
display: inline-block;
width: 10px;
height: 10px;
margin-right: 6px;
}
.c3-tooltip td.value {
text-align: right;
}
/*-- Area --*/
.c3-area {
stroke-width: 0;
opacity: 0.2;
}
/*-- Arc --*/
.c3-chart-arcs-title {
dominant-baseline: middle;
font-size: 1.3em;
}
.c3-chart-arcs .c3-chart-arcs-background {
fill: #e0e0e0;
stroke: none;
}
.c3-chart-arcs .c3-chart-arcs-gauge-unit {
fill: #000;
font-size: 16px;
}
.c3-chart-arcs .c3-chart-arcs-gauge-max {
fill: #777;
}
.c3-chart-arcs .c3-chart-arcs-gauge-min {
fill: #777;
}
.c3-chart-arc .c3-gauge-value {
fill: #000;
}
.c3 .domain {
stroke: #c8c8c8;
}
.d3-chart .tick line {
display: none;
}
.d3-chart .c3-tooltip {
opacity: 1;
color: #fff;
background: #0045b6;
border: 1px solid #aeb1be;
}
.d3-chart .c3-tooltip tr th {
padding: 8px 10px;
color: #fff;
background: #495057;
}
.d3-chart .c3-tooltip tr td {
padding: 5px 10px;
color: #838386;
background: #fff;
}
.d3-chart .c3-tooltip .value {
border-left: 1px solid #f2f3f9;
}
#line-chart .c3-tooltip-container {
border-radius: 6px;
overflow: hidden;
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.05);
}
#line-chart .c3-tooltip-container tr {
border: 0;
}
#line-chart .c3-tooltip-container .name {
border-left: 0;
}
#line-chart .c3-tooltip-container table {
border: 0 solid transparent;
border-radius: 6px;
}
#line-chart .c3-axis-y-label {
transform: translateY(-10px);
}
#line-chart .c3-axis-y .tick text {
transform: translateX(1px);
}
#line-chart .c3-axis-x {
text-align: left;
}
#line-chart .c3-axis-x text {
transform: translateX(-1px);
text-anchor: start !important;
}
#line-chart .c3-legend-item {
display: none !important;
transform: translateY(15px);
}
#line-chart .c3-legend-item text {
font-size: 16px;
color: #29293a;
}
.d3-chart-wrap {
width: 100%;
max-width: 100%;
overflow-y: hidden;
overflow-x: auto;
padding-bottom: 30px;
}
.d3-chart-wrap > .d3-chart {
min-width: 520px;
}
.d3-chart-legend {
transform: translateY(-5px);
margin-bottom: -5px;
margin-left: -30px;
text-align: center;
}
.d3-chart-legend > * {
display: inline-block;
margin-top: 5px;
margin-left: 30px;
}
.d3-chart-legend span {
position: relative;
display: inline-block;
font-size: 16px;
color: #74757f;
cursor: pointer;
}
.d3-chart-legend span::before {
content: '';
display: inline-block;
height: 3px;
width: 30px;
margin-right: 12px;
vertical-align: middle;
}
.d3-chart-legend span:nth-child(1)::before {
background: #0045b6;
}
.d3-chart-legend span:nth-child(2)::before {
background: #aeb1be;
}
* + .d3-chart-legend {
margin-top: 20px;
}
@media (min-width: 1600px) {
.d3-chart-legend span {
font-size: 18px;
}
}
.rd-range-input {
border: none;
background: none;
width: auto;
}
.price-devider {
paddinLine truncated
|
||||
@@ -0,0 +1,373 @@
|
||||
/* EXIT Realty / MKDRealtor public brand overrides on Real Estate theme */
|
||||
|
||||
:root {
|
||||
--monica-primary: #00626c;
|
||||
--monica-primary-light: #008898;
|
||||
--monica-ink: #212121;
|
||||
--monica-muted: #6b7280;
|
||||
--monica-surface: #f4f7f7;
|
||||
--monica-border: #d9e3e4;
|
||||
}
|
||||
|
||||
.footer-brand-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.footer-brand-row img {
|
||||
height: 40px;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.about-subtitle {
|
||||
font-size: 18px;
|
||||
color: var(--monica-muted);
|
||||
}
|
||||
|
||||
.page .button-primary,
|
||||
.page .button-primary:focus,
|
||||
.page .button-primary:active,
|
||||
.cookie-consent-banner .button-primary,
|
||||
.cookie-consent-banner .button-primary:focus,
|
||||
.cookie-consent-banner .button-primary:active {
|
||||
background-color: var(--monica-primary) !important;
|
||||
border-color: var(--monica-primary) !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
.page .button-primary:hover,
|
||||
.cookie-consent-banner .button-primary:hover {
|
||||
background-color: var(--monica-primary-light) !important;
|
||||
border-color: var(--monica-primary-light) !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
/* Theme default blue (#0045b6) → EXIT Realty teal on public chrome */
|
||||
html .page .text-primary {
|
||||
color: var(--monica-primary) !important;
|
||||
}
|
||||
.page .breadcrumbs-custom-path a,
|
||||
.page a.link-default {
|
||||
color: var(--monica-primary);
|
||||
}
|
||||
.page a.link-default:hover {
|
||||
color: var(--monica-primary-light);
|
||||
}
|
||||
|
||||
.page .button-gray-bordered:hover,
|
||||
.page .button-gray-bordered:active,
|
||||
.page .button-default:hover,
|
||||
.page .button-default:active,
|
||||
.page .button-accent-outline:hover,
|
||||
.page .button-accent-outline:active,
|
||||
.page .button-primary-outline:hover,
|
||||
.page .button-primary-outline:active,
|
||||
.page .button-primary-white:hover,
|
||||
.page .button-primary-white:active,
|
||||
.page .button.button-primary-lighten,
|
||||
.page .button.button-primary-lighten:focus {
|
||||
background-color: var(--monica-primary) !important;
|
||||
border-color: var(--monica-primary) !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
.page .button.button-primary-lighten:hover,
|
||||
.page .button.button-primary-lighten:active {
|
||||
background-color: var(--monica-ink) !important;
|
||||
border-color: var(--monica-ink) !important;
|
||||
}
|
||||
.page .button-accent-outline,
|
||||
.page .button-accent-outline:focus {
|
||||
border-color: var(--monica-primary) !important;
|
||||
}
|
||||
.page .button-video:hover {
|
||||
color: var(--monica-primary) !important;
|
||||
}
|
||||
.page .btn-primary,
|
||||
.page .btn-primary:active,
|
||||
.page .btn-primary:focus {
|
||||
background: var(--monica-primary) !important;
|
||||
border-color: var(--monica-primary) !important;
|
||||
}
|
||||
.page .box-chloe__icon,
|
||||
.page .box-light-icon,
|
||||
.page .box-minimal-icon .box-chloe__icon {
|
||||
color: var(--monica-primary);
|
||||
}
|
||||
|
||||
/* Mobile drawer active/hover — theme uses #0045b6 */
|
||||
.rd-navbar-fixed .rd-nav-item:hover .rd-nav-link,
|
||||
.rd-navbar-fixed .rd-nav-item.focus .rd-nav-link,
|
||||
.rd-navbar-fixed .rd-nav-item.active .rd-nav-link,
|
||||
.rd-navbar-fixed .rd-nav-item.opened .rd-nav-link {
|
||||
background: var(--monica-primary) !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
/* Scroll-to-top (injected outside .page) */
|
||||
.ui-to-top {
|
||||
background: var(--monica-primary) !important;
|
||||
color: #fff !important;
|
||||
box-shadow: 0 6px 16px rgba(0, 98, 108, 0.35);
|
||||
}
|
||||
.ui-to-top:hover,
|
||||
.ui-to-top:focus {
|
||||
background: var(--monica-primary-light) !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
/* Django flash messages */
|
||||
.flash {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 12px 0 0;
|
||||
}
|
||||
.flash li {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto 8px;
|
||||
padding: 12px 16px;
|
||||
background: #e8f4f5;
|
||||
border-left: 3px solid #00626c;
|
||||
color: #0d4a52;
|
||||
font-size: 14px;
|
||||
}
|
||||
.flash li.error,
|
||||
.flash li.danger {
|
||||
background: #fee2e2;
|
||||
border-left-color: #b91c1c;
|
||||
color: #991b1b;
|
||||
}
|
||||
|
||||
/* Form field errors */
|
||||
.form-wrap .errorlist {
|
||||
list-style: none;
|
||||
margin: 6px 0 0;
|
||||
padding: 0;
|
||||
color: #b91c1c;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
/* Cookie consent — match public EXIT Realty teal brand */
|
||||
.cookie-consent-banner {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 11000;
|
||||
padding: 1rem 1.25rem;
|
||||
background: rgba(17, 24, 28, 0.96);
|
||||
border-top: 2px solid var(--monica-primary);
|
||||
box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.28);
|
||||
font-family: "Work Sans", sans-serif;
|
||||
}
|
||||
.cookie-consent-content {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 1rem;
|
||||
}
|
||||
.cookie-consent-text {
|
||||
flex: 1 1 420px;
|
||||
color: #d7dee3;
|
||||
font-size: 0.9375rem;
|
||||
line-height: 1.45;
|
||||
margin: 0;
|
||||
font-family: "Work Sans", sans-serif;
|
||||
font-weight: 400;
|
||||
}
|
||||
.cookie-consent-text-short {
|
||||
display: none;
|
||||
}
|
||||
.cookie-consent-actions {
|
||||
display: flex;
|
||||
gap: 0.75rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.cookie-consent-banner .button {
|
||||
min-width: 10rem;
|
||||
padding-left: 1.5rem;
|
||||
padding-right: 1.5rem;
|
||||
letter-spacing: 0.04em;
|
||||
text-transform: uppercase;
|
||||
font-family: "Work Sans", sans-serif;
|
||||
font-weight: 500;
|
||||
}
|
||||
.visually-hidden {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap;
|
||||
border: 0;
|
||||
}
|
||||
.footer-link-btn {
|
||||
background: none;
|
||||
border: none;
|
||||
padding: 0;
|
||||
color: #7dd3da;
|
||||
font: inherit;
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
}
|
||||
.footer-link-btn:hover {
|
||||
text-decoration: underline;
|
||||
color: #a8e8ed;
|
||||
}
|
||||
|
||||
.cookie-consent-link {
|
||||
color: #7dd3da;
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 2px;
|
||||
}
|
||||
.cookie-consent-link:hover {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.legal-prose {
|
||||
max-width: 42rem;
|
||||
}
|
||||
.legal-prose .legal-lead {
|
||||
font-size: 1.05rem;
|
||||
color: var(--monica-ink);
|
||||
margin-bottom: 1.75rem;
|
||||
}
|
||||
.legal-prose h2 {
|
||||
font-size: 1.35rem;
|
||||
margin-top: 2rem;
|
||||
margin-bottom: 0.75rem;
|
||||
text-transform: none;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
.legal-prose p {
|
||||
margin-bottom: 1rem;
|
||||
color: #4b5563;
|
||||
line-height: 1.65;
|
||||
}
|
||||
.legal-prose .legal-updated {
|
||||
margin-top: 2.5rem;
|
||||
font-size: 0.875rem;
|
||||
color: var(--monica-muted);
|
||||
}
|
||||
|
||||
/* Contact form — breathe on narrow viewports */
|
||||
@media (max-width: 767.98px) {
|
||||
.contact-form-section > .container {
|
||||
padding-left: 1.5rem;
|
||||
padding-right: 1.5rem;
|
||||
}
|
||||
.contact-form-section .section-lg {
|
||||
padding-top: 2.5rem;
|
||||
padding-bottom: 2.5rem;
|
||||
}
|
||||
.contact-form-section h3 {
|
||||
margin-bottom: 1.25rem;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
.contact-message-form .form-wrap {
|
||||
margin-bottom: 0.35rem;
|
||||
}
|
||||
.contact-message-form .form-label-outside {
|
||||
margin-bottom: 0.35rem;
|
||||
}
|
||||
.contact-message-form .row-10 {
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
.contact-message-form .row-10 > [class*="col-"] {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.footer-aside-copy {
|
||||
text-align: right;
|
||||
}
|
||||
.footer-aside-copy .rights {
|
||||
margin: 0;
|
||||
}
|
||||
.footer-made-by {
|
||||
margin: 6px 0 0;
|
||||
font-size: 13px;
|
||||
color: #9ca3af;
|
||||
font-family: "Work Sans", sans-serif;
|
||||
}
|
||||
.footer-made-by a {
|
||||
color: #d1d5db;
|
||||
text-decoration: underline;
|
||||
}
|
||||
.footer-made-by a:hover {
|
||||
color: #fff;
|
||||
}
|
||||
.footer-minimal .footer-made-by {
|
||||
margin-top: 8px;
|
||||
}
|
||||
.footer-minimal-inner {
|
||||
flex-wrap: wrap;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.pref-check {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
font-size: 15px;
|
||||
color: var(--monica-ink);
|
||||
cursor: pointer;
|
||||
}
|
||||
.pref-check input {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.cookie-consent-banner {
|
||||
padding: 0.625rem 0.75rem;
|
||||
padding-bottom: max(0.625rem, env(safe-area-inset-bottom));
|
||||
}
|
||||
.cookie-consent-content {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
gap: 0.625rem;
|
||||
}
|
||||
.cookie-consent-text-short {
|
||||
display: inline;
|
||||
}
|
||||
.cookie-consent-text-full {
|
||||
display: none;
|
||||
}
|
||||
.cookie-consent-text {
|
||||
flex: none;
|
||||
font-size: 0.8125rem;
|
||||
line-height: 1.35;
|
||||
}
|
||||
.cookie-consent-actions {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
/* Keep hero slide-2 heading visually aligned with slide-1 h1 (SEO: one h1). */
|
||||
.swiper-slider-minimal .jumbotron-classic-content h1.font-weight-bold,
|
||||
.swiper-slider-minimal .jumbotron-classic-content h2.font-weight-bold {
|
||||
font-size: 2.5rem;
|
||||
line-height: 1.15;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
@media (min-width: 768px) {
|
||||
.swiper-slider-minimal .jumbotron-classic-content h1.font-weight-bold,
|
||||
.swiper-slider-minimal .jumbotron-classic-content h2.font-weight-bold {
|
||||
font-size: 3.5rem;
|
||||
}
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
.swiper-slider-minimal .jumbotron-classic-content h1.font-weight-bold,
|
||||
.swiper-slider-minimal .jumbotron-classic-content h2.font-weight-bold {
|
||||
font-size: 4.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 1.5 MiB |
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"><defs><font id="flaticon" horiz-adv-x="512"><font-face units-per-em="512" ascent="448" descent="-64" x-height="240" cap-height="480"/><missing-glyph horiz-adv-x="512"/><glyph unicode="" glyph-name="add137" horiz-adv-x="512" d="M448 256h-128V384c0 35.344 -28.656 64 -64 64c-35.344 0 -64 -28.656 -64 -64v-128H64 c-35.344 0 -64 -28.656 -64 -64c0 -35.344 28.656 -64 64 -64h128v-128c0 -35.344 28.656 -64 64 -64c35.344 0 64 28.656 64 64v128h128c35.344 0 64 28.656 64 64 C512 227.344 483.344 256 448 256zM448 160H288v-160c0 -17.68 -14.32 -32 -32 -32s-32 14.32 -32 32V160H64c-17.68 0 -32 14.32 -32 32c0 17.68 14.32 32 32 32h160V384 c0 17.68 14.32 32 32 32s32 -14.336 32 -32v-160h160c17.68 0 32 -14.32 32 -32C480 174.32 465.68 160 448 160z"/><glyph unicode="" glyph-name="add139" horiz-adv-x="512" d="M256 448C114.608 448 0 333.392 0 192s114.608 -256 256 -256c141.392 0 256 114.624 256 256 S397.392 448 256 448zM256 -32C132.288 -32 32 68.288 32 192S132.288 416 256 416s224 -100.288 224 -224S379.712 -32 256 -32zM352 208h-80v80c0 8.832 -7.168 16 -16 16 c-8.832 0 -16 -7.168 -16 -16v-80h-80c-8.832 0 -16 -7.168 -16 -16s7.168 -16 16 -16h80v-80c0 -8.832 7.168 -16 16 -16c8.832 0 16 7.168 16 16v80h80 c8.832 0 16 7.168 16 16S360.832 208 352 208z"/><glyph unicode="" glyph-name="add149" horiz-adv-x="512" d="M352 208h-80v80c0 8.832 -7.168 16 -16 16s-16 -7.168 -16 -16v-80h-80c-8.832 0 -16 -7.168 -16 -16 c0 -8.832 7.168 -16 16 -16h80v-80c0 -8.832 7.168 -16 16 -16s16 7.168 16 16v80h80c8.832 0 16 7.168 16 16C368 200.832 360.832 208 352 208zM448 448H64 C28.656 448 0 419.344 0 384v-384c0 -35.344 28.656 -64 64 -64h384c35.344 0 64 28.656 64 64V384C512 419.344 483.344 448 448 448zM480 0c0 -17.68 -14.336 -32 -32 -32H64 c-17.68 0 -32 14.32 -32 32V384c0 17.68 14.32 32 32 32h384c17.664 0 32 -14.336 32 -32V0z"/><glyph unicode="" glyph-name="airplane86" horiz-adv-x="512" d="M499.41888892363 435.14677837872c-19.960108794198 20.008128302123 -55.014349579517 15.318223028105 -75.070497389565 -4.7859442898678l-102.05746084347 -101.83336980648 L132.95001094195 399.29221246131C114.83064995154 403.98211773533 96.567230437365 410.03257573389 74.062087723138 387.49542001438c-11.460655891456 -11.492668896739 -35.326351330228 -35.406383843436 0 -70.796761184231l129.82874292681 -106.29918404352L119.42451620971 126.10923187545l-78.816019007722 19.687998249289 c-11.700753431081 3.025228999281 -19.559946228155 0.65626660830963 -25.562384718792 -5.9544189827117c-3.025228999281 -3.7775346234408 -24.970144121049 -20.056147810048 -9.6839340982274 -35.374370838153l91.653234126364 -71.292962766124l71.276956263482 -91.653234126364 c11.076499828055 -11.092506330697 21.368681026667 -4.1776971894832 35.43839684872 9.1877325163348c8.9156219714259 8.9316284740676 6.9948416544221 13.525494732235 4.3057492106168 26.554787882577l-17.81523744021 78.255791415262l83.89008034514 84.178197392691l106.12311251446 -129.82874292681 c35.326351330228 -35.390377340795 59.192046769 -11.476662394098 70.652702660456 0c22.505142714228 22.553162222153 16.454684715666 40.848594741614 11.78078594429 58.9999687373l-70.156501078563 189.6290367962l101.65729827743 102.00944133554 C514.24091036984 380.62863038109 519.37899771782 415.15465657924 499.41888892363 435.14677837872zM477.76209084941 381.63704004752l-119.28045768593 -119.71263325726l72.125300903492 -198.40060024385c3.553443586457 -11.364616875606 1.3445462219026 -25.434332697658 -3.2493200362647 -30.028198955826 c-13.045299652984 -13.077312658267 -22.361084190452 -6.8667896332885 -27.291087004095 -1.376559227186l-115.32685153344 155.80729671429l-127.65185856754 -128.11604714415l22.969331290837 -85.314659080251c-9.0596804952012 9.0916935004846 -62.02519773658 80.016506705849 -63.305717947916 81.297026917185 c-0.84834464001 0.84834464001 -70.492637634039 52.773439209679 -78.015693875637 60.312501953919l81.825241504361 -22.072967142902l130.08484696908 127.73189108075L95.942976834339 336.22659205302c-4.4338012317504 3.9696126551412 -10.260168193329 15.686372588864 1.6806827773783 27.659236564854 c4.5778597555257 4.5938662581674 18.503517053803 5.9864319879951 29.852127426767 2.4329884015381l197.5362491012 -71.581079813674l120.89711445275 118.72023009348c8.4354268921749 8.4514333948166 24.986150623691 7.5870822521649 32.381154844155 0.17607152905868 C485.70131615969 406.22302810517 486.19751774158 390.08847344234 477.76209084941 381.63704004752z"/><glyph unicode="" glyph-name="alarm31" horiz-adv-x="512" d="M368 208h-96V320c0 8.832 -7.168 16 -16 16c-8.832 0 -16 -7.168 -16 -16v-128 c0 -8.832 7.168 -16 16 -16h112c8.832 0 16 7.168 16 16C384 200.832 376.832 208 368 208zM32 368c0 26.512 21.488 48 48 48l32 0V448H80C35.824 448 0 412.176 0 368v-32 h32V368zM432 448h-32l0 -32l32 0c26.512 0 48 -21.488 48 -48v-32h32V368C512 412.176 476.176 448 432 448zM480 192c0 123.712 -100.288 224 -224 224C132.288 416 32 315.712 32 192 c0 -84.832 47.184 -158.64 116.72 -196.656L96 -64h48l42.96 42.96C208.72 Line truncated
|
||||
|
After Width: | Height: | Size: 270 KiB |
|
After Width: | Height: | Size: 434 KiB |
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
<json>
|
||||
<![CDATA[
|
||||
{
|
||||
"fontFamily": "lg",
|
||||
"majorVersion": 1,
|
||||
"minorVersion": 0,
|
||||
"fontURL": "https://github.com/sachinchoolur/lightGallery",
|
||||
"copyright": "sachin",
|
||||
"license": "MLT",
|
||||
"licenseURL": "http://opensource.org/licenses/MIT",
|
||||
"version": "Version 1.0",
|
||||
"fontId": "lg",
|
||||
"psName": "lg",
|
||||
"subFamily": "Regular",
|
||||
"fullName": "lg",
|
||||
"description": "Font generated by IcoMoon."
|
||||
}
|
||||
]]>
|
||||
</json>
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="lg" horiz-adv-x="1024">
|
||||
<font-face units-per-em="1024" ascent="960" descent="-64" />
|
||||
<missing-glyph horiz-adv-x="1024" />
|
||||
<glyph unicode=" " horiz-adv-x="512" d="" />
|
||||
<glyph unicode="" glyph-name="pause_circle_outline" data-tags="pause_circle_outline" d="M554 256.667v340h86v-340h-86zM512 84.667q140 0 241 101t101 241-101 241-241 101-241-101-101-241 101-241 241-101zM512 852.667q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125zM384 256.667v340h86v-340h-86z" />
|
||||
<glyph unicode="" glyph-name="play_circle_outline" data-tags="play_circle_outline" d="M512 84.667q140 0 241 101t101 241-101 241-241 101-241-101-101-241 101-241 241-101zM512 852.667q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125zM426 234.667v384l256-192z" />
|
||||
<glyph unicode="" glyph-name="stack-2" data-tags="stack-2" d="M384 853.334h426.667q53 0 90.5-37.5t37.5-90.5v-426.667q0-53-37.5-90.5t-90.5-37.5h-426.667q-53 0-90.5 37.5t-37.5 90.5v426.667q0 53 37.5 90.5t90.5 37.5zM170.667 675.334v-547.333q0-17.667 12.5-30.167t30.167-12.5h547.333q-13.333-37.667-46.333-61.5t-74.333-23.833h-426.667q-53 0-90.5 37.5t-37.5 90.5v426.667q0 41.333 23.833 74.333t61.5 46.333zM810.667 768h-426.667q-17.667 0-30.167-12.5t-12.5-30.167v-426.667q0-17.667 12.5-30.167t30.167-12.5h426.667q17.667 0 30.167 12.5t12.5 30.167v426.667q0 17.667-12.5 30.167t-30.167 12.5z" />
|
||||
<glyph unicode="" glyph-name="clear" data-tags="clear" d="M810 664.667l-238-238 238-238-60-60-238 238-238-238-60 60 238 238-238 238 60 60 238-238 238 238z" />
|
||||
<glyph unicode="" glyph-name="arrow-left" data-tags="arrow-left" d="M426.667 768q17.667 0 30.167-12.5t12.5-30.167q0-18-12.667-30.333l-225.667-225.667h665q17.667 0 30.167-12.5t12.5-30.167-12.5-30.167-30.167-12.5h-665l225.667-225.667q12.667-12.333 12.667-30.333 0-17.667-12.5-30.167t-30.167-12.5q-18 0-30.333 12.333l-298.667 298.667q-12.333 13-12.333 30.333t12.333 30.333l298.667 298.667q12.667 12.333 30.333 12.333z" />
|
||||
<glyph unicode="" glyph-name="arrow-right" data-tags="arrow-right" d="M597.333 768q18 0 30.333-12.333l298.667-298.667q12.333-12.333 12.333-30.333t-12.333-30.333l-298.667-298.667q-12.333-12.333-30.333-12.333-18.333 0-30.5 12.167t-12.167 30.5q0 18 12.333 30.333l226 225.667h-665q-17.667 0-30.167 12.5t-12.5 30.167 12.5 30.167 30.167 12.5h665l-226 225.667q-12.333 12.333-12.333 30.333 0 18.333 12.167 30.5t30.5 12.167z" />
|
||||
<glyph unicode="" glyph-name="vertical_align_bottom" data-tags="vertical_align_bottom" d="M170 128.667h684v-86h-684v86zM682 384.667l-170-172-170 172h128v426h84v-426h128z" />
|
||||
<glyph unicode="" glyph-name="apps" data-tags="apps" d="M682 84.667v172h172v-172h-172zM682 340.667v172h172v-172h-172zM426 596.667v172h172v-172h-172zM682 768.667h172v-172h-172v172zM426 340.667v172h172v-172h-172zM170 340.667v172h172v-172h-172zM170 84.667v172h172v-172h-172zM426 84.667v172h172v-172h-172zM170 596.667v172h172v-172h-172z" />
|
||||
<glyph unicode="" glyph-name="fullscreen" data-tags="fullscreen" d="M598 724.667h212v-212h-84v128h-128v84zM726 212.667v128h84v-212h-212v84h128zM214 512.667v212h212v-84h-128v-128h-84zM298 340.667v-128h128v-84h-212v212h84z" />
|
||||
<glyph unicode="" glyph-name="fullscreen_exit" data-tags="fullscreen_exit" d="M682 596.667h128v-84h-212v212h84v-128zM598 128.667v212h212v-84h-128v-128h-84zM342 596.667v128h84v-212h-212v84h128zM214 256.667v84h212v-212h-84v128h-128z" />
|
||||
<glyph unicode="" glyph-name="zoom_in" data-tags="zoom_in" d="M512 512.667h-86v-86h-42v86h-86v42h86v86h42v-86h86v-42zM406 340.667q80 0 136 56t56 136-56 136-136 56-136-56-56-136 56-136 136-56zM662 340.667l212-212-64-64-212 212v34l-12 12q-76-66-180-66-116 0-197 80t-81 196 81 197 197 81 196-81 80-197q0-104-66-180l12-12h34z" />
|
||||
<glyph unicode="" glyph-name="zoom_out" data-tags="zoom_out" d="M298 554.667h214v-42h-214v42zM406 340.667q80 0 136 56t56 136-56 136-136 56-136-56-56-136 56-136 136-56zM662 340.667l212-212-64-64-212 212v34l-12 12q-76-66-180-66-116 0-197 80t-81 196 81 197 197 81 196-81 80-197q0-104-66-180l12-12h34z" />
|
||||
<glyph unicode="" glyph-name="share" data-tags="share" d="M768 252.667c68 0 124-56 124-124s-56-126-124-126-124 58-124 126c0 10 0 20 2 28l-302 176c-24-22-54-34-88-34-70 0-128 58-128 128s58 128 128 128c34 0 64-12 88-34l300 174c-2 10-4 20-4 30 0 70 58 128 128 128s128-58 128-128-58-128-128-128c-34 0-64 14-88 36l-300-176c2-10 4-20 4-30s-2-20-4-30l304-176c22 20 52 32 84 32z" />
|
||||
<glyph unicode="" glyph-name="facebook-with-circle" data-tags="facebook-with-circle" d="M512 952.32c-271.462 0-491.52-220.058-491.52-491.52s220.058-491.52 491.52-491.52 491.52 220.058 491.52 491.52-220.058 491.52-491.52 491.52zM628.429 612.659h-73.882c-8.755 0-18.483-11.52-18.483-26.829v-53.35h92.416l-13.978-76.083h-78.438v-228.403h-87.194v228.403h-79.104v76.083h79.104v44.749c0 64.205 44.544 116.378 105.677 116.378h73.882v-80.947z" />
|
||||
<glyph unicode="" glyph-name="google-with-circle" data-tags="google+-with-circle" d="M512 952.32c-271.462 0-491.52-220.058-491.52-491.52s220.058-491.52 491.52-491.52 491.52 220.058 491.52 491.52-220.058 491.52-491.52 491.52zM483.686 249.805c-30.874-15.002-64.102-16.589-76.954-16.589-2.458 0-3.84 0-3.84 0s-1.178 0-2.765 0c-20.070 0-119.962 4.608-119.962 95.59 0 89.395 108.8 96.41 142.131 96.41h0.87c-19.251 25.702-15.258 51.61-15.258 51.61-1.69-0.102-4.147-0.205-7.168-0.205-12.544 0-36.762 1.997-57.549 15.411-25.498 16.384-38.4 44.288-38.4 82.893 0 109.107 119.142 113.51 120.32 113.613h118.989v-2.611c0-13.312-23.91-15.923-40.192-18.125-5.53-0.819-16.64-1.894-19.763-3.482 30.157-16.128 35.021-41.421 35.021-79.104 0-42.906-16.794-65.587-34.611-81.51-11.059-9.882-19.712-17.613-19.712-28.006 0-10.189 11.878-20.582 25.702-32.717 22.579-19.917 53.555-47.002 53.555-92.723 0-47.258-20.326-81.050-60.416-100.454zM742.4 460.8h-76.8v-76.8h-51.2v76.8h-76.8v51.2h76.8v76.8h51.2v-76.8h76.8v-51.2zM421.018 401.92c-2.662 0-5.325-0.102-8.038-0.307-22.733-1.69-43.725-10.189-58.88-24.013-15.053-13.619-22.733-30.822-21.658-48.179 2.304-36.403 41.37-57.702 88.832-54.323 46.694 3.379 77.824 30.31 75.571 66.714-2.15 34.202-31.898 60.109-75.827 60.109zM465.766 599.808c-12.39 43.52-32.358 56.422-63.386 56.422-3.328 0-6.707-0.512-9.933-1.382-13.466-3.84-24.166-15.053-30.106-31.744-6.093-16.896-6.451-34.509-1.229-54.579 9.472-35.891 34.97-61.901 60.672-61.901 3.379 0 6.758 0.41 9.933 1.382 28.109 7.885 45.722 50.79 34.048 91.802z" />
|
||||
<glyph unicode="" glyph-name="pinterest-with-circle" data-tags="pinterest-with-circle" d="M512 952.32c-271.462 0-491.52-220.058-491.52-491.52s220.058-491.52 491.52-491.52 491.52 220.058 491.52 491.52-220.058 491.52-491.52 491.52zM545.638 344.32c-31.539 2.406-44.749 18.022-69.427 32.973-13.568-71.219-30.157-139.52-79.309-175.206-15.206 107.725 22.221 188.518 39.629 274.381-29.645 49.92 3.533 150.323 66.099 125.645 76.954-30.515-66.662-185.6 29.747-205.005 100.659-20.173 141.773 174.694 79.36 237.978-90.214 91.494-262.502 2.099-241.306-128.87 5.12-32 38.246-41.728 13.21-85.914-57.702 12.8-74.957 58.317-72.704 118.989 3.533 99.328 89.242 168.909 175.155 178.483 108.698 12.083 210.688-39.885 224.819-142.182 15.821-115.405-49.101-240.282-165.274-231.27z" />
|
||||
<glyph unicode="" glyph-name="twitter-with-circle" data-tags="twitter-with-circle" d="M512 952.32c-271.462 0-491.52-220.058-491.52-491.52s220.058-491.52 491.52-491.52 491.52 220.058 491.52 491.52-220.058 491.52-491.52 491.52zM711.936 549.683c0.205-4.198 0.256-8.397 0.256-12.493 0-128-97.331-275.507-275.405-275.507-54.682 0-105.574 15.974-148.378 43.52 7.526-0.922 15.258-1.28 23.091-1.28 45.363 0 87.091 15.411 120.218 41.421-42.342 0.819-78.080 28.774-90.419 67.174 5.888-1.075 11.93-1.69 18.176-1.69 8.806 0 17.408 1.178 25.498 3.379-44.288 8.909-77.67 48.026-77.67 94.925v1.178c13.056-7.219 28.006-11.622 43.878-12.134-26.010 17.408-43.059 47.002-43.059 80.64 0 17.715 4.762 34.406 13.107 48.691 47.77-58.573 119.040-97.075 199.526-101.222-1.69 7.117-2.509 14.49-2.509 22.118 0 53.402 43.315 96.819 96.819 96.819 27.802 0 52.992-11.776 70.656-30.618 22.067 4.403 42.752 12.39 61.44 23.501-7.219-22.579-22.528-41.574-42.547-53.606 19.61 2.406 38.246 7.578 55.603 15.309-12.954-19.405-29.389-36.506-48.282-50.125z" />
|
||||
</font></defs></svg>
|
||||
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 1.5 MiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 647 KiB |
|
After Width: | Height: | Size: 455 KiB |
|
After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 163 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 15 KiB |