commit 7ec75d074772f5c21156ea4f8e297bbf825de6c3 Author: wille Date: Mon Apr 6 16:49:17 2026 -0400 Initial commit diff --git a/.env_example b/.env_example new file mode 100644 index 0000000..cb0c868 --- /dev/null +++ b/.env_example @@ -0,0 +1,8 @@ +DB_HOST= +DB_USER= +DB_PASS= +DB_NAME= +TOKEN_SECRET= +UPLOAD_{preset}_DIR= +UPLOAD_{preset}_ALLOWED= +UPLOAD_{preset}_MAX_MB= \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..3258cd5 --- /dev/null +++ b/.htaccess @@ -0,0 +1,53 @@ +# ============================================================================== +# CORPINTECH MASTER FRAMEWORK HTACCESS +# ============================================================================== + +# 1. CORE ENGINE +RewriteEngine On +RewriteBase / + +# 2. FAST-TRACK STATIC ASSETS (Crucial for your 0.6s JS fix) +# This ensures images, css, and js are served instantly without PHP intervention +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# 3. GLOBAL ROUTING (Off-branch Logic) +# Redirect /page to /page/ for SEO consistency +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ +RewriteRule ^(.*)$ $1/ [R=301,L] + +# 4. API & SYSTEM REWRITES (Off-branch Logic) +# Maps tracking requests and API calls +RewriteRule ^api/(.*)$ sys/api/index.php [L,QSA] +RewriteRule ^gnotr/(.*)$ resource/tracking.js [L,QSA] + +# 5. DYNAMIC PAGE ROUTING (The Merge) +# Property/Product IDs (CRM focus) +RewriteRule ^property/([^/]+)/$ index.php?page=property&prop_id=$1 [L,QSA] + +# Standard Pages +RewriteRule ^([^/]+)/$ index.php?page=$1 [L,QSA] + +# 6. ERROR HANDLING +ErrorDocument 404 /index.php?page=404 + +# 7. PERFORMANCE & SECURITY (Main Branch Logic) + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json + + + + ExpiresActive On + ExpiresDefault "access plus 1 month" + ExpiresByType image/x-icon "access plus 1 year" + + + + Header set X-Content-Type-Options "nosniff" + Header set X-Frame-Options "DENY" + + +# Prevent directory listing +Options -Indexes \ No newline at end of file diff --git a/build/workflows/deploy.yml b/build/workflows/deploy.yml new file mode 100644 index 0000000..23a89ce --- /dev/null +++ b/build/workflows/deploy.yml @@ -0,0 +1,168 @@ +name: Deploy (yggdrasil) + +on: + push: + branches: ["main"] + +jobs: + deploy: + runs-on: [ mainhost ] + env: + SSH_HOST: ${{ secrets.SSH_HOST }} + SSH_USER: ${{ secrets.SSH_USER }} + SSH_KEY_PATH: /home/gitea-runner/.ssh/id_ed25519 + + SSH_OPTS: >- + -F /dev/null + -o IdentitiesOnly=yes + -o IdentityAgent=none + -o PreferredAuthentications=publickey + -o PubkeyAuthentication=yes + -o PasswordAuthentication=no + -o NumberOfPasswordPrompts=0 + -o BatchMode=yes + -o ServerAliveInterval=15 + -o ServerAliveCountMax=3 + -o ConnectTimeout=20 + -o StrictHostKeyChecking=no + + APP_ROOT: /var/www/yggdrasil + KEEP_N: "5" + SHARED_DIRS: "uploads:cache" + HEALTH_URL: "https://yggdrasil.corpintech.net/" + SERVICE_NAME: "apache2" + + steps: + - name: Checkout (pure git, private repo) + env: + GIT_TOKEN: ${{ secrets.GIT_TOKEN }} + run: | + set -euo pipefail + export GIT_TERMINAL_PROMPT=0 + + git init -b main + git remote add origin "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git" + + git -c http.extraHeader="Authorization: token ${GIT_TOKEN}" \ + fetch --no-tags --depth=1 origin "${GITHUB_SHA}" + + git checkout -q "${GITHUB_SHA}" + + - name: SSH smoke test + run: | + set -euo pipefail + ssh $SSH_OPTS -i "$SSH_KEY_PATH" "${SSH_USER}@${SSH_HOST}" true + + - name: Deploy atomically + run: | + set -euo pipefail + + REL="$(date -u +%Y%m%d-%H%M%SZ)-${GITHUB_SHA}" + TAR_LOCAL="release/${REL}.tar.gz" + + mkdir -p release + + IFS=':' read -r -a SHARED_DIR_ARR <<< "${SHARED_DIRS}" + + EXCLUDES=(--exclude-vcs --exclude='./node_modules' --exclude='./release') + for d in "${SHARED_DIR_ARR[@]}"; do + EXCLUDES+=( "--exclude=./${d}" ) + done + + tar -czf "${TAR_LOCAL}" "${EXCLUDES[@]}" . + + ssh $SSH_OPTS -i "$SSH_KEY_PATH" "${SSH_USER}@${SSH_HOST}" \ + "set -e; + install -d -m 2755 '${APP_ROOT}' '${APP_ROOT}/releases' '${APP_ROOT}/shared' '${APP_ROOT}/logs';" + + for d in "${SHARED_DIR_ARR[@]}"; do + ssh $SSH_OPTS -i "$SSH_KEY_PATH" "${SSH_USER}@${SSH_HOST}" \ + "install -d -m 2755 '${APP_ROOT}/shared/${d}'" + done + + scp -O $SSH_OPTS -i "$SSH_KEY_PATH" "${TAR_LOCAL}" "${SSH_USER}@${SSH_HOST}:/tmp/${REL}.tar.gz" + + ssh $SSH_OPTS -i "$SSH_KEY_PATH" "${SSH_USER}@${SSH_HOST}" bash -s -- \ + "${APP_ROOT}" \ + "${REL}" \ + "${KEEP_N}" \ + "${SHARED_DIRS}" \ + "${HEALTH_URL}" \ + "${SERVICE_NAME}" \ + "${GITHUB_SHA}" <<'REMOTE' + set -euo pipefail + + APP_ROOT="$1" + REL="$2" + KEEP_N="$3" + SHARED_DIRS="$4" + HEALTH_URL="$5" + SERVICE_NAME="$6" + GITSHA="$7" + + IFS=':' read -r -a SHARED_DIR_ARR <<< "${SHARED_DIRS}" + + RELEASES="${APP_ROOT}/releases" + SHARED="${APP_ROOT}/shared" + CUR="${APP_ROOT}/current" + NEW="${RELEASES}/${REL}" + TAR="/tmp/${REL}.tar.gz" + + echo "--> Extracting ${REL}" + mkdir -p "${NEW}" + tar -xzf "${TAR}" -C "${NEW}" + rm -f "${TAR}" + + echo "--> Linking shared dirs" + for d in "${SHARED_DIR_ARR[@]}"; do + echo " ${d}" + rm -rf "${NEW:?}/${d}" + ln -s "${SHARED}/${d}" "${NEW}/${d}" + done + + if [ -f "${SHARED}/.env" ]; then + ln -sf "${SHARED}/.env" "${NEW}/.env" + fi + + printf "sha=%s\nbuilt_at=%s\n" "${GITSHA}" "$(date -u +%FT%TZ)" > "${NEW}/RELEASE" + + PREV="$(readlink -f "${CUR}" 2>/dev/null || true)" + + echo "--> Swapping symlink" + ln -sfn "${NEW}" "${CUR}" + + echo "--> Restarting Apache" + sudo /usr/bin/systemctl restart "${SERVICE_NAME}" + + if command -v curl >/dev/null 2>&1; then + echo "--> Health check ${HEALTH_URL}" + if ! curl -fsS --max-time 10 "${HEALTH_URL}" >/dev/null; then + echo "Health check failed, rolling back..." + if [ -n "${PREV}" ] && [ -e "${PREV}" ]; then + ln -sfn "${PREV}" "${CUR}" + sudo /usr/bin/systemctl restart "${SERVICE_NAME}" + fi + exit 1 + fi + fi + + echo "--> Cleaning old releases" + CUR_REAL="$(readlink -f "${CUR}" 2>/dev/null || true)" + cd "${RELEASES}" + + i=0 + for name in $(ls -1t); do + path="${RELEASES}/${name}" + + if [ "${path}" = "${CUR_REAL}" ] || [ "${path}" = "${PREV}" ] || [ "${path}" = "${NEW}" ]; then + continue + fi + + i=$((i+1)) + if [ "${i}" -gt "${KEEP_N}" ]; then + rm -rf -- "${path}" + fi + done + + echo "--> Deploy complete" + REMOTE \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..1f49740 --- /dev/null +++ b/index.php @@ -0,0 +1,16 @@ + * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + margin-top: var(--gutter-y); +} + +.row-wrap { + display: flex; + align-items: center; + justify-content: space-between; + gap: 14px; + flex-wrap: wrap; +} + +/* gutter utilities */ +.g-0 { + --gutter-x: 0; + --gutter-y: 0; +} + +.gx-0 { + --gutter-x: 0; +} + +.gy-0 { + --gutter-y: 0; +} + +/* IMPORTANT: no @extend across media queries */ +@media (min-width: 0) { + .col-1 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 8.3333333333%; + } + .col-2 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-3 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 25%; + } + .col-4 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 33.3333333333%; + } + .col-5 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 41.6666666667%; + } + .col-6 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 50%; + } + .col-7 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 58.3333333333%; + } + .col-8 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 66.6666666667%; + } + .col-9 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 75%; + } + .col-10 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 83.3333333333%; + } + .col-11 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 91.6666666667%; + } + .col-12 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 100%; + } + .col { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 1 0 0%; + } + .col-auto { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: auto; + } +} +@media (min-width: 576px) { + .col-sm-1 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 8.3333333333%; + } + .col-sm-2 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-sm-3 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 25%; + } + .col-sm-4 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 33.3333333333%; + } + .col-sm-5 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 41.6666666667%; + } + .col-sm-6 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 50%; + } + .col-sm-7 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 58.3333333333%; + } + .col-sm-8 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 66.6666666667%; + } + .col-sm-9 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 75%; + } + .col-sm-10 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 83.3333333333%; + } + .col-sm-11 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 91.6666666667%; + } + .col-sm-12 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 100%; + } + .col-sm { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 1 0 0%; + } + .col-sm-auto { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: auto; + } +} +@media (min-width: 768px) { + .col-md-1 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 8.3333333333%; + } + .col-md-2 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-md-3 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 25%; + } + .col-md-4 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 33.3333333333%; + } + .col-md-5 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 41.6666666667%; + } + .col-md-6 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 50%; + } + .col-md-7 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 58.3333333333%; + } + .col-md-8 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 66.6666666667%; + } + .col-md-9 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 75%; + } + .col-md-10 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 83.3333333333%; + } + .col-md-11 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 91.6666666667%; + } + .col-md-12 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 100%; + } + .col-md { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 1 0 0%; + } + .col-md-auto { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: auto; + } +} +@media (min-width: 992px) { + .col-lg-1 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 8.3333333333%; + } + .col-lg-2 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-lg-3 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 25%; + } + .col-lg-4 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 33.3333333333%; + } + .col-lg-5 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 41.6666666667%; + } + .col-lg-6 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 50%; + } + .col-lg-7 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 58.3333333333%; + } + .col-lg-8 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 66.6666666667%; + } + .col-lg-9 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 75%; + } + .col-lg-10 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 83.3333333333%; + } + .col-lg-11 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 91.6666666667%; + } + .col-lg-12 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 100%; + } + .col-lg { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 1 0 0%; + } + .col-lg-auto { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: auto; + } +} +@media (min-width: 1200px) { + .col-xl-1 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 8.3333333333%; + } + .col-xl-2 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-xl-3 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 25%; + } + .col-xl-4 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 33.3333333333%; + } + .col-xl-5 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 41.6666666667%; + } + .col-xl-6 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 50%; + } + .col-xl-7 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 58.3333333333%; + } + .col-xl-8 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 66.6666666667%; + } + .col-xl-9 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 75%; + } + .col-xl-10 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 83.3333333333%; + } + .col-xl-11 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 91.6666666667%; + } + .col-xl-12 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 100%; + } + .col-xl { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 1 0 0%; + } + .col-xl-auto { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: auto; + } +} +@media (min-width: 1400px) { + .col-xxl-1 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 8.3333333333%; + } + .col-xxl-2 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-xxl-3 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 25%; + } + .col-xxl-4 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 33.3333333333%; + } + .col-xxl-5 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 41.6666666667%; + } + .col-xxl-6 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 50%; + } + .col-xxl-7 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 58.3333333333%; + } + .col-xxl-8 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 66.6666666667%; + } + .col-xxl-9 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 75%; + } + .col-xxl-10 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 83.3333333333%; + } + .col-xxl-11 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 91.6666666667%; + } + .col-xxl-12 { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: 100%; + } + .col-xxl { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 1 0 0%; + } + .col-xxl-auto { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + flex: 0 0 auto; + width: auto; + } +} +/* -------------------------------------------- + Display / Flex utilities +-------------------------------------------- */ +@media (min-width: 0) { + .d-none { + display: none !important; + } + .d-block { + display: block !important; + } + .d-inline { + display: inline !important; + } + .d-inline-block { + display: inline-block !important; + } + .d-flex { + display: flex !important; + } + .d-inline-flex { + display: inline-flex !important; + } + .d-grid { + display: grid !important; + } + .justify-start { + justify-content: flex-start !important; + } + .justify-end { + justify-content: flex-end !important; + } + .justify-center { + justify-content: center !important; + } + .justify-between { + justify-content: space-between !important; + } + .justify-around { + justify-content: space-around !important; + } + .justify-evenly { + justify-content: space-evenly !important; + } + .align-start { + align-items: flex-start !important; + } + .align-end { + align-items: flex-end !important; + } + .align-center { + align-items: center !important; + } + .align-baseline { + align-items: baseline !important; + } + .align-stretch { + align-items: stretch !important; + } + .flex-row { + flex-direction: row !important; + } + .flex-row-reverse { + flex-direction: row-reverse !important; + } + .flex-column { + flex-direction: column !important; + } + .flex-column-reverse { + flex-direction: column-reverse !important; + } +} +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline-flex { + display: inline-flex !important; + } + .d-sm-grid { + display: grid !important; + } + .justify-sm-start { + justify-content: flex-start !important; + } + .justify-sm-end { + justify-content: flex-end !important; + } + .justify-sm-center { + justify-content: center !important; + } + .justify-sm-between { + justify-content: space-between !important; + } + .justify-sm-around { + justify-content: space-around !important; + } + .justify-sm-evenly { + justify-content: space-evenly !important; + } + .align-sm-start { + align-items: flex-start !important; + } + .align-sm-end { + align-items: flex-end !important; + } + .align-sm-center { + align-items: center !important; + } + .align-sm-baseline { + align-items: baseline !important; + } + .align-sm-stretch { + align-items: stretch !important; + } + .flex-sm-row { + flex-direction: row !important; + } + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + .flex-sm-column { + flex-direction: column !important; + } + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } +} +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + .d-md-block { + display: block !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline-flex { + display: inline-flex !important; + } + .d-md-grid { + display: grid !important; + } + .justify-md-start { + justify-content: flex-start !important; + } + .justify-md-end { + justify-content: flex-end !important; + } + .justify-md-center { + justify-content: center !important; + } + .justify-md-between { + justify-content: space-between !important; + } + .justify-md-around { + justify-content: space-around !important; + } + .justify-md-evenly { + justify-content: space-evenly !important; + } + .align-md-start { + align-items: flex-start !important; + } + .align-md-end { + align-items: flex-end !important; + } + .align-md-center { + align-items: center !important; + } + .align-md-baseline { + align-items: baseline !important; + } + .align-md-stretch { + align-items: stretch !important; + } + .flex-md-row { + flex-direction: row !important; + } + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + .flex-md-column { + flex-direction: column !important; + } + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } +} +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline-flex { + display: inline-flex !important; + } + .d-lg-grid { + display: grid !important; + } + .justify-lg-start { + justify-content: flex-start !important; + } + .justify-lg-end { + justify-content: flex-end !important; + } + .justify-lg-center { + justify-content: center !important; + } + .justify-lg-between { + justify-content: space-between !important; + } + .justify-lg-around { + justify-content: space-around !important; + } + .justify-lg-evenly { + justify-content: space-evenly !important; + } + .align-lg-start { + align-items: flex-start !important; + } + .align-lg-end { + align-items: flex-end !important; + } + .align-lg-center { + align-items: center !important; + } + .align-lg-baseline { + align-items: baseline !important; + } + .align-lg-stretch { + align-items: stretch !important; + } + .flex-lg-row { + flex-direction: row !important; + } + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + .flex-lg-column { + flex-direction: column !important; + } + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } +} +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline-flex { + display: inline-flex !important; + } + .d-xl-grid { + display: grid !important; + } + .justify-xl-start { + justify-content: flex-start !important; + } + .justify-xl-end { + justify-content: flex-end !important; + } + .justify-xl-center { + justify-content: center !important; + } + .justify-xl-between { + justify-content: space-between !important; + } + .justify-xl-around { + justify-content: space-around !important; + } + .justify-xl-evenly { + justify-content: space-evenly !important; + } + .align-xl-start { + align-items: flex-start !important; + } + .align-xl-end { + align-items: flex-end !important; + } + .align-xl-center { + align-items: center !important; + } + .align-xl-baseline { + align-items: baseline !important; + } + .align-xl-stretch { + align-items: stretch !important; + } + .flex-xl-row { + flex-direction: row !important; + } + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xl-column { + flex-direction: column !important; + } + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } +} +@media (min-width: 1400px) { + .d-xxl-none { + display: none !important; + } + .d-xxl-block { + display: block !important; + } + .d-xxl-inline { + display: inline !important; + } + .d-xxl-inline-block { + display: inline-block !important; + } + .d-xxl-flex { + display: flex !important; + } + .d-xxl-inline-flex { + display: inline-flex !important; + } + .d-xxl-grid { + display: grid !important; + } + .justify-xxl-start { + justify-content: flex-start !important; + } + .justify-xxl-end { + justify-content: flex-end !important; + } + .justify-xxl-center { + justify-content: center !important; + } + .justify-xxl-between { + justify-content: space-between !important; + } + .justify-xxl-around { + justify-content: space-around !important; + } + .justify-xxl-evenly { + justify-content: space-evenly !important; + } + .align-xxl-start { + align-items: flex-start !important; + } + .align-xxl-end { + align-items: flex-end !important; + } + .align-xxl-center { + align-items: center !important; + } + .align-xxl-baseline { + align-items: baseline !important; + } + .align-xxl-stretch { + align-items: stretch !important; + } + .flex-xxl-row { + flex-direction: row !important; + } + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xxl-column { + flex-direction: column !important; + } + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } +} +/* Convenience */ +.flex-column { + flex-direction: column !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.min-w-0 { + min-width: 0 !important; +} + +.w-100 { + width: 100% !important; +} + +.h-100 { + height: 100% !important; +} + +/* -------------------------------------------- + Spacing utilities (generator) +-------------------------------------------- */ +@media (min-width: 0) { + .mt-0 { + margin-top: 0 !important; + } + .mt-1 { + margin-top: 0.25rem !important; + } + .mt-2 { + margin-top: 0.5rem !important; + } + .mt-3 { + margin-top: 1rem !important; + } + .mt-4 { + margin-top: 1.5rem !important; + } + .mt-5 { + margin-top: 2rem !important; + } + .mt-6 { + margin-top: 3rem !important; + } + .mt-7 { + margin-top: 4rem !important; + } + .mb-0 { + margin-bottom: 0 !important; + } + .mb-1 { + margin-bottom: 0.25rem !important; + } + .mb-2 { + margin-bottom: 0.5rem !important; + } + .mb-3 { + margin-bottom: 1rem !important; + } + .mb-4 { + margin-bottom: 1.5rem !important; + } + .mb-5 { + margin-bottom: 2rem !important; + } + .mb-6 { + margin-bottom: 3rem !important; + } + .mb-7 { + margin-bottom: 4rem !important; + } + .ms-0 { + margin-start: 0 !important; + } + .ms-1 { + margin-start: 0.25rem !important; + } + .ms-2 { + margin-start: 0.5rem !important; + } + .ms-3 { + margin-start: 1rem !important; + } + .ms-4 { + margin-start: 1.5rem !important; + } + .ms-5 { + margin-start: 2rem !important; + } + .ms-6 { + margin-start: 3rem !important; + } + .ms-7 { + margin-start: 4rem !important; + } + .me-0 { + margin-end: 0 !important; + } + .me-1 { + margin-end: 0.25rem !important; + } + .me-2 { + margin-end: 0.5rem !important; + } + .me-3 { + margin-end: 1rem !important; + } + .me-4 { + margin-end: 1.5rem !important; + } + .me-5 { + margin-end: 2rem !important; + } + .me-6 { + margin-end: 3rem !important; + } + .me-7 { + margin-end: 4rem !important; + } + .mx-0 { + margin-left: 0 !important; + margin-right: 0 !important; + } + .mx-1 { + margin-left: 0.25rem !important; + margin-right: 0.25rem !important; + } + .mx-2 { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; + } + .mx-3 { + margin-left: 1rem !important; + margin-right: 1rem !important; + } + .mx-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important; + } + .mx-5 { + margin-left: 2rem !important; + margin-right: 2rem !important; + } + .mx-6 { + margin-left: 3rem !important; + margin-right: 3rem !important; + } + .mx-7 { + margin-left: 4rem !important; + margin-right: 4rem !important; + } + .my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-5 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .my-6 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-7 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .ma-0 { + margin: 0 !important; + } + .ma-1 { + margin: 0.25rem !important; + } + .ma-2 { + margin: 0.5rem !important; + } + .ma-3 { + margin: 1rem !important; + } + .ma-4 { + margin: 1.5rem !important; + } + .ma-5 { + margin: 2rem !important; + } + .ma-6 { + margin: 3rem !important; + } + .ma-7 { + margin: 4rem !important; + } + .pt-0 { + padding-top: 0 !important; + } + .pt-1 { + padding-top: 0.25rem !important; + } + .pt-2 { + padding-top: 0.5rem !important; + } + .pt-3 { + padding-top: 1rem !important; + } + .pt-4 { + padding-top: 1.5rem !important; + } + .pt-5 { + padding-top: 2rem !important; + } + .pt-6 { + padding-top: 3rem !important; + } + .pt-7 { + padding-top: 4rem !important; + } + .pb-0 { + padding-bottom: 0 !important; + } + .pb-1 { + padding-bottom: 0.25rem !important; + } + .pb-2 { + padding-bottom: 0.5rem !important; + } + .pb-3 { + padding-bottom: 1rem !important; + } + .pb-4 { + padding-bottom: 1.5rem !important; + } + .pb-5 { + padding-bottom: 2rem !important; + } + .pb-6 { + padding-bottom: 3rem !important; + } + .pb-7 { + padding-bottom: 4rem !important; + } + .ps-0 { + padding-start: 0 !important; + } + .ps-1 { + padding-start: 0.25rem !important; + } + .ps-2 { + padding-start: 0.5rem !important; + } + .ps-3 { + padding-start: 1rem !important; + } + .ps-4 { + padding-start: 1.5rem !important; + } + .ps-5 { + padding-start: 2rem !important; + } + .ps-6 { + padding-start: 3rem !important; + } + .ps-7 { + padding-start: 4rem !important; + } + .pe-0 { + padding-end: 0 !important; + } + .pe-1 { + padding-end: 0.25rem !important; + } + .pe-2 { + padding-end: 0.5rem !important; + } + .pe-3 { + padding-end: 1rem !important; + } + .pe-4 { + padding-end: 1.5rem !important; + } + .pe-5 { + padding-end: 2rem !important; + } + .pe-6 { + padding-end: 3rem !important; + } + .pe-7 { + padding-end: 4rem !important; + } + .px-0 { + padding-left: 0 !important; + padding-right: 0 !important; + } + .px-1 { + padding-left: 0.25rem !important; + padding-right: 0.25rem !important; + } + .px-2 { + padding-left: 0.5rem !important; + padding-right: 0.5rem !important; + } + .px-3 { + padding-left: 1rem !important; + padding-right: 1rem !important; + } + .px-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important; + } + .px-5 { + padding-left: 2rem !important; + padding-right: 2rem !important; + } + .px-6 { + padding-left: 3rem !important; + padding-right: 3rem !important; + } + .px-7 { + padding-left: 4rem !important; + padding-right: 4rem !important; + } + .py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-5 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .py-6 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .py-7 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } + .pa-0 { + padding: 0 !important; + } + .pa-1 { + padding: 0.25rem !important; + } + .pa-2 { + padding: 0.5rem !important; + } + .pa-3 { + padding: 1rem !important; + } + .pa-4 { + padding: 1.5rem !important; + } + .pa-5 { + padding: 2rem !important; + } + .pa-6 { + padding: 3rem !important; + } + .pa-7 { + padding: 4rem !important; + } +} +@media (min-width: 576px) { + .mt-sm-0 { + margin-top: 0 !important; + } + .mt-sm-1 { + margin-top: 0.25rem !important; + } + .mt-sm-2 { + margin-top: 0.5rem !important; + } + .mt-sm-3 { + margin-top: 1rem !important; + } + .mt-sm-4 { + margin-top: 1.5rem !important; + } + .mt-sm-5 { + margin-top: 2rem !important; + } + .mt-sm-6 { + margin-top: 3rem !important; + } + .mt-sm-7 { + margin-top: 4rem !important; + } + .mb-sm-0 { + margin-bottom: 0 !important; + } + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + .mb-sm-3 { + margin-bottom: 1rem !important; + } + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + .mb-sm-5 { + margin-bottom: 2rem !important; + } + .mb-sm-6 { + margin-bottom: 3rem !important; + } + .mb-sm-7 { + margin-bottom: 4rem !important; + } + .ms-sm-0 { + margin-start: 0 !important; + } + .ms-sm-1 { + margin-start: 0.25rem !important; + } + .ms-sm-2 { + margin-start: 0.5rem !important; + } + .ms-sm-3 { + margin-start: 1rem !important; + } + .ms-sm-4 { + margin-start: 1.5rem !important; + } + .ms-sm-5 { + margin-start: 2rem !important; + } + .ms-sm-6 { + margin-start: 3rem !important; + } + .ms-sm-7 { + margin-start: 4rem !important; + } + .me-sm-0 { + margin-end: 0 !important; + } + .me-sm-1 { + margin-end: 0.25rem !important; + } + .me-sm-2 { + margin-end: 0.5rem !important; + } + .me-sm-3 { + margin-end: 1rem !important; + } + .me-sm-4 { + margin-end: 1.5rem !important; + } + .me-sm-5 { + margin-end: 2rem !important; + } + .me-sm-6 { + margin-end: 3rem !important; + } + .me-sm-7 { + margin-end: 4rem !important; + } + .mx-sm-0 { + margin-left: 0 !important; + margin-right: 0 !important; + } + .mx-sm-1 { + margin-left: 0.25rem !important; + margin-right: 0.25rem !important; + } + .mx-sm-2 { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; + } + .mx-sm-3 { + margin-left: 1rem !important; + margin-right: 1rem !important; + } + .mx-sm-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important; + } + .mx-sm-5 { + margin-left: 2rem !important; + margin-right: 2rem !important; + } + .mx-sm-6 { + margin-left: 3rem !important; + margin-right: 3rem !important; + } + .mx-sm-7 { + margin-left: 4rem !important; + margin-right: 4rem !important; + } + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-sm-5 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .my-sm-6 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-sm-7 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .ma-sm-0 { + margin: 0 !important; + } + .ma-sm-1 { + margin: 0.25rem !important; + } + .ma-sm-2 { + margin: 0.5rem !important; + } + .ma-sm-3 { + margin: 1rem !important; + } + .ma-sm-4 { + margin: 1.5rem !important; + } + .ma-sm-5 { + margin: 2rem !important; + } + .ma-sm-6 { + margin: 3rem !important; + } + .ma-sm-7 { + margin: 4rem !important; + } + .pt-sm-0 { + padding-top: 0 !important; + } + .pt-sm-1 { + padding-top: 0.25rem !important; + } + .pt-sm-2 { + padding-top: 0.5rem !important; + } + .pt-sm-3 { + padding-top: 1rem !important; + } + .pt-sm-4 { + padding-top: 1.5rem !important; + } + .pt-sm-5 { + padding-top: 2rem !important; + } + .pt-sm-6 { + padding-top: 3rem !important; + } + .pt-sm-7 { + padding-top: 4rem !important; + } + .pb-sm-0 { + padding-bottom: 0 !important; + } + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + .pb-sm-3 { + padding-bottom: 1rem !important; + } + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + .pb-sm-5 { + padding-bottom: 2rem !important; + } + .pb-sm-6 { + padding-bottom: 3rem !important; + } + .pb-sm-7 { + padding-bottom: 4rem !important; + } + .ps-sm-0 { + padding-start: 0 !important; + } + .ps-sm-1 { + padding-start: 0.25rem !important; + } + .ps-sm-2 { + padding-start: 0.5rem !important; + } + .ps-sm-3 { + padding-start: 1rem !important; + } + .ps-sm-4 { + padding-start: 1.5rem !important; + } + .ps-sm-5 { + padding-start: 2rem !important; + } + .ps-sm-6 { + padding-start: 3rem !important; + } + .ps-sm-7 { + padding-start: 4rem !important; + } + .pe-sm-0 { + padding-end: 0 !important; + } + .pe-sm-1 { + padding-end: 0.25rem !important; + } + .pe-sm-2 { + padding-end: 0.5rem !important; + } + .pe-sm-3 { + padding-end: 1rem !important; + } + .pe-sm-4 { + padding-end: 1.5rem !important; + } + .pe-sm-5 { + padding-end: 2rem !important; + } + .pe-sm-6 { + padding-end: 3rem !important; + } + .pe-sm-7 { + padding-end: 4rem !important; + } + .px-sm-0 { + padding-left: 0 !important; + padding-right: 0 !important; + } + .px-sm-1 { + padding-left: 0.25rem !important; + padding-right: 0.25rem !important; + } + .px-sm-2 { + padding-left: 0.5rem !important; + padding-right: 0.5rem !important; + } + .px-sm-3 { + padding-left: 1rem !important; + padding-right: 1rem !important; + } + .px-sm-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important; + } + .px-sm-5 { + padding-left: 2rem !important; + padding-right: 2rem !important; + } + .px-sm-6 { + padding-left: 3rem !important; + padding-right: 3rem !important; + } + .px-sm-7 { + padding-left: 4rem !important; + padding-right: 4rem !important; + } + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-sm-5 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .py-sm-6 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .py-sm-7 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } + .pa-sm-0 { + padding: 0 !important; + } + .pa-sm-1 { + padding: 0.25rem !important; + } + .pa-sm-2 { + padding: 0.5rem !important; + } + .pa-sm-3 { + padding: 1rem !important; + } + .pa-sm-4 { + padding: 1.5rem !important; + } + .pa-sm-5 { + padding: 2rem !important; + } + .pa-sm-6 { + padding: 3rem !important; + } + .pa-sm-7 { + padding: 4rem !important; + } +} +@media (min-width: 768px) { + .mt-md-0 { + margin-top: 0 !important; + } + .mt-md-1 { + margin-top: 0.25rem !important; + } + .mt-md-2 { + margin-top: 0.5rem !important; + } + .mt-md-3 { + margin-top: 1rem !important; + } + .mt-md-4 { + margin-top: 1.5rem !important; + } + .mt-md-5 { + margin-top: 2rem !important; + } + .mt-md-6 { + margin-top: 3rem !important; + } + .mt-md-7 { + margin-top: 4rem !important; + } + .mb-md-0 { + margin-bottom: 0 !important; + } + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + .mb-md-3 { + margin-bottom: 1rem !important; + } + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + .mb-md-5 { + margin-bottom: 2rem !important; + } + .mb-md-6 { + margin-bottom: 3rem !important; + } + .mb-md-7 { + margin-bottom: 4rem !important; + } + .ms-md-0 { + margin-start: 0 !important; + } + .ms-md-1 { + margin-start: 0.25rem !important; + } + .ms-md-2 { + margin-start: 0.5rem !important; + } + .ms-md-3 { + margin-start: 1rem !important; + } + .ms-md-4 { + margin-start: 1.5rem !important; + } + .ms-md-5 { + margin-start: 2rem !important; + } + .ms-md-6 { + margin-start: 3rem !important; + } + .ms-md-7 { + margin-start: 4rem !important; + } + .me-md-0 { + margin-end: 0 !important; + } + .me-md-1 { + margin-end: 0.25rem !important; + } + .me-md-2 { + margin-end: 0.5rem !important; + } + .me-md-3 { + margin-end: 1rem !important; + } + .me-md-4 { + margin-end: 1.5rem !important; + } + .me-md-5 { + margin-end: 2rem !important; + } + .me-md-6 { + margin-end: 3rem !important; + } + .me-md-7 { + margin-end: 4rem !important; + } + .mx-md-0 { + margin-left: 0 !important; + margin-right: 0 !important; + } + .mx-md-1 { + margin-left: 0.25rem !important; + margin-right: 0.25rem !important; + } + .mx-md-2 { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; + } + .mx-md-3 { + margin-left: 1rem !important; + margin-right: 1rem !important; + } + .mx-md-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important; + } + .mx-md-5 { + margin-left: 2rem !important; + margin-right: 2rem !important; + } + .mx-md-6 { + margin-left: 3rem !important; + margin-right: 3rem !important; + } + .mx-md-7 { + margin-left: 4rem !important; + margin-right: 4rem !important; + } + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-md-5 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .my-md-6 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-md-7 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .ma-md-0 { + margin: 0 !important; + } + .ma-md-1 { + margin: 0.25rem !important; + } + .ma-md-2 { + margin: 0.5rem !important; + } + .ma-md-3 { + margin: 1rem !important; + } + .ma-md-4 { + margin: 1.5rem !important; + } + .ma-md-5 { + margin: 2rem !important; + } + .ma-md-6 { + margin: 3rem !important; + } + .ma-md-7 { + margin: 4rem !important; + } + .pt-md-0 { + padding-top: 0 !important; + } + .pt-md-1 { + padding-top: 0.25rem !important; + } + .pt-md-2 { + padding-top: 0.5rem !important; + } + .pt-md-3 { + padding-top: 1rem !important; + } + .pt-md-4 { + padding-top: 1.5rem !important; + } + .pt-md-5 { + padding-top: 2rem !important; + } + .pt-md-6 { + padding-top: 3rem !important; + } + .pt-md-7 { + padding-top: 4rem !important; + } + .pb-md-0 { + padding-bottom: 0 !important; + } + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + .pb-md-3 { + padding-bottom: 1rem !important; + } + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + .pb-md-5 { + padding-bottom: 2rem !important; + } + .pb-md-6 { + padding-bottom: 3rem !important; + } + .pb-md-7 { + padding-bottom: 4rem !important; + } + .ps-md-0 { + padding-start: 0 !important; + } + .ps-md-1 { + padding-start: 0.25rem !important; + } + .ps-md-2 { + padding-start: 0.5rem !important; + } + .ps-md-3 { + padding-start: 1rem !important; + } + .ps-md-4 { + padding-start: 1.5rem !important; + } + .ps-md-5 { + padding-start: 2rem !important; + } + .ps-md-6 { + padding-start: 3rem !important; + } + .ps-md-7 { + padding-start: 4rem !important; + } + .pe-md-0 { + padding-end: 0 !important; + } + .pe-md-1 { + padding-end: 0.25rem !important; + } + .pe-md-2 { + padding-end: 0.5rem !important; + } + .pe-md-3 { + padding-end: 1rem !important; + } + .pe-md-4 { + padding-end: 1.5rem !important; + } + .pe-md-5 { + padding-end: 2rem !important; + } + .pe-md-6 { + padding-end: 3rem !important; + } + .pe-md-7 { + padding-end: 4rem !important; + } + .px-md-0 { + padding-left: 0 !important; + padding-right: 0 !important; + } + .px-md-1 { + padding-left: 0.25rem !important; + padding-right: 0.25rem !important; + } + .px-md-2 { + padding-left: 0.5rem !important; + padding-right: 0.5rem !important; + } + .px-md-3 { + padding-left: 1rem !important; + padding-right: 1rem !important; + } + .px-md-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important; + } + .px-md-5 { + padding-left: 2rem !important; + padding-right: 2rem !important; + } + .px-md-6 { + padding-left: 3rem !important; + padding-right: 3rem !important; + } + .px-md-7 { + padding-left: 4rem !important; + padding-right: 4rem !important; + } + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-md-5 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .py-md-6 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .py-md-7 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } + .pa-md-0 { + padding: 0 !important; + } + .pa-md-1 { + padding: 0.25rem !important; + } + .pa-md-2 { + padding: 0.5rem !important; + } + .pa-md-3 { + padding: 1rem !important; + } + .pa-md-4 { + padding: 1.5rem !important; + } + .pa-md-5 { + padding: 2rem !important; + } + .pa-md-6 { + padding: 3rem !important; + } + .pa-md-7 { + padding: 4rem !important; + } +} +@media (min-width: 992px) { + .mt-lg-0 { + margin-top: 0 !important; + } + .mt-lg-1 { + margin-top: 0.25rem !important; + } + .mt-lg-2 { + margin-top: 0.5rem !important; + } + .mt-lg-3 { + margin-top: 1rem !important; + } + .mt-lg-4 { + margin-top: 1.5rem !important; + } + .mt-lg-5 { + margin-top: 2rem !important; + } + .mt-lg-6 { + margin-top: 3rem !important; + } + .mt-lg-7 { + margin-top: 4rem !important; + } + .mb-lg-0 { + margin-bottom: 0 !important; + } + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + .mb-lg-3 { + margin-bottom: 1rem !important; + } + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + .mb-lg-5 { + margin-bottom: 2rem !important; + } + .mb-lg-6 { + margin-bottom: 3rem !important; + } + .mb-lg-7 { + margin-bottom: 4rem !important; + } + .ms-lg-0 { + margin-start: 0 !important; + } + .ms-lg-1 { + margin-start: 0.25rem !important; + } + .ms-lg-2 { + margin-start: 0.5rem !important; + } + .ms-lg-3 { + margin-start: 1rem !important; + } + .ms-lg-4 { + margin-start: 1.5rem !important; + } + .ms-lg-5 { + margin-start: 2rem !important; + } + .ms-lg-6 { + margin-start: 3rem !important; + } + .ms-lg-7 { + margin-start: 4rem !important; + } + .me-lg-0 { + margin-end: 0 !important; + } + .me-lg-1 { + margin-end: 0.25rem !important; + } + .me-lg-2 { + margin-end: 0.5rem !important; + } + .me-lg-3 { + margin-end: 1rem !important; + } + .me-lg-4 { + margin-end: 1.5rem !important; + } + .me-lg-5 { + margin-end: 2rem !important; + } + .me-lg-6 { + margin-end: 3rem !important; + } + .me-lg-7 { + margin-end: 4rem !important; + } + .mx-lg-0 { + margin-left: 0 !important; + margin-right: 0 !important; + } + .mx-lg-1 { + margin-left: 0.25rem !important; + margin-right: 0.25rem !important; + } + .mx-lg-2 { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; + } + .mx-lg-3 { + margin-left: 1rem !important; + margin-right: 1rem !important; + } + .mx-lg-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important; + } + .mx-lg-5 { + margin-left: 2rem !important; + margin-right: 2rem !important; + } + .mx-lg-6 { + margin-left: 3rem !important; + margin-right: 3rem !important; + } + .mx-lg-7 { + margin-left: 4rem !important; + margin-right: 4rem !important; + } + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-lg-5 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .my-lg-6 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-lg-7 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .ma-lg-0 { + margin: 0 !important; + } + .ma-lg-1 { + margin: 0.25rem !important; + } + .ma-lg-2 { + margin: 0.5rem !important; + } + .ma-lg-3 { + margin: 1rem !important; + } + .ma-lg-4 { + margin: 1.5rem !important; + } + .ma-lg-5 { + margin: 2rem !important; + } + .ma-lg-6 { + margin: 3rem !important; + } + .ma-lg-7 { + margin: 4rem !important; + } + .pt-lg-0 { + padding-top: 0 !important; + } + .pt-lg-1 { + padding-top: 0.25rem !important; + } + .pt-lg-2 { + padding-top: 0.5rem !important; + } + .pt-lg-3 { + padding-top: 1rem !important; + } + .pt-lg-4 { + padding-top: 1.5rem !important; + } + .pt-lg-5 { + padding-top: 2rem !important; + } + .pt-lg-6 { + padding-top: 3rem !important; + } + .pt-lg-7 { + padding-top: 4rem !important; + } + .pb-lg-0 { + padding-bottom: 0 !important; + } + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + .pb-lg-3 { + padding-bottom: 1rem !important; + } + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + .pb-lg-5 { + padding-bottom: 2rem !important; + } + .pb-lg-6 { + padding-bottom: 3rem !important; + } + .pb-lg-7 { + padding-bottom: 4rem !important; + } + .ps-lg-0 { + padding-start: 0 !important; + } + .ps-lg-1 { + padding-start: 0.25rem !important; + } + .ps-lg-2 { + padding-start: 0.5rem !important; + } + .ps-lg-3 { + padding-start: 1rem !important; + } + .ps-lg-4 { + padding-start: 1.5rem !important; + } + .ps-lg-5 { + padding-start: 2rem !important; + } + .ps-lg-6 { + padding-start: 3rem !important; + } + .ps-lg-7 { + padding-start: 4rem !important; + } + .pe-lg-0 { + padding-end: 0 !important; + } + .pe-lg-1 { + padding-end: 0.25rem !important; + } + .pe-lg-2 { + padding-end: 0.5rem !important; + } + .pe-lg-3 { + padding-end: 1rem !important; + } + .pe-lg-4 { + padding-end: 1.5rem !important; + } + .pe-lg-5 { + padding-end: 2rem !important; + } + .pe-lg-6 { + padding-end: 3rem !important; + } + .pe-lg-7 { + padding-end: 4rem !important; + } + .px-lg-0 { + padding-left: 0 !important; + padding-right: 0 !important; + } + .px-lg-1 { + padding-left: 0.25rem !important; + padding-right: 0.25rem !important; + } + .px-lg-2 { + padding-left: 0.5rem !important; + padding-right: 0.5rem !important; + } + .px-lg-3 { + padding-left: 1rem !important; + padding-right: 1rem !important; + } + .px-lg-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important; + } + .px-lg-5 { + padding-left: 2rem !important; + padding-right: 2rem !important; + } + .px-lg-6 { + padding-left: 3rem !important; + padding-right: 3rem !important; + } + .px-lg-7 { + padding-left: 4rem !important; + padding-right: 4rem !important; + } + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-lg-5 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .py-lg-6 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .py-lg-7 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } + .pa-lg-0 { + padding: 0 !important; + } + .pa-lg-1 { + padding: 0.25rem !important; + } + .pa-lg-2 { + padding: 0.5rem !important; + } + .pa-lg-3 { + padding: 1rem !important; + } + .pa-lg-4 { + padding: 1.5rem !important; + } + .pa-lg-5 { + padding: 2rem !important; + } + .pa-lg-6 { + padding: 3rem !important; + } + .pa-lg-7 { + padding: 4rem !important; + } +} +@media (min-width: 1200px) { + .mt-xl-0 { + margin-top: 0 !important; + } + .mt-xl-1 { + margin-top: 0.25rem !important; + } + .mt-xl-2 { + margin-top: 0.5rem !important; + } + .mt-xl-3 { + margin-top: 1rem !important; + } + .mt-xl-4 { + margin-top: 1.5rem !important; + } + .mt-xl-5 { + margin-top: 2rem !important; + } + .mt-xl-6 { + margin-top: 3rem !important; + } + .mt-xl-7 { + margin-top: 4rem !important; + } + .mb-xl-0 { + margin-bottom: 0 !important; + } + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xl-3 { + margin-bottom: 1rem !important; + } + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xl-5 { + margin-bottom: 2rem !important; + } + .mb-xl-6 { + margin-bottom: 3rem !important; + } + .mb-xl-7 { + margin-bottom: 4rem !important; + } + .ms-xl-0 { + margin-start: 0 !important; + } + .ms-xl-1 { + margin-start: 0.25rem !important; + } + .ms-xl-2 { + margin-start: 0.5rem !important; + } + .ms-xl-3 { + margin-start: 1rem !important; + } + .ms-xl-4 { + margin-start: 1.5rem !important; + } + .ms-xl-5 { + margin-start: 2rem !important; + } + .ms-xl-6 { + margin-start: 3rem !important; + } + .ms-xl-7 { + margin-start: 4rem !important; + } + .me-xl-0 { + margin-end: 0 !important; + } + .me-xl-1 { + margin-end: 0.25rem !important; + } + .me-xl-2 { + margin-end: 0.5rem !important; + } + .me-xl-3 { + margin-end: 1rem !important; + } + .me-xl-4 { + margin-end: 1.5rem !important; + } + .me-xl-5 { + margin-end: 2rem !important; + } + .me-xl-6 { + margin-end: 3rem !important; + } + .me-xl-7 { + margin-end: 4rem !important; + } + .mx-xl-0 { + margin-left: 0 !important; + margin-right: 0 !important; + } + .mx-xl-1 { + margin-left: 0.25rem !important; + margin-right: 0.25rem !important; + } + .mx-xl-2 { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; + } + .mx-xl-3 { + margin-left: 1rem !important; + margin-right: 1rem !important; + } + .mx-xl-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important; + } + .mx-xl-5 { + margin-left: 2rem !important; + margin-right: 2rem !important; + } + .mx-xl-6 { + margin-left: 3rem !important; + margin-right: 3rem !important; + } + .mx-xl-7 { + margin-left: 4rem !important; + margin-right: 4rem !important; + } + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xl-5 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .my-xl-6 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xl-7 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .ma-xl-0 { + margin: 0 !important; + } + .ma-xl-1 { + margin: 0.25rem !important; + } + .ma-xl-2 { + margin: 0.5rem !important; + } + .ma-xl-3 { + margin: 1rem !important; + } + .ma-xl-4 { + margin: 1.5rem !important; + } + .ma-xl-5 { + margin: 2rem !important; + } + .ma-xl-6 { + margin: 3rem !important; + } + .ma-xl-7 { + margin: 4rem !important; + } + .pt-xl-0 { + padding-top: 0 !important; + } + .pt-xl-1 { + padding-top: 0.25rem !important; + } + .pt-xl-2 { + padding-top: 0.5rem !important; + } + .pt-xl-3 { + padding-top: 1rem !important; + } + .pt-xl-4 { + padding-top: 1.5rem !important; + } + .pt-xl-5 { + padding-top: 2rem !important; + } + .pt-xl-6 { + padding-top: 3rem !important; + } + .pt-xl-7 { + padding-top: 4rem !important; + } + .pb-xl-0 { + padding-bottom: 0 !important; + } + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xl-3 { + padding-bottom: 1rem !important; + } + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xl-5 { + padding-bottom: 2rem !important; + } + .pb-xl-6 { + padding-bottom: 3rem !important; + } + .pb-xl-7 { + padding-bottom: 4rem !important; + } + .ps-xl-0 { + padding-start: 0 !important; + } + .ps-xl-1 { + padding-start: 0.25rem !important; + } + .ps-xl-2 { + padding-start: 0.5rem !important; + } + .ps-xl-3 { + padding-start: 1rem !important; + } + .ps-xl-4 { + padding-start: 1.5rem !important; + } + .ps-xl-5 { + padding-start: 2rem !important; + } + .ps-xl-6 { + padding-start: 3rem !important; + } + .ps-xl-7 { + padding-start: 4rem !important; + } + .pe-xl-0 { + padding-end: 0 !important; + } + .pe-xl-1 { + padding-end: 0.25rem !important; + } + .pe-xl-2 { + padding-end: 0.5rem !important; + } + .pe-xl-3 { + padding-end: 1rem !important; + } + .pe-xl-4 { + padding-end: 1.5rem !important; + } + .pe-xl-5 { + padding-end: 2rem !important; + } + .pe-xl-6 { + padding-end: 3rem !important; + } + .pe-xl-7 { + padding-end: 4rem !important; + } + .px-xl-0 { + padding-left: 0 !important; + padding-right: 0 !important; + } + .px-xl-1 { + padding-left: 0.25rem !important; + padding-right: 0.25rem !important; + } + .px-xl-2 { + padding-left: 0.5rem !important; + padding-right: 0.5rem !important; + } + .px-xl-3 { + padding-left: 1rem !important; + padding-right: 1rem !important; + } + .px-xl-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important; + } + .px-xl-5 { + padding-left: 2rem !important; + padding-right: 2rem !important; + } + .px-xl-6 { + padding-left: 3rem !important; + padding-right: 3rem !important; + } + .px-xl-7 { + padding-left: 4rem !important; + padding-right: 4rem !important; + } + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xl-5 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .py-xl-6 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .py-xl-7 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } + .pa-xl-0 { + padding: 0 !important; + } + .pa-xl-1 { + padding: 0.25rem !important; + } + .pa-xl-2 { + padding: 0.5rem !important; + } + .pa-xl-3 { + padding: 1rem !important; + } + .pa-xl-4 { + padding: 1.5rem !important; + } + .pa-xl-5 { + padding: 2rem !important; + } + .pa-xl-6 { + padding: 3rem !important; + } + .pa-xl-7 { + padding: 4rem !important; + } +} +@media (min-width: 1400px) { + .mt-xxl-0 { + margin-top: 0 !important; + } + .mt-xxl-1 { + margin-top: 0.25rem !important; + } + .mt-xxl-2 { + margin-top: 0.5rem !important; + } + .mt-xxl-3 { + margin-top: 1rem !important; + } + .mt-xxl-4 { + margin-top: 1.5rem !important; + } + .mt-xxl-5 { + margin-top: 2rem !important; + } + .mt-xxl-6 { + margin-top: 3rem !important; + } + .mt-xxl-7 { + margin-top: 4rem !important; + } + .mb-xxl-0 { + margin-bottom: 0 !important; + } + .mb-xxl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xxl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xxl-3 { + margin-bottom: 1rem !important; + } + .mb-xxl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xxl-5 { + margin-bottom: 2rem !important; + } + .mb-xxl-6 { + margin-bottom: 3rem !important; + } + .mb-xxl-7 { + margin-bottom: 4rem !important; + } + .ms-xxl-0 { + margin-start: 0 !important; + } + .ms-xxl-1 { + margin-start: 0.25rem !important; + } + .ms-xxl-2 { + margin-start: 0.5rem !important; + } + .ms-xxl-3 { + margin-start: 1rem !important; + } + .ms-xxl-4 { + margin-start: 1.5rem !important; + } + .ms-xxl-5 { + margin-start: 2rem !important; + } + .ms-xxl-6 { + margin-start: 3rem !important; + } + .ms-xxl-7 { + margin-start: 4rem !important; + } + .me-xxl-0 { + margin-end: 0 !important; + } + .me-xxl-1 { + margin-end: 0.25rem !important; + } + .me-xxl-2 { + margin-end: 0.5rem !important; + } + .me-xxl-3 { + margin-end: 1rem !important; + } + .me-xxl-4 { + margin-end: 1.5rem !important; + } + .me-xxl-5 { + margin-end: 2rem !important; + } + .me-xxl-6 { + margin-end: 3rem !important; + } + .me-xxl-7 { + margin-end: 4rem !important; + } + .mx-xxl-0 { + margin-left: 0 !important; + margin-right: 0 !important; + } + .mx-xxl-1 { + margin-left: 0.25rem !important; + margin-right: 0.25rem !important; + } + .mx-xxl-2 { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; + } + .mx-xxl-3 { + margin-left: 1rem !important; + margin-right: 1rem !important; + } + .mx-xxl-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important; + } + .mx-xxl-5 { + margin-left: 2rem !important; + margin-right: 2rem !important; + } + .mx-xxl-6 { + margin-left: 3rem !important; + margin-right: 3rem !important; + } + .mx-xxl-7 { + margin-left: 4rem !important; + margin-right: 4rem !important; + } + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xxl-5 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .my-xxl-6 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xxl-7 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .ma-xxl-0 { + margin: 0 !important; + } + .ma-xxl-1 { + margin: 0.25rem !important; + } + .ma-xxl-2 { + margin: 0.5rem !important; + } + .ma-xxl-3 { + margin: 1rem !important; + } + .ma-xxl-4 { + margin: 1.5rem !important; + } + .ma-xxl-5 { + margin: 2rem !important; + } + .ma-xxl-6 { + margin: 3rem !important; + } + .ma-xxl-7 { + margin: 4rem !important; + } + .pt-xxl-0 { + padding-top: 0 !important; + } + .pt-xxl-1 { + padding-top: 0.25rem !important; + } + .pt-xxl-2 { + padding-top: 0.5rem !important; + } + .pt-xxl-3 { + padding-top: 1rem !important; + } + .pt-xxl-4 { + padding-top: 1.5rem !important; + } + .pt-xxl-5 { + padding-top: 2rem !important; + } + .pt-xxl-6 { + padding-top: 3rem !important; + } + .pt-xxl-7 { + padding-top: 4rem !important; + } + .pb-xxl-0 { + padding-bottom: 0 !important; + } + .pb-xxl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xxl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xxl-3 { + padding-bottom: 1rem !important; + } + .pb-xxl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xxl-5 { + padding-bottom: 2rem !important; + } + .pb-xxl-6 { + padding-bottom: 3rem !important; + } + .pb-xxl-7 { + padding-bottom: 4rem !important; + } + .ps-xxl-0 { + padding-start: 0 !important; + } + .ps-xxl-1 { + padding-start: 0.25rem !important; + } + .ps-xxl-2 { + padding-start: 0.5rem !important; + } + .ps-xxl-3 { + padding-start: 1rem !important; + } + .ps-xxl-4 { + padding-start: 1.5rem !important; + } + .ps-xxl-5 { + padding-start: 2rem !important; + } + .ps-xxl-6 { + padding-start: 3rem !important; + } + .ps-xxl-7 { + padding-start: 4rem !important; + } + .pe-xxl-0 { + padding-end: 0 !important; + } + .pe-xxl-1 { + padding-end: 0.25rem !important; + } + .pe-xxl-2 { + padding-end: 0.5rem !important; + } + .pe-xxl-3 { + padding-end: 1rem !important; + } + .pe-xxl-4 { + padding-end: 1.5rem !important; + } + .pe-xxl-5 { + padding-end: 2rem !important; + } + .pe-xxl-6 { + padding-end: 3rem !important; + } + .pe-xxl-7 { + padding-end: 4rem !important; + } + .px-xxl-0 { + padding-left: 0 !important; + padding-right: 0 !important; + } + .px-xxl-1 { + padding-left: 0.25rem !important; + padding-right: 0.25rem !important; + } + .px-xxl-2 { + padding-left: 0.5rem !important; + padding-right: 0.5rem !important; + } + .px-xxl-3 { + padding-left: 1rem !important; + padding-right: 1rem !important; + } + .px-xxl-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important; + } + .px-xxl-5 { + padding-left: 2rem !important; + padding-right: 2rem !important; + } + .px-xxl-6 { + padding-left: 3rem !important; + padding-right: 3rem !important; + } + .px-xxl-7 { + padding-left: 4rem !important; + padding-right: 4rem !important; + } + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xxl-5 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .py-xxl-6 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .py-xxl-7 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } + .pa-xxl-0 { + padding: 0 !important; + } + .pa-xxl-1 { + padding: 0.25rem !important; + } + .pa-xxl-2 { + padding: 0.5rem !important; + } + .pa-xxl-3 { + padding: 1rem !important; + } + .pa-xxl-4 { + padding: 1.5rem !important; + } + .pa-xxl-5 { + padding: 2rem !important; + } + .pa-xxl-6 { + padding: 3rem !important; + } + .pa-xxl-7 { + padding: 4rem !important; + } +} +/* Classic alias set (p-0 / px-4 / etc) + gap */ +.m-0 { + margin: 0 !important; +} + +.mx-0 { + margin-left: 0 !important; + margin-right: 0 !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.ml-0 { + margin-left: 0 !important; +} + +.mr-0 { + margin-right: 0 !important; +} + +.p-0 { + padding: 0 !important; +} + +.px-0 { + padding-left: 0 !important; + padding-right: 0 !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pl-0 { + padding-left: 0 !important; +} + +.pr-0 { + padding-right: 0 !important; +} + +.gap-0 { + gap: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mx-1 { + margin-left: 0.25rem !important; + margin-right: 0.25rem !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1 { + margin-left: 0.25rem !important; +} + +.mr-1 { + margin-right: 0.25rem !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.px-1 { + padding-left: 0.25rem !important; + padding-right: 0.25rem !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1 { + padding-left: 0.25rem !important; +} + +.pr-1 { + padding-right: 0.25rem !important; +} + +.gap-1 { + gap: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mx-2 { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2 { + margin-left: 0.5rem !important; +} + +.mr-2 { + margin-right: 0.5rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.px-2 { + padding-left: 0.5rem !important; + padding-right: 0.5rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2 { + padding-left: 0.5rem !important; +} + +.pr-2 { + padding-right: 0.5rem !important; +} + +.gap-2 { + gap: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.mx-3 { + margin-left: 1rem !important; + margin-right: 1rem !important; +} + +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.mt-3 { + margin-top: 1rem !important; +} + +.mb-3 { + margin-bottom: 1rem !important; +} + +.ml-3 { + margin-left: 1rem !important; +} + +.mr-3 { + margin-right: 1rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.px-3 { + padding-left: 1rem !important; + padding-right: 1rem !important; +} + +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.pt-3 { + padding-top: 1rem !important; +} + +.pb-3 { + padding-bottom: 1rem !important; +} + +.pl-3 { + padding-left: 1rem !important; +} + +.pr-3 { + padding-right: 1rem !important; +} + +.gap-3 { + gap: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.mx-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important; +} + +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.mt-4 { + margin-top: 1.5rem !important; +} + +.mb-4 { + margin-bottom: 1.5rem !important; +} + +.ml-4 { + margin-left: 1.5rem !important; +} + +.mr-4 { + margin-right: 1.5rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.px-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important; +} + +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.pt-4 { + padding-top: 1.5rem !important; +} + +.pb-4 { + padding-bottom: 1.5rem !important; +} + +.pl-4 { + padding-left: 1.5rem !important; +} + +.pr-4 { + padding-right: 1.5rem !important; +} + +.gap-4 { + gap: 1.5rem !important; +} + +.m-5 { + margin: 2rem !important; +} + +.mx-5 { + margin-left: 2rem !important; + margin-right: 2rem !important; +} + +.my-5 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; +} + +.mt-5 { + margin-top: 2rem !important; +} + +.mb-5 { + margin-bottom: 2rem !important; +} + +.ml-5 { + margin-left: 2rem !important; +} + +.mr-5 { + margin-right: 2rem !important; +} + +.p-5 { + padding: 2rem !important; +} + +.px-5 { + padding-left: 2rem !important; + padding-right: 2rem !important; +} + +.py-5 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; +} + +.pt-5 { + padding-top: 2rem !important; +} + +.pb-5 { + padding-bottom: 2rem !important; +} + +.pl-5 { + padding-left: 2rem !important; +} + +.pr-5 { + padding-right: 2rem !important; +} + +.gap-5 { + gap: 2rem !important; +} + +.m-6 { + margin: 3rem !important; +} + +.mx-6 { + margin-left: 3rem !important; + margin-right: 3rem !important; +} + +.my-6 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.mt-6 { + margin-top: 3rem !important; +} + +.mb-6 { + margin-bottom: 3rem !important; +} + +.ml-6 { + margin-left: 3rem !important; +} + +.mr-6 { + margin-right: 3rem !important; +} + +.p-6 { + padding: 3rem !important; +} + +.px-6 { + padding-left: 3rem !important; + padding-right: 3rem !important; +} + +.py-6 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.pt-6 { + padding-top: 3rem !important; +} + +.pb-6 { + padding-bottom: 3rem !important; +} + +.pl-6 { + padding-left: 3rem !important; +} + +.pr-6 { + padding-right: 3rem !important; +} + +.gap-6 { + gap: 3rem !important; +} + +.m-7 { + margin: 4rem !important; +} + +.mx-7 { + margin-left: 4rem !important; + margin-right: 4rem !important; +} + +.my-7 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; +} + +.mt-7 { + margin-top: 4rem !important; +} + +.mb-7 { + margin-bottom: 4rem !important; +} + +.ml-7 { + margin-left: 4rem !important; +} + +.mr-7 { + margin-right: 4rem !important; +} + +.p-7 { + padding: 4rem !important; +} + +.px-7 { + padding-left: 4rem !important; + padding-right: 4rem !important; +} + +.py-7 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; +} + +.pt-7 { + padding-top: 4rem !important; +} + +.pb-7 { + padding-bottom: 4rem !important; +} + +.pl-7 { + padding-left: 4rem !important; +} + +.pr-7 { + padding-right: 4rem !important; +} + +.gap-7 { + gap: 4rem !important; +} + +/* -------------------------------------------- + Sizing utilities + responsive widths/heights +-------------------------------------------- */ +.w-25 { + width: 25% !important; +} + +.h-25 { + height: 25% !important; +} + +.w-33 { + width: 33.33% !important; +} + +.h-33 { + height: 33.33% !important; +} + +.w-50 { + width: 50% !important; +} + +.h-50 { + height: 50% !important; +} + +.w-66 { + width: 66.66% !important; +} + +.h-66 { + height: 66.66% !important; +} + +.w-75 { + width: 75% !important; +} + +.h-75 { + height: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.h-100 { + height: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.h-auto { + height: auto !important; +} + +.w-screen-v { + width: 100vh !important; +} + +.h-screen-v { + height: 100vh !important; +} + +.w-screen-h { + width: 100vw !important; +} + +.h-screen-h { + height: 100vw !important; +} + +@media (min-width: 0) { + .w-25 { + width: 25% !important; + } + .h-25 { + height: 25% !important; + } + .w-33 { + width: 33.33% !important; + } + .h-33 { + height: 33.33% !important; + } + .w-50 { + width: 50% !important; + } + .h-50 { + height: 50% !important; + } + .w-66 { + width: 66.66% !important; + } + .h-66 { + height: 66.66% !important; + } + .w-75 { + width: 75% !important; + } + .h-75 { + height: 75% !important; + } + .w-100 { + width: 100% !important; + } + .h-100 { + height: 100% !important; + } + .w-auto { + width: auto !important; + } + .h-auto { + height: auto !important; + } + .w-screen-v { + width: 100vh !important; + } + .h-screen-v { + height: 100vh !important; + } + .w-screen-h { + width: 100vw !important; + } + .h-screen-h { + height: 100vw !important; + } +} +@media (min-width: 576px) { + .w-sm-25 { + width: 25% !important; + } + .h-sm-25 { + height: 25% !important; + } + .w-sm-33 { + width: 33.33% !important; + } + .h-sm-33 { + height: 33.33% !important; + } + .w-sm-50 { + width: 50% !important; + } + .h-sm-50 { + height: 50% !important; + } + .w-sm-66 { + width: 66.66% !important; + } + .h-sm-66 { + height: 66.66% !important; + } + .w-sm-75 { + width: 75% !important; + } + .h-sm-75 { + height: 75% !important; + } + .w-sm-100 { + width: 100% !important; + } + .h-sm-100 { + height: 100% !important; + } + .w-sm-auto { + width: auto !important; + } + .h-sm-auto { + height: auto !important; + } + .w-sm-screen-v { + width: 100vh !important; + } + .h-sm-screen-v { + height: 100vh !important; + } + .w-sm-screen-h { + width: 100vw !important; + } + .h-sm-screen-h { + height: 100vw !important; + } +} +@media (min-width: 768px) { + .w-md-25 { + width: 25% !important; + } + .h-md-25 { + height: 25% !important; + } + .w-md-33 { + width: 33.33% !important; + } + .h-md-33 { + height: 33.33% !important; + } + .w-md-50 { + width: 50% !important; + } + .h-md-50 { + height: 50% !important; + } + .w-md-66 { + width: 66.66% !important; + } + .h-md-66 { + height: 66.66% !important; + } + .w-md-75 { + width: 75% !important; + } + .h-md-75 { + height: 75% !important; + } + .w-md-100 { + width: 100% !important; + } + .h-md-100 { + height: 100% !important; + } + .w-md-auto { + width: auto !important; + } + .h-md-auto { + height: auto !important; + } + .w-md-screen-v { + width: 100vh !important; + } + .h-md-screen-v { + height: 100vh !important; + } + .w-md-screen-h { + width: 100vw !important; + } + .h-md-screen-h { + height: 100vw !important; + } +} +@media (min-width: 992px) { + .w-lg-25 { + width: 25% !important; + } + .h-lg-25 { + height: 25% !important; + } + .w-lg-33 { + width: 33.33% !important; + } + .h-lg-33 { + height: 33.33% !important; + } + .w-lg-50 { + width: 50% !important; + } + .h-lg-50 { + height: 50% !important; + } + .w-lg-66 { + width: 66.66% !important; + } + .h-lg-66 { + height: 66.66% !important; + } + .w-lg-75 { + width: 75% !important; + } + .h-lg-75 { + height: 75% !important; + } + .w-lg-100 { + width: 100% !important; + } + .h-lg-100 { + height: 100% !important; + } + .w-lg-auto { + width: auto !important; + } + .h-lg-auto { + height: auto !important; + } + .w-lg-screen-v { + width: 100vh !important; + } + .h-lg-screen-v { + height: 100vh !important; + } + .w-lg-screen-h { + width: 100vw !important; + } + .h-lg-screen-h { + height: 100vw !important; + } +} +@media (min-width: 1200px) { + .w-xl-25 { + width: 25% !important; + } + .h-xl-25 { + height: 25% !important; + } + .w-xl-33 { + width: 33.33% !important; + } + .h-xl-33 { + height: 33.33% !important; + } + .w-xl-50 { + width: 50% !important; + } + .h-xl-50 { + height: 50% !important; + } + .w-xl-66 { + width: 66.66% !important; + } + .h-xl-66 { + height: 66.66% !important; + } + .w-xl-75 { + width: 75% !important; + } + .h-xl-75 { + height: 75% !important; + } + .w-xl-100 { + width: 100% !important; + } + .h-xl-100 { + height: 100% !important; + } + .w-xl-auto { + width: auto !important; + } + .h-xl-auto { + height: auto !important; + } + .w-xl-screen-v { + width: 100vh !important; + } + .h-xl-screen-v { + height: 100vh !important; + } + .w-xl-screen-h { + width: 100vw !important; + } + .h-xl-screen-h { + height: 100vw !important; + } +} +@media (min-width: 1400px) { + .w-xxl-25 { + width: 25% !important; + } + .h-xxl-25 { + height: 25% !important; + } + .w-xxl-33 { + width: 33.33% !important; + } + .h-xxl-33 { + height: 33.33% !important; + } + .w-xxl-50 { + width: 50% !important; + } + .h-xxl-50 { + height: 50% !important; + } + .w-xxl-66 { + width: 66.66% !important; + } + .h-xxl-66 { + height: 66.66% !important; + } + .w-xxl-75 { + width: 75% !important; + } + .h-xxl-75 { + height: 75% !important; + } + .w-xxl-100 { + width: 100% !important; + } + .h-xxl-100 { + height: 100% !important; + } + .w-xxl-auto { + width: auto !important; + } + .h-xxl-auto { + height: auto !important; + } + .w-xxl-screen-v { + width: 100vh !important; + } + .h-xxl-screen-v { + height: 100vh !important; + } + .w-xxl-screen-h { + width: 100vw !important; + } + .h-xxl-screen-h { + height: 100vw !important; + } +} +/* -------------------------------------------- + Typography utilities +-------------------------------------------- */ +.h1 { + font-size: 2.5rem !important; +} + +.h2 { + font-size: 2rem !important; +} + +.h3 { + font-size: 1.75rem !important; +} + +.h4 { + font-size: 1.5rem !important; +} + +.h5 { + font-size: 1.25rem !important; +} + +.h6 { + font-size: 1rem !important; +} + +.body { + font-size: 1rem !important; +} + +.small { + font-size: 0.875rem !important; +} + +.xs { + font-size: 0.75rem !important; +} + +.text-center { + text-align: center !important; +} + +.text-right { + text-align: right !important; +} + +.text-left { + text-align: left !important; +} + +.font-weight-light { + font-weight: 300 !important; +} + +.font-weight-normal { + font-weight: 400 !important; +} + +.font-weight-medium { + font-weight: 500 !important; +} + +.font-weight-bold { + font-weight: 700 !important; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +code { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; + font-size: 0.95em; + padding: 0.12em 0.35em; + border-radius: 0.25rem; + background: rgba(var(--primary-rgb), 0.1); + border: 1px solid rgba(var(--primary-rgb), 0.14); +} + +/* -------------------------------------------- + Border helpers +-------------------------------------------- */ +.border { + border: 1px solid var(--border-color) !important; +} + +.border-top { + border-top: 1px solid var(--border-color) !important; +} + +.border-bottom { + border-bottom: 1px solid var(--border-color) !important; +} + +.border-left { + border-left: 1px solid var(--border-color) !important; +} + +.border-right { + border-right: 1px solid var(--border-color) !important; +} + +/* -------------------------------------------- + Radius helpers +-------------------------------------------- */ +.rounded { + border-radius: 0.5rem !important; +} + +.rounded-sm { + border-radius: 0.25rem !important; +} + +.rounded-lg { + border-radius: 1rem !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-none { + border-radius: 0 !important; +} + +/* -------------------------------------------- + Elevation helpers +-------------------------------------------- */ +.elevation-0 { + box-shadow: none !important; +} + +.elevation-1 { + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12) !important; +} + +.elevation-2 { + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12) !important; +} + +.elevation-4 { + box-shadow: 0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12) !important; +} + +.elevation-8 { + box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12) !important; +} + +.elevation-12 { + box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2), 0 12px 17px 2px rgba(0, 0, 0, 0.14), 0 5px 22px 4px rgba(0, 0, 0, 0.12) !important; +} + +.elevation-16 { + box-shadow: 0 8px 10px -5px rgba(0, 0, 0, 0.2), 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12) !important; +} + +.elevation-24 { + box-shadow: 0 11px 15px -7px rgba(0, 0, 0, 0.2), 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12) !important; +} + +/* -------------------------------------------- + Z-index utilities +-------------------------------------------- */ +.z-deep { + z-index: -1 !important; +} + +.z-default { + z-index: 1 !important; +} + +.z-sticky { + z-index: 100 !important; +} + +.z-sidebar { + z-index: 200 !important; +} + +.z-header { + z-index: 300 !important; +} + +.z-backdrop { + z-index: 400 !important; +} + +.z-modal { + z-index: 500 !important; +} + +.z-dropdown { + z-index: 600 !important; +} + +.z-popover { + z-index: 700 !important; +} + +.z-tooltip { + z-index: 800 !important; +} + +.z-toast { + z-index: 900 !important; +} + +/* -------------------------------------------- + Visibility / overflow helpers +-------------------------------------------- */ +.opacity-0 { + opacity: 0 !important; +} + +.opacity-50 { + opacity: 0.5 !important; +} + +.opacity-100 { + opacity: 1 !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.overflow-auto { + overflow: auto !important; +} + +.cursor-pointer { + cursor: pointer !important; +} + +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + user-select: none !important; +} + +.is-hidden { + display: none !important; +} + +.lock-scroll { + overflow: hidden !important; +} + +/* -------------------------------------------- + Media helpers +-------------------------------------------- */ +.img-fluid { + max-width: 100%; + height: auto; +} + +.object-contain { + -o-object-fit: contain !important; + object-fit: contain !important; +} + +.object-cover { + -o-object-fit: cover !important; + object-fit: cover !important; +} + +.object-fill { + -o-object-fit: fill !important; + object-fit: fill !important; +} + +.object-scale-down { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; +} + +.ratio-1x1 { + position: relative; + width: 100%; +} +.ratio-1x1::before { + display: block; + content: ""; + padding-top: 100%; +} +.ratio-1x1 > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.ratio-4x3 { + position: relative; + width: 100%; +} +.ratio-4x3::before { + display: block; + content: ""; + padding-top: 75%; +} +.ratio-4x3 > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.ratio-16x9 { + position: relative; + width: 100%; +} +.ratio-16x9::before { + display: block; + content: ""; + padding-top: 56.25%; +} +.ratio-16x9 > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.ratio-21x9 { + position: relative; + width: 100%; +} +.ratio-21x9::before { + display: block; + content: ""; + padding-top: 42.85%; +} +.ratio-21x9 > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +/* -------------------------------------------- + Color utilities + Buttons + Alerts +-------------------------------------------- */ +.text-gray { + color: #6c757d !important; +} + +.bg-gray { + background-color: #6c757d !important; +} + +.bg-gray-light { + background-color: #f8f9fa !important; +} + +.text-gray-50 { + color: #fbfcfd !important; +} + +.bg-gray-50 { + background-color: #fbfcfd !important; +} + +.text-gray-100 { + color: #f8f9fa !important; +} + +.bg-gray-100 { + background-color: #f8f9fa !important; +} + +.text-gray-200 { + color: #e9ecef !important; +} + +.bg-gray-200 { + background-color: #e9ecef !important; +} + +.text-gray-300 { + color: #dee2e6 !important; +} + +.bg-gray-300 { + background-color: #dee2e6 !important; +} + +.text-gray-400 { + color: #ced4da !important; +} + +.bg-gray-400 { + background-color: #ced4da !important; +} + +.text-gray-500 { + color: #adb5bd !important; +} + +.bg-gray-500 { + background-color: #adb5bd !important; +} + +.text-gray-600 { + color: #6c757d !important; +} + +.bg-gray-600 { + background-color: #6c757d !important; +} + +.text-gray-700 { + color: #495057 !important; +} + +.bg-gray-700 { + background-color: #495057 !important; +} + +.text-gray-800 { + color: #343a40 !important; +} + +.bg-gray-800 { + background-color: #343a40 !important; +} + +.text-gray-900 { + color: #212529 !important; +} + +.bg-gray-900 { + background-color: #212529 !important; +} + +.text-gray-950 { + color: #121416 !important; +} + +.bg-gray-950 { + background-color: #121416 !important; +} + +/* Solid button */ +.btn-gray { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid transparent; + cursor: pointer; + background-color: #6c757d; + color: #ffffff; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1), filter 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-gray:hover { + filter: brightness(95%); + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-2px); +} +.btn-gray:active { + filter: brightness(90%); + transform: translateY(0); +} +.btn-gray:focus { + outline: none; +} +.btn-gray:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.btn-gray:disabled, .btn-gray.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; + filter: none; +} + +/* Light button */ +.btn-gray-light { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid #e9ecef; + cursor: pointer; + background-color: #f8f9fa; + color: #343a40; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-gray-light:hover { + background-color: #e9ecef; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-1px); +} +.btn-gray-light:active { + background-color: #dee2e6; + transform: translateY(0); +} +.btn-gray-light:focus { + outline: none; +} +.btn-gray-light:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); +} +.btn-gray-light:disabled, .btn-gray-light.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; +} + +/* Alerts */ +.alert-gray { + padding: 1rem; + border-radius: 0.5rem; + background-color: #f8f9fa; + color: #212529; + border: 1px solid #e9ecef; + margin-bottom: 1rem; +} + +.text-blue { + color: #0a58ca !important; +} + +.bg-blue { + background-color: #0a58ca !important; +} + +.bg-blue-light { + background-color: #e7f1ff !important; +} + +.text-blue-50 { + color: #f0f7ff !important; +} + +.bg-blue-50 { + background-color: #f0f7ff !important; +} + +.text-blue-100 { + color: #e7f1ff !important; +} + +.bg-blue-100 { + background-color: #e7f1ff !important; +} + +.text-blue-200 { + color: #cfe2ff !important; +} + +.bg-blue-200 { + background-color: #cfe2ff !important; +} + +.text-blue-300 { + color: #9ec5fe !important; +} + +.bg-blue-300 { + background-color: #9ec5fe !important; +} + +.text-blue-400 { + color: #6ea8fe !important; +} + +.bg-blue-400 { + background-color: #6ea8fe !important; +} + +.text-blue-500 { + color: #0d6efd !important; +} + +.bg-blue-500 { + background-color: #0d6efd !important; +} + +.text-blue-600 { + color: #0a58ca !important; +} + +.bg-blue-600 { + background-color: #0a58ca !important; +} + +.text-blue-700 { + color: #084298 !important; +} + +.bg-blue-700 { + background-color: #084298 !important; +} + +.text-blue-800 { + color: #052c65 !important; +} + +.bg-blue-800 { + background-color: #052c65 !important; +} + +.text-blue-900 { + color: #031633 !important; +} + +.bg-blue-900 { + background-color: #031633 !important; +} + +.text-blue-950 { + color: #020b1a !important; +} + +.bg-blue-950 { + background-color: #020b1a !important; +} + +/* Solid button */ +.btn-blue { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid transparent; + cursor: pointer; + background-color: #0a58ca; + color: #ffffff; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1), filter 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-blue:hover { + filter: brightness(95%); + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-2px); +} +.btn-blue:active { + filter: brightness(90%); + transform: translateY(0); +} +.btn-blue:focus { + outline: none; +} +.btn-blue:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.btn-blue:disabled, .btn-blue.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; + filter: none; +} + +/* Light button */ +.btn-blue-light { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid #cfe2ff; + cursor: pointer; + background-color: #e7f1ff; + color: #052c65; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-blue-light:hover { + background-color: #cfe2ff; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-1px); +} +.btn-blue-light:active { + background-color: #9ec5fe; + transform: translateY(0); +} +.btn-blue-light:focus { + outline: none; +} +.btn-blue-light:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); +} +.btn-blue-light:disabled, .btn-blue-light.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; +} + +/* Alerts */ +.alert-blue { + padding: 1rem; + border-radius: 0.5rem; + background-color: #e7f1ff; + color: #031633; + border: 1px solid #cfe2ff; + margin-bottom: 1rem; +} + +.text-indigo { + color: #7c3aed !important; +} + +.bg-indigo { + background-color: #7c3aed !important; +} + +.bg-indigo-light { + background-color: #ede9fe !important; +} + +.text-indigo-50 { + color: #f5f3ff !important; +} + +.bg-indigo-50 { + background-color: #f5f3ff !important; +} + +.text-indigo-100 { + color: #ede9fe !important; +} + +.bg-indigo-100 { + background-color: #ede9fe !important; +} + +.text-indigo-200 { + color: #ddd6fe !important; +} + +.bg-indigo-200 { + background-color: #ddd6fe !important; +} + +.text-indigo-300 { + color: #c4b5fd !important; +} + +.bg-indigo-300 { + background-color: #c4b5fd !important; +} + +.text-indigo-400 { + color: #a78bfa !important; +} + +.bg-indigo-400 { + background-color: #a78bfa !important; +} + +.text-indigo-500 { + color: #8b5cf6 !important; +} + +.bg-indigo-500 { + background-color: #8b5cf6 !important; +} + +.text-indigo-600 { + color: #7c3aed !important; +} + +.bg-indigo-600 { + background-color: #7c3aed !important; +} + +.text-indigo-700 { + color: #6d28d9 !important; +} + +.bg-indigo-700 { + background-color: #6d28d9 !important; +} + +.text-indigo-800 { + color: #5b21b6 !important; +} + +.bg-indigo-800 { + background-color: #5b21b6 !important; +} + +.text-indigo-900 { + color: #4c1d95 !important; +} + +.bg-indigo-900 { + background-color: #4c1d95 !important; +} + +.text-indigo-950 { + color: #2e1065 !important; +} + +.bg-indigo-950 { + background-color: #2e1065 !important; +} + +/* Solid button */ +.btn-indigo { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid transparent; + cursor: pointer; + background-color: #7c3aed; + color: #ffffff; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1), filter 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-indigo:hover { + filter: brightness(95%); + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-2px); +} +.btn-indigo:active { + filter: brightness(90%); + transform: translateY(0); +} +.btn-indigo:focus { + outline: none; +} +.btn-indigo:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.btn-indigo:disabled, .btn-indigo.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; + filter: none; +} + +/* Light button */ +.btn-indigo-light { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid #ddd6fe; + cursor: pointer; + background-color: #ede9fe; + color: #5b21b6; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-indigo-light:hover { + background-color: #ddd6fe; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-1px); +} +.btn-indigo-light:active { + background-color: #c4b5fd; + transform: translateY(0); +} +.btn-indigo-light:focus { + outline: none; +} +.btn-indigo-light:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); +} +.btn-indigo-light:disabled, .btn-indigo-light.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; +} + +/* Alerts */ +.alert-indigo { + padding: 1rem; + border-radius: 0.5rem; + background-color: #ede9fe; + color: #4c1d95; + border: 1px solid #ddd6fe; + margin-bottom: 1rem; +} + +.text-purple { + color: #9333ea !important; +} + +.bg-purple { + background-color: #9333ea !important; +} + +.bg-purple-light { + background-color: #f3e8ff !important; +} + +.text-purple-50 { + color: #faf5ff !important; +} + +.bg-purple-50 { + background-color: #faf5ff !important; +} + +.text-purple-100 { + color: #f3e8ff !important; +} + +.bg-purple-100 { + background-color: #f3e8ff !important; +} + +.text-purple-200 { + color: #e9d5ff !important; +} + +.bg-purple-200 { + background-color: #e9d5ff !important; +} + +.text-purple-300 { + color: #d8b4fe !important; +} + +.bg-purple-300 { + background-color: #d8b4fe !important; +} + +.text-purple-400 { + color: #c084fc !important; +} + +.bg-purple-400 { + background-color: #c084fc !important; +} + +.text-purple-500 { + color: #a855f7 !important; +} + +.bg-purple-500 { + background-color: #a855f7 !important; +} + +.text-purple-600 { + color: #9333ea !important; +} + +.bg-purple-600 { + background-color: #9333ea !important; +} + +.text-purple-700 { + color: #7e22ce !important; +} + +.bg-purple-700 { + background-color: #7e22ce !important; +} + +.text-purple-800 { + color: #6b21a8 !important; +} + +.bg-purple-800 { + background-color: #6b21a8 !important; +} + +.text-purple-900 { + color: #581c87 !important; +} + +.bg-purple-900 { + background-color: #581c87 !important; +} + +.text-purple-950 { + color: #3b0764 !important; +} + +.bg-purple-950 { + background-color: #3b0764 !important; +} + +/* Solid button */ +.btn-purple { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid transparent; + cursor: pointer; + background-color: #9333ea; + color: #ffffff; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1), filter 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-purple:hover { + filter: brightness(95%); + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-2px); +} +.btn-purple:active { + filter: brightness(90%); + transform: translateY(0); +} +.btn-purple:focus { + outline: none; +} +.btn-purple:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.btn-purple:disabled, .btn-purple.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; + filter: none; +} + +/* Light button */ +.btn-purple-light { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid #e9d5ff; + cursor: pointer; + background-color: #f3e8ff; + color: #6b21a8; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-purple-light:hover { + background-color: #e9d5ff; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-1px); +} +.btn-purple-light:active { + background-color: #d8b4fe; + transform: translateY(0); +} +.btn-purple-light:focus { + outline: none; +} +.btn-purple-light:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); +} +.btn-purple-light:disabled, .btn-purple-light.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; +} + +/* Alerts */ +.alert-purple { + padding: 1rem; + border-radius: 0.5rem; + background-color: #f3e8ff; + color: #581c87; + border: 1px solid #e9d5ff; + margin-bottom: 1rem; +} + +.text-pink { + color: #db2777 !important; +} + +.bg-pink { + background-color: #db2777 !important; +} + +.bg-pink-light { + background-color: #fce7f3 !important; +} + +.text-pink-50 { + color: #fdf2f8 !important; +} + +.bg-pink-50 { + background-color: #fdf2f8 !important; +} + +.text-pink-100 { + color: #fce7f3 !important; +} + +.bg-pink-100 { + background-color: #fce7f3 !important; +} + +.text-pink-200 { + color: #fbcfe8 !important; +} + +.bg-pink-200 { + background-color: #fbcfe8 !important; +} + +.text-pink-300 { + color: #f9a8d4 !important; +} + +.bg-pink-300 { + background-color: #f9a8d4 !important; +} + +.text-pink-400 { + color: #f472b6 !important; +} + +.bg-pink-400 { + background-color: #f472b6 !important; +} + +.text-pink-500 { + color: #ec4899 !important; +} + +.bg-pink-500 { + background-color: #ec4899 !important; +} + +.text-pink-600 { + color: #db2777 !important; +} + +.bg-pink-600 { + background-color: #db2777 !important; +} + +.text-pink-700 { + color: #be185d !important; +} + +.bg-pink-700 { + background-color: #be185d !important; +} + +.text-pink-800 { + color: #9d174d !important; +} + +.bg-pink-800 { + background-color: #9d174d !important; +} + +.text-pink-900 { + color: #831843 !important; +} + +.bg-pink-900 { + background-color: #831843 !important; +} + +.text-pink-950 { + color: #500724 !important; +} + +.bg-pink-950 { + background-color: #500724 !important; +} + +/* Solid button */ +.btn-pink { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid transparent; + cursor: pointer; + background-color: #db2777; + color: #ffffff; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1), filter 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-pink:hover { + filter: brightness(95%); + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-2px); +} +.btn-pink:active { + filter: brightness(90%); + transform: translateY(0); +} +.btn-pink:focus { + outline: none; +} +.btn-pink:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.btn-pink:disabled, .btn-pink.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; + filter: none; +} + +/* Light button */ +.btn-pink-light { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid #fbcfe8; + cursor: pointer; + background-color: #fce7f3; + color: #9d174d; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-pink-light:hover { + background-color: #fbcfe8; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-1px); +} +.btn-pink-light:active { + background-color: #f9a8d4; + transform: translateY(0); +} +.btn-pink-light:focus { + outline: none; +} +.btn-pink-light:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); +} +.btn-pink-light:disabled, .btn-pink-light.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; +} + +/* Alerts */ +.alert-pink { + padding: 1rem; + border-radius: 0.5rem; + background-color: #fce7f3; + color: #831843; + border: 1px solid #fbcfe8; + margin-bottom: 1rem; +} + +.text-red { + color: #dc2626 !important; +} + +.bg-red { + background-color: #dc2626 !important; +} + +.bg-red-light { + background-color: #fee2e2 !important; +} + +.text-red-50 { + color: #fef2f2 !important; +} + +.bg-red-50 { + background-color: #fef2f2 !important; +} + +.text-red-100 { + color: #fee2e2 !important; +} + +.bg-red-100 { + background-color: #fee2e2 !important; +} + +.text-red-200 { + color: #fecaca !important; +} + +.bg-red-200 { + background-color: #fecaca !important; +} + +.text-red-300 { + color: #fca5a5 !important; +} + +.bg-red-300 { + background-color: #fca5a5 !important; +} + +.text-red-400 { + color: #f87171 !important; +} + +.bg-red-400 { + background-color: #f87171 !important; +} + +.text-red-500 { + color: #ef4444 !important; +} + +.bg-red-500 { + background-color: #ef4444 !important; +} + +.text-red-600 { + color: #dc2626 !important; +} + +.bg-red-600 { + background-color: #dc2626 !important; +} + +.text-red-700 { + color: #b91c1c !important; +} + +.bg-red-700 { + background-color: #b91c1c !important; +} + +.text-red-800 { + color: #991b1b !important; +} + +.bg-red-800 { + background-color: #991b1b !important; +} + +.text-red-900 { + color: #7f1d1d !important; +} + +.bg-red-900 { + background-color: #7f1d1d !important; +} + +.text-red-950 { + color: #450a0a !important; +} + +.bg-red-950 { + background-color: #450a0a !important; +} + +/* Solid button */ +.btn-red { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid transparent; + cursor: pointer; + background-color: #dc2626; + color: #ffffff; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1), filter 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-red:hover { + filter: brightness(95%); + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-2px); +} +.btn-red:active { + filter: brightness(90%); + transform: translateY(0); +} +.btn-red:focus { + outline: none; +} +.btn-red:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.btn-red:disabled, .btn-red.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; + filter: none; +} + +/* Light button */ +.btn-red-light { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid #fecaca; + cursor: pointer; + background-color: #fee2e2; + color: #991b1b; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-red-light:hover { + background-color: #fecaca; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-1px); +} +.btn-red-light:active { + background-color: #fca5a5; + transform: translateY(0); +} +.btn-red-light:focus { + outline: none; +} +.btn-red-light:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); +} +.btn-red-light:disabled, .btn-red-light.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; +} + +/* Alerts */ +.alert-red { + padding: 1rem; + border-radius: 0.5rem; + background-color: #fee2e2; + color: #7f1d1d; + border: 1px solid #fecaca; + margin-bottom: 1rem; +} + +.text-orange { + color: #ea580c !important; +} + +.bg-orange { + background-color: #ea580c !important; +} + +.bg-orange-light { + background-color: #ffedd5 !important; +} + +.text-orange-50 { + color: #fff7ed !important; +} + +.bg-orange-50 { + background-color: #fff7ed !important; +} + +.text-orange-100 { + color: #ffedd5 !important; +} + +.bg-orange-100 { + background-color: #ffedd5 !important; +} + +.text-orange-200 { + color: #fed7aa !important; +} + +.bg-orange-200 { + background-color: #fed7aa !important; +} + +.text-orange-300 { + color: #fdba74 !important; +} + +.bg-orange-300 { + background-color: #fdba74 !important; +} + +.text-orange-400 { + color: #fb923c !important; +} + +.bg-orange-400 { + background-color: #fb923c !important; +} + +.text-orange-500 { + color: #f97316 !important; +} + +.bg-orange-500 { + background-color: #f97316 !important; +} + +.text-orange-600 { + color: #ea580c !important; +} + +.bg-orange-600 { + background-color: #ea580c !important; +} + +.text-orange-700 { + color: #c2410c !important; +} + +.bg-orange-700 { + background-color: #c2410c !important; +} + +.text-orange-800 { + color: #9a3412 !important; +} + +.bg-orange-800 { + background-color: #9a3412 !important; +} + +.text-orange-900 { + color: #7c2d12 !important; +} + +.bg-orange-900 { + background-color: #7c2d12 !important; +} + +.text-orange-950 { + color: #431407 !important; +} + +.bg-orange-950 { + background-color: #431407 !important; +} + +/* Solid button */ +.btn-orange { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid transparent; + cursor: pointer; + background-color: #ea580c; + color: #ffffff; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1), filter 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-orange:hover { + filter: brightness(95%); + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-2px); +} +.btn-orange:active { + filter: brightness(90%); + transform: translateY(0); +} +.btn-orange:focus { + outline: none; +} +.btn-orange:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.btn-orange:disabled, .btn-orange.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; + filter: none; +} + +/* Light button */ +.btn-orange-light { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid #fed7aa; + cursor: pointer; + background-color: #ffedd5; + color: #9a3412; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-orange-light:hover { + background-color: #fed7aa; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-1px); +} +.btn-orange-light:active { + background-color: #fdba74; + transform: translateY(0); +} +.btn-orange-light:focus { + outline: none; +} +.btn-orange-light:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); +} +.btn-orange-light:disabled, .btn-orange-light.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; +} + +/* Alerts */ +.alert-orange { + padding: 1rem; + border-radius: 0.5rem; + background-color: #ffedd5; + color: #7c2d12; + border: 1px solid #fed7aa; + margin-bottom: 1rem; +} + +.text-yellow { + color: #ca8a04 !important; +} + +.bg-yellow { + background-color: #ca8a04 !important; +} + +.bg-yellow-light { + background-color: #fef9c3 !important; +} + +.text-yellow-50 { + color: #fefce8 !important; +} + +.bg-yellow-50 { + background-color: #fefce8 !important; +} + +.text-yellow-100 { + color: #fef9c3 !important; +} + +.bg-yellow-100 { + background-color: #fef9c3 !important; +} + +.text-yellow-200 { + color: #fef08a !important; +} + +.bg-yellow-200 { + background-color: #fef08a !important; +} + +.text-yellow-300 { + color: #fde047 !important; +} + +.bg-yellow-300 { + background-color: #fde047 !important; +} + +.text-yellow-400 { + color: #facc15 !important; +} + +.bg-yellow-400 { + background-color: #facc15 !important; +} + +.text-yellow-500 { + color: #eab308 !important; +} + +.bg-yellow-500 { + background-color: #eab308 !important; +} + +.text-yellow-600 { + color: #ca8a04 !important; +} + +.bg-yellow-600 { + background-color: #ca8a04 !important; +} + +.text-yellow-700 { + color: #a16207 !important; +} + +.bg-yellow-700 { + background-color: #a16207 !important; +} + +.text-yellow-800 { + color: #854d0e !important; +} + +.bg-yellow-800 { + background-color: #854d0e !important; +} + +.text-yellow-900 { + color: #713f12 !important; +} + +.bg-yellow-900 { + background-color: #713f12 !important; +} + +.text-yellow-950 { + color: #422006 !important; +} + +.bg-yellow-950 { + background-color: #422006 !important; +} + +/* Solid button */ +.btn-yellow { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid transparent; + cursor: pointer; + background-color: #ca8a04; + color: #ffffff; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1), filter 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-yellow:hover { + filter: brightness(95%); + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-2px); +} +.btn-yellow:active { + filter: brightness(90%); + transform: translateY(0); +} +.btn-yellow:focus { + outline: none; +} +.btn-yellow:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.btn-yellow:disabled, .btn-yellow.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; + filter: none; +} + +/* Light button */ +.btn-yellow-light { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid #fef08a; + cursor: pointer; + background-color: #fef9c3; + color: #854d0e; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-yellow-light:hover { + background-color: #fef08a; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-1px); +} +.btn-yellow-light:active { + background-color: #fde047; + transform: translateY(0); +} +.btn-yellow-light:focus { + outline: none; +} +.btn-yellow-light:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); +} +.btn-yellow-light:disabled, .btn-yellow-light.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; +} + +/* Alerts */ +.alert-yellow { + padding: 1rem; + border-radius: 0.5rem; + background-color: #fef9c3; + color: #713f12; + border: 1px solid #fef08a; + margin-bottom: 1rem; +} + +.text-green { + color: #16a34a !important; +} + +.bg-green { + background-color: #16a34a !important; +} + +.bg-green-light { + background-color: #dcfce7 !important; +} + +.text-green-50 { + color: #f0fdf4 !important; +} + +.bg-green-50 { + background-color: #f0fdf4 !important; +} + +.text-green-100 { + color: #dcfce7 !important; +} + +.bg-green-100 { + background-color: #dcfce7 !important; +} + +.text-green-200 { + color: #bbf7d0 !important; +} + +.bg-green-200 { + background-color: #bbf7d0 !important; +} + +.text-green-300 { + color: #86efac !important; +} + +.bg-green-300 { + background-color: #86efac !important; +} + +.text-green-400 { + color: #4ade80 !important; +} + +.bg-green-400 { + background-color: #4ade80 !important; +} + +.text-green-500 { + color: #22c55e !important; +} + +.bg-green-500 { + background-color: #22c55e !important; +} + +.text-green-600 { + color: #16a34a !important; +} + +.bg-green-600 { + background-color: #16a34a !important; +} + +.text-green-700 { + color: #15803d !important; +} + +.bg-green-700 { + background-color: #15803d !important; +} + +.text-green-800 { + color: #166534 !important; +} + +.bg-green-800 { + background-color: #166534 !important; +} + +.text-green-900 { + color: #14532d !important; +} + +.bg-green-900 { + background-color: #14532d !important; +} + +.text-green-950 { + color: #052e16 !important; +} + +.bg-green-950 { + background-color: #052e16 !important; +} + +/* Solid button */ +.btn-green { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid transparent; + cursor: pointer; + background-color: #16a34a; + color: #ffffff; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1), filter 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-green:hover { + filter: brightness(95%); + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-2px); +} +.btn-green:active { + filter: brightness(90%); + transform: translateY(0); +} +.btn-green:focus { + outline: none; +} +.btn-green:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.btn-green:disabled, .btn-green.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; + filter: none; +} + +/* Light button */ +.btn-green-light { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid #bbf7d0; + cursor: pointer; + background-color: #dcfce7; + color: #166534; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-green-light:hover { + background-color: #bbf7d0; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-1px); +} +.btn-green-light:active { + background-color: #86efac; + transform: translateY(0); +} +.btn-green-light:focus { + outline: none; +} +.btn-green-light:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); +} +.btn-green-light:disabled, .btn-green-light.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; +} + +/* Alerts */ +.alert-green { + padding: 1rem; + border-radius: 0.5rem; + background-color: #dcfce7; + color: #14532d; + border: 1px solid #bbf7d0; + margin-bottom: 1rem; +} + +.text-emerald { + color: #059669 !important; +} + +.bg-emerald { + background-color: #059669 !important; +} + +.bg-emerald-light { + background-color: #d1fae5 !important; +} + +.text-emerald-50 { + color: #ecfdf5 !important; +} + +.bg-emerald-50 { + background-color: #ecfdf5 !important; +} + +.text-emerald-100 { + color: #d1fae5 !important; +} + +.bg-emerald-100 { + background-color: #d1fae5 !important; +} + +.text-emerald-200 { + color: #a7f3d0 !important; +} + +.bg-emerald-200 { + background-color: #a7f3d0 !important; +} + +.text-emerald-300 { + color: #6ee7b7 !important; +} + +.bg-emerald-300 { + background-color: #6ee7b7 !important; +} + +.text-emerald-400 { + color: #34d399 !important; +} + +.bg-emerald-400 { + background-color: #34d399 !important; +} + +.text-emerald-500 { + color: #10b981 !important; +} + +.bg-emerald-500 { + background-color: #10b981 !important; +} + +.text-emerald-600 { + color: #059669 !important; +} + +.bg-emerald-600 { + background-color: #059669 !important; +} + +.text-emerald-700 { + color: #047857 !important; +} + +.bg-emerald-700 { + background-color: #047857 !important; +} + +.text-emerald-800 { + color: #065f46 !important; +} + +.bg-emerald-800 { + background-color: #065f46 !important; +} + +.text-emerald-900 { + color: #064e3b !important; +} + +.bg-emerald-900 { + background-color: #064e3b !important; +} + +.text-emerald-950 { + color: #022c22 !important; +} + +.bg-emerald-950 { + background-color: #022c22 !important; +} + +/* Solid button */ +.btn-emerald { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid transparent; + cursor: pointer; + background-color: #059669; + color: #ffffff; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1), filter 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-emerald:hover { + filter: brightness(95%); + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-2px); +} +.btn-emerald:active { + filter: brightness(90%); + transform: translateY(0); +} +.btn-emerald:focus { + outline: none; +} +.btn-emerald:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.btn-emerald:disabled, .btn-emerald.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; + filter: none; +} + +/* Light button */ +.btn-emerald-light { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid #a7f3d0; + cursor: pointer; + background-color: #d1fae5; + color: #065f46; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-emerald-light:hover { + background-color: #a7f3d0; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-1px); +} +.btn-emerald-light:active { + background-color: #6ee7b7; + transform: translateY(0); +} +.btn-emerald-light:focus { + outline: none; +} +.btn-emerald-light:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); +} +.btn-emerald-light:disabled, .btn-emerald-light.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; +} + +/* Alerts */ +.alert-emerald { + padding: 1rem; + border-radius: 0.5rem; + background-color: #d1fae5; + color: #064e3b; + border: 1px solid #a7f3d0; + margin-bottom: 1rem; +} + +.text-teal { + color: #0d9488 !important; +} + +.bg-teal { + background-color: #0d9488 !important; +} + +.bg-teal-light { + background-color: #ccfbf1 !important; +} + +.text-teal-50 { + color: #f0fdfa !important; +} + +.bg-teal-50 { + background-color: #f0fdfa !important; +} + +.text-teal-100 { + color: #ccfbf1 !important; +} + +.bg-teal-100 { + background-color: #ccfbf1 !important; +} + +.text-teal-200 { + color: #99f6e4 !important; +} + +.bg-teal-200 { + background-color: #99f6e4 !important; +} + +.text-teal-300 { + color: #5eead4 !important; +} + +.bg-teal-300 { + background-color: #5eead4 !important; +} + +.text-teal-400 { + color: #2dd4bf !important; +} + +.bg-teal-400 { + background-color: #2dd4bf !important; +} + +.text-teal-500 { + color: #14b8a6 !important; +} + +.bg-teal-500 { + background-color: #14b8a6 !important; +} + +.text-teal-600 { + color: #0d9488 !important; +} + +.bg-teal-600 { + background-color: #0d9488 !important; +} + +.text-teal-700 { + color: #0f766e !important; +} + +.bg-teal-700 { + background-color: #0f766e !important; +} + +.text-teal-800 { + color: #115e59 !important; +} + +.bg-teal-800 { + background-color: #115e59 !important; +} + +.text-teal-900 { + color: #134e4a !important; +} + +.bg-teal-900 { + background-color: #134e4a !important; +} + +.text-teal-950 { + color: #042f2e !important; +} + +.bg-teal-950 { + background-color: #042f2e !important; +} + +/* Solid button */ +.btn-teal { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid transparent; + cursor: pointer; + background-color: #0d9488; + color: #ffffff; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1), filter 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-teal:hover { + filter: brightness(95%); + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-2px); +} +.btn-teal:active { + filter: brightness(90%); + transform: translateY(0); +} +.btn-teal:focus { + outline: none; +} +.btn-teal:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.btn-teal:disabled, .btn-teal.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; + filter: none; +} + +/* Light button */ +.btn-teal-light { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid #99f6e4; + cursor: pointer; + background-color: #ccfbf1; + color: #115e59; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-teal-light:hover { + background-color: #99f6e4; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-1px); +} +.btn-teal-light:active { + background-color: #5eead4; + transform: translateY(0); +} +.btn-teal-light:focus { + outline: none; +} +.btn-teal-light:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); +} +.btn-teal-light:disabled, .btn-teal-light.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; +} + +/* Alerts */ +.alert-teal { + padding: 1rem; + border-radius: 0.5rem; + background-color: #ccfbf1; + color: #134e4a; + border: 1px solid #99f6e4; + margin-bottom: 1rem; +} + +.text-cyan { + color: #0891b2 !important; +} + +.bg-cyan { + background-color: #0891b2 !important; +} + +.bg-cyan-light { + background-color: #cffafe !important; +} + +.text-cyan-50 { + color: #ecfeff !important; +} + +.bg-cyan-50 { + background-color: #ecfeff !important; +} + +.text-cyan-100 { + color: #cffafe !important; +} + +.bg-cyan-100 { + background-color: #cffafe !important; +} + +.text-cyan-200 { + color: #a5f3fc !important; +} + +.bg-cyan-200 { + background-color: #a5f3fc !important; +} + +.text-cyan-300 { + color: #67e8f9 !important; +} + +.bg-cyan-300 { + background-color: #67e8f9 !important; +} + +.text-cyan-400 { + color: #22d3ee !important; +} + +.bg-cyan-400 { + background-color: #22d3ee !important; +} + +.text-cyan-500 { + color: #06b6d4 !important; +} + +.bg-cyan-500 { + background-color: #06b6d4 !important; +} + +.text-cyan-600 { + color: #0891b2 !important; +} + +.bg-cyan-600 { + background-color: #0891b2 !important; +} + +.text-cyan-700 { + color: #0e7490 !important; +} + +.bg-cyan-700 { + background-color: #0e7490 !important; +} + +.text-cyan-800 { + color: #155e75 !important; +} + +.bg-cyan-800 { + background-color: #155e75 !important; +} + +.text-cyan-900 { + color: #164e63 !important; +} + +.bg-cyan-900 { + background-color: #164e63 !important; +} + +.text-cyan-950 { + color: #083344 !important; +} + +.bg-cyan-950 { + background-color: #083344 !important; +} + +/* Solid button */ +.btn-cyan { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid transparent; + cursor: pointer; + background-color: #0891b2; + color: #ffffff; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1), filter 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-cyan:hover { + filter: brightness(95%); + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-2px); +} +.btn-cyan:active { + filter: brightness(90%); + transform: translateY(0); +} +.btn-cyan:focus { + outline: none; +} +.btn-cyan:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.btn-cyan:disabled, .btn-cyan.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; + filter: none; +} + +/* Light button */ +.btn-cyan-light { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; + border-radius: 0.5rem; + border: 1px solid #a5f3fc; + cursor: pointer; + background-color: #cffafe; + color: #155e75; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-cyan-light:hover { + background-color: #a5f3fc; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-1px); +} +.btn-cyan-light:active { + background-color: #67e8f9; + transform: translateY(0); +} +.btn-cyan-light:focus { + outline: none; +} +.btn-cyan-light:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35), 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); +} +.btn-cyan-light:disabled, .btn-cyan-light.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; +} + +/* Alerts */ +.alert-cyan { + padding: 1rem; + border-radius: 0.5rem; + background-color: #cffafe; + color: #164e63; + border: 1px solid #a5f3fc; + margin-bottom: 1rem; +} + +/* Button size modifiers */ +.btn-sm { + padding: 0.3571428571rem 0.7142857143rem !important; + font-size: 0.875rem !important; + border-radius: 0.25rem !important; +} + +.btn-lg { + padding: 1rem 1.5rem !important; + font-size: 1rem !important; + border-radius: 1rem !important; +} + +/* -------------------------------------------- + Cards / Surfaces +-------------------------------------------- */ +.card { + background-color: var(--bg-card); + border: 1px solid var(--border-color); + border-radius: 0.5rem; + padding: 1.5rem; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); +} + +.card.hoverable { + transition: box-shadow 400ms cubic-bezier(0.4, 0, 0.2, 1), transform 400ms cubic-bezier(0.4, 0, 0.2, 1); +} +.card.hoverable:hover { + box-shadow: 0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12); + transform: translateY(-2px); +} + +.card-soft { + background-color: var(--bg-surface); + border: 1px solid var(--border-color); +} + +/* -------------------------------------------- + Forms (inputs/selects/textarea/checkbox/radio) +-------------------------------------------- */ +.form-group { + margin-bottom: 1rem; +} + +.label { + display: block; + margin-bottom: 0.25rem; + font-size: 0.875rem; + font-weight: 500; + color: var(--text-muted); +} + +.input { + width: 100%; + height: 2.5rem; + padding: 0.5rem 1rem; + background-color: var(--bg-surface); + border: 1px solid var(--border-color); + border-radius: 0.25rem; + color: var(--text-main); + transition: border-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1), background-color 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.input:focus { + outline: none; + border-color: var(--primary); +} +.input:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35); +} +.input::-moz-placeholder { + color: var(--text-light); +} +.input::placeholder { + color: var(--text-light); +} +.input:disabled { + opacity: 0.7; + cursor: not-allowed; +} + +.input-sm { + width: 100%; + height: 2rem; + padding: 0.5rem 1rem; + background-color: var(--bg-surface); + border: 1px solid var(--border-color); + border-radius: 0.25rem; + color: var(--text-main); + transition: border-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1), background-color 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.input-sm:focus { + outline: none; + border-color: var(--primary); +} +.input-sm:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35); +} +.input-sm::-moz-placeholder { + color: var(--text-light); +} +.input-sm::placeholder { + color: var(--text-light); +} +.input-sm:disabled { + opacity: 0.7; + cursor: not-allowed; +} +.input-sm { + font-size: 0.875rem; +} + +.input-lg { + width: 100%; + height: 3.25rem; + padding: 0.5rem 1rem; + background-color: var(--bg-surface); + border: 1px solid var(--border-color); + border-radius: 0.25rem; + color: var(--text-main); + transition: border-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1), background-color 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.input-lg:focus { + outline: none; + border-color: var(--primary); +} +.input-lg:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35); +} +.input-lg::-moz-placeholder { + color: var(--text-light); +} +.input-lg::placeholder { + color: var(--text-light); +} +.input-lg:disabled { + opacity: 0.7; + cursor: not-allowed; +} +.input-lg { + font-size: 1rem; +} + +.textarea { + width: 100%; + height: 3.25rem; + padding: 0.5rem 1rem; + background-color: var(--bg-surface); + border: 1px solid var(--border-color); + border-radius: 0.25rem; + color: var(--text-main); + transition: border-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1), background-color 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.textarea:focus { + outline: none; + border-color: var(--primary); +} +.textarea:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35); +} +.textarea::-moz-placeholder { + color: var(--text-light); +} +.textarea::placeholder { + color: var(--text-light); +} +.textarea:disabled { + opacity: 0.7; + cursor: not-allowed; +} +.textarea { + height: auto; + min-height: 120px; + resize: vertical; +} + +.select { + width: 100%; + height: 2.5rem; + padding: 0.5rem 1rem; + background-color: var(--bg-surface); + border: 1px solid var(--border-color); + border-radius: 0.25rem; + color: var(--text-main); + transition: border-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1), background-color 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.select:focus { + outline: none; + border-color: var(--primary); +} +.select:focus-visible { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35); +} +.select::-moz-placeholder { + color: var(--text-light); +} +.select::placeholder { + color: var(--text-light); +} +.select:disabled { + opacity: 0.7; + cursor: not-allowed; +} +.select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right 1rem center; + background-size: 16px 12px; +} + +[data-theme=dark] .select { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23cbd5e1' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); +} + +.input-group { + display: flex; + align-items: stretch; +} +.input-group .input, .input-group .select { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group [class^=btn-], .input-group .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + white-space: nowrap; +} + +/* Checkbox / radio */ +.check { + display: inline-flex; + align-items: center; + gap: 0.5rem; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + color: var(--text-main); +} +.check input { + width: 18px; + height: 18px; + margin: 0; + accent-color: var(--primary); +} +.check input:focus-visible { + outline: none; + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35); + border-radius: 0.25rem; +} +.check .check-label { + color: var(--text-muted); +} + +/* -------------------------------------------- + Tables (token-driven) +-------------------------------------------- */ +.table-wrap { + overflow: auto; + -webkit-overflow-scrolling: touch; + border-radius: inherit; +} + +.table { + width: 100%; + border-collapse: separate; + border-spacing: 0; + margin: 0; +} +.table th, .table td { + padding: 1rem 1rem; + text-align: left; + vertical-align: middle; + border-bottom: 1px solid var(--border-color); +} +.table thead th { + position: sticky; + top: 0; + z-index: 1; + background: var(--table-header-bg); + color: var(--text-muted); + font-weight: 500; + text-transform: none; + letter-spacing: 0.02em; + font-size: 0.875rem; + border-bottom: 1px solid var(--border-color); +} +.table thead th:first-child { + border-top-left-radius: 0.5rem; +} +.table thead th:last-child { + border-top-right-radius: 0.5rem; +} +.table tbody tr { + background: transparent; + transition: background-color 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.table.striped tbody tr:nth-of-type(odd) { + background: var(--table-striped-bg); +} +.table.hover tbody tr:hover { + background: var(--table-hover-bg); +} +.table.table-sm th, .table.table-sm td { + padding: 0.7142857143rem 0.7142857143rem; +} +.table.table-sm thead th { + font-size: 0.75rem; +} + +/* -------------------------------------------- + Scrollbar +-------------------------------------------- */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: #f8f9fa; +} + +::-webkit-scrollbar-thumb { + background: #dee2e6; + border-radius: 50rem; +} +::-webkit-scrollbar-thumb:hover { + background: #ced4da; +} + +/* -------------------------------------------- + Badges +-------------------------------------------- */ +.badge { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.25em 0.6em; + font-size: 0.75rem; + font-weight: 700; + border-radius: 50rem; + line-height: 1; + white-space: nowrap; +} + +.badge-gray { + background-color: #f8f9fa; + color: #343a40; + border: 1px solid #e9ecef; +} +.badge-gray.badge-solid { + background-color: #6c757d; + color: #ffffff; + border-color: transparent; +} + +.badge-blue { + background-color: #e7f1ff; + color: #052c65; + border: 1px solid #cfe2ff; +} +.badge-blue.badge-solid { + background-color: #0a58ca; + color: #ffffff; + border-color: transparent; +} + +.badge-indigo { + background-color: #ede9fe; + color: #5b21b6; + border: 1px solid #ddd6fe; +} +.badge-indigo.badge-solid { + background-color: #7c3aed; + color: #ffffff; + border-color: transparent; +} + +.badge-purple { + background-color: #f3e8ff; + color: #6b21a8; + border: 1px solid #e9d5ff; +} +.badge-purple.badge-solid { + background-color: #9333ea; + color: #ffffff; + border-color: transparent; +} + +.badge-pink { + background-color: #fce7f3; + color: #9d174d; + border: 1px solid #fbcfe8; +} +.badge-pink.badge-solid { + background-color: #db2777; + color: #ffffff; + border-color: transparent; +} + +.badge-red { + background-color: #fee2e2; + color: #991b1b; + border: 1px solid #fecaca; +} +.badge-red.badge-solid { + background-color: #dc2626; + color: #ffffff; + border-color: transparent; +} + +.badge-orange { + background-color: #ffedd5; + color: #9a3412; + border: 1px solid #fed7aa; +} +.badge-orange.badge-solid { + background-color: #ea580c; + color: #ffffff; + border-color: transparent; +} + +.badge-yellow { + background-color: #fef9c3; + color: #854d0e; + border: 1px solid #fef08a; +} +.badge-yellow.badge-solid { + background-color: #ca8a04; + color: #ffffff; + border-color: transparent; +} + +.badge-green { + background-color: #dcfce7; + color: #166534; + border: 1px solid #bbf7d0; +} +.badge-green.badge-solid { + background-color: #16a34a; + color: #ffffff; + border-color: transparent; +} + +.badge-emerald { + background-color: #d1fae5; + color: #065f46; + border: 1px solid #a7f3d0; +} +.badge-emerald.badge-solid { + background-color: #059669; + color: #ffffff; + border-color: transparent; +} + +.badge-teal { + background-color: #ccfbf1; + color: #115e59; + border: 1px solid #99f6e4; +} +.badge-teal.badge-solid { + background-color: #0d9488; + color: #ffffff; + border-color: transparent; +} + +.badge-cyan { + background-color: #cffafe; + color: #155e75; + border: 1px solid #a5f3fc; +} +.badge-cyan.badge-solid { + background-color: #0891b2; + color: #ffffff; + border-color: transparent; +} + +/* -------------------------------------------- + Chips (component) +-------------------------------------------- */ +.chip-row { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.chip { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.35rem 0.65rem; + border-radius: 50rem; + border: 1px solid var(--border-color); + background: var(--bg-surface); + color: var(--text-muted); + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), color 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.chip:hover { + transform: translateY(-1px); + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + color: var(--text-main); +} +.chip.is-active { + background: rgba(var(--primary-rgb), 0.12); + border-color: rgba(var(--primary-rgb), 0.18); + color: var(--text-main); +} + +/* -------------------------------------------- + Progress (component) +-------------------------------------------- */ +.progress { + height: 10px; + border-radius: 50rem; + background: var(--bg-surface); + overflow: hidden; + border: 1px solid var(--border-color); +} + +.progress-bar { + height: 100%; + background: var(--primary); + border-radius: 50rem; + transition: width 400ms cubic-bezier(0.4, 0, 0.2, 1); +} + +/* Optional width helpers (keep demo-friendly) */ +.progress-0 { + width: 0%; +} + +.progress-25 { + width: 25%; +} + +.progress-46 { + width: 46%; +} + +.progress-50 { + width: 50%; +} + +.progress-72 { + width: 72%; +} + +.progress-100 { + width: 100%; +} + +/* Variant tones */ +.progress-bar.soft { + background: rgba(var(--primary-rgb), 0.55); +} + +.progress-bar.warn { + background: rgba(249, 115, 22, 0.55); +} /* stays as MDI-ish warning tone */ +/* -------------------------------------------- + Buttons: Close / Icon (component) +-------------------------------------------- */ +.btn-close { + border: none; + background: transparent; + font-size: 1.5rem; + line-height: 1; + cursor: pointer; + color: var(--text-muted); + padding: 0.25rem 0.5rem; + border-radius: 0.25rem; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-close:hover { + background: rgba(0, 0, 0, 0.06); + color: var(--text-main); + transform: translateY(-1px); +} +.btn-close:active { + transform: translateY(0); +} + +[data-theme=dark] .btn-close:hover { + background: rgba(255, 255, 255, 0.08); +} + +/* -------------------------------------------- + App shell / Sidebar / Drawer / Modal +-------------------------------------------- */ +.app-wrapper { + display: flex; + width: 100%; + min-height: 100vh; +} + +.sidebar { + width: 280px; + height: 100vh; + position: sticky; + top: 0; + background-color: var(--bg-surface); + border-right: 1px solid var(--border-color); + display: flex; + flex-direction: column; + transition: width 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.sidebar.collapsed { + width: 84px; +} + +.drawer { + position: fixed; + top: 0; + left: 0; + width: 320px; + max-width: 88vw; + height: 100vh; + z-index: 200; + background-color: var(--bg-card); + border-right: 1px solid var(--border-color); + transform: translateX(-105%); + transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1); + box-shadow: 0 11px 15px -7px rgba(0, 0, 0, 0.2), 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12); +} +.drawer.is-open { + transform: translateX(0); +} + +.main-content { + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; +} + +/* Modal */ +.modal-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.55); + display: flex; + align-items: center; + justify-content: center; + z-index: 500; + padding: 1.5rem; + opacity: 0; + visibility: hidden; + pointer-events: none; + transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1), visibility 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.modal-overlay.is-active { + opacity: 1; + visibility: visible; + pointer-events: auto; +} + +.modal-content { + background-color: var(--bg-card); + border-radius: 1rem; + width: 100%; + max-width: 640px; + box-shadow: 0 11px 15px -7px rgba(0, 0, 0, 0.2), 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12); + overflow: hidden; + border: 1px solid var(--border-color); + transform: translateY(10px) scale(0.985); + transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.modal-overlay.is-active .modal-content { + transform: translateY(0) scale(1); +} + +.modal-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + padding: 1.5rem; + border-bottom: 1px solid var(--border-color); +} + +.modal-title { + margin: 0; + font-size: 1.5rem; + font-weight: 700; + color: var(--text-main); +} + +.modal-body { + padding: 1.5rem; + color: var(--text-muted); +} +.modal-body p { + margin: 0; +} + +.modal-footer { + display: flex; + justify-content: flex-end; + gap: 0.5rem; + padding: 1rem 1.5rem; + border-top: 1px solid var(--border-color); + background: var(--bg-surface); +} + +.modal-actions { + display: flex; + justify-content: flex-end; + gap: 0.5rem; +} + +.vor-modal-sm { + max-width: 480px; +} + +.vor-modal-md { + max-width: 640px; +} + +.vor-modal-lg { + max-width: 820px; +} + +/* -------------------------------------------- + Accordion +-------------------------------------------- */ +.accordion-item { + border-bottom: 1px solid var(--border-color); +} +.accordion-item.is-active .accordion-body { + display: block; +} +.accordion-item.is-active .accordion-icon { + transform: rotate(180deg); +} +.accordion-item .accordion-header { + padding: 1rem; + cursor: pointer; + display: flex; + justify-content: space-between; + align-items: center; + background: none; + border: none; + width: 100%; + color: var(--text-main); +} +.accordion-item .accordion-header:hover { + background-color: var(--bg-surface); +} +.accordion-item .accordion-icon { + transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.accordion-item .accordion-body { + padding: 0 1rem 1rem; + display: none; + color: var(--text-muted); +} + +/* -------------------------------------------- + Switch +-------------------------------------------- */ +.switch { + --switch-width: 40px; + --switch-height: 22px; + position: relative; + display: inline-block; + width: var(--switch-width); + height: var(--switch-height); +} +.switch input { + opacity: 0; + width: 0; + height: 0; +} +.switch input:checked + .slider { + background-color: var(--primary); +} +.switch input:checked + .slider::before { + transform: translateX(18px); +} +.switch input:focus-visible + .slider { + box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.35); +} +.switch .slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #dee2e6; + transition: 150ms cubic-bezier(0.4, 0, 0.2, 1); + border-radius: 50rem; +} +.switch .slider::before { + position: absolute; + content: ""; + height: 16px; + width: 16px; + left: 3px; + bottom: 3px; + background-color: #ffffff; + transition: 150ms cubic-bezier(0.4, 0, 0.2, 1); + border-radius: 50%; +} + +/* -------------------------------------------- + Dividers / helpers +-------------------------------------------- */ +.hr { + border: none; + border-top: 1px solid var(--border-color); + margin: 1.5rem 0; +} + +/* -------------------------------------------- + Drawer Modal (off-canvas modal) +-------------------------------------------- */ +.drawer-modal { + position: fixed; + inset: 0; + z-index: 500; + display: flex; + justify-content: flex-end; + background-color: rgba(0, 0, 0, 0.55); + opacity: 0; + visibility: hidden; + pointer-events: none; + transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1), visibility 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.drawer-modal.is-active { + opacity: 1; + visibility: visible; + pointer-events: auto; +} + +/* -------------------------------------------- + Drawer Modal (off-canvas modal) +-------------------------------------------- */ +.drawer-modal { + position: fixed; + inset: 0; + z-index: 500; + display: flex; + justify-content: flex-end; /* right default */ + background-color: rgba(0, 0, 0, 0.55); + opacity: 0; + visibility: hidden; + pointer-events: none; + transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1), visibility 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.drawer-modal.is-active { + opacity: 1; + visibility: visible; + pointer-events: auto; +} +.drawer-modal.is-left { + justify-content: flex-start; +} + +.drawer-panel { + width: 520px; + max-width: 94vw; + height: 100vh; + background-color: var(--bg-card); + box-shadow: 0 11px 15px -7px rgba(0, 0, 0, 0.2), 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12); + display: flex; + flex-direction: column; + transition: transform 400ms cubic-bezier(0.4, 0, 0.2, 1); + /* default: start off-screen right */ + transform: translateX(105%); + border-left: 1px solid var(--border-color); +} +.drawer-modal.is-active .drawer-panel { + transform: translateX(0); +} +.drawer-panel { + /* left variant */ +} +.drawer-modal.is-left .drawer-panel { + transform: translateX(-105%); + border-left: none; + border-right: 1px solid var(--border-color); +} +.drawer-modal.is-left.is-active .drawer-panel { + transform: translateX(0); +} + +.drawer-panel-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.5rem; + border-bottom: 1px solid var(--border-color); +} + +.drawer-panel-body { + padding: 1.5rem; + overflow: auto; + -webkit-overflow-scrolling: touch; + flex: 1; +} + +.drawer-panel-footer { + padding: 1rem 1.5rem; + border-top: 1px solid var(--border-color); +} + +/* Dark mode tweaks (optional, usually already handled by tokens) */ +[data-theme=dark] .drawer-modal { + background-color: rgba(0, 0, 0, 0.65); +}/*# sourceMappingURL=main.css.map */ \ No newline at end of file diff --git a/rss/css/main.css.map b/rss/css/main.css.map new file mode 100644 index 0000000..97a70b0 --- /dev/null +++ b/rss/css/main.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["main.scss","palette.scss","variables.scss","main.css"],"names":[],"mappings":"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B,sBAAA;EG+yH1B;EH9yHI;IAAsB,uBAAA;EGizH1B;EHlzHI;IAAsB,sBAAA;EGqzH1B;EHpzHI;IAAsB,uBAAA;EGuzH1B;EHxzHI;IAAsB,uBAAA;EG2zH1B;EH1zHI;IAAsB,wBAAA;EG6zH1B;EH9zHI;IAAsB,uBAAA;EGi0H1B;EHh0HI;IAAsB,wBAAA;EGm0H1B;AACF;AHx0HE;EAGI;IAAsB,qBAAA;EGy0H1B;EHx0HI;IAAsB,sBAAA;EG20H1B;EH50HI;IAAsB,wBAAA;EG+0H1B;EH90HI;IAAsB,yBAAA;EGi1H1B;EHl1HI;IAAsB,qBAAA;EGq1H1B;EHp1HI;IAAsB,sBAAA;EGu1H1B;EHx1HI;IAAsB,wBAAA;EG21H1B;EH11HI;IAAsB,yBAAA;EG61H1B;EH91HI;IAAsB,qBAAA;EGi2H1B;EHh2HI;IAAsB,sBAAA;EGm2H1B;EHp2HI;IAAsB,sBAAA;EGu2H1B;EHt2HI;IAAsB,uBAAA;EGy2H1B;EH12HI;IAAsB,sBAAA;EG62H1B;EH52HI;IAAsB,uBAAA;EG+2H1B;EHh3HI;IAAsB,uBAAA;EGm3H1B;EHl3HI;IAAsB,wBAAA;EGq3H1B;EHt3HI;IAAsB,uBAAA;EGy3H1B;EHx3HI;IAAsB,wBAAA;EG23H1B;AACF;AHh4HE;EAGI;IAAsB,qBAAA;EGi4H1B;EHh4HI;IAAsB,sBAAA;EGm4H1B;EHp4HI;IAAsB,wBAAA;EGu4H1B;EHt4HI;IAAsB,yBAAA;EGy4H1B;EH14HI;IAAsB,qBAAA;EG64H1B;EH54HI;IAAsB,sBAAA;EG+4H1B;EHh5HI;IAAsB,wBAAA;EGm5H1B;EHl5HI;IAAsB,yBAAA;EGq5H1B;EHt5HI;IAAsB,qBAAA;EGy5H1B;EHx5HI;IAAsB,sBAAA;EG25H1B;EH55HI;IAAsB,sBAAA;EG+5H1B;EH95HI;IAAsB,uBAAA;EGi6H1B;EHl6HI;IAAsB,sBAAA;EGq6H1B;EHp6HI;IAAsB,uBAAA;EGu6H1B;EHx6HI;IAAsB,uBAAA;EG26H1B;EH16HI;IAAsB,wBAAA;EG66H1B;EH96HI;IAAsB,uBAAA;EGi7H1B;EHh7HI;IAAsB,wBAAA;EGm7H1B;AACF;AHx7HE;EAGI;IAAsB,qBAAA;EGy7H1B;EHx7HI;IAAsB,sBAAA;EG27H1B;EH57HI;IAAsB,wBAAA;EG+7H1B;EH97HI;IAAsB,yBAAA;EGi8H1B;EHl8HI;IAAsB,qBAAA;EGq8H1B;EHp8HI;IAAsB,sBAAA;EGu8H1B;EHx8HI;IAAsB,wBAAA;EG28H1B;EH18HI;IAAsB,yBAAA;EG68H1B;EH98HI;IAAsB,qBAAA;EGi9H1B;EHh9HI;IAAsB,sBAAA;EGm9H1B;EHp9HI;IAAsB,sBAAA;EGu9H1B;EHt9HI;IAAsB,uBAAA;EGy9H1B;EH19HI;IAAsB,sBAAA;EG69H1B;EH59HI;IAAsB,uBAAA;EG+9H1B;EHh+HI;IAAsB,uBAAA;EGm+H1B;EHl+HI;IAAsB,wBAAA;EGq+H1B;EHt+HI;IAAsB,uBAAA;EGy+H1B;EHx+HI;IAAsB,wBAAA;EG2+H1B;AACF;AHh/HE;EAGI;IAAsB,qBAAA;EGi/H1B;EHh/HI;IAAsB,sBAAA;EGm/H1B;EHp/HI;IAAsB,wBAAA;EGu/H1B;EHt/HI;IAAsB,yBAAA;EGy/H1B;EH1/HI;IAAsB,qBAAA;EG6/H1B;EH5/HI;IAAsB,sBAAA;EG+/H1B;EHhgII;IAAsB,wBAAA;EGmgI1B;EHlgII;IAAsB,yBAAA;EGqgI1B;EHtgII;IAAsB,qBAAA;EGygI1B;EHxgII;IAAsB,sBAAA;EG2gI1B;EH5gII;IAAsB,sBAAA;EG+gI1B;EH9gII;IAAsB,uBAAA;EGihI1B;EHlhII;IAAsB,sBAAA;EGqhI1B;EHphII;IAAsB,uBAAA;EGuhI1B;EHxhII;IAAsB,uBAAA;EG2hI1B;EH1hII;IAAsB,wBAAA;EG6hI1B;EH9hII;IAAsB,uBAAA;EGiiI1B;EHhiII;IAAsB,wBAAA;EGmiI1B;AACF;AHxiIE;EAGI;IAAsB,qBAAA;EGyiI1B;EHxiII;IAAsB,sBAAA;EG2iI1B;EH5iII;IAAsB,wBAAA;EG+iI1B;EH9iII;IAAsB,yBAAA;EGijI1B;EHljII;IAAsB,qBAAA;EGqjI1B;EHpjII;IAAsB,sBAAA;EGujI1B;EHxjII;IAAsB,wBAAA;EG2jI1B;EH1jII;IAAsB,yBAAA;EG6jI1B;EH9jII;IAAsB,qBAAA;EGikI1B;EHhkII;IAAsB,sBAAA;EGmkI1B;EHpkII;IAAsB,sBAAA;EGukI1B;EHtkII;IAAsB,uBAAA;EGykI1B;EH1kII;IAAsB,sBAAA;EG6kI1B;EH5kII;IAAsB,uBAAA;EG+kI1B;EHhlII;IAAsB,uBAAA;EGmlI1B;EHllII;IAAsB,wBAAA;EGqlI1B;EHtlII;IAAsB,uBAAA;EGylI1B;EHxlII;IAAsB,wBAAA;EG2lI1B;AACF;AHvlIA;;8CAAA;AAGkC;EAAW,4BAAA;AG0lI7C;;AH1lIkC;EAAW,0BAAA;AG8lI7C;;AH9lIkC;EAAW,6BAAA;AGkmI7C;;AHlmIkC;EAAW,4BAAA;AGsmI7C;;AHtmIkC;EAAW,6BAAA;AG0mI7C;;AH1mIkC;EAAW,0BAAA;AG8mI7C;;AH9mIkC;EAAW,0BAAA;AGknI7C;;AHlnIkC;EAAW,8BAAA;AGsnI7C;;AHtnIkC;EAAW,6BAAA;AG0nI7C;;AHxnIA;EAAe,6BAAA;AG4nIf;;AH3nIA;EAAc,4BAAA;AG+nId;;AH9nIA;EAAa,2BAAA;AGkoIb;;AHhoIA;EAAqB,2BAAA;AGooIrB;;AHnoIA;EAAsB,2BAAA;AGuoItB;;AHtoIA;EAAsB,2BAAA;AG0oItB;;AHzoIA;EAAoB,2BAAA;AG6oIpB;;AH3oIA;EAAwB,gCAAA;AG+oIxB;;AH9oIA;EAAkB,oCAAA;AGkpIlB;;AHhpIA;EACE,gGAAA;EACA,iBAAA;EACA,sBAAA;EACA,sBE9MU;EF+MV,yCAAA;EACA,gDAAA;AGmpIF;;AHhpIA;;8CAAA;AAGA;EAAU,gDAAA;AGopIV;;AHnpIA;EAAc,oDAAA;AGupId;;AHtpIA;EAAiB,uDAAA;AG0pIjB;;AHzpIA;EAAe,qDAAA;AG6pIf;;AH5pIA;EAAgB,sDAAA;AGgqIhB;;AH9pIA;;8CAAA;AAGA;EAAW,gCAAA;AGkqIX;;AHjqIA;EAAc,iCAAA;AGqqId;;AHpqIA;EAAc,8BAAA;AGwqId;;AHvqIA;EAAgB,+BAAA;AG2qIhB;;AH1qIA;EAAgB,2BAAA;AG8qIhB;;AH5qIA;;8CAAA;AAGiC;EAAqB,2BAAA;AGgrItD;;AHhrIiC;EAAqB,0HAAA;AGorItD;;AHprIiC;EAAqB,0HAAA;AGwrItD;;AHxrIiC;EAAqB,2HAAA;AG4rItD;;AH5rIiC;EAAqB,gIAAA;AGgsItD;;AHhsIiC;EAAqB,iIAAA;AGosItD;;AHpsIiC;EAAqB,kIAAA;AGwsItD;;AHxsIiC;EAAqB,mIAAA;AG4sItD;;AH1sIA;;8CAAA;AAG+B;EAAa,sBAAA;AG8sI5C;;AH9sI+B;EAAa,qBAAA;AGktI5C;;AHltI+B;EAAa,uBAAA;AGstI5C;;AHttI+B;EAAa,uBAAA;AG0tI5C;;AH1tI+B;EAAa,uBAAA;AG8tI5C;;AH9tI+B;EAAa,uBAAA;AGkuI5C;;AHluI+B;EAAa,uBAAA;AGsuI5C;;AHtuI+B;EAAa,uBAAA;AG0uI5C;;AH1uI+B;EAAa,uBAAA;AG8uI5C;;AH9uI+B;EAAa,uBAAA;AGkvI5C;;AHlvI+B;EAAa,uBAAA;AGsvI5C;;AHpvIA;;8CAAA;AAGA;EAAa,qBAAA;AGwvIb;;AHvvIA;EAAc,uBAAA;AG2vId;;AH1vIA;EAAe,qBAAA;AG8vIf;;AH5vIA;EAAmB,2BAAA;AGgwInB;;AH/vIA;EAAiB,yBAAA;AGmwIjB;;AHjwIA;EAAkB,0BAAA;AGqwIlB;;AHpwIA;EAAoB,oCAAA;KAAA,iCAAA;UAAA,4BAAA;AGwwIpB;;AHvwIA;EAAa,wBAAA;AG2wIb;;AH1wIA;EAAe,2BAAA;AG8wIf;;AH5wIA;;8CAAA;AAGA;EAAa,eAAA;EAAiB,YAAA;AGixI9B;;AHhxI6B;EAAkB,iCAAA;KAAA,8BAAA;AGoxI/C;;AHpxI6B;EAAkB,+BAAA;KAAA,4BAAA;AGwxI/C;;AHxxI6B;EAAkB,8BAAA;KAAA,2BAAA;AG4xI/C;;AH5xI6B;EAAkB,oCAAA;KAAA,iCAAA;AGgyI/C;;AH7xIE;EACE,kBAAA;EACA,WAAA;AGgyIJ;AH9xII;EAAY,cAAA;EAAgB,WAAA;EAAa,iBE9C7B;ACi1IhB;AHlyII;EAAM,kBAAA;EAAoB,MAAA;EAAQ,OAAA;EAAS,WAAA;EAAa,YAAA;AGyyI5D;;AH9yIE;EACE,kBAAA;EACA,WAAA;AGizIJ;AH/yII;EAAY,cAAA;EAAgB,WAAA;EAAa,gBE9C7B;ACk2IhB;AHnzII;EAAM,kBAAA;EAAoB,MAAA;EAAQ,OAAA;EAAS,WAAA;EAAa,YAAA;AG0zI5D;;AH/zIE;EACE,kBAAA;EACA,WAAA;AGk0IJ;AHh0II;EAAY,cAAA;EAAgB,WAAA;EAAa,mBE9C7B;ACm3IhB;AHp0II;EAAM,kBAAA;EAAoB,MAAA;EAAQ,OAAA;EAAS,WAAA;EAAa,YAAA;AG20I5D;;AHh1IE;EACE,kBAAA;EACA,WAAA;AGm1IJ;AHj1II;EAAY,cAAA;EAAgB,WAAA;EAAa,mBE9C7B;ACo4IhB;AHr1II;EAAM,kBAAA;EAAoB,MAAA;EAAQ,OAAA;EAAS,WAAA;EAAa,YAAA;AG41I5D;;AHx1IA;;8CAAA;AAUE;EAAuB,yBAAA;AGq1IzB;;AHp1IE;EAAqB,oCAAA;AGw1IvB;;AHv1IE;EAA2B,oCAAA;AG21I7B;;AHx1II;EAAuC,yBAAA;AG41I3C;;AH31II;EAAqC,oCAAA;AG+1IzC;;AHh2II;EAAuC,yBAAA;AGo2I3C;;AHn2II;EAAqC,oCAAA;AGu2IzC;;AHx2II;EAAuC,yBAAA;AG42I3C;;AH32II;EAAqC,oCAAA;AG+2IzC;;AHh3II;EAAuC,yBAAA;AGo3I3C;;AHn3II;EAAqC,oCAAA;AGu3IzC;;AHx3II;EAAuC,yBAAA;AG43I3C;;AH33II;EAAqC,oCAAA;AG+3IzC;;AHh4II;EAAuC,yBAAA;AGo4I3C;;AHn4II;EAAqC,oCAAA;AGu4IzC;;AHx4II;EAAuC,yBAAA;AG44I3C;;AH34II;EAAqC,oCAAA;AG+4IzC;;AHh5II;EAAuC,yBAAA;AGo5I3C;;AHn5II;EAAqC,oCAAA;AGu5IzC;;AHx5II;EAAuC,yBAAA;AG45I3C;;AH35II;EAAqC,oCAAA;AG+5IzC;;AHh6II;EAAuC,yBAAA;AGo6I3C;;AHn6II;EAAqC,oCAAA;AGu6IzC;;AHx6II;EAAuC,yBAAA;AG46I3C;;AH36II;EAAqC,oCAAA;AG+6IzC;;AH56IE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE1RY;EF2RZ,qBExSQ;EFySR,6BAAA;EACA,eAAA;EACA,yBA1BK;EA2BL,cChUI;EDiUJ,uMACE;AG86IN;AHz6II;EAAU,uBAAA;EAAuC,+GAAA;EAAoC,2BEzE5E;ACu/Ib;AH76II;EAAW,uBAAA;EAAwC,wBAAA;AGi7IvD;AHh7II;EAAU,aAAA;AGm7Id;AHl7II;EAAkB,yJAAA;AGq7ItB;AHn7II;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;EACA,YAAA;AGq7IN;;AHj7IE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE5TY;EF6TZ,qBE1UQ;EF2UR,yBAAA;EACA,eAAA;EACA,yBA3DM;EA4DN,cAzDY;EA0DZ,4JACE;AGm7IN;AH/6II;EAAU,yBAAA;EAAyC,+GAAA;EAAoC,2BAAA;AGo7I3F;AHn7II;EAAW,yBAAA;EAAyC,wBAAA;AGu7IxD;AHt7II;EAAU,aAAA;AGy7Id;AHx7II;EAAkB,yJAAA;AG27ItB;AHz7II;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;AG27IN;;AHv7IE,WAAA;AACA;EACE,aEpYK;EFqYL,qBErWQ;EFsWR,yBApFM;EAqFN,cAnFK;EAoFL,yBAAA;EACA,mBEzYK;ACm0JT;;AH5gJE;EAAuB,yBAAA;AGghJzB;;AH/gJE;EAAqB,oCAAA;AGmhJvB;;AHlhJE;EAA2B,oCAAA;AGshJ7B;;AHnhJI;EAAuC,yBAAA;AGuhJ3C;;AHthJI;EAAqC,oCAAA;AG0hJzC;;AH3hJI;EAAuC,yBAAA;AG+hJ3C;;AH9hJI;EAAqC,oCAAA;AGkiJzC;;AHniJI;EAAuC,yBAAA;AGuiJ3C;;AHtiJI;EAAqC,oCAAA;AG0iJzC;;AH3iJI;EAAuC,yBAAA;AG+iJ3C;;AH9iJI;EAAqC,oCAAA;AGkjJzC;;AHnjJI;EAAuC,yBAAA;AGujJ3C;;AHtjJI;EAAqC,oCAAA;AG0jJzC;;AH3jJI;EAAuC,yBAAA;AG+jJ3C;;AH9jJI;EAAqC,oCAAA;AGkkJzC;;AHnkJI;EAAuC,yBAAA;AGukJ3C;;AHtkJI;EAAqC,oCAAA;AG0kJzC;;AH3kJI;EAAuC,yBAAA;AG+kJ3C;;AH9kJI;EAAqC,oCAAA;AGklJzC;;AHnlJI;EAAuC,yBAAA;AGulJ3C;;AHtlJI;EAAqC,oCAAA;AG0lJzC;;AH3lJI;EAAuC,yBAAA;AG+lJ3C;;AH9lJI;EAAqC,oCAAA;AGkmJzC;;AHnmJI;EAAuC,yBAAA;AGumJ3C;;AHtmJI;EAAqC,oCAAA;AG0mJzC;;AHvmJE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE1RY;EF2RZ,qBExSQ;EFySR,6BAAA;EACA,eAAA;EACA,yBA1BK;EA2BL,cChUI;EDiUJ,uMACE;AGymJN;AHpmJI;EAAU,uBAAA;EAAuC,+GAAA;EAAoC,2BEzE5E;ACkrJb;AHxmJI;EAAW,uBAAA;EAAwC,wBAAA;AG4mJvD;AH3mJI;EAAU,aAAA;AG8mJd;AH7mJI;EAAkB,yJAAA;AGgnJtB;AH9mJI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;EACA,YAAA;AGgnJN;;AH5mJE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE5TY;EF6TZ,qBE1UQ;EF2UR,yBAAA;EACA,eAAA;EACA,yBA3DM;EA4DN,cAzDY;EA0DZ,4JACE;AG8mJN;AH1mJI;EAAU,yBAAA;EAAyC,+GAAA;EAAoC,2BAAA;AG+mJ3F;AH9mJI;EAAW,yBAAA;EAAyC,wBAAA;AGknJxD;AHjnJI;EAAU,aAAA;AGonJd;AHnnJI;EAAkB,yJAAA;AGsnJtB;AHpnJI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;AGsnJN;;AHlnJE,WAAA;AACA;EACE,aEpYK;EFqYL,qBErWQ;EFsWR,yBApFM;EAqFN,cAnFK;EAoFL,yBAAA;EACA,mBEzYK;AC8/JT;;AHvsJE;EAAuB,yBAAA;AG2sJzB;;AH1sJE;EAAqB,oCAAA;AG8sJvB;;AH7sJE;EAA2B,oCAAA;AGitJ7B;;AH9sJI;EAAuC,yBAAA;AGktJ3C;;AHjtJI;EAAqC,oCAAA;AGqtJzC;;AHttJI;EAAuC,yBAAA;AG0tJ3C;;AHztJI;EAAqC,oCAAA;AG6tJzC;;AH9tJI;EAAuC,yBAAA;AGkuJ3C;;AHjuJI;EAAqC,oCAAA;AGquJzC;;AHtuJI;EAAuC,yBAAA;AG0uJ3C;;AHzuJI;EAAqC,oCAAA;AG6uJzC;;AH9uJI;EAAuC,yBAAA;AGkvJ3C;;AHjvJI;EAAqC,oCAAA;AGqvJzC;;AHtvJI;EAAuC,yBAAA;AG0vJ3C;;AHzvJI;EAAqC,oCAAA;AG6vJzC;;AH9vJI;EAAuC,yBAAA;AGkwJ3C;;AHjwJI;EAAqC,oCAAA;AGqwJzC;;AHtwJI;EAAuC,yBAAA;AG0wJ3C;;AHzwJI;EAAqC,oCAAA;AG6wJzC;;AH9wJI;EAAuC,yBAAA;AGkxJ3C;;AHjxJI;EAAqC,oCAAA;AGqxJzC;;AHtxJI;EAAuC,yBAAA;AG0xJ3C;;AHzxJI;EAAqC,oCAAA;AG6xJzC;;AH9xJI;EAAuC,yBAAA;AGkyJ3C;;AHjyJI;EAAqC,oCAAA;AGqyJzC;;AHlyJE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE1RY;EF2RZ,qBExSQ;EFySR,6BAAA;EACA,eAAA;EACA,yBA1BK;EA2BL,cChUI;EDiUJ,uMACE;AGoyJN;AH/xJI;EAAU,uBAAA;EAAuC,+GAAA;EAAoC,2BEzE5E;AC62Jb;AHnyJI;EAAW,uBAAA;EAAwC,wBAAA;AGuyJvD;AHtyJI;EAAU,aAAA;AGyyJd;AHxyJI;EAAkB,yJAAA;AG2yJtB;AHzyJI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;EACA,YAAA;AG2yJN;;AHvyJE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE5TY;EF6TZ,qBE1UQ;EF2UR,yBAAA;EACA,eAAA;EACA,yBA3DM;EA4DN,cAzDY;EA0DZ,4JACE;AGyyJN;AHryJI;EAAU,yBAAA;EAAyC,+GAAA;EAAoC,2BAAA;AG0yJ3F;AHzyJI;EAAW,yBAAA;EAAyC,wBAAA;AG6yJxD;AH5yJI;EAAU,aAAA;AG+yJd;AH9yJI;EAAkB,yJAAA;AGizJtB;AH/yJI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;AGizJN;;AH7yJE,WAAA;AACA;EACE,aEpYK;EFqYL,qBErWQ;EFsWR,yBApFM;EAqFN,cAnFK;EAoFL,yBAAA;EACA,mBEzYK;ACyrKT;;AHl4JE;EAAuB,yBAAA;AGs4JzB;;AHr4JE;EAAqB,oCAAA;AGy4JvB;;AHx4JE;EAA2B,oCAAA;AG44J7B;;AHz4JI;EAAuC,yBAAA;AG64J3C;;AH54JI;EAAqC,oCAAA;AGg5JzC;;AHj5JI;EAAuC,yBAAA;AGq5J3C;;AHp5JI;EAAqC,oCAAA;AGw5JzC;;AHz5JI;EAAuC,yBAAA;AG65J3C;;AH55JI;EAAqC,oCAAA;AGg6JzC;;AHj6JI;EAAuC,yBAAA;AGq6J3C;;AHp6JI;EAAqC,oCAAA;AGw6JzC;;AHz6JI;EAAuC,yBAAA;AG66J3C;;AH56JI;EAAqC,oCAAA;AGg7JzC;;AHj7JI;EAAuC,yBAAA;AGq7J3C;;AHp7JI;EAAqC,oCAAA;AGw7JzC;;AHz7JI;EAAuC,yBAAA;AG67J3C;;AH57JI;EAAqC,oCAAA;AGg8JzC;;AHj8JI;EAAuC,yBAAA;AGq8J3C;;AHp8JI;EAAqC,oCAAA;AGw8JzC;;AHz8JI;EAAuC,yBAAA;AG68J3C;;AH58JI;EAAqC,oCAAA;AGg9JzC;;AHj9JI;EAAuC,yBAAA;AGq9J3C;;AHp9JI;EAAqC,oCAAA;AGw9JzC;;AHz9JI;EAAuC,yBAAA;AG69J3C;;AH59JI;EAAqC,oCAAA;AGg+JzC;;AH79JE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE1RY;EF2RZ,qBExSQ;EFySR,6BAAA;EACA,eAAA;EACA,yBA1BK;EA2BL,cChUI;EDiUJ,uMACE;AG+9JN;AH19JI;EAAU,uBAAA;EAAuC,+GAAA;EAAoC,2BEzE5E;ACwiKb;AH99JI;EAAW,uBAAA;EAAwC,wBAAA;AGk+JvD;AHj+JI;EAAU,aAAA;AGo+Jd;AHn+JI;EAAkB,yJAAA;AGs+JtB;AHp+JI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;EACA,YAAA;AGs+JN;;AHl+JE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE5TY;EF6TZ,qBE1UQ;EF2UR,yBAAA;EACA,eAAA;EACA,yBA3DM;EA4DN,cAzDY;EA0DZ,4JACE;AGo+JN;AHh+JI;EAAU,yBAAA;EAAyC,+GAAA;EAAoC,2BAAA;AGq+J3F;AHp+JI;EAAW,yBAAA;EAAyC,wBAAA;AGw+JxD;AHv+JI;EAAU,aAAA;AG0+Jd;AHz+JI;EAAkB,yJAAA;AG4+JtB;AH1+JI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;AG4+JN;;AHx+JE,WAAA;AACA;EACE,aEpYK;EFqYL,qBErWQ;EFsWR,yBApFM;EAqFN,cAnFK;EAoFL,yBAAA;EACA,mBEzYK;ACo3KT;;AH7jKE;EAAuB,yBAAA;AGikKzB;;AHhkKE;EAAqB,oCAAA;AGokKvB;;AHnkKE;EAA2B,oCAAA;AGukK7B;;AHpkKI;EAAuC,yBAAA;AGwkK3C;;AHvkKI;EAAqC,oCAAA;AG2kKzC;;AH5kKI;EAAuC,yBAAA;AGglK3C;;AH/kKI;EAAqC,oCAAA;AGmlKzC;;AHplKI;EAAuC,yBAAA;AGwlK3C;;AHvlKI;EAAqC,oCAAA;AG2lKzC;;AH5lKI;EAAuC,yBAAA;AGgmK3C;;AH/lKI;EAAqC,oCAAA;AGmmKzC;;AHpmKI;EAAuC,yBAAA;AGwmK3C;;AHvmKI;EAAqC,oCAAA;AG2mKzC;;AH5mKI;EAAuC,yBAAA;AGgnK3C;;AH/mKI;EAAqC,oCAAA;AGmnKzC;;AHpnKI;EAAuC,yBAAA;AGwnK3C;;AHvnKI;EAAqC,oCAAA;AG2nKzC;;AH5nKI;EAAuC,yBAAA;AGgoK3C;;AH/nKI;EAAqC,oCAAA;AGmoKzC;;AHpoKI;EAAuC,yBAAA;AGwoK3C;;AHvoKI;EAAqC,oCAAA;AG2oKzC;;AH5oKI;EAAuC,yBAAA;AGgpK3C;;AH/oKI;EAAqC,oCAAA;AGmpKzC;;AHppKI;EAAuC,yBAAA;AGwpK3C;;AHvpKI;EAAqC,oCAAA;AG2pKzC;;AHxpKE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE1RY;EF2RZ,qBExSQ;EFySR,6BAAA;EACA,eAAA;EACA,yBA1BK;EA2BL,cChUI;EDiUJ,uMACE;AG0pKN;AHrpKI;EAAU,uBAAA;EAAuC,+GAAA;EAAoC,2BEzE5E;ACmuKb;AHzpKI;EAAW,uBAAA;EAAwC,wBAAA;AG6pKvD;AH5pKI;EAAU,aAAA;AG+pKd;AH9pKI;EAAkB,yJAAA;AGiqKtB;AH/pKI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;EACA,YAAA;AGiqKN;;AH7pKE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE5TY;EF6TZ,qBE1UQ;EF2UR,yBAAA;EACA,eAAA;EACA,yBA3DM;EA4DN,cAzDY;EA0DZ,4JACE;AG+pKN;AH3pKI;EAAU,yBAAA;EAAyC,+GAAA;EAAoC,2BAAA;AGgqK3F;AH/pKI;EAAW,yBAAA;EAAyC,wBAAA;AGmqKxD;AHlqKI;EAAU,aAAA;AGqqKd;AHpqKI;EAAkB,yJAAA;AGuqKtB;AHrqKI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;AGuqKN;;AHnqKE,WAAA;AACA;EACE,aEpYK;EFqYL,qBErWQ;EFsWR,yBApFM;EAqFN,cAnFK;EAoFL,yBAAA;EACA,mBEzYK;AC+iLT;;AHxvKE;EAAuB,yBAAA;AG4vKzB;;AH3vKE;EAAqB,oCAAA;AG+vKvB;;AH9vKE;EAA2B,oCAAA;AGkwK7B;;AH/vKI;EAAuC,yBAAA;AGmwK3C;;AHlwKI;EAAqC,oCAAA;AGswKzC;;AHvwKI;EAAuC,yBAAA;AG2wK3C;;AH1wKI;EAAqC,oCAAA;AG8wKzC;;AH/wKI;EAAuC,yBAAA;AGmxK3C;;AHlxKI;EAAqC,oCAAA;AGsxKzC;;AHvxKI;EAAuC,yBAAA;AG2xK3C;;AH1xKI;EAAqC,oCAAA;AG8xKzC;;AH/xKI;EAAuC,yBAAA;AGmyK3C;;AHlyKI;EAAqC,oCAAA;AGsyKzC;;AHvyKI;EAAuC,yBAAA;AG2yK3C;;AH1yKI;EAAqC,oCAAA;AG8yKzC;;AH/yKI;EAAuC,yBAAA;AGmzK3C;;AHlzKI;EAAqC,oCAAA;AGszKzC;;AHvzKI;EAAuC,yBAAA;AG2zK3C;;AH1zKI;EAAqC,oCAAA;AG8zKzC;;AH/zKI;EAAuC,yBAAA;AGm0K3C;;AHl0KI;EAAqC,oCAAA;AGs0KzC;;AHv0KI;EAAuC,yBAAA;AG20K3C;;AH10KI;EAAqC,oCAAA;AG80KzC;;AH/0KI;EAAuC,yBAAA;AGm1K3C;;AHl1KI;EAAqC,oCAAA;AGs1KzC;;AHn1KE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE1RY;EF2RZ,qBExSQ;EFySR,6BAAA;EACA,eAAA;EACA,yBA1BK;EA2BL,cChUI;EDiUJ,uMACE;AGq1KN;AHh1KI;EAAU,uBAAA;EAAuC,+GAAA;EAAoC,2BEzE5E;AC85Kb;AHp1KI;EAAW,uBAAA;EAAwC,wBAAA;AGw1KvD;AHv1KI;EAAU,aAAA;AG01Kd;AHz1KI;EAAkB,yJAAA;AG41KtB;AH11KI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;EACA,YAAA;AG41KN;;AHx1KE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE5TY;EF6TZ,qBE1UQ;EF2UR,yBAAA;EACA,eAAA;EACA,yBA3DM;EA4DN,cAzDY;EA0DZ,4JACE;AG01KN;AHt1KI;EAAU,yBAAA;EAAyC,+GAAA;EAAoC,2BAAA;AG21K3F;AH11KI;EAAW,yBAAA;EAAyC,wBAAA;AG81KxD;AH71KI;EAAU,aAAA;AGg2Kd;AH/1KI;EAAkB,yJAAA;AGk2KtB;AHh2KI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;AGk2KN;;AH91KE,WAAA;AACA;EACE,aEpYK;EFqYL,qBErWQ;EFsWR,yBApFM;EAqFN,cAnFK;EAoFL,yBAAA;EACA,mBEzYK;AC0uLT;;AHn7KE;EAAuB,yBAAA;AGu7KzB;;AHt7KE;EAAqB,oCAAA;AG07KvB;;AHz7KE;EAA2B,oCAAA;AG67K7B;;AH17KI;EAAuC,yBAAA;AG87K3C;;AH77KI;EAAqC,oCAAA;AGi8KzC;;AHl8KI;EAAuC,yBAAA;AGs8K3C;;AHr8KI;EAAqC,oCAAA;AGy8KzC;;AH18KI;EAAuC,yBAAA;AG88K3C;;AH78KI;EAAqC,oCAAA;AGi9KzC;;AHl9KI;EAAuC,yBAAA;AGs9K3C;;AHr9KI;EAAqC,oCAAA;AGy9KzC;;AH19KI;EAAuC,yBAAA;AG89K3C;;AH79KI;EAAqC,oCAAA;AGi+KzC;;AHl+KI;EAAuC,yBAAA;AGs+K3C;;AHr+KI;EAAqC,oCAAA;AGy+KzC;;AH1+KI;EAAuC,yBAAA;AG8+K3C;;AH7+KI;EAAqC,oCAAA;AGi/KzC;;AHl/KI;EAAuC,yBAAA;AGs/K3C;;AHr/KI;EAAqC,oCAAA;AGy/KzC;;AH1/KI;EAAuC,yBAAA;AG8/K3C;;AH7/KI;EAAqC,oCAAA;AGigLzC;;AHlgLI;EAAuC,yBAAA;AGsgL3C;;AHrgLI;EAAqC,oCAAA;AGygLzC;;AH1gLI;EAAuC,yBAAA;AG8gL3C;;AH7gLI;EAAqC,oCAAA;AGihLzC;;AH9gLE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE1RY;EF2RZ,qBExSQ;EFySR,6BAAA;EACA,eAAA;EACA,yBA1BK;EA2BL,cChUI;EDiUJ,uMACE;AGghLN;AH3gLI;EAAU,uBAAA;EAAuC,+GAAA;EAAoC,2BEzE5E;ACylLb;AH/gLI;EAAW,uBAAA;EAAwC,wBAAA;AGmhLvD;AHlhLI;EAAU,aAAA;AGqhLd;AHphLI;EAAkB,yJAAA;AGuhLtB;AHrhLI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;EACA,YAAA;AGuhLN;;AHnhLE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE5TY;EF6TZ,qBE1UQ;EF2UR,yBAAA;EACA,eAAA;EACA,yBA3DM;EA4DN,cAzDY;EA0DZ,4JACE;AGqhLN;AHjhLI;EAAU,yBAAA;EAAyC,+GAAA;EAAoC,2BAAA;AGshL3F;AHrhLI;EAAW,yBAAA;EAAyC,wBAAA;AGyhLxD;AHxhLI;EAAU,aAAA;AG2hLd;AH1hLI;EAAkB,yJAAA;AG6hLtB;AH3hLI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;AG6hLN;;AHzhLE,WAAA;AACA;EACE,aEpYK;EFqYL,qBErWQ;EFsWR,yBApFM;EAqFN,cAnFK;EAoFL,yBAAA;EACA,mBEzYK;ACq6LT;;AH9mLE;EAAuB,yBAAA;AGknLzB;;AHjnLE;EAAqB,oCAAA;AGqnLvB;;AHpnLE;EAA2B,oCAAA;AGwnL7B;;AHrnLI;EAAuC,yBAAA;AGynL3C;;AHxnLI;EAAqC,oCAAA;AG4nLzC;;AH7nLI;EAAuC,yBAAA;AGioL3C;;AHhoLI;EAAqC,oCAAA;AGooLzC;;AHroLI;EAAuC,yBAAA;AGyoL3C;;AHxoLI;EAAqC,oCAAA;AG4oLzC;;AH7oLI;EAAuC,yBAAA;AGipL3C;;AHhpLI;EAAqC,oCAAA;AGopLzC;;AHrpLI;EAAuC,yBAAA;AGypL3C;;AHxpLI;EAAqC,oCAAA;AG4pLzC;;AH7pLI;EAAuC,yBAAA;AGiqL3C;;AHhqLI;EAAqC,oCAAA;AGoqLzC;;AHrqLI;EAAuC,yBAAA;AGyqL3C;;AHxqLI;EAAqC,oCAAA;AG4qLzC;;AH7qLI;EAAuC,yBAAA;AGirL3C;;AHhrLI;EAAqC,oCAAA;AGorLzC;;AHrrLI;EAAuC,yBAAA;AGyrL3C;;AHxrLI;EAAqC,oCAAA;AG4rLzC;;AH7rLI;EAAuC,yBAAA;AGisL3C;;AHhsLI;EAAqC,oCAAA;AGosLzC;;AHrsLI;EAAuC,yBAAA;AGysL3C;;AHxsLI;EAAqC,oCAAA;AG4sLzC;;AHzsLE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE1RY;EF2RZ,qBExSQ;EFySR,6BAAA;EACA,eAAA;EACA,yBA1BK;EA2BL,cChUI;EDiUJ,uMACE;AG2sLN;AHtsLI;EAAU,uBAAA;EAAuC,+GAAA;EAAoC,2BEzE5E;ACoxLb;AH1sLI;EAAW,uBAAA;EAAwC,wBAAA;AG8sLvD;AH7sLI;EAAU,aAAA;AGgtLd;AH/sLI;EAAkB,yJAAA;AGktLtB;AHhtLI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;EACA,YAAA;AGktLN;;AH9sLE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE5TY;EF6TZ,qBE1UQ;EF2UR,yBAAA;EACA,eAAA;EACA,yBA3DM;EA4DN,cAzDY;EA0DZ,4JACE;AGgtLN;AH5sLI;EAAU,yBAAA;EAAyC,+GAAA;EAAoC,2BAAA;AGitL3F;AHhtLI;EAAW,yBAAA;EAAyC,wBAAA;AGotLxD;AHntLI;EAAU,aAAA;AGstLd;AHrtLI;EAAkB,yJAAA;AGwtLtB;AHttLI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;AGwtLN;;AHptLE,WAAA;AACA;EACE,aEpYK;EFqYL,qBErWQ;EFsWR,yBApFM;EAqFN,cAnFK;EAoFL,yBAAA;EACA,mBEzYK;ACgmMT;;AHzyLE;EAAuB,yBAAA;AG6yLzB;;AH5yLE;EAAqB,oCAAA;AGgzLvB;;AH/yLE;EAA2B,oCAAA;AGmzL7B;;AHhzLI;EAAuC,yBAAA;AGozL3C;;AHnzLI;EAAqC,oCAAA;AGuzLzC;;AHxzLI;EAAuC,yBAAA;AG4zL3C;;AH3zLI;EAAqC,oCAAA;AG+zLzC;;AHh0LI;EAAuC,yBAAA;AGo0L3C;;AHn0LI;EAAqC,oCAAA;AGu0LzC;;AHx0LI;EAAuC,yBAAA;AG40L3C;;AH30LI;EAAqC,oCAAA;AG+0LzC;;AHh1LI;EAAuC,yBAAA;AGo1L3C;;AHn1LI;EAAqC,oCAAA;AGu1LzC;;AHx1LI;EAAuC,yBAAA;AG41L3C;;AH31LI;EAAqC,oCAAA;AG+1LzC;;AHh2LI;EAAuC,yBAAA;AGo2L3C;;AHn2LI;EAAqC,oCAAA;AGu2LzC;;AHx2LI;EAAuC,yBAAA;AG42L3C;;AH32LI;EAAqC,oCAAA;AG+2LzC;;AHh3LI;EAAuC,yBAAA;AGo3L3C;;AHn3LI;EAAqC,oCAAA;AGu3LzC;;AHx3LI;EAAuC,yBAAA;AG43L3C;;AH33LI;EAAqC,oCAAA;AG+3LzC;;AHh4LI;EAAuC,yBAAA;AGo4L3C;;AHn4LI;EAAqC,oCAAA;AGu4LzC;;AHp4LE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE1RY;EF2RZ,qBExSQ;EFySR,6BAAA;EACA,eAAA;EACA,yBA1BK;EA2BL,cChUI;EDiUJ,uMACE;AGs4LN;AHj4LI;EAAU,uBAAA;EAAuC,+GAAA;EAAoC,2BEzE5E;AC+8Lb;AHr4LI;EAAW,uBAAA;EAAwC,wBAAA;AGy4LvD;AHx4LI;EAAU,aAAA;AG24Ld;AH14LI;EAAkB,yJAAA;AG64LtB;AH34LI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;EACA,YAAA;AG64LN;;AHz4LE,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE5TY;EF6TZ,qBE1UQ;EF2UR,yBAAA;EACA,eAAA;EACA,yBA3DM;EA4DN,cAzDY;EA0DZ,4JACE;AG24LN;AHv4LI;EAAU,yBAAA;EAAyC,+GAAA;EAAoC,2BAAA;AG44L3F;AH34LI;EAAW,yBAAA;EAAyC,wBAAA;AG+4LxD;AH94LI;EAAU,aAAA;AGi5Ld;AHh5LI;EAAkB,yJAAA;AGm5LtB;AHj5LI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;AGm5LN;;AH/4LE,WAAA;AACA;EACE,aEpYK;EFqYL,qBErWQ;EFsWR,yBApFM;EAqFN,cAnFK;EAoFL,yBAAA;EACA,mBEzYK;AC2xMT;;AHp+LE;EAAuB,yBAAA;AGw+LzB;;AHv+LE;EAAqB,oCAAA;AG2+LvB;;AH1+LE;EAA2B,oCAAA;AG8+L7B;;AH3+LI;EAAuC,yBAAA;AG++L3C;;AH9+LI;EAAqC,oCAAA;AGk/LzC;;AHn/LI;EAAuC,yBAAA;AGu/L3C;;AHt/LI;EAAqC,oCAAA;AG0/LzC;;AH3/LI;EAAuC,yBAAA;AG+/L3C;;AH9/LI;EAAqC,oCAAA;AGkgMzC;;AHngMI;EAAuC,yBAAA;AGugM3C;;AHtgMI;EAAqC,oCAAA;AG0gMzC;;AH3gMI;EAAuC,yBAAA;AG+gM3C;;AH9gMI;EAAqC,oCAAA;AGkhMzC;;AHnhMI;EAAuC,yBAAA;AGuhM3C;;AHthMI;EAAqC,oCAAA;AG0hMzC;;AH3hMI;EAAuC,yBAAA;AG+hM3C;;AH9hMI;EAAqC,oCAAA;AGkiMzC;;AHniMI;EAAuC,yBAAA;AGuiM3C;;AHtiMI;EAAqC,oCAAA;AG0iMzC;;AH3iMI;EAAuC,yBAAA;AG+iM3C;;AH9iMI;EAAqC,oCAAA;AGkjMzC;;AHnjMI;EAAuC,yBAAA;AGujM3C;;AHtjMI;EAAqC,oCAAA;AG0jMzC;;AH3jMI;EAAuC,yBAAA;AG+jM3C;;AH9jMI;EAAqC,oCAAA;AGkkMzC;;AH/jME,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE1RY;EF2RZ,qBExSQ;EFySR,6BAAA;EACA,eAAA;EACA,yBA1BK;EA2BL,cChUI;EDiUJ,uMACE;AGikMN;AH5jMI;EAAU,uBAAA;EAAuC,+GAAA;EAAoC,2BEzE5E;AC0oMb;AHhkMI;EAAW,uBAAA;EAAwC,wBAAA;AGokMvD;AHnkMI;EAAU,aAAA;AGskMd;AHrkMI;EAAkB,yJAAA;AGwkMtB;AHtkMI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;EACA,YAAA;AGwkMN;;AHpkME,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE5TY;EF6TZ,qBE1UQ;EF2UR,yBAAA;EACA,eAAA;EACA,yBA3DM;EA4DN,cAzDY;EA0DZ,4JACE;AGskMN;AHlkMI;EAAU,yBAAA;EAAyC,+GAAA;EAAoC,2BAAA;AGukM3F;AHtkMI;EAAW,yBAAA;EAAyC,wBAAA;AG0kMxD;AHzkMI;EAAU,aAAA;AG4kMd;AH3kMI;EAAkB,yJAAA;AG8kMtB;AH5kMI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;AG8kMN;;AH1kME,WAAA;AACA;EACE,aEpYK;EFqYL,qBErWQ;EFsWR,yBApFM;EAqFN,cAnFK;EAoFL,yBAAA;EACA,mBEzYK;ACs9MT;;AH/pME;EAAuB,yBAAA;AGmqMzB;;AHlqME;EAAqB,oCAAA;AGsqMvB;;AHrqME;EAA2B,oCAAA;AGyqM7B;;AHtqMI;EAAuC,yBAAA;AG0qM3C;;AHzqMI;EAAqC,oCAAA;AG6qMzC;;AH9qMI;EAAuC,yBAAA;AGkrM3C;;AHjrMI;EAAqC,oCAAA;AGqrMzC;;AHtrMI;EAAuC,yBAAA;AG0rM3C;;AHzrMI;EAAqC,oCAAA;AG6rMzC;;AH9rMI;EAAuC,yBAAA;AGksM3C;;AHjsMI;EAAqC,oCAAA;AGqsMzC;;AHtsMI;EAAuC,yBAAA;AG0sM3C;;AHzsMI;EAAqC,oCAAA;AG6sMzC;;AH9sMI;EAAuC,yBAAA;AGktM3C;;AHjtMI;EAAqC,oCAAA;AGqtMzC;;AHttMI;EAAuC,yBAAA;AG0tM3C;;AHztMI;EAAqC,oCAAA;AG6tMzC;;AH9tMI;EAAuC,yBAAA;AGkuM3C;;AHjuMI;EAAqC,oCAAA;AGquMzC;;AHtuMI;EAAuC,yBAAA;AG0uM3C;;AHzuMI;EAAqC,oCAAA;AG6uMzC;;AH9uMI;EAAuC,yBAAA;AGkvM3C;;AHjvMI;EAAqC,oCAAA;AGqvMzC;;AHtvMI;EAAuC,yBAAA;AG0vM3C;;AHzvMI;EAAqC,oCAAA;AG6vMzC;;AH1vME,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE1RY;EF2RZ,qBExSQ;EFySR,6BAAA;EACA,eAAA;EACA,yBA1BK;EA2BL,cChUI;EDiUJ,uMACE;AG4vMN;AHvvMI;EAAU,uBAAA;EAAuC,+GAAA;EAAoC,2BEzE5E;ACq0Mb;AH3vMI;EAAW,uBAAA;EAAwC,wBAAA;AG+vMvD;AH9vMI;EAAU,aAAA;AGiwMd;AHhwMI;EAAkB,yJAAA;AGmwMtB;AHjwMI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;EACA,YAAA;AGmwMN;;AH/vME,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE5TY;EF6TZ,qBE1UQ;EF2UR,yBAAA;EACA,eAAA;EACA,yBA3DM;EA4DN,cAzDY;EA0DZ,4JACE;AGiwMN;AH7vMI;EAAU,yBAAA;EAAyC,+GAAA;EAAoC,2BAAA;AGkwM3F;AHjwMI;EAAW,yBAAA;EAAyC,wBAAA;AGqwMxD;AHpwMI;EAAU,aAAA;AGuwMd;AHtwMI;EAAkB,yJAAA;AGywMtB;AHvwMI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;AGywMN;;AHrwME,WAAA;AACA;EACE,aEpYK;EFqYL,qBErWQ;EFsWR,yBApFM;EAqFN,cAnFK;EAoFL,yBAAA;EACA,mBEzYK;ACipNT;;AH11ME;EAAuB,yBAAA;AG81MzB;;AH71ME;EAAqB,oCAAA;AGi2MvB;;AHh2ME;EAA2B,oCAAA;AGo2M7B;;AHj2MI;EAAuC,yBAAA;AGq2M3C;;AHp2MI;EAAqC,oCAAA;AGw2MzC;;AHz2MI;EAAuC,yBAAA;AG62M3C;;AH52MI;EAAqC,oCAAA;AGg3MzC;;AHj3MI;EAAuC,yBAAA;AGq3M3C;;AHp3MI;EAAqC,oCAAA;AGw3MzC;;AHz3MI;EAAuC,yBAAA;AG63M3C;;AH53MI;EAAqC,oCAAA;AGg4MzC;;AHj4MI;EAAuC,yBAAA;AGq4M3C;;AHp4MI;EAAqC,oCAAA;AGw4MzC;;AHz4MI;EAAuC,yBAAA;AG64M3C;;AH54MI;EAAqC,oCAAA;AGg5MzC;;AHj5MI;EAAuC,yBAAA;AGq5M3C;;AHp5MI;EAAqC,oCAAA;AGw5MzC;;AHz5MI;EAAuC,yBAAA;AG65M3C;;AH55MI;EAAqC,oCAAA;AGg6MzC;;AHj6MI;EAAuC,yBAAA;AGq6M3C;;AHp6MI;EAAqC,oCAAA;AGw6MzC;;AHz6MI;EAAuC,yBAAA;AG66M3C;;AH56MI;EAAqC,oCAAA;AGg7MzC;;AHj7MI;EAAuC,yBAAA;AGq7M3C;;AHp7MI;EAAqC,oCAAA;AGw7MzC;;AHr7ME,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE1RY;EF2RZ,qBExSQ;EFySR,6BAAA;EACA,eAAA;EACA,yBA1BK;EA2BL,cChUI;EDiUJ,uMACE;AGu7MN;AHl7MI;EAAU,uBAAA;EAAuC,+GAAA;EAAoC,2BEzE5E;ACggNb;AHt7MI;EAAW,uBAAA;EAAwC,wBAAA;AG07MvD;AHz7MI;EAAU,aAAA;AG47Md;AH37MI;EAAkB,yJAAA;AG87MtB;AH57MI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;EACA,YAAA;AG87MN;;AH17ME,iBAAA;AACA;EACE,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,oBAAA;EACA,gBE5TY;EF6TZ,qBE1UQ;EF2UR,yBAAA;EACA,eAAA;EACA,yBA3DM;EA4DN,cAzDY;EA0DZ,4JACE;AG47MN;AHx7MI;EAAU,yBAAA;EAAyC,+GAAA;EAAoC,2BAAA;AG67M3F;AH57MI;EAAW,yBAAA;EAAyC,wBAAA;AGg8MxD;AH/7MI;EAAU,aAAA;AGk8Md;AHj8MI;EAAkB,yJAAA;AGo8MtB;AHl8MI;EACE,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,gBAAA;EACA,eAAA;AGo8MN;;AHh8ME,WAAA;AACA;EACE,aEpYK;EFqYL,qBErWQ;EFsWR,yBApFM;EAqFN,cAnFK;EAoFL,yBAAA;EACA,mBEzYK;AC40NT;;AH/7MA,0BAAA;AACA;EACE,mDAAA;EACA,8BAAA;EACA,iCAAA;AGk8MF;;AH/7MA;EACE,+BAAA;EACA,0BAAA;EACA,8BAAA;AGk8MF;;AH/7MA;;8CAAA;AAGA;EACE,gCEpRQ;EFqRR,qCAAA;EACA,qBEhYU;EFiYV,eEhNa;EFiNb,+GAAA;AGk8MF;;AH/7MA;EACE,uGAAA;AGk8MF;AHj8ME;EAAU,gHE5JG;EF4JwB,2BE7J1B;ACkmNb;;AHl8MA;EACE,mCElSW;EFmSX,qCAAA;AGq8MF;;AHl8MA;;8CAAA;AAGA;EAAc,mBAAA;AGs8Md;;AHp8MA;EACE,cAAA;EACA,sBEzOoB;EF0OpB,mBEzOgB;EF0OhB,gBE3Yc;EF4Yd,wBE3SW;ACkvNb;;AHh7MA;EAnBE,WAAA;EACA,cExPa;EFyPb,oBAAA;EACA,mCEvTW;EFwTX,qCAAA;EACA,sBEnaU;EFoaV,uBEtTU;EFuTV,+JAAA;AGu8MF;AHr8ME;EAAU,aAAA;EAAe,4BAAA;AGy8M3B;AHx8ME;EAAkB,oDAAA;AG28MpB;AH18ME;EAAiB,wBEzTN;ACswNb;AH78ME;EAAiB,wBEzTN;ACswNb;AH38ME;EACE,YAAA;EACA,mBAAA;AG68MJ;;AHx8MA;EApBE,WAAA;EACA,YEvPgB;EFwPhB,oBAAA;EACA,mCEvTW;EFwTX,qCAAA;EACA,sBEnaU;EFoaV,uBEtTU;EFuTV,+JAAA;AGg+MF;AH99ME;EAAU,aAAA;EAAe,4BAAA;AGk+M3B;AHj+ME;EAAkB,oDAAA;AGo+MpB;AHn+ME;EAAiB,wBEzTN;AC+xNb;AHt+ME;EAAiB,wBEzTN;AC+xNb;AHp+ME;EACE,YAAA;EACA,mBAAA;AGs+MJ;AHj+MA;EAAmD,mBAAA;AGo+MnD;;AHn+MA;EArBE,WAAA;EACA,eEtPgB;EFuPhB,oBAAA;EACA,mCEvTW;EFwTX,qCAAA;EACA,sBEnaU;EFoaV,uBEtTU;EFuTV,+JAAA;AG4/MF;AH1/ME;EAAU,aAAA;EAAe,4BAAA;AG8/M3B;AH7/ME;EAAkB,oDAAA;AGggNpB;AH//ME;EAAiB,wBEzTN;AC2zNb;AHlgNE;EAAiB,wBEzTN;AC2zNb;AHhgNE;EACE,YAAA;EACA,mBAAA;AGkgNJ;AH5/MA;EAAmD,eAAA;AG+/MnD;;AH7/MA;EAvBE,WAAA;EACA,eEtPgB;EFuPhB,oBAAA;EACA,mCEvTW;EFwTX,qCAAA;EACA,sBEnaU;EFoaV,uBEtTU;EFuTV,+JAAA;AGwhNF;AHthNE;EAAU,aAAA;EAA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","file":"main.css"} \ No newline at end of file diff --git a/rss/css/main.scss b/rss/css/main.scss new file mode 100644 index 0000000..bdf2dbc --- /dev/null +++ b/rss/css/main.scss @@ -0,0 +1,1082 @@ +/* main.scss (drop-in) + VOR Core (base + utilities + components) + - No patterns/presets here (those belong in template/components later) + - Token-driven (variables.scss is the contract) +*/ +@use "sass:math"; +@use "sass:map"; +@use "sass:color"; +@use "./palette" as *; +@use "./variables" as *; + +/* -------------------------------------------- + Base reset +-------------------------------------------- */ +*, +*::before, +*::after { box-sizing: border-box; } + +html { + font-family: $font-family-sans; + line-height: $line-height-base; + -webkit-text-size-adjust: 100%; + -moz-tab-size: 4; + tab-size: 4; + scroll-behavior: smooth; +} + +body { + margin: 0; + font-size: map.get($font-sizes, "body"); + font-weight: $weight-normal; + color: $text-main; + background-color: $bg-app; + transition: background-color $duration-base $standard, color $duration-base $standard; +} + +/* Media defaults */ +img, svg, video, canvas { display: block; max-width: 100%; height: auto; } + +/* Links */ +a { color: inherit; } +a:hover { text-decoration: none; } + +/* Accessible focus (default; components can override) */ +:focus-visible { outline: none; } + +/* -------------------------------------------- + Token helpers +-------------------------------------------- */ +.bg-app { background-color: $bg-app !important; } +.bg-surface { background-color: $bg-surface !important; } +.bg-card { background-color: $bg-card !important; } + +.text-main { color: $text-main !important; } +.text-muted { color: $text-muted !important; } +.text-light { color: $text-light !important; } +.text-inverse { color: $text-inverse !important; } + +/* -------------------------------------------- + Containers / Grid (gutter via CSS vars) +-------------------------------------------- */ +:root { --gutter-x: #{$grid-gutter-width}; --gutter-y: 0; } + +.container, +.container-fluid { + width: 100%; + padding-right: math.div($grid-gutter-width, 2); + padding-left: math.div($grid-gutter-width, 2); + margin-right: auto; + margin-left: auto; +} + +@each $br-name, $br-value in $breakpoints { + @if $br-name != "xs" { + @media (min-width: $br-value) { + .container { + max-width: map.get($container-max-widths, $br-name); + } + } + } +} + +.row { + display: flex; + flex-wrap: wrap; + + /* row controls gutters */ + --gutter-x: #{$grid-gutter-width}; + --gutter-y: 0; + + margin-top: calc(var(--gutter-y) * -1); + margin-right: calc(var(--gutter-x) / -2); + margin-left: calc(var(--gutter-x) / -2); + + & > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); + margin-top: var(--gutter-y); + } +} + +.row-wrap { + display: flex; + align-items: center; + justify-content: space-between; + gap: 14px; + flex-wrap: wrap; +} + +/* gutter utilities */ +.g-0 { --gutter-x: 0; --gutter-y: 0; } +.gx-0 { --gutter-x: 0; } +.gy-0 { --gutter-y: 0; } + +/* IMPORTANT: no @extend across media queries */ +@mixin col-base() { + width: 100%; + padding-right: calc(var(--gutter-x) / 2); + padding-left: calc(var(--gutter-x) / 2); +} + +@each $br-name, $br-value in $breakpoints { + @media (min-width: $br-value) { + $infix: if($br-name == "xs", "", "-#{$br-name}"); + + @for $i from 1 through $grid-columns { + .col#{$infix}-#{$i} { + @include col-base(); + flex: 0 0 auto; + width: percentage(math.div($i, $grid-columns)); + } + } + + .col#{$infix} { + @include col-base(); + flex: 1 0 0%; + } + + .col#{$infix}-auto { + @include col-base(); + flex: 0 0 auto; + width: auto; + } + } +} + +/* -------------------------------------------- + Display / Flex utilities +-------------------------------------------- */ +@each $br-name, $br-value in $breakpoints { + @media (min-width: $br-value) { + $infix: if($br-name == "xs", "", "-#{$br-name}"); + + @each $prop in $display-values { + .d#{$infix}-#{$prop} { display: $prop !important; } + } + + @each $key, $val in $justify-content { + .justify#{$infix}-#{$key} { justify-content: $val !important; } + } + + @each $key, $val in $align-items { + .align#{$infix}-#{$key} { align-items: $val !important; } + } + + @each $dir in $flex-directions { + .flex#{$infix}-#{$dir} { flex-direction: $dir !important; } + } + } +} + +/* Convenience */ +.flex-column { flex-direction: column !important; } +.mt-auto { margin-top: auto !important; } +.min-w-0 { min-width: 0 !important; } +.w-100 { width: 100% !important; } +.h-100 { height: 100% !important; } + +/* -------------------------------------------- + Spacing utilities (generator) +-------------------------------------------- */ +@each $br-name, $br-value in $breakpoints { + @media (min-width: $br-value) { + $infix: if($br-name == "xs", "", "-#{$br-name}"); + + @each $prop-key, $prop-val in $spacing-properties { + @each $side-key, $side-val in $spacing-sides { + @each $size-key, $size-val in $spacers { + .#{$prop-key}#{$side-key}#{$infix}-#{$size-key} { + @if type-of($side-val) == "list" { + @each $side in $side-val { #{$prop-val}-#{$side}: $size-val !important; } + } @else if $side-val == "" { + #{$prop-val}: $size-val !important; + } @else { + #{$prop-val}-#{$side-val}: $size-val !important; + } + } + } + } + } + } +} + +/* Classic alias set (p-0 / px-4 / etc) + gap */ +@each $k, $v in $spacers { + .m-#{$k} { margin: $v !important; } + .mx-#{$k} { margin-left: $v !important; margin-right: $v !important; } + .my-#{$k} { margin-top: $v !important; margin-bottom: $v !important; } + .mt-#{$k} { margin-top: $v !important; } + .mb-#{$k} { margin-bottom: $v !important; } + .ml-#{$k} { margin-left: $v !important; } + .mr-#{$k} { margin-right: $v !important; } + + .p-#{$k} { padding: $v !important; } + .px-#{$k} { padding-left: $v !important; padding-right: $v !important; } + .py-#{$k} { padding-top: $v !important; padding-bottom: $v !important; } + .pt-#{$k} { padding-top: $v !important; } + .pb-#{$k} { padding-bottom: $v !important; } + .pl-#{$k} { padding-left: $v !important; } + .pr-#{$k} { padding-right: $v !important; } + + .gap-#{$k} { gap: $v !important; } +} + +/* -------------------------------------------- + Sizing utilities + responsive widths/heights +-------------------------------------------- */ +@each $key, $val in $sizes { + .w-#{$key} { width: $val !important; } + .h-#{$key} { height: $val !important; } +} + +@each $br-name, $br-value in $breakpoints { + @media (min-width: $br-value) { + $infix: if($br-name == "xs", "", "-#{$br-name}"); + @each $key, $val in $sizes { + .w#{$infix}-#{$key} { width: $val !important; } + .h#{$infix}-#{$key} { height: $val !important; } + } + } +} + +/* -------------------------------------------- + Typography utilities +-------------------------------------------- */ +@each $key, $val in $font-sizes { .#{$key} { font-size: $val !important; } } + +.text-center { text-align: center !important; } +.text-right { text-align: right !important; } +.text-left { text-align: left !important; } + +.font-weight-light { font-weight: $weight-light !important; } +.font-weight-normal { font-weight: $weight-normal !important; } +.font-weight-medium { font-weight: $weight-medium !important; } +.font-weight-bold { font-weight: $weight-bold !important; } + +.text-decoration-none { text-decoration: none !important; } +.text-uppercase { text-transform: uppercase !important; } + +code { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; + font-size: 0.95em; + padding: 0.12em 0.35em; + border-radius: $radius-sm; + background: rgba(var(--primary-rgb), 0.10); + border: 1px solid rgba(var(--primary-rgb), 0.14); +} + +/* -------------------------------------------- + Border helpers +-------------------------------------------- */ +.border { border: 1px solid $border-color !important; } +.border-top { border-top: 1px solid $border-color !important; } +.border-bottom { border-bottom: 1px solid $border-color !important; } +.border-left { border-left: 1px solid $border-color !important; } +.border-right { border-right: 1px solid $border-color !important; } + +/* -------------------------------------------- + Radius helpers +-------------------------------------------- */ +.rounded { border-radius: $radius-md !important; } +.rounded-sm { border-radius: $radius-sm !important; } +.rounded-lg { border-radius: $radius-lg !important; } +.rounded-pill { border-radius: $radius-pill !important; } +.rounded-none { border-radius: $radius-none !important; } + +/* -------------------------------------------- + Elevation helpers +-------------------------------------------- */ +@each $key, $val in $elevation { .elevation-#{$key} { box-shadow: $val !important; } } + +/* -------------------------------------------- + Z-index utilities +-------------------------------------------- */ +@each $key, $val in $z-index { .z-#{$key} { z-index: $val !important; } } + +/* -------------------------------------------- + Visibility / overflow helpers +-------------------------------------------- */ +.opacity-0 { opacity: 0 !important; } +.opacity-50 { opacity: 0.5 !important; } +.opacity-100 { opacity: 1 !important; } + +.overflow-hidden { overflow: hidden !important; } +.overflow-auto { overflow: auto !important; } + +.cursor-pointer { cursor: pointer !important; } +.user-select-none { user-select: none !important; } +.is-hidden { display: none !important; } +.lock-scroll { overflow: hidden !important; } + +/* -------------------------------------------- + Media helpers +-------------------------------------------- */ +.img-fluid { max-width: 100%; height: auto; } +@each $fit in $object-fits { .object-#{$fit} { object-fit: $fit !important; } } + +@each $key, $val in $aspect-ratios { + .ratio-#{$key} { + position: relative; + width: 100%; + + &::before { display: block; content: ""; padding-top: $val; } + > * { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + } +} + +/* -------------------------------------------- + Color utilities + Buttons + Alerts +-------------------------------------------- */ +@each $color-name, $shades in $colors { + $base: map.get($shades, 600); + $light: map.get($shades, 100); + $soft-border: map.get($shades, 200); + $dark: map.get($shades, 900); + $text-strong: map.get($shades, 800); + + .text-#{$color-name} { color: $base !important; } + .bg-#{$color-name} { background-color: $base !important; } + .bg-#{$color-name}-light { background-color: $light !important; } + + @each $shade-level, $color-value in $shades { + .text-#{$color-name}-#{$shade-level} { color: $color-value !important; } + .bg-#{$color-name}-#{$shade-level} { background-color: $color-value !important; } + } + + /* Solid button */ + .btn-#{$color-name} { + display: inline-flex; + align-items: center; + justify-content: center; + gap: map.get($spacers, 2); + padding: $input-padding-y $input-padding-x; + font-weight: $weight-medium; + border-radius: $radius-md; + border: 1px solid transparent; + cursor: pointer; + background-color: $base; + color: $white; + transition: + background-color $duration-fast $standard, + box-shadow $duration-base $standard, + transform $duration-base $standard, + filter $duration-fast $standard; + + &:hover { filter: brightness($hover-brightness); box-shadow: map.get($elevation, 2); transform: $hover-lift; } + &:active { filter: brightness($active-brightness); transform: translateY(0); } + &:focus { outline: none; } + &:focus-visible { box-shadow: 0 0 0 $focus-ring-width $focus-ring-color, map.get($elevation, 2); } + + &:disabled, &.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; + filter: none; + } + } + + /* Light button */ + .btn-#{$color-name}-light { + display: inline-flex; + align-items: center; + justify-content: center; + gap: map.get($spacers, 2); + padding: $input-padding-y $input-padding-x; + font-weight: $weight-medium; + border-radius: $radius-md; + border: 1px solid $soft-border; + cursor: pointer; + background-color: $light; + color: $text-strong; + transition: + background-color $duration-fast $standard, + box-shadow $duration-base $standard, + transform $duration-base $standard; + + &:hover { background-color: map.get($shades, 200); box-shadow: map.get($elevation, 1); transform: translateY(-1px); } + &:active { background-color: map.get($shades, 300); transform: translateY(0); } + &:focus { outline: none; } + &:focus-visible { box-shadow: 0 0 0 $focus-ring-width $focus-ring-color, map.get($elevation, 1); } + + &:disabled, &.is-disabled { + opacity: 0.6; + cursor: not-allowed; + pointer-events: none; + box-shadow: none; + transform: none; + } + } + + /* Alerts */ + .alert-#{$color-name} { + padding: $spacer; + border-radius: $radius-md; + background-color: $light; + color: $dark; + border: 1px solid $soft-border; + margin-bottom: $spacer; + } +} + +/* Button size modifiers */ +.btn-sm { + padding: math.div($input-padding-y, 1.4) math.div($input-padding-x, 1.4) !important; + font-size: map.get($font-sizes, "small") !important; + border-radius: $radius-sm !important; +} + +.btn-lg { + padding: map.get($spacers, 3) map.get($spacers, 4) !important; + font-size: map.get($font-sizes, "body") !important; + border-radius: $radius-lg !important; +} + +/* -------------------------------------------- + Cards / Surfaces +-------------------------------------------- */ +.card { + background-color: $bg-card; + border: $card-border-width solid $border-color; + border-radius: $card-border-radius; + padding: $card-padding; + box-shadow: map.get($elevation, 1); +} + +.card.hoverable { + transition: box-shadow $duration-slow $standard, transform $duration-slow $standard; + &:hover { box-shadow: $hover-shadow; transform: $hover-lift; } +} + +.card-soft { + background-color: $bg-surface; + border: 1px solid $border-color; +} + +/* -------------------------------------------- + Forms (inputs/selects/textarea/checkbox/radio) +-------------------------------------------- */ +.form-group { margin-bottom: map.get($spacers, 3); } + +.label { + display: block; + margin-bottom: $label-margin-bottom; + font-size: $label-font-size; + font-weight: $label-font-weight; + color: $text-muted; +} + +@mixin input-base($height: $input-height) { + width: 100%; + height: $height; + padding: $input-padding-y $input-padding-x; + background-color: $bg-surface; + border: 1px solid $border-color; + border-radius: $radius-sm; + color: $text-main; + transition: border-color $duration-fast $standard, box-shadow $duration-fast $standard, background-color $duration-fast $standard; + + &:focus { outline: none; border-color: var(--primary); } + &:focus-visible { box-shadow: 0 0 0 $focus-ring-width $focus-ring-color; } + &::placeholder { color: $text-light; } + + &:disabled { + opacity: 0.7; + cursor: not-allowed; + } +} + +.input { @include input-base($input-height); } +.input-sm { @include input-base($input-height-sm); font-size: map.get($font-sizes, "small"); } +.input-lg { @include input-base($input-height-lg); font-size: map.get($font-sizes, "body"); } + +.textarea { + @include input-base($input-height-lg); + height: auto; + min-height: 120px; + resize: vertical; +} + +.select { + @include input-base($input-height); + appearance: none; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right $input-padding-x center; + background-size: 16px 12px; +} + +[data-theme="dark"] .select { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23cbd5e1' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); +} + +.input-group { + display: flex; + align-items: stretch; + + .input, .select { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + [class^="btn-"], .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + white-space: nowrap; + } +} + +/* Checkbox / radio */ +.check { + display: inline-flex; + align-items: center; + gap: map.get($spacers, 2); + cursor: pointer; + user-select: none; + color: $text-main; + + input { + width: 18px; + height: 18px; + margin: 0; + accent-color: var(--primary); + + &:focus-visible { + outline: none; + box-shadow: 0 0 0 $focus-ring-width $focus-ring-color; + border-radius: $radius-sm; + } + } + + .check-label { color: $text-muted; } +} + +/* -------------------------------------------- + Tables (token-driven) +-------------------------------------------- */ +.table-wrap { + overflow: auto; + -webkit-overflow-scrolling: touch; + border-radius: inherit; +} + +.table { + width: 100%; + border-collapse: separate; + border-spacing: 0; + margin: 0; + + th, td { + padding: $table-cell-padding-y $table-cell-padding-x; + text-align: left; + vertical-align: middle; + border-bottom: 1px solid $border-color; + } + + thead th { + position: sticky; + top: 0; + z-index: 1; + + background: $table-header-bg; + color: $table-header-color; + + font-weight: $weight-medium; + text-transform: none; + letter-spacing: 0.02em; + font-size: map.get($font-sizes, "small"); + border-bottom: 1px solid $border-color; + } + + thead th:first-child { border-top-left-radius: $radius-md; } + thead th:last-child { border-top-right-radius: $radius-md; } + + tbody tr { + background: transparent; + transition: background-color $duration-base $standard; + } + + &.striped tbody tr:nth-of-type(odd) { background: $table-striped-bg; } + + &.hover tbody tr:hover { background: $table-hover-bg; } + + &.table-sm { + th, td { padding: math.div($table-cell-padding-y, 1.4) math.div($table-cell-padding-x, 1.4); } + thead th { font-size: map.get($font-sizes, "xs"); } + } +} + +/* -------------------------------------------- + Scrollbar +-------------------------------------------- */ +::-webkit-scrollbar { width: $scrollbar-width; height: $scrollbar-width; } +::-webkit-scrollbar-track { background: $scrollbar-track; } +::-webkit-scrollbar-thumb { + background: $scrollbar-thumb; + border-radius: $radius-pill; + &:hover { background: $scrollbar-thumb-hover; } +} + +/* -------------------------------------------- + Badges +-------------------------------------------- */ +.badge { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.25em 0.6em; + font-size: map.get($font-sizes, "xs"); + font-weight: $weight-bold; + border-radius: $radius-pill; + line-height: 1; + white-space: nowrap; +} + +@each $color-name, $shades in $colors { + .badge-#{$color-name} { + background-color: map.get($shades, 100); + color: map.get($shades, 800); + border: 1px solid map.get($shades, 200); + + &.badge-solid { + background-color: map.get($shades, 600); + color: $white; + border-color: transparent; + } + } +} + +/* -------------------------------------------- + Chips (component) +-------------------------------------------- */ +.chip-row { display: flex; flex-wrap: wrap; gap: map.get($spacers, 2); } + +.chip { + display: inline-flex; + align-items: center; + gap: map.get($spacers, 2); + padding: 0.35rem 0.65rem; + border-radius: $radius-pill; + border: 1px solid $border-color; + background: $bg-surface; + color: $text-muted; + cursor: pointer; + user-select: none; + transition: transform $duration-fast $standard, box-shadow $duration-base $standard, background-color $duration-fast $standard, color $duration-fast $standard; + + &:hover { + transform: translateY(-1px); + box-shadow: map.get($elevation, 2); + color: $text-main; + } + + &.is-active { + background: rgba(var(--primary-rgb), 0.12); + border-color: rgba(var(--primary-rgb), 0.18); + color: $text-main; + } +} + +/* -------------------------------------------- + Progress (component) +-------------------------------------------- */ +.progress { + height: 10px; + border-radius: $radius-pill; + background: $bg-surface; + overflow: hidden; + border: 1px solid $border-color; +} + +.progress-bar { + height: 100%; + background: var(--primary); + border-radius: $radius-pill; + transition: width $duration-slow $standard; +} + +/* Optional width helpers (keep demo-friendly) */ +.progress-0 { width: 0%; } +.progress-25 { width: 25%; } +.progress-46 { width: 46%; } +.progress-50 { width: 50%; } +.progress-72 { width: 72%; } +.progress-100 { width: 100%; } + +/* Variant tones */ +.progress-bar.soft { background: rgba(var(--primary-rgb), 0.55); } +.progress-bar.warn { background: rgba(249,115,22,0.55); } /* stays as MDI-ish warning tone */ + +/* -------------------------------------------- + Buttons: Close / Icon (component) +-------------------------------------------- */ +.btn-close { + border: none; + background: transparent; + font-size: 1.5rem; + line-height: 1; + cursor: pointer; + color: $text-muted; + padding: 0.25rem 0.5rem; + border-radius: $radius-sm; + transition: background-color $duration-fast $standard, color $duration-fast $standard, transform $duration-fast $standard; + + &:hover { + background: rgba(0,0,0,0.06); + color: $text-main; + transform: translateY(-1px); + } + + &:active { transform: translateY(0); } +} + +[data-theme="dark"] .btn-close:hover { background: rgba(255,255,255,0.08); } + +/* -------------------------------------------- + App shell / Sidebar / Drawer / Modal +-------------------------------------------- */ +.app-wrapper { + display: flex; + width: 100%; + min-height: 100vh; +} + +.sidebar { + width: $sidebar-width; + height: 100vh; + position: sticky; + top: 0; + background-color: $bg-surface; + border-right: 1px solid $border-color; + display: flex; + flex-direction: column; + transition: width $duration-base $standard; + + &.collapsed { width: $sidebar-collapsed; } +} + +.drawer { + position: fixed; + top: 0; + left: 0; + width: 320px; + max-width: 88vw; + height: 100vh; + z-index: map.get($z-index, "sidebar"); + background-color: $bg-card; + border-right: 1px solid $border-color; + transform: translateX(-105%); + transition: transform $duration-base $standard; + box-shadow: map.get($elevation, 24); + + &.is-open { transform: translateX(0); } +} + +.main-content { + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; +} + +/* Modal */ +.modal-overlay { + position: fixed; + top: 0; left: 0; + width: 100%; height: 100%; + background-color: rgba(0,0,0,0.55); + display: flex; + align-items: center; + justify-content: center; + z-index: map.get($z-index, "modal"); + padding: map.get($spacers, 4); + + opacity: 0; + visibility: hidden; + pointer-events: none; + transition: opacity $duration-base $standard, visibility $duration-base $standard; + + &.is-active { + opacity: 1; + visibility: visible; + pointer-events: auto; + } +} + +.modal-content { + background-color: $bg-card; + border-radius: $radius-lg; + width: 100%; + max-width: 640px; + box-shadow: map.get($elevation, 24); + overflow: hidden; + border: 1px solid $border-color; + + transform: translateY(10px) scale(0.985); + transition: transform $duration-base $standard; + + .modal-overlay.is-active & { + transform: translateY(0) scale(1); + } +} + +.modal-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: map.get($spacers, 3); + padding: map.get($spacers, 4); + border-bottom: 1px solid $border-color; +} + +.modal-title { + margin: 0; + font-size: map.get($font-sizes, "h4"); + font-weight: $weight-bold; + color: $text-main; +} + +.modal-body { + padding: map.get($spacers, 4); + color: $text-muted; + + p { + margin: 0; + } +} + +.modal-footer { + display: flex; + justify-content: flex-end; + gap: map.get($spacers, 2); + padding: map.get($spacers, 3) map.get($spacers, 4); + border-top: 1px solid $border-color; + background: $bg-surface; +} + +.modal-actions { + display: flex; + justify-content: flex-end; + gap: map.get($spacers, 2); +} + +.vor-modal-sm { + max-width: 480px; +} + +.vor-modal-md { + max-width: 640px; +} + +.vor-modal-lg { + max-width: 820px; +} +/* -------------------------------------------- + Accordion +-------------------------------------------- */ +.accordion-item { + border-bottom: 1px solid $border-color; + + &.is-active { + .accordion-body { display: block; } + .accordion-icon { transform: rotate(180deg); } + } + + .accordion-header { + padding: $spacer; + cursor: pointer; + display: flex; + justify-content: space-between; + align-items: center; + background: none; + border: none; + width: 100%; + color: $text-main; + + &:hover { background-color: $bg-surface; } + } + + .accordion-icon { transition: transform $duration-base $standard; } + + .accordion-body { + padding: 0 $spacer $spacer; + display: none; + color: $text-muted; + } +} + +/* -------------------------------------------- + Switch +-------------------------------------------- */ +.switch { + --switch-width: 40px; + --switch-height: 22px; + position: relative; + display: inline-block; + width: var(--switch-width); + height: var(--switch-height); + + input { + opacity: 0; + width: 0; + height: 0; + + &:checked + .slider { + background-color: var(--primary); + &::before { transform: translateX(18px); } + } + + &:focus-visible + .slider { + box-shadow: 0 0 0 $focus-ring-width $focus-ring-color; + } + } + + .slider { + position: absolute; + cursor: pointer; + top: 0; left: 0; right: 0; bottom: 0; + background-color: map.get(map.get($colors, "gray"), 300); + transition: $duration-fast $standard; + border-radius: $radius-pill; + + &::before { + position: absolute; + content: ""; + height: 16px; + width: 16px; + left: 3px; + bottom: 3px; + background-color: $white; + transition: $duration-fast $standard; + border-radius: 50%; + } + } +} + +/* -------------------------------------------- + Dividers / helpers +-------------------------------------------- */ +.hr { + border: none; + border-top: 1px solid $border-color; + margin: map.get($spacers, 4) 0; +} + +/* -------------------------------------------- + Drawer Modal (off-canvas modal) +-------------------------------------------- */ +.drawer-modal { + position: fixed; + inset: 0; + z-index: map.get($z-index, "modal"); + display: flex; + justify-content: flex-end; + + background-color: rgba(0,0,0,0.55); + + opacity: 0; + visibility: hidden; + pointer-events: none; + transition: opacity $duration-base $standard, visibility $duration-base $standard; + + &.is-active { + opacity: 1; + visibility: visible; + pointer-events: auto; + } +} + +/* -------------------------------------------- + Drawer Modal (off-canvas modal) +-------------------------------------------- */ +.drawer-modal { + position: fixed; + inset: 0; + z-index: map.get($z-index, "modal"); + + display: flex; + justify-content: flex-end; /* right default */ + + background-color: rgba(0,0,0,0.55); + + opacity: 0; + visibility: hidden; + pointer-events: none; + + transition: + opacity $duration-base $standard, + visibility $duration-base $standard; + + &.is-active { + opacity: 1; + visibility: visible; + pointer-events: auto; + } + + &.is-left { + justify-content: flex-start; + } +} + +.drawer-panel { + width: 520px; + max-width: 94vw; + height: 100vh; + + background-color: $bg-card; + box-shadow: map.get($elevation, 24); + + display: flex; + flex-direction: column; + + transition: transform $duration-slow $standard; + + /* default: start off-screen right */ + transform: translateX(105%); + border-left: 1px solid $border-color; + + .drawer-modal.is-active & { + transform: translateX(0); + } + + /* left variant */ + .drawer-modal.is-left & { + transform: translateX(-105%); + border-left: none; + border-right: 1px solid $border-color; + } + + .drawer-modal.is-left.is-active & { + transform: translateX(0); + } +} + +.drawer-panel-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: map.get($spacers, 4); + border-bottom: 1px solid $border-color; +} + +.drawer-panel-body { + padding: map.get($spacers, 4); + overflow: auto; + -webkit-overflow-scrolling: touch; + flex: 1; +} + +.drawer-panel-footer { + padding: map.get($spacers, 3) map.get($spacers, 4); + border-top: 1px solid $border-color; +} + +/* Dark mode tweaks (optional, usually already handled by tokens) */ +[data-theme="dark"] .drawer-modal { + background-color: rgba(0,0,0,0.65); +} \ No newline at end of file diff --git a/rss/css/palette.css b/rss/css/palette.css new file mode 100644 index 0000000..1898fcd --- /dev/null +++ b/rss/css/palette.css @@ -0,0 +1 @@ +/* palette.scss - Full Spectrum Master Map *//*# sourceMappingURL=palette.css.map */ \ No newline at end of file diff --git a/rss/css/palette.css.map b/rss/css/palette.css.map new file mode 100644 index 0000000..9fb5583 --- /dev/null +++ b/rss/css/palette.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["palette.scss"],"names":[],"mappings":"AAAA,4CAAA","file":"palette.css"} \ No newline at end of file diff --git a/rss/css/palette.scss b/rss/css/palette.scss new file mode 100644 index 0000000..4ce650d --- /dev/null +++ b/rss/css/palette.scss @@ -0,0 +1,43 @@ +/* palette.scss - Full Spectrum Master Map */ + +$colors: ( + "gray": ( + 50: #fbfcfd, 100: #f8f9fa, 200: #e9ecef, 300: #dee2e6, 400: #ced4da, 500: #adb5bd, 600: #6c757d, 700: #495057, 800: #343a40, 900: #212529, 950: #121416 + ), + "blue": ( + 50: #f0f7ff, 100: #e7f1ff, 200: #cfe2ff, 300: #9ec5fe, 400: #6ea8fe, 500: #0d6efd, 600: #0a58ca, 700: #084298, 800: #052c65, 900: #031633, 950: #020b1a + ), + "indigo": ( + 50: #f5f3ff, 100: #ede9fe, 200: #ddd6fe, 300: #c4b5fd, 400: #a78bfa, 500: #8b5cf6, 600: #7c3aed, 700: #6d28d9, 800: #5b21b6, 900: #4c1d95, 950: #2e1065 + ), + "purple": ( + 50: #faf5ff, 100: #f3e8ff, 200: #e9d5ff, 300: #d8b4fe, 400: #c084fc, 500: #a855f7, 600: #9333ea, 700: #7e22ce, 800: #6b21a8, 900: #581c87, 950: #3b0764 + ), + "pink": ( + 50: #fdf2f8, 100: #fce7f3, 200: #fbcfe8, 300: #f9a8d4, 400: #f472b6, 500: #ec4899, 600: #db2777, 700: #be185d, 800: #9d174d, 900: #831843, 950: #500724 + ), + "red": ( + 50: #fef2f2, 100: #fee2e2, 200: #fecaca, 300: #fca5a5, 400: #f87171, 500: #ef4444, 600: #dc2626, 700: #b91c1c, 800: #991b1b, 900: #7f1d1d, 950: #450a0a + ), + "orange": ( + 50: #fff7ed, 100: #ffedd5, 200: #fed7aa, 300: #fdba74, 400: #fb923c, 500: #f97316, 600: #ea580c, 700: #c2410c, 800: #9a3412, 900: #7c2d12, 950: #431407 + ), + "yellow": ( + 50: #fefce8, 100: #fef9c3, 200: #fef08a, 300: #fde047, 400: #facc15, 500: #eab308, 600: #ca8a04, 700: #a16207, 800: #854d0e, 900: #713f12, 950: #422006 + ), + "green": ( + 50: #f0fdf4, 100: #dcfce7, 200: #bbf7d0, 300: #86efac, 400: #4ade80, 500: #22c55e, 600: #16a34a, 700: #15803d, 800: #166534, 900: #14532d, 950: #052e16 + ), + "emerald": ( + 50: #ecfdf5, 100: #d1fae5, 200: #a7f3d0, 300: #6ee7b7, 400: #34d399, 500: #10b981, 600: #059669, 700: #047857, 800: #065f46, 900: #064e3b, 950: #022c22 + ), + "teal": ( + 50: #f0fdfa, 100: #ccfbf1, 200: #99f6e4, 300: #5eead4, 400: #2dd4bf, 500: #14b8a6, 600: #0d9488, 700: #0f766e, 800: #115e59, 900: #134e4a, 950: #042f2e + ), + "cyan": ( + 50: #ecfeff, 100: #cffafe, 200: #a5f3fc, 300: #67e8f9, 400: #22d3ee, 500: #06b6d4, 600: #0891b2, 700: #0e7490, 800: #155e75, 900: #164e63, 950: #083344 + ) +); + +$white: #ffffff; +$black: #000000; \ No newline at end of file diff --git a/rss/css/template.css b/rss/css/template.css new file mode 100644 index 0000000..11328c2 --- /dev/null +++ b/rss/css/template.css @@ -0,0 +1,1001 @@ +@charset "UTF-8"; +/* templates.scss (drop-in) + App/demo templates and composed patterns. + Keep framework stuff in main.scss. +*/ +/* variables.scss (drop-in) */ +/* palette.scss - Full Spectrum Master Map */ +/* -------------------------------------------- + Helpers +-------------------------------------------- */ +/* -------------------------------------------- + Breakpoints +-------------------------------------------- */ +/* -------------------------------------------- + Spacing +-------------------------------------------- */ +/* -------------------------------------------- + Elevation +-------------------------------------------- */ +/* -------------------------------------------- + Radius +-------------------------------------------- */ +/* -------------------------------------------- + Typography +-------------------------------------------- */ +/* -------------------------------------------- + Theme tokens +-------------------------------------------- */ +:root { + /* Brand */ + --primary: #0f766e; + --primary-light: #ccfbf1; + --primary-dark: #042f2e; + --accent: #f97316; + /* RGB channels for focus rings etc */ + --primary-rgb: 15 118 110; + /* Status */ + --success: #16a34a; + --info: #0d6efd; + --warning: #eab308; + --danger: #dc2626; + /* Surfaces */ + --bg-app: #fbfcfd; + --bg-surface: #f8f9fa; + --bg-card: #ffffff; + --border-color: #e9ecef; + /* Text */ + --text-main: #212529; + --text-muted: #495057; + --text-light: #adb5bd; + --text-inverse: #ffffff; + --table-header-bg: var(--bg-surface); + --table-striped-bg: #fbfcfd; + --table-hover-bg: rgba(var(--primary-rgb), 0.06); +} + +[data-theme=dark] { + --primary: #5eead4; + --primary-light: #115e59; + --primary-rgb: 94 234 212; + --bg-app: #121416; + --bg-surface: #212529; + --bg-card: #343a40; + --border-color: #495057; + --text-main: #f8f9fa; + --text-muted: #ced4da; + --text-light: #6c757d; + --table-header-bg: var(--bg-surface); + --table-striped-bg: rgba(255,255,255,0.03); + --table-hover-bg: rgba(var(--primary-rgb), 0.10); +} + +/* -------------------------------------------- + SASS aliases to CSS vars +-------------------------------------------- */ +/* -------------------------------------------- + Z-index +-------------------------------------------- */ +/* -------------------------------------------- + Grid & layout maps +-------------------------------------------- */ +/* -------------------------------------------- + Components baseline tokens +-------------------------------------------- */ +/* sizing maps */ +/* motion */ +/* focus ring */ +/* sidebar */ +/* -------------------------------------------- + Demo shell + layout helpers +-------------------------------------------- */ +.demo-shell { + min-height: 100vh; +} + +.page { + margin: 0 auto; +} + +/* -------------------------------------------- + Topbar (glass, theme-aware via CSS vars) +-------------------------------------------- */ +/* Defaults (light) */ +:root { + --topbar-glass-bg: rgba(255, 255, 255, 0.72); + --topbar-glass-border: rgba(0, 0, 0, 0.08); + --topbar-glass-shadow: 0 10px 24px rgba(0, 0, 0, 0.06); +} + +/* Dark overrides */ +[data-theme=dark] { + --topbar-glass-bg: rgba(15, 23, 42, 0.62); /* slate-ish */ + --topbar-glass-border: rgba(255, 255, 255, 0.10); + --topbar-glass-shadow: 0 10px 24px rgba(0, 0, 0, 0.35); +} + +.topbar { + position: sticky; + top: 0; + z-index: 300; + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + background: var(--topbar-glass-bg); + border-bottom: 1px solid var(--topbar-glass-border); + box-shadow: var(--topbar-glass-shadow); + transition: background-color 250ms cubic-bezier(0.4, 0, 0.2, 1), border-color 250ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1); +} + +/* layout (unchanged) */ +.topbar-inner { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; +} + +.topbar-left { + display: flex; + align-items: center; + gap: 1rem; + min-width: 0; +} + +.topbar-right { + display: flex; + align-items: center; + gap: 1rem; + flex: 0 0 auto; +} + +/* -------------------------------------------- + Sidebar templates +-------------------------------------------- */ +.sidebar-brand { + display: flex; + align-items: center; + gap: 1rem; +} + +.brand-mark { + width: 38px; + height: 38px; + border-radius: 12px; + background: radial-gradient(10px 10px at 30% 30%, rgba(255, 255, 255, 0.55), transparent 60%), radial-gradient(28px 28px at 70% 70%, rgba(0, 0, 0, 0.08), transparent 55%), var(--primary); + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.08); + flex: 0 0 auto; +} + +.nav-stack { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.nav-item { + display: flex; + align-items: center; + gap: 1rem; + padding: 0.75rem 0.875rem; + border-radius: 0.75rem; + color: var(--text-muted); + text-decoration: none; + position: relative; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.nav-item:hover { + background: rgba(0, 0, 0, 0.04); + color: var(--text-main); + transform: translateY(-1px); +} + +[data-theme=dark] .nav-item:hover { + background: rgba(255, 255, 255, 0.06); +} + +.nav-item.is-active { + background: rgba(20, 184, 166, 0.12); + color: var(--text-main); +} + +.nav-item.is-active::before { + content: ""; + position: absolute; + left: 0.4rem; + top: 50%; + width: 6px; + height: 18px; + transform: translateY(-50%); + border-radius: 999px; + background: var(--primary); +} + +/* -------------------------------------------- + Hero +-------------------------------------------- */ +.hero-pro { + border: 1px solid var(--border-color); + background: radial-gradient(700px 260px at 15% 0%, rgba(20, 184, 166, 0.22), transparent 60%), radial-gradient(520px 240px at 90% 20%, rgba(249, 115, 22, 0.1), transparent 55%), var(--bg-card); +} + +[data-theme=dark] .hero-pro { + background: radial-gradient(700px 260px at 15% 0%, rgba(20, 184, 166, 0.16), transparent 60%), radial-gradient(520px 240px at 90% 20%, rgba(249, 115, 22, 0.08), transparent 55%), var(--bg-card); +} + +.hero-grid { + display: grid; + gap: 1rem; + grid-template-columns: 1.4fr 1fr; +} +@media (max-width: 992px) { + .hero-grid { + grid-template-columns: 1fr; + } +} + +.kicker { + display: inline-flex; + align-items: center; + gap: 0.5rem; +} + +.pill { + font-size: 0.75rem; + padding: 0.15rem 0.55rem; + border-radius: 999px; + background: rgba(20, 184, 166, 0.12); + color: var(--text-main); + border: 1px solid rgba(20, 184, 166, 0.18); +} + +/* Card variant used inside hero */ +.card-quick { + background: var(--bg-surface); + border: 1px solid var(--border-color); +} + +/* -------------------------------------------- + Stat cards +-------------------------------------------- */ +.stat-title { + letter-spacing: 0.05em; + text-transform: uppercase; + font-size: 0.75rem; + color: var(--text-light); +} + +.stat-value { + font-size: 1.85rem; + font-weight: 700; + margin: 0.35rem 0; +} + +.stat-sub { + font-size: 0.875rem; + color: var(--text-muted); +} + +/* -------------------------------------------- + Chips / filters +-------------------------------------------- */ +.chip-row { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.chip { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.35rem 0.65rem; + border-radius: 999px; + border: 1px solid var(--border-color); + background: var(--bg-surface); + color: var(--text-muted); + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), color 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.chip:hover { + transform: translateY(-1px); + box-shadow: 0 10px 22px rgba(0, 0, 0, 0.08); + color: var(--text-main); +} +.chip.is-active { + background: rgba(20, 184, 166, 0.12); + border-color: rgba(20, 184, 166, 0.18); + color: var(--text-main); +} + +/* -------------------------------------------- + Table polish for dashboard use +-------------------------------------------- */ +.table-wrap { + overflow: auto; +} + +.table thead th { + position: sticky; + top: 0; + z-index: 1; +} + +/* Better look for “table inside card with p-0” */ +.card.table-card { + padding: 0; + overflow: hidden; +} + +.table-card .table { + margin: 0; +} + +.table-card thead th { + background: var(--bg-surface); +} + +/* -------------------------------------------- + Modal close button +-------------------------------------------- */ +.btn-close { + border: none; + background: transparent; + font-size: 1.5rem; + line-height: 1; + cursor: pointer; + color: var(--text-muted); + padding: 0.25rem 0.5rem; + border-radius: 0.5rem; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +.btn-close:hover { + background: rgba(0, 0, 0, 0.06); + color: var(--text-main); + transform: translateY(-1px); +} +.btn-close:active { + transform: translateY(0); +} + +[data-theme=dark] .btn-close:hover { + background: rgba(255, 255, 255, 0.08); +} + +/* -------------------------------------------- + Progress bars (replace inline styles) + Use:
+-------------------------------------------- */ +.progress { + height: 10px; + border-radius: 999px; + background: var(--bg-surface); + overflow: hidden; + border: 1px solid var(--border-color); +} + +.progress-bar { + height: 100%; + background: var(--primary); + border-radius: 999px; + transition: width 400ms cubic-bezier(0.4, 0, 0.2, 1); +} + +/* Common demo widths */ +.progress-72 { + width: 72%; +} + +.progress-46 { + width: 46%; +} + +.progress-25 { + width: 25%; +} + +/* Variant colors used in pipeline */ +.progress-bar.soft { + background: rgba(20, 184, 166, 0.55); +} + +.progress-bar.warn { + background: rgba(249, 115, 22, 0.55); +} + +/* -------------------------------------------- + Tiny helper you used in demo +-------------------------------------------- */ +.m-0 { + margin: 0 !important; +} + +/* -------------------------------------------- + Dashboard / panel layout patterns +-------------------------------------------- */ +.panel-grid { + display: grid; + gap: 1.5rem; +} + +.panel-grid-2 { + display: grid; + gap: 1.5rem; + grid-template-columns: 1.15fr 0.85fr; +} +@media (max-width: 992px) { + .panel-grid-2 { + grid-template-columns: 1fr; + } +} + +.panel-grid-3 { + display: grid; + gap: 1.5rem; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} +@media (max-width: 992px) { + .panel-grid-3 { + grid-template-columns: 1fr; + } +} + +.panel-grid-4 { + display: grid; + gap: 1.5rem; + grid-template-columns: repeat(4, minmax(0, 1fr)); +} +@media (max-width: 1200px) { + .panel-grid-4 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} +@media (max-width: 768px) { + .panel-grid-4 { + grid-template-columns: 1fr; + } +} + +/* -------------------------------------------- + Rich panel surfaces +-------------------------------------------- */ +.panel-glass { + background: linear-gradient(180deg, rgba(255, 255, 255, 0.78), rgba(255, 255, 255, 0.58)), var(--bg-card); + border: 1px solid rgba(255, 255, 255, 0.35); + box-shadow: 0 14px 34px rgba(0, 0, 0, 0.07), 0 2px 10px rgba(0, 0, 0, 0.04); + backdrop-filter: blur(14px); + -webkit-backdrop-filter: blur(14px); +} + +[data-theme=dark] .panel-glass { + background: linear-gradient(180deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.02)), var(--bg-card); + border: 1px solid rgba(255, 255, 255, 0.08); + box-shadow: 0 18px 40px rgba(0, 0, 0, 0.28), 0 2px 10px rgba(0, 0, 0, 0.16); +} + +.panel-soft { + background: radial-gradient(120% 140% at 0% 0%, rgba(var(--primary-rgb), 0.08), transparent 55%), var(--bg-card); + box-shadow: 0 12px 28px rgba(0, 0, 0, 0.06), 0 2px 8px rgba(0, 0, 0, 0.04); +} + +[data-theme=dark] .panel-soft { + background: radial-gradient(120% 140% at 0% 0%, rgba(var(--primary-rgb), 0.1), transparent 55%), var(--bg-card); + box-shadow: 0 16px 34px rgba(0, 0, 0, 0.22), 0 2px 8px rgba(0, 0, 0, 0.14); +} + +.panel-tint-teal { + background: radial-gradient(700px 220px at 12% 0%, rgba(20, 184, 166, 0.18), transparent 58%), linear-gradient(180deg, rgba(255, 255, 255, 0.72), rgba(255, 255, 255, 0.54)), var(--bg-card); +} + +.panel-tint-orange { + background: radial-gradient(640px 220px at 90% 0%, rgba(249, 115, 22, 0.16), transparent 58%), linear-gradient(180deg, rgba(255, 255, 255, 0.72), rgba(255, 255, 255, 0.54)), var(--bg-card); +} + +[data-theme=dark] .panel-tint-teal { + background: radial-gradient(700px 220px at 12% 0%, rgba(20, 184, 166, 0.12), transparent 58%), linear-gradient(180deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.02)), var(--bg-card); +} + +[data-theme=dark] .panel-tint-orange { + background: radial-gradient(640px 220px at 90% 0%, rgba(249, 115, 22, 0.1), transparent 58%), linear-gradient(180deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.02)), var(--bg-card); +} + +/* -------------------------------------------- + Card headers / actions +-------------------------------------------- */ +.card-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 1rem; + margin-bottom: 1rem; +} + +.card-actions { + display: flex; + gap: 0.5rem; + flex-wrap: wrap; +} + +/* -------------------------------------------- + KPI cards +-------------------------------------------- */ +.metric-card { + position: relative; + overflow: hidden; + box-shadow: 0 12px 28px rgba(0, 0, 0, 0.06), 0 2px 8px rgba(0, 0, 0, 0.04); + transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), border-color 250ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.metric-card::before { + content: ""; + position: absolute; + inset: 0 auto auto 0; + width: 100%; + height: 3px; + background: linear-gradient(90deg, rgba(20, 184, 166, 0.95), rgba(34, 211, 238, 0.75), rgba(249, 115, 22, 0.75)); + opacity: 0.9; +} + +.metric-card:hover { + transform: translateY(-2px); + box-shadow: 0 18px 40px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.05); +} + +[data-theme=dark] .metric-card { + box-shadow: 0 18px 38px rgba(0, 0, 0, 0.22), 0 2px 8px rgba(0, 0, 0, 0.12); +} + +[data-theme=dark] .metric-card:hover { + box-shadow: 0 22px 46px rgba(0, 0, 0, 0.28), 0 4px 12px rgba(0, 0, 0, 0.16); +} + +/* -------------------------------------------- + Module / list panels +-------------------------------------------- */ +.module-list { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.module-item { + padding: 1rem; + border-radius: 0.5rem; + border: 1px solid var(--border-color); + background: linear-gradient(180deg, rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.2)), var(--bg-surface); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 8px 18px rgba(0, 0, 0, 0.04); + display: flex; + flex-direction: column; + gap: 0.5rem; + transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1), border-color 250ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.module-item:hover { + transform: translateY(-1px); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.24), 0 14px 24px rgba(0, 0, 0, 0.07); +} + +[data-theme=dark] .module-item { + background: linear-gradient(180deg, rgba(255, 255, 255, 0.03), rgba(255, 255, 255, 0.01)), var(--bg-surface); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04), 0 10px 22px rgba(0, 0, 0, 0.18); +} + +[data-theme=dark] .module-item:hover { + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06), 0 14px 28px rgba(0, 0, 0, 0.24); +} + +.module-item-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.5rem; +} + +.module-meta { + display: flex; + justify-content: space-between; + gap: 0.5rem; + font-size: 0.875rem; + color: var(--text-muted); +} +@media (max-width: 576px) { + .module-meta { + flex-direction: column; + } +} + +/* -------------------------------------------- + Table shell polish +-------------------------------------------- */ +.table-shell { + overflow: hidden; + box-shadow: 0 14px 30px rgba(0, 0, 0, 0.06), 0 2px 8px rgba(0, 0, 0, 0.04); +} + +[data-theme=dark] .table-shell { + box-shadow: 0 18px 36px rgba(0, 0, 0, 0.22), 0 2px 8px rgba(0, 0, 0, 0.14); +} + +.table-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + padding: 1.5rem; + border-bottom: 1px solid var(--border-color); +} +@media (max-width: 768px) { + .table-toolbar { + flex-direction: column; + align-items: flex-start; + } +} + +/* -------------------------------------------- + Sidebar surface polish +-------------------------------------------- */ +.sidebar.panel-glass { + border-right: 1px solid var(--border-color); +} + +/* -------------------------------------------- + Split hero / form shell +-------------------------------------------- */ +.split-shell { + width: min(980px, 100%); + display: grid; + grid-template-columns: 1.1fr 0.9fr; + gap: 1.5rem; + align-items: stretch; + margin-inline: auto; +} + +@media (max-width: 860px) { + .split-shell { + grid-template-columns: 1fr; + } +} +/* -------------------------------------------- + Ambient full-page body skin +-------------------------------------------- */ +body.surface-ambient { + margin: 0; + min-height: 100vh; + color: var(--text-main); + display: grid; + place-items: center; + padding: 28px; + background: radial-gradient(1200px 700px at 15% 10%, rgba(2, 207, 204, 0.18), transparent 55%), radial-gradient(900px 600px at 95% 25%, rgba(16, 183, 255, 0.16), transparent 55%), radial-gradient(700px 480px at 50% 95%, rgba(124, 58, 237, 0.12), transparent 55%), linear-gradient(180deg, #070a0f, #0b1220); +} + +html[data-theme=light] body.surface-ambient { + background: radial-gradient(1200px 700px at 15% 10%, rgba(2, 207, 204, 0.18), transparent 55%), radial-gradient(900px 600px at 95% 25%, rgba(16, 183, 255, 0.16), transparent 55%), radial-gradient(700px 480px at 50% 95%, rgba(124, 58, 237, 0.12), transparent 55%), linear-gradient(180deg, #f4f7fb, #eaf0f8); +} + +.surface-noise { + position: fixed; + inset: 0; + pointer-events: none; + opacity: 0.1; + mix-blend-mode: overlay; + background-image: linear-gradient(transparent 0 48%, rgba(255, 255, 255, 0.06) 48% 52%, transparent 52% 100%), linear-gradient(90deg, transparent 0 48%, rgba(255, 255, 255, 0.05) 48% 52%, transparent 52% 100%); + background-size: 38px 38px; + filter: blur(0.2px); +} + +/* -------------------------------------------- + Tech texture overlay +-------------------------------------------- */ +.surface-noise { + position: fixed; + inset: 0; + pointer-events: none; + opacity: 0.1; + mix-blend-mode: overlay; + background-image: linear-gradient(transparent 0 48%, rgba(255, 255, 255, 0.06) 48% 52%, transparent 52% 100%), linear-gradient(90deg, transparent 0 48%, rgba(255, 255, 255, 0.05) 48% 52%, transparent 52% 100%); + background-size: 38px 38px; + filter: blur(0.2px); +} + +[data-theme=light] .surface-noise { + opacity: 0.06; + mix-blend-mode: normal; +} + +/* -------------------------------------------- + Rich glass panel +-------------------------------------------- */ +.panel-frame { + border: 1px solid rgba(255, 255, 255, 0.1); + background: linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.08)); + border-radius: 22px; + box-shadow: 0 30px 80px rgba(0, 0, 0, 0.55); + overflow: hidden; + position: relative; +} + +[data-theme=light] .panel-frame { + border-color: rgba(10, 20, 40, 0.1); + background: linear-gradient(180deg, rgba(10, 20, 40, 0.06), rgba(10, 20, 40, 0.08)); + box-shadow: 0 30px 80px rgba(0, 0, 0, 0.18); +} + +/* -------------------------------------------- + Section hero panel +-------------------------------------------- */ +.panel-hero { + padding: 34px 30px; + display: flex; + flex-direction: column; + justify-content: space-between; + gap: 18px; + background: radial-gradient(520px 320px at 25% 25%, rgba(var(--primary-rgb), 0.18), transparent 60%), radial-gradient(540px 340px at 90% 20%, rgba(16, 183, 255, 0.14), transparent 55%), linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.03)); +} + +[data-theme=light] .panel-hero { + background: radial-gradient(520px 320px at 25% 25%, rgba(var(--primary-rgb), 0.12), transparent 60%), radial-gradient(540px 340px at 90% 20%, rgba(16, 183, 255, 0.1), transparent 55%), linear-gradient(180deg, rgba(255, 255, 255, 0.45), rgba(255, 255, 255, 0.22)); +} + +.panel-hero h1 { + margin: 0; + font-size: 34px; + letter-spacing: -0.02em; +} + +.panel-hero p { + margin: 10px 0 0; + color: var(--text-muted); + max-width: 52ch; +} + +/* -------------------------------------------- + Panel header / body +-------------------------------------------- */ +.panel-bar { + padding: 26px 26px 18px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 14px; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); +} + +[data-theme=light] .panel-bar { + border-bottom-color: rgba(10, 20, 40, 0.1); +} + +.panel-body { + padding: 24px 26px 26px; +} + +/* -------------------------------------------- + Brand pieces +-------------------------------------------- */ +.brand-stack { + min-width: 0; + display: flex; + flex-direction: column; + line-height: 1.1; +} + +.mark { + width: 44px; + height: 44px; + border-radius: 12px; + /* Using your Teal/Blue palette */ + background: radial-gradient(circle at 30% 30%, rgba(255, 255, 255, 0.35), transparent 65%), linear-gradient(135deg, #02CFCC 0%, #10b7ff 100%); + box-shadow: 0 8px 24px rgba(2, 207, 204, 0.25), inset 0 0 0 1px rgba(255, 255, 255, 0.15); + position: relative; + flex: 0 0 auto; + display: flex; + align-items: center; + justify-content: center; +} + +.mark::before { + content: ""; + width: 20px; + height: 20px; + background: white; + clip-path: polygon(100% 20%, 100% 0%, 0% 0%, 0% 100%, 100% 100%, 100% 80%, 25% 80%, 25% 20%); + opacity: 0.95; + filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1)); +} + +.mark::after { + content: ""; + position: absolute; + width: 6px; + height: 6px; + background: white; + border-radius: 50%; + right: 12px; + top: 50%; + transform: translateY(-50%); + box-shadow: 0 0 8px rgba(255, 255, 255, 0.6); +} + +.headline { + font-size: 18px; + font-weight: 700; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* -------------------------------------------- + Quiet action button +-------------------------------------------- */ +.btn-quiet { + border: 1px solid rgba(255, 255, 255, 0.1); + background: transparent; + color: var(--text-main); + border-radius: 999px; + padding: 10px 12px; + cursor: pointer; + transition: transform 0.08s ease, border-color 150ms cubic-bezier(0.4, 0, 0.2, 1), background-color 150ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.btn-quiet:hover { + background: rgba(255, 255, 255, 0.05); +} + +.btn-quiet:active { + transform: translateY(1px); +} + +[data-theme=light] .btn-quiet { + border-color: rgba(10, 20, 40, 0.1); +} + +[data-theme=light] .btn-quiet:hover { + background: rgba(10, 20, 40, 0.04); +} + +/* -------------------------------------------- + Meta pills row +-------------------------------------------- */ +.meta-row { + display: flex; + gap: 12px; + flex-wrap: wrap; + margin-top: 18px; +} + +/* override/extend existing .pill use nicely here */ +.pill.soft { + border: 1px solid rgba(255, 255, 255, 0.1); + color: var(--text-muted); + background: rgba(0, 0, 0, 0.1); + padding: 8px 10px; + font-size: 12px; + display: inline-flex; + gap: 8px; + align-items: center; +} + +[data-theme=light] .pill.soft { + border-color: rgba(10, 20, 40, 0.1); + background: rgba(255, 255, 255, 0.35); +} + +/* -------------------------------------------- + Form field shell +-------------------------------------------- */ +.field { + display: grid; + gap: 8px; +} + +.control { + position: relative; + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 16px; + background: rgba(0, 0, 0, 0.1); + transition: border-color 150ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 0.08s ease; +} + +[data-theme=light] .control { + border-color: rgba(10, 20, 40, 0.1); + background: rgba(255, 255, 255, 0.45); +} + +.control:focus-within { + border-color: rgba(var(--primary-rgb), 0.55); + box-shadow: 0 0 0 4px rgba(var(--primary-rgb), 0.18); +} + +.control > .input { + border: 0; + background: transparent; + box-shadow: none; + height: auto; + padding: 14px 14px; + border-radius: 16px; +} + +.control > .input:focus, +.control > .input:focus-visible { + border: 0; + box-shadow: none; + outline: none; +} + +.control.has-action > .input { + padding-right: 78px; +} + +/* -------------------------------------------- + Inline action in field +-------------------------------------------- */ +.control-action { + position: absolute; + right: 8px; + top: 50%; + transform: translateY(-50%); + border: 1px solid rgba(255, 255, 255, 0.1); + background: rgba(255, 255, 255, 0.04); + color: var(--text-main); + border-radius: 12px; + padding: 8px 10px; + cursor: pointer; + font-size: 12px; + transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 0.08s ease; +} + +.control-action:hover { + background: rgba(255, 255, 255, 0.08); +} + +.control-action:active { + transform: translateY(calc(-50% + 1px)); +} + +[data-theme=light] .control-action { + border-color: rgba(10, 20, 40, 0.1); + background: rgba(10, 20, 40, 0.04); +} + +[data-theme=light] .control-action:hover { + background: rgba(10, 20, 40, 0.08); +} + +/* -------------------------------------------- + Subtext / tiny footer +-------------------------------------------- */ +.subtext { + margin-top: 10px; + color: var(--text-muted); + font-size: 13px; + line-height: 1.45; +} + +.panel-foot { + margin-top: 18px; + display: flex; + justify-content: space-between; + gap: 12px; + flex-wrap: wrap; + color: var(--text-muted); + font-size: 12px; + border-top: 1px solid rgba(255, 255, 255, 0.1); + padding-top: 14px; +} + +[data-theme=light] .panel-foot { + border-top-color: rgba(10, 20, 40, 0.1); +} + +.mono { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +.transparent-effect-fallback { + background: linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.02)); +} + +[data-theme=light] .transparent-effect-fallback { + color: #000; +}/*# sourceMappingURL=template.css.map */ \ No newline at end of file diff --git a/rss/css/template.css.map b/rss/css/template.css.map new file mode 100644 index 0000000..f4a29ae --- /dev/null +++ b/rss/css/template.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["template.css","template.scss","variables.scss","palette.scss"],"names":[],"mappings":"AAAA,gBAAgB;ACAhB;;;CAAA;ACAA,6BAAA;ACAA,4CAAA;ADKA;;8CAAA;AASA;;8CAAA;AAYA;;8CAAA;AAgBA;;8CAAA;AAcA;;8CAAA;AAUA;;8CAAA;AA2BA;;8CAAA;AAMA;EACE,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,uBAAA;EACA,iBAAA;EAGA,qCAAA;EACA,yBAAA;EAEA,WAAA;EACA,kBAAA;EACA,eAAA;EACA,kBAAA;EACA,iBAAA;EAEA,aAAA;EACA,iBAAA;EACA,qBAAA;EACA,kBAAA;EACA,uBAAA;EAEA,SAAA;EACA,oBAAA;EACA,qBAAA;EACA,qBAAA;EACA,uBAAA;EAEA,oCAAA;EACA,2BAAA;EACA,gDAAA;AF5EF;;AE+EA;EACE,kBAAA;EACA,wBAAA;EACA,yBAAA;EAEA,iBAAA;EACA,qBAAA;EACA,kBAAA;EACA,uBAAA;EAEA,oBAAA;EACA,qBAAA;EACA,qBAAA;EAEA,oCAAA;EACA,0CAAA;EACA,gDAAA;AF/EF;;AEkFA;;8CAAA;AAuBA;;8CAAA;AAiBA;;8CAAA;AAgCA;;8CAAA;AA8BA,gBAAA;AAgCA,WAAA;AAYA,eAAA;AAIA,YAAA;ADvSA;;8CAAA;AAGA;EAAc,iBAAA;ADmFd;;ACjFA;EACE,cAAA;ADoFF;;ACjFA;;8CAAA;AAIA,qBAAA;AACA;EACE,4CAAA;EACA,0CAAA;EACA,sDAAA;ADmFF;;AChFA,mBAAA;AACA;EACE,yCAAA,EAAA,cAAA;EACA,gDAAA;EACA,sDAAA;ADmFF;;AChFA;EACE,gBAAA;EACA,MAAA;EACA,YAAA;EAEA,2BAAA;EACA,mCAAA;EAEA,kCAAA;EACA,mDAAA;EACA,sCAAA;EAEA,+JACE;AD+EJ;;AC1EA,uBAAA;AACA;EACE,aAAA;EACA,mBAAA;EACA,8BAAA;EACA,SAAA;AD6EF;;AC1EA;EACE,aAAA;EACA,mBAAA;EACA,SAAA;EACA,YAAA;AD6EF;;AC1EA;EACE,aAAA;EACA,mBAAA;EACA,SAAA;EACA,cAAA;AD6EF;;AC1EA;;8CAAA;AAGA;EAAiB,aAAA;EAAe,mBAAA;EAAqB,SAAA;ADgFrD;;AC9EA;EACE,WAAA;EACA,YAAA;EACA,mBAAA;EACA,0LACE;EAGF,2CAAA;EACA,cAAA;AD8EF;;AC3EA;EAAa,aAAA;EAAe,sBAAA;EAAwB,YAAA;ADiFpD;;AC/EA;EACE,aAAA;EACA,mBAAA;EACA,SAAA;EACA,yBAAA;EACA,sBAAA;EACA,wBAAA;EACA,qBAAA;EACA,kBAAA;EACA,uJAAA;ADkFF;AChFE;EACE,+BAAA;EACA,uBAAA;EACA,2BAAA;ADkFJ;;AC9EA;EAAsC,qCAAA;ADkFtC;;AChFA;EACE,oCAAA;EACA,uBAAA;ADmFF;;AChFA;EACE,WAAA;EACA,kBAAA;EACA,YAAA;EACA,QAAA;EACA,UAAA;EACA,YAAA;EACA,2BAAA;EACA,oBAAA;EACA,0BAAA;ADmFF;;AChFA;;8CAAA;AAGA;EACE,qCAAA;EACA,gMACE;ADkFJ;;AC7EA;EACE,iMACE;AD+EJ;;AC1EA;EACE,aAAA;EACA,SAAA;EACA,gCAAA;AD6EF;AC3EE;EALF;IAMI,0BAAA;ED8EF;AACF;;AC3EA;EAAU,oBAAA;EAAsB,mBAAA;EAAqB,WAAA;ADiFrD;;AC/EA;EACE,kBAAA;EACA,wBAAA;EACA,oBAAA;EACA,oCAAA;EACA,uBAAA;EACA,0CAAA;ADkFF;;AC/EA,kCAAA;AACA;EACE,6BAAA;EACA,qCAAA;ADkFF;;AC/EA;;8CAAA;AAGA;EACE,sBAAA;EACA,yBAAA;EACA,kBAAA;EACA,wBAAA;ADkFF;;AC/EA;EACE,kBAAA;EACA,gBAAA;EACA,iBAAA;ADkFF;;AC/EA;EAAY,mBAAA;EAAqB,wBAAA;ADoFjC;;AClFA;;8CAAA;AAGA;EAAY,aAAA;EAAe,eAAA;EAAiB,WAAA;ADwF5C;;ACtFA;EACE,oBAAA;EACA,mBAAA;EACA,WAAA;EACA,wBAAA;EACA,oBAAA;EACA,qCAAA;EACA,6BAAA;EACA,wBAAA;EACA,eAAA;EACA,yBAAA;KAAA,sBAAA;UAAA,iBAAA;EACA,sMAAA;ADyFF;ACvFE;EACE,2BAAA;EACA,2CAAA;EACA,uBAAA;ADyFJ;ACtFE;EACE,oCAAA;EACA,sCAAA;EACA,uBAAA;ADwFJ;;ACpFA;;8CAAA;AAGA;EAAc,cAAA;ADwFd;;ACvFA;EAAkB,gBAAA;EAAkB,MAAA;EAAQ,UAAA;AD6F5C;;AC3FA,iDAAA;AACA;EAAmB,UAAA;EAAY,gBAAA;ADgG/B;;AC/FA;EAAqB,SAAA;ADmGrB;;AClGA;EAAuB,6BAAA;ADsGvB;;ACpGA;;8CAAA;AAGA;EACE,YAAA;EACA,uBAAA;EACA,iBAAA;EACA,cAAA;EACA,eAAA;EACA,wBAAA;EACA,uBAAA;EACA,qBAAA;EACA,uJAAA;ADuGF;ACrGE;EACE,+BAAA;EACA,uBAAA;EACA,2BAAA;ADuGJ;ACpGE;EAAW,wBAAA;ADuGb;;ACpGA;EAAuC,qCAAA;ADwGvC;;ACtGA;;;8CAAA;AAIA;EACE,YAAA;EACA,oBAAA;EACA,6BAAA;EACA,gBAAA;EACA,qCAAA;ADyGF;;ACtGA;EACE,YAAA;EACA,0BAAA;EACA,oBAAA;EACA,oDAAA;ADyGF;;ACtGA,uBAAA;AACA;EAAe,UAAA;AD0Gf;;ACzGA;EAAe,UAAA;AD6Gf;;AC5GA;EAAe,UAAA;ADgHf;;AC9GA,oCAAA;AACA;EAAqB,oCAAA;ADkHrB;;ACjHA;EAAqB,oCAAA;ADqHrB;;ACnHA;;8CAAA;AAGA;EAAO,oBAAA;ADuHP;;ACpHA;;8CAAA;AAIA;EACE,aAAA;EACA,WAAA;ADsHF;;ACnHA;EACE,aAAA;EACA,WAAA;EACA,oCAAA;ADsHF;ACpHE;EALF;IAMI,0BAAA;EDuHF;AACF;;ACpHA;EACE,aAAA;EACA,WAAA;EACA,gDAAA;ADuHF;ACrHE;EALF;IAMI,0BAAA;EDwHF;AACF;;ACrHA;EACE,aAAA;EACA,WAAA;EACA,gDAAA;ADwHF;ACtHE;EALF;IAMI,gDAAA;EDyHF;AACF;ACvHE;EATF;IAUI,0BAAA;ED0HF;AACF;;ACvHA;;8CAAA;AAIA;EACE,yGACE;EAEF,2CAAA;EACA,2EACE;EAEF,2BAAA;EACA,mCAAA;ADqHF;;AClHA;EACE,yGACE;EAEF,2CAAA;EACA,2EACE;ADkHJ;;AC9GA;EACE,gHACE;EAEF,0EACE;AD8GJ;;AC1GA;EACE,+GACE;EAEF,0EACE;AD0GJ;;ACtGA;EACE,4LACE;ADwGJ;;ACnGA;EACE,4LACE;ADqGJ;;AChGA;EACE,4LACE;ADkGJ;;AC7FA;EACE,2LACE;AD+FJ;;AC1FA;;8CAAA;AAIA;EACE,aAAA;EACA,uBAAA;EACA,8BAAA;EACA,SAAA;EACA,mBAAA;AD4FF;;ACzFA;EACE,aAAA;EACA,WAAA;EACA,eAAA;AD4FF;;ACzFA;;8CAAA;AAIA;EACE,kBAAA;EACA,gBAAA;EACA,0EACE;EAEF,wJACE;ADwFJ;;ACnFA;EACE,WAAA;EACA,kBAAA;EACA,oBAAA;EACA,WAAA;EACA,WAAA;EACA,gHAAA;EAMA,YAAA;ADiFF;;AC9EA;EACE,2BAAA;EACA,0EACE;ADgFJ;;AC5EA;EACE,0EACE;AD8EJ;;AC1EA;EACE,2EACE;AD4EJ;;ACxEA;;8CAAA;AAIA;EACE,aAAA;EACA,sBAAA;EACA,SAAA;AD0EF;;ACvEA;EACE,aAAA;EACA,qBC5aU;ED6aV,qCAAA;EACA,0GACE;EAEF,kFACE;EAGF,aAAA;EACA,sBAAA;EACA,WAAA;EACA,wJACE;ADoEJ;;AC/DA;EACE,2BAAA;EACA,oFACE;ADiEJ;;AC7DA;EACE,4GACE;EAEF,oFACE;AD6DJ;;ACzDA;EACE,oFACE;AD2DJ;;ACvDA;EACE,aAAA;EACA,mBAAA;EACA,8BAAA;EACA,WAAA;AD0DF;;ACvDA;EACE,aAAA;EACA,8BAAA;EACA,WAAA;EACA,mBAAA;EACA,wBAAA;AD0DF;ACxDE;EAPF;IAQI,sBAAA;ED2DF;AACF;;ACxDA;;8CAAA;AAIA;EACE,gBAAA;EACA,0EACE;ADyDJ;;ACrDA;EACE,0EACE;ADuDJ;;ACnDA;EACE,aAAA;EACA,mBAAA;EACA,8BAAA;EACA,SAAA;EACA,eAAA;EACA,4CAAA;ADsDF;ACpDE;EARF;IASI,sBAAA;IACA,uBAAA;EDuDF;AACF;;ACpDA;;8CAAA;AAIA;EACE,2CAAA;ADsDF;;ACnDA;;8CAAA;AAIA;EACE,uBAAA;EACA,aAAA;EACA,kCAAA;EACA,WAAA;EACA,oBAAA;EACA,mBAAA;ADqDF;;AClDA;EACE;IACE,0BAAA;EDqDF;AACF;AClDA;;8CAAA;AAIA;EACE,SAAA;EACA,iBAAA;EACA,uBAAA;EACA,aAAA;EACA,mBAAA;EACA,aAAA;EACA,iTACE;ADkDJ;;AC5CA;EACE,iTACE;AD8CJ;;ACxCA;EACE,eAAA;EACA,QAAA;EACA,oBAAA;EACA,YAAA;EACA,uBAAA;EACA,iNACE;EAEF,0BAAA;EACA,mBAAA;ADyCF;;ACtCA;;8CAAA;AAIA;EACE,eAAA;EACA,QAAA;EACA,oBAAA;EACA,YAAA;EACA,uBAAA;EACA,iNACE;EAEF,0BAAA;EACA,mBAAA;ADsCF;;ACnCA;EACE,aAAA;EACA,sBAAA;ADsCF;;ACnCA;;8CAAA;AAIA;EACE,0CAAA;EACA,yFAAA;EACA,mBAAA;EACA,2CAAA;EACA,gBAAA;EACA,kBAAA;ADqCF;;AClCA;EACE,mCAAA;EACA,mFAAA;EACA,2CAAA;ADqCF;;AClCA;;8CAAA;AAIA;EACE,kBAAA;EACA,aAAA;EACA,sBAAA;EACA,8BAAA;EACA,SAAA;EACA,uQACE;ADmCJ;;AC9BA;EACE,sQACE;ADgCJ;;AC3BA;EACE,SAAA;EACA,eAAA;EACA,uBAAA;AD8BF;;AC3BA;EACE,gBAAA;EACA,wBAAA;EACA,eAAA;AD8BF;;AC3BA;;8CAAA;AAIA;EACE,uBAAA;EACA,aAAA;EACA,mBAAA;EACA,8BAAA;EACA,SAAA;EACA,iDAAA;AD6BF;;AC1BA;EACE,0CAAA;AD6BF;;AC1BA;EACE,uBAAA;AD6BF;;AC1BA;;8CAAA;AAIA;EACE,YAAA;EACA,aAAA;EACA,sBAAA;EACA,gBAAA;AD4BF;;ACzBA;EACI,WAAA;EACA,YAAA;EACA,mBAAA;EACA,iCAAA;EACA,6IACI;EAEJ,yFACI;EAEJ,kBAAA;EACA,cAAA;EACA,aAAA;EACA,mBAAA;EACA,uBAAA;ADwBJ;;ACrBA;EACI,WAAA;EACA,WAAA;EACA,YAAA;EACA,iBAAA;EACA,4FAAA;EAUA,aAAA;EACA,iDAAA;ADeJ;;ACXA;EACI,WAAA;EACA,kBAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;EACA,kBAAA;EACA,WAAA;EACA,QAAA;EACA,2BAAA;EACA,4CAAA;ADcJ;;ACXA;EACE,eAAA;EACA,gBAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;ADcF;;ACXA;;8CAAA;AAIA;EACE,0CAAA;EACA,uBAAA;EACA,uBAAA;EACA,oBAAA;EACA,kBAAA;EACA,eAAA;EACA,sIACE;ADYJ;;ACPA;EACE,qCAAA;ADUF;;ACPA;EACE,0BAAA;ADUF;;ACPA;EACE,mCAAA;ADUF;;ACPA;EACE,kCAAA;ADUF;;ACPA;;8CAAA;AAIA;EACE,aAAA;EACA,SAAA;EACA,eAAA;EACA,gBAAA;ADSF;;ACNA,mDAAA;AACA;EACE,0CAAA;EACA,wBAAA;EACA,8BAAA;EACA,iBAAA;EACA,eAAA;EACA,oBAAA;EACA,QAAA;EACA,mBAAA;ADSF;;ACNA;EACE,mCAAA;EACA,qCAAA;ADSF;;ACNA;;8CAAA;AAIA;EACE,aAAA;EACA,QAAA;ADQF;;ACLA;EACE,kBAAA;EACA,0CAAA;EACA,mBAAA;EACA,8BAAA;EACA,gIACE;ADOJ;;ACFA;EACE,mCAAA;EACA,qCAAA;ADKF;;ACFA;EACE,4CAAA;EACA,oDAAA;ADKF;;ACFA;EACE,SAAA;EACA,uBAAA;EACA,gBAAA;EACA,YAAA;EACA,kBAAA;EACA,mBAAA;ADKF;;ACFA;;EAEE,SAAA;EACA,gBAAA;EACA,aAAA;ADKF;;ACFA;EACE,mBAAA;ADKF;;ACFA;;8CAAA;AAIA;EACE,kBAAA;EACA,UAAA;EACA,QAAA;EACA,2BAAA;EACA,0CAAA;EACA,qCAAA;EACA,uBAAA;EACA,mBAAA;EACA,iBAAA;EACA,eAAA;EACA,eAAA;EACA,qFACE;ADGJ;;ACCA;EACE,qCAAA;ADEF;;ACCA;EACE,uCAAA;ADEF;;ACCA;EACE,mCAAA;EACA,kCAAA;ADEF;;ACCA;EACE,kCAAA;ADEF;;ACCA;;8CAAA;AAIA;EACE,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,iBAAA;ADCF;;ACEA;EACE,gBAAA;EACA,aAAA;EACA,8BAAA;EACA,SAAA;EACA,eAAA;EACA,wBAAA;EACA,eAAA;EACA,8CAAA;EACA,iBAAA;ADCF;;ACEA;EACE,uCAAA;ADCF;;ACEA;EACE,+GAAA;ADCF;;ACEA;EACI,yFAAA;ADCJ;;ACEA;EACI,WAAA;ADCJ","file":"template.css"} \ No newline at end of file diff --git a/rss/css/template.scss b/rss/css/template.scss new file mode 100644 index 0000000..e7ddb53 --- /dev/null +++ b/rss/css/template.scss @@ -0,0 +1,999 @@ +/* templates.scss (drop-in) + App/demo templates and composed patterns. + Keep framework stuff in main.scss. +*/ +@use "sass:map"; +@use "./variables" as *; + +/* -------------------------------------------- + Demo shell + layout helpers +-------------------------------------------- */ +.demo-shell { min-height: 100vh; } + +.page { + margin: 0 auto; +} + +/* -------------------------------------------- + Topbar (glass, theme-aware via CSS vars) +-------------------------------------------- */ + +/* Defaults (light) */ +:root { + --topbar-glass-bg: rgba(255, 255, 255, 0.72); + --topbar-glass-border: rgba(0, 0, 0, 0.08); + --topbar-glass-shadow: 0 10px 24px rgba(0, 0, 0, 0.06); +} + +/* Dark overrides */ +[data-theme="dark"] { + --topbar-glass-bg: rgba(15, 23, 42, 0.62); /* slate-ish */ + --topbar-glass-border: rgba(255, 255, 255, 0.10); + --topbar-glass-shadow: 0 10px 24px rgba(0, 0, 0, 0.35); +} + +.topbar { + position: sticky; + top: 0; + z-index: map.get($z-index, "header"); + + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + + background: var(--topbar-glass-bg); + border-bottom: 1px solid var(--topbar-glass-border); + box-shadow: var(--topbar-glass-shadow); + + transition: + background-color $duration-base $standard, + border-color $duration-base $standard, + box-shadow $duration-base $standard; +} + +/* layout (unchanged) */ +.topbar-inner { + display: flex; + align-items: center; + justify-content: space-between; + gap: map.get($spacers, 3); +} + +.topbar-left { + display: flex; + align-items: center; + gap: map.get($spacers, 3); + min-width: 0; +} + +.topbar-right { + display: flex; + align-items: center; + gap: map.get($spacers, 3); + flex: 0 0 auto; +} + +/* -------------------------------------------- + Sidebar templates +-------------------------------------------- */ +.sidebar-brand { display: flex; align-items: center; gap: map.get($spacers, 3); } + +.brand-mark { + width: 38px; + height: 38px; + border-radius: 12px; + background: + radial-gradient(10px 10px at 30% 30%, rgba(255,255,255,0.55), transparent 60%), + radial-gradient(28px 28px at 70% 70%, rgba(0,0,0,0.08), transparent 55%), + var(--primary); + box-shadow: 0 10px 25px rgba(0,0,0,0.08); + flex: 0 0 auto; +} + +.nav-stack { display: flex; flex-direction: column; gap: 0.25rem; } + +.nav-item { + display: flex; + align-items: center; + gap: map.get($spacers, 3); + padding: 0.75rem 0.875rem; + border-radius: 0.75rem; + color: var(--text-muted); + text-decoration: none; + position: relative; + transition: background-color $duration-fast $standard, color $duration-fast $standard, transform $duration-fast $standard; + + &:hover { + background: rgba(0,0,0,0.04); + color: var(--text-main); + transform: translateY(-1px); + } +} + +[data-theme="dark"] .nav-item:hover { background: rgba(255,255,255,0.06); } + +.nav-item.is-active { + background: rgba(20,184,166,0.12); + color: var(--text-main); +} + +.nav-item.is-active::before { + content: ""; + position: absolute; + left: 0.4rem; + top: 50%; + width: 6px; + height: 18px; + transform: translateY(-50%); + border-radius: 999px; + background: var(--primary); +} + +/* -------------------------------------------- + Hero +-------------------------------------------- */ +.hero-pro { + border: 1px solid var(--border-color); + background: + radial-gradient(700px 260px at 15% 0%, rgba(20,184,166,0.22), transparent 60%), + radial-gradient(520px 240px at 90% 20%, rgba(249,115,22,0.10), transparent 55%), + var(--bg-card); +} + +[data-theme="dark"] .hero-pro { + background: + radial-gradient(700px 260px at 15% 0%, rgba(20,184,166,0.16), transparent 60%), + radial-gradient(520px 240px at 90% 20%, rgba(249,115,22,0.08), transparent 55%), + var(--bg-card); +} + +.hero-grid { + display: grid; + gap: map.get($spacers, 3); + grid-template-columns: 1.4fr 1fr; + + @media (max-width: 992px) { + grid-template-columns: 1fr; + } +} + +.kicker { display: inline-flex; align-items: center; gap: map.get($spacers, 2); } + +.pill { + font-size: 0.75rem; + padding: 0.15rem 0.55rem; + border-radius: 999px; + background: rgba(20,184,166,0.12); + color: var(--text-main); + border: 1px solid rgba(20,184,166,0.18); +} + +/* Card variant used inside hero */ +.card-quick { + background: var(--bg-surface); + border: 1px solid var(--border-color); +} + +/* -------------------------------------------- + Stat cards +-------------------------------------------- */ +.stat-title { + letter-spacing: 0.05em; + text-transform: uppercase; + font-size: 0.75rem; + color: var(--text-light); +} + +.stat-value { + font-size: 1.85rem; + font-weight: 700; + margin: 0.35rem 0; +} + +.stat-sub { font-size: 0.875rem; color: var(--text-muted); } + +/* -------------------------------------------- + Chips / filters +-------------------------------------------- */ +.chip-row { display: flex; flex-wrap: wrap; gap: map.get($spacers, 2); } + +.chip { + display: inline-flex; + align-items: center; + gap: map.get($spacers, 2); + padding: 0.35rem 0.65rem; + border-radius: 999px; + border: 1px solid var(--border-color); + background: var(--bg-surface); + color: var(--text-muted); + cursor: pointer; + user-select: none; + transition: transform $duration-fast $standard, box-shadow $duration-base $standard, background-color $duration-fast $standard, color $duration-fast $standard; + + &:hover { + transform: translateY(-1px); + box-shadow: 0 10px 22px rgba(0,0,0,0.08); + color: var(--text-main); + } + + &.is-active { + background: rgba(20,184,166,0.12); + border-color: rgba(20,184,166,0.18); + color: var(--text-main); + } +} + +/* -------------------------------------------- + Table polish for dashboard use +-------------------------------------------- */ +.table-wrap { overflow: auto; } +.table thead th { position: sticky; top: 0; z-index: 1; } + +/* Better look for “table inside card with p-0” */ +.card.table-card { padding: 0; overflow: hidden; } +.table-card .table { margin: 0; } +.table-card thead th { background: var(--bg-surface); } + +/* -------------------------------------------- + Modal close button +-------------------------------------------- */ +.btn-close { + border: none; + background: transparent; + font-size: 1.5rem; + line-height: 1; + cursor: pointer; + color: var(--text-muted); + padding: 0.25rem 0.5rem; + border-radius: 0.5rem; + transition: background-color $duration-fast $standard, color $duration-fast $standard, transform $duration-fast $standard; + + &:hover { + background: rgba(0,0,0,0.06); + color: var(--text-main); + transform: translateY(-1px); + } + + &:active { transform: translateY(0); } +} + +[data-theme="dark"] .btn-close:hover { background: rgba(255,255,255,0.08); } + +/* -------------------------------------------- + Progress bars (replace inline styles) + Use:
+-------------------------------------------- */ +.progress { + height: 10px; + border-radius: 999px; + background: var(--bg-surface); + overflow: hidden; + border: 1px solid var(--border-color); +} + +.progress-bar { + height: 100%; + background: var(--primary); + border-radius: 999px; + transition: width $duration-slow $standard; +} + +/* Common demo widths */ +.progress-72 { width: 72%; } +.progress-46 { width: 46%; } +.progress-25 { width: 25%; } + +/* Variant colors used in pipeline */ +.progress-bar.soft { background: rgba(20,184,166,0.55); } +.progress-bar.warn { background: rgba(249,115,22,0.55); } + +/* -------------------------------------------- + Tiny helper you used in demo +-------------------------------------------- */ +.m-0 { margin: 0 !important; } + + +/* -------------------------------------------- + Dashboard / panel layout patterns +-------------------------------------------- */ + +.panel-grid { + display: grid; + gap: map.get($spacers, 4); +} + +.panel-grid-2 { + display: grid; + gap: map.get($spacers, 4); + grid-template-columns: 1.15fr 0.85fr; + + @media (max-width: 992px) { + grid-template-columns: 1fr; + } +} + +.panel-grid-3 { + display: grid; + gap: map.get($spacers, 4); + grid-template-columns: repeat(3, minmax(0, 1fr)); + + @media (max-width: 992px) { + grid-template-columns: 1fr; + } +} + +.panel-grid-4 { + display: grid; + gap: map.get($spacers, 4); + grid-template-columns: repeat(4, minmax(0, 1fr)); + + @media (max-width: 1200px) { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + @media (max-width: 768px) { + grid-template-columns: 1fr; + } +} + +/* -------------------------------------------- + Rich panel surfaces +-------------------------------------------- */ + +.panel-glass { + background: + linear-gradient(180deg, rgba(255,255,255,0.78), rgba(255,255,255,0.58)), + var(--bg-card); + border: 1px solid rgba(255,255,255,0.35); + box-shadow: + 0 14px 34px rgba(0,0,0,0.07), + 0 2px 10px rgba(0,0,0,0.04); + backdrop-filter: blur(14px); + -webkit-backdrop-filter: blur(14px); +} + +[data-theme="dark"] .panel-glass { + background: + linear-gradient(180deg, rgba(255,255,255,0.05), rgba(255,255,255,0.02)), + var(--bg-card); + border: 1px solid rgba(255,255,255,0.08); + box-shadow: + 0 18px 40px rgba(0,0,0,0.28), + 0 2px 10px rgba(0,0,0,0.16); +} + +.panel-soft { + background: + radial-gradient(120% 140% at 0% 0%, rgba(var(--primary-rgb), 0.08), transparent 55%), + var(--bg-card); + box-shadow: + 0 12px 28px rgba(0,0,0,0.06), + 0 2px 8px rgba(0,0,0,0.04); +} + +[data-theme="dark"] .panel-soft { + background: + radial-gradient(120% 140% at 0% 0%, rgba(var(--primary-rgb), 0.10), transparent 55%), + var(--bg-card); + box-shadow: + 0 16px 34px rgba(0,0,0,0.22), + 0 2px 8px rgba(0,0,0,0.14); +} + +.panel-tint-teal { + background: + radial-gradient(700px 220px at 12% 0%, rgba(20,184,166,0.18), transparent 58%), + linear-gradient(180deg, rgba(255,255,255,0.72), rgba(255,255,255,0.54)), + var(--bg-card); +} + +.panel-tint-orange { + background: + radial-gradient(640px 220px at 90% 0%, rgba(249,115,22,0.16), transparent 58%), + linear-gradient(180deg, rgba(255,255,255,0.72), rgba(255,255,255,0.54)), + var(--bg-card); +} + +[data-theme="dark"] .panel-tint-teal { + background: + radial-gradient(700px 220px at 12% 0%, rgba(20,184,166,0.12), transparent 58%), + linear-gradient(180deg, rgba(255,255,255,0.04), rgba(255,255,255,0.02)), + var(--bg-card); +} + +[data-theme="dark"] .panel-tint-orange { + background: + radial-gradient(640px 220px at 90% 0%, rgba(249,115,22,0.10), transparent 58%), + linear-gradient(180deg, rgba(255,255,255,0.04), rgba(255,255,255,0.02)), + var(--bg-card); +} + +/* -------------------------------------------- + Card headers / actions +-------------------------------------------- */ + +.card-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: map.get($spacers, 3); + margin-bottom: map.get($spacers, 3); +} + +.card-actions { + display: flex; + gap: map.get($spacers, 2); + flex-wrap: wrap; +} + +/* -------------------------------------------- + KPI cards +-------------------------------------------- */ + +.metric-card { + position: relative; + overflow: hidden; + box-shadow: + 0 12px 28px rgba(0,0,0,0.06), + 0 2px 8px rgba(0,0,0,0.04); + transition: + transform $duration-base $standard, + box-shadow $duration-base $standard, + border-color $duration-base $standard; +} + +.metric-card::before { + content: ""; + position: absolute; + inset: 0 auto auto 0; + width: 100%; + height: 3px; + background: linear-gradient( + 90deg, + rgba(20,184,166,0.95), + rgba(34,211,238,0.75), + rgba(249,115,22,0.75) + ); + opacity: 0.9; +} + +.metric-card:hover { + transform: translateY(-2px); + box-shadow: + 0 18px 40px rgba(0,0,0,0.10), + 0 4px 12px rgba(0,0,0,0.05); +} + +[data-theme="dark"] .metric-card { + box-shadow: + 0 18px 38px rgba(0,0,0,0.22), + 0 2px 8px rgba(0,0,0,0.12); +} + +[data-theme="dark"] .metric-card:hover { + box-shadow: + 0 22px 46px rgba(0,0,0,0.28), + 0 4px 12px rgba(0,0,0,0.16); +} + +/* -------------------------------------------- + Module / list panels +-------------------------------------------- */ + +.module-list { + display: flex; + flex-direction: column; + gap: map.get($spacers, 3); +} + +.module-item { + padding: map.get($spacers, 3); + border-radius: $radius-md; + border: 1px solid var(--border-color); + background: + linear-gradient(180deg, rgba(255,255,255,0.50), rgba(255,255,255,0.20)), + var(--bg-surface); + box-shadow: + inset 0 1px 0 rgba(255,255,255,0.20), + 0 8px 18px rgba(0,0,0,0.04); + + display: flex; + flex-direction: column; + gap: 0.5rem; + transition: + transform $duration-fast $standard, + box-shadow $duration-base $standard, + border-color $duration-base $standard; +} + +.module-item:hover { + transform: translateY(-1px); + box-shadow: + inset 0 1px 0 rgba(255,255,255,0.24), + 0 14px 24px rgba(0,0,0,0.07); +} + +[data-theme="dark"] .module-item { + background: + linear-gradient(180deg, rgba(255,255,255,0.03), rgba(255,255,255,0.01)), + var(--bg-surface); + box-shadow: + inset 0 1px 0 rgba(255,255,255,0.04), + 0 10px 22px rgba(0,0,0,0.18); +} + +[data-theme="dark"] .module-item:hover { + box-shadow: + inset 0 1px 0 rgba(255,255,255,0.06), + 0 14px 28px rgba(0,0,0,0.24); +} + +.module-item-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: map.get($spacers, 2); +} + +.module-meta { + display: flex; + justify-content: space-between; + gap: map.get($spacers, 2); + font-size: 0.875rem; + color: var(--text-muted); + + @media (max-width: 576px) { + flex-direction: column; + } +} + +/* -------------------------------------------- + Table shell polish +-------------------------------------------- */ + +.table-shell { + overflow: hidden; + box-shadow: + 0 14px 30px rgba(0,0,0,0.06), + 0 2px 8px rgba(0,0,0,0.04); +} + +[data-theme="dark"] .table-shell { + box-shadow: + 0 18px 36px rgba(0,0,0,0.22), + 0 2px 8px rgba(0,0,0,0.14); +} + +.table-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: map.get($spacers, 3); + padding: map.get($spacers, 4); + border-bottom: 1px solid var(--border-color); + + @media (max-width: 768px) { + flex-direction: column; + align-items: flex-start; + } +} + +/* -------------------------------------------- + Sidebar surface polish +-------------------------------------------- */ + +.sidebar.panel-glass { + border-right: 1px solid var(--border-color); +} + +/* -------------------------------------------- + Split hero / form shell +-------------------------------------------- */ + +.split-shell { + width: min(980px, 100%); + display: grid; + grid-template-columns: 1.1fr 0.9fr; + gap: map.get($spacers, 4); + align-items: stretch; + margin-inline: auto; +} + +@media (max-width: 860px) { + .split-shell { + grid-template-columns: 1fr; + } +} + +/* -------------------------------------------- + Ambient full-page body skin +-------------------------------------------- */ + +body.surface-ambient { + margin: 0; + min-height: 100vh; + color: var(--text-main); + display: grid; + place-items: center; + padding: 28px; + background: + radial-gradient(1200px 700px at 15% 10%, rgba(2,207,204,.18), transparent 55%), + radial-gradient(900px 600px at 95% 25%, rgba(16,183,255,.16), transparent 55%), + radial-gradient(700px 480px at 50% 95%, rgba(124,58,237,.12), transparent 55%), + linear-gradient(180deg, #070a0f, #0b1220); +} + +html[data-theme="light"] body.surface-ambient { + background: + radial-gradient(1200px 700px at 15% 10%, rgba(2,207,204,.18), transparent 55%), + radial-gradient(900px 600px at 95% 25%, rgba(16,183,255,.16), transparent 55%), + radial-gradient(700px 480px at 50% 95%, rgba(124,58,237,.12), transparent 55%), + linear-gradient(180deg, #f4f7fb, #eaf0f8); +} + +.surface-noise { + position: fixed; + inset: 0; + pointer-events: none; + opacity: .10; + mix-blend-mode: overlay; + background-image: + linear-gradient(transparent 0 48%, rgba(255,255,255,.06) 48% 52%, transparent 52% 100%), + linear-gradient(90deg, transparent 0 48%, rgba(255,255,255,.05) 48% 52%, transparent 52% 100%); + background-size: 38px 38px; + filter: blur(.2px); +} + +/* -------------------------------------------- + Tech texture overlay +-------------------------------------------- */ + +.surface-noise { + position: fixed; + inset: 0; + pointer-events: none; + opacity: 0.10; + mix-blend-mode: overlay; + background-image: + linear-gradient(transparent 0 48%, rgba(255,255,255,0.06) 48% 52%, transparent 52% 100%), + linear-gradient(90deg, transparent 0 48%, rgba(255,255,255,0.05) 48% 52%, transparent 52% 100%); + background-size: 38px 38px; + filter: blur(.2px); +} + +[data-theme="light"] .surface-noise { + opacity: 0.06; + mix-blend-mode: normal; +} + +/* -------------------------------------------- + Rich glass panel +-------------------------------------------- */ + +.panel-frame { + border: 1px solid rgba(255,255,255,0.10); + background: linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.08)); + border-radius: 22px; + box-shadow: 0 30px 80px rgba(0,0,0,0.55); + overflow: hidden; + position: relative; +} + +[data-theme="light"] .panel-frame { + border-color: rgba(10,20,40,0.10); + background: linear-gradient(180deg, rgba(10,20,40,0.06), rgba(10,20,40,0.08)); + box-shadow: 0 30px 80px rgba(0,0,0,0.18); +} + +/* -------------------------------------------- + Section hero panel +-------------------------------------------- */ + +.panel-hero { + padding: 34px 30px; + display: flex; + flex-direction: column; + justify-content: space-between; + gap: 18px; + background: + radial-gradient(520px 320px at 25% 25%, rgba(var(--primary-rgb), 0.18), transparent 60%), + radial-gradient(540px 340px at 90% 20%, rgba(16,183,255,0.14), transparent 55%), + linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.03)); +} + +[data-theme="light"] .panel-hero { + background: + radial-gradient(520px 320px at 25% 25%, rgba(var(--primary-rgb), 0.12), transparent 60%), + radial-gradient(540px 340px at 90% 20%, rgba(16,183,255,0.10), transparent 55%), + linear-gradient(180deg, rgba(255,255,255,0.45), rgba(255,255,255,0.22)); +} + +.panel-hero h1 { + margin: 0; + font-size: 34px; + letter-spacing: -0.02em; +} + +.panel-hero p { + margin: 10px 0 0; + color: var(--text-muted); + max-width: 52ch; +} + +/* -------------------------------------------- + Panel header / body +-------------------------------------------- */ + +.panel-bar { + padding: 26px 26px 18px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 14px; + border-bottom: 1px solid rgba(255,255,255,0.10); +} + +[data-theme="light"] .panel-bar { + border-bottom-color: rgba(10,20,40,0.10); +} + +.panel-body { + padding: 24px 26px 26px; +} + +/* -------------------------------------------- + Brand pieces +-------------------------------------------- */ + +.brand-stack { + min-width: 0; + display: flex; + flex-direction: column; + line-height: 1.1; +} + +.mark { + width: 44px; + height: 44px; + border-radius: 12px; + /* Using your Teal/Blue palette */ + background: + radial-gradient(circle at 30% 30%, rgba(255, 255, 255, 0.35), transparent 65%), + linear-gradient(135deg, #02CFCC 0%, #10b7ff 100%); + box-shadow: + 0 8px 24px rgba(2, 207, 204, 0.25), + inset 0 0 0 1px rgba(255, 255, 255, 0.15); + position: relative; + flex: 0 0 auto; + display: flex; + align-items: center; + justify-content: center; +} + +.mark::before { + content: ""; + width: 20px; + height: 20px; + background: white; + clip-path: polygon( + 100% 20%, + 100% 0%, + 0% 0%, + 0% 100%, + 100% 100%, + 100% 80%, + 25% 80%, + 25% 20% + ); + opacity: 0.95; + filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1)); +} + + +.mark::after { + content: ""; + position: absolute; + width: 6px; + height: 6px; + background: white; + border-radius: 50%; + right: 12px; + top: 50%; + transform: translateY(-50%); + box-shadow: 0 0 8px rgba(255, 255, 255, 0.6); +} + +.headline { + font-size: 18px; + font-weight: 700; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* -------------------------------------------- + Quiet action button +-------------------------------------------- */ + +.btn-quiet { + border: 1px solid rgba(255,255,255,0.10); + background: transparent; + color: var(--text-main); + border-radius: 999px; + padding: 10px 12px; + cursor: pointer; + transition: + transform .08s ease, + border-color $duration-fast $standard, + background-color $duration-fast $standard; +} + +.btn-quiet:hover { + background: rgba(255,255,255,0.05); +} + +.btn-quiet:active { + transform: translateY(1px); +} + +[data-theme="light"] .btn-quiet { + border-color: rgba(10,20,40,0.10); +} + +[data-theme="light"] .btn-quiet:hover { + background: rgba(10,20,40,0.04); +} + +/* -------------------------------------------- + Meta pills row +-------------------------------------------- */ + +.meta-row { + display: flex; + gap: 12px; + flex-wrap: wrap; + margin-top: 18px; +} + +/* override/extend existing .pill use nicely here */ +.pill.soft { + border: 1px solid rgba(255,255,255,0.10); + color: var(--text-muted); + background: rgba(0,0,0,0.10); + padding: 8px 10px; + font-size: 12px; + display: inline-flex; + gap: 8px; + align-items: center; +} + +[data-theme="light"] .pill.soft { + border-color: rgba(10,20,40,0.10); + background: rgba(255,255,255,0.35); +} + +/* -------------------------------------------- + Form field shell +-------------------------------------------- */ + +.field { + display: grid; + gap: 8px; +} + +.control { + position: relative; + border: 1px solid rgba(255,255,255,0.10); + border-radius: 16px; + background: rgba(0,0,0,0.10); + transition: + border-color $duration-fast $standard, + box-shadow $duration-fast $standard, + transform .08s ease; +} + +[data-theme="light"] .control { + border-color: rgba(10,20,40,0.10); + background: rgba(255,255,255,0.45); +} + +.control:focus-within { + border-color: rgba(var(--primary-rgb), 0.55); + box-shadow: 0 0 0 4px rgba(var(--primary-rgb), 0.18); +} + +.control > .input { + border: 0; + background: transparent; + box-shadow: none; + height: auto; + padding: 14px 14px; + border-radius: 16px; +} + +.control > .input:focus, +.control > .input:focus-visible { + border: 0; + box-shadow: none; + outline: none; +} + +.control.has-action > .input { + padding-right: 78px; +} + +/* -------------------------------------------- + Inline action in field +-------------------------------------------- */ + +.control-action { + position: absolute; + right: 8px; + top: 50%; + transform: translateY(-50%); + border: 1px solid rgba(255,255,255,0.10); + background: rgba(255,255,255,0.04); + color: var(--text-main); + border-radius: 12px; + padding: 8px 10px; + cursor: pointer; + font-size: 12px; + transition: + background-color $duration-fast $standard, + transform .08s ease; +} + +.control-action:hover { + background: rgba(255,255,255,0.08); +} + +.control-action:active { + transform: translateY(calc(-50% + 1px)); +} + +[data-theme="light"] .control-action { + border-color: rgba(10,20,40,0.10); + background: rgba(10,20,40,0.04); +} + +[data-theme="light"] .control-action:hover { + background: rgba(10,20,40,0.08); +} + +/* -------------------------------------------- + Subtext / tiny footer +-------------------------------------------- */ + +.subtext { + margin-top: 10px; + color: var(--text-muted); + font-size: 13px; + line-height: 1.45; +} + +.panel-foot { + margin-top: 18px; + display: flex; + justify-content: space-between; + gap: 12px; + flex-wrap: wrap; + color: var(--text-muted); + font-size: 12px; + border-top: 1px solid rgba(255,255,255,0.10); + padding-top: 14px; +} + +[data-theme="light"] .panel-foot { + border-top-color: rgba(10,20,40,0.10); +} + +.mono { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +.transparent-effect-fallback{ + background: linear-gradient(180deg, rgb(255 255 255 / 6%), rgb(255 255 255 / 2%)); +} + +[data-theme="light"] .transparent-effect-fallback{ + color: #000; +} \ No newline at end of file diff --git a/rss/css/theme.css b/rss/css/theme.css new file mode 100644 index 0000000..7d1cb95 --- /dev/null +++ b/rss/css/theme.css @@ -0,0 +1 @@ +/*# sourceMappingURL=theme.css.map */ \ No newline at end of file diff --git a/rss/css/theme.css.map b/rss/css/theme.css.map new file mode 100644 index 0000000..cbf5d8e --- /dev/null +++ b/rss/css/theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":[],"names":[],"mappings":"","file":"theme.css"} \ No newline at end of file diff --git a/rss/css/theme.scss b/rss/css/theme.scss new file mode 100644 index 0000000..e69de29 diff --git a/rss/css/variables.css b/rss/css/variables.css new file mode 100644 index 0000000..591ce49 --- /dev/null +++ b/rss/css/variables.css @@ -0,0 +1,83 @@ +/* variables.scss (drop-in) */ +/* palette.scss - Full Spectrum Master Map */ +/* -------------------------------------------- + Helpers +-------------------------------------------- */ +/* -------------------------------------------- + Breakpoints +-------------------------------------------- */ +/* -------------------------------------------- + Spacing +-------------------------------------------- */ +/* -------------------------------------------- + Elevation +-------------------------------------------- */ +/* -------------------------------------------- + Radius +-------------------------------------------- */ +/* -------------------------------------------- + Typography +-------------------------------------------- */ +/* -------------------------------------------- + Theme tokens +-------------------------------------------- */ +:root { + /* Brand */ + --primary: #0f766e; + --primary-light: #ccfbf1; + --primary-dark: #042f2e; + --accent: #f97316; + /* RGB channels for focus rings etc */ + --primary-rgb: 15 118 110; + /* Status */ + --success: #16a34a; + --info: #0d6efd; + --warning: #eab308; + --danger: #dc2626; + /* Surfaces */ + --bg-app: #fbfcfd; + --bg-surface: #f8f9fa; + --bg-card: #ffffff; + --border-color: #e9ecef; + /* Text */ + --text-main: #212529; + --text-muted: #495057; + --text-light: #adb5bd; + --text-inverse: #ffffff; + --table-header-bg: var(--bg-surface); + --table-striped-bg: #fbfcfd; + --table-hover-bg: rgba(var(--primary-rgb), 0.06); +} + +[data-theme=dark] { + --primary: #5eead4; + --primary-light: #115e59; + --primary-rgb: 94 234 212; + --bg-app: #121416; + --bg-surface: #212529; + --bg-card: #343a40; + --border-color: #495057; + --text-main: #f8f9fa; + --text-muted: #ced4da; + --text-light: #6c757d; + --table-header-bg: var(--bg-surface); + --table-striped-bg: rgba(255,255,255,0.03); + --table-hover-bg: rgba(var(--primary-rgb), 0.10); +} + +/* -------------------------------------------- + SASS aliases to CSS vars +-------------------------------------------- */ +/* -------------------------------------------- + Z-index +-------------------------------------------- */ +/* -------------------------------------------- + Grid & layout maps +-------------------------------------------- */ +/* -------------------------------------------- + Components baseline tokens +-------------------------------------------- */ +/* sizing maps */ +/* motion */ +/* focus ring */ +/* sidebar *//*# sourceMappingURL=variables.css.map */ \ No newline at end of file diff --git a/rss/css/variables.css.map b/rss/css/variables.css.map new file mode 100644 index 0000000..5741a7d --- /dev/null +++ b/rss/css/variables.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["variables.scss","palette.scss","variables.css"],"names":[],"mappings":"AAAA,6BAAA;ACAA,4CAAA;ADKA;;8CAAA;AASA;;8CAAA;AAYA;;8CAAA;AAgBA;;8CAAA;AAcA;;8CAAA;AAUA;;8CAAA;AA2BA;;8CAAA;AAMA;EACE,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,uBAAA;EACA,iBAAA;EAGA,qCAAA;EACA,yBAAA;EAEA,WAAA;EACA,kBAAA;EACA,eAAA;EACA,kBAAA;EACA,iBAAA;EAEA,aAAA;EACA,iBAAA;EACA,qBAAA;EACA,kBAAA;EACA,uBAAA;EAEA,SAAA;EACA,oBAAA;EACA,qBAAA;EACA,qBAAA;EACA,uBAAA;EAEA,oCAAA;EACA,2BAAA;EACA,gDAAA;AEjFF;;AFoFA;EACE,kBAAA;EACA,wBAAA;EACA,yBAAA;EAEA,iBAAA;EACA,qBAAA;EACA,kBAAA;EACA,uBAAA;EAEA,oBAAA;EACA,qBAAA;EACA,qBAAA;EAEA,oCAAA;EACA,0CAAA;EACA,gDAAA;AEpFF;;AFuFA;;8CAAA;AAuBA;;8CAAA;AAiBA;;8CAAA;AAgCA;;8CAAA;AA8BA,gBAAA;AAgCA,WAAA;AAYA,eAAA;AAIA,YAAA","file":"variables.css"} \ No newline at end of file diff --git a/rss/css/variables.scss b/rss/css/variables.scss new file mode 100644 index 0000000..10164c6 --- /dev/null +++ b/rss/css/variables.scss @@ -0,0 +1,305 @@ +/* variables.scss (drop-in) */ +@use "sass:map"; +@use "sass:color"; +@use "./palette" as *; + +/* -------------------------------------------- + Helpers +-------------------------------------------- */ +@function rgb-channels($c) { + @return #{color.channel($c, "red", $space: rgb)} + #{color.channel($c, "green", $space: rgb)} + #{color.channel($c, "blue", $space: rgb)}; +} + +/* -------------------------------------------- + Breakpoints +-------------------------------------------- */ +$breakpoints: ( + "xs": 0, + "sm": 576px, + "md": 768px, + "lg": 992px, + "xl": 1200px, + "xxl": 1400px +); + +/* -------------------------------------------- + Spacing +-------------------------------------------- */ +$spacer: 1rem; + +$spacers: ( + 0: 0, + 1: $spacer * 0.25, + 2: $spacer * 0.5, + 3: $spacer, + 4: $spacer * 1.5, + 5: $spacer * 2, + 6: $spacer * 3, + 7: $spacer * 4 +); + +/* -------------------------------------------- + Elevation +-------------------------------------------- */ +$elevation: ( + 0: none, + 1: (0 2px 1px -1px rgba(0,0,0,.2), 0 1px 1px 0 rgba(0,0,0,.14), 0 1px 3px 0 rgba(0,0,0,.12)), + 2: (0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12)), + 4: (0 2px 4px -1px rgba(0,0,0,.2), 0 4px 5px 0 rgba(0,0,0,.14), 0 1px 10px 0 rgba(0,0,0,.12)), + 8: (0 5px 5px -3px rgba(0,0,0,.2), 0 8px 10px 1px rgba(0,0,0,.14), 0 3px 14px 2px rgba(0,0,0,.12)), + 12:(0 7px 8px -4px rgba(0,0,0,.2), 0 12px 17px 2px rgba(0,0,0,.14), 0 5px 22px 4px rgba(0,0,0,.12)), + 16:(0 8px 10px -5px rgba(0,0,0,.2), 0 16px 24px 2px rgba(0,0,0,.14), 0 6px 30px 5px rgba(0,0,0,.12)), + 24:(0 11px 15px -7px rgba(0,0,0,.2), 0 24px 38px 3px rgba(0,0,0,.14), 0 9px 46px 8px rgba(0,0,0,.12)) +); + +/* -------------------------------------------- + Radius +-------------------------------------------- */ +$radius-none: 0; +$radius-sm: 0.25rem; +$radius-md: 0.5rem; +$radius-lg: 1rem; +$radius-xl: 1.5rem; +$radius-pill: 50rem; + +/* -------------------------------------------- + Typography +-------------------------------------------- */ +$font-family-sans: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif; +$font-family-alt: "Poppins", sans-serif; + +$weight-light: 300; +$weight-normal: 400; +$weight-medium: 500; +$weight-bold: 700; + +$font-sizes: ( + "h1": 2.5rem, + "h2": 2rem, + "h3": 1.75rem, + "h4": 1.5rem, + "h5": 1.25rem, + "h6": 1rem, + "body": 1rem, + "small": 0.875rem, + "xs": 0.75rem +); + +$line-height-tight: 1.2; +$line-height-base: 1.5; +$line-height-loose: 1.8; + +/* -------------------------------------------- + Theme tokens +-------------------------------------------- */ +$primary-color: map.get(map.get($colors, "teal"), 700); +$primary-color-dark: map.get(map.get($colors, "teal"), 300); + +:root { + /* Brand */ + --primary: #{$primary-color}; + --primary-light: #{map.get(map.get($colors, "teal"), 100)}; + --primary-dark: #{map.get(map.get($colors, "teal"), 950)}; + --accent: #{map.get(map.get($colors, "orange"), 500)}; + + + /* RGB channels for focus rings etc */ + --primary-rgb: #{rgb-channels($primary-color)}; + + /* Status */ + --success: #{map.get(map.get($colors, "green"), 600)}; + --info: #{map.get(map.get($colors, "blue"), 500)}; + --warning: #{map.get(map.get($colors, "yellow"), 500)}; + --danger: #{map.get(map.get($colors, "red"), 600)}; + + /* Surfaces */ + --bg-app: #{map.get(map.get($colors, "gray"), 50)}; + --bg-surface: #{map.get(map.get($colors, "gray"), 100)}; + --bg-card: #{$white}; + --border-color: #{map.get(map.get($colors, "gray"), 200)}; + + /* Text */ + --text-main: #{map.get(map.get($colors, "gray"), 900)}; + --text-muted: #{map.get(map.get($colors, "gray"), 700)}; + --text-light: #{map.get(map.get($colors, "gray"), 500)}; + --text-inverse: #{$white}; + + --table-header-bg: var(--bg-surface); + --table-striped-bg: #{map.get(map.get($colors, "gray"), 50)}; + --table-hover-bg: rgba(var(--primary-rgb), 0.06); +} + +[data-theme="dark"] { + --primary: #{$primary-color-dark}; + --primary-light: #{map.get(map.get($colors, "teal"), 800)}; + --primary-rgb: #{rgb-channels($primary-color-dark)}; + + --bg-app: #{map.get(map.get($colors, "gray"), 950)}; + --bg-surface: #{map.get(map.get($colors, "gray"), 900)}; + --bg-card: #{map.get(map.get($colors, "gray"), 800)}; + --border-color: #{map.get(map.get($colors, "gray"), 700)}; + + --text-main: #{map.get(map.get($colors, "gray"), 100)}; + --text-muted: #{map.get(map.get($colors, "gray"), 400)}; + --text-light: #{map.get(map.get($colors, "gray"), 600)}; + + --table-header-bg: var(--bg-surface); + --table-striped-bg: rgba(255,255,255,0.03); + --table-hover-bg: rgba(var(--primary-rgb), 0.10); +} + +/* -------------------------------------------- + SASS aliases to CSS vars +-------------------------------------------- */ +$primary: var(--primary); +$primary-light: var(--primary-light); +$primary-dark: var(--primary-dark); +$accent: var(--accent); + +$success: var(--success); +$info: var(--info); +$warning: var(--warning); +$danger: var(--danger); + +$bg-app: var(--bg-app); +$bg-surface: var(--bg-surface); +$bg-card: var(--bg-card); +$border-color: var(--border-color); + +$text-main: var(--text-main); +$text-muted: var(--text-muted); +$text-light: var(--text-light); +$text-inverse: var(--text-inverse); + +/* -------------------------------------------- + Z-index +-------------------------------------------- */ +$z-index: ( + "deep": -1, + "default": 1, + "sticky": 100, + "sidebar": 200, + "header": 300, + "backdrop": 400, + "modal": 500, + "dropdown": 600, + "popover": 700, + "tooltip": 800, + "toast": 900 +); + +/* -------------------------------------------- + Grid & layout maps +-------------------------------------------- */ +$container-max-widths: ( + "sm": 540px, + "md": 720px, + "lg": 960px, + "xl": 1140px, + "xxl": 1320px +); + +$grid-columns: 12; +$grid-gutter-width: map.get($spacers, 3); + +$flex-directions: (row, row-reverse, column, column-reverse); +$justify-content: ( + "start": flex-start, + "end": flex-end, + "center": center, + "between": space-between, + "around": space-around, + "evenly": space-evenly +); +$align-items: ( + "start": flex-start, + "end": flex-end, + "center": center, + "baseline": baseline, + "stretch": stretch +); +$display-values: (none, block, inline, inline-block, flex, inline-flex, grid); + +/* -------------------------------------------- + Components baseline tokens +-------------------------------------------- */ +$input-height: 2.5rem; +$input-height-sm: 2rem; +$input-height-lg: 3.25rem; + +$input-padding-y: map.get($spacers, 2); +$input-padding-x: map.get($spacers, 3); + +$label-margin-bottom: map.get($spacers, 1); +$label-font-size: map.get($font-sizes, "small"); +$label-font-weight: $weight-medium; + +$card-padding: map.get($spacers, 4); +$card-border-width: 1px; +$card-border-radius: $radius-md; + +$table-cell-padding-y: map.get($spacers, 3); +$table-cell-padding-x: map.get($spacers, 3); +$table-header-bg: var(--table-header-bg); +$table-header-color: $text-muted; +$table-striped-bg: var(--table-striped-bg); +$table-hover-bg: var(--table-hover-bg); + +$scrollbar-width: 8px; +$scrollbar-track: map.get(map.get($colors, "gray"), 100); +$scrollbar-thumb: map.get(map.get($colors, "gray"), 300); +$scrollbar-thumb-hover: map.get(map.get($colors, "gray"), 400); + +/* sizing maps */ +$sizes: ( + 25: 25%, + 33: 33.33%, + 50: 50%, + 66: 66.66%, + 75: 75%, + 100: 100%, + "auto": auto, + "screen-v": 100vh, + "screen-h": 100vw +); + +$spacing-properties: ("m": "margin", "p": "padding"); +$spacing-sides: ( + "t": "top", + "b": "bottom", + "s": "start", + "e": "end", + "x": ("left", "right"), + "y": ("top", "bottom"), + "a": "" +); + +$object-fits: (contain, cover, fill, scale-down); +$aspect-ratios: ( + "1x1": 100%, + "4x3": 75%, + "16x9": 56.25%, + "21x9": 42.85% +); + +/* motion */ +$standard: cubic-bezier(0.4, 0, 0.2, 1); +$duration-fast: 150ms; +$duration-base: 250ms; +$duration-slow: 400ms; + +$hover-brightness: 95%; +$active-brightness: 90%; + +$hover-lift: translateY(-2px); +$hover-shadow: map.get($elevation, 4); + +/* focus ring */ +$focus-ring-width: 3px; +$focus-ring-color: rgba(var(--primary-rgb), 0.35); + +/* sidebar */ +$sidebar-width: 280px; +$sidebar-collapsed: 84px; diff --git a/rss/js/main.js b/rss/js/main.js new file mode 100644 index 0000000..49ff00b --- /dev/null +++ b/rss/js/main.js @@ -0,0 +1,910 @@ +/* ============================================================ + VOR Bootstrap / Globals +============================================================ */ +window.VOR = window.VOR || {}; +VOR.locale = VOR.locale ?? 'en-US'; +VOR.currency = VOR.currency ?? 'EUR'; + +/* ============================================================ + Network / API +============================================================ */ +VOR.post = async function (data = {}, target, method, opts = {}) { + const { + url = "/rss/php/handler.php", + timeoutMs = 15000, + credentials = "same-origin", + } = opts; + + if (!target || !method) { + return { ok: false, error: "Missing target/method" }; + } + + const fd = new FormData(); + + const append = (k, v) => { + if (v === undefined || v === null) return; + + if (v instanceof File || v instanceof Blob) { + fd.append(k, v); + return; + } + + if (v instanceof FileList) { + for (const f of v) fd.append(k, f); + return; + } + + if (Array.isArray(v)) { + for (const item of v) append(`${k}[]`, item); + return; + } + + if (typeof v === "object") { + fd.append(k, JSON.stringify(v)); + return; + } + + fd.append(k, String(v)); + }; + + for (const [k, v] of Object.entries(data || {})) { + append(k, v); + } + + fd.append("target", target); + fd.append("method", method); + + const ctrl = timeoutMs ? new AbortController() : null; + const t = timeoutMs ? setTimeout(() => ctrl.abort(), timeoutMs) : null; + + try { + const res = await fetch(url, { + method: "POST", + body: fd, + credentials, + signal: ctrl?.signal, + }); + + try { + const resp = await res.json(); + + if (!res.ok) { + return { + ok: false, + error: resp?.message || `HTTP ${res.status}`, + status: res.status, + raw: resp, + }; + } + + if (!resp || typeof resp !== "object") { + return { + ok: false, + error: "Bas json response", + status: res.status, + }; + } + + if (resp.status == "success") { + return { + ok: true, + data: resp.message, + status: res.status, + raw: resp, + }; + } + + return { + ok: false, + error: resp.message ?? "Failed", + status: res.status, + raw: resp, + }; + } catch (err) { + return { ok: false, error: "Could not parse JSON", status: res.status }; + } + } catch (errno) { + const msg = + errno?.name === "AbortError" ? "Timeout" : errno?.message || String(errno); + return { ok: false, error: msg }; + } finally { + if (t) clearTimeout(t); + } +}; + +/* ============================================================ + UI: Table +============================================================ */ +VOR.uiTable = function ({ + el, + headers = [], + data = [], + sortable = true, + emptyText = "No data", + classArr = ["table"], + editRenderer = null, +} = {}) { + const container = typeof el === "string" ? document.querySelector(el) : el; + if (!container) return; + + VOR.clearHtml(container); + + const table = VOR.createEl("table", classArr); + const thead = VOR.createEl("thead"); + const tbody = VOR.createEl("tbody"); + + let sortState = { key: null, dir: "asc" }; + let openEditorRow = null; + + function closeEditor() { + if (openEditorRow) { + openEditorRow.remove(); + openEditorRow = null; + } + } + + function sortData(rows) { + if (!sortable || !sortState.key) return rows; + + return [...rows].sort((a, b) => { + const v1 = a[sortState.key]; + const v2 = b[sortState.key]; + + if (v1 === v2) return 0; + if (v1 == null) return 1; + if (v2 == null) return -1; + + if (typeof v1 === "number" && typeof v2 === "number") { + return sortState.dir === "asc" ? v1 - v2 : v2 - v1; + } + + return sortState.dir === "asc" + ? String(v1).localeCompare(String(v2)) + : String(v2).localeCompare(String(v1)); + }); + } + + function expandRow(tr, rowData) { + if (openEditorRow && openEditorRow.previousSibling === tr) { + closeEditor(); + return; + } + + closeEditor(); + + if (typeof editRenderer !== "function") return; + + const editorTr = VOR.createEl("tr", ["row-editor"]); + const td = VOR.createEl("td", null, null, { colspan: headers.length }); + + const content = editRenderer(rowData); + if (content instanceof HTMLElement) td.append(content); + + editorTr.append(td); + tr.after(editorTr); + openEditorRow = editorTr; + } + + function renderBody(rows) { + VOR.clearHtml(tbody); + closeEditor(); + + if (!rows.length) { + const tr = VOR.createEl("tr"); + const td = VOR.createEl("td", ["empty"], emptyText, { + colspan: headers.length, + }); + tr.append(td); + tbody.append(tr); + return; + } + + rows.forEach((row) => { + const tr = VOR.createEl("tr"); + + headers.forEach((h) => { + const td = VOR.createEl("td"); + const value = row[h.key]; + + if (h.action) { + const btn = VOR.createEl( + "button", + ["table-action", `is-${h.action}`], + h.format && typeof h.format === "function" + ? h.format(value, row) + : value ?? "" + ); + + btn.addEventListener("click", (e) => { + e.stopPropagation(); + + switch (h.action) { + case "visit": + if (h.actionConfig?.url) { + const url = h.actionConfig.url(row); + if (url) window.location.href = url; + } + break; + + case "toggle": + if (h.actionConfig?.selector) { + const sel = h.actionConfig.selector(row); + if (sel) VOR.uiToggle(sel, true); + } + break; + + case "edit-expand": + expandRow(tr, row); + break; + } + }); + + td.append(btn); + } else { + const text = + h.format && typeof h.format === "function" + ? h.format(value, row) + : value ?? ""; + td.append(document.createTextNode(text)); + } + + tr.append(td); + }); + + tbody.append(tr); + }); + } + + function renderHeader() { + const tr = VOR.createEl("tr"); + + headers.forEach((h) => { + const th = VOR.createEl( + "th", + sortable && h.sortable !== false ? ["sortable"] : null, + h.label + ); + + if (sortable && h.sortable !== false) { + th.addEventListener("click", () => { + closeEditor(); + + if (sortState.key === h.key) { + sortState.dir = sortState.dir === "asc" ? "desc" : "asc"; + } else { + sortState.key = h.key; + sortState.dir = "asc"; + } + + renderBody(sortData(data)); + }); + } + + tr.append(th); + }); + + thead.append(tr); + } + + renderHeader(); + renderBody(data); + + table.append(thead, tbody); + container.append(table); +}; + +/* ============================================================ + State Store +============================================================ */ +VOR.state = (function () { + const store = {}; + + return { + set(key, value) { + store[key] = value; + }, + get(key) { + return store[key]; + }, + update(key, fn) { + if (typeof fn === "function") { + store[key] = fn(store[key]); + } + }, + remove(key) { + delete store[key]; + }, + }; +})(); + +/* ============================================================ + UI: Alerts / Confirm / Form / Dropdown / Pagination / Badge +============================================================ */ +VOR.uiAlert = function (message, type = "info", timeout = 4000) { + let container = document.querySelector(".vor-alert-stack"); + if (!container) { + container = VOR.createEl("div", ["vor-alert-stack"]); + document.body.append(container); + } + + const alert = VOR.createEl("div", ["vor-alert", `is-${type}`]); + alert.append(document.createTextNode(message)); + + container.append(alert); + + setTimeout(() => { + alert.remove(); + if (!container.children.length) container.remove(); + }, timeout); +}; + +VOR.uiConfirm = function ({ + title = "Confirm", + text = "", + confirmLabel = "Confirm", + cancelLabel = "Cancel", + onConfirm = null, +} = {}) { + const overlay = VOR.createEl("div", ["modal-overlay", "is-active"]); + overlay.setAttribute("aria-hidden", "false"); + + const content = VOR.createEl("div", ["modal-content", "vor-modal-sm"]); + + const header = VOR.createEl("div", ["modal-header"]); + const titleEl = VOR.createEl("h3", ["modal-title"], title); + const closeBtn = VOR.createEl("button", ["btn-close"], "×", { + type: "button", + "aria-label": "Close" + }); + + closeBtn.addEventListener("click", () => { + overlay.remove(); + document.body.classList.remove("lock-scroll"); + }); + + header.append(titleEl, closeBtn); + + const body = VOR.createEl("div", ["modal-body"]); + body.append(VOR.createEl("p", null, text)); + + const footer = VOR.createEl("div", ["modal-footer"]); + + const cancelBtn = VOR.createEl("button", ["btn-gray-light"], cancelLabel, { + type: "button" + }); + + const confirmBtn = VOR.createEl("button", ["btn-red"], confirmLabel, { + type: "button" + }); + + cancelBtn.addEventListener("click", () => { + overlay.remove(); + document.body.classList.remove("lock-scroll"); + }); + + confirmBtn.addEventListener("click", () => { + if (typeof onConfirm === "function") onConfirm(); + overlay.remove(); + document.body.classList.remove("lock-scroll"); + }); + + footer.append(cancelBtn, confirmBtn); + content.append(header, body, footer); + overlay.append(content); + document.body.append(overlay); + document.body.classList.add("lock-scroll"); +}; + +VOR.uiForm = function ({ fields = [], actions = [] } = {}) { + const form = VOR.createEl("form", ["vor-form"]); + + fields.forEach((f) => { + const group = VOR.createEl("div", ["form-group"]); + + if (f.label) { + group.append(VOR.createEl("label", null, f.label)); + } + + const input = VOR.createInput({ + type: f.type || "text", + name: f.name, + value: f.value ?? null, + options: f.options ?? null, + classArr: ["input"], + }); + + group.append(input); + form.append(group); + }); + + if (actions.length) { + const actionWrap = VOR.createEl("div", ["form-actions"]); + + actions.forEach((a) => { + const btn = VOR.createEl( + "button", + ["btn", a.variant ? `is-${a.variant}` : null].filter(Boolean), + a.label, + { type: a.type || "button" } + ); + + if (a.onClick) btn.addEventListener("click", a.onClick); + actionWrap.append(btn); + }); + + form.append(actionWrap); + } + + return form; +}; + +VOR.uiDropdown = function ({ trigger, items = [] } = {}) { + const menu = VOR.createEl("div", ["vor-dropdown"]); + + items.forEach((i) => { + const item = VOR.createEl("div", ["dropdown-item"], i.label); + + item.addEventListener("click", () => { + if (typeof i.action === "function") i.action(); + menu.remove(); + }); + + menu.append(item); + }); + + document.body.append(menu); + + const rect = trigger.getBoundingClientRect(); + menu.style.position = "absolute"; + menu.style.top = `${rect.bottom + window.scrollY}px`; + menu.style.left = `${rect.left + window.scrollX}px`; + + document.addEventListener("click", () => menu.remove(), { once: true }); +}; + +VOR.uiPagination = function ({ page = 1, totalPages = 1, onChange = null } = {}) { + const wrap = VOR.createEl("div", ["vor-pagination"]); + + for (let i = 1; i <= totalPages; i++) { + const btn = VOR.createEl( + "button", + ["page-btn", i === page ? "is-active" : null].filter(Boolean), + i + ); + + btn.addEventListener("click", () => { + if (typeof onChange === "function") onChange(i); + }); + + wrap.append(btn); + } + + return wrap; +}; + +VOR.uiBadge = function (text, type = "neutral") { + return VOR.createEl("span", ["badge", `is-${type}`], text); +}; + +/* ============================================================ + UI: Loading / Field Errors / Empty State +============================================================ */ +VOR.uiLoader = function (el, state = true) { + if (!el) return; + + if (state) { + el.dataset.originalText = el.textContent; + el.textContent = "Loading..."; + el.disabled = true; + } else { + el.textContent = el.dataset.originalText || ""; + el.disabled = false; + } +}; + +VOR.uiFieldError = function (formEl, errors = {}) { + if (!formEl) return; + + formEl.querySelectorAll(".field-error").forEach((e) => e.remove()); + + Object.entries(errors).forEach(([name, msg]) => { + const field = formEl.querySelector(`[name="${name}"]`); + if (!field) return; + + const err = VOR.createEl("div", ["field-error"], msg); + field.closest(".form-group")?.append(err); + }); +}; + +VOR.uiEmpty = function ({ title = "", text = "", action = null } = {}) { + const wrap = VOR.createEl("div", ["vor-empty"]); + + if (title) wrap.append(VOR.createEl("h3", null, title)); + if (text) wrap.append(VOR.createEl("p", null, text)); + + if (action) { + const btn = VOR.createEl("button", ["btn"], action.label); + btn.addEventListener("click", action.onClick); + wrap.append(btn); + } + + return wrap; +}; + +/* ============================================================ + DOM Helpers +============================================================ */ +VOR.createEl = function (tag, classArr = null, text = null, attrs = null) { + const el = document.createElement(tag); + + if (text !== null && text !== undefined) { + el.append(document.createTextNode(String(text))); + } + + if (classArr?.length) { + el.classList.add(...classArr); + } + + if (attrs) { + for (const [k, v] of Object.entries(attrs)) { + if (v === null || v === undefined) continue; + + if (k.startsWith("data-")) { + el.setAttribute(k, String(v)); + } else if (k.startsWith("on") && typeof v === "function") { + el.addEventListener(k.slice(2), v); + } else if (k in el) { + el[k] = v; + } else { + el.setAttribute(k, String(v)); + } + } + } + + return el; +}; + +VOR.createInput = function ({ + type = "text", + classArr = null, + placeholder = "", + options = null, + name, + id = null, + dataset = null, + value = null, +} = {}) { + if (!name) { + throw new Error("Create input: Name is required"); + } + + const el = + type === "select" ? VOR.createEl("select", classArr) : VOR.createEl("input", classArr); + + el.name = name; + + if (id) el.id = id; + + if (dataset) { + for (const [k, v] of Object.entries(dataset)) { + if (v !== undefined && v !== null) el.dataset[k] = String(v); + } + } + + if (type !== "select") { + el.type = type; + + if (placeholder && !["checkbox", "radio", "hidden"].includes(type)) { + el.placeholder = placeholder; + } + + if (["checkbox", "radio"].includes(type)) { + if (value === true) { + el.checked = true; + } else if (value !== null && value !== undefined) { + el.value = String(value); + } + } else if (value !== null && value !== undefined) { + el.value = String(value); + } + } else if (options) { + for (const [val, txt] of Object.entries(options)) { + const opt = document.createElement("option"); + opt.value = String(val); + opt.textContent = String(txt); + + if (value !== null && value !== undefined && String(val) === String(value)) { + opt.selected = true; + } + + el.appendChild(opt); + } + } + + return el; +}; + +VOR.clearHtml = function (el) { + if (!el) return el; + el.replaceChildren(); + return el; +}; + +VOR.getDefaultId = function () { + const id = window.location.pathname.replace(/\/$/, "").split("/").pop(); + const num = parseInt(id, 10); + return Number.isFinite(num) ? num : null; +}; + +VOR.getRandomId = function () { + return crypto?.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2); +}; + +VOR.prettyNum = function ( + val, + { type = "decimal", locale = VOR.locale, currency = VOR.currency } = {} +) { + if (val === null || val === undefined || val === "") return ""; + + const opts = { style: type }; + if (type === "currency") opts.currency = currency; + + const n = typeof val === "string" ? Number(val) : val; + return new Intl.NumberFormat(locale, opts).format(n); +}; + +/* ============================================================ + Theme / Modals / Toggles +============================================================ */ +VOR.uiGetTheme = function () { + const t = document.documentElement.getAttribute("data-theme"); + return t === "dark" || t === "light" ? t : "light"; +}; + +VOR.uiSetTheme = function (theme = "light") { + const next = theme === "dark" ? "dark" : "light"; + document.documentElement.setAttribute("data-theme", next); + localStorage.setItem("vor_theme", next); +}; + +VOR.uiToggleTheme = function () { + const next = VOR.uiGetTheme() === "dark" ? "light" : "dark"; + VOR.uiSetTheme(next); +}; + +VOR.uiCloseAllModals = function () { + document.querySelectorAll(".modal-overlay.is-active").forEach((m) => { + m.classList.remove("is-active"); + m.setAttribute("aria-hidden", "true"); + }); + document.body.classList.remove("lock-scroll"); +}; + +VOR.uiToggle = function (selector, forceState = null) { + const el = document.querySelector(selector); + if (!el) return; + + const isDrawer = el.classList.contains("drawer"); + const isModal = el.classList.contains("modal-overlay"); + + const activeClass = isDrawer ? "is-open" : "is-active"; + + const nextState = forceState !== null ? !!forceState : !el.classList.contains(activeClass); + + el.classList.toggle(activeClass, nextState); + el.setAttribute("aria-hidden", nextState ? "false" : "true"); + + if (isModal) { + document.body.classList.toggle("lock-scroll", nextState); + } +}; + +/* ============================================================ + Global Event Wiring +============================================================ */ +VOR.initGlobalEvents = function () { + const app = document.body; + + app.addEventListener("click", (e) => { + const toggleBtn = e.target.closest("[data-toggle]"); + if (toggleBtn) { + const sel = toggleBtn.dataset.toggle; + if (sel) VOR.uiToggle(sel); + return; + } + + const themeBtn = e.target.closest("[data-theme-toggle]"); + if (themeBtn) { + const v = (themeBtn.dataset.themeToggle || "").trim(); + if (v === "light" || v === "dark") { + VOR.uiSetTheme(v); + } else { + VOR.uiToggleTheme(); + } + return; + } + + const accordionHeader = e.target.closest(".accordion-header"); + if (accordionHeader) { + const item = accordionHeader.closest(".accordion-item"); + if (item) item.classList.toggle("is-active"); + return; + } + + const chip = e.target.closest("[data-chip]"); + if (chip) { + const scope = chip.parentElement || document; + scope + .querySelectorAll("[data-chip].is-active") + .forEach((c) => c.classList.remove("is-active")); + chip.classList.add("is-active"); + return; + } + + const modalOverlay = e.target.closest(".modal-overlay"); + if (modalOverlay && modalOverlay.classList.contains("is-active")) { + if (e.target.closest(".modal-content")) return; + + modalOverlay.classList.remove("is-active"); + modalOverlay.setAttribute("aria-hidden", "true"); + document.body.classList.remove("lock-scroll"); + return; + } + + const drawerModal = e.target.closest(".drawer-modal"); + if (drawerModal && drawerModal.classList.contains("is-active")) { + if (e.target.closest(".drawer-panel")) return; + if (drawerModal.dataset.closeBackdrop === "0") return; + + VOR.uiDrawerModalClose(drawerModal); + return; + } + }); + + document.addEventListener("keydown", (e) => { + if (e.key !== "Escape") return; + + const openModal = document.querySelector(".modal-overlay.is-active"); + if (openModal) { + openModal.classList.remove("is-active"); + openModal.setAttribute("aria-hidden", "true"); + if (!document.querySelector(".modal-overlay.is-active, .drawer-modal.is-active")) { + document.body.classList.remove("lock-scroll"); + } + return; + } + + const openDrawerModal = document.querySelector(".drawer-modal.is-active"); + if (openDrawerModal) { + if (openDrawerModal.dataset.closeEsc === "0") return; + VOR.uiDrawerModalClose(openDrawerModal); + return; + } + + const openDrawer = document.querySelector(".drawer.is-open"); + if (openDrawer) { + openDrawer.classList.remove("is-open"); + openDrawer.setAttribute("aria-hidden", "true"); + } + + }); +}; + +/* ============================================================ + UI: Drawer Modal (off-canvas modal) +============================================================ */ +VOR.uiDrawerModalOpen = function ({ + id = "vor-drawer-modal", + title = "", + content = null, + side = "right", + width = null, + onClose = null, + closeOnBackdrop = true, + closeOnEsc = true, + showHeader = true, + showFooter = false, + footer = null, +} = {}) { + + const existing = document.getElementById(id); + if (existing) existing.remove(); + + const overlay = VOR.createEl("div", ["drawer-modal"], null, { + id, + "data-modal-type": "drawer", + "data-close-backdrop": closeOnBackdrop ? "1" : "0", + "data-close-esc": closeOnEsc ? "1" : "0", + }); + + if (side === "left") overlay.classList.add("is-left"); + + const panel = VOR.createEl("div", ["drawer-panel"]); + if (width) panel.style.width = String(width); + + if (showHeader) { + const header = VOR.createEl("div", ["drawer-panel-header"]); + + const h = VOR.createEl("div"); + if (title) h.append(VOR.createEl("div", ["h5"], title)); + + const closeBtn = VOR.createEl("button", ["btn-close"], "×", { + type: "button", + "aria-label": "Close", + "data-drawer-close": "1", + }); + + header.append(h, closeBtn); + panel.append(header); + } + + const body = VOR.createEl("div", ["drawer-panel-body"]); + + if (content instanceof HTMLElement) { + body.append(content); + } else if (typeof content === "string") { + body.innerHTML = content; + } else { + } + + panel.append(body); + + if (showFooter) { + const foot = VOR.createEl("div", ["drawer-panel-footer"]); + if (footer instanceof HTMLElement) foot.append(footer); + else if (typeof footer === "string") foot.innerHTML = footer; + panel.append(foot); + } + + overlay.append(panel); + document.body.append(overlay); + document.body.classList.add("lock-scroll"); + + requestAnimationFrame(() => { + overlay.classList.add("is-active"); + }); + + overlay.addEventListener("click", (e) => { + if (e.target.closest("[data-drawer-close]")) { + VOR.uiDrawerModalClose(id, onClose); + } + }); + + overlay.__vorOnClose = typeof onClose === "function" ? onClose : null; + + setTimeout(() => { + const focusable = panel.querySelector( + 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])' + ); + focusable?.focus?.(); + }, 0); + + return { overlay, panel, body }; +}; + +VOR.uiDrawerModalClose = function (id = "vor-drawer-modal", onClose = null) { + const overlay = typeof id === "string" ? document.getElementById(id) : id; + if (!overlay) return; + + + overlay.classList.remove("is-active"); + + const cb = typeof onClose === "function" ? onClose : overlay.__vorOnClose; + + setTimeout(() => { + overlay.remove(); + if (!document.querySelector(".modal-overlay.is-active, .drawer-modal.is-active")) { + document.body.classList.remove("lock-scroll"); + } + if (typeof cb === "function") cb(); + }, 180); +}; + +/* ============================================================ + Boot +============================================================ */ +document.addEventListener("DOMContentLoaded", () => { + const savedTheme = localStorage.getItem("vor_theme"); + VOR.uiSetTheme(savedTheme === "dark" ? "dark" : "light"); + VOR.initGlobalEvents(); +}); \ No newline at end of file diff --git a/rss/json/config/groups.json b/rss/json/config/groups.json new file mode 100644 index 0000000..ec8fadf --- /dev/null +++ b/rss/json/config/groups.json @@ -0,0 +1,8 @@ +{ + "owner": { + "home": "dashboard" + }, + "user": { + "home": "home" + } +} \ No newline at end of file diff --git a/rss/json/config/migrations.json b/rss/json/config/migrations.json new file mode 100644 index 0000000..3432432 --- /dev/null +++ b/rss/json/config/migrations.json @@ -0,0 +1,5 @@ +{ + "1": [ + "CREATE TABLE IF NOT EXISTS users (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50), email VARCHAR(90), password TEXT)" + ] +} \ No newline at end of file diff --git a/rss/json/pages/404.json b/rss/json/pages/404.json new file mode 100644 index 0000000..e22d0d3 --- /dev/null +++ b/rss/json/pages/404.json @@ -0,0 +1,27 @@ +{ + "layout": { + "header": "default", + "body": "index", + "footer": "default", + "template": "main_layout" + }, + "meta": { + "title": "404", + "description": "Template", + "robots": "noindex, nofollow", + "og_image": "" + }, + "rules": { + "restricted": false, + "redirect_login": "/login/", + "login_restricted": false, + "login_redirect": "" + }, + "init": [], + "scripts": [], + "modals": [""], + "rich_data": { + "type": "", + "price": "0" + } +} \ No newline at end of file diff --git a/rss/json/pages/index.json b/rss/json/pages/index.json new file mode 100644 index 0000000..70b8799 --- /dev/null +++ b/rss/json/pages/index.json @@ -0,0 +1,27 @@ +{ + "layout": { + "header": "default", + "body": "index", + "footer": "default", + "template": "main_layout" + }, + "meta": { + "title": "template", + "description": "Template", + "robots": "noindex, nofollow", + "og_image": "" + }, + "rules": { + "restricted": true, + "redirect_login": "/login/", + "login_restricted": false, + "login_redirect": "" + }, + "init": [], + "scripts": [{"name": "app.js", "type": "module"}, {"name": "test.js", "type": "script"}], + "modals": [""], + "rich_data": { + "type": "", + "price": "0" + } +} \ No newline at end of file diff --git a/rss/php/autoload.php b/rss/php/autoload.php new file mode 100644 index 0000000..c32ed55 --- /dev/null +++ b/rss/php/autoload.php @@ -0,0 +1,22 @@ + $pageScript, 'type' => 'module']; + } + + foreach(($conf['scripts'] ?? []) as $s){ + if($src = self::getScriptPath($s)){ + $validatedScripts[] = ['src' => $src, 'type' => $s['type'] == 'module' ? 'module' : 'text/javascript']; + } + } + + return [ + 'header' => BASE . "/rss/php/views/headers/" . ($conf['layout']['header'] ?? 'default') . ".php", + 'view' => BASE . "/rss/php/views/pages/$pageName.php", + 'footer' => BASE . "/rss/php/views/footers/" . ($conf['layout']['footer'] ?? 'default') . ".php", + 'data' => self::clean($viewData), + 'scripts' => $validatedScripts, + 'conf' => $conf + ]; + } + + private static function validate($c) { + $restricted = $c['rules']['restricted'] ?? false; + if (!$restricted) return true; + + return $_SERVER['VOR_AUTH']; + } + + private static function authRedirect($c){ + $loginRestricted = $c['rules']['login_restricted'] ?? false; + if($loginRestricted && isset($_SERVER['VOR_AUTH'])){ + header('location: ' . $c['rules']['login_redirect'] ?? '/'); + exit(); + } + } + + private static function execute($f) { + $className = "\\Vor\\application\\" . $f['class']; + + if (class_exists($className)) { + $instance = new $className(); + $method = $f['function']; + + if (method_exists($instance, $method)) { + return $instance->$method(); + } + } + return null; + } + + public static function clean($data){ + if(is_array($data)){ + return array_map([self::class, 'clean'], $data); + } + return htmlspecialchars(trim((string)$data), ENT_QUOTES, 'UTF-8'); + } + + public static function loadScripts($conf) { + if (isset($conf['scripts']) && is_array($conf['scripts'])) { + foreach ($conf['scripts'] as $script) { + echo '' . PHP_EOL; + } + } + } + + public static function getScriptPath($script){ + $folder = ($script['type'] ?? '') === 'module' ? 'modules' : 'scripts'; + $name = $script['name']; + $path = "/rss/js/$folder/$name"; + + return file_exists(BASE . $path) ? $path : null; + } + } \ No newline at end of file diff --git a/rss/php/classes/application/user/Auth.php b/rss/php/classes/application/user/Auth.php new file mode 100644 index 0000000..67cb195 --- /dev/null +++ b/rss/php/classes/application/user/Auth.php @@ -0,0 +1,63 @@ +email) && isset($this->password)){ + $userData = Main::select('users', ['email', 'username', 'password', 'id'], ['email' => trim($this->email)]); + if(!$userData){ + return false; + } + + if(password_verify($this->password, $userData['password'])){ + $sid = bin2hex(random_bytes(16)); + + $payload = [ + 'uid' => (int)$userData['id'], + 'sid' => $sid, + 'exp' => time() + 86400 + ]; + + if(Sys::cookieSet('v_auth', $payload)){ + Sys::validateSession($sid); + + Sys::session('uid', (int)$userData['id']); + Sys::session('logged_in_at', time()); + + return true; + } + } + } + + return false; + } + + public function logout(){ + Sys::cookieClear('v_auth'); + if(session_status() === PHP_SESSION_ACTIVE){ + session_unset(); + session_destroy(); + } + + return true; + } + } +?> \ No newline at end of file diff --git a/rss/php/classes/core/Main.php b/rss/php/classes/core/Main.php new file mode 100644 index 0000000..9b74358 --- /dev/null +++ b/rss/php/classes/core/Main.php @@ -0,0 +1,212 @@ +prepare($query); + foreach($data as $key => $val){ + $stmt->bindValue(':' . $key, $val); + } + + if($stmt->execute()){ + return $db->lastInsertId(); + } + }catch(Exception $e) { + error_log($e->getMessage()); + return false; + } + } + + public static function update($table, $data, $where, $whitelist = []){ + if(!self::assertIdent($table)){ + throw new \InvalidArgumentException('Invalid table name'); + } + + $db = Sys::getConnection(); + if(!empty($whitelist)){ + $data = array_intersect_key($data, array_flip($whitelist)); + } + + if(empty($data)){ + return false; + } + + $setParts = []; + $whereParts = []; + + // Set + foreach($data as $key => $val){ + $setParts[] = "$key = :$key"; + } + $setSql = implode(', ', $setParts); + + // Where + foreach($where as $key => $val){ + $whereParts[] = "$key = :w_$key"; + } + + $whereSql = implode(' AND ', $whereParts); + $query = "UPDATE $table SET $setSql WHERE $whereSql"; + + try{ + $stmt = $db->prepare($query); + foreach($data as $key => $val){ + $stmt->bindValue(':' . $key, $val); + } + + foreach($where as $key => $val){ + $stmt->bindValue(':w_' . $key, $val); + } + + return $stmt->execute(); + }catch(Exception $e){ + error_log($e->getMessage()); + return false; + } + } + + public static function select($table, $list = [], $where = [], $multiple = false, $assoc = true){ + if(!self::assertIdent($table)){ + throw new \InvalidArgumentException('Invalid table name'); + } + + foreach($list as $col){ + if(!self::assertIdent($col)){ + throw new \InvalidArgumentException('Invalid where name'); + } + } + + foreach($where as $k => $_){ + if(!self::assertIdent($k)){ + throw new \InvalidArgumentException('Invalid where key'); + } + } + + $db = Sys::getConnection(); + + if(empty($list)){ + $query = "SELECT * FROM $table"; + }else{ + $querySelect = implode(', ', $list); + $query = "SELECT $querySelect FROM $table"; + } + + if(!empty($where)){ + $whereParts = []; + foreach($where as $key => $val){ + $whereParts[] = "$key = :w_$key"; + } + + $whereSql = implode(' AND ', $whereParts); + $query .= " WHERE $whereSql"; + } + + try{ + $stmt = $db->prepare($query); + foreach($where as $key => $val){ + $stmt->bindValue(':w_' . $key, $val); + } + + if($stmt->execute()){ + $mode = $assoc ? PDO::FETCH_ASSOC : PDO::FETCH_COLUMN; + return $multiple ? $stmt->fetchAll($mode) : $stmt->fetch($mode); + } + return false; + }catch(Exception $e){ + error_log($e->getMessage()); + return false; + } + } + + public static function query($sql, $params = [], $multiple = true, $assoc = true){ + $db = Sys::getConnection(); + try{ + $stmt = $db->prepare($sql); + if(!empty($params)){ + foreach($params as $key => $val){ + $stmt->bindValue(':' . $key, $val); + } + } + if($stmt->execute()){ + $mode = $assoc ? PDO::FETCH_ASSOC : PDO::FETCH_COLUMN; + return $multiple ? $stmt->fetchAll($mode) : $stmt->fetch($mode); + } + return false; + }catch(Exception $e){ + error_log($e->getMessage()); + return false; + } + } + + public static function curl($url, $data = [], $headers = []){ + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + + if(!empty($data)){ + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + $headers[] = 'Content-Type: application/json'; + } + + if(!empty($headers)){ + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + } + + try{ + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $error = curl_error($ch); + + if($error){ + error_log('Curl erro: ' . $error); + return false; + } + + return [ + 'status' => $httpCode, + 'body' => json_decode($response, true) ?? $response + ]; + }catch(Exception $e){ + error_log($e->getMessage()); + return false; + } + } + + public static function assertIdent($s){ + return is_string($s) && preg_match('/^[a-zA-Z0-9_]+$/', $s); + } +} \ No newline at end of file diff --git a/rss/php/classes/core/Sys.php b/rss/php/classes/core/Sys.php new file mode 100644 index 0000000..68a816e --- /dev/null +++ b/rss/php/classes/core/Sys.php @@ -0,0 +1,539 @@ + PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + PDO::ATTR_PERSISTENT => true // Remember to validate max connections + ]); + + self::validateMigration(); + } catch (Exception $e) { + error_log($e->getMessage()); + return false; + } + } else { + return false; + } + } + + private static function validateDBEnv(){ + return (getenv('DB_HOST') && getenv('DB_USER') && getenv('DB_PASS') && getenv('DB_NAME')); + } + + private static function validateMigration(){ + // Validate engine information + try{ + self::$conn->exec('CREATE TABLE IF NOT EXISTS engine_info ( + id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, + meta_key VARCHAR(95), + meta_value TEXT + )'); + }catch(Exception $e){ + // Could not initiate first query + error_log($e->getMessage()); + return; + } + + + // Validate or set engine version + try{ + $currentVersion = self::$conn->query('SELECT meta_value FROM engine_info WHERE meta_key = "vor_db_version"')->fetch(PDO::FETCH_COLUMN); + if($currentVersion === false){ + self::$conn->exec('INSERT INTO engine_info (meta_key, meta_value) VALUES ("vor_db_version", "0")'); + $currentVersion = 0; + } + + // Validate latest version + if(file_exists(BASE . '/rss/json/config/migrations.json')){ + $migrations = json_decode(file_get_contents(BASE . '/rss/json/config/migrations.json'), true); + $latestVersion = array_key_last($migrations); + if((int)$latestVersion > (int)$currentVersion){ + self::migrate(); + } + } + }catch(Exception $e){ + // First query ran fine but something with the updates messes up + error_log($e->getMessage()); + } + } + + private static function migrate(){ + try{ + $currentVersion = (int) self::$conn->query('SELECT meta_value FROM engine_info WHERE meta_key = "vor_db_version"')->fetch(PDO::FETCH_COLUMN) ?? 0; + }catch(Exception $e){ + // Could not get version + error_log($e->getMessage()); + } + + try{ + $migrations = json_decode(file_get_contents(BASE . '/rss/json/config/migrations.json'), true); + foreach($migrations as $index => $migration){ + if((int)$index > (int)$currentVersion){ + foreach($migration as $query){ + self::$conn->exec($query); + } + $stmt = self::$conn->prepare("UPDATE engine_info SET meta_value = :index WHERE meta_key = 'vor_db_version'"); + $stmt->bindValue(':index', (int)$index); + $stmt->execute(); + } + } + }catch(Exception $e){ + // Updates failed but DB is fine + error_log($e->getMessage()); + } + } + + /** + * System utilies + */ + + public static function post($key = null){ + return $key === null ? $_POST : (isset($_POST[$key]) ? $_POST[$key] : null); + } + + public static function get($key = null){ + return $key === null ? $_GET : (isset($_GET[$key]) ? $_GET[$key] : null); + } + + public static function go($path){ + header('Location: ' . $path); + exit(); + } + + public static function json($data, $code = 200){ + header('Content-Type: application/json'); + http_response_code($code); + echo json_encode($data); + exit(); + } + + public static function collect($json = false){ + $input = file_get_contents('php://input'); + if($json){ + $input = json_decode($input, true); + } + return $input ?? []; + } + + private static function isHttps(){ + return + (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || + (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || + (isset($_SERVER['SERVER_PORT']) && (int)$_SERVER['SERVER_PORT'] === 443); + } + + public static function session($key, $value = null){ + if(session_status() === PHP_SESSION_NONE){ + self::validateSession(); + } + + if($value === null){ + return $_SESSION[$key] ?? null; + } + + $_SESSION[$key] = $value; + } + + public static function hydrate($cookieName = 'v_auth'){ + $token = $_COOKIE[$cookieName] ?? false; + if(!$token){ + return false; + } + + $parts = explode('.', $token, 2); + if(count($parts) !== 2){ + return false; + } + + $payloadB64 = str_replace(['-', '_'], ['+', '/'], $parts[0]); + $macB64 = str_replace(['-', '_'], ['+', '/'], $parts[1]); + + $payload = base64_decode($payloadB64, true); + $mac = base64_decode($macB64, true); + + if(!$payload || !$mac){ + return false; + } + + $key = getenv('TOKEN_SECRET') ?? false; + if(!$key){ + return false; + } + + $expectedMac = hash_hmac('sha256', $payload, $key, true); + if(!hash_equals($expectedMac, $mac)){ + return false; + } + + $data = json_decode($payload, true); + if(!is_array($data)){ + return false; + } + + $uid = isset($data['uid']) ? (int)$data['uid'] : 0; + $exp = isset($data['exp']) ? (int)$data['exp'] : 0; + $sid = isset($data['sid']) ? $data['sid'] : false; + + if($uid <= 0 || $exp <= 0 || !$sid){ + return false; + } + + if($exp < time()){ + return false; + } + + self::validateSession($sid); + return $data; + } + + public static function validateSession($sid = null){ + if(session_status() !== PHP_SESSION_NONE){ + return true; + } + + ini_set('session.use_cookies', 0); + ini_set('session.use_only_cookies', 0); + + if($sid){ + session_id($sid); + } + + return session_start(); + } + + public static function cookieSet($name, $val, $opts = []){ + $isHttps = self::isHttps(); + + if(is_array($val)){ + $key = getenv('TOKEN_SECRET') ?? false; + if(!$key){ + return false; + } + + $payload = json_encode($val, JSON_UNESCAPED_SLASHES); + $mac = hash_hmac('sha256', $payload, $key, true); + + $safePayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload)); + $safeMac = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($mac)); + + $val = $safePayload . '.' . $safeMac; + } + + $defaults = [ + 'expires' => 0, + 'path' => '/', + 'domain' => '', + 'secure' => $isHttps, + 'httponly' => true, + 'samesite' => 'Lax' + ]; + + $opts = array_intersect_key((array)$opts, array_flip(['expires', 'path', 'domain', 'secure', 'httponly', 'samesite'])); + $final = array_merge($defaults, $opts); + + if(strcasecmp($final['samesite'], 'None') === 0){ + $final['secure'] = true; + } + + $success = setcookie($name, (string)$val, $final); + if($success){ + $_COOKIE[$name] = (string)$val; + } + + return $success; + + } + + public static function cookieClear($name = 0){ + $isHttps = self::isHttps(); + + $clear = function($cookie) use ($isHttps){ + setcookie($cookie, '', [ + 'expires' => time() - 3600, + 'path' => '/', + 'secure' => $isHttps, + 'httponly' => true, + 'samesite' => 'Lax' + ]); + + unset($_COOKIE[$cookie]); + }; + + if(!$name){ + foreach($_COOKIE as $cookie => $v){ + $clear($cookie); + } + return true; + } + + $clear($name); + return true; + } + + public static function upload($preset, $file){ + Sys::loadEnv(); + + if(!isset($file['error']) || is_array($file['error'])){ + return ['ok' => false, 'error' => 'Invalid upload']; + } + + if($file['error'] !== UPLOAD_ERR_OK){ + return ['ok' => false, 'error' => 'Upload failed']; + } + + $dir = getenv("UPLOAD_{$preset}_DIR"); + $allowed = getenv("UPLOAD_{$preset}_ALLOWED"); + $maxMb = getenv("UPLOAD_{$preset}_MAX_MB"); + + if(!$dir || !$allowed){ + return ['ok' => false, 'error' => 'Upload preset missing']; + } + + $allowedExt = array_map('trim', explode(',', strtolower($allowed))); + $maxBytes = (int)$maxMb * 1024 * 1024; + + if($maxBytes > 0 && $file['size'] > $maxBytes){ + return ['ok' => false, 'error' => 'File too large']; + } + + $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); + if(!in_array($ext, $allowedExt)){ + return ['ok' => false, 'error' => 'Invalid file type']; + } + + $finfo = new \finfo(FILEINFO_MIME_TYPE); + $mime = $finfo->file($file['tmp_name']); + + if(!$mime){ + return ['ok' => false, 'error' => 'Invalid file']; + } + + $absDir = rtrim(BASE, '/') . '/' . ltrim($dir, '/'); + if(!is_dir($absDir)){ + mkdir($absDir, 0755, true); + } + + $name = bin2hex(random_bytes(32)) . '.' . $ext; + $dest = rtrim($absDir, '/') . '/' . $name; + + if(!move_uploaded_file($file['tmp_name'], $dest)){ + return ['ok' => false, 'error' => 'Move failed']; + } + + return[ + 'ok' => true, + 'path' => $dir . '/' . $name, + 'filename' => $name, + 'ext' => $ext, + 'mime' => $mime, + 'size' => $file['size'] + ]; + } + + public static function serveFile($absPath, $opts = []){ + $defaults = [ + 'filename' => null, + 'mime' => null, + 'inline' => true, + 'cacheSeconds' => 86400, + 'etag' => true, + 'allowRange' => true, + 'baseDirs' => [realpath(BASE)], + ]; + + $o = array_merge($defaults, (array)$opts); + $real = realpath($absPath); + if($real === false || !is_file($real) || !is_readable($real)){ + http_response_code(404); + exit; + } + + $allowed = false; + foreach((array)$o['baseDirs'] as $base){ + $baseReal = realpath($base); + if($baseReal && str_starts_with($real, rtrim($baseReal, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR)){ + $allowed = true; + break; + } + } + + if(!$allowed){ + http_response_code(404); + exit; + } + + $mime = $o['mime']; + if(!$mime){ + $finfo = new \finfo(FILEINFO_MIME_TYPE); + $mime = $finfo->file($real) ?: 'application/octet-stream'; + } + + $size = filesize($real); + $mtime = filemtime($real); + + if($o['etag']){ + $etag = '"' . sha1($real . '|' . $size . '|' . $mtime) . '"'; + header('ETag: ' . $etag); + if(isset($_SERVER['HTTP_IF_NONE_MATCH']) &&trim($_SERVER['HTTP_IF_NONE_MATCH']) === $etag){ + http_response_code(304); + exit; + } + } + + if((int)$o['cacheSeconds'] > 0){ + header('Cache-Control: public, max-age=' . (int)$o['cacheSeconds']); + }else{ + header('Cache-Control: no-store'); + } + + header('X-Content-Type-Options: nosniff'); + header('Content-Type: ' . $mime); + + $downloadName = $o['filename'] ?: basename($real); + $downloadName = str_replace(["\r","\n"], '', $downloadName); + + $disp = $o['inline'] ? 'inline' : 'attachment'; + header('Content-Disposition: ' . $disp . '; filename="' . addslashes($downloadName) . '"'); + header('Accept-Ranges: bytes'); + + $start = 0; + $end = $size - 1; + $status = 200; + + if($o['allowRange'] && isset($_SERVER['HTTP_RANGE']) && preg_match('/bytes=(\d*)-(\d*)/i', $_SERVER['HTTP_RANGE'], $m)){ + $rangeStart = $m[1] !== '' ? (int)$m[1] : null; + $rangeEnd = $m[2] !== '' ? (int)$m[2] : null; + + if($rangeStart === null && $rangeEnd !== null){ + $start = max(0, $size - $rangeEnd); + }else{ + $start = max(0, (int)$rangeStart); + if($rangeEnd !== null){ + $end = min($end, (int)$rangeEnd); + } + } + + if($start > $end || $start >= $size){ + header('Content-Range: bytes */' . $size); + http_response_code(416); + exit; + } + + $status = 206; + header('Content-Range: bytes ' . $start . '-' . $end . '/' . $size); + } + + $length = ($end - $start) + 1; + header('Content-Length: ' . $length); + http_response_code($status); + + $fp = fopen($real, 'rb'); + if($fp === false){ + http_response_code(500); + exit(); + } + + if($start > 0){ + fseek($fp, $start); + } + + $chunk = 8192; + while(!feof($fp) && $length > 0){ + $read = ($length > $chunk) ? $chunk : $length; + $buf = fread($fp, $read); + if($buf === false){ + break; + } + + echo $buf; + $length -= strlen($buf); + if(function_exists('fastcgi_finish_request') === false){ + flush(); + } + } + + fclose($fp); + exit; + } +} diff --git a/rss/php/classes/core/Validator.php b/rss/php/classes/core/Validator.php new file mode 100644 index 0000000..5570662 --- /dev/null +++ b/rss/php/classes/core/Validator.php @@ -0,0 +1,78 @@ += $minLen; + } + + public static function date($date, string $format = 'Y-m-d'): bool { + try{ + $d = \DateTime::createFromFormat($format, (string)$date); + return $d && $d->format($format) === (string)$date; + }catch(\Throwable $e){ + error_log($e->getMessage()); + return false; + } + } + + public static function json($val): bool{ + if(!is_string($val) || $val === ''){ + return false; + } + + try{ + json_decode($val, true, 512, JSON_THROW_ON_ERROR); + return true; + }catch(\JsonException $e){ + error_log($e->getMessage()); + return false; + } + } + + public static function email($val): bool{ + $val = trim((string)$val); + + if(preg_match("/[\r\n]/", $val)){ + return false; + } + + return (bool) filter_var($val, FILTER_VALIDATE_EMAIL); + } + + public static function domain($val): bool{ + $val = trim((string)$val); + + if(preg_match("/[\r\n]/", $val)){ + return false; + } + + return (bool) filter_var($val, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME); + } + + public static function minLen($val, int $min): bool{ + return mb_strlen(trim((string)$val)) >= $min; + } + + public static function maxLen($val, int $max): bool{ + return mb_strlen(trim((string)$val)) <= $max; + } + + public static function regex($val, string $pattern): bool{ + return (bool) preg_match($pattern, (string)$val); + } +} \ No newline at end of file diff --git a/rss/php/handler.php b/rss/php/handler.php new file mode 100644 index 0000000..11d0fec --- /dev/null +++ b/rss/php/handler.php @@ -0,0 +1,56 @@ + \Vor\application\Frontend::class, +]; + +$methodMap = [ + // Add public allowed methods + 'Frontend' => ['clean'], +]; + +$target = trim((string)($_POST['target'] ?? '')); +$method = trim((string)($_POST['method'] ?? '')); + +if($target === '' || $method === ''){ + Sys::json(['status' => 'fail', 'message' => 'Missing target'], 400); +} + +if(!isset($classMap[$target])){ + Sys::json(['status' => 'fail', 'message' => 'Invalid class'], 404); +} + +if(!in_array($method, $methodMap[$target] ?? [], true)){ + Sys::json(['status' => 'fail', 'message' => 'Invalid method'], 404); +} + +$obj = new $classMap[$target]; + +foreach($_POST as $k => $v){ + if($k === 'target' || $k === 'method'){ + continue; + } + + if(property_exists($obj, $k)){ + $obj->$k = $v; + } +} + +foreach(($_FILES ?? []) as $k => $v){ + if(property_exists($obj, $k)){ + $obj->$k = $v; + } +} + +try{ + $resp = $obj->$method(); + Sys::json(['status' => $resp ? 'success' : 'fail', 'message' => $resp], 200); +}catch(\Throwable $e){ + error_log($e->getMessage()); + Sys::json(['status' => 'fail', 'message' => 'Server error'], 500); +} \ No newline at end of file diff --git a/rss/php/pagehandler.php b/rss/php/pagehandler.php new file mode 100644 index 0000000..24071ed --- /dev/null +++ b/rss/php/pagehandler.php @@ -0,0 +1,148 @@ + Sys::class, + 'Users' => Users::class +); + + +$page = getPage(); +$res = array(); +$userConfigs = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/rss/json/config/groups.json'), true); + +if(isset($page['init']) && !empty($page['init'])){ + foreach($page['init'] as $func){ + $res[$func['return']] = initCaller($func); + } +} + +// Create init function based on json files +if($page){ + if(!isset($_GET['page'])){ + $usr = new Users(); + $sys = new Sys(); + $myInfo = $usr->getMyself(); + if($usr->isAuth()){ + header('location: /'. $sys::getUserConfigs()[$myInfo['user_type']]['home'].'/'); + } + } +} + +function getPage(){ + $sys = new Sys(); + $user = new Users(); + global $myInfo; + if(isset($_GET['page']) && !empty($_GET['page'])){ + if($conf = pages($_GET['page'])){ + if(validatePage($conf)){ + return $conf; + }else{ + $usr = new Users(); + if($usr->isAuth()){ + if(file_exists($_SERVER['DOCUMENT_ROOT'] . '/rss/json/pages/'.$sys::getUserConfigs()[$myInfo['user_type']]['home'].'.json')){ + header('location: /'.$sys::getUserConfigs()[$myInfo['user_type']]['home'].'/'); + }else{ + header('location: /'); + } + }else{ + header('location: /'); + } + } + }else{ + header('location: /404/'); + } + }else{ + return pages('index'); + } +} + +function pages($p){ + if(file_exists($_SERVER['DOCUMENT_ROOT'] . '/rss/json/pages/' . $p . '.json')){ + return(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/rss/json/pages/' . $p . '.json'), true)); + }else{ + return false; + } +} + +function validatePage($c){ + if($c['rules']['restricted'] === true){ + if($c['rules']['loginCookie'] == true){ + $usr = new Users(); + if($usr->isAuth()){ + $ui = $usr->getMyself(); + $allowed_user_types = $c['rules']['userTypes']; + $allowed_user_groups = $c['rules']['userGroups']; + + if(in_array($ui['user_type'], $allowed_user_groups) || in_array('*', $allowed_user_groups)){ + return true; + }else{ + return false; + } + }else{ + return false; + } + }else{ + return true; + } + }else{ + return true; + } +} + +function loadModals(){ + global $page; + global $res; + if(isset($page['modals']) && !empty($page['modals'])){ + foreach($page['modals'] as $modal){ + if(file_exists($_SERVER['DOCUMENT_ROOT'] . '/rss/php/models/components/modals/' . $modal . '.php')){ + include($_SERVER['DOCUMENT_ROOT'] . '/rss/php/models/components/modals/' . $modal . '.php'); + } + } + } +} + +function getCanonical(){ + $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http"; + $host = $_SERVER['HTTP_HOST']; + $requestUri = $_SERVER['REQUEST_URI']; + $canonicalUrl = $scheme . "://" . $host . $requestUri; + return $canonicalUrl; +} + +function loadScripts(){ + if(isset($_GET['page']) && !empty($_GET['page'])){ + $page_name = $_GET['page']; + }else{ + $page_name = 'index'; + } + if(file_exists($_SERVER['DOCUMENT_ROOT'] . '/rss/js/' . $page_name . '.js')){ + echo ''; + } +} + +function initCaller($func){ + global $classList; + $class = $func['class']; + $method = $func['function']; + $cl = new $classList[$class]; + + // Set get parameters + $run = true; + if(isset($func['getValues']) && !empty($func['getValues'])){ + $run = false; + foreach($func['getValues'] as $get){ + if(isset($_GET[$get]) && !empty($_GET[$get])){ + $run = true; + $cl->$get = $_GET[$get]; + } + } + } + if($run){ + $rs = $cl->$method(); + return $rs; + } +} \ No newline at end of file diff --git a/rss/php/views/footers/default.php b/rss/php/views/footers/default.php new file mode 100644 index 0000000..405add4 --- /dev/null +++ b/rss/php/views/footers/default.php @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/rss/php/views/headers/default.php b/rss/php/views/headers/default.php new file mode 100644 index 0000000..4689954 --- /dev/null +++ b/rss/php/views/headers/default.php @@ -0,0 +1,11 @@ + + + + + + VOR CRM — UI Kit Showcase (Full) + + + + + \ No newline at end of file diff --git a/rss/php/views/pages/index.php b/rss/php/views/pages/index.php new file mode 100644 index 0000000..521273d --- /dev/null +++ b/rss/php/views/pages/index.php @@ -0,0 +1,592 @@ + +
+
+ +
+
+
+
+ MDI 2026-ish + tokens · utilities · components +
+ +

Dashboard overview

+

+ This page stress-tests: grid, spacing, sizing, typography, tables, buttons, forms, + badges, scrollbar, cards, accordion, switch, drawer, modal, and theme tokens. +

+ +
+
Last 7 days
+
Last 30 days
+
This year
+
Custom
+
+ +
+ EU region + Online + Alerts 2 + Updated Feb 16, 2026 +
+ +
+
Inline code token
+
+ Try: btn-gray-light btn-sm, col-lg-4, data-toggle, data-theme-toggle. +
+
+
+ +
+
Quick actions
+
+ + + +
+ +
+ +
System
+
+ + Realtime sync +
+ +
+
Open modal / drawer
+
+ + +
+
+
+
+
+ +
+
+
alert-teal — Success style container.
+
+
+
alert-red — Danger style container.
+
+
+ +
+
+
+
Total revenue
+
€ 142,500
+
+12% vs last month
+
+
+ +
+
+
Active users
+
1,204
+
+ Stable + churn 1.1% +
+
+
+ +
+
+
System status
+
+ Healthy + API 124ms · DB 8ms +
+
Last checked: Feb 16, 2026
+
+
+
+ +
+
+
+

Forms

+
input, select, input-group, focus ring
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + +
+
+ +
+ + + + +
+
+
+ +
+
+

Typography & Utilities

+
sizes, weights, alignment, spacing helpers
+ +
+
h1
+
h2
+
h3
+
h4
+
h5
+
h6
+
body text — mutedlight
+
small text
+
+ +
+ +
+
Badges
+
+ badge-teal + solid + warn + danger +
+
+ +
+
Spacing / size quick grid
+
+
w-25
+
w-33
+
w-50
+
+
+
w-66
+
w-33
+
+
+
+
+
+ +
+
+
+
+
Recent transactions
+
+ + + +
+
+ +
+
+
+ +
+
Small variant
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValueMeta
Themedata-themelight / dark
Drawer.draweris-open
Modal.modal-overlayis-active
Table edit.table-edit-btnwelcome.js
+
+
+
+
+ +
+
+
Pipeline
+
progress bars + buttons
+ +
+
+ Qualified + 18 +
+
+
+
+
+ +
+
+ Proposal + 9 +
+
+
+
+
+ +
+
+ Negotiation + 4 +
+
+
+
+
+ +
+ + + + +
+
+ +
+
Borders / radius / elevation
+
border helpers + rounded + elevation
+ +
+
+
+
elevation-1
+
+
+
+
+
elevation-4
+
+
+
+ +
+
rounded-sm
+
rounded
+
rounded-lg
+
pill
+
+
+
+
+ +
+
+
+

Framework FAQ

+
accordion + utilities + theme tokens
+ +
+ +
+ Negative margins + column padding keeps gutters consistent and safe for nesting. +
+
+ +
+ +
+ Yes — with your VOR event delegation, ESC closes modal first, then drawer. +
+
+ +
+ +
+ Toggle data-theme on <html>. CSS vars update automatically. +
+
+
+
+ +
+
+
Notes
+
quick sanity checks
+ +
+
badge-teal
+
badge-gray-light
+
badge-orange-light + text-orange-900
+
+ +
+ + + +
+ +
+
Visibility / overflow
+
+
overflow-auto box
+
Line 1
+
Line 2
+
Line 3
+
Line 4
+
Line 5
+
+
+
+
+
+ +
+
+ + + + + + + + \ No newline at end of file